TrustGrapher
r52
A playabale simulator for modelling trust between agents
|
00001 00002 package cu.trustGrapher.eventplayer; 00003 00004 import cu.trustGrapher.OptionsWindow; 00005 import java.awt.GridBagLayout; 00006 import java.awt.event.*; 00007 import javax.swing.*; 00008 import javax.swing.event.ChangeEvent; 00009 import javax.swing.event.ChangeListener; 00010 import aohara.utilities.ChatterBox; 00011 00022 public final class PlaybackPanel extends JPanel implements EventPlayerListener { 00023 00024 private static final String EVENTS_PER_TICK = "eventsPerTick"; 00025 private boolean scrubMode = true; //The scrub mode for the timelineSlider is true by default 00026 private JButton forwardButton, reverseButton, pauseButton; 00027 private JSlider speedSlider, timelineSlider; 00028 protected EventPlayer eventThread; 00029 00031 00034 public PlaybackPanel(EventPlayer eventThread) { 00035 this.eventThread = eventThread; 00036 initComponents(); 00037 //Load saved properties 00038 aohara.utilities.PropertyManager config = eventThread.getTrustGrapher().getPropertyManager(); 00039 if (config.containsKey(EVENTS_PER_TICK)) { //Try loading value for speedSlider 00040 try { 00041 speedSlider.setValue(Integer.parseInt(config.getProperty(EVENTS_PER_TICK))); 00042 } catch (NumberFormatException ex) { 00043 aohara.utilities.ChatterBox.alert("Invalid eventsPerTick property. Can continue. Will set to defualt."); 00044 } 00045 } 00046 00047 if (config.containsKey(OptionsWindow.SCRUB_MODE)) { //Try loading the timelineSlider mode 00048 try{ 00049 scrubMode = Boolean.parseBoolean(config.getProperty(OptionsWindow.SCRUB_MODE)); 00050 }catch (NullPointerException ex){ 00051 ChatterBox.error("PlaybackPanel", "<init>", "NullPointer Exception: most likely because the " + 00052 OptionsWindow.SCRUB_MODE + " property was invalid."); 00053 } 00054 } 00055 setVisible(eventThread.getTrustGrapher().getTrustMenuBar().togglePlaybackPanelButton.isSelected()); 00056 } 00057 00059 public JButton getPauseButton() { 00060 return pauseButton; 00061 } 00062 00063 public EventPlayer getEventPlayer() { 00064 return eventThread; 00065 } 00066 00068 00072 public void setScrubMode(boolean scrub) { 00073 scrubMode = scrub; 00074 } 00075 00079 private void initComponents() { 00080 ActionListener buttonListener = new PlaybackButtonListener(); 00081 TimelineSliderListener playbackSliderListener = new TimelineSliderListener(); 00082 00083 speedSlider = new JSlider(JSlider.HORIZONTAL, 1, 10, 1); 00084 speedSlider.setMajorTickSpacing(1); 00085 speedSlider.setPaintLabels(true); 00086 speedSlider.setSnapToTicks(true); 00087 speedSlider.addChangeListener(new SpeedSliderListener()); 00088 speedSlider.setBorder(BorderFactory.createTitledBorder("Events per Tick")); 00089 00090 reverseButton = new JButton(" <| "); 00091 reverseButton.addActionListener(buttonListener); 00092 reverseButton.setEnabled(false); 00093 00094 pauseButton = new JButton(" || "); 00095 pauseButton.addActionListener(buttonListener); 00096 pauseButton.setEnabled(false); 00097 00098 forwardButton = new JButton(" |> "); 00099 forwardButton.addActionListener(buttonListener); 00100 //forwardButton.setIcon(new ImageIcon(getClass().getResource("/trustGrapher/resources/forward.png"))); 00101 //forwardButton.setSize(48,25); 00102 00103 timelineSlider = new JSlider(JSlider.HORIZONTAL, 0, eventThread.getEvents().size() - 1, 0); 00104 timelineSlider.setEnabled(false); 00105 timelineSlider.setSnapToTicks(true); 00106 00107 timelineSlider.addChangeListener(playbackSliderListener); 00108 timelineSlider.addMouseListener(playbackSliderListener); 00109 timelineSlider.setEnabled(true); 00110 00111 JPanel buttonPanel = new JPanel(); 00112 buttonPanel.setLayout(new GridBagLayout()); 00113 buttonPanel.add(reverseButton); 00114 buttonPanel.add(pauseButton); 00115 buttonPanel.add(forwardButton); 00116 buttonPanel.add(speedSlider); 00117 00118 setLayout(new java.awt.GridLayout(2, 1)); 00119 setBorder(BorderFactory.createTitledBorder("Playback Panel")); 00120 add(buttonPanel); 00121 add(timelineSlider); 00122 } 00123 00130 @Override 00131 public void goToIndex(int eventIndex) { 00132 if (eventIndex > timelineSlider.getValue()) { 00133 reverseButton.setEnabled(true); 00134 pauseButton.setEnabled(true); 00135 forwardButton.setEnabled(eventThread.getPlayState() != EventPlayer.FORWARD); 00136 } else if (eventIndex < timelineSlider.getValue()) { 00137 reverseButton.setEnabled(eventThread.getPlayState() != EventPlayer.REVERSE); 00138 pauseButton.setEnabled(true); 00139 forwardButton.setEnabled(true); 00140 } 00141 timelineSlider.setValue(eventIndex); //Gets the viewers that are visible from the main class and repaints them 00142 if (timelineSlider.getValue() == 0 || timelineSlider.getValue() == eventThread.getEvents().size() - 1) { 00143 playbackPause(); 00144 } 00145 } 00146 00151 public void playbackPause() { 00152 reverseButton.setEnabled(eventThread.atFront() ? false : true); 00153 pauseButton.setEnabled(false); 00154 forwardButton.setEnabled(eventThread.atBack() ? false : true); 00155 } 00157 00161 class PlaybackButtonListener implements ActionListener { 00162 00167 public void actionPerformed(ActionEvent actionEvent) { 00168 String buttonText = ((AbstractButton) actionEvent.getSource()).getText(); 00169 if (buttonText.equals(" || ")) { 00170 playbackPause(); 00171 eventThread.pause(); 00172 } else if (buttonText.equals(" |> ")) { 00173 eventThread.forward(); 00174 } else if (buttonText.equals(" <| ")) { 00175 eventThread.reverse(); 00176 } else { 00177 aohara.utilities.ChatterBox.error(this, "actionPerformed()", "An unhandled PlayBackPanel button press occured"); 00178 } 00179 } 00180 } 00181 00185 class SpeedSliderListener implements ChangeListener { 00186 00191 @Override 00192 public void stateChanged(ChangeEvent changeEvent) { 00193 eventThread.setEventsPerTick(((JSlider) changeEvent.getSource()).getValue()); 00194 eventThread.getTrustGrapher().getPropertyManager().setProperty(EVENTS_PER_TICK, "" + speedSlider.getValue()); 00195 eventThread.getTrustGrapher().getPropertyManager().save(); 00196 } 00197 } 00198 00202 class TimelineSliderListener extends MouseAdapter implements ChangeListener { 00203 00204 int prevState; 00205 boolean scrubbing; 00206 00212 @Override 00213 public void stateChanged(ChangeEvent changeEvent) { 00214 if (scrubbing && scrubMode) { 00215 eventThread.goToEvent(timelineSlider.getValue()); 00216 } 00217 } 00218 00224 @Override 00225 public void mousePressed(MouseEvent mouseEvent) { 00226 if (timelineSlider.isEnabled()) { 00227 scrubbing = true; 00228 prevState = eventThread.getPlayState(); 00229 eventThread.pause(); 00230 } 00231 } 00232 00240 @Override 00241 public void mouseReleased(MouseEvent e) { 00242 if (!scrubMode) { 00243 eventThread.goToEvent(timelineSlider.getValue()); 00244 } 00245 if (timelineSlider.isEnabled()) { 00246 switch (prevState) { 00247 case EventPlayer.REVERSE: 00248 eventThread.reverse(); 00249 break; 00250 case EventPlayer.PAUSE: 00251 eventThread.pause(); 00252 playbackPause(); 00253 break; 00254 case EventPlayer.FORWARD: 00255 eventThread.forward(); 00256 break; 00257 } 00258 scrubbing = false; 00259 } 00260 } 00261 } 00262 }