View Javadoc
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-2024 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;
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          AppearanceApplication.setDefaultFont();
63          
64          this.simulator = simulator;
65          this.otsModel = otsModel;
66  
67          this.setLayout(new BorderLayout());
68  
69          // Let's add our simulationControl
70          this.otsControlPanel = new OtsControlPanel(simulator, otsModel, (OtsAnimationPanel) this);
71          this.add(this.otsControlPanel, BorderLayout.NORTH);
72  
73          // Let's display our tabbed contentPane
74          this.tabbedPane = new AppearanceControlTabbedContentPane(SwingConstants.BOTTOM);
75          this.add(this.tabbedPane, BorderLayout.CENTER);
76  
77          // put a status bar at the bottom
78          // this.statusBar = new StatusBar(this.simulator);
79          // this.add(this.statusBar, BorderLayout.SOUTH);
80      }
81  
82      /**
83       * Adds the console tab.
84       */
85      public final void addConsoleTab()
86      {
87          // Let's add our console to our tabbed pane
88          JScrollPane cons = new JScrollPane(this.console);
89          cons.setBorder(null);
90          this.tabbedPane.addTab("console", cons);
91      }
92  
93      /**
94       * Adds the properties tab.
95       * @throws InputParameterException on exception with properties
96       */
97      public final void addPropertiesTab() throws InputParameterException
98      {
99          // TODO: make a tab with the InputParameters
100     }
101 
102     /**
103      * @return tabbedPane
104      */
105     public final TabbedContentPane getTabbedPane()
106     {
107         return this.tabbedPane;
108     }
109 
110     /**
111      * @return simulator.
112      */
113     public final OtsSimulatorInterface getSimulator()
114     {
115         return this.simulator;
116     }
117 
118     /**
119      * Return the OtsControlPanel of this OtsSimulationPanel.
120      * @return OtsControlPanel; the OTS control panel
121      */
122     public final OtsControlPanel getOtsControlPanel()
123     {
124         return this.otsControlPanel;
125     }
126 
127     /**
128      * @return console
129      */
130     public final ConsoleOutput getConsole()
131     {
132         return this.console;
133     }
134 
135     /**
136      * @return otsModel
137      */
138     public final OtsModelInterface getOtsModel()
139     {
140         return this.otsModel;
141     }
142 
143     /**
144      * Enable the simulation or animation buttons in the GUI. This method HAS TO BE CALLED in order for the buttons to be
145      * enabled, because the initial state is DISABLED. Typically, this is done after all tabs, statistics, and other user
146      * interface and model components have been constructed and initialized.
147      */
148     public void enableSimulationControlButtons()
149     {
150         getOtsControlPanel().setSimulationControlButtons(true);
151     }
152 
153     /**
154      * Disable the simulation or animation buttons in the GUI.
155      */
156     public void disableSimulationControlButtons()
157     {
158         getOtsControlPanel().setSimulationControlButtons(false);
159     }
160 
161     /** {@inheritDoc} */
162     @Override
163     public final String toString()
164     {
165         return "OtsSimulationPanel [simulatorTime=" + this.simulator.getSimulatorTime() + "]";
166     }
167 
168     /**
169      * TabbedContentPane which ignores appearance (it has too much colors looking ugly / becoming unreadable).
170      * <p>
171      * Copyright (c) 2013-2024 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
172      * <br>
173      * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
174      * </p>
175      * @author <a href="https://github.com/averbraeck">Alexander Verbraeck</a>
176      * @author <a href="https://tudelft.nl/staff/p.knoppers-1">Peter Knoppers</a>
177      * @author <a href="https://github.com/wjschakel">Wouter Schakel</a>
178      */
179     static class AppearanceControlTabbedContentPane extends TabbedContentPane implements AppearanceControl
180     {
181         /** */
182         private static final long serialVersionUID = 20180206L;
183 
184         /**
185          * @param tabPlacement int; tabPlacement
186          */
187         AppearanceControlTabbedContentPane(final int tabPlacement)
188         {
189             super(tabPlacement);
190         }
191 
192         /** {@inheritDoc} */
193         @Override
194         public String toString()
195         {
196             return "AppearanceControlTabbedContentPane []";
197         }
198 
199     }
200 
201 }