package javacodebook.gui.showfile;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;


/**
 * @author Benjamin Rusch
 * 
 * ShowFileJFrame bietet die Möglichkeit eine Datei vom Dateisystem 
 * auszuwählen, und im Frame anzuzeigen.
 */


public class ShowFileJFrame  extends JFrame {
	
	private Container content = null;
	private JMenuBar mb = new JMenuBar();
	private JMenu file = new JMenu("Datei");
	private JMenuItem newFile = new JMenuItem("Datei auswählen");
	private JTextArea fileViewer =new JTextArea();
	private JScrollPane scroller = new JScrollPane();
	
	/**
 	*	Konstruktor von ShowFileJFrame.  
 	*/	
	public ShowFileJFrame() {
		super("Datei:");	
 	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		content = this.getContentPane();		
		
		this.setJMenuBar(mb);
		mb.add(file);
		file.add(newFile);
		scroller.getViewport().add(fileViewer);	
		content.add(scroller);
		
		// an das MenuItem newFile wird ein Listener angemeldet, der
		// bei Auswahl informiert wird
		newFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae){
				// Der FileDialog wird gebaut
				JFileChooser fd = new JFileChooser();
				// Das Default Directory, welches in dem Dialog ausgewählt 
				// sein soll, kann wie folgt gesetzt werden:
				fd.setCurrentDirectory(new File("c:\\tmp"));
				
				// Wie bei den anderen Swing Dialogen wird hier über 
				// eine show-Methoden der Dialog sichtbar gemacht. 
				// Der Rückgabewert gibt an welcher button gedrückt wurde.
				int pressedButton = fd.showOpenDialog(ShowFileJFrame.this);
				
				// Weiss man über den Rückgabewert "returnValue" welcher 
				// Button gedrückt wurde, kann über das JFilChooserObjekt die 
				// Auswahl ermittelt werden.
				if(pressedButton == JFileChooser.APPROVE_OPTION) {
       					setFile(fd.getSelectedFile());
    			}
			}
		});
	}
	
	/**
	* 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) {} 
		}
  	}
}
