summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/prefs/editors/VSSimulationEditor.java13
-rw-r--r--sources/simulator/VSMain.java3
-rw-r--r--sources/simulator/VSSimulation.java264
-rw-r--r--sources/simulator/VSSimulationPanel.java67
-rw-r--r--sources/simulator/VSSimulatorFrame.java263
5 files changed, 375 insertions, 235 deletions
diff --git a/sources/prefs/editors/VSSimulationEditor.java b/sources/prefs/editors/VSSimulationEditor.java
index 0aa6256..99b53bf 100644
--- a/sources/prefs/editors/VSSimulationEditor.java
+++ b/sources/prefs/editors/VSSimulationEditor.java
@@ -13,13 +13,15 @@ import utils.*;
import prefs.VSPrefs;
public class VSSimulationEditor extends VSEditorFrame {
- private boolean startNewVSSimulation;
+ private boolean startNewSimulation;
+ private VSSimulatorFrame simulatorFrame;
public VSSimulationEditor(VSPrefs prefs, Component relativeTo) {
super(prefs, relativeTo, prefs, prefs.getString("name")
+ " - " + prefs.getString("lang.prefs"));
+ this.simulatorFrame = (VSSimulatorFrame) relativeTo;
- startNewVSSimulation = true;
+ startNewSimulation = true;
init();
}
@@ -29,7 +31,7 @@ public class VSSimulationEditor extends VSEditorFrame {
+ (prefsCategory == ALL_PREFERENCES ? ".ext" : "")),
prefsCategory);
- startNewVSSimulation = false;
+ startNewSimulation = false;
init();
}
@@ -46,8 +48,9 @@ public class VSSimulationEditor extends VSEditorFrame {
frame.dispose();
- if (startNewVSSimulation)
- new VSSimulation(prefs, getFrame());
+ if (startNewSimulation)
+ simulatorFrame.addSimulation(
+ new VSSimulation(prefs, simulatorFrame));
} else {
super.actionPerformed(e);
diff --git a/sources/simulator/VSMain.java b/sources/simulator/VSMain.java
index 4398226..53560f4 100644
--- a/sources/simulator/VSMain.java
+++ b/sources/simulator/VSMain.java
@@ -18,7 +18,8 @@ public class VSMain {
}
private void init(VSPrefs prefs, Component relativeTo) {
- new VSSimulationEditor(prefs, relativeTo);
+ VSSimulatorFrame simulatorFrame = new VSSimulatorFrame(prefs, relativeTo);
+ new VSSimulationEditor(prefs, simulatorFrame);
}
public static void main(String[] args) {
diff --git a/sources/simulator/VSSimulation.java b/sources/simulator/VSSimulation.java
index 8b4515b..6bdcc97 100644
--- a/sources/simulator/VSSimulation.java
+++ b/sources/simulator/VSSimulation.java
@@ -15,7 +15,10 @@ import prefs.*;
import protocols.*;
import utils.*;
-public class VSSimulation extends VSFrame implements ActionListener {
+public class VSSimulation extends JPanel {
+ private static int simulationCounter;
+ private static int simulationNum;
+ private VSSimulatorFrame simulatorFrame;
private JTextField filterTextField;
private JCheckBox filterActiveCheckBox;
private JCheckBox lamportActiveCheckBox;
@@ -29,10 +32,6 @@ public class VSSimulation extends VSFrame implements ActionListener {
private JTextField localTextField;
private JTextField globalTextField;
private ArrayList<VSCreateTask> createTasks;
- private JMenuItem pauseItem;
- private JMenuItem replayItem;
- private JMenuItem resetItem;
- private JMenuItem startItem;
private JSplitPane splitPaneH;
private JSplitPane splitPaneV;
private Thread thread;
@@ -43,26 +42,66 @@ public class VSSimulation extends VSFrame implements ActionListener {
private VSTaskManagerTableModel taskManagerLocalModel;
private VSTaskManagerTableModel taskManagerGlobalModel;
private VSTaskManager taskManager;
+ private VSMenuItemStates menuItemStates;
+
+ public class VSMenuItemStates {
+ private boolean pause;
+ private boolean replay;
+ private boolean reset;
+ private boolean start;
+
+ public VSMenuItemStates(boolean pause, boolean replay, boolean reset, boolean start) {
+ this.pause = pause;
+ this.replay = replay;
+ this.reset = reset;
+ this.start = start;
+ }
- public VSSimulation (VSPrefs prefs, Component relativeTo) {
- super(prefs.getString("name"), relativeTo);
- this.prefs = prefs;
- this.logging = new VSLogging();
+ public void setPause(boolean pause) {
+ this.pause = pause;
+ }
+
+ public void setReplay(boolean replay) {
+ this.replay = replay;
+ }
- setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ public void setReset(boolean pause) {
+ this.reset = reset;
+ }
- setSize(prefs.getInteger("window.xsize")+100,
- prefs.getInteger("window.ysize"));
- setContentPane(createContentPane());
- setJMenuBar(createJMenuBar());
- setVisible(true);
+ public void setStart(boolean start) {
+ this.start = start;
+ }
- thread = new Thread(simulationPanel);
- thread.start();
- logging.logg(prefs.getString("lang.simulation.new"));
+ public boolean getPause() {
+ return pause;
+ }
+ public boolean getReplay() {
+ return replay;
+ }
+
+ public boolean getReset() {
+ return reset;
+ }
+
+ public boolean getStart() {
+ return start;
+ }
+ }
+
+ public VSSimulation(VSPrefs prefs, VSSimulatorFrame simulatorFrame) {
+ this.prefs = prefs;
+ this.simulatorFrame = simulatorFrame;
+ this.logging = new VSLogging();
+ this.simulationNum = ++simulationCounter;
+ this.menuItemStates = new VSMenuItemStates(false, false, false, true);
this.localTextFields = new ArrayList<String>();
this.globalTextFields = new ArrayList<String>();
+
+ logging.logg(prefs.getString("lang.simulation.new"));
+ fillContentPane();
+
int numProcesses = simulationPanel.getNumProcesses();
for (int i = 0; i <= numProcesses; ++i) {
@@ -71,113 +110,12 @@ public class VSSimulation extends VSFrame implements ActionListener {
}
processesComboBox.setSelectedIndex(numProcesses);
- }
- private JMenuBar createJMenuBar() {
- /* File menu */
- JMenu menuFile = new JMenu(prefs.getString("lang.file"));
- menuFile.setMnemonic(prefs.getInteger("keyevent.file"));
- JMenuItem menuItem;
-
- menuItem = new JMenuItem(prefs.getString("lang.new"));
- menuItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.new"),
- ActionEvent.ALT_MASK));
- menuItem.addActionListener(this);
- menuFile.add(menuItem);
-
- menuItem = new JMenuItem(
- prefs.getString("lang.close"));
- menuItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.close"),
- ActionEvent.ALT_MASK));
- menuItem.addActionListener(this);
- menuFile.add(menuItem);
-
- menuFile.addSeparator();
-
- menuItem = new JMenuItem(prefs.getString("lang.about"));
- menuItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.about"),
- ActionEvent.ALT_MASK));
- menuItem.addActionListener(this);
- menuFile.add(menuItem);
-
- menuItem = new JMenuItem(prefs.getString("lang.quit"));
- menuItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.quit"),
- ActionEvent.ALT_MASK));
- menuItem.addActionListener(this);
- menuFile.add(menuItem);
-
- /* Edit menu */
- JMenu menuEdit = new JMenu(
- prefs.getString("lang.edit"));
- menuEdit.setMnemonic(prefs.getInteger("keyevent.edit"));
- int numProcesses = simulationPanel.getNumProcesses();
- final String processString = prefs.getString("lang.process");
- for (int i = 0; i < numProcesses; ++i) {
- JMenuItem processItem = new JMenuItem(processString + " " + (i+1));
- processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+i,
- ActionEvent.ALT_MASK));
- final int processNum = i;
- processItem.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent ae) {
- simulationPanel.editProcess(processNum);
- }
- });
- menuEdit.add(processItem);
- }
-
- /* Simulation menu */
- JMenu menuSimulation = new JMenu(
- prefs.getString("lang.simulation"));
- menuSimulation.setMnemonic(prefs.getInteger("keyevent.simulation"));
-
- startItem = new JMenuItem(
- prefs.getString("lang.start"));
- startItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.start"),
- ActionEvent.ALT_MASK));
- startItem.addActionListener(this);
- menuSimulation.add(startItem);
-
- pauseItem = new JMenuItem(
- prefs.getString("lang.pause"));
- pauseItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.pause"),
- ActionEvent.ALT_MASK));
- pauseItem.addActionListener(this);
- menuSimulation.add(pauseItem);
- pauseItem.setEnabled(false);
-
- resetItem = new JMenuItem(
- prefs.getString("lang.reset"));
- resetItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.reset"),
- ActionEvent.ALT_MASK));
- resetItem.addActionListener(this);
- resetItem.setEnabled(false);
- menuSimulation.add(resetItem);
-
- replayItem = new JMenuItem(
- prefs.getString("lang.replay"));
- replayItem.setAccelerator(KeyStroke.getKeyStroke(
- prefs.getInteger("keyevent.replay"),
- ActionEvent.ALT_MASK));
- replayItem.addActionListener(this);
- replayItem.setEnabled(false);
- menuSimulation.add(replayItem);
-
- JMenuBar mainMenuBar = new JMenuBar();
- mainMenuBar.add(menuFile);
- mainMenuBar.add(menuEdit);
- mainMenuBar.add(menuSimulation);
-
- return mainMenuBar;
+ thread = new Thread(simulationPanel);
+ thread.start();
}
- private Container createContentPane() {
+ private void fillContentPane() {
JTextArea loggingArea = logging.getLoggingArea();
splitPaneH = new JSplitPane();
@@ -221,11 +159,7 @@ public class VSSimulation extends VSFrame implements ActionListener {
//splitPaneV.setOneTouchExpandable(true);
splitPaneV.setContinuousLayout(true);
- Container contentPane = getContentPane();
- contentPane.add(splitPaneV, BorderLayout.CENTER);
-
-
- return contentPane;
+ this.add(splitPaneV, BorderLayout.CENTER);
}
private JPanel createToolsPanel() {
@@ -827,57 +761,6 @@ public class VSSimulation extends VSFrame implements ActionListener {
return splitPaneV.getDividerLocation();
}
- public void dispose() {
- simulationPanel.finalize();
- super.dispose();
- }
-
- public void actionPerformed(ActionEvent e) {
- JMenuItem source = (JMenuItem) e.getSource();
-
- if (source.getText().equals(prefs.getString("lang.close"))) {
- dispose();
-
- } else if (source.getText().equals(prefs.getString("lang.new"))) {
- new VSMain(VSDefaultPrefs.init(), VSSimulation.this);
-
- } else if (source.getText().equals(prefs.getString("lang.about"))) {
- new VSAbout(prefs, VSSimulation.this);
-
- } else if (source.getText().equals(prefs.getString("lang.quit"))) {
- System.exit(0);
-
- } else if (source.getText().equals(prefs.getString("lang.start"))) {
- startItem.setEnabled(false);
- pauseItem.setEnabled(true);
- resetItem.setEnabled(false);
- replayItem.setEnabled(true);
- simulationPanel.play();
-
- } else if (source.getText().equals(prefs.getString("lang.pause"))) {
- startItem.setEnabled(true);
- pauseItem.setEnabled(false);
- resetItem.setEnabled(true);
- replayItem.setEnabled(true);
- simulationPanel.pause();
-
- } else if (source.getText().equals(prefs.getString("lang.reset"))) {
- startItem.setEnabled(true);
- pauseItem.setEnabled(false);
- resetItem.setEnabled(false);
- replayItem.setEnabled(false);
- simulationPanel.reset();
-
- } else if (source.getText().equals(prefs.getString("lang.replay"))) {
- startItem.setEnabled(false);
- pauseItem.setEnabled(true);
- resetItem.setEnabled(false);
- replayItem.setEnabled(true);
- simulationPanel.reset();
- simulationPanel.play();
- }
- }
-
private int getSelectedProcessNum() {
try {
String string = (String) processesComboBox.getSelectedItem();
@@ -917,9 +800,26 @@ public class VSSimulation extends VSFrame implements ActionListener {
}
public void finish() {
- startItem.setEnabled(false);
- pauseItem.setEnabled(false);
- resetItem.setEnabled(true);
- replayItem.setEnabled(true);
+ menuItemStates.setStart(false);
+ menuItemStates.setPause(false);
+ menuItemStates.setReset(true);
+ menuItemStates.setReplay(true);
+ simulatorFrame.updateSimulationMenu();
+ }
+
+ public int getSimulationNum() {
+ return simulationNum;
+ }
+
+ public VSSimulation.VSMenuItemStates getMenuItemStates() {
+ return menuItemStates;
+ }
+
+ public VSSimulationPanel getSimulationPanel() {
+ return simulationPanel;
+ }
+
+ public VSFrame getSimulatorFrame() {
+ return simulatorFrame;
}
}
diff --git a/sources/simulator/VSSimulationPanel.java b/sources/simulator/VSSimulationPanel.java
index ec5acbc..d501f22 100644
--- a/sources/simulator/VSSimulationPanel.java
+++ b/sources/simulator/VSSimulationPanel.java
@@ -25,7 +25,7 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
private int threadSleep;
private long untilTime;
private volatile boolean isPaused = true;
- private volatile boolean isFinalized = false;
+ private volatile boolean isThreadStopped = false;
private volatile boolean isFinished = false;
private volatile boolean isResetted = false;
private volatile boolean isAntiAliased = false;
@@ -239,7 +239,6 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
if (strategy != null) {
synchronized (strategy) {
- //setPreferredSize(new Dimension(simulation.getWidth()-simulation.getSplitSize(),(int)paintSize-20));
g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.WHITE);
if (isAntiAliased)
@@ -273,33 +272,6 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
if (strategy != null) {
g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.WHITE);
-
-
- // Determine if antialiasing is enabled
- //RenderingHints rhints = g2d.getRenderingHints();
- //boolean antialiasOn = rhints.containsValue(RenderingHints.VALUE_ANTIALIAS_ON);
-
- // Enable antialiasing for shapes
- /*
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
- */
- // Disable antialiasing for shapes
- //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- // RenderingHints.VALUE_ANTIALIAS_OFF);
-
- // Draw shapes...; see e586 Drawing Simple Shapes
-
- // Enable antialiasing for text
- /*
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- */
- // Draw text...; see e591 Drawing Simple Text
-
- // Disable antialiasing for text
-// g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
-// RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
}
}
@@ -311,6 +283,7 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
isAntiAliasedChanged = false;
}
+
g.fillRect(0, 0, getWidth(), getHeight());
final long globalTime = time;
@@ -524,7 +497,7 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
//play();
while (true) {
- while (!isFinalized && (isPaused || isFinished || isResetted)) {
+ while (!isThreadStopped && (isPaused || isFinished || isResetted)) {
try {
Thread.sleep(100);
paint();
@@ -533,10 +506,10 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
}
}
- if (isFinalized)
+ if (isThreadStopped)
break; /* Exit the thread */
- while (!isPaused && !isFinalized) {
+ while (!isPaused && !isThreadStopped) {
try {
Thread.sleep(threadSleep);
} catch (Exception e) {
@@ -640,31 +613,31 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
}
}
- public void finalize() {
- isFinalized = true;
+ public void stopThread() {
+ isThreadStopped = true;
}
- public boolean isFinalized() {
- return isFinalized;
+ public boolean isThreadStopped() {
+ return isThreadStopped;
}
public void showLamport(boolean showLamport) {
this.showLamport = showLamport;
- if (isPaused)
- paint();
+ if (isPaused)
+ paint();
}
public void showVectorTime(boolean showVectorTime) {
this.showVectorTime = showVectorTime;
- if (isPaused)
- paint();
+ if (isPaused)
+ paint();
}
public void isAntiAliased(boolean isAntiAliased) {
this.isAntiAliased = isAntiAliased;
this.isAntiAliasedChanged = true;
- if (isPaused)
- paint();
+ if (isPaused)
+ paint();
}
public void sendMessage(VSMessage message) {
@@ -766,7 +739,7 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
public void editProcess(VSProcess process) {
if (process != null) {
process.updatePrefs();
- new VSProcessEditor(prefs, simulation, process);
+ new VSProcessEditor(prefs, simulation.getSimulatorFrame(), process);
}
}
@@ -798,8 +771,8 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
highlightedProcess = null;
}
- if (isPaused)
- paint();
+ if (isPaused)
+ paint();
return;
}
@@ -815,8 +788,8 @@ public class VSSimulationPanel extends Canvas implements Runnable, MouseMotionLi
p.highlightOn();
}
- if (isPaused)
- paint();
+ if (isPaused)
+ paint();
}
public void ancestorMoved(HierarchyEvent e) { }
diff --git a/sources/simulator/VSSimulatorFrame.java b/sources/simulator/VSSimulatorFrame.java
new file mode 100644
index 0000000..1b13c68
--- /dev/null
+++ b/sources/simulator/VSSimulatorFrame.java
@@ -0,0 +1,263 @@
+package simulator;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.border.*;
+import javax.swing.event.*;
+import javax.swing.table.*;
+
+import core.*;
+import events.*;
+import events.implementations.*;
+import prefs.*;
+import prefs.editors.*;
+import protocols.*;
+import utils.*;
+
+public class VSSimulatorFrame extends VSFrame implements ActionListener {
+ private JMenuItem pauseItem;
+ private JMenuItem replayItem;
+ private JMenuItem resetItem;
+ private JMenuItem startItem;
+ private JMenu menuEdit;
+ private VSPrefs prefs;
+ private ArrayList<VSSimulation> simulations;
+ private VSSimulation currentSimulation;
+ private JTabbedPane tabbedPane;
+
+ public VSSimulatorFrame(VSPrefs prefs, Component relativeTo) {
+ super(prefs.getString("name"), relativeTo);
+ this.prefs = prefs;
+ this.simulations = new ArrayList<VSSimulation>();
+
+ setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+
+ setSize(prefs.getInteger("window.xsize")+100,
+ prefs.getInteger("window.ysize"));
+ setJMenuBar(createJMenuBar());
+ setContentPane(createContentPane());
+ setVisible(true);
+ }
+
+ private JMenuBar createJMenuBar() {
+ /* File menu */
+ JMenu menuFile = new JMenu(prefs.getString("lang.file"));
+ menuFile.setMnemonic(prefs.getInteger("keyevent.file"));
+ JMenuItem menuItem;
+
+ menuItem = new JMenuItem(prefs.getString("lang.new"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.new"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(this);
+ menuFile.add(menuItem);
+
+ menuItem = new JMenuItem(
+ prefs.getString("lang.close"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.close"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(this);
+ menuFile.add(menuItem);
+
+ menuFile.addSeparator();
+
+ menuItem = new JMenuItem(prefs.getString("lang.about"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.about"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(this);
+ menuFile.add(menuItem);
+
+ menuItem = new JMenuItem(prefs.getString("lang.quit"));
+ menuItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.quit"),
+ ActionEvent.ALT_MASK));
+ menuItem.addActionListener(this);
+ menuFile.add(menuItem);
+
+ /* Edit menu */
+ menuEdit = new JMenu(
+ prefs.getString("lang.edit"));
+ menuEdit.setMnemonic(prefs.getInteger("keyevent.edit"));
+ updateEditMenu();
+
+ /* Simulation menu */
+ JMenu menuSimulation = new JMenu(
+ prefs.getString("lang.simulation"));
+ menuSimulation.setMnemonic(prefs.getInteger("keyevent.simulation"));
+
+ startItem = new JMenuItem(
+ prefs.getString("lang.start"));
+ startItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.start"),
+ ActionEvent.ALT_MASK));
+ startItem.addActionListener(this);
+ menuSimulation.add(startItem);
+
+ pauseItem = new JMenuItem(
+ prefs.getString("lang.pause"));
+ pauseItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.pause"),
+ ActionEvent.ALT_MASK));
+ pauseItem.addActionListener(this);
+ menuSimulation.add(pauseItem);
+ pauseItem.setEnabled(false);
+
+ resetItem = new JMenuItem(
+ prefs.getString("lang.reset"));
+ resetItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.reset"),
+ ActionEvent.ALT_MASK));
+ resetItem.addActionListener(this);
+ resetItem.setEnabled(false);
+ menuSimulation.add(resetItem);
+
+ replayItem = new JMenuItem(
+ prefs.getString("lang.replay"));
+ replayItem.setAccelerator(KeyStroke.getKeyStroke(
+ prefs.getInteger("keyevent.replay"),
+ ActionEvent.ALT_MASK));
+ replayItem.addActionListener(this);
+ replayItem.setEnabled(false);
+ menuSimulation.add(replayItem);
+ updateSimulationMenu();
+
+ JMenuBar mainMenuBar = new JMenuBar();
+ mainMenuBar.add(menuFile);
+ mainMenuBar.add(menuEdit);
+ mainMenuBar.add(menuSimulation);
+
+ return mainMenuBar;
+ }
+
+ private Container createContentPane() {
+ Container pane = getContentPane();
+
+ tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
+ tabbedPane.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent ce) {
+ JTabbedPane pane = (JTabbedPane) ce.getSource();
+ currentSimulation = (VSSimulation) pane.getSelectedComponent();
+ currentSimulation.getSimulationPanel().paint();
+ updateEditMenu();
+ updateSimulationMenu();
+ }
+ });
+ pane.add(tabbedPane, BorderLayout.CENTER);
+
+ return pane;
+ }
+
+ private void updateEditMenu() {
+ menuEdit.removeAll();
+
+ if (currentSimulation == null)
+ return;
+
+ final String processString = prefs.getString("lang.process");
+ final int numProcesses = currentSimulation.getSimulationPanel().getNumProcesses();
+
+ for (int i = 0; i < numProcesses; ++i) {
+ JMenuItem processItem = new JMenuItem(processString + " " + (i+1));
+ processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+i,
+ ActionEvent.ALT_MASK));
+ final int finalProcessNum = i;
+ processItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ currentSimulation.getSimulationPanel().editProcess(finalProcessNum);
+ }
+ });
+ menuEdit.add(processItem);
+ }
+ }
+
+ public void updateSimulationMenu() {
+ if (currentSimulation == null) {
+ pauseItem.setEnabled(false);
+ replayItem.setEnabled(false);
+ resetItem.setEnabled(false);
+ startItem.setEnabled(false);
+
+ } else {
+ VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ pauseItem.setEnabled(menuItemState.getPause());
+ replayItem.setEnabled(menuItemState.getReplay());
+ resetItem.setEnabled(menuItemState.getReset());
+ startItem.setEnabled(menuItemState.getStart());
+ }
+ }
+
+ public void dispose() {
+ for (VSSimulation simulation : simulations)
+ simulation.getSimulationPanel().stopThread();
+ super.dispose();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ JMenuItem source = (JMenuItem) e.getSource();
+
+ if (source.getText().equals(prefs.getString("lang.close"))) {
+ dispose();
+
+ } else if (source.getText().equals(prefs.getString("lang.new"))) {
+ new VSSimulationEditor(VSDefaultPrefs.init(), this);
+
+ } else if (source.getText().equals(prefs.getString("lang.about"))) {
+ new VSAbout(prefs, this);
+
+ } else if (source.getText().equals(prefs.getString("lang.quit"))) {
+ System.exit(0);
+
+ } else if (source.getText().equals(prefs.getString("lang.start"))) {
+ VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ menuItemState.setStart(false);
+ menuItemState.setPause(true);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(true);
+ currentSimulation.getSimulationPanel().play();
+ updateSimulationMenu();
+
+ } else if (source.getText().equals(prefs.getString("lang.pause"))) {
+ VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ menuItemState.setStart(true);
+ menuItemState.setPause(false);
+ menuItemState.setReset(true);
+ menuItemState.setReplay(true);
+ currentSimulation.getSimulationPanel().pause();
+ updateSimulationMenu();
+
+ } else if (source.getText().equals(prefs.getString("lang.reset"))) {
+ VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ menuItemState.setStart(true);
+ menuItemState.setPause(false);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(false);
+ currentSimulation.getSimulationPanel().reset();
+ updateSimulationMenu();
+
+ } else if (source.getText().equals(prefs.getString("lang.replay"))) {
+ VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ menuItemState.setStart(false);
+ menuItemState.setPause(true);
+ menuItemState.setReset(false);
+ menuItemState.setReplay(true);
+ currentSimulation.getSimulationPanel().reset();
+ currentSimulation.getSimulationPanel().play();
+ updateSimulationMenu();
+ }
+ }
+
+ public void addSimulation(VSSimulation simulation) {
+ simulation.setLayout(new GridLayout(1, 1, 3, 3));
+ simulation.setMinimumSize(new Dimension(0, 0));
+ simulation.setMaximumSize(new Dimension(0, 0));
+
+ simulations.add(simulation);
+
+ tabbedPane.addTab(prefs.getString("lang.simulation")
+ + " " + simulation.getSimulationNum(), simulation);
+ }
+}