package javacodebook.gui.showfile;

import java.awt.*;
import java.awt.event.*;
import java.io.*;

/**
 * @author Benjamin Rusch
 * 
 * ShowFileFrame bietet die Möglichkeit eine Datei vom Dateisystem 
 * auszuwählen, und im Frame anzuzeigen.
 */

public class ShowFileFrame extends Frame {
	

    private MenuBar mb = new MenuBar();
	
    private Menu file = new Menu("Datei");
    private MenuItem newFile = new MenuItem("Datei auswählen");
	
	private TextArea fileViewer=new TextArea();

    /**
     *	Konstruktor von ShowFileFrame  
     */	
    public ShowFileFrame() {
		super("Datei:");		
	
		// Beim Klicken des Schließen-Buttons vom HauptFenster
		// wird das Programm beendet.
		this.addWindowListener(new WindowAdapter() {
	   		public void windowClosing(WindowEvent we) {
	        	System.exit(0);
	    	}
		});					
		   
		// Gui wird gebaut
		this.setMenuBar(mb);
		mb.add(file);
		file.add(newFile);
		add(fileViewer);	
		
		// An das MenuItem newFile wird ein Listener angemeldet, der
		// bei Auswahl den FileDialog öffnet.
		newFile.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent ae){
                // Der FileDialog wird mit Titel und einem Button zum öffnen 
				// von Dateien erstellt.
				FileDialog fd = new FileDialog(ShowFileFrame.this, 
						"Öffnen Dialog",FileDialog.LOAD);
                // Das Verzeichnis, welches in dem Dialog zu Begin ausgewählt 
                // sein wird, kann wie folgt gesetzt werden:
                fd.setDirectory("c:\\tmp");
				// wie bei jedem TopLevel-Container muss auch dieser Dialog sichtbar 
				// gemacht werden
				fd.setVisible(true);
			
                // Wird der modale FileDialog beendet springt das Programm 
				// wieder hierher. Falls der Öffnen-Button betätigt wurde,
				// liefert fd.getFile() den Filenamen zurück und auf Basis 
				// dieser Information kann die TextArea gefüllt werden. 
				// Falls der Abbrechen-Button betätigt wurde, liefert 
				// fd.getFile() null zurück, und die actionPerformed Methode 
				// wird verlassen.
				if (fd.getFile()!=null) {
					File selectedFile = new File(fd.getDirectory(),fd.getFile());
					setFile(selectedFile);
				}	
            }
        });
    }
	
	/**
	* Diese Methode liest das File aus, konvertiert es in einen String, und 
	* platziert diesen in der TextArea des Frames.
	*/
	public void setFile(File file) {
		FileReader reader = null;
        try {
			// Ein FileReader wird die Daten der Datei liefern
			reader = new FileReader(file);
			
			// Ein Char-Array speichert die Daten zwischen             
      		int size = (int) file.length();       
      		char[] data = new char[size];   
			int cursor = 0;
      		while(cursor < size)
        		cursor += reader.read(data, cursor, size-cursor);
			
			// Der Char-Array wird in die TextArea geschrieben.	
      		fileViewer.setText(new String(data));
      		this.setTitle("Datei: " + file.getName());
   		}
    	catch (IOException e) { 
			e.printStackTrace();		
    	}
    	finally { 
			try { 
				if (reader != null) reader.close(); 
			} catch (IOException e) {} 
		}
  	}
}