001 package view;
002
003 import controller.ISimAdapter;
004
005 import javax.swing.*;
006 import javax.swing.event.ChangeEvent;
007 import javax.swing.event.ChangeListener;
008 import java.awt.*;
009 import java.awt.event.ActionEvent;
010 import java.awt.event.ActionListener;
011
012 /**
013 * Toolbar for simulation control.
014 *
015 * @author Mathias Ricken
016 */
017 public class SimToolbar extends JToolBar {
018 /// default value and range for speed slider
019 private static final int MIN_DELAY_MSECS = 10;
020 private static final int MAX_DELAY_MSECS = 1000;
021 private static final int INITIAL_DELAY = MIN_DELAY_MSECS + (MAX_DELAY_MSECS - MIN_DELAY_MSECS) / 2;
022
023 /**
024 * RunIdleAdapter.
025 */
026 IRunIdleAdapter _riAdapter;
027
028 /**
029 * Step button.
030 */
031 JButton _stepButton;
032
033 /**
034 * Run button.
035 */
036 JButton _runButton;
037
038 /**
039 * Stop button.
040 */
041 JButton _stopButton;
042
043 /**
044 * Speed slider.
045 */
046 JSlider _speedSlider;
047
048 /**
049 * Simulation adapter.
050 */
051 ISimAdapter _simAdapter;
052
053 /**
054 * Create a new SimToolbar and all its tools.
055 *
056 * @param sa simulation adapter
057 * @param ria run-idle adapter
058 */
059 public SimToolbar(ISimAdapter sa, IRunIdleAdapter ria) {
060 super(SwingConstants.VERTICAL);
061 setFloatable(false);
062 makeTools();
063 _riAdapter = ria;
064 _simAdapter = sa;
065 }
066
067 /**
068 * Create the UI components for the toolbar.
069 */
070 private void makeTools() {
071 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
072 setBorder(BorderFactory.createTitledBorder("Simulation"));
073 add(Box.createRigidArea(new Dimension(5, 0)));
074
075 add(_stepButton = new JButton("Step"));
076 add(_runButton = new JButton("Run"));
077 add(_stopButton = new JButton("Stop"));
078 _runButton.setEnabled(false);
079 _stepButton.setEnabled(false);
080 _stopButton.setEnabled(false);
081
082 add(Box.createRigidArea(new Dimension(5, 0)));
083 add(new JLabel("Slow"));
084 _speedSlider = new JSlider(MIN_DELAY_MSECS, MAX_DELAY_MSECS, INITIAL_DELAY);
085 _speedSlider.setInverted(true);
086 _speedSlider.setPreferredSize(new Dimension(100, _speedSlider.getPreferredSize().height));
087 _speedSlider.setMaximumSize(_speedSlider.getPreferredSize());
088 add(_speedSlider);
089 _speedSlider.setEnabled(false);
090 add(new JLabel("Fast"));
091 add(Box.createRigidArea(new Dimension(5, 0)));
092
093 _stepButton.addActionListener(new ActionListener() {
094 public void actionPerformed(ActionEvent e) {
095 setControlsInRunState();
096 _simAdapter.step();
097 setControlsInIdleState();
098 }
099 });
100 _runButton.addActionListener(new ActionListener() {
101 public void actionPerformed(ActionEvent e) {
102 setControlsInRunState();
103 _simAdapter.setSpeed(_speedSlider.getValue());
104 _simAdapter.start();
105 }
106 });
107 _stopButton.addActionListener(new ActionListener() {
108 public void actionPerformed(ActionEvent e) {
109 setControlsInIdleState();
110 _simAdapter.stop();
111 }
112 });
113 _speedSlider.addChangeListener(new ChangeListener() {
114 public void stateChanged(ChangeEvent evt) {
115 _simAdapter.setSpeed(((JSlider)evt.getSource()).getValue());
116 }
117 });
118 }
119
120 /**
121 * Set the controls in idle state.
122 */
123 public void setControlsInIdleState() {
124 _stepButton.setEnabled(true);
125 _runButton.setEnabled(true);
126 _stopButton.setEnabled(false);
127 _speedSlider.setEnabled(true);
128 _riAdapter.setIdleState();
129 }
130
131 /**
132 * Set the controls in run state.
133 */
134 public void setControlsInRunState() {
135 _stepButton.setEnabled(false);
136 _runButton.setEnabled(false);
137 _stopButton.setEnabled(true);
138 _speedSlider.setEnabled(true);
139 _riAdapter.setRunState();
140 }
141
142 /**
143 * Enables or disables the simulation toolbar.
144 *
145 * @param enabled new state
146 */
147 public void setEnabled(boolean enabled) {
148 //if(isEnabled() != enabled) {
149 super.setEnabled(enabled);
150 _stepButton.setEnabled(enabled);
151 _runButton.setEnabled(enabled);
152 _stopButton.setEnabled(false);
153 _speedSlider.setEnabled(enabled);
154 //}
155 }
156 }