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    }