summaryrefslogtreecommitdiff
path: root/sources/simulator
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-05-24 21:06:15 +0000
committerPaul Buetow <paul@buetow.org>2008-05-24 21:06:15 +0000
commit222d028fac58233a451e2de875353252a3dc9f63 (patch)
tree292394f179db68464d9554b71a7ec05368867e33 /sources/simulator
parent61e38d3236ead0b32f8fa1a78901e9d0c75c91ea (diff)
PRocesses now get removed properly.
Removed all VSSimulation* classes.
Diffstat (limited to 'sources/simulator')
-rw-r--r--sources/simulator/VSLogging.java4
-rw-r--r--sources/simulator/VSMain.java2
-rw-r--r--sources/simulator/VSSimulator.java (renamed from sources/simulator/VSSimulation.java)35
-rw-r--r--sources/simulator/VSSimulatorCanvas.java (renamed from sources/simulator/VSSimulationCanvas.java)138
-rw-r--r--sources/simulator/VSSimulatorFrame.java38
5 files changed, 158 insertions, 59 deletions
diff --git a/sources/simulator/VSLogging.java b/sources/simulator/VSLogging.java
index 9ab9cec..c303bec 100644
--- a/sources/simulator/VSLogging.java
+++ b/sources/simulator/VSLogging.java
@@ -11,7 +11,7 @@ public class VSLogging {
private String filterText;
private ArrayList<StringBuffer> pauseLines;
private ArrayList<StringBuffer> loggingLines;
- private VSSimulationCanvas simulationCanvas;
+ private VSSimulatorCanvas simulationCanvas;
private boolean isFiltered;
private boolean isPaused;
private Pattern filterPattern;
@@ -26,7 +26,7 @@ public class VSLogging {
filterText = "";
}
- public void setSimulationCanvas(VSSimulationCanvas simulationCanvas) {
+ public void setSimulationCanvas(VSSimulatorCanvas simulationCanvas) {
this.simulationCanvas = simulationCanvas;
}
diff --git a/sources/simulator/VSMain.java b/sources/simulator/VSMain.java
index 926f450..7e6639e 100644
--- a/sources/simulator/VSMain.java
+++ b/sources/simulator/VSMain.java
@@ -19,7 +19,7 @@ public class VSMain {
private void init(VSPrefs prefs, Component relativeTo) {
VSSimulatorFrame simulatorFrame = new VSSimulatorFrame(prefs, relativeTo);
- new VSEditorFrame(prefs, relativeTo, new VSSimulationEditor(prefs, simulatorFrame));
+ new VSEditorFrame(prefs, relativeTo, new VSSimulatorEditor(prefs, simulatorFrame));
}
public static void main(String[] args) {
diff --git a/sources/simulator/VSSimulation.java b/sources/simulator/VSSimulator.java
index 17400cb..097d198 100644
--- a/sources/simulator/VSSimulation.java
+++ b/sources/simulator/VSSimulator.java
@@ -17,7 +17,7 @@ import prefs.editors.*;
import protocols.*;
import utils.*;
-public class VSSimulation extends JPanel {
+public class VSSimulator extends JPanel {
private ArrayList<String> globalTextFields;
private ArrayList<String> localTextFields;
private ArrayList<VSCreateTask> createTasks;
@@ -44,7 +44,7 @@ public class VSSimulation extends JPanel {
private VSLogging logging;
private VSMenuItemStates menuItemStates;
private VSPrefs prefs;
- private VSSimulationCanvas simulationCanvas;
+ private VSSimulatorCanvas simulationCanvas;
private VSSimulatorFrame simulatorFrame;
private VSTaskManager taskManager;
private VSTaskManagerTableModel taskManagerGlobalModel;
@@ -100,7 +100,7 @@ public class VSSimulation extends JPanel {
}
}
- public VSSimulation(VSPrefs prefs, VSSimulatorFrame simulatorFrame) {
+ public VSSimulator(VSPrefs prefs, VSSimulatorFrame simulatorFrame) {
this.prefs = prefs;
this.simulatorFrame = simulatorFrame;
this.logging = new VSLogging();
@@ -141,7 +141,7 @@ public class VSSimulation extends JPanel {
splitPaneH = new JSplitPane();
splitPaneV = new JSplitPane();
- simulationCanvas = new VSSimulationCanvas(prefs, this, logging);
+ simulationCanvas = new VSSimulatorCanvas(prefs, this, logging);
taskManager = simulationCanvas.getTaskManager();
logging.setSimulationCanvas(simulationCanvas);
@@ -863,11 +863,11 @@ public class VSSimulation extends JPanel {
return simulationNum;
}
- public VSSimulation.VSMenuItemStates getMenuItemStates() {
+ public VSSimulator.VSMenuItemStates getMenuItemStates() {
return menuItemStates;
}
- public VSSimulationCanvas getSimulationCanvas() {
+ public VSSimulatorCanvas getSimulationCanvas() {
return simulationCanvas;
}
@@ -881,12 +881,35 @@ public class VSSimulation extends JPanel {
}
public void removeProcessAtIndex(int index) {
+ if (lastSelectedProcessNum >= index)
+ --lastSelectedProcessNum;
+ if (lastSelectedProcessNum < 0)
+ lastSelectedProcessNum = 0;
+
+ globalTextFields.remove(index);
+ localTextFields.remove(index);
+
globalPIDComboBox.removeItemAt(index);
localPIDComboBox.removeItemAt(index);
+
processesComboBox.removeItemAt(index);
simulatorFrame.updateEditMenu();
}
+ public void addProcessAtIndex(int index) {
+ int processID = simulationCanvas.getProcess(index).getProcessID();
+ String processString = prefs.getString("lang.process");
+
+ localTextFields.add(index, "0000");
+ globalTextFields.add(index, "0000");
+
+ localPIDComboBox.insertItemAt("PID: " + processID, index);
+ globalPIDComboBox.insertItemAt("PID: " + processID, index);
+
+ processesComboBox.insertItemAt(processString + " " + processID, index);
+ simulatorFrame.updateEditMenu();
+ }
+
public void fireExpertModeChanged() {
boolean expertMode = prefs.getBoolean("sim.mode.expert");
diff --git a/sources/simulator/VSSimulationCanvas.java b/sources/simulator/VSSimulatorCanvas.java
index 8444785..6e24270 100644
--- a/sources/simulator/VSSimulationCanvas.java
+++ b/sources/simulator/VSSimulatorCanvas.java
@@ -16,9 +16,9 @@ import prefs.*;
import prefs.editors.*;
import utils.*;
-public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionListener, MouseListener, HierarchyBoundsListener {
+public class VSSimulatorCanvas extends Canvas implements Runnable, MouseMotionListener, MouseListener, HierarchyBoundsListener {
private VSProcess highlightedProcess;
- private VSSimulation simulation;
+ private VSSimulator simulation;
private VSPrefs prefs;
private VSLogging logging;
private volatile int numProcesses;
@@ -65,7 +65,9 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
private Color messageArrivedColor;
private Color messageSendingColor;
private Color messageLostColor;
+ private Color backgroundColor;
+ private long messageLineCounter;
private class VSMessageLine {
private VSProcess receiverProcess;
private Color color;
@@ -85,8 +87,10 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
private double y;
private long outageTime;
private long z;
+ private long messageLineNum;
+ private VSTask task;
- public VSMessageLine(VSProcess receiverProcess, long sendTime, long recvTime, long outageTime, int senderNum , int receiverNum) {
+ public VSMessageLine(VSProcess receiverProcess, long sendTime, long recvTime, long outageTime, int senderNum , int receiverNum, VSTask task) {
this.receiverProcess = receiverProcess;
this.sendTime = sendTime;
this.recvTime = recvTime;
@@ -95,6 +99,8 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
this.receiverNum = receiverNum;
this.isArrived = false;
this.isLost = false;
+ this.messageLineNum = ++messageLineCounter;
+ this.task = task;
if (senderNum > receiverNum) {
//offset1 = 1;
@@ -106,7 +112,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
/* Needed if the message gets lost after 0ms */
this.x = getTimeXPosition(sendTime);
- this.y = getProcessYPosition(senderNum) + offset1;
+ this.y = getProcessYPosition(senderNum+1) + offset1;
recalcOnChange();
paint();
@@ -114,9 +120,9 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
public void recalcOnChange() {
x1 = getTimeXPosition(sendTime);
- y1 = getProcessYPosition(senderNum) + offset1;
+ y1 = getProcessYPosition(senderNum+1) + offset1;
x2 = getTimeXPosition(recvTime);
- y2 = getProcessYPosition(receiverNum) + offset2;
+ y2 = getProcessYPosition(receiverNum+1) + offset2;
if (isLost) {
x = getTimeXPosition(z);
@@ -154,9 +160,36 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
g.drawLine((int) x1, (int) y1, (int) x, (int) y);
}
}
+
+ public boolean removeProcessAtIndex(int index) {
+ if (index == receiverNum || index == senderNum)
+ return true;
+
+ if (index < receiverNum)
+ --receiverNum;
+
+ if (index < senderNum)
+ --senderNum;
+
+ recalcOnChange();
+
+ return false;
+ }
+
+ public long getMessageLineNum() {
+ return messageLineNum;
+ }
+
+ public boolean equals(VSMessageLine line) {
+ return messageLineNum == line.getMessageLineNum();
+ }
+
+ public VSTask getTask() {
+ return task;
+ }
}
- public VSSimulationCanvas(VSPrefs prefs, VSSimulation simulation, VSLogging logging) {
+ public VSSimulatorCanvas(VSPrefs prefs, VSSimulator simulation, VSLogging logging) {
this.prefs = prefs;
this.simulation = simulation;
this.logging = logging;
@@ -169,7 +202,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
VSProcess.resetProcessCounter();
for (int i = 0; i < numProcesses; ++i)
- addProcess();
+ processes.add(createProcess(i));
addMouseListener(this);
addMouseMotionListener(this);
@@ -199,6 +232,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
messageArrivedColor = prefs.getColor("col.message.arrived");
messageSendingColor = prefs.getColor("col.message.sending");
messageLostColor = prefs.getColor("col.message.lost");
+ backgroundColor = prefs.getColor("col.background");
paintSize = simulation.getPaintSize();
xPaintSize = simulation.getWidth() - (3 * XOFFSET + simulation.getSplitSize());
@@ -235,21 +269,13 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
if (strategy != null) {
synchronized (strategy) {
g = (Graphics2D) strategy.getDrawGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(backgroundColor);
if (isAntiAliased)
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
}
}
- public VSProcess addProcess() {
- VSProcess process = new VSProcess(prefs, this, logging);
- processes.add(process);
- logging.logg(prefs.getString("lang.process.new") + "; " + process);
-
- return process;
- }
-
private void updateSimulation(final long globalTime, final long lastGlobalTime) {
if (isPaused || isFinished)
return;
@@ -285,7 +311,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
if (strategy != null) {
g = (Graphics2D) strategy.getDrawGraphics();
- g.setColor(Color.WHITE);
+ g.setColor(backgroundColor);
}
}
@@ -311,7 +337,7 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
line.draw(g, globalTime);
}
- g.setColor(Color.WHITE);
+ g.setColor(backgroundColor);
strategy.show();
}
@@ -696,8 +722,8 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
synchronized (messageLines) {
messageLines.add(
new VSMessageLine(receiverProcess, sendingProcess.getGlobalTime(),
- deliverTime, outageTime, sendingProcess.getProcessID(),
- receiverProcess.getProcessID()));
+ deliverTime, outageTime, sendingProcess.getProcessNum(),
+ receiverProcess.getProcessNum(), task));
}
}
}
@@ -707,9 +733,6 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
public void mouseClicked(MouseEvent me) {
final VSProcess process = getProcessAtYPos(me.getY());
- if (process == null)
- return;
-
if (SwingUtilities.isRightMouseButton(me)) {
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
@@ -719,16 +742,17 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
} else if (actionCommand.equals(prefs.getString("lang.process.crash"))) {
VSEvent event = new ProcessCrashEvent();
- //event.init(process);
taskManager.addTask(new VSTask(process.getGlobalTime(), process, event, VSTask.GLOBAL));
} else if (actionCommand.equals(prefs.getString("lang.process.recover"))) {
VSEvent event = new ProcessRecoverEvent();
- //event.init(process);
taskManager.addTask(new VSTask(process.getGlobalTime(), process, event, VSTask.GLOBAL));
} else if (actionCommand.equals(prefs.getString("lang.process.remove"))) {
removeProcess(process);
+
+ } else if (actionCommand.equals(prefs.getString("lang.process.add.new"))) {
+ addProcess();
}
}
};
@@ -736,29 +760,40 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
JPopupMenu popup = new JPopupMenu();
JMenuItem item = new JMenuItem(prefs.getString("lang.process.edit"));
- item.addActionListener(actionListener);
+ if (process == null)
+ item.setEnabled(false);
+ else
+ item.addActionListener(actionListener);
popup.add(item);
item = new JMenuItem(prefs.getString("lang.process.crash"));
- if (process.isCrashed() || isPaused || time == 0 || isFinished)
+ if (process == null || process.isCrashed() || isPaused || time == 0 || isFinished)
item.setEnabled(false);
else
item.addActionListener(actionListener);
popup.add(item);
item = new JMenuItem(prefs.getString("lang.process.recover"));
- if (!process.isCrashed() || isPaused || time == 0 || isFinished)
+ if (process == null || !process.isCrashed() || isPaused || time == 0 || isFinished)
item.setEnabled(false);
else
item.addActionListener(actionListener);
popup.add(item);
item = new JMenuItem(prefs.getString("lang.process.remove"));
- item.addActionListener(actionListener);
+ if (process == null)
+ item.setEnabled(false);
+ else
+ item.addActionListener(actionListener);
popup.add(item);
popup.addSeparator();
+ item = new JMenuItem(prefs.getString("lang.process.add.new"));
+ item.addActionListener(actionListener);
+ popup.add(item);
+
+
popup.show(me.getComponent(), me.getX(), me.getY());
} else {
@@ -860,16 +895,55 @@ public class VSSimulationCanvas extends Canvas implements Runnable, MouseMotionL
recalcOnChange();
}
- public void removeProcess(VSProcess process) {
+ private void removeProcess(VSProcess process) {
if (numProcesses == 1) {
simulation.getSimulatorFrame().removeSimulation(simulation);
} else {
int index = processes.indexOf(process);
processes.remove(index);
+ synchronized (processes) {
+ for (VSProcess p : processes) {
+ p.removeProcessAtIndex(index);
+ }
+ }
numProcesses = processes.size();
- recalcOnChange();
simulation.removeProcessAtIndex(index);
+ recalcOnChange();
+
+ ArrayList<VSMessageLine> removeThose = new ArrayList<VSMessageLine>();
+ synchronized (messageLines) {
+ for (VSMessageLine line : messageLines)
+ if (line.removeProcessAtIndex(index))
+ removeThose.add(line);
+ for (VSMessageLine line : removeThose) {
+ VSTask deliverTask = line.getTask();
+ if (deliverTask != null)
+ taskManager.removeTask(deliverTask);
+ messageLines.remove(line);
+ }
+ }
+
+ taskManager.removeTasksOf(process);
}
}
+
+ private VSProcess createProcess(int processNum) {
+ VSProcess process = new VSProcess(prefs, processNum, this, logging);
+ logging.logg(prefs.getString("lang.process.new") + "; " + process);
+ return process;
+ }
+
+ private void addProcess() {
+ numProcesses = processes.size() + 1;
+ VSProcess newProcess = createProcess(processes.size());
+ processes.add(newProcess);
+ synchronized (processes) {
+ for (VSProcess process : processes)
+ if (!process.equals(newProcess))
+ process.addedAProcess();
+ }
+ recalcOnChange();
+ simulation.addProcessAtIndex(processes.size()-1);
+ }
}
diff --git a/sources/simulator/VSSimulatorFrame.java b/sources/simulator/VSSimulatorFrame.java
index c4abdb3..e4e0d18 100644
--- a/sources/simulator/VSSimulatorFrame.java
+++ b/sources/simulator/VSSimulatorFrame.java
@@ -30,15 +30,15 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
private JMenu menuSimulation;
private JToolBar toolBar;
private VSPrefs prefs;
- private Vector<VSSimulation> simulations;
- private VSSimulation currentSimulation;
+ private Vector<VSSimulator> simulations;
+ private VSSimulator currentSimulation;
private JTabbedPane tabbedPane;
//private JSlider speedSlider;
public VSSimulatorFrame(VSPrefs prefs, Component relativeTo) {
super(prefs.getString("lang.name"), relativeTo);
this.prefs = prefs;
- this.simulations = new Vector<VSSimulation>();
+ this.simulations = new Vector<VSSimulator>();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
@@ -172,7 +172,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
tabbedPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent ce) {
JTabbedPane pane = (JTabbedPane) ce.getSource();
- currentSimulation = (VSSimulation) pane.getSelectedComponent();
+ currentSimulation = (VSSimulator) pane.getSelectedComponent();
currentSimulation.getSimulationCanvas().paint();
updateEditMenu();
updateSimulationMenu();
@@ -192,13 +192,14 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
globalPrefsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
VSPrefs simulationPrefs = currentSimulation.getPrefs();
- VSSimulationEditor.TAKEOVER_BUTTON = true;
- VSSimulationEditor simulationEditor = new VSSimulationEditor(
+ VSSimulatorEditor.TAKEOVER_BUTTON = true;
+ VSSimulatorEditor simulationEditor = new VSSimulatorEditor(
simulationPrefs, VSSimulatorFrame.this, currentSimulation);
new VSEditorFrame(prefs, VSSimulatorFrame.this, simulationEditor);
}
});
menuEdit.add(globalPrefsItem);
+ menuEdit.addSeparator();
if (currentSimulation == null)
return;
@@ -211,8 +212,9 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
for (VSProcess process : arr) {
int processID = process.getProcessID();
JMenuItem processItem = new JMenuItem(processString + " " + processID);
- processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+processID,
- ActionEvent.ALT_MASK));
+ if (processNum < 10)
+ processItem.setAccelerator(KeyStroke.getKeyStroke(0x31+processNum,
+ ActionEvent.ALT_MASK));
final int finalProcessNum = processNum++;
processItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
@@ -225,7 +227,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
/* updateSimulationMenu can be called from concurrent threads */
public synchronized void updateSimulationMenu() {
- VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ VSSimulator.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
pauseItem.setEnabled(menuItemState.getPause());
replayItem.setEnabled(menuItemState.getReplay());
@@ -240,7 +242,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
public void dispose() {
synchronized (simulations) {
- for (VSSimulation simulation : simulations)
+ for (VSSimulator simulation : simulations)
simulation.getSimulationCanvas().stopThread();
}
super.dispose();
@@ -260,7 +262,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
} else if (sourceText.equals(prefs.getString("lang.simulation.new"))) {
VSPrefs newPrefs = VSDefaultPrefs.init();
- new VSEditorFrame(newPrefs, this, new VSSimulationEditor(newPrefs, this));
+ new VSEditorFrame(newPrefs, this, new VSSimulatorEditor(newPrefs, this));
} else if (sourceText.equals(prefs.getString("lang.window.new"))) {
new VSMain(VSDefaultPrefs.init(), this);
@@ -275,7 +277,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
System.exit(0);
} else if (sourceText.equals(prefs.getString("lang.start"))) {
- VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ VSSimulator.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
menuItemState.setStart(false);
menuItemState.setPause(true);
menuItemState.setReset(false);
@@ -284,7 +286,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
updateSimulationMenu();
} else if (sourceText.equals(prefs.getString("lang.pause"))) {
- VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ VSSimulator.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
menuItemState.setStart(true);
menuItemState.setPause(false);
menuItemState.setReset(true);
@@ -293,7 +295,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
updateSimulationMenu();
} else if (sourceText.equals(prefs.getString("lang.reset"))) {
- VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ VSSimulator.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
menuItemState.setStart(true);
menuItemState.setPause(false);
menuItemState.setReset(false);
@@ -302,7 +304,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
updateSimulationMenu();
} else if (sourceText.equals(prefs.getString("lang.replay"))) {
- VSSimulation.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
+ VSSimulator.VSMenuItemStates menuItemState = currentSimulation.getMenuItemStates();
menuItemState.setStart(false);
menuItemState.setPause(true);
menuItemState.setReset(false);
@@ -313,7 +315,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
}
}
- public void addSimulation(VSSimulation simulation) {
+ public void addSimulation(VSSimulator simulation) {
simulation.setLayout(new GridLayout(1, 1, 3, 3));
simulation.setMinimumSize(new Dimension(0, 0));
simulation.setMaximumSize(new Dimension(0, 0));
@@ -330,7 +332,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
}
}
- public void removeSimulation(VSSimulation simulationToRemove) {
+ public void removeSimulation(VSSimulator simulationToRemove) {
if (simulations.size() == 1) {
dispose();
@@ -345,7 +347,7 @@ public class VSSimulatorFrame extends VSFrame implements ActionListener {
removeSimulation(currentSimulation);
}
- public VSSimulation getCurrentSimulation() {
+ public VSSimulator getCurrentSimulation() {
return currentSimulation;
}