package ecologylab.oodss.logging.playback;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import ecologylab.oodss.logging.Logging;
import ecologylab.oodss.logging.MixedInitiativeOp;
/**
* GUI elements for the log playback application.
*
* @author Zachary O. Toups (toupsz@cs.tamu.edu)
*
* @param <E>
* @param <T>
*/
public class LogPlaybackControls<E extends MixedInitiativeOp, T extends Logging<E>> extends JPanel
implements ActionListener, PlaybackControlCommands, ChangeListener
{
private static final long serialVersionUID = 1L;
protected LogPlaybackControlModel<E, T> log = null;
private JProgressBar loadSpinner = new JProgressBar();
protected JSlider jogShuttle = new JSlider();
private ImageIcon playIcon = new ImageIcon(
"toolbarButtonGraphics/media/Play24.gif",
"Play");
private ImageIcon pauseIcon = new ImageIcon(
"toolbarButtonGraphics/media/Pause24.gif",
"Pause");
private JButton playPauseButton = new JButton(playIcon);
private JButton stopButton = new JButton(
new ImageIcon(
"toolbarButtonGraphics/media/Stop24.gif",
"Stop"));
private JButton stepBackButton = new JButton(
new ImageIcon(
"toolbarButtonGraphics/media/StepBack24.gif",
"Step back"));
private JButton stepForwardButton = new JButton(
new ImageIcon(
"toolbarButtonGraphics/media/StepForward24.gif",
"Step forward"));
protected boolean mousePressed = false;
protected LogPlayer<E, T> player;
public LogPlaybackControls(LogPlayer<E, T> p)
{
super();
player = p;
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
jogShuttle.setOrientation(SwingConstants.HORIZONTAL);
loadSpinner.setOrientation(SwingConstants.VERTICAL);
playPauseButton.setActionCommand(PLAY);
stopButton.setActionCommand(STOP);
stepBackButton.setActionCommand(STEP_BACK);
stepForwardButton.setActionCommand(STEP_FORWARD);
playPauseButton.addActionListener(player);
playPauseButton.addActionListener(this);
playPauseButton.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UP");
playPauseButton.getActionMap().put("UP", new ButtonAction(playPauseButton));
playPauseButton.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LEFT");
playPauseButton.getActionMap().put("LEFT", new ButtonAction(stepBackButton));
playPauseButton.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RIGHT");
playPauseButton.getActionMap().put("RIGHT", new ButtonAction(stepForwardButton));
stopButton.addActionListener(player);
stopButton.addActionListener(this);
stepBackButton.addActionListener(player);
stepBackButton.addActionListener(this);
stepForwardButton.addActionListener(player);
stepForwardButton.addActionListener(this);
player.addActionListener(this);
this.add(stepBackButton);
JPanel playStopPanel = new JPanel();
playStopPanel.setLayout(new BoxLayout(playStopPanel, BoxLayout.PAGE_AXIS));
playStopPanel.add(playPauseButton);
playStopPanel.add(stopButton);
this.add(playStopPanel);
this.add(stepForwardButton);
jogShuttle.setPreferredSize(new Dimension(800, 50));
jogShuttle.setPaintLabels(true);
jogShuttle.addMouseListener(new MouseListener()
{
@Override
public void mousePressed(MouseEvent me)
{
jogShuttle
.setValue((int) (jogShuttle.getMinimum() + (jogShuttle.getExtent() * ((double) me
.getX() / (double) jogShuttle.getWidth()))));
player.startAdjusting();
mousePressed = true;
}
@Override
public void mouseClicked(MouseEvent me)
{
jogShuttle
.setValue((int) (jogShuttle.getMinimum() + (jogShuttle.getExtent() * ((double) me
.getX() / (double) jogShuttle.getWidth()))));
}
@Override
public void mouseReleased(MouseEvent me)
{
jogShuttle
.setValue((int) (jogShuttle.getMinimum() + (jogShuttle.getExtent() * ((double) me
.getX() / (double) jogShuttle.getWidth()))));
mousePressed = false;
}
@Override
public void mouseEntered(MouseEvent me)
{
}
@Override
public void mouseExited(MouseEvent me)
{
}
});
jogShuttle.addMouseMotionListener(new MouseMotionListener()
{
@Override
public void mouseDragged(MouseEvent me)
{
jogShuttle
.setValue((int) (jogShuttle.getMinimum() + (jogShuttle.getExtent() * ((double) me
.getX() / (double) jogShuttle.getWidth()))));
}
@Override
public void mouseMoved(MouseEvent me)
{
}
});
this.add(jogShuttle);
}
public boolean isMousePressed()
{
return mousePressed;
}
/**
* @param loading
* The loading to set.
*/
public void setLoading(boolean loading)
{
loadSpinner.setIndeterminate(loading);
}
/**
* @param log
* The log to set.
*/
public void setLog(LogPlaybackControlModel<E, T> log)
{
this.log = log;
jogShuttle.setModel(log);
}
@Override
public void actionPerformed(ActionEvent arg0)
{
if (PLAY.equals(arg0.getActionCommand()))
{
play();
}
if (PAUSE.equals(arg0.getActionCommand())
|| STEP_BACK.equals(arg0.getActionCommand())
|| STEP_FORWARD.equals(arg0.getActionCommand())
|| STOP.equals(arg0.getActionCommand()))
{
pause();
}
}
/**
*
*/
protected void pause()
{
playPauseButton.setActionCommand(PLAY);
playPauseButton.setIcon(playIcon);
}
/**
*
*/
protected void play()
{
playPauseButton.setActionCommand(PAUSE);
playPauseButton.setIcon(pauseIcon);
}
@Override
public void stateChanged(ChangeEvent arg0)
{
}
/**
* Hook method for subclasses that need to set up important events on the log op timeline.
*
*/
public void setupImportantEvents()
{
}
public class ButtonAction extends AbstractAction
{
JButton button;
public ButtonAction(JButton button)
{
this.button = button;
}
@Override
public void actionPerformed(ActionEvent arg0)
{
button.doClick();
}
}
}