/*
* org.openmicroscopy.shoola.agents.imviewer.util.player.MoviePlayerDialog
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2014 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.imviewer.util.player;
//Java imports
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
//Third-party libraries
//Application-internal dependencies
import org.openmicroscopy.shoola.agents.imviewer.view.ImViewer;
/**
* A non-modal dialog displaying the various controls to play a movie across
* z-sections and timepoints.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Andrea Falconi
* <a href="mailto:a.falconi@dundee.ac.uk">a.falconi@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* @since OME2.2
*/
public class MoviePlayerDialog
extends JDialog
{
/** Bound property indicating that the dialog is closed. */
public static final String CLOSE_PROPERTY = "close";
/**
* Bounds property indicating that the state of the player has changed.
*/
public static final String MOVIE_STATE_CHANGED_PROPERTY =
"movieStateChanged";
/** Indicates to play movie across z-sections only. */
public static final int ACROSS_Z = 300;
/** Indicates to play movie across timepoints only. */
public static final int ACROSS_T = 301;
/** Indicates to play movie across small t only (lifetime). */
public static final int ACROSS_BIN = 303;
/** Indicates to play movie across z-sections and timepoint.s */
public static final int ACROSS_ZT = 302;
/** Indicates to perform a click to play the movie. */
public static final int DO_CLICK_PLAY = 0;
/** Indicates to perform a click to stop playing the movie. */
public static final int DO_CLICK_PAUSE = 1;
/** Reference to the component controlling the timer. */
private MoviePlayer player;
/** The UI delegate. */
private MoviePlayerUI uiDelegate;
/** Reference to the parent model. */
private ImViewer model;
/** Builds and lays out the GUI. */
private void buildGUI()
{
getContentPane().add(uiDelegate);
pack();
}
/** Adds a window listener to stop timer if the window is closed. */
private void initListeners()
{
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
player.setPlayerState(Player.STOP);
firePropertyChange(CLOSE_PROPERTY, Boolean.FALSE, Boolean.TRUE);
}});
}
/**
* Creates a new instance.
*
* @param owner The owner of the this dialog.
* @param model Reference to the {@link ImViewer}.
* Mustn't be <code>null</code>.
*/
public MoviePlayerDialog(JFrame owner, ImViewer model)
{
super(owner);
setResizable(false);
if (model == null) throw new NullPointerException("No model.");
setTitle("Movie Player: "+model.getImageName());
this.model = model;
player = new MoviePlayer(model, this);
uiDelegate = new MoviePlayerUI(player);
player.setStartT(model.getRealSelectedT());
new MoviePlayerControl(player, uiDelegate);
initListeners();
buildGUI();
}
/**
* Swaps the <code>Play</code> and <code>Pause</code> icons depending on the
* specified flag.
*
* @param b Pass <code>true</code> to set the <code>Pause</code> icon
* <code>false</code> to set the <code>Play</code> icon.
*/
void setMoviePlay(boolean b)
{
if (b)
firePropertyChange(MOVIE_STATE_CHANGED_PROPERTY,
Boolean.FALSE, Boolean.TRUE);
else firePropertyChange(MOVIE_STATE_CHANGED_PROPERTY,
Boolean.TRUE, Boolean.FALSE);
if (uiDelegate != null) uiDelegate.setMoviePlay(b);
}
/**
* Fires an event to render the plane specified by the z-section,
* timepoint and bin.
*/
void renderImage()
{
int z = model.getDefaultZ();
int t = model.getRealSelectedT();
int bin = model.getSelectedBin();
switch (player.getMovieIndex()) {
case ACROSS_T:
t = player.getFrameNumberT();
break;
case ACROSS_Z:
z = player.getFrameNumberZ();
break;
case ACROSS_BIN:
bin = player.getFrameNumberBin();
break;
case ACROSS_ZT:
z = player.getFrameNumberZ();
t = player.getFrameNumberT();
}
model.setSelectedXYPlane(z, t, bin);
}
/** Notifies that the state has changed. */
void notifyPlayerStateChange() {}
/**
* Sets the index of the movie player.
*
* @param index The index to set.
*/
public void setMovieIndex(int index)
{
if (uiDelegate != null) {
uiDelegate.setMovieIndex(index);
uiDelegate.setDefaultMovieType();
}
player.setMovieIndex(index);
}
/**
* Returns the movie index.
*
* @return See above.
*/
public int getMovieIndex() { return player.getMovieIndex(); }
/**
* Sets the start and end timepoint.
*
* @param start The starting point.
* @param end The end point.
*/
public void setTimeRange(int start, int end)
{
if (start < player.getMinT() || start >= end || end > player.getMaxT())
return;
player.setEndT(end);
player.setStartT(start);
if (uiDelegate != null) {
uiDelegate.setEndT(end);
uiDelegate.setStartT(start);
}
}
/**
* Sets the start and end Z-section.
*
* @param start The starting point.
* @param end The end point.
*/
public void setZRange(int start, int end)
{
if (start < player.getMinZ() || start >= end || end > player.getMaxZ())
return;
player.setEndZ(end);
player.setStartZ(start);
if (uiDelegate != null) {
uiDelegate.setEndZ(end);
uiDelegate.setStartZ(start);
}
}
/**
* Sets the start and end bin value.
*
* @param start The starting point.
* @param end The end point.
*/
public void setBinRange(int start, int end)
{
if (start < player.getMinBin() || start >= end ||
end > player.getMaxBin())
return;
player.setEndBin(end);
player.setStartBin(start);
}
/**
* Performs a click on the button corresponding to the passed index.
*
* @param index One out of the following constants: {@link #DO_CLICK_PLAY}
* or {@link #DO_CLICK_PAUSE}.
*/
public void doClick(int index)
{
switch (index) {
case DO_CLICK_PAUSE:
case DO_CLICK_PLAY:
break;
default:
throw new IllegalArgumentException("Index not supported.");
}
if (uiDelegate != null) uiDelegate.doClick(index);
}
}