
/*
    This program lets the user edit short text files in a window.  A "File"
    menu provides the following commands:
    
            New  -- Clears all text from the window.
            Open -- Let's the user select a file and loads up to 100
                    lines of text form that file into the window.  The
                    previous contents of the window are lost.
            Save -- Let's the user specify an ouput file and saves
                    the contents of the window in that file.
            Quit -- Closes the window and ends the program.
            
    This class uses the non-standard classes TextReader and MessageDialog.
*/

import java.io.*;
import java.awt.*;
import java.awt.event.*;

public class TrivialEdit extends Frame implements ActionListener {

   public static void main(String[] args) {
         // The main program just opens a window belonging to this
         // TrivialEdit class.  Then the window takes care of itself
         // until the program is ended with the Quit command.
      new TrivialEdit();
   }
   

   private TextArea text;   // Holds that text that is displayed in the window.
   
   
   public TrivialEdit() {
          // Add a menu bar and a TextArea to the window, and show it
          // on the screen.  The first line of this routine calls the
          // constructor from the superclass to specify a title for the
          // window.  The pack() command sets the size of the window to
          // be just large enough to hold its contents.
      super("A Trivial Editor");
      setMenuBar(makeMenus());
      text = new TextArea(20,60);
      add(text, BorderLayout.CENTER);
      pack();
      show();
   }
   

   private MenuBar makeMenus() {
          // Create and return a menu bar containing a single menu, the
          // File menu.  This menu contains four commands, and each 
          // command has a keyboard equivalent.  The Frame will listen
          // for action events from the menu.
      Menu fileMenu = new Menu("File");
      fileMenu.addActionListener(this);
      fileMenu.add( new MenuItem("New", new MenuShortcut(KeyEvent.VK_N)) );
      fileMenu.add( new MenuItem("Open...", new MenuShortcut(KeyEvent.VK_O)) );
      fileMenu.add( new MenuItem("Save...", new MenuShortcut(KeyEvent.VK_S)) );
      fileMenu.add( new MenuItem("Quit", new MenuShortcut(KeyEvent.VK_Q)) );
      MenuBar bar = new MenuBar();
      bar.add(fileMenu);
      return bar;
   }


   public void actionPerformed(ActionEvent evt) {
          // This will be called when the user makes a selection from
          // the File menu.  This routine just checks which command was
          // selected and calls another routine to carry out the command.
      String cmd = evt.getActionCommand();
      if (cmd.equals("New"))
         doNew();
      else if (cmd.equals("Open..."))
         doOpen();
      else if (cmd.equals("Save..."))
         doSave();
      else if (cmd.equals("Quit"))
         doQuit();
   }
   

   private void doNew() {
          // Carry out the "New" command from the File menu by
          // by clearing all the text from the TextArea.
      text.setText("");
   }


   private void doSave() {
          // Carry out the Save command by letting the user specify
          // an output file and writing the text from the TextArea
          // to that file.
      FileDialog fd;     // A file dialog that let's the user specify the file.
      String fileName;   // Name of file specified by the user.
      String directory;  // Directory that contains the file.
      fd = new FileDialog(this,"Save Text to File",FileDialog.SAVE);
      fd.show();
      fileName = fd.getFile();
      if (fileName == null) {
            // The fileName is null if the user has canceled the file 
            // dialog.  In this case, there is nothing to do, so quit.
         return;
      }
      directory = fd.getDirectory();
      try {
            // Create a PrintStream for writing to the specified
            // file and write the text from the window to that stream.
         File file = new File(directory, fileName);
         PrintWriter out = new PrintWriter(new FileWriter(file));
         String contents = text.getText();
         out.print(contents);
         out.close();
      }
      catch (IOException e) {
            // Some error has occured while opening or closing the file.
            // Show an error message.
         new MessageDialog(this, "Error:  " + e.toString());
      }
   }


   private void doOpen() {
          // Carry out the Open command by letting the user specify
          // the file to be opened and reading up to 100 lines from 
          // that file.  The text from the file replaces the text
          // in the TextArea.
      FileDialog fd;     // A file dialog that let's the user specify the file.
      String fileName;   // Name of file specified by the user.
      String directory;  // Directory that contains the file.
      fd = new FileDialog(this,"Load File",FileDialog.LOAD);
      fd.show();
      fileName = fd.getFile();
      if (fileName == null) {
            // The fileName is null if the user has canceled the file 
            // dialog.  In this case, there is nothing to do, so quit.
         return;
      }
      directory = fd.getDirectory();
      try {
             // Read lines from the file until end-of-file is detected,
             // or until 100 lines have been read.  The lines are appended
             // the the TextArea, with a line feed after each line.
         File file = new File(directory, fileName);
         TextReader in = new TextReader(new FileReader(file));
         String line;
         text.setText("");
         int lineCt = 0;
         while (lineCt < 100 && in.peek() != '\0') {
            line = in.getln();
            text.appendText(line + '\n');
            lineCt++;
         }
         if (in.eof() == false)
            text.appendText("\n\n********** Text truncated to 100 lines! ***********\n");
         in.close();
      }
      catch (Exception e) {
            // Some error has occured while opening or closing the file.
            // Show an error message.
         new MessageDialog(this, "Error:  " + e.toString());
      }
   }


   private void doQuit() {
         // Carry out the Quit command by exiting the program.
      System.exit(0);
   }


} // end class TrivialEdit
