/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2008 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.dataBrowser.browser;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import omero.gateway.model.TableResult;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import omero.gateway.model.ImageData;
import omero.gateway.model.WellData;
import omero.gateway.model.WellSampleData;
/**
* Handles the well samples related to the well.
*
* @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-Beta3
*/
public class WellImageSet
extends ImageSet
{
/** The String indicating how to display the value of the row. */
private String rowDisplay;
/** The String indicating how to display the value of the column. */
private String columnDisplay;
/** The selected well sample data. */
private ImageNode selectedWellSample;
/** Collection of well samples. */
private List<WellSampleNode> samples;
/** The description of the well. */
private String description;
/** The tabular data. */
private Map<String[], Object[]> tabularData;
/** The tooltip.*/
private List<String> text;
/** The value by which to shift the row by when laying out the cell.*/
private int indentRow;
/** The value by which to shift the column by when laying out the cell.*/
private int indentColumn;
/**
* Sets the default value for the row and column display.
* Sets the text displayed in the tool tip.
*/
private void setDefault()
{
if (rowDisplay == null) setRowDisplay(""+getRow());
if (columnDisplay == null) setColumnDisplay(""+getColumn());
}
/** Formats the tool tips. */
private void formatDisplay()
{
Entry<String[], Object[]> entry;
int size = tabularData.size()-1;
int index = 0;
Iterator<Entry<String[], Object[]>>
i = tabularData.entrySet().iterator();
String[] headers;
Object[] values;
text = new ArrayList<String>();
while (i.hasNext()) {
entry = i.next();
headers = entry.getKey();
values = entry.getValue();
for (int j = 0; j < headers.length; j++) {
text.add(" "+headers[j]+":"+values[j]);
}
if (index < size) text.add("--------------");
index++;
}
String txt = UIUtilities.formatToolTipText(text);
Iterator<WellSampleNode> j = samples.iterator();
WellSampleNode n;
while (j.hasNext()) {
n = j.next();
n.setToolTipText(txt);
n.setCanvasToolTip(txt);
}
}
/** Sets the color of the well. */
private void setWellColor()
{
WellData well = (WellData) getHierarchyObject();
int r = well.getRed();
int g = well.getGreen();
int b = well.getBlue();
int a = well.getAlpha();
if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255 &&
a >= 0 && a <= 255)
super.setHighlight(new Color(r, g, b, a));
}
/**
* Creates a new leaf node.
*
* @param well The original object in the image hierarchy which
* is visualized by this node. Never pass <code>null</code>.
*/
public WellImageSet(WellData well)
{
super("", well);
if (well == null)
throw new IllegalArgumentException("Well cannot be null.");
description = well.getWellType();
setWellColor();
samples = new ArrayList<WellSampleNode>();
setDefault();
rowDisplay = null;
columnDisplay = null;
indentRow = 0;
indentColumn = 0;
}
/**
* Sets the value by which to shift the row by when laying out the cell.
*
* @param indentRow The value to set.
*/
public void setIndentRow(int indentRow) { this.indentRow = indentRow; }
/**
* Sets the value by which to shift the row by when laying out the cell.
*
* @param indentColumn The value to set.
*/
public void setIndentColumn(int indentColumn)
{
this.indentColumn = indentColumn;
}
/**
* Returns the value by which to shift the row by when laying out the cell.
*
* @return See above.
*/
public int getIndentRow() { return indentRow; }
/**
* Returns the value by which to shift the row by when laying out the cell.
*
* @return See above.
*/
public int getIndentColumn() { return indentColumn; }
/**
* Returns the location of the well on the grid as a string.
*
* @return See above.
*/
public String getWellLocation()
{
StringBuffer buf = new StringBuffer();
buf.append(rowDisplay+"-"+columnDisplay);
return buf.toString();
}
/**
* Adds the passed well samples.
*
* @param node The value to add.
*/
public void addWellSample(WellSampleNode node)
{
if (node != null) samples.add(node);
setSelectedWellSample(0);
}
/**
* Sets the selected well sample.
*
* @param index The index of the well samples.
*/
public void setSelectedWellSample(int index)
{
WellSampleNode node;
Iterator<WellSampleNode> i = samples.iterator();
while (i.hasNext()) {
node = i.next();
if (node.getIndex() == index)
selectedWellSample = node;
}
}
/**
* Returns the selected well sample.
*
* @return See above.
*/
public ImageNode getSelectedWellSample() { return selectedWellSample; }
/**
* Returns all the well samples linked to that well.
*
* @return A <i>read-only</i> set containing all the child nodes.
*/
public List<WellSampleNode> getWellSamples()
{
return Collections.unmodifiableList(samples);
}
/** Formats the title of the wells.*/
public void formatWellSampleTitle()
{
if (samples == null || samples.size() == 0) return;
Iterator<WellSampleNode> i = samples.iterator();
WellSampleNode wsn;
while (i.hasNext()) {
wsn = i.next();
wsn.setTitle(getCellLabel());
wsn.setTitleBarType(ImageNode.SMALL_TITLE_BAR);
}
}
/**
* Returns the image corresponding to the currently selected wellSample.
*
* @return See above.
*/
public ImageData getSelectedImage()
{
if (selectedWellSample == null) return null;
WellSampleData
wsd = (WellSampleData) selectedWellSample.getHierarchyObject();
if (wsd == null) return null;
return wsd.getImage();
}
/**
* Returns the number of well samples.
*
* @return See above.
*/
public int getNumberOfSamples() { return samples.size(); }
/**
* Returns the position of the well within the plate.
*
* @return See above.
*/
public int getRow()
{
if (getHierarchyObject() == null) return -1;
Integer i = ((WellData) getHierarchyObject()).getRow();
if (i == null) return -1;
return i;
}
/**
* Returns the position of the well within the plate.
*
* @return See above.
*/
public int getColumn()
{
if (getHierarchyObject() == null) return -1;
Integer i = ((WellData) getHierarchyObject()).getColumn();
if (i == null) return -1;
return i;
}
/**
* Sets the value indicating how to display the row.
*
* @param rowDisplay The value to set.
*/
public void setRowDisplay(String rowDisplay)
{
this.rowDisplay = rowDisplay;
setDefault();
}
/**
* Sets the value indicating how to display the column.
*
* @param columnDisplay The value to set.
*/
public void setColumnDisplay(String columnDisplay)
{
this.columnDisplay = columnDisplay;
setDefault();
}
/**
* Sets the value indicating how to display the cell.
*
* @param columnDisplay The value to set.
* @param rowDisplay The value to set.
*/
public void setCellDisplay(String columnDisplay, String rowDisplay)
{
this.rowDisplay = rowDisplay;
this.columnDisplay = columnDisplay;
setDefault();
}
/**
* Returns the label associated to the well e.g. A 1.
*
* @return See above.
*/
public String getCellLabel()
{
return rowDisplay+" "+columnDisplay;
}
/**
* Sets the description.
*
* @param description The value to set.
*/
public void setDescription(String description)
{
this.description = description;
setDefault();
}
/**
* Sets the tabular data for the well.
*
* @param tables The tables to handle.
*/
public void setTabularData(List<TableResult> tables)
{
Iterator<TableResult> i = tables.iterator();
TableResult table;
int index;
Object[][] data;
long id;
long wellID = ((WellData) getHierarchyObject()).getId();
Object[] values;
tabularData = new HashMap<String[], Object[]>();
String[] headers;
while (i.hasNext()) {
table = i.next();
index = table.getColumnIndex(TableResult.WELL_COLUMN_INDEX);
if (index >= 0) {
data = table.getData();
headers = table.getHeaders();
values = new Object[headers.length];
for (int j = 0; j < data.length; j++) {
id = (Long) data[j][index];
if (id == wellID) {
for (int k = 0; k < values.length; k++) {
values[k] = data[j][k];
}
}
}
tabularData.put(headers, values);
}
}
formatDisplay();
}
/**
* Returns the text associated to the node.
*
* @return See above.
*/
public List<String> getText() { return text; }
/**
* Returns <code>true</code> if the selected well sample is valid,
* <code>false</code> otherwise.
*
* @return See above.
*/
public boolean isSampleValid()
{
ImageData img = getSelectedImage();
if (img == null) return false;
return img.getId() >= 0;
}
/**
* Overridden to make sure that the default color is set.
* @see ImageSet#setHighlight(Color)
*/
public void setHighlight(Color highlight)
{
super.setHighlight(highlight);
Iterator<WellSampleNode> i = samples.iterator();
while (i.hasNext()) {
i.next().setHighlight(highlight);
}
}
/**
* Overridden to return the name of the selected sample.
* @see ImageSet#getTitle()
*/
public String getTitle()
{
if (selectedWellSample == null) return "";
return selectedWellSample.getTitle();
}
}