View Javadoc

1   /*
2    * @(#) ControlPanel.java Oct 14, 2003
3    * 
4    * Copyright (c) 2002-2005 Delft University of Technology Jaffalaan 5, 2628 BX
5    * Delft, the Netherlands. All rights reserved.
6    * 
7    * This software is proprietary information of Delft University of Technology
8    * The code is published under the Lesser General Public License
9    */
10  package nl.tudelft.simulation.dsol.gui.panels;
11  
12  import java.awt.BorderLayout;
13  import java.awt.Font;
14  import java.awt.event.ActionEvent;
15  import java.awt.event.ActionListener;
16  import java.rmi.RemoteException;
17  import java.text.NumberFormat;
18  
19  import javax.swing.BorderFactory;
20  import javax.swing.BoxLayout;
21  import javax.swing.JPanel;
22  import javax.swing.JTextField;
23  
24  import nl.tudelft.simulation.dsol.experiment.Experiment;
25  import nl.tudelft.simulation.dsol.experiment.TimeUnitInterface;
26  import nl.tudelft.simulation.dsol.gui.DSOLApplicationInterface;
27  import nl.tudelft.simulation.dsol.gui.actions.AnimationDelaySlider;
28  import nl.tudelft.simulation.dsol.simulators.AnimatorInterface;
29  import nl.tudelft.simulation.dsol.simulators.DESSSimulatorInterface;
30  import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
31  import nl.tudelft.simulation.event.Event;
32  import nl.tudelft.simulation.event.EventInterface;
33  import nl.tudelft.simulation.event.EventListenerInterface;
34  import nl.tudelft.simulation.logger.Logger;
35  
36  /***
37   * A ControlPanel <br>
38   * (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft
39   * University of Technology </a>, the Netherlands. <br>
40   * See for project information <a
41   * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
42   * License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser
43   * General Public License (LGPL) </a>, no warranty.
44   * 
45   * @version $Revision: 1.4 $ $Date: 2005/01/13 16:28:55 $
46   * @author <a href="http://www.tbm.tudelft.nl/webstaf/peterja">Peter Jacobs </a>
47   */
48  public class ControlPanel extends JPanel implements EventListenerInterface
49  {
50  	/*** the timeStepSlider */
51  	// private TimeStepSlider timeStepSlider;
52  	/*** the animationDelaySlider */
53  	private AnimationDelaySlider animationDelaySlider;
54  
55  	/*** the animationDelayTextField */
56  	private JTextField animationDelayTextField = null;
57  
58  	/*** the timeSteptextField */
59  	protected JTextField timeStepTextField = null;
60  
61  	/*** timeStepPanel */
62  	private JPanel timeStepPanel = new JPanel();
63  
64  	/*** the animationDelayFormatter */
65  	private NumberFormat animationDelayFormatter = NumberFormat.getInstance();
66  
67  	/*** the DSOLApplication */
68  	protected DSOLApplicationInterface application = null;
69  
70  	/***
71  	 * constructs a new ControlPanel
72  	 * 
73  	 * @param application the application
74  	 */
75  	public ControlPanel(final DSOLApplicationInterface application)
76  	{
77  		super();
78  		this.application = application;
79  		this.animationDelayFormatter.setMinimumFractionDigits(0);
80  		this.animationDelayFormatter.setMaximumFractionDigits(0);
81  		this.initialize();
82  		try
83  		{
84  			this.application.addListener(this,
85  					DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT);
86  			this.notify(new Event(
87  					DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT,
88  					this.application, this.application.getExperiment()));
89  		} catch (RemoteException exception)
90  		{
91  			Logger.warning(this, "ControlPanel", exception);
92  		}
93  	}
94  
95  	/***
96  	 * initializes the console
97  	 */
98  	private void initialize()
99  	{
100 		this.setLayout(new BorderLayout());
101 		this.setBorder(BorderFactory.createEmptyBorder());
102 
103 		JPanel content = new JPanel();
104 		content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
105 		content.setBorder(BorderFactory.createEmptyBorder());
106 
107 		this.timeStepPanel.setLayout(new BorderLayout());
108 
109 		String title = TimeUnitInterface.UNIT.toString();
110 		this.timeStepPanel.setBorder(BorderFactory
111 				.createTitledBorder("time step ( " + title
112 						+ " on simulation clock )"));
113 
114 		JTextField timeSteplabel = new JTextField("time step:  ");
115 		this.timeStepPanel.add(timeSteplabel, BorderLayout.WEST);
116 
117 		this.timeStepTextField = new JTextField();
118 		this.timeStepTextField.setEditable(true);
119 		Font font = this.timeStepTextField.getFont().deriveFont(Font.BOLD);
120 		this.timeStepTextField.setFont(font);
121 		this.timeStepTextField.addActionListener(new ActionListener()
122 		{
123 			public void actionPerformed(final ActionEvent e)
124 			{
125 				DESSSimulatorInterface simulator = (DESSSimulatorInterface) ControlPanel.this.application
126 						.getExperiment().getSimulator();
127 				try
128 				{
129 					double value = new Double(e.getActionCommand())
130 							.doubleValue();
131 					if (value <= 0)
132 					{
133 						throw new NumberFormatException("timeStep value <=0");
134 					}
135 					simulator.setTimeStep(value);
136 				} catch (Exception numberFormatException)
137 				{
138 					Logger.warning(this, "timeStepEditor",
139 							numberFormatException);
140 
141 					double value = DESSSimulatorInterface.DEFAULT_TIME_STEP;
142 					try
143 					{
144 						value = simulator.getTimeStep();
145 					} catch (RemoteException e1)
146 					{
147 						Logger.warning(this, "nonsense", e1);
148 					}
149 					ControlPanel.this.timeStepTextField.setText(value + "");
150 				}
151 			}
152 		});
153 		this.timeStepTextField.setBorder(BorderFactory.createEmptyBorder());
154 		this.timeStepPanel.add(this.timeStepTextField, BorderLayout.CENTER);
155 
156 		content.add(this.timeStepPanel);
157 
158 		JPanel animationDelayPanel = new JPanel();
159 		animationDelayPanel.setLayout(new BorderLayout());
160 		animationDelayPanel
161 				.setBorder(BorderFactory
162 						.createTitledBorder("animation delay ( milliseconds on wall clock ) "));
163 
164 		this.animationDelaySlider = new AnimationDelaySlider(this.application);
165 		this.animationDelaySlider.setName("animationDelaySlider");
166 		this.animationDelaySlider.setBorder(BorderFactory.createEmptyBorder(0,
167 				10, 0, 10));
168 
169 		animationDelayPanel.add(this.animationDelaySlider, BorderLayout.CENTER);
170 
171 		this.animationDelayTextField = new JTextField();
172 		this.animationDelayTextField.setEditable(false);
173 		this.animationDelayTextField.setBorder(BorderFactory
174 				.createEmptyBorder());
175 		animationDelayPanel
176 				.add(this.animationDelayTextField, BorderLayout.EAST);
177 
178 		try
179 		{
180 			this.timeStepTextField
181 					.setText(DESSSimulatorInterface.DEFAULT_TIME_STEP + "");
182 			this.animationDelayTextField.setText(this.animationDelayFormatter
183 					.format(AnimatorInterface.DEFAULT_ANIMATION_DELAY));
184 			this.animationDelaySlider.setValue((int) Math.round((Math
185 					.log(AnimatorInterface.DEFAULT_ANIMATION_DELAY) / Math
186 					.log(10)) * 1000));
187 		} catch (Exception exception)
188 		{
189 			Logger.warning(this, "initialize", exception);
190 		}
191 		content.add(animationDelayPanel);
192 		this.add(content);
193 	}
194 
195 	/***
196 	 * @see nl.tudelft.simulation.event.EventListenerInterface
197 	 *      #notify(nl.tudelft.simulation.event.EventInterface)
198 	 */
199 	public void notify(final EventInterface event) throws RemoteException
200 	{
201 		if (event.getType().equals(
202 				DSOLApplicationInterface.EXPERIMENT_CHANGED_EVENT)
203 				&& event.getSource() instanceof DSOLApplicationInterface)
204 		{
205 			if (event.getContent() != null)
206 			{
207 				Experiment experiment = (Experiment) event.getContent();
208 				experiment
209 						.addListener(this, Experiment.SIMULATOR_CHANGED_EVENT);
210 				this.notify(new Event(Experiment.SIMULATOR_CHANGED_EVENT,
211 						experiment, experiment.getSimulator()));
212 
213 			}
214 			return;
215 		}
216 		if (event.getType().equals(Experiment.SIMULATOR_CHANGED_EVENT)
217 				&& event.getSource() instanceof Experiment)
218 		{
219 			if (event.getContent() != null)
220 			{
221 				AnimatorInterface simulator = (AnimatorInterface) event
222 						.getContent();
223 				simulator.addListener(this,
224 						AnimatorInterface.ANIMATION_DELAY_CHANGED_EVENT);
225 				simulator.addListener(this,
226 						DESSSimulatorInterface.TIME_STEP_CHANGED_EVENT);
227 				simulator.addListener(this,
228 						SimulatorInterface.START_REPLICATION_EVENT);
229 				this.notify(new Event(
230 						AnimatorInterface.ANIMATION_DELAY_CHANGED_EVENT,
231 						simulator, new Long(simulator.getAnimationDelay())));
232 				this.notify(new Event(
233 						SimulatorInterface.START_REPLICATION_EVENT, simulator,
234 						null));
235 				this.notify(new Event(
236 						DESSSimulatorInterface.TIME_STEP_CHANGED_EVENT,
237 						simulator, new Double(simulator.getTimeStep())));
238 			}
239 			return;
240 		}
241 		if (event.getSource() instanceof SimulatorInterface
242 				&& event.getType().equals(
243 						SimulatorInterface.START_REPLICATION_EVENT))
244 		{
245 			SimulatorInterface simulator = (SimulatorInterface) event
246 					.getSource();
247 			if (simulator.getReplication() != null)
248 			{
249 				this.timeStepPanel
250 						.setBorder(BorderFactory
251 								.createTitledBorder("time step ( "
252 										+ simulator.getReplication()
253 												.getRunControl().getTreatment()
254 												.getTimeUnit().toString()
255 										+ " on simulation clock )"));
256 				this.validate();
257 				this.repaint();
258 				return;
259 			}
260 		}
261 		if (event.getSource() instanceof AnimatorInterface)
262 		{
263 			if (event.getType().equals(
264 					AnimatorInterface.ANIMATION_DELAY_CHANGED_EVENT))
265 			{
266 				this.animationDelayTextField
267 						.setText(this.animationDelayFormatter
268 								.format(((Long) event.getContent()).longValue()));
269 			}
270 			if (event.getType().equals(
271 					DESSSimulatorInterface.TIME_STEP_CHANGED_EVENT))
272 			{
273 				this.timeStepTextField.setText(event.getContent().toString());
274 			}
275 			this.validate();
276 			this.repaint();
277 			return;
278 		}
279 	}
280 }