summaryrefslogtreecommitdiff
path: root/src/main/java/simulator/VSSimulatorFrame.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/simulator/VSSimulatorFrame.java')
-rw-r--r--src/main/java/simulator/VSSimulatorFrame.java628
1 files changed, 628 insertions, 0 deletions
diff --git a/src/main/java/simulator/VSSimulatorFrame.java b/src/main/java/simulator/VSSimulatorFrame.java
new file mode 100644
index 0000000..3cf4e91
--- /dev/null
+++ b/src/main/java/simulator/VSSimulatorFrame.java
@@ -0,0 +1,628 @@
+package simulator;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JTabbedPane;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import core.VSInternalProcess;
+import prefs.VSDefaultPrefs;
+import prefs.VSPrefs;
+import prefs.editors.VSEditorFrame;
+import prefs.editors.VSSimulatorEditor;
+import serialize.VSSerialize;
+import utils.VSAboutFrame;
+import utils.VSFrame;
+
+/**
+ * The class VSSimulatorFrame, an object of this class represents a window
+ * of the simulator. The window can have several tabs. Each tab contains
+ * an independent simulator.
+ *
+ * @author Paul C. Buetow
+ */
+public class VSSimulatorFrame extends VSFrame {
+ /** The serial version uid */
+ private static final long serialVersionUID = 1L;
+
+ /** The pause item. */
+ private JMenuItem pauseItem;
+
+ /** The replay item. */
+ private JMenuItem replayItem;
+
+ /** The reset item. */
+ private JMenuItem resetItem;
+
+ /** The start item. */
+ private JMenuItem startItem;
+
+ /** The pause button. */
+ private JButton pauseButton;
+
+ /** The replay button. */
+ private JButton replayButton;
+
+ /** The reset button. */
+ private JButton resetButton;
+
+ /** The start button. */
+ private JButton startButton;
+
+ /** The menu edit. */
+ private JMenu menuEdit;
+
+ /** The menu file. */
+ private JMenu menuFile;
+
+ /** The close item. */
+ private JMenuItem closeItem;
+
+ /** The save item. */
+ private JMenuItem saveItem;
+
+ /** The save as item. */
+ private JMenuItem saveAsItem;
+
+ /** The menu simulator. */
+ private JMenu menuSimulator;
+
+ /** The tool bar. */
+ private JToolBar toolBar;
+
+ /** The prefs. */
+ private VSPrefs prefs;
+
+ /** The simulators. */
+ private Vector<VSSimulator> simulators;
+
+ /** The current simulator. */
+ private VSSimulator currentSimulator;
+
+ /** The tabbed pane. */
+ private JTabbedPane tabbedPane;
+
+ /** The action listener */
+ private ActionListener actionListener;
+
+ /**
+ * Instantiates a new VSSimulatorFrame object.
+ *
+ * @param prefs the prefs
+ * @param relativeTo the component to open the window relative to
+ */
+ public VSSimulatorFrame(VSPrefs prefs, Component relativeTo) {
+ super(prefs.getString("lang.name"), relativeTo);
+ this.prefs = prefs;
+ this.simulators = new Vector<VSSimulator>();
+
+ final VSPrefs finalPrefs = this.prefs;
+ actionListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ Object source = e.getSource();
+ String sourceText = null;
+
+ if (source instanceof JMenuItem)
+ sourceText = ((JMenuItem) source).getText();
+ else
+ sourceText = ((ImageIcon) ((JButton) source).getIcon()).
+ getDescription();
+
+ if (sourceText.equals(
+ finalPrefs.getString("lang.simulator.close"))) {
+ removeCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.simulator.new"))) {
+ VSPrefs newPrefs = VSDefaultPrefs.init();
+ VSSimulatorEditor simulatorEditor =
+ new VSSimulatorEditor(newPrefs, VSSimulatorFrame.this,
+ VSSimulatorEditor.OPENED_NEW_TAB);
+ new VSEditorFrame(newPrefs, VSSimulatorFrame.this,
+ simulatorEditor);
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.window.new"))) {
+ new VSMain(VSDefaultPrefs.init(),
+ VSSimulatorFrame.this);
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.window.close"))) {
+ dispose();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.open"))) {
+ VSSerialize serialize = new VSSerialize();
+ serialize.openSimulator(VSSimulatorFrame.this);
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.save"))) {
+ VSSimulatorVisualization simulatorVisualization =
+ currentSimulator.getSimulatorCanvas();
+ boolean flag = !simulatorVisualization.isPaused()
+ && !simulatorVisualization.isResetted()
+ && !simulatorVisualization.hasFinished();
+
+ if (flag)
+ pauseCurrentSimulator();
+
+ VSSerialize serialize = new VSSerialize();
+ serialize.saveSimulator(VSSerialize.LAST_FILENAME,
+ currentSimulator);
+ if (flag)
+ startCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.saveas"))) {
+ VSSimulatorVisualization simulatorVisualization =
+ currentSimulator.getSimulatorCanvas();
+ boolean flag = !simulatorVisualization.isPaused()
+ && !simulatorVisualization.isResetted()
+ && !simulatorVisualization.hasFinished();
+ if (flag)
+ pauseCurrentSimulator();
+
+ VSSerialize serialize = new VSSerialize();
+ serialize.saveSimulator(currentSimulator);
+
+ if (flag)
+ startCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.about"))) {
+ new VSAboutFrame(finalPrefs, VSSimulatorFrame.this);
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.quit"))) {
+ System.exit(0);
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.start"))) {
+ startCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.pause"))) {
+ pauseCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.reset"))) {
+ resetCurrentSimulator();
+
+ } else if (sourceText.equals(
+ finalPrefs.getString("lang.replay"))) {
+ VSMenuItemStates menuItemState =
+ currentSimulator.getMenuItemStates();
+ menuItemState.setStart(false);
+ menuItemState.setPause(true);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(true);
+ currentSimulator.getSimulatorCanvas().reset();
+ currentSimulator.getSimulatorCanvas().play();
+ updateSimulatorMenu();
+ }
+ }
+ };
+
+ setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ setSize(prefs.getInteger("div.window.xsize"),
+ prefs.getInteger("div.window.ysize"));
+
+ setJMenuBar(createMenuBar());
+ setLayout(new BorderLayout());
+ setContentPane(createContentPane());
+ setVisible(true);
+
+ pauseButton.setEnabled(false);
+ replayButton.setEnabled(false);
+ resetButton.setEnabled(false);
+ startButton.setEnabled(false);
+ menuEdit.setEnabled(false);
+ //menuFile.setEnabled(false);
+ closeItem.setEnabled(false);
+ saveItem.setEnabled(false);
+ saveAsItem.setEnabled(false);
+ menuSimulator.setEnabled(false);
+ }
+
+ /**
+ * Creates the menu bar.
+ *
+ * @return the j menu bar
+ */
+ private JMenuBar createMenuBar() {
+ /* File menu */
+ menuFile = new JMenu(prefs.getString("lang.file"));
+ menuFile.setMnemonic(prefs.getInteger("keyevent.file"));
+ JMenuItem menuItem;
+
+ menuItem = new JMenuItem(prefs.getString("lang.simulator.new"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.new"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ closeItem = new JMenuItem(
+ prefs.getString("lang.simulator.close"));
+ closeItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.close"),
+ ActionEvent.ALT_MASK));
+ closeItem.addActionListener(actionListener);
+ menuFile.add(closeItem);
+
+ menuFile.addSeparator();
+
+ menuItem = new JMenuItem(prefs.getString("lang.window.new"));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ menuItem = new JMenuItem(prefs.getString("lang.window.close"));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ menuFile.addSeparator();
+
+ menuItem = new JMenuItem(prefs.getString("lang.open"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.open"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ saveItem = new JMenuItem(prefs.getString("lang.save"));
+ saveItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.save"),
+ ActionEvent.ALT_MASK));
+ saveItem.addActionListener(actionListener);
+ menuFile.add(saveItem);
+
+ saveAsItem = new JMenuItem(prefs.getString("lang.saveas"));
+ saveAsItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.saveas"),
+ ActionEvent.ALT_MASK));
+ saveAsItem.addActionListener(actionListener);
+ menuFile.add(saveAsItem);
+
+ menuFile.addSeparator();
+
+ menuItem = new JMenuItem(prefs.getString("lang.about"));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ menuItem = new JMenuItem(prefs.getString("lang.quit"));
+ menuItem.addActionListener(actionListener);
+ menuFile.add(menuItem);
+
+ /* Edit menu */
+ menuEdit = new JMenu(
+ prefs.getString("lang.edit"));
+ menuEdit.setMnemonic(prefs.getInteger("keyevent.edit"));
+ updateEditMenu();
+
+ /* Simulator menu */
+ toolBar = new JToolBar();
+ menuSimulator = new JMenu(
+ prefs.getString("lang.simulator"));
+ menuSimulator.setMnemonic(prefs.getInteger("keyevent.simulator"));
+
+ resetItem = new JMenuItem(prefs.getString("lang.reset"));
+ resetItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.reset"),
+ ActionEvent.ALT_MASK));
+ resetItem.addActionListener(actionListener);
+ resetItem.setEnabled(false);
+ menuSimulator.add(resetItem);
+ resetButton = new JButton(getImageIcon("reset.png",
+ prefs.getString("lang.reset")));
+ resetButton.addActionListener(actionListener);
+ toolBar.add(resetButton);
+
+ replayItem = new JMenuItem(
+ prefs.getString("lang.replay"));
+ replayItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.replay"),
+ ActionEvent.ALT_MASK));
+ replayItem.addActionListener(actionListener);
+ replayItem.setEnabled(false);
+ menuSimulator.add(replayItem);
+ replayButton = new JButton(
+ getImageIcon("replay.png", prefs.getString("lang.replay")));
+ replayButton.addActionListener(actionListener);
+ toolBar.add(replayButton);
+
+ pauseItem = new JMenuItem(prefs.getString("lang.pause"));
+ pauseItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.pause"),
+ ActionEvent.ALT_MASK));
+ pauseItem.addActionListener(actionListener);
+ menuSimulator.add(pauseItem);
+ pauseItem.setEnabled(false);
+ pauseButton = new JButton(getImageIcon("pause.png",
+ prefs.getString("lang.pause")));
+ pauseButton.addActionListener(actionListener);
+ toolBar.add(pauseButton);
+
+ startItem = new JMenuItem(prefs.getString("lang.start"));
+ startItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.start"),
+ ActionEvent.ALT_MASK));
+ startItem.addActionListener(actionListener);
+ menuSimulator.add(startItem);
+ startButton = new JButton(getImageIcon("start.png",
+ prefs.getString("lang.start")));
+ startButton.addActionListener(actionListener);
+ toolBar.add(startButton);
+
+
+ JMenuBar mainMenuBar = new JMenuBar();
+ mainMenuBar.add(menuFile);
+ mainMenuBar.add(menuEdit);
+ mainMenuBar.add(menuSimulator);
+
+ return mainMenuBar;
+ }
+
+ /**
+ * Creates the content pane.
+ *
+ * @return the container
+ */
+ private Container createContentPane() {
+ Container pane = getContentPane();
+ tabbedPane = new JTabbedPane(JTabbedPane.BOTTOM,
+ JTabbedPane.SCROLL_TAB_LAYOUT);
+
+ tabbedPane.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent ce) {
+ JTabbedPane pane = (JTabbedPane) ce.getSource();
+ currentSimulator = (VSSimulator) pane.getSelectedComponent();
+ if (currentSimulator != null) {
+ currentSimulator.getSimulatorCanvas().paint();
+ updateEditMenu();
+ updateSimulatorMenu();
+ }
+ }
+ });
+
+ pane.add(toolBar, BorderLayout.PAGE_START);
+ pane.add(tabbedPane, BorderLayout.CENTER);
+
+ return pane;
+ }
+
+ /**
+ * Updates the edit menu. Called if another simulator tab has been selected
+ * or if processes have been added or removed.
+ */
+ public void updateEditMenu() {
+ menuEdit.removeAll();
+
+ JMenuItem globalPrefsItem = new JMenuItem(
+ prefs.getString("lang.prefs"));
+
+ globalPrefsItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ VSPrefs simulatorPrefs = currentSimulator.getPrefs();
+ VSSimulatorEditor.TAKEOVER_BUTTON = true;
+ VSSimulatorEditor simulatorEditor = new VSSimulatorEditor(
+ simulatorPrefs, VSSimulatorFrame.this, currentSimulator);
+ new VSEditorFrame(prefs, VSSimulatorFrame.this,
+ simulatorEditor);
+ }
+ });
+
+ menuEdit.add(globalPrefsItem);
+ menuEdit.addSeparator();
+
+ if (currentSimulator == null)
+ return;
+
+ String processString = prefs.getString("lang.process");
+ ArrayList<VSInternalProcess> arr =
+ currentSimulator.getSimulatorCanvas().getProcessesArray();
+
+ //int numProcesses = arr.size();
+ int processNum = 0;
+
+ for (VSInternalProcess process : arr) {
+ int processID = process.getProcessID();
+ JMenuItem processItem = new JMenuItem(processString + " " +
+ processID);
+ if (processNum < 9)
+ processItem.setAccelerator(
+ KeyStroke.getKeyStroke(0x31+processNum,
+ ActionEvent.ALT_MASK));
+ final int finalProcessNum = processNum++;
+ processItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ currentSimulator.getSimulatorCanvas().editProcess(
+ finalProcessNum);
+ }
+ });
+ menuEdit.add(processItem);
+ }
+ }
+
+ /**
+ * Updates the simulator menu. Called if the simulator state has changed
+ * (e.g. start/play/stop/replay etc)
+ */
+ public synchronized void updateSimulatorMenu() {
+ VSMenuItemStates menuItemState = currentSimulator.getMenuItemStates();
+
+ pauseItem.setEnabled(menuItemState.getPause());
+ replayItem.setEnabled(menuItemState.getReplay());
+ resetItem.setEnabled(menuItemState.getReset());
+ startItem.setEnabled(menuItemState.getStart());
+
+ pauseButton.setEnabled(menuItemState.getPause());
+ replayButton.setEnabled(menuItemState.getReplay());
+ resetButton.setEnabled(menuItemState.getReset());
+ startButton.setEnabled(menuItemState.getStart());
+ }
+
+ /* (non-Javadoc)
+ * @see java.awt.Window#dispose()
+ */
+ public void dispose() {
+ synchronized (simulators) {
+ for (VSSimulator simulator : simulators)
+ simulator.getSimulatorCanvas().stopThread();
+ }
+ super.dispose();
+ }
+
+ /**
+ * Adds the simulator.
+ *
+ * @param simulator the simulator
+ */
+ public void addSimulator(VSSimulator simulator) {
+ simulator.setLayout(new GridLayout(1, 1, 3, 3));
+ simulator.setMinimumSize(new Dimension(0, 0));
+ simulator.setMaximumSize(new Dimension(0, 0));
+
+ simulators.add(simulator);
+ tabbedPane.addTab(prefs.getString("lang.simulator")
+ + " " + simulator.getSimulatorNum(), simulator);
+ tabbedPane.setSelectedComponent(simulator);
+
+ if (simulators.size() == 1) {
+ menuEdit.setEnabled(true);
+ //menuFile.setEnabled(true);
+ closeItem.setEnabled(true);
+ saveItem.setEnabled(true);
+ saveAsItem.setEnabled(true);
+ menuSimulator.setEnabled(true);
+ }
+ }
+
+ /**
+ * Removes the simulator.
+ *
+ * @param simulatorToRemove the simulator to remove
+ */
+ public void removeSimulator(VSSimulator simulatorToRemove) {
+ if (simulators.size() == 1) {
+ pauseButton.setEnabled(false);
+ replayButton.setEnabled(false);
+ resetButton.setEnabled(false);
+ startButton.setEnabled(false);
+ menuEdit.setEnabled(false);
+ //menuFile.setEnabled(false);
+ closeItem.setEnabled(false);
+ saveItem.setEnabled(false);
+ saveAsItem.setEnabled(false);
+ menuSimulator.setEnabled(false);
+ }
+
+ simulators.remove(simulatorToRemove);
+ tabbedPane.remove(simulatorToRemove);
+ simulatorToRemove.getSimulatorCanvas().stopThread();
+ }
+
+ /**
+ * Removes the current simulator.
+ */
+ private void removeCurrentSimulator() {
+ removeSimulator(currentSimulator);
+ }
+
+ /**
+ * Gets the current simulator.
+ *
+ * @return the current simulator
+ */
+ public VSSimulator getCurrentSimulator() {
+ return currentSimulator;
+ }
+
+ /**
+ * Resets the current simulator
+ */
+ public void resetCurrentSimulator() {
+ if (currentSimulator == null)
+ return;
+
+ VSMenuItemStates menuItemState =
+ currentSimulator.getMenuItemStates();
+ menuItemState.setStart(true);
+ menuItemState.setPause(false);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(false);
+ currentSimulator.getSimulatorCanvas().reset();
+ updateSimulatorMenu();
+ }
+
+ /**
+ * Starts the current simulator
+ */
+ public void startCurrentSimulator() {
+ VSMenuItemStates menuItemState =
+ currentSimulator.getMenuItemStates();
+ menuItemState.setStart(false);
+ menuItemState.setPause(true);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(true);
+ currentSimulator.getSimulatorCanvas().play();
+ updateSimulatorMenu();
+ }
+
+ /**
+ * Pauses the current simulator
+ */
+ public void pauseCurrentSimulator() {
+ VSMenuItemStates menuItemState =
+ currentSimulator.getMenuItemStates();
+ menuItemState.setStart(true);
+ menuItemState.setPause(false);
+ menuItemState.setReset(true);
+ menuItemState.setReplay(true);
+ currentSimulator.getSimulatorCanvas().pause();
+ updateSimulatorMenu();
+ }
+
+ /**
+ * Gets the image icon.
+ *
+ * @param name the name
+ * @param descr the descr
+ *
+ * @return the image icon
+ */
+ private ImageIcon getImageIcon(String name, String descr) {
+ java.net.URL imageURL = getClass().getResource("/icons/"+name);
+
+ if (imageURL == null)
+ return new ImageIcon("icons/"+name, descr);
+
+ return new ImageIcon(imageURL, descr);
+ }
+
+ /**
+ * Gets the prefs.
+ *
+ * @return the prefs
+ */
+ public VSPrefs getPrefs() {
+ return prefs;
+ }
+}