/*
* org.openmicroscopy.shoola.env.data.model.MovieExportParam
*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2009 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.env.data.model;
//Java imports
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
//Third-party libraries
//Application-internal dependencies
/**
* Hosts the parameters needed for the creation of the movie.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @version 3.0
* <small>
* (<b>Internal version:</b> $Revision: $Date: $)
* </small>
* @since 3.0-Beta4
*/
public class MovieExportParam
{
/** Identifies the <code>Movie</code> script. */
public static final String MOVIE_SCRIPT =
ScriptObject.EXPORT_PATH+"Make_Movie.py";
/** Movie across z-section. */
public static final int Z_MOVIE = 0;
/** Movie across time. */
public static final int T_MOVIE = 1;
/** Movie across time. */
public static final int ZT_MOVIE = 2;
/** Identify the <code>MPEG</code> format. */
public static final int MPEG = 2;
/** Identify the <code>Quick time</code> format. */
public static final int QT = 1;
/** Identify the <code>WMV</code> format. */
public static final int WMV = 0;
/** The supported formats. */
public static final Map<Integer, String> FORMATS;
/** The default number of frames per second. */
public static final int DEFAULT_FPS = 25;
/** The extension corresponding to the {@link #MPEG} movie. */
private static final String MPEG_EXTENSION = ".avi";
/** The extension corresponding to the {@link #WMV} movie. */
private static final String WMV_EXTENSION = ".wmv";
/** The extension corresponding to the {@link #QT} movie. */
private static final String QT_EXTENSION = ".avi";
/** The minimum value of the scale bar.*/
private static final int SCALE_BAR = 1;
static {
FORMATS = new LinkedHashMap<Integer, String>(3);
FORMATS.put(WMV, "Windows Media Player");
FORMATS.put(QT, "Quick Time");
FORMATS.put(MPEG, "MPEG");
}
/** The name of the image. */
private String name;
/** The number of frame per second. */
private int fps;
/** The selected format. */
private int format;
/** The scale bar if displayed. */
private int scaleBar;
/** The lower bound of the time interval. */
private int startT;
/** The upper bound of the time interval. */
private int endT;
/** The lower bound of the z-section interval. */
private int startZ;
/** The upper bound of the z-section interval. */
private int endZ;
/** Movie either across time of z-section. */
private int type;
/** Flag indicating to display or not the real time and or z-section. */
private boolean labelVisible;
/** The color of the scale bar. */
private String color;
/** The collection of selected channels.*/
private List<Integer> channels;
/**
* Controls if the passed type is supported.
*
* @param type The value to check.
*/
private void checkType(int type)
{
switch (type) {
case Z_MOVIE:
case T_MOVIE:
case ZT_MOVIE:
break;
default:
throw new IllegalArgumentException("Type not supported.");
}
}
/**
* Controls if the passed format is supported.
* Returns the name with the extension corresponding to the selected format.
*
* @param value The value to check.
* @param name The name of the movie.
* @return See above.
*/
private String checkFormat(int value, String name)
{
switch (value) {
case MPEG:
if (name.endsWith(MPEG_EXTENSION))
name = name.substring(0,
name.length()-MPEG_EXTENSION.length());
return name;
case WMV:
if (name.endsWith(WMV_EXTENSION))
name = name.substring(0,
name.length()-WMV_EXTENSION.length());
return name;
case QT:
if (name.endsWith(QT_EXTENSION))
name = name.substring(0,
name.length()-QT_EXTENSION.length());
return name;
default:
throw new IllegalArgumentException("Format not supported.");
}
}
/** Initializes the time and z-section intervals. */
private void initialize()
{
startT = -1;
startZ = -1;
endT = -1;
endZ = -1;
}
/**
* Creates a new instance.
*
* @param name The name of the file.
* @param fps The number of frames per second.
* @param format The selected format.
* @param scaleBar The scale bar. Set to <code>0</code>
* if the scale bar is not visible.
* @param type Movie either across time or z-section.
*/
public MovieExportParam(String name, int fps, int format, int scaleBar,
int type)
{
if (name == null || name.trim().length() == 0)
throw new IllegalArgumentException("No name specified.");
checkType(type);
this.name = checkFormat(format, name);
this.type = type;
if (fps <= 0) fps = DEFAULT_FPS;
this.fps = fps;
this.format = format;
if (scaleBar < 0) scaleBar = SCALE_BAR;
this.scaleBar = scaleBar;
labelVisible = false;
color = null;
initialize();
}
/**
* Sets the channels to user for the movie.
*
* @param channels The channels to use.
*/
public void setChannels(List<Integer> channels)
{
this.channels = channels;
}
/**
* Returns the collection of channels.
*
* @return See above.
*/
public List<Integer> getChannels() { return channels; }
/**
* Sets the time interval.
*
* @param startT The lower bound of the time interval.
* @param endT The upper bound of the time interval.
*/
public void setTimeInterval(int startT, int endT)
{
this.startT = startT;
this.endT = endT;
}
/**
* Sets the z-section interval.
*
* @param startZ The lower bound of the time interval.
* @param endZ The upper bound of the time interval.
*/
public void setZsectionInterval(int startZ, int endZ)
{
this.startZ = startZ;
this.endZ = endZ;
}
/**
* Returns <code>true</code> if the z-section has been set,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isZSectionSet()
{
return !(startZ == -1 && endZ == -1);
}
/**
* Returns <code>true</code> if the time-point has been set,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isTimeIntervalSet()
{
return !(startT == -1 && endT == -1);
}
/**
* Returns the name of the file.
*
* @return See above.
*/
public String getName() { return name; }
/**
* Returns the number of frame per second.
*
* @return See above.
*/
public int getFps() { return fps; }
/**
* Returns the format. One of the constants defined by this class.
*
* @return See above.
*/
public int getFormat() { return format; }
/**
* Returns the scale Bar.
*
* @return See above.
*/
public int getScaleBar()
{
if (scaleBar < SCALE_BAR) scaleBar = SCALE_BAR;
return scaleBar;
}
/**
* Returns the lower bound of the time interval.
*
* @return See above.
*/
public int getStartT() { return startT; }
/**
* Returns the upper bound of the time interval.
*
* @return See above.
*/
public int getEndT() { return endT; }
/**
* Returns the lower bound of the z-section interval.
*
* @return See above.
*/
public int getStartZ() { return startZ; }
/**
* Returns the upper bound of the z-section interval.
*
* @return See above.
*/
public int getEndZ() { return endZ; }
/**
* Returns the type of movie to create.
* One of the following constants: {@link #Z_MOVIE}, {@link #T_MOVIE}
* and {@link #ZT_MOVIE}.
*
* @return See above.
*/
public int getType() { return type; }
/**
* Returns the format as a string.
*
* @return See above.
*/
public String getFormatAsString()
{
switch (format) {
case MPEG: return "MPEG";
case QT: return "Quicktime";
case WMV: return "WMV";
default:
return "";
}
}
/**
* Returns <code>true</code> if the real time is displayed,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isLabelVisible() { return labelVisible; }
/**
* Sets the {@link #labelVisible} flag.
* <code>false</code> otherwise.
*
* @param labelVisible The value to set.
*/
public void setLabelVisible(boolean labelVisible)
{
this.labelVisible = labelVisible;
}
/**
* Sets the color of the scale bar.
*
* @param color The value to set.
*/
public void setColor(String color)
{
if (color == null) return;
this.color = color;//color.getRGB() & 0x00ffffff;
}
/**
* Returns the color of the scale bar.
*
* @return See above.
*/
public String getColor() { return color; }
/**
* Returns the name of the script used to make a movie.
*
* @return See above.
*/
public String getScriptName() { return MOVIE_SCRIPT; }
}