import java.awt.*;
import java.io.*;

/**
 * Original solution to the file editor exercise of the Java Basics course. 
 * Since this is quite old, it still uses the Java 1.0 event model (action-method) 
 * and the writing of the file could be done more efficiently. 
 * @author Kary Fr&auml;mling
 */
public class FileReadWrite
{
    public static void main(String[] argv)
    {
	FileReadWriteFrame f = new FileReadWriteFrame("File read and write");
	f.pack();
	f.show();
    }
}

class FileReadWriteFrame extends Frame
{
    private FileReadWritePanel  mainPanel;
    private MenuBar mBar;
    private Menu    fileMenu;
    private Menu    helpMenu;

    FileReadWriteFrame(String title)
    {
      super(title);

      add(mainPanel = new FileReadWritePanel());

      mBar = new MenuBar();
      fileMenu = new Menu("File");
      fileMenu.add("Open...");
      fileMenu.add("Save as...");
      fileMenu.add("Close");
      fileMenu.add("-");
      fileMenu.add("Exit");
      helpMenu = new Menu("Help");
      helpMenu.add("About...");
      mBar.add(fileMenu);
      mBar.add(helpMenu);
      setMenuBar(mBar);
    }

    public boolean action(Event evt, Object what)
    {
	FileDialog  fd;

	if ( evt.arg.equals("Exit") ) System.exit(1);
	else if ( evt.arg.equals("Open...") ) {
	    fd = new FileDialog(new Frame(), "Open file...", FileDialog.LOAD);
	    fd.show();
	    mainPanel.readInFile(fd.getDirectory() + fd.getFile());
	}
	else if ( evt.arg.equals("Save as...") ) {
	    fd = new FileDialog(new Frame(), "Save As...", FileDialog.SAVE);
	    fd.show();
	    mainPanel.writeOutFile(fd.getDirectory() + fd.getFile());
	}
	else if ( evt.arg.equals("Close") ) {
	    mainPanel.closeFile();
	}
	else if ( evt.arg.equals("About...") ) {
	    (new AboutDialog(new Frame())).show();
	}
	return super.action(evt, what);
    }

    public boolean handleEvent(Event evt)
    {
	if ( evt.id == Event.WINDOW_DESTROY )
	    System.exit(1);
	return super.handleEvent(evt);
    }
}

class FileReadWritePanel extends Panel
{
    private final String  NO_FILE_OPEN_STR = "No file opened";
   
    private TextArea  textDisplay;
    private Label     statusField;

    FileReadWritePanel()
    {
	Panel p;

	setLayout(new BorderLayout());
	textDisplay = new TextArea(20, 40);
	add(textDisplay);
	p = new Panel();
	statusField = new Label(NO_FILE_OPEN_STR);
	p.add(statusField);
	add("South", p);
    }

    public void readInFile(String filePath)
    {
	String  line;

	textDisplay.setText("");
	try {
	    LineNumberReader br = new LineNumberReader(new FileReader(filePath));
	    while ( (line = br.readLine()) != null ) {
		textDisplay.appendText(line + "\n");
	    }
	    statusField.setText(br.getLineNumber() + " lines read");
	} catch ( IOException e ) {
	    /* Should give error dialog here! */
	    System.out.println(e);
	}
    }

    public void writeOutFile(String filePath)
    {
	String  text;
	int     line_cnt = 0;
	
	text = textDisplay.getText();
	try {
	    BufferedWriter out
		= new BufferedWriter(new FileWriter(filePath));
	    for ( int i = 0 ; i < text.length() ; i++ ) {
		if ( text.charAt(i) != '\n' )
		    out.write(text, i, 1);
		else {
		    out.newLine();
		    line_cnt++;
		}
	    }
	    out.close();
	} catch ( IOException e ) {
	    /* Should give error dialog here! */
	    System.out.println(e);
	}
	statusField.setText(line_cnt + " lines written");
    }

    public void closeFile()
    {
	textDisplay.setText("");
	statusField.setText(NO_FILE_OPEN_STR);
    }
}

class AboutDialog extends Dialog
{
    AboutDialog(Frame f)
    {
	super(f, "About me...", true);	// "true" because modal.

	add("Center", new Label("The great FileReadWrite program!"));
	Panel p = new Panel();
	add("South", p);
	p.add(new Button("Close"));
	pack();
    }

    public boolean action(Event evt, Object arg)
    {
	dispose();
	return true;
    }
}

