1 package org.opentrafficsim.swing.gui;
2
3 import java.awt.BorderLayout;
4 import java.awt.Insets;
5 import java.rmi.RemoteException;
6
7 import javax.swing.JPanel;
8 import javax.swing.JScrollPane;
9 import javax.swing.SwingConstants;
10 import javax.swing.UIManager;
11
12 import org.opentrafficsim.core.dsol.OtsModelInterface;
13 import org.opentrafficsim.core.dsol.OtsSimulatorInterface;
14
15 import nl.tudelft.simulation.dsol.model.inputparameters.InputParameterException;
16 import nl.tudelft.simulation.dsol.swing.gui.ConsoleOutput;
17 import nl.tudelft.simulation.dsol.swing.gui.TabbedContentPane;
18
19 /**
20 * GUI with simulator, console, control panel, status bar, etc.
21 * <p>
22 * Copyright (c) 2013-2023 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
23 * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
24 * </p>
25 * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
26 * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
27 */
28 public class OtsSimulationPanel extends JPanel
29 {
30 /** */
31 private static final long serialVersionUID = 20150617L;
32
33 /** The simulator. */
34 private final OtsSimulatorInterface simulator;
35
36 /** The console to log messages. */
37 private final ConsoleOutput console = new ConsoleOutput();
38
39 /** The control panel to control start/stop, speed of the simulation. */
40 private final OtsControlPanel otsControlPanel;
41
42 /** Animation, required to add properties tab. */
43 private final OtsModelInterface otsModel;
44
45 static
46 {
47 // use narrow border for TabbedPane, which cannot be changed afterwards
48 UIManager.put("TabbedPane.contentBorderInsets", new Insets(1, 1, 1, 1));
49 }
50
51 /** The tabbed pane that contains the different (default) screens. */
52 private final TabbedContentPane tabbedPane = new AppearanceControlTabbedContentPane(SwingConstants.BOTTOM);
53
54 /**
55 * Construct a panel that looks like the DSOLPanel for quick building of OTS applications.
56 * @param simulator OtsSimulatorInterface; the simulator or animator of the model.
57 * @param otsModel OtsModelInterface; the model with its properties.
58 * @throws RemoteException when communications to a remote machine fails
59 */
60 public OtsSimulationPanel(final OtsSimulatorInterface simulator, final OtsModelInterface otsModel) throws RemoteException
61 {
62 this.simulator = simulator;
63 this.otsModel = otsModel;
64
65 this.setLayout(new BorderLayout());
66
67 // Let's add our simulationControl
68 this.otsControlPanel = new OtsControlPanel(simulator, otsModel, (OtsAnimationPanel) this);
69 this.add(this.otsControlPanel, BorderLayout.NORTH);
70
71 // Let's display our tabbed contentPane
72 this.add(this.tabbedPane, BorderLayout.CENTER);
73
74 // put a status bar at the bottom
75 // this.statusBar = new StatusBar(this.simulator);
76 // this.add(this.statusBar, BorderLayout.SOUTH);
77 }
78
79 /**
80 * Adds the console tab.
81 */
82 public final void addConsoleTab()
83 {
84 // Let's add our console to our tabbed pane
85 JScrollPane cons = new JScrollPane(this.console);
86 cons.setBorder(null);
87 this.tabbedPane.addTab("console", cons);
88 }
89
90 /**
91 * Adds the properties tab.
92 * @throws InputParameterException on exception with properties
93 */
94 public final void addPropertiesTab() throws InputParameterException
95 {
96 // TODO: make a tab with the InputParameters
97 }
98
99 /**
100 * @return tabbedPane
101 */
102 public final TabbedContentPane getTabbedPane()
103 {
104 return this.tabbedPane;
105 }
106
107 /**
108 * @return simulator.
109 */
110 public final OtsSimulatorInterface getSimulator()
111 {
112 return this.simulator;
113 }
114
115 /**
116 * Return the OtsControlPanel of this OtsSimulationPanel.
117 * @return OtsControlPanel; the OTS control panel
118 */
119 public final OtsControlPanel getOtsControlPanel()
120 {
121 return this.otsControlPanel;
122 }
123
124 /**
125 * @return console
126 */
127 public final ConsoleOutput getConsole()
128 {
129 return this.console;
130 }
131
132 /**
133 * @return otsModel
134 */
135 public final OtsModelInterface getOtsModel()
136 {
137 return this.otsModel;
138 }
139
140 /**
141 * Enable the simulation or animation buttons in the GUI. This method HAS TO BE CALLED in order for the buttons to be
142 * enabled, because the initial state is DISABLED. Typically, this is done after all tabs, statistics, and other user
143 * interface and model components have been constructed and initialized.
144 */
145 public void enableSimulationControlButtons()
146 {
147 getOtsControlPanel().setSimulationControlButtons(true);
148 }
149
150 /**
151 * Disable the simulation or animation buttons in the GUI.
152 */
153 public void disableSimulationControlButtons()
154 {
155 getOtsControlPanel().setSimulationControlButtons(false);
156 }
157
158 /** {@inheritDoc} */
159 @Override
160 public final String toString()
161 {
162 return "OtsSimulationPanel [simulatorTime=" + this.simulator.getSimulatorTime() + "]";
163 }
164
165 /**
166 * TabbedContentPane which ignores appearance (it has too much colors looking ugly / becoming unreadable).
167 * <p>
168 * Copyright (c) 2013-2023 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
169 * <br>
170 * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
171 * </p>
172 * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
173 * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
174 * @author <a href="https://dittlab.tudelft.nl">Wouter Schakel</a>
175 */
176 static class AppearanceControlTabbedContentPane extends TabbedContentPane implements AppearanceControl
177 {
178 /** */
179 private static final long serialVersionUID = 20180206L;
180
181 /**
182 * @param tabPlacement int; tabPlacement
183 */
184 AppearanceControlTabbedContentPane(final int tabPlacement)
185 {
186 super(tabPlacement);
187 }
188
189 /** {@inheritDoc} */
190 @Override
191 public String toString()
192 {
193 return "AppearanceControlTabbedContentPane []";
194 }
195
196 }
197
198 }