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 }