    001: import java.awt.*;
    002: import java.awt.event.*;
    003: import java.io.*;
    004: import javax.swing.*;
    005: import javax.swing.event.*;
    006:
    007: /**
    008:    This frame shows the toolbar and the graph.
    009: */
    010: public class GraphFrame extends JFrame
    011: {
    012:    /**
    013:       Constructs a graph frame that displays a given graph.
    014:       @param graph the graph to display
    015:    */
    016:    public GraphFrame(final Graph graph)
    017:    {
    018:       setSize(FRAME_WIDTH, FRAME_HEIGHT);
    019:       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    020:
    021:       this.graph = graph;
    022:
    023:       constructFrameComponents();
    024:       // set up menus
    025:
    026:       JMenuBar menuBar = new JMenuBar();
    027:       setJMenuBar(menuBar);
    028:       JMenu fileMenu = new JMenu("File");
    029:       menuBar.add(fileMenu);
    030:
    031:       JMenuItem openItem = new JMenuItem("Open");
    032:       openItem.addActionListener(new
    033:          ActionListener()
    034:          {
    035:             public void actionPerformed(ActionEvent event)
    036:             {
    037:                openFile();
    038:             }
    039:          });
    040:       fileMenu.add(openItem);
    041:
    042:       JMenuItem saveItem = new JMenuItem("Save");
    043:       saveItem.addActionListener(new
    044:          ActionListener()
    045:          {
    046:             public void actionPerformed(ActionEvent event)
    047:             {
    048:                saveFile();
    049:             }
    050:          });
    051:       fileMenu.add(saveItem);
    052:
    053:       JMenuItem exitItem = new JMenuItem("Exit");
    054:       exitItem.addActionListener(new
    055:          ActionListener()
    056:          {
    057:             public void actionPerformed(ActionEvent event)
    058:             {
    059:                System.exit(0);
    060:             }
    061:          });
    062:       fileMenu.add(exitItem);
    063:
    064:       JMenuItem deleteItem = new JMenuItem("Delete");
    065:       deleteItem.addActionListener(new
    066:          ActionListener()
    067:          {
    068:             public void actionPerformed(ActionEvent event)
    069:             {
    070:                panel.removeSelected();
    071:             }
    072:          });
    073:
    074:       JMenuItem propertiesItem
    075:          = new JMenuItem("Properties");
    076:       propertiesItem.addActionListener(new
    077:          ActionListener()
    078:          {
    079:             public void actionPerformed(ActionEvent event)
    080:             {
    081:                panel.editSelected();
    082:             }
    083:          });
    084:
    085:       JMenu editMenu = new JMenu("Edit");
    086:       editMenu.add(deleteItem);
    087:       editMenu.add(propertiesItem);
    088:       menuBar.add(editMenu);
    089:    }
    090:
    091:    /**
    092:       Constructs the tool bar and graph panel.
    093:    */
    094:    private void constructFrameComponents()
    095:    {
    096:       toolBar = new ToolBar(graph);
    097:       panel = new GraphPanel(toolBar, graph);
    098:       scrollPane = new JScrollPane(panel);
    099:       Container contentPane = getContentPane();
    100:       contentPane.add(toolBar, BorderLayout.NORTH);
    101:       contentPane.add(scrollPane, BorderLayout.CENTER);
    102:    }
    103:
    104:    /**
    105:       Asks the user to open a graph file.
    106:    */
    107:    private void openFile()
    108:    {
    109:       // let user select file
    110:
    111:       JFileChooser fileChooser = new JFileChooser();
    112:       int r = fileChooser.showOpenDialog(this);
    113:       if (r == JFileChooser.APPROVE_OPTION)
    114:       {
    115:          // open the file that the user selected
    116:          try
    117:          {
    118:             File file = fileChooser.getSelectedFile();
    119:             ObjectInputStream in = new ObjectInputStream(
    120:                new FileInputStream(file));
    121:             Graph graph = (Graph) in.readObject();
    122:             in.close();
    123:             Container contentPane = getContentPane();
    124:             contentPane.remove(scrollPane);
    125:             contentPane.remove(toolBar);
    126:             constructFrameComponents();
    127:             validate();
    128:             repaint();
    129:          }
    130:          catch (IOException exception)
    131:          {
    132:             JOptionPane.showMessageDialog(null,
    133:                exception);
    134:          }
    135:          catch (ClassNotFoundException exception)
    136:          {
    137:             JOptionPane.showMessageDialog(null,
    138:                exception);
    139:          }
    140:       }
    141:    }
    142:
    143:    /**
    144:       Saves the current graph in a file.
    145:    */
    146:    private void saveFile()
    147:    {
    148:       JFileChooser fileChooser = new JFileChooser();
    149:       if (fileChooser.showSaveDialog(this)
    150:          == JFileChooser.APPROVE_OPTION)
    151:       {
    152:          try
    153:          {
    154:             File file = fileChooser.getSelectedFile();
    155:             ObjectOutputStream out = new ObjectOutputStream(
    156:                new FileOutputStream(file));
    157:             out.writeObject(graph);
    158:             out.close();
    159:          }
    160:          catch (IOException exception)
    161:          {
    162:             JOptionPane.showMessageDialog(null,
    163:                exception);
    164:          }
    165:       }
    166:    }
    167:
    168:    private Graph graph;
    169:    private GraphPanel panel;
    170:    private JScrollPane scrollPane;
    171:    private ToolBar toolBar;
    172:
    173:    public static final int FRAME_WIDTH = 600;
    174:    public static final int FRAME_HEIGHT = 400;
    175: }