StackShell.java

import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class StackShell implements ActionListener
{
   JFrame jf = new JFrame("Stack Interpreter");
   JTextArea codeArea = new JTextArea(25,40);
   JTextArea outputArea = new JTextArea(30,40);
   JScrollPane codePane = new JScrollPane(codeArea);
   JScrollPane outputPane = new JScrollPane(outputArea);
   JPanel displayPanel = new JPanel();
   JMenuBar bar = new JMenuBar();
   JMenu fileMenu = new JMenu("File");
   JMenu programMenu = new JMenu("Program");
   JMenuItem newItem = new JMenuItem("New");
   JMenuItem openItem = new JMenuItem("Open...");
   JMenuItem saveItem = new JMenuItem("Save");
   JMenuItem saveAsItem = new JMenuItem("Save As...");
   JMenuItem exitItem = new JMenuItem("Exit");
   JMenuItem runItem = new JMenuItem("Run Stack Program");
   JLabel codeLabel = new JLabel("Editor >>>");
   JLabel outputLabel = new JLabel("Output >>>");
   int codeLength = 0;
   String fileName, pathName = "H:";

   public StackShell()
   {
      jf.setSize(800,600);
      jf.setJMenuBar(bar);
      bar.add(fileMenu);
      bar.add(programMenu);

      fileMenu.setMnemonic('F');
      fileMenu.add(newItem);
      fileMenu.add(openItem);
      fileMenu.add(saveItem);
      fileMenu.add(saveAsItem);
      fileMenu.add(exitItem);
      programMenu.setMnemonic('P');
      programMenu.add(runItem);

      exitItem.addActionListener(this);
      exitItem.setMnemonic('X');
      runItem.addActionListener(this);
      runItem.setAccelerator(KeyStroke.getKeyStroke (KeyEvent.VK_F5, 0));
      runItem.setMnemonic('R');
      openItem.addActionListener(this);
      openItem.setMnemonic('O');
      openItem.setAccelerator (KeyStroke.getKeyStroke ('O', KeyEvent.CTRL_MASK));
      saveItem.addActionListener(this);
      saveItem.setMnemonic('S');
      saveItem.setAccelerator (KeyStroke.getKeyStroke ('S', KeyEvent.CTRL_MASK));
      saveAsItem.addActionListener(this);
      saveAsItem.setMnemonic('A');
      newItem.addActionListener(this);

      displayPanel.add(codeLabel);
      codeLabel.setForeground(new Color(0,0,150));
      displayPanel.add(codePane);
      displayPanel.add(outputLabel);
      outputLabel.setForeground(Color.green);
      displayPanel.add(outputPane);
      codeArea.setLineWrap(true);
      codeArea.setFont(new Font("Monospaced", Font.BOLD, 14));
      codeArea.setBackground(new Color(0,0,150));
      codeArea.setForeground(Color.white);
      codeArea.setCaretColor(Color.white);
      codeArea.setMargin(new Insets(3,3,3,3));
      outputArea.setEditable(false);
      outputArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
      outputArea.setBackground(Color.black);
      outputArea.setForeground(Color.white);
      outputArea.setMargin(new Insets(3,3,3,3));
      jf.getContentPane().add(displayPanel,"Center");
      jf.pack();
      jf.setVisible(true);
      jf.addWindowListener(new WindowAdapter()
            {
               public void windowClosing(WindowEvent e)
               {
                  System.exit(0);
               }
            }
         );
   }

   public String[] getCode()
   {
      String memory[] = new String[1000];
      String s = codeArea.getText(), next;

      StringTokenizer tokens = new StringTokenizer(s, "\n");
      codeLength = 0;
      
      while (tokens.hasMoreTokens())
         memory[codeLength++] = tokens.nextToken();
      return memory;
   }

   public void execute()
   {
      String[] code = getCode();
      outputArea.setText("");
      
/***********************************************************************

   Your code goes here.  You don't need to do anything any where
   else in the program.

**********************************************************************/

   }

   public void actionPerformed(ActionEvent e)
   {
      if (e.getSource() == runItem)
         execute();
      else if (e.getSource() == exitItem)
         System.exit(0);
      else if (e.getSource() == newItem)
      {
         codeArea.setText("");
         outputArea.setText("");
      }
      else if (e.getSource() == saveItem)
      {
         if (fileName != null)
         {
            try
            {
               FileWriter fw = new FileWriter(fileName);
               PrintWriter pw = new PrintWriter(fw);
               if (codeArea != null)
                  pw.println(codeArea.getText());
               pw.close();
            } catch (IOException ioe)
               {
                  System.out.println("The following error occurred " + ioe);
               }
         }
         else
         {
            Toolkit.getDefaultToolkit ().beep ();
            JOptionPane.showMessageDialog (jf, "No filename.  Use Save As... instead.",
                     "You Need a File Name.", JOptionPane.ERROR_MESSAGE);
         }
         codeArea.requestFocus ();
      }
      else if (e.getSource()  == saveAsItem)
      {
         JFileChooser chooser = new JFileChooser (pathName);
         FileNameExtensionFilter hypoFilter = new FileNameExtensionFilter("STACK files (*.stack)","stack");
         chooser.addChoosableFileFilter(hypoFilter);
         chooser.setFileFilter(hypoFilter);
         int returnVal = chooser.showSaveDialog (jf);
         if (returnVal == JFileChooser.APPROVE_OPTION)
         {
            File file = chooser.getSelectedFile ();
            String oldFileName = fileName;
            fileName = file.getPath ();
            if (!fileName.endsWith(".stack"))
               fileName += ".stack";
            boolean fileExists = true;
            try
            {
               FileReader fr = new FileReader(fileName);
               BufferedReader br = new BufferedReader(fr);
               String s = br.readLine();
               br.close();
            } catch(IOException ioe)
               {
                  fileExists = false;
               }
            if (fileExists)
            {
               Toolkit.getDefaultToolkit ().beep ();
               int choice = JOptionPane.showConfirmDialog (jf,
                              "The file already exists.  Do you wish to replace it?",
                              "File already exists", JOptionPane.YES_NO_OPTION);
               if (choice == JOptionPane.NO_OPTION)
               {
                  fileName = oldFileName;
                  return;
               }
            }
            jf.setTitle (fileName);
            try
            {
               FileWriter fw = new FileWriter(fileName);
               PrintWriter pw = new PrintWriter(fw);
               if (codeArea != null)
                  pw.println(codeArea.getText());
               pw.close();
            } catch (IOException ioe)
               {
                  System.out.println("The following error occurred " + ioe);
               }
            codeArea.requestFocus ();
         }
      }         
      else if (e.getSource() == openItem)
      {
         JFileChooser chooser = new JFileChooser (pathName);
         FileNameExtensionFilter hypoFilter = new FileNameExtensionFilter("STACK files (*.stack)","stack");
         chooser.addChoosableFileFilter(hypoFilter);
         chooser.setFileFilter(hypoFilter);
         int returnVal = chooser.showOpenDialog (jf);
         if (returnVal == JFileChooser.APPROVE_OPTION)
         {
            File file = chooser.getSelectedFile ();
            fileName = file.getPath ();
            pathName = fileName.substring (0, fileName.lastIndexOf ('\\'));
            jf.setTitle (fileName);
            String s = "";
            String document = "";
            try
            {
               FileReader fr = new FileReader(fileName);
               BufferedReader br = new BufferedReader(fr);
               s = br.readLine();
               document = s;
               while (s != null)
               {
                  s = br.readLine();
                  if (s!=null)
                     document = document + "\n" + s;
               }
               br.close();
            } catch(IOException ioe)
               {
                  System.out.println("The following error occurred " + ioe);
               }
            codeArea.setText (document);
            codeArea.setCaretPosition (0);
            codeArea.requestFocus ();
         }
      }
   }

   public static void main(String[] args)
   {
      StackShell ss = new StackShell();

   }
}