/*
*------------------------------------------------------------------------------
* 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;
import java.awt.Color;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* Hosts the parameters needed for the creation of a figure, either a
* split figure or a ROI split figure.
*
* @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
* @since 3.0-Beta4
*/
public class FigureParam
{
/** Identifies the <code>ROI Figure</code> script. */
public static final String ROI_SCRIPT =
ScriptObject.FIGURE_PATH+"ROI_Split_Figure.py";
/** Identifies the <code>Thumbnail Figure</code> script. */
public static final String THUMBNAIL_SCRIPT =
ScriptObject.FIGURE_PATH+"Thumbnail_Figure.py";
/** Identifies the <code>Movie Figure</code> script. */
public static final String MOVIE_SCRIPT =
ScriptObject.FIGURE_PATH+"Movie_Figure.py";
/** Identifies the <code>Split View Figure</code> script. */
public static final String SPLIT_VIEW_SCRIPT =
ScriptObject.FIGURE_PATH+"Split_View_Figure.py";
/** The default text for the merged image. */
public static final String MERGED_TEXT = "Merged";
/** Indicates to create a split view figure. */
public static final int SPLIT_VIEW = 0;
/** Indicates to create a ROI split view figure. */
public static final int SPLIT_VIEW_ROI = 1;
/** Indicates to create a Thumbnails figure. */
public static final int THUMBNAILS = 2;
/** Indicates to create a Movie figure. */
public static final int MOVIE = 3;
/** Indicates to use the image's name as the name a row. */
public static final int IMAGE_NAME = 0;
/** Indicates to use the dataset's name as the name a row. */
public static final int DATASET_NAME = 1;
/** Indicates to use the tag's name as the name a row. */
public static final int TAG_NAME = 2;
/** Identify the <code>JPEG</code> format. */
public static final int JPEG = 0;
/** Identify the <code>PNG</code> format. */
public static final int PNG = 1;
/** Identify the <code>TIFF</code> format. */
public static final int TIFF = 2;
/** Identify the default format. */
public static final int DEFAULT_FORMAT = JPEG;
/** Identify the <code>Seconds</code> format. */
public static final int TIME_SECS = 0;
/** Identify the <code>Minutes</code> format. */
public static final int TIME_MINS = 1;
/** Identify the <code>Hours</code> format. */
public static final int TIME_HOURS = 2;
/** Identify the <code>Minutes and Seconds</code> format. */
public static final int TIME_MINS_SECS = 3;
/** Identify the <code>Hours and minutes</code> format. */
public static final int TIME_HOURS_MINS = 4;
/** The supported formats. */
public static final Map<Integer, String> FORMATS;
/** The supported time formats. */
public static final Map<Integer, String> TIMES;
static {
FORMATS = new LinkedHashMap<Integer, String>(3);
FORMATS.put(JPEG, "JPEG");
FORMATS.put(PNG, "PNG");
FORMATS.put(TIFF, "TIFF");
TIMES = new LinkedHashMap<Integer, String>(6);
TIMES.put(TIME_SECS, "Seconds (e.g. 2)");
TIMES.put(TIME_MINS, "Minutes");
TIMES.put(TIME_HOURS, "Hours");
TIMES.put(TIME_MINS_SECS, "Minutes and Seconds");
TIMES.put(TIME_HOURS_MINS, "Hours and Minutes");
}
/** One of the format constants defined by this class. */
private int format;
/** One of the projection constants defined by this class. */
private int projectionType;
/** The lower bound of the projection range. */
private int zStart;
/** The lower bound of the projection range. */
private int zEnd;
/** The stepping used while projecting. Default is <code>1</code>. */
private int stepping;
/** The name of the file. */
private String name;
/** The scale bar if displayed. */
private int scaleBar;
/** The color of the overlay. */
private String color;
/** The width of an image. */
private int width;
/** The height of an image. */
private int height;
/**
* Flag indicating to either have the images in the split view
* as greyScale or color.
*/
private boolean splitGrey;
/**
* The label associated to a row.
* One of the constants defined by this class.
*/
private int label;
/** Channels composing the split view. */
private Map<Integer, String> splitChannels;
/** Channels composing the merge image. */
private Map<Integer, Integer> mergeChannels;
/** Collection of active channels for the split view. */
private List<Integer> splitActive;
/** Collection of tags to sort the thumbnails by. */
private List<Long> tags;
/** The type of figure. */
private int index;
/** The magnification used the ROI figure. */
private double magnificationFactor;
/** The selected time points. */
private List<Integer> timepoints;
/**
* Set to <code>true</code> to indicate that the selected objects will
* compose the figure, <code>false</code> to indicate that the displayed
* objects will compose the figure.
*/
private boolean selectedObjects;
/** Identifies the time selected. */
private int time;
/**
* Flag indicating to display the name of the channels or the default
* text.
*/
private boolean mergedLabel;
/**
* Flag indicates to include the images w/o tags if
* set to <code>true</code>, <code>false</code> otherwise.
*/
private boolean includeUntagged;
/** The data object the figure is attached to. */
private omero.gateway.model.DataObject anchor;
/** The maximum number of images per columns.*/
private int maxPerColumn;
/** Sets the default value. */
private void setDefault()
{
time = TIME_SECS;
label = IMAGE_NAME;
format = DEFAULT_FORMAT;
projectionType = ProjectionParam.MAXIMUM_INTENSITY;
stepping = 1;
scaleBar = 1;
height = -1;
width = -1;
zStart = 0;
zEnd = 0;
splitGrey = false;
index = SPLIT_VIEW;
selectedObjects = true;
tags = null;
}
/**
* Checks the format.
*
* @param format The value to set.
*/
private void checkFormat(int format)
{
switch (format) {
case JPEG:
case PNG:
case TIFF:
this.format = format;
break;
default:
this.format = JPEG;
}
}
/**
* Sets the type of label. One of the constants defined by this class.
*
* @param label The value to set.
*/
private void checkLabel(int label)
{
switch (label) {
case IMAGE_NAME:
case DATASET_NAME:
case TAG_NAME:
this.label = label;
break;
default:
this.label = IMAGE_NAME;
}
}
/**
* Creates a new instance.
*
* @param format The format of the image. One of the constants defined by
* this class.
* @param name The name of the image.
* @param label One of the constants defined by this class.
*/
public FigureParam(int format, String name, int label)
{
this(format, name, new HashMap<Integer, String>(),
new HashMap<Integer, Color>(), label);
}
/**
* Creates a new instance.
*
* @param format The format of the image. One of the constants defined by
* this class.
* @param name The name of the image.
*/
public FigureParam(int format, String name)
{
this(format, name, new HashMap<Integer, String>(),
new HashMap<Integer, Color>(), IMAGE_NAME);
}
/**
* Creates a new instance.
*
* @param format The format of the image. One of the constants defined by
* this class.
* @param name The name of the image.
* @param splitChannels The channels composing the split view.
* @param channels The channels composing the merge image.
* @param label One of the constants defined by this class.
*/
public FigureParam(int format, String name, Map<Integer, String>
splitChannels, Map<Integer, Color> channels, int label)
{
setDefault();
if (channels == null)
throw new IllegalArgumentException("No channels");
if (splitChannels == null)
throw new IllegalArgumentException("No splitChannels.");
this.splitChannels = splitChannels;
checkFormat(format);
checkLabel(label);
this.name = name;
Color c;
mergeChannels = new LinkedHashMap<Integer, Integer>(channels.size());
int value;
Entry<Integer, Color> entry;
Iterator<Entry<Integer, Color>> i = channels.entrySet().iterator();
while (i.hasNext()) {
entry = i.next();
c = entry.getValue();
value = ((c.getAlpha() & 0xFF) << 24) |
((c.getRed() & 0xFF) << 16) |
((c.getGreen() & 0xFF) << 8) |
((c.getBlue() & 0xFF) << 0);
mergeChannels.put(entry.getKey(), value);
}
}
/**
* Sets the collection of channels active in the split view.
*
* @param splitActive The collection to set.
*/
public void setSplitActive(List<Integer> splitActive)
{
this.splitActive = splitActive;
}
/**
* Returns the collection of active channels.
*
* @return See above.
*/
public List<Integer> getSplitActive() { return splitActive; }
/**
* Sets to <code>true</code> if the names of the channels are merged
* and displayed next to the image, to <code>false</code> to display
* the default name.
*
* @param mergedLabel The value to set.
*/
public void setMergedLabel(boolean mergedLabel)
{
this.mergedLabel = mergedLabel;
}
/**
* Returns <code>true</code> if the names of the channels are merged
* and displayed next to the image, <code>false</code> to display
* the default name.
*
* @return See above.
*/
public boolean getMergedLabel() { return mergedLabel; }
/**
* Sets the time.
*
* @param time The value to set.
*/
public void setTime(int time)
{
switch (time) {
case TIME_SECS:
case TIME_MINS:
case TIME_HOURS:
case TIME_MINS_SECS:
case TIME_HOURS_MINS:
this.time = time;
break;
default:
this.time = TIME_SECS;
}
}
/**
* Returns the time as a string.
*
* @return See above.
*/
public String getTimeAsString()
{
switch (time) {
default:
case TIME_SECS: return "SECS";
case TIME_MINS: return "MINS";
case TIME_HOURS: return "HOURS";
case TIME_MINS_SECS: return "MINS SECS";
case TIME_HOURS_MINS: return "HOURS MINS";
}
}
/**
* Sets the index.
*
* @param index The value to set.
*/
public void setIndex(int index)
{
switch (index) {
case THUMBNAILS:
case SPLIT_VIEW_ROI:
case MOVIE:
this.index = index;
break;
case SPLIT_VIEW:
default:
this.index = SPLIT_VIEW;
}
}
/**
* Returns the index.
*
* @return See above.
*/
public int getIndex() { return index; }
/**
* Returns the channels composing the merge image.
*
* @return See above.
*/
public Map<Integer, Integer> getMergeChannels() { return mergeChannels; }
/**
* Returns the channels composing the split image.
*
* @return See above.
*/
public Map<Integer, String> getSplitChannels() { return splitChannels; }
/**
* Sets the width of an image composing the display.
*
* @param width The value to set.
*/
public void setWidth(int width) { this.width = width; }
/**
* Sets the height of an image composing the display.
*
* @param height The value to set.
*/
public void setHeight(int height) { this.height = height; }
/**
* Sets the length of the scale bar.
*
* @param scaleBar The value to set.
*/
public void setScaleBar(int scaleBar) { this.scaleBar = scaleBar; }
/**
* Sets the projection.
*
* @param type The value to set.
*/
public void setProjectionType(int type)
{
ProjectionParam.checkProjectionAlgorithm(type);
projectionType = type;
}
/**
* Passes <code>true</code> to display each image composing the split
* as greyScale, <code>false</code> to display as color.
*
* @param splitGrey The value to set.
*/
public void setSplitGrey(boolean splitGrey) { this.splitGrey = splitGrey; }
/**
* Returns <code>true</code> if the images composing the split view
* are greyScale, <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isSplitGrey() { return splitGrey; }
/**
* Sets the first z-section to project.
*
* @param zStart The value to set.
*/
public void setZStart(int zStart)
{
this.zStart = zStart;
}
/**
* Sets the last z-section to project.
*
* @param zEnd The value to set.
*/
public void setZEnd(int zEnd)
{
this.zEnd = zEnd;
}
/**
* Sets the projection stepping.
*
* @param stepping The value to set.
*/
public void setStepping(int stepping)
{
if (stepping < 1) stepping = 1;
this.stepping = stepping;
}
/**
* Returns the width of an image.
*
* @return See above.
*/
public int getWidth() { return width; }
/**
* Returns the height of an image.
*
* @return See above.
*/
public int getHeight() { return height; }
/**
* Returns the name of the file.
*
* @return See above.
*/
public String getName() { return name; }
/**
* Returns the scale Bar.
*
* @return See above.
*/
public int getScaleBar() { return scaleBar; }
/**
* Returns <code>true</code> if the scale bar is visible, <code>false</code>
* otherwise.
*
* @return See above.
*/
public boolean isScaleBarVisible() { return scaleBar <= 0; }
/**
* Returns the lower bound of the z-section interval.
*
* @return See above.
*/
public int getStartZ() { return zStart; }
/**
* Returns the upper bound of the z-section interval.
*
* @return See above.
*/
public int getEndZ() { return zEnd; }
/**
* Returns the format. One of the constants defined by this class.
*
* @return See above.
*/
public int getFormat() { return format; }
/**
* Sets the color of the scale bar.
*
* @param c The value to set.
*/
public void setColor(String c)
{
if (c == null || c.trim().length() == 0) return;
this.color = c;
}
/**
* Returns the color of the scale bar.
*
* @return See above.
*/
public String getColor() { return color; }
/**
* Returns the projection's algorithm.
*
* @return See above.
*/
public int getProjectionType() { return projectionType; }
/**
* Returns the gap between each step. Default is <code>1</code>.
*
* @return See above.
*/
public int getStepping() { return stepping; }
/**
* Returns the label as a string.
*
* @return See above.
*/
public String getLabelAsString()
{
switch (label) {
default:
case IMAGE_NAME: return "Image Name";
case DATASET_NAME: return "Datasets";
case TAG_NAME: return "Tags";
}
}
/**
* Returns the format as a string.
*
* @return See above.
*/
public String getFormatAsString() { return FORMATS.get(format); }
/**
* Returns the projection type as a string.
*
* @return See above.
*/
public String getProjectionTypeAsString()
{
if (projectionType == ProjectionParam.MAXIMUM_INTENSITY)
return "Maximum Intensity";
else if (projectionType == ProjectionParam.MEAN_INTENSITY)
return "Mean Intensity";
return "";
}
/**
* Sets the magnification factor.
*
* @param magnificationFactor The value to set.
*/
public void setMagnificationFactor(double magnificationFactor)
{
this.magnificationFactor = magnificationFactor;
}
/**
* Returns the magnification factor.
*
* @return See above.
*/
public double getMagnificationFactor()
{
return magnificationFactor;
}
/**
* Returns <code>true</code> to indicate that the selected objects will
* compose the figure, <code>false</code> to indicate that the displayed
* objects will compose the figure.
*
* @return See above.
*/
public boolean isSelectedObjects() { return selectedObjects; }
/**
* Sets to <code>true</code> to indicate that the selected objects will
* compose the figure, <code>false</code> to indicate that the displayed
* objects will compose the figure.
*
* @param value The value to set.
*/
public void setSelectedObjects(boolean value) { selectedObjects = value; }
/**
* Returns the tags.
*
* @return See above.
*/
public List<Long> getTags() { return tags; }
/**
* Sets the tags.
*
* @param tags The value to set.
*/
public void setTags(List<Long> tags) { this.tags = tags; }
/**
* Sets the selected timepoints.
*
* @param timepoints The selected values.
*/
public void setTimepoints(List<Integer> timepoints)
{
this.timepoints = timepoints;
}
/**
* Returns the selected timepoints.
*
* @return See above.
*/
public List<Integer> getTimepoints() { return timepoints; }
/**
* Sets to <code>true</code> if the images w/o tags are included into the
* figure, to <code>false</code> otherwise.
*
* @param includeUntagged Pass <code>true</code> to include,
* <code>false</code> to exclude.
*/
public void setIncludeUntagged(boolean includeUntagged)
{
this.includeUntagged = includeUntagged;
}
/**
* Returns to <code>true</code> if the images w/o tags are included into the
* figure, to <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isIncludeUntagged() { return includeUntagged; }
/**
* Sets the <code>DataObject</code> the figure will be attached to.
*
* @param anchor The value to set.
*/
public void setAnchor(omero.gateway.model.DataObject anchor) { this.anchor = anchor; }
/**
* Returns the <code>DataObject</code> the figure will be attached to.
*
* @return See above.
*/
public omero.gateway.model.DataObject getAnchor() { return anchor; }
/**
* Returns the name of the script associated to the index or
* <code>null</code> if index not set.
*
* @return See above.
*/
public String getScriptName()
{
switch (getIndex()) {
case FigureParam.SPLIT_VIEW_ROI:
return ROI_SCRIPT;
case FigureParam.THUMBNAILS:
return THUMBNAIL_SCRIPT;
case FigureParam.MOVIE:
return MOVIE_SCRIPT;
default:
return SPLIT_VIEW_SCRIPT;
}
}
/**
* Returns the maximum number of items per column.
*
* @return See above.
*/
public int getMaxPerColumn() { return maxPerColumn; }
/**
* Sets the maximum of items per columns.
*
* @param maxPerColumn The value to set.
*/
public void setMaxPerColumn(int maxPerColumn)
{
this.maxPerColumn = maxPerColumn;
}
}