/*
Datei............: Aufg2003.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 06.12.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 20.03
Kommentare.......:

Die Lösung dieser Aufgabe ist im Grunde ganz einfach, erfordert aber
dennoch einigen Aufwand. Das Programm besteht aus drei Klassen:

- Die Klasse Aufg2003 ist die Hauptklasse der Applikation. Sie
  definiert das Hauptfenster mit der TextArea und dem Menü und
  registriert die Listener zum Beenden des Programms und zur
  Reaktion auf Menüaufrufe. 
- Die zu Aufg2003 lokale Klasse MainMenuActionListener besorgt
  das Handling der Menüaufrufe. Sie wird in der Hauptklasse instanziert
  und als ActionListener registriert. Für jeden Menüpunkt gibt es
  eine Servicemethode, die über einen Dispatcher in der Methode
  actionPerformed aufgerufen wird. Die beiden privaten Methoden
  readFile und writeFile dienen dazu, den Inhalt einer Datei in
  einen String zu lesen bzw. einen String in eine Datei zu schreiben.
- Die Klasse MainMenu ist aus MenuBar abgeleitet und implementiert
  das Hauptmenü. Die deklariert das "Datei"-Menü und registriert für
  jeden Menüeintrag den im Konstruktor übergebenen ActionListener.

Die hier vorgestellte Implementierung ist natürlich nur ein 
allererster Anfang zur Implementierung eines eigenen Texteditors.
Erweiterungsmöglichkeiten wären:

- Hinzufügen von Beschleunigertasten.
- Rückfrage bei Datei.Neu und Datei.Öffnen, falls der editierte Text
  verändert wurde.
- Einstellen der Schriftgröße und -farbe.
- Bearbeiten mehrerer Texte Fenster.
- usw...
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Aufg2003
extends Frame
{
  //Instanzmerkmale
  TextArea textarea;

  public static void main(String[] args)
  {
	Aufg2003 wnd = new Aufg2003();
	wnd.setSize(400, 400);
	wnd.setVisible(true);
  }

  public Aufg2003()
  {
	super("Aufg2003");
	setBackground(Color.lightGray);
	//Menü erzeugen und ActionListener registrieren
	MenuBar mainmenu = new MainMenu(new MainMenuActionListener());
	setMenuBar(mainmenu);
	//WindowListener registrieren
	addWindowListener(
	  new WindowAdapter() {
        public void windowClosing(WindowEvent event) {
		  System.exit(0);
		}
	  }
    );
	//Layoutmanager setzen und TextArea einfügen
	setLayout(new BorderLayout());
	textarea = new TextArea();
	textarea.setFont(new Font("Monospaced", Font.PLAIN, 12));
	add("Center", textarea);
  }

  class MainMenuActionListener
  implements ActionListener
  {
	//Instanzmerkmale
	String actfilename;

	public MainMenuActionListener()
	{
	  actfilename = "";
	}

	/**
	 * Dispatcher für Menüaufrufe.
	 */
	public void actionPerformed(ActionEvent event)
	{
	  String cmd = event.getActionCommand();
	  if (cmd.equals("DateiNeu")) {
		DateiNeu();
	  } else if (cmd.equals("DateiOeffnen")) {
		DateiOeffnen();
	  } else if (cmd.equals("DateiSpeichernUnter")) {
		DateiSpeichernUnter();
	  } else if (cmd.equals("DateiBeenden")) {
		DateiBeenden();
	  }
	}

	/**
	 * Servicemethode für den Menüpunkt "Datei.Neu".
	 */
	public void DateiNeu()
	{
	  textarea.setText("");
	}

	/**
	 * Servicemethode für den Menüpunkt "Datei.Öffnen".
	 */
	public void DateiOeffnen()
	{
	  String filename; 

	  FileDialog dlg = new FileDialog(this$0);
	  dlg.setMode(FileDialog.LOAD);
	  dlg.setFile(actfilename.length() > 0 ? actfilename : "*.txt");
	  dlg.setVisible(true);
	  filename = dlg.getFile();
	  if (filename != null) {
		String buf = readFile(filename);
		if (buf != null) {
		  textarea.setText(buf);
		  actfilename = filename;
		}
	  }
	}

	/**
	 * Servicemethode für den Menüpunkt "Datei.Speichern unter".
	 */
	public void DateiSpeichernUnter()
	{
	  String filename; 

	  FileDialog dlg = new FileDialog(this$0);
	  dlg.setMode(FileDialog.SAVE);
	  dlg.setFile(actfilename.length() > 0 ? actfilename : "*.txt");
	  dlg.setVisible(true);
	  filename = dlg.getFile();
	  if (filename != null) {
		if (writeFile(filename, textarea.getText())) {
		  actfilename = filename;
		}
	  }
	}

	/**
	 * Servicemethode für den Menüpunkt "Datei.Beenden".
	 */
	public void DateiBeenden()
	{
	  System.exit(0);
	}

	/**
	 * Liest die Textdatei name und gibt ihren Inhalt als String zurück.
	 */
	private String readFile(String name)
	{
	  StringBuffer buf = new StringBuffer("");
	  try {
	    BufferedReader reader = new BufferedReader( 
                                new FileReader(name));
        String line;
        while ((line = reader.readLine()) != null) {
		  buf.append(line);
		  buf.append("\r\n");
		}
		reader.close();
	  } catch (FileNotFoundException e) {
		System.out.println(e);
	  } catch (IOException e) {
		System.out.println(e);
	  }
	  return buf.toString();
	}

	/**
	 * Schreibt den Inhalt des Strings buf in die Textdatei name.
	 */
	private boolean writeFile(String name, String buf)
	{
	  boolean ret = false;
	  try {
	    BufferedWriter writer = new BufferedWriter( 
                                new FileWriter(name));
		writer.write(buf);
		writer.close();
		ret = true;
	  } catch (FileNotFoundException e) {
		System.out.println(e);
	  } catch (IOException e) {
		System.out.println(e);
	  }
	  return ret;
	}
  }
}


/**
 * Das Hauptmenü von Aufg2003.
 */
class MainMenu
extends MenuBar
{
  public MainMenu(ActionListener listener)
  {
	Menu menu = new Menu("Datei");
	//Datei.Neu
	MenuItem mi = new MenuItem("Neu");
	mi.setActionCommand("DateiNeu");
	mi.addActionListener(listener);
	menu.add(mi);
	//Datei.Öffnen
	mi = new MenuItem("Öffnen");
	mi.setActionCommand("DateiOeffnen");
	mi.addActionListener(listener);
	menu.add(mi);
	//Datei.Speichern unter
	mi = new MenuItem("Speichern unter");
	mi.setActionCommand("DateiSpeichernUnter");
	mi.addActionListener(listener);
	menu.add(mi);
	//Datei.Beenden
	menu.addSeparator();
	mi = new MenuItem("Beenden");
	mi.setActionCommand("DateiBeenden");
	mi.addActionListener(listener);
	menu.add(mi);
	//Menü zur Menubar hinzufügen
	add(menu);
  }
}

