/*
*------------------------------------------------------------------------------
* 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.agents.dataBrowser.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.util.List;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import org.jdesktop.swingx.JXTaskPane;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageNode;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.RollOverNode;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellImageSet;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellSampleNode;
/**
* Displays all the fields of a given 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
* <small>
* (<b>Internal version:</b> $Revision: $Date: $)
* </small>
* @since 3.0-Beta4
*/
class WellFieldsView
extends JPanel
{
/** The minimum value for the magnification w/o respect of distance. */
static final int MAGNIFICATION_UNSCALED_MIN = 1;
/** The maximum value for the magnification w/o respect of distance. */
static final int MAGNIFICATION_UNSCALED_MAX = 4;
/** Indicates to lay out the fields in a row. */
static final int ROW_LAYOUT = 0;
/** Indicates to lay out the fields in a spatial position. */
static final int SPATIAL_LAYOUT = 1;
/** Indicates the default layout. */
static final int DEFAULT_LAYOUT = SPATIAL_LAYOUT;
/** The width of the canvas. */
static final int DEFAULT_WIDTH = 512;
/** The height of the canvas. */
static final int DEFAULT_HEIGHT = 512;
/** The text for the selected well. */
private static final String DEFAULT_WELL_TEXT = "Well: ";
/** The text for the selected field. */
private static final String DEFAULT_FIELD_TEXT = "Field #";
/** The grid representing the plate. */
//private PlateGrid grid;
/** Reference to the model. */
private WellsModel model;
/** Reference to the controller. */
private DataBrowserControl controller;
/** Component displaying the thumbnails. */
private WellFieldsCanvas canvas;
/** The collection of nodes to display. */
private List<WellSampleNode> nodes;
/** The type of layout of the fields. */
private int layoutFields;
/** The currently selected well. */
private JLabel selectedNode;
/** The currently selected field. */
private JLabel selectedField;
/** The magnification factor. */
private double magnification;
/** The magnification not preserving the scale. */
private double magnificationUnscaled;
/** The component displaying the plate grid. */
private JXTaskPane plateTask;
/** Initializes the components. */
private void initComponents()
{
magnificationUnscaled = MAGNIFICATION_UNSCALED_MIN;
layoutFields = DEFAULT_LAYOUT;
selectedField = new JLabel();
WellImageSet node = model.getSelectedWell();
selectedNode = new JLabel();
if (node != null) {
selectedNode.setText(DEFAULT_WELL_TEXT+node.getWellLocation());
}
/*
grid = new PlateGrid(model.getRowSequenceIndex(),
model.getColumnSequenceIndex(), model.getValidWells(),
model.getRows(), model.getColumns());
grid.addPropertyChangeListener(controller);
WellImageSet node = model.getSelectedWell();
selectedNode = new JLabel();
if (node != null) {
selectedNode.setText(DEFAULT_WELL_TEXT+node.getWellLocation());
grid.selectCell(node.getRow(), node.getColumn());
}
*/
canvas = new WellFieldsCanvas(this);
canvas.addMouseListener(new MouseAdapter() {
/**
* Launches the viewer if the number of click is <code>2</code>.
* @see MouseListener#mouseEntered(MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
WellSampleNode node = canvas.getNode(e.getPoint());
if (node != null) {
model.setSelectedField(node);
if (e.getClickCount() == 2)
controller.viewDisplay(node);
}
}
/**
* Displays the field's metadata.
* @see MouseListener#mouseEntered(MouseEvent)
*/
public void mousePressed(MouseEvent e)
{
//WellSampleNode node = canvas.getNode(e.getPoint());
//if (node != null) model.setSelectedField(node);
}
});
canvas.addMouseMotionListener(new MouseMotionAdapter() {
/**
* Sets the node which has to be zoomed when the roll over flag
* is turned on. Note that the {@link ImageNode}s are the only nodes
* considered.
* @see MouseMotionListener#mouseMoved(MouseEvent)
*/
public void mouseMoved(MouseEvent e) {
if (model.getBrowser().isRollOver()) {
Point p = e.getPoint();
WellSampleNode node = canvas.getNode(p);
SwingUtilities.convertPointToScreen(p, canvas);
model.getBrowser().setRollOverNode(
new RollOverNode(node, p));
} else {
Point p = e.getPoint();
WellSampleNode node = canvas.getNode(p);
if (node != null) {
StringBuffer buffer = new StringBuffer();
buffer.append(DEFAULT_FIELD_TEXT+node.getIndex());
buffer.append("\n");
buffer.append("x="+node.getPositionX()+", " +
"y="+node.getPositionY());
String s = buffer.toString();
canvas.setToolTipText(s);
selectedField.setText(s);
} else {
canvas.setToolTipText("");
selectedField.setText("");
}
}
}
});
nodes = null;
}
/** Builds and lays out the UI. */
private void buildGUI()
{
setBorder(new LineBorder(new Color(99, 130, 191)));
setLayout(new BorderLayout(0, 0));
JScrollPane pane = new JScrollPane(canvas);
pane.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
add(pane, BorderLayout.CENTER);
/*
JPanel p = new JPanel();
double[][] size = {{TableLayout.PREFERRED, 5, TableLayout.PREFERRED},
{TableLayout.PREFERRED, TableLayout.PREFERRED,
TableLayout.FILL}};
p.setLayout(new TableLayout(size));
p.add(grid, "0, 0, 0, 2");
p.add(selectedNode, "2, 0, LEFT, TOP");
p.add(selectedField, "2, 1, LEFT, TOP");
plateTask = EditorUtil.createTaskPane("Plate");
plateTask.add(UIUtilities.buildComponentPanel(p));
plateTask.setCollapsed(false);
add(plateTask, BorderLayout.SOUTH);
*/
}
/**
* Creates a new instance.
*
* @param model Reference to the model.
* @param controller Reference to the control.
* @param magnification The default magnification.
*/
WellFieldsView(WellsModel model, DataBrowserControl controller, double
magnification)
{
this.model = model;
this.controller = controller;
this.magnification = magnification;
initComponents();
buildGUI();
}
/**
* Sets the index indicating how to layout the fields.
*
* @param layoutFields The value to set.
*/
void setLayoutFields(int layoutFields) { this.layoutFields = layoutFields; }
/**
* Returns the index identifying the type of layout of the fields.
*
* @return See above
*/
int getLayoutFields() { return layoutFields; }
/**
* Returns the fields to display if any.
*
* @return See above.
*/
List<WellSampleNode> getNodes() { return nodes; }
/**
* Displays the passed fields.
*
* @param nodes The nodes hosting the fields.
*/
void displayFields(List<WellSampleNode> nodes)
{
this.nodes = nodes;
if (nodes != null && nodes.size() > 0) {
WellSampleNode node = nodes.get(0);
if (node != null) {
selectedNode.setText(DEFAULT_WELL_TEXT+
node.getParentWell().getWellLocation());
selectedNode.repaint();
}
}
canvas.repaint();
}
/**
* Sets the magnification factor.
*
* @param factor The value to set.
*/
void setMagnificationFactor(double factor)
{
magnification = factor;
canvas.repaint();
}
/**
* Returns the magnification factor.
*
* @return See above.
*/
double getMagnification() { return magnification; }
/**
* Sets the magnification factor.
*
* @param factor The value to set.
*/
void setMagnificationUnscaled(double factor)
{
magnificationUnscaled = factor;
canvas.repaint();
}
/**
* Returns the magnification factor.
*
* @return See above.
*/
double getMagnificationUnscaled() { return magnificationUnscaled; }
}