1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.gui.windows;
11
12 import java.awt.BorderLayout;
13 import java.awt.Dimension;
14 import java.awt.Graphics;
15
16 import javax.swing.BorderFactory;
17 import javax.swing.JFrame;
18 import javax.swing.JPanel;
19 import javax.swing.JScrollPane;
20 import javax.swing.JTable;
21 import javax.swing.WindowConstants;
22 import javax.swing.table.DefaultTableModel;
23 import javax.swing.table.TableModel;
24
25 import nl.tudelft.simulation.dsol.eventlists.TableModelEventList;
26 import nl.tudelft.simulation.dsol.experiment.Experiment;
27 import nl.tudelft.simulation.dsol.gui.DSOLApplicationInterface;
28 import nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface;
29 import nl.tudelft.simulation.event.Event;
30 import nl.tudelft.simulation.event.EventInterface;
31 import nl.tudelft.simulation.event.EventListenerInterface;
32 import nl.tudelft.simulation.logger.Logger;
33
34 /***
35 * The EventlistFrame <br>
36 * (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft
37 * University of Technology </a>, the Netherlands. <br>
38 * See for project information <a
39 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
40 * License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser
41 * General Public License (LGPL) </a>, no warranty.
42 *
43 * @version $Revision$ $Date$
44 * @author <a href="http://www.tbm.tudelft.nl/webstaf/peterja">Peter Jacobs </a>
45 */
46 public class EventlistFrame extends JFrame implements EventListenerInterface
47 {
48 /*** the application */
49 private DSOLApplicationInterface application = null;
50
51 /*** the currently active simulator */
52 private DEVSSimulatorInterface simulator = null;
53
54 /*** the table */
55 private SynchronizedJTable table = new SynchronizedJTable(
56 new DefaultTableModel(TableModelEventList.HEADER, 0));
57
58 /***
59 * constructs a new ContextFrame
60 *
61 * @param application the application to see
62 */
63 public EventlistFrame(final DSOLApplicationInterface application)
64 {
65 super("Eventlist");
66 this.application = application;
67 this.initialize();
68 try
69 {
70 this.application.addListener(this,
71 DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT);
72 this.notify(new Event(
73 DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT,
74 this.application, this.application.getExperiment()));
75 } catch (Exception exception)
76 {
77 Logger.warning(this, "EventlistFrame", exception);
78 }
79
80 this.pack();
81 this.setVisible(true);
82 this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
83 }
84
85 /***
86 * @see java.awt.Window#dispose()
87 */
88 public void dispose()
89 {
90 try
91 {
92 if (this.simulator != null
93 && this.simulator.getEventList() instanceof TableModelEventList)
94 {
95 boolean stopped = false;
96 if (this.simulator.isRunning())
97 {
98 stopped = true;
99 this.simulator.stop();
100 }
101 synchronized (this.simulator)
102 {
103 this.simulator.removeListener(this,
104 DEVSSimulatorInterface.EVENTLIST_CHANGED_EVENT);
105 this.undoSwapEventList();
106 if (stopped)
107 {
108 this.simulator.start();
109 }
110 }
111 }
112 } catch (Exception exception)
113 {
114 Logger.warning(this, "dispose", exception);
115 }
116 super.dispose();
117 }
118
119 /***
120 * initializes the contextframe
121 */
122 private void initialize()
123 {
124 JPanel panel = new JPanel(new BorderLayout());
125 panel.setBorder(BorderFactory.createEtchedBorder());
126 panel.add(new JScrollPane(this.table), BorderLayout.CENTER);
127 panel.setPreferredSize(new Dimension(700, 300));
128 this.setContentPane(panel);
129 }
130
131 /***
132 * @see nl.tudelft.simulation.event.EventListenerInterface
133 * #notify(nl.tudelft.simulation.event.EventInterface)
134 */
135 public void notify(final EventInterface event)
136 {
137 try
138 {
139 if (event.getSource().equals(this.application)
140 && event.getType().equals(
141 DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT))
142 {
143 if (event.getContent() != null)
144 {
145 Experiment experiment = (Experiment) event.getContent();
146 experiment.addListener(this,
147 Experiment.SIMULATOR_CHANGED_EVENT);
148 this.notify(new Event(Experiment.SIMULATOR_CHANGED_EVENT,
149 experiment, experiment.getSimulator()));
150 }
151 return;
152 }
153 if (event.getSource() instanceof Experiment
154 && event.getType().equals(
155 Experiment.SIMULATOR_CHANGED_EVENT))
156 {
157 if (event.getContent() != null
158 && event.getContent() instanceof DEVSSimulatorInterface)
159 {
160 this.simulator = (DEVSSimulatorInterface) event
161 .getContent();
162 this.simulator.addListener(this,
163 DEVSSimulatorInterface.EVENTLIST_CHANGED_EVENT);
164 this.notify(new Event(
165 DEVSSimulatorInterface.EVENTLIST_CHANGED_EVENT,
166 this.simulator, this.simulator.getEventList()));
167 }
168 }
169 if (event.getSource().equals(this.simulator)
170 && event.getType().equals(
171 DEVSSimulatorInterface.EVENTLIST_CHANGED_EVENT))
172 {
173 if (!(this.simulator.getEventList() instanceof TableModelEventList))
174 {
175 this.swapEventList();
176 } else
177 {
178 this.table.setModel(((TableModelEventList) this.simulator
179 .getEventList()).getTableModel());
180 }
181 }
182 return;
183 } catch (Exception exception)
184 {
185 Logger.warning(this, "dispose", exception);
186 }
187 }
188
189 /***
190 * undoes the eventlistSwap
191 *
192 * @throws Exception on failure
193 */
194 private void undoSwapEventList() throws Exception
195 {
196 if (this.simulator != null)
197 {
198 boolean stopped = false;
199 if (this.simulator.isRunning())
200 {
201 stopped = true;
202 this.simulator.stop();
203 }
204 synchronized (this.simulator)
205 {
206 if (this.simulator.getEventList() instanceof TableModelEventList)
207 {
208 this.simulator
209 .setEventList(((TableModelEventList) this.simulator
210 .getEventList()).getOrigin());
211 }
212 this.table.setModel(new DefaultTableModel(
213 TableModelEventList.HEADER, 0));
214 if (stopped)
215 {
216 this.simulator.start();
217 }
218 }
219 }
220 }
221
222 /***
223 * swaps the eventList
224 *
225 * @throws Exception on exception
226 */
227 private void swapEventList() throws Exception
228 {
229 if (this.simulator != null)
230 {
231 boolean stopped = false;
232 if (this.simulator.isRunning())
233 {
234 stopped = true;
235 this.simulator.stop();
236 }
237 synchronized (this.simulator)
238 {
239 TableModelEventList eventList = null;
240 synchronized (this.simulator)
241 {
242 eventList = new TableModelEventList(this.simulator
243 .getEventList());
244 this.simulator.setEventList(eventList);
245 }
246 this.table.setModel(eventList.getTableModel());
247 if (stopped)
248 {
249 this.simulator.start();
250 }
251 }
252 }
253 }
254
255 /***
256 * Synchronizes the tableModel when updating
257 */
258 private static class SynchronizedJTable extends JTable
259 {
260 /***
261 * constructs a new SynchronizedJTable
262 *
263 * @param dm the tablemodel
264 */
265 public SynchronizedJTable(final TableModel dm)
266 {
267 super(dm);
268 }
269
270 /***
271 * @see java.awt.Component#paint(java.awt.Graphics)
272 */
273 public void paint(final Graphics g)
274 {
275 synchronized (this.getModel())
276 {
277 super.paint(g);
278 }
279 }
280
281 /***
282 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
283 */
284 protected void paintComponent(final Graphics g)
285 {
286 synchronized (this.getModel())
287 {
288 super.paintComponent(g);
289 }
290 }
291 }
292 }