TrustGrapher  r52
A playabale simulator for modelling trust between agents
D:/src/cu/trustGrapher/eventplayer/PlaybackPanel.java
Go to the documentation of this file.
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 }