diff options
Diffstat (limited to 'sources/simulator/VSSimulation.java')
| -rw-r--r-- | sources/simulator/VSSimulation.java | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/sources/simulator/VSSimulation.java b/sources/simulator/VSSimulation.java new file mode 100644 index 0000000..2bc90d8 --- /dev/null +++ b/sources/simulator/VSSimulation.java @@ -0,0 +1,311 @@ +package simulator; + +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import javax.swing.*; +import javax.swing.event.*; + +import prefs.*; +import core.*; +import utils.*; + +public class VSSimulation extends VSFrame implements ActionListener { + private JMenuItem pauseItem; + private JMenuItem replayItem; + private JMenuItem resetItem; + private JMenuItem startItem; + private JSplitPane splitPaneH; + private JSplitPane splitPaneV; + private JPanel processEditPanel; + private VSSimulationPanel simulationPanel; + private Thread thread; + private VSPrefs prefs; + private boolean hasStarted = false; + private VSLogging logging; + + public VSSimulation (VSPrefs prefs, Component relativeTo) { + super(prefs.getString("name"), relativeTo); + this.prefs = prefs; + this.logging = new VSLogging(); + + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + + setSize(prefs.getInteger("window.xsize")+100, + prefs.getInteger("window.ysize")); + setJMenuBar(createJMenuBar()); + setContentPane(createContentPane()); + setVisible(true); + + thread = new Thread(simulationPanel); + //logging.start(); + logging.logg(prefs.getString("lang.simulation.new")); + } + + 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); + + /* VSSimulation menu */ + JMenu menuVSSimulation = new JMenu( + prefs.getString("lang.simulation")); + menuVSSimulation.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); + menuVSSimulation.add(startItem); + + pauseItem = new JMenuItem( + prefs.getString("lang.pause")); + pauseItem.setAccelerator(KeyStroke.getKeyStroke( + prefs.getInteger("keyevent.pause"), + ActionEvent.ALT_MASK)); + pauseItem.addActionListener(this); + menuVSSimulation.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); + menuVSSimulation.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); + menuVSSimulation.add(replayItem); + + JMenuBar mainMenuBar = new JMenuBar(); + mainMenuBar.add(menuFile); + mainMenuBar.add(menuVSSimulation); + + return mainMenuBar; + } + + private Container createContentPane() { + JTextArea loggingArea = logging.getLoggingArea(); + + /* + splitPaneH = new JSplitPane(); + splitPaneH.setDividerLocation( + prefs.getInteger("window.splitsize")); + + */ + splitPaneV = new JSplitPane(); + splitPaneV.setDividerLocation( + prefs.getInteger("window.ysize") + - prefs.getInteger("window.loggsize")); + + simulationPanel = new VSSimulationPanel(prefs, this, logging); + logging.setSimulationPanel(simulationPanel); + simulationPanel.setBackground(new Color(0xFD, 0xFC, 0xF7)); + //processEditPanel = createProcessEditPanel(); + + JScrollPane paintScrollPane = new JScrollPane(simulationPanel); + JScrollPane textScrollPane = new JScrollPane(loggingArea); + JPanel toolsPanel = createToolsPanel(); + + JPanel loggingPane = new JPanel(new BorderLayout()); + loggingPane.add(textScrollPane, BorderLayout.CENTER); + loggingPane.add(toolsPanel, BorderLayout.SOUTH); + loggingPane.setPreferredSize(new Dimension(200, 1)); + + //JScrollPane processEditScrollPane = new JScrollPane(processEditPanel); + + /* + splitPaneH.setOrientation(JSplitPane.HORIZONTAL_SPLIT); + splitPaneH.setLeftComponent(processEditScrollPane); + splitPaneH.setRightComponent(paintScrollPane); + splitPaneH.setContinuousLayout(true); + splitPaneH.setOneTouchExpandable(true); + */ + + splitPaneV.setOrientation(JSplitPane.VERTICAL_SPLIT); + //splitPaneV.setTopComponent(splitPaneH); + splitPaneV.setTopComponent(paintScrollPane); + splitPaneV.setBottomComponent(loggingPane); + splitPaneV.setOneTouchExpandable(true); + splitPaneV.setContinuousLayout(true); + + Container contentPane = getContentPane(); + contentPane.add(splitPaneV, BorderLayout.CENTER); + + + return contentPane; + } + + private JPanel createToolsPanel() { + JPanel toolsPanel = new JPanel(); + + toolsPanel.setLayout(new BoxLayout(toolsPanel, BoxLayout.X_AXIS)); + JCheckBox loggingActiveCheckBox = new JCheckBox(prefs.getString("lang.logging.active")); + loggingActiveCheckBox.setSelected(true); + loggingActiveCheckBox.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent ce) { + AbstractButton abstractButton = (AbstractButton) ce.getSource(); + ButtonModel buttonModel = abstractButton.getModel(); + logging.isPaused(!buttonModel.isSelected()); + } + }); + toolsPanel.add(loggingActiveCheckBox); + + JCheckBox lamportActiveCheckBox = new JCheckBox(prefs.getString("lang.time.lamport")); + lamportActiveCheckBox.setSelected(false); + lamportActiveCheckBox.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent ce) { + AbstractButton abstractButton = (AbstractButton) ce.getSource(); + ButtonModel buttonModel = abstractButton.getModel(); + simulationPanel.showLamport(buttonModel.isSelected()); + } + }); + toolsPanel.add(lamportActiveCheckBox); + + return toolsPanel; + } + + /* + private JPanel createProcessEditPanel() { + JPanel editPanel = new JPanel(new GridBagLayout()); + editPanel.setBackground(Color.WHITE); + + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.HORIZONTAL; + + Insets insets = new Insets(5, 5, 5, 5); + constraints.insets = insets; + constraints.ipady = 5; + constraints.ipadx = 5; + int row = 0; + + Vector<VSProcess> processes = simulationPanel.getProcesses(); + + for (VSProcess p : processes) { + constraints.gridy = row++; + //editPanel.add(new VSProcessEditor(prefs, p), constraints); + } + + return editPanel; + } + */ + + public int getSplitSize() { + return 0;//splitPaneH.getDividerLocation(); + } + + public int getPaintSize() { + 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.initialize(), 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); + runThread(); + + } 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(); + runThread(); + } + } + + private void runThread() { + if (hasStarted) { + simulationPanel.play(); + + } else { + hasStarted = true; + thread = new Thread(simulationPanel); + thread.start(); + } + } + + public void finish() { + startItem.setEnabled(false); + pauseItem.setEnabled(false); + resetItem.setEnabled(true); + replayItem.setEnabled(true); + } +} |
