diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form index 3cf845e2d0..0b00c43d8a 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.form @@ -107,7 +107,7 @@ - + @@ -227,7 +227,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java index e1d4646a2f..4b1f982be8 100755 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/MediaPlayerPanel.java @@ -29,6 +29,7 @@ import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -260,6 +261,36 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie } } }); + //Manage the video while the user is performing actions on the track. + progressSlider.addMouseListener(new MouseListener() { + private State previousState = State.NULL; + + @Override + public void mousePressed(MouseEvent e) { + previousState = gstPlayBin.getState(); + gstPlayBin.pause(); + } + + @Override + public void mouseReleased(MouseEvent e) { + if(previousState.equals(State.PLAYING)) { + gstPlayBin.play(); + } + previousState = State.NULL; + } + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + }); //Manage the audio level when the user is adjusting the volumn slider audioSlider.addChangeListener((ChangeEvent event) -> { if (audioSlider.getValueIsAdjusting()) { @@ -589,63 +620,15 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie } } - /** - * Represents the default configuration for the circular JSliderUI. - */ - private class CircularJSliderConfiguration { - - //Thumb configurations - private final Color thumbColor; - private final Dimension thumbDimension; - - //Track configurations - //Progress bar can be bisected into a seen group - //and an unseen group. - private final Color unseen; - private final Color seen; - - /** - * Default configuration - * - * JSlider is light blue RGB(0,130,255). Seen track is light blue - * RGB(0,130,255). Unseen track is light grey RGB(192, 192, 192). - * - * @param thumbDimension Size of the oval thumb. - */ - public CircularJSliderConfiguration(Dimension thumbDimension) { - Color lightBlue = new Color(0, 130, 255); - - seen = lightBlue; - unseen = Color.LIGHT_GRAY; - - thumbColor = lightBlue; - - this.thumbDimension = new Dimension(thumbDimension); - } - - public Color getThumbColor() { - return thumbColor; - } - - public Color getUnseenTrackColor() { - return unseen; - } - - public Color getSeenTrackColor() { - return seen; - } - - public Dimension getThumbDimension() { - return new Dimension(thumbDimension); - } - } - /** * Custom view for the JSlider. */ private class CircularJSliderUI extends BasicSliderUI { - private final CircularJSliderConfiguration config; + private final Dimension thumbDimension; + private final Color thumbColor; + private final Color trackUnseen; + private final Color trackSeen; /** * Creates a custom view for the JSlider. This view draws a blue oval @@ -656,14 +639,20 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie * @param config Configuration object. Contains info about thumb * dimensions and colors. */ - public CircularJSliderUI(JSlider slider, CircularJSliderConfiguration config) { + public CircularJSliderUI(JSlider slider, Dimension thumbDimension) { super(slider); - this.config = config; + this.thumbDimension = thumbDimension; + + //Configure track and thumb colors. + Color lightBlue = new Color(0, 130, 255); + thumbColor = lightBlue; + trackSeen = lightBlue; + trackUnseen = Color.LIGHT_GRAY; } @Override protected Dimension getThumbSize() { - return config.getThumbDimension(); + return new Dimension(thumbDimension); } /** @@ -677,8 +666,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie //Change the thumb view from the rectangle //controller to an oval. - graphic.setColor(config.getThumbColor()); - Dimension thumbDimension = config.getThumbDimension(); + graphic.setColor(thumbColor); graphic.fillOval(thumb.x, thumb.y, thumbDimension.width, thumbDimension.height); //Preserve the graphics original color @@ -701,12 +689,12 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie Color original = graphic.getColor(); //Paint the seen side - graphic.setColor(config.getSeenTrackColor()); + graphic.setColor(trackSeen); graphic.drawLine(track.x, track.y + track.height / 2, thumbX, thumbY + track.height / 2); //Paint the unseen side - graphic.setColor(config.getUnseenTrackColor()); + graphic.setColor(trackUnseen); graphic.drawLine(thumbX, thumbY + track.height / 2, track.x + track.width, track.y + track.height / 2); @@ -716,7 +704,26 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie @Override protected TrackListener createTrackListener(JSlider slider) { - return new CustomTrackListener(); + /** + * This track listener will force the thumb to be snapped to the mouse + * location. This makes grabbing and dragging the JSlider much easier. + * Using the default track listener, the user would have to click + * exactly on the slider thumb to drag it. Now the thumb positions + * itself under the mouse so that it can always be dragged. + */ + return new TrackListener() { + @Override + public void mousePressed(MouseEvent e) { + if (!slider.isEnabled() || !SwingUtilities.isLeftMouseButton(e)) { + return; + } + //Snap the thumb to position of the mouse + scrollDueToClickInTrack(0); + + //Handle the event as normal. + super.mousePressed(e); + } + }; } @Override @@ -753,43 +760,6 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie super.update(graphic, component); } - - /** - * This track listener will force the thumb to be snapped to the mouse - * location. This makes grabbing and dragging the JSlider much easier. - * Using the default track listener, the user would have to click - * exactly on the slider thumb to drag it. Now the thumb positions - * itself under the mouse so that it can always be dragged. - */ - private class CustomTrackListener extends CircularJSliderUI.TrackListener { - - @Override - public void mousePressed(MouseEvent e) { - if (!slider.isEnabled() || !SwingUtilities.isLeftMouseButton(e)) { - return; - } - //Snap the thumb to position of the mouse - scrollDueToClickInTrack(0); - - //Pause the video for convenience - gstPlayBin.pause(); - - //Handle the event as normal. - super.mousePressed(e); - } - - @Override - public void mouseReleased(MouseEvent e) { - if (!slider.isEnabled() || !SwingUtilities.isLeftMouseButton(e)) { - return; - } - - super.mouseReleased(e); - - //Unpause once the mouse has been released. - gstPlayBin.play(); - } - } } /** @@ -833,7 +803,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie progressSlider.setDoubleBuffered(true); progressSlider.setMinimumSize(new java.awt.Dimension(36, 21)); progressSlider.setPreferredSize(new java.awt.Dimension(200, 21)); - progressSlider.setUI(new CircularJSliderUI(progressSlider, new CircularJSliderConfiguration(new Dimension(18,18)))); + progressSlider.setUI(new CircularJSliderUI(progressSlider, new Dimension(18,18))); org.openide.awt.Mnemonics.setLocalizedText(progressLabel, org.openide.util.NbBundle.getMessage(MediaPlayerPanel.class, "MediaPlayerPanel.progressLabel.text")); // NOI18N @@ -908,7 +878,7 @@ public class MediaPlayerPanel extends JPanel implements MediaFileViewer.MediaVie audioSlider.setMinimumSize(new java.awt.Dimension(200, 19)); audioSlider.setPreferredSize(new java.awt.Dimension(200, 30)); audioSlider.setRequestFocusEnabled(false); - audioSlider.setUI(new CircularJSliderUI(audioSlider, new CircularJSliderConfiguration(new Dimension(15,15)))); + audioSlider.setUI(new CircularJSliderUI(audioSlider, new Dimension(15,15))); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 4; gridBagConstraints.gridy = 0;