mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/helpers/ExperimentClusterViewer.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2005, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4  */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: ExperimentClusterViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.10 $
2 26 Feb 07 jari 8  * $Date: 2006/05/02 16:56:57 $
2 26 Feb 07 jari 9  * $Author: eleanorahowe $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 package org.tigr.microarray.mev.cluster.gui.helpers;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import java.awt.Font;
2 26 Feb 07 jari 16 import java.awt.Color;
2 26 Feb 07 jari 17 import java.awt.Frame;
2 26 Feb 07 jari 18 import java.awt.Insets;
2 26 Feb 07 jari 19 import java.awt.Graphics;
2 26 Feb 07 jari 20 import java.awt.Rectangle;
2 26 Feb 07 jari 21 import java.awt.Dimension;
2 26 Feb 07 jari 22 import java.awt.Graphics2D;
2 26 Feb 07 jari 23 import java.awt.FontMetrics;
2 26 Feb 07 jari 24 import java.awt.GradientPaint;
2 26 Feb 07 jari 25 import java.awt.RenderingHints;
2 26 Feb 07 jari 26 import java.awt.event.ActionListener;
2 26 Feb 07 jari 27 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 28 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 29 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 30 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 31 import java.beans.Expression;
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 import java.io.IOException;
2 26 Feb 07 jari 34 import java.io.ObjectInputStream;
2 26 Feb 07 jari 35 import java.io.ObjectOutputStream;
2 26 Feb 07 jari 36 import java.util.Vector;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 import javax.swing.JPanel;
2 26 Feb 07 jari 39 import javax.swing.JComponent;
2 26 Feb 07 jari 40 import javax.swing.JMenuItem;
2 26 Feb 07 jari 41 import javax.swing.JOptionPane;
2 26 Feb 07 jari 42 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 43 import javax.swing.SwingUtilities;
2 26 Feb 07 jari 44
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 50 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 51
2 26 Feb 07 jari 52 import org.tigr.microarray.mev.cluster.clusterUtil.*;
2 26 Feb 07 jari 53
2 26 Feb 07 jari 54 public class ExperimentClusterViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 55     
2 26 Feb 07 jari 56     private static final float INITIAL_MAX_VALUE = 3f;
2 26 Feb 07 jari 57     private static final float INITIAL_MIN_VALUE = -3f;
2 26 Feb 07 jari 58     
2 26 Feb 07 jari 59     private static final String NO_EXPERIMENT_STR = "No Experiments in Cluster!";
2 26 Feb 07 jari 60     private static final Font ERROR_FONT = new Font("monospaced", Font.BOLD, 20);
2 26 Feb 07 jari 61     protected static final String STORE_CLUSTER_CMD = "store-cluster-cmd";
2 26 Feb 07 jari 62     protected static final String SET_DEF_COLOR_CMD = "set-def-color-cmd";
2 26 Feb 07 jari 63     protected static final String SAVE_CLUSTER_CMD = "save-cluster-cmd";
2 26 Feb 07 jari 64     protected static final String SAVE_ALL_CLUSTERS_CMD = "save-all-clusters-cmd";
2 26 Feb 07 jari 65     protected static final String LAUNCH_NEW_SESSION_CMD = "launch-new-session-cmd";
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     private ExperimentClusterHeader header;
2 26 Feb 07 jari 68     private Experiment experiment;
2 26 Feb 07 jari 69     private IFramework framework;
2 26 Feb 07 jari 70     private IData data;
2 26 Feb 07 jari 71     private int clusterIndex;
2 26 Feb 07 jari 72     private int[][] clusters;
2 26 Feb 07 jari 73     private int[] genesOrder;
2 26 Feb 07 jari 74     private Dimension elementSize = new Dimension(20, 5);
2 26 Feb 07 jari 75     private int labelIndex = -1;
2 26 Feb 07 jari 76     private boolean isAntiAliasing = true;
2 26 Feb 07 jari 77     private boolean isDrawBorders = true;
2 26 Feb 07 jari 78     private boolean isDrawAnnotations = true;
2 26 Feb 07 jari 79     public static Color missingColor = new Color(128, 128, 128);
2 26 Feb 07 jari 80     public static Color maskColor = new Color(255, 255, 255, 128);
2 26 Feb 07 jari 81     private float maxValue = INITIAL_MAX_VALUE;
2 26 Feb 07 jari 82     private float minValue = INITIAL_MIN_VALUE;
2 26 Feb 07 jari 83     private float midValue = 0.0f;
2 26 Feb 07 jari 84     private int firstSelectedRow = -1;
2 26 Feb 07 jari 85     private int lastSelectedRow  = -1;
2 26 Feb 07 jari 86     private int firstSelectedColumn = -1;
2 26 Feb 07 jari 87     private int lastSelectedColumn  = -1;
2 26 Feb 07 jari 88     public BufferedImage posColorImage = createGradientImage(Color.black, Color.red);
2 26 Feb 07 jari 89     public BufferedImage negColorImage = createGradientImage(Color.green, Color.black);
2 26 Feb 07 jari 90     private int annotationWidth;
2 26 Feb 07 jari 91     private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 92     private boolean hasCentroid = false;
2 26 Feb 07 jari 93     private float [][] centroids;
2 26 Feb 07 jari 94     private int contentWidth;
2 26 Feb 07 jari 95     
2 26 Feb 07 jari 96     private boolean showClusters = true;
2 26 Feb 07 jari 97     private boolean haveColorBar = false;
2 26 Feb 07 jari 98     
2 26 Feb 07 jari 99     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 100     private int exptID = 0;
2 26 Feb 07 jari 101     
2 26 Feb 07 jari 102     /**
2 26 Feb 07 jari 103      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 104      * experiment and clusters.
2 26 Feb 07 jari 105      *
2 26 Feb 07 jari 106      * @param experiment the experiment data.
2 26 Feb 07 jari 107      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 108      */
2 26 Feb 07 jari 109     public ExperimentClusterViewer(Experiment experiment, int[][] clusters) {
2 26 Feb 07 jari 110         this(experiment, clusters, true);
2 26 Feb 07 jari 111     }
2 26 Feb 07 jari 112     
2 26 Feb 07 jari 113     /**
2 26 Feb 07 jari 114      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 115      * experiment, clusters and draw annotations attribute.
2 26 Feb 07 jari 116      *
2 26 Feb 07 jari 117      * @param experiment the experiment data.
2 26 Feb 07 jari 118      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 119      * @param drawAnnotations true if this viewer must draw annotations.
2 26 Feb 07 jari 120      */
2 26 Feb 07 jari 121     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, boolean drawAnnotations) {
2 26 Feb 07 jari 122         this(experiment, clusters, null, drawAnnotations);
2 26 Feb 07 jari 123     }
2 26 Feb 07 jari 124     
2 26 Feb 07 jari 125     /**
2 26 Feb 07 jari 126      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 127      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 128      *
2 26 Feb 07 jari 129      * @param experiment the experiment data.
2 26 Feb 07 jari 130      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 131      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 132      * @param drawAnnotations true if this viewer must draw annotations.
2 26 Feb 07 jari 133      */
2 26 Feb 07 jari 134     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, int[] genesOrder, boolean drawAnnotations) {
2 26 Feb 07 jari 135         if (experiment == null) {
2 26 Feb 07 jari 136             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 137         }
2 26 Feb 07 jari 138         this.experiment = experiment;
2 26 Feb 07 jari 139         this.exptID = experiment.getId();
2 26 Feb 07 jari 140         this.clusters = clusters == null ? defSamplesOrder(experiment.getNumberOfSamples()) : clusters;
2 26 Feb 07 jari 141         this.genesOrder = genesOrder == null ? defGenesOrder(experiment.getNumberOfGenes()) : genesOrder;
2 26 Feb 07 jari 142         this.isDrawAnnotations = drawAnnotations;
2 26 Feb 07 jari 143         this.header = new ExperimentClusterHeader(this.experiment, this.clusters);
2 26 Feb 07 jari 144         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 145         setBackground(Color.white);
2 26 Feb 07 jari 146         Listener listener = new Listener();
2 26 Feb 07 jari 147         addMouseListener(listener);
2 26 Feb 07 jari 148         addMouseMotionListener(listener);
2 26 Feb 07 jari 149     }
2 26 Feb 07 jari 150     /*
2 26 Feb 07 jari 151     copy-paste this constructor into descendent classes
2 26 Feb 07 jari 152     /**
2 26 Feb 07 jari 153      * @inheritDoc
2 26 Feb 07 jari 154      *
2 26 Feb 07 jari 155     public ExperimentClusterViewer(int[][] clusters, int[] genesOrder, Boolean drawAnnotations, 
2 26 Feb 07 jari 156         Integer offset, ExperimentClusterHeader header, Boolean hasCentroid, float[][] centroids, 
2 26 Feb 07 jari 157       Dimension elementSize, Integer labelIndex, Integer exptID) {
2 26 Feb 07 jari 158         super(clusters, genesOrder, drawAnnotations, offset, header, hasCentroid, centroids, elementSize, labelIndex, exptID);
2 26 Feb 07 jari 159     }
2 26 Feb 07 jari 160     */
2 26 Feb 07 jari 161     public Expression getExpression(){
2 26 Feb 07 jari 162       return new Expression(this, this.getClass(), "new",
2 26 Feb 07 jari 163 //      new Object[]{clusters, genesOrder, new Boolean(this.isDrawAnnotations), new Integer(this.insets.left), this.header, new Boolean(this.hasCentroid), this.centroids, this.elementSize, new Integer(this.labelIndex), new Integer(this.exptID)});  
2 26 Feb 07 jari 164           new Object[]{experiment, clusters, genesOrder, new Boolean(isDrawAnnotations), new Integer(this.insets.left)});
2 26 Feb 07 jari 165     } 
2 26 Feb 07 jari 166     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, int[] genesOrder, Boolean drawAnnotations, Integer offset){
2 26 Feb 07 jari 167       this(experiment, clusters, genesOrder, drawAnnotations.booleanValue(), offset.intValue());
2 26 Feb 07 jari 168     }
2 26 Feb 07 jari 169     /**
2 26 Feb 07 jari 170      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 171      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 172      *
2 26 Feb 07 jari 173      * @param experiment the experiment data.
2 26 Feb 07 jari 174      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 175      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 176      * @param drawAnnotations true if this viewer must draw annotations.
2 26 Feb 07 jari 177      */
2 26 Feb 07 jari 178     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, int[] genesOrder, boolean drawAnnotations, int offset) {
2 26 Feb 07 jari 179         if (experiment == null) {
2 26 Feb 07 jari 180             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 181         }
2 26 Feb 07 jari 182         this.experiment = experiment;
2 26 Feb 07 jari 183         this.exptID = experiment.getId();
2 26 Feb 07 jari 184         this.clusters = clusters == null ? defSamplesOrder(experiment.getNumberOfSamples()) : clusters;
2 26 Feb 07 jari 185         this.genesOrder = genesOrder == null ? defGenesOrder(experiment.getNumberOfGenes()) : genesOrder;
2 26 Feb 07 jari 186         this.insets.left = offset;
2 26 Feb 07 jari 187         this.isDrawAnnotations = drawAnnotations;
2 26 Feb 07 jari 188         this.header = new ExperimentClusterHeader(this.experiment, this.clusters);
2 26 Feb 07 jari 189         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 190         this.header.setLeftInset(offset);
2 26 Feb 07 jari 191         setBackground(Color.white);
2 26 Feb 07 jari 192         Listener listener = new Listener();
2 26 Feb 07 jari 193         addMouseListener(listener);
2 26 Feb 07 jari 194         addMouseMotionListener(listener);
2 26 Feb 07 jari 195     }
2 26 Feb 07 jari 196     
2 26 Feb 07 jari 197     
2 26 Feb 07 jari 198     /**
2 26 Feb 07 jari 199      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 200      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 201      *
2 26 Feb 07 jari 202      * @param experiment the experiment data.
2 26 Feb 07 jari 203      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 204      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 205      * @param drawAnnotations true if this viewer must draw annotations.
2 26 Feb 07 jari 206      */
2 26 Feb 07 jari 207     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, String centroidName, Vector vector) {
2 26 Feb 07 jari 208         this(experiment, clusters, centroidName, getCentroidArray(clusters, vector));
2 26 Feb 07 jari 209     }
2 26 Feb 07 jari 210     
2 26 Feb 07 jari 211     /**
2 26 Feb 07 jari 212      * Constructs an <code>ExperimentClusterViewer</code> with specified
2 26 Feb 07 jari 213      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 214      *
2 26 Feb 07 jari 215      * @param experiment the experiment data.
2 26 Feb 07 jari 216      * @param clusters the two dimensional array with spots indices.
2 26 Feb 07 jari 217      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 218      * @param drawAnnotations true if this viewer must draw annotations.
2 26 Feb 07 jari 219      */
2 26 Feb 07 jari 220     public ExperimentClusterViewer(Experiment experiment, int[][] clusters, String centroidName, float [][] centroids) {
2 26 Feb 07 jari 221         if (experiment == null) {
2 26 Feb 07 jari 222             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 223         }
2 26 Feb 07 jari 224         this.experiment = experiment;
2 26 Feb 07 jari 225         this.exptID = experiment.getId();
2 26 Feb 07 jari 226         this.clusters = clusters == null ? defSamplesOrder(experiment.getNumberOfSamples()) : clusters;
2 26 Feb 07 jari 227         this.genesOrder = genesOrder == null ? defGenesOrder(experiment.getNumberOfGenes()) : genesOrder;
2 26 Feb 07 jari 228         this.insets.left = 10;
2 26 Feb 07 jari 229         this.isDrawAnnotations = true;
2 26 Feb 07 jari 230         if(centroidName != null){
2 26 Feb 07 jari 231             hasCentroid = true;
2 26 Feb 07 jari 232             this.centroids = centroids;
2 26 Feb 07 jari 233         }
2 26 Feb 07 jari 234         this.header = new ExperimentClusterHeader(this.experiment, this.clusters, centroidName);
2 26 Feb 07 jari 235         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 236         setBackground(Color.white);
2 26 Feb 07 jari 237         Listener listener = new Listener();
2 26 Feb 07 jari 238         addMouseListener(listener);
2 26 Feb 07 jari 239         addMouseMotionListener(listener);
2 26 Feb 07 jari 240     }
2 26 Feb 07 jari 241     
2 26 Feb 07 jari 242     /**
2 26 Feb 07 jari 243      * Builds an ExperimentClusterViewer in the state specified by an xml file.  Used by XMLDecoder to restore the saved
2 26 Feb 07 jari 244      * state of an ExperimentClusterViewer.  This constructor must work in concert with the setExperiment() 
2 26 Feb 07 jari 245      * method.  
2 26 Feb 07 jari 246      * 
2 26 Feb 07 jari 247      * @param clusters
2 26 Feb 07 jari 248      * @param genesOrder
2 26 Feb 07 jari 249      * @param drawAnnotations
2 26 Feb 07 jari 250      * @param offset
2 26 Feb 07 jari 251      * @param header
2 26 Feb 07 jari 252      * @param hasCentroid
2 26 Feb 07 jari 253      * @param centroids
2 26 Feb 07 jari 254      * @param elementSize
2 26 Feb 07 jari 255      * @param labelIndex
2 26 Feb 07 jari 256      * @param exptID
2 26 Feb 07 jari 257      
2 26 Feb 07 jari 258     public ExperimentClusterViewer(int[][] clusters, int[] genesOrder, Boolean drawAnnotations, 
2 26 Feb 07 jari 259         Integer offset, ExperimentClusterHeader header, Boolean hasCentroid, float[][] centroids, 
2 26 Feb 07 jari 260       Dimension elementSize, Integer labelIndex, Integer exptID) {
2 26 Feb 07 jari 261       this.clusters = clusters;
2 26 Feb 07 jari 262         this.genesOrder = genesOrder;
2 26 Feb 07 jari 263         this.insets.left = offset.intValue();
2 26 Feb 07 jari 264         this.isDrawAnnotations = drawAnnotations.booleanValue();
2 26 Feb 07 jari 265         this.hasCentroid = hasCentroid.booleanValue();
2 26 Feb 07 jari 266         this.centroids = centroids;
2 26 Feb 07 jari 267         this.elementSize = elementSize;
2 26 Feb 07 jari 268         this.labelIndex = labelIndex.intValue();
2 26 Feb 07 jari 269         this.header = header;
2 26 Feb 07 jari 270         this.header.setData(data);
2 26 Feb 07 jari 271         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 272         this.header.setLeftInset(offset.intValue());
2 26 Feb 07 jari 273         this.exptID = exptID.intValue();
2 26 Feb 07 jari 274         setBackground(Color.white);
2 26 Feb 07 jari 275         Listener listener = new Listener();
2 26 Feb 07 jari 276         addMouseListener(listener);
2 26 Feb 07 jari 277         addMouseMotionListener(listener);
2 26 Feb 07 jari 278     }
2 26 Feb 07 jari 279 */
2 26 Feb 07 jari 280     public void setExperiment(Experiment e) {
2 26 Feb 07 jari 281       this.experiment = e;
2 26 Feb 07 jari 282         this.exptID = e.getId();
2 26 Feb 07 jari 283         this.header.setExperiment(e);
2 26 Feb 07 jari 284     }
2 26 Feb 07 jari 285
2 26 Feb 07 jari 286     private static int[][] defSamplesOrder(int size) {
2 26 Feb 07 jari 287         int[][] order = new int[1][size];
2 26 Feb 07 jari 288         for (int i=0; i<order[0].length; i++) {
2 26 Feb 07 jari 289             order[0][i] = i;
2 26 Feb 07 jari 290         }
2 26 Feb 07 jari 291         return order;
2 26 Feb 07 jari 292     }
2 26 Feb 07 jari 293     
2 26 Feb 07 jari 294     private static int[] defGenesOrder(int size) {
2 26 Feb 07 jari 295         int[] order = new int[size];
2 26 Feb 07 jari 296         for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 297             order[i] = i;
2 26 Feb 07 jari 298         }
2 26 Feb 07 jari 299         return order;
2 26 Feb 07 jari 300     }
2 26 Feb 07 jari 301     
2 26 Feb 07 jari 302     private static float [][] getCentroidArray(int [][] clusters, Vector vector){
2 26 Feb 07 jari 303         int len = vector.size();
2 26 Feb 07 jari 304         float [][] array = new float[clusters.length][len];
2 26 Feb 07 jari 305         for(int i = 0; i < clusters.length; i++){
2 26 Feb 07 jari 306             for(int j = 0; j < len; j++){
2 26 Feb 07 jari 307                 array[i][j] = ((Float)(vector.elementAt(j))).floatValue();
2 26 Feb 07 jari 308             }
2 26 Feb 07 jari 309         }
2 26 Feb 07 jari 310         return array;
2 26 Feb 07 jari 311     }
2 26 Feb 07 jari 312     
2 26 Feb 07 jari 313     /**
2 26 Feb 07 jari 314      * Returns component to render the experiment header.
2 26 Feb 07 jari 315      */
2 26 Feb 07 jari 316     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 317         return header;
2 26 Feb 07 jari 318     }
2 26 Feb 07 jari 319     
2 26 Feb 07 jari 320     /**
2 26 Feb 07 jari 321      * Returns component to render the experiment values.
2 26 Feb 07 jari 322      */
2 26 Feb 07 jari 323     public JComponent getContentComponent() {
2 26 Feb 07 jari 324         return this;
2 26 Feb 07 jari 325     }
2 26 Feb 07 jari 326     
2 26 Feb 07 jari 327     /**
2 26 Feb 07 jari 328      * Returns null.
2 26 Feb 07 jari 329      */
2 26 Feb 07 jari 330     public BufferedImage getImage() {
2 26 Feb 07 jari 331         return null;
2 26 Feb 07 jari 332     }
2 26 Feb 07 jari 333     
2 26 Feb 07 jari 334     /**
2 26 Feb 07 jari 335      * Returns a gradient image for positive values.
2 26 Feb 07 jari 336      */
2 26 Feb 07 jari 337     public BufferedImage getPosColorImage() {
2 26 Feb 07 jari 338         return posColorImage;
2 26 Feb 07 jari 339     }
2 26 Feb 07 jari 340     
2 26 Feb 07 jari 341     /**
2 26 Feb 07 jari 342      * Returns a gradient image for negative values.
2 26 Feb 07 jari 343      */
2 26 Feb 07 jari 344     public BufferedImage getNegColorImage() {
2 26 Feb 07 jari 345         return negColorImage;
2 26 Feb 07 jari 346     }
2 26 Feb 07 jari 347     
2 26 Feb 07 jari 348     /**
2 26 Feb 07 jari 349      * Returns a color assigned for a NaN value.
2 26 Feb 07 jari 350      */
2 26 Feb 07 jari 351     public Color getMissingColor() {
2 26 Feb 07 jari 352         return missingColor;
2 26 Feb 07 jari 353     }
2 26 Feb 07 jari 354     
2 26 Feb 07 jari 355     /**
2 26 Feb 07 jari 356      * Get current number of experiments
2 26 Feb 07 jari 357      */
2 26 Feb 07 jari 358     public int getCurrentNumberOfExperiments(){
2 26 Feb 07 jari 359         return getClusters()[clusterIndex].length;
2 26 Feb 07 jari 360     }
2 26 Feb 07 jari 361     
2 26 Feb 07 jari 362     /**
2 26 Feb 07 jari 363      * Selects rows from start to end.
2 26 Feb 07 jari 364      */
2 26 Feb 07 jari 365     public void selectRows(int start, int end) {
2 26 Feb 07 jari 366         firstSelectedRow = start;
2 26 Feb 07 jari 367         lastSelectedRow  = end;
2 26 Feb 07 jari 368         repaint();
2 26 Feb 07 jari 369     }
2 26 Feb 07 jari 370     
2 26 Feb 07 jari 371     /**
2 26 Feb 07 jari 372      * Selects columns from start to end.
2 26 Feb 07 jari 373      */
2 26 Feb 07 jari 374     public void selectColumns(int start, int end) {
2 26 Feb 07 jari 375         firstSelectedColumn = start;
2 26 Feb 07 jari 376         lastSelectedColumn  = end;
2 26 Feb 07 jari 377         repaint();
2 26 Feb 07 jari 378     }
2 26 Feb 07 jari 379     
2 26 Feb 07 jari 380     /**
2 26 Feb 07 jari 381      * Initializes appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 382      * @see IViewer#onSelected
2 26 Feb 07 jari 383      */
2 26 Feb 07 jari 384     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 385         this.framework = framework;
2 26 Feb 07 jari 386         this.data = framework.getData();
2 26 Feb 07 jari 387         IDisplayMenu menu = framework.getDisplayMenu();
2 26 Feb 07 jari 388         this.useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 389         header.setUseDoubleGradient(useDoubleGradient);
2 26 Feb 07 jari 390         Integer userObject = (Integer)framework.getUserObject();
2 26 Feb 07 jari 391         setClusterIndex(userObject == null ? 0 : userObject.intValue());
2 26 Feb 07 jari 392         header.setClusterIndex(this.clusterIndex);
2 26 Feb 07 jari 393         labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 394         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 395         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 396         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 397         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 398         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 399         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 400         if(showClusters)
2 26 Feb 07 jari 401             haveColorBar = areProbesColored();
2 26 Feb 07 jari 402         else
2 26 Feb 07 jari 403             haveColorBar = false;
2 26 Feb 07 jari 404         updateSize();
2 26 Feb 07 jari 405         header.setData(data);
2 26 Feb 07 jari 406         onMenuChanged(menu);
2 26 Feb 07 jari 407         //header.setValues(maxValue, minValue);
2 26 Feb 07 jari 408         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 409         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 410         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 411     }
2 26 Feb 07 jari 412     
2 26 Feb 07 jari 413     /**
2 26 Feb 07 jari 414      * Updates appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 415      * @see IViewer#onMenuChanged
2 26 Feb 07 jari 416      */
2 26 Feb 07 jari 417     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 418       this.useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 419         header.setUseDoubleGradient(useDoubleGradient);      
2 26 Feb 07 jari 420         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 421         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 422         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 423         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 424         //header.setValues(maxValue, minValue);
2 26 Feb 07 jari 425         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 426         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 427         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 428         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 429         if (this.elementSize.equals(menu.getElementSize()) &&
2 26 Feb 07 jari 430         labelIndex == menu.getLabelIndex() &&
2 26 Feb 07 jari 431         this.isAntiAliasing == menu.isAntiAliasing()) {
2 26 Feb 07 jari 432             return;
2 26 Feb 07 jari 433         }
2 26 Feb 07 jari 434         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 435         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 436         labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 437         updateSize();
2 26 Feb 07 jari 438         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 439         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 440     }
2 26 Feb 07 jari 441     
2 26 Feb 07 jari 442     /**
2 26 Feb 07 jari 443      * Sets data for this viewer and its header.
2 26 Feb 07 jari 444      * @see IViewer#onDataChanged
2 26 Feb 07 jari 445      */
2 26 Feb 07 jari 446     public void onDataChanged(IData data) {
2 26 Feb 07 jari 447         this.data = data;
2 26 Feb 07 jari 448         this.header.setData(data);
2 26 Feb 07 jari 449         if(showClusters)
2 26 Feb 07 jari 450             haveColorBar = areProbesColored();
2 26 Feb 07 jari 451         else
2 26 Feb 07 jari 452             haveColorBar = false;
2 26 Feb 07 jari 453         updateSize();
2 26 Feb 07 jari 454     }
2 26 Feb 07 jari 455     
2 26 Feb 07 jari 456     public void onDeselected() {}
2 26 Feb 07 jari 457     public void onClosed() {}
2 26 Feb 07 jari 458     
2 26 Feb 07 jari 459     /**
2 26 Feb 07 jari 460      * Sets cluster index to be displayed.
2 26 Feb 07 jari 461      */
2 26 Feb 07 jari 462     public void setClusterIndex(int clusterIndex) {
2 26 Feb 07 jari 463         this.clusterIndex = clusterIndex;
2 26 Feb 07 jari 464     }
2 26 Feb 07 jari 465     
2 26 Feb 07 jari 466     /**
2 26 Feb 07 jari 467      * Returns index of current cluster.
2 26 Feb 07 jari 468      */
2 26 Feb 07 jari 469     public int getClusterIndex() {
2 26 Feb 07 jari 470         return clusterIndex;
2 26 Feb 07 jari 471     }
2 26 Feb 07 jari 472     
2 26 Feb 07 jari 473     /**
2 26 Feb 07 jari 474      * Returns indices of current cluster.
2 26 Feb 07 jari 475      */
2 26 Feb 07 jari 476     public int[] getCluster() {
2 26 Feb 07 jari 477         return clusters[this.clusterIndex];
2 26 Feb 07 jari 478     }
2 26 Feb 07 jari 479     
2 26 Feb 07 jari 480     /**
2 26 Feb 07 jari 481      * Returns all the clusters.
2 26 Feb 07 jari 482      */
2 26 Feb 07 jari 483     public int[][] getClusters() {
2 26 Feb 07 jari 484         return clusters;
2 26 Feb 07 jari 485     }
2 26 Feb 07 jari 486     
2 26 Feb 07 jari 487     /**
2 26 Feb 07 jari 488      * returns true if a probe in the current viewer has color
2 26 Feb 07 jari 489      */
2 26 Feb 07 jari 490     protected  boolean areProbesColored() {
2 26 Feb 07 jari 491         int [] indices = this.genesOrder;
2 26 Feb 07 jari 492         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 493             if( this.data.getProbeColor(this.getMultipleArrayDataRow(i)) != null){
2 26 Feb 07 jari 494                 return true;
2 26 Feb 07 jari 495             }
2 26 Feb 07 jari 496         }
2 26 Feb 07 jari 497         return false;
2 26 Feb 07 jari 498     }
2 26 Feb 07 jari 499     
2 26 Feb 07 jari 500     /**
2 26 Feb 07 jari 501      *  Returns the row (index) within the main iData which corresponds to
2 26 Feb 07 jari 502      *  the passed index to the clusters array
2 26 Feb 07 jari 503      */
2 26 Feb 07 jari 504     private int getMultipleArrayDataRow(int clusterArrayRow) {
2 26 Feb 07 jari 505         return experiment.getGeneIndexMappedToData(genesOrder[clusterArrayRow]);
2 26 Feb 07 jari 506     }
2 26 Feb 07 jari 507     
2 26 Feb 07 jari 508     /**
2 26 Feb 07 jari 509      *  Returns the row index in the experiment's <code>FloatMatrix<\code>
2 26 Feb 07 jari 510      *  corresponding to the passed index to the clusters array
2 26 Feb 07 jari 511      */
2 26 Feb 07 jari 512     private int getExperimentRow(int row){
2 26 Feb 07 jari 513         return genesOrder[row];
2 26 Feb 07 jari 514     }
2 26 Feb 07 jari 515     
2 26 Feb 07 jari 516     
2 26 Feb 07 jari 517     
2 26 Feb 07 jari 518     private int getColumn(int column) {
2 26 Feb 07 jari 519         return this.clusters[this.clusterIndex][column];
2 26 Feb 07 jari 520     }
2 26 Feb 07 jari 521     
2 26 Feb 07 jari 522     /**
2 26 Feb 07 jari 523      * Returns wrapped experiment.
2 26 Feb 07 jari 524      */
2 26 Feb 07 jari 525     public Experiment getExperiment() {
2 26 Feb 07 jari 526         return experiment;
2 26 Feb 07 jari 527     }
2 26 Feb 07 jari 528     
2 26 Feb 07 jari 529     /**
2 26 Feb 07 jari 530      * Returns the data.
2 26 Feb 07 jari 531      */
2 26 Feb 07 jari 532     protected IData getData() {
2 26 Feb 07 jari 533         return data;
2 26 Feb 07 jari 534     }
2 26 Feb 07 jari 535     
2 26 Feb 07 jari 536     /**
2 26 Feb 07 jari 537      * Sets public color for the current cluster.
2 26 Feb 07 jari 538      */
2 26 Feb 07 jari 539     public void setClusterColor(Color color) {
2 26 Feb 07 jari 540         if(color == null){  //indicates removal of cluster
2 26 Feb 07 jari 541             framework.removeCluster(getCluster(), experiment, ClusterRepository.EXPERIMENT_CLUSTER);
2 26 Feb 07 jari 542         } 
2 26 Feb 07 jari 543     }
2 26 Feb 07 jari 544     
2 26 Feb 07 jari 545     /**
2 26 Feb 07 jari 546      * Sets public color for the current cluster.
2 26 Feb 07 jari 547      */
2 26 Feb 07 jari 548     public void storeCluster() {
2 26 Feb 07 jari 549         framework.storeCluster(getCluster(), experiment, ClusterRepository.EXPERIMENT_CLUSTER);
2 26 Feb 07 jari 550         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 551         this.onDataChanged(this.data);
2 26 Feb 07 jari 552     }
2 26 Feb 07 jari 553     
2 26 Feb 07 jari 554     /**
2 26 Feb 07 jari 555      * Sets public color for the current cluster.
2 26 Feb 07 jari 556      */
2 26 Feb 07 jari 557     public Color setHCLClusterColor(int [] clusterIndices, Color color, boolean isGeneHCLCluster) {
2 26 Feb 07 jari 558      //   if(isGeneHCLCluster)
2 26 Feb 07 jari 559     //        this.data.setProbesColor(clusterIndices, color);
2 26 Feb 07 jari 560     //    else
2 26 Feb 07 jari 561     //        this.data.setExperimentColor(clusterIndices, color);
2 26 Feb 07 jari 562         
2 26 Feb 07 jari 563         Color clusterColor = null;
2 26 Feb 07 jari 564         if(isGeneHCLCluster)
2 26 Feb 07 jari 565             clusterColor = framework.storeCluster(clusterIndices, experiment, ClusterRepository.GENE_CLUSTER);
2 26 Feb 07 jari 566         else
2 26 Feb 07 jari 567             clusterColor = framework.storeCluster(clusterIndices, experiment, ClusterRepository.EXPERIMENT_CLUSTER);
2 26 Feb 07 jari 568
2 26 Feb 07 jari 569         
2 26 Feb 07 jari 570         this.selectColumns(-1,-1);
2 26 Feb 07 jari 571         this.selectRows(-1,-1);
2 26 Feb 07 jari 572         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 573         this.header.repaint();
2 26 Feb 07 jari 574         this.repaint();
2 26 Feb 07 jari 575         return clusterColor;
2 26 Feb 07 jari 576     }
2 26 Feb 07 jari 577     
2 26 Feb 07 jari 578     /**
2 26 Feb 07 jari 579      * Converts cluster indicies from the experiment to IData rows which could be different
2 26 Feb 07 jari 580      */
2 26 Feb 07 jari 581     private int [] getIDataRowIndices(int [] expIndices){
2 26 Feb 07 jari 582         int [] dataIndices = new int[expIndices.length];
2 26 Feb 07 jari 583         for(int i = 0; i < expIndices.length; i++){
2 26 Feb 07 jari 584             dataIndices[i] = this.getMultipleArrayDataRow(i);
2 26 Feb 07 jari 585         }
2 26 Feb 07 jari 586         return dataIndices;
2 26 Feb 07 jari 587     }
2 26 Feb 07 jari 588     
2 26 Feb 07 jari 589     /**
2 26 Feb 07 jari 590      * Saves all the clusters.
2 26 Feb 07 jari 591      */
2 26 Feb 07 jari 592     public void saveClusters(Frame frame) throws Exception {
2 26 Feb 07 jari 593         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 594         ExperimentUtil.saveAllExperimentClusters(frame, getExperiment(), getData(), getClusters());
2 26 Feb 07 jari 595     }
2 26 Feb 07 jari 596     
2 26 Feb 07 jari 597     /**
2 26 Feb 07 jari 598      * Saves current cluster.
2 26 Feb 07 jari 599      */
2 26 Feb 07 jari 600     public void saveCluster(Frame frame) throws Exception {
2 26 Feb 07 jari 601         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 602         ExperimentUtil.saveExperimentCluster(frame, getExperiment(), getData(), getCluster());
2 26 Feb 07 jari 603     }
2 26 Feb 07 jari 604     
2 26 Feb 07 jari 605     /**
2 26 Feb 07 jari 606      * Launches a new <code>MultipleExperimentViewer</code> containing the current cluster
2 26 Feb 07 jari 607      */
2 26 Feb 07 jari 608     public void launchNewSession(){
2 26 Feb 07 jari 609         framework.launchNewMAV(getCluster(), this.experiment, "Multiple Experiment Viewer - Cluster Viewer", Cluster.EXPERIMENT_CLUSTER);
2 26 Feb 07 jari 610     }
2 26 Feb 07 jari 611     
2 26 Feb 07 jari 612     /**
2 26 Feb 07 jari 613      * Sets a shape size.
2 26 Feb 07 jari 614      */
2 26 Feb 07 jari 615     private void setElementSize(Dimension elementSize) {
2 26 Feb 07 jari 616         this.elementSize = new Dimension(elementSize);
2 26 Feb 07 jari 617     }
2 26 Feb 07 jari 618     
2 26 Feb 07 jari 619     /**
2 26 Feb 07 jari 620      * Sets anti-aliasing attribute.
2 26 Feb 07 jari 621      */
2 26 Feb 07 jari 622     private void setAntialiasing(boolean value) {
2 26 Feb 07 jari 623         this.isAntiAliasing = value;
2 26 Feb 07 jari 624     }
2 26 Feb 07 jari 625     
2 26 Feb 07 jari 626     /**
2 26 Feb 07 jari 627      * Sets draw borders attribute.
2 26 Feb 07 jari 628      */
2 26 Feb 07 jari 629     private void setDrawBorders(boolean value) {
2 26 Feb 07 jari 630         this.isDrawBorders = value;
2 26 Feb 07 jari 631     }
2 26 Feb 07 jari 632     
2 26 Feb 07 jari 633     /**
2 26 Feb 07 jari 634      * Creates a gradient image with specified initial colors.
2 26 Feb 07 jari 635      */
2 26 Feb 07 jari 636     public BufferedImage createGradientImage(Color color1, Color color2) {
2 26 Feb 07 jari 637         BufferedImage image = (BufferedImage)java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(256,1);       
2 26 Feb 07 jari 638         Graphics2D graphics = image.createGraphics();
2 26 Feb 07 jari 639         GradientPaint gp = new GradientPaint(0, 0, color1, 255, 0, color2);
2 26 Feb 07 jari 640         graphics.setPaint(gp);
2 26 Feb 07 jari 641         graphics.drawRect(0, 0, 255, 1);
2 26 Feb 07 jari 642         return image;
2 26 Feb 07 jari 643     }
2 26 Feb 07 jari 644     
2 26 Feb 07 jari 645     /**
2 26 Feb 07 jari 646      * Updates size of this viewer.
2 26 Feb 07 jari 647      */
2 26 Feb 07 jari 648     private void updateSize() {
2 26 Feb 07 jari 649         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 650             setFont(ERROR_FONT);
2 26 Feb 07 jari 651             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 652             FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 653             int width = metrics.stringWidth(NO_EXPERIMENT_STR)+10;
2 26 Feb 07 jari 654             int height = metrics.getHeight()+30;
2 26 Feb 07 jari 655             setSize(width, height);
2 26 Feb 07 jari 656             setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 657             return;
2 26 Feb 07 jari 658         }
2 26 Feb 07 jari 659         setFont(new Font("monospaced", Font.PLAIN, elementSize.height));
2 26 Feb 07 jari 660         Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 661         int width = elementSize.width*getCluster().length+1 + insets.left;
2 26 Feb 07 jari 662         if (isDrawAnnotations) {
2 26 Feb 07 jari 663             this.annotationWidth = getMaxWidth(g);
2 26 Feb 07 jari 664             width += 20+this.annotationWidth;
2 26 Feb 07 jari 665         }
2 26 Feb 07 jari 666         
2 26 Feb 07 jari 667         if(this.hasCentroid)  //width of experiment centroid
2 26 Feb 07 jari 668             width += elementSize.width + 5;
2 26 Feb 07 jari 669         
2 26 Feb 07 jari 670         if(haveColorBar)
2 26 Feb 07 jari 671             width += this.elementSize.width + 10;
2 26 Feb 07 jari 672         
2 26 Feb 07 jari 673         int height = elementSize.height*genesOrder.length+1;
2 26 Feb 07 jari 674         
2 26 Feb 07 jari 675         this.contentWidth = width;
2 26 Feb 07 jari 676         setSize(width, height);
2 26 Feb 07 jari 677         setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 678     }
2 26 Feb 07 jari 679     
2 26 Feb 07 jari 680     public int getContentWidth(){
2 26 Feb 07 jari 681         return this.contentWidth;
2 26 Feb 07 jari 682     }
2 26 Feb 07 jari 683     
2 26 Feb 07 jari 684     /**
2 26 Feb 07 jari 685      * Returns max width of annotation strings.
2 26 Feb 07 jari 686      */
2 26 Feb 07 jari 687     private int getMaxWidth(Graphics2D g) {
2 26 Feb 07 jari 688         if (g == null || data == null || getCluster() == null) {
2 26 Feb 07 jari 689             return 0;
2 26 Feb 07 jari 690         }
2 26 Feb 07 jari 691         if (isAntiAliasing) {
2 26 Feb 07 jari 692             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 693             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 694         }
2 26 Feb 07 jari 695         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 696         int max = 0;
2 26 Feb 07 jari 697         String str;
2 26 Feb 07 jari 698         for (int i=0; i<genesOrder.length; i++) {
2 26 Feb 07 jari 699             str = data.getElementAttribute(getMultipleArrayDataRow(i), labelIndex);
2 26 Feb 07 jari 700             max = Math.max(max, fm.stringWidth(str));
2 26 Feb 07 jari 701         }
2 26 Feb 07 jari 702         return max;
2 26 Feb 07 jari 703     }
2 26 Feb 07 jari 704         
2 26 Feb 07 jari 705    
2 26 Feb 07 jari 706     /**
2 26 Feb 07 jari 707      * Calculates color for passed value.
2 26 Feb 07 jari 708      */
2 26 Feb 07 jari 709     private Color getColor(float value) {
2 26 Feb 07 jari 710         if (Float.isNaN(value)) {
2 26 Feb 07 jari 711             return missingColor;
2 26 Feb 07 jari 712         }
2 26 Feb 07 jari 713         
2 26 Feb 07 jari 714         float maximum;
2 26 Feb 07 jari 715         int colorIndex, rgb;
2 26 Feb 07 jari 716         
2 26 Feb 07 jari 717         if(useDoubleGradient) {
2 26 Feb 07 jari 718           maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 719       colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 720       colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 721       rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 722           : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 723         } else {
2 26 Feb 07 jari 724           float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 725           if(value <= minValue)
2 26 Feb 07 jari 726             colorIndex = 0;
2 26 Feb 07 jari 727           else if(value >= maxValue)
2 26 Feb 07 jari 728             colorIndex = 255;
2 26 Feb 07 jari 729           else
2 26 Feb 07 jari 730             colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 731            
2 26 Feb 07 jari 732           rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 733         }
2 26 Feb 07 jari 734         return new Color(rgb);
2 26 Feb 07 jari 735     }    
2 26 Feb 07 jari 736     
2 26 Feb 07 jari 737     
2 26 Feb 07 jari 738     /**
2 26 Feb 07 jari 739      * Paint component into specified graphics.
2 26 Feb 07 jari 740      */
2 26 Feb 07 jari 741     public void paint(Graphics g) {
2 26 Feb 07 jari 742         super.paint(g);
2 26 Feb 07 jari 743         if (this.data == null) {
2 26 Feb 07 jari 744             return;
2 26 Feb 07 jari 745         }
2 26 Feb 07 jari 746         if(this.elementSize.getHeight() < 1)
2 26 Feb 07 jari 747             return;
2 26 Feb 07 jari 748         final int samples = getCluster().length;
2 26 Feb 07 jari 749         
2 26 Feb 07 jari 750         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 751             g.setColor(new Color(0, 0, 128));
2 26 Feb 07 jari 752             g.setFont(ERROR_FONT);
2 26 Feb 07 jari 753             g.drawString(NO_EXPERIMENT_STR, 10, 30);
2 26 Feb 07 jari 754             return;
2 26 Feb 07 jari 755         }
2 26 Feb 07 jari 756         
2 26 Feb 07 jari 757         Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 758         final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 759         final int bottom = getBottomIndex(bounds.y+bounds.height, genesOrder.length);
2 26 Feb 07 jari 760         final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 761         final int right = getRightIndex(bounds.x+bounds.width, samples);
2 26 Feb 07 jari 762         
2 26 Feb 07 jari 763         int x, y;
2 26 Feb 07 jari 764         
2 26 Feb 07 jari 765         if(hasCentroid){
2 26 Feb 07 jari 766             for( int row=top; row<bottom; row++){
2 26 Feb 07 jari 767                 fillCentroidRectAt(g, row);
2 26 Feb 07 jari 768             }
2 26 Feb 07 jari 769         }
2 26 Feb 07 jari 770         
2 26 Feb 07 jari 771         // draw rectangles
2 26 Feb 07 jari 772         for (int column=left; column<right; column++) {
2 26 Feb 07 jari 773             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 774                 fillRectAt(g, row, column);
2 26 Feb 07 jari 775             }
2 26 Feb 07 jari 776         }
2 26 Feb 07 jari 777         
2 26 Feb 07 jari 778         Color initColor = g.getColor();
2 26 Feb 07 jari 779         
2 26 Feb 07 jari 780         int expWidth = samples * this.elementSize.width + 5;
2 26 Feb 07 jari 781         
2 26 Feb 07 jari 782         if(haveColorBar){
2 26 Feb 07 jari 783             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 784                 if(this.hasCentroid){
2 26 Feb 07 jari 785                     fillClusterRectAt(g, row, expWidth + this.elementSize.width + 2);
2 26 Feb 07 jari 786                 }
2 26 Feb 07 jari 787                 else
2 26 Feb 07 jari 788                     fillClusterRectAt(g, row, expWidth);
2 26 Feb 07 jari 789             }
2 26 Feb 07 jari 790         }
2 26 Feb 07 jari 791         
2 26 Feb 07 jari 792         g.setColor(initColor);
2 26 Feb 07 jari 793         
2 26 Feb 07 jari 794         // draw annotations
2 26 Feb 07 jari 795         if(this.isDrawAnnotations){
2 26 Feb 07 jari 796             if (this.isAntiAliasing) {
2 26 Feb 07 jari 797                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 798                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 799             }
2 26 Feb 07 jari 800             if (right >= samples) {
2 26 Feb 07 jari 801                 String label = "";
2 26 Feb 07 jari 802                 g.setColor(Color.black);
2 26 Feb 07 jari 803                 int uniqX = elementSize.width*samples+10;
2 26 Feb 07 jari 804                 if(this.hasCentroid)
2 26 Feb 07 jari 805                     uniqX += elementSize.width + 5;
2 26 Feb 07 jari 806                 if(haveColorBar)
2 26 Feb 07 jari 807                     uniqX += this.elementSize.width;
2 26 Feb 07 jari 808                 int annY;
2 26 Feb 07 jari 809                 for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 810                     if (labelIndex >= 0) {
2 26 Feb 07 jari 811                         label = data.getElementAttribute(getMultipleArrayDataRow(row), labelIndex);
2 26 Feb 07 jari 812                     }
2 26 Feb 07 jari 813                     annY = (row+1)*elementSize.height;
2 26 Feb 07 jari 814                     
2 26 Feb 07 jari 815                     g.drawString(label, uniqX + insets.left, annY);
2 26 Feb 07 jari 816                 }
2 26 Feb 07 jari 817             }
2 26 Feb 07 jari 818         }
2 26 Feb 07 jari 819     }
2 26 Feb 07 jari 820     
2 26 Feb 07 jari 821     /**
2 26 Feb 07 jari 822      * Fills rect with specified row and colunn.
2 26 Feb 07 jari 823      */
2 26 Feb 07 jari 824     private void fillRectAt(Graphics g, int row, int column) {
2 26 Feb 07 jari 825         int x = column*elementSize.width + insets.left;
2 26 Feb 07 jari 826         int y = row*elementSize.height;
2 26 Feb 07 jari 827         
2 26 Feb 07 jari 828         if(hasCentroid)
2 26 Feb 07 jari 829             x += elementSize.width + 5;
2 26 Feb 07 jari 830         
2 26 Feb 07 jari 831         boolean mask = this.firstSelectedRow >= 0 && this.lastSelectedRow >= 0 && (row < this.firstSelectedRow || row > this.lastSelectedRow);
2 26 Feb 07 jari 832         mask = (mask || this.firstSelectedColumn >= 0 && this.lastSelectedColumn >= 0 && (column < this.firstSelectedColumn || column > this.lastSelectedColumn));
2 26 Feb 07 jari 833         
2 26 Feb 07 jari 834         g.setColor(getColor(this.experiment.get(getExperimentRow(row), getColumn(column))));
2 26 Feb 07 jari 835         g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 836         if (mask) {
2 26 Feb 07 jari 837             g.setColor(maskColor);
2 26 Feb 07 jari 838             g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 839         }
2 26 Feb 07 jari 840         if (this.isDrawBorders) {
2 26 Feb 07 jari 841             g.setColor(Color.black);
2 26 Feb 07 jari 842             g.drawRect(x, y, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 843         }
2 26 Feb 07 jari 844     }
2 26 Feb 07 jari 845     
2 26 Feb 07 jari 846     private void fillCentroidRectAt(Graphics g, int row){
2 26 Feb 07 jari 847         int x = insets.left;
2 26 Feb 07 jari 848         int y = row*elementSize.height;
2 26 Feb 07 jari 849         
2 26 Feb 07 jari 850         boolean mask = this.firstSelectedRow >= 0 && this.lastSelectedRow >= 0 && (row < this.firstSelectedRow || row > this.lastSelectedRow);
2 26 Feb 07 jari 851         
2 26 Feb 07 jari 852         g.setColor(getColor(this.centroids[this.clusterIndex][row]));
2 26 Feb 07 jari 853         g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 854         if (mask) {
2 26 Feb 07 jari 855             g.setColor(maskColor);
2 26 Feb 07 jari 856             g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 857         }
2 26 Feb 07 jari 858         if (this.isDrawBorders) {
2 26 Feb 07 jari 859             g.setColor(Color.black);
2 26 Feb 07 jari 860             g.drawRect(x, y, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 861         }
2 26 Feb 07 jari 862     }
2 26 Feb 07 jari 863     
2 26 Feb 07 jari 864     /**
2 26 Feb 07 jari 865      * Fills cluster colors
2 26 Feb 07 jari 866      */
2 26 Feb 07 jari 867     private void fillClusterRectAt(Graphics g, int row, int xLoc) {
2 26 Feb 07 jari 868         Color geneColor = data.getProbeColor(getMultipleArrayDataRow(row));
2 26 Feb 07 jari 869         if(geneColor == null)
2 26 Feb 07 jari 870             geneColor = Color.white;
2 26 Feb 07 jari 871         
2 26 Feb 07 jari 872         g.setColor(geneColor);
2 26 Feb 07 jari 873         g.fillRect(xLoc + insets.left, row*elementSize.height, elementSize.width-1, elementSize.height);
2 26 Feb 07 jari 874     }
2 26 Feb 07 jari 875     
2 26 Feb 07 jari 876     /**
2 26 Feb 07 jari 877      * Draws rect with specified row, column and color.
2 26 Feb 07 jari 878      */
2 26 Feb 07 jari 879     private void drawRectAt(Graphics g, int row, int column, Color color) {
2 26 Feb 07 jari 880         g.setColor(color);
2 26 Feb 07 jari 881         if(!this.hasCentroid)
2 26 Feb 07 jari 882             g.drawRect(column*elementSize.width + insets.left, row*elementSize.height, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 883         else
2 26 Feb 07 jari 884             g.drawRect(column*elementSize.width + insets.left + elementSize.width + 5, row*elementSize.height, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 885         
2 26 Feb 07 jari 886     }
2 26 Feb 07 jari 887     
2 26 Feb 07 jari 888     protected boolean haveClusterColor(){
2 26 Feb 07 jari 889         int samples = this.getCluster().length;
2 26 Feb 07 jari 890         for(int i = 0; i < samples; i++){
2 26 Feb 07 jari 891             if( data.getExperimentColor(getColumn(i)) != null)
2 26 Feb 07 jari 892                 return true;
2 26 Feb 07 jari 893         }
2 26 Feb 07 jari 894         return false;
2 26 Feb 07 jari 895     }
2 26 Feb 07 jari 896     
2 26 Feb 07 jari 897     private int getTopIndex(int top) {
2 26 Feb 07 jari 898         if (top < 0) {
2 26 Feb 07 jari 899             return 0;
2 26 Feb 07 jari 900         }
2 26 Feb 07 jari 901         return top/elementSize.height;
2 26 Feb 07 jari 902     }
2 26 Feb 07 jari 903     
2 26 Feb 07 jari 904     private int getLeftIndex(int left) {
2 26 Feb 07 jari 905         if (left < insets.left) {
2 26 Feb 07 jari 906             return 0;
2 26 Feb 07 jari 907         }
2 26 Feb 07 jari 908         
2 26 Feb 07 jari 909         if(!hasCentroid){
2 26 Feb 07 jari 910             return (left - insets.left)/elementSize.width;
2 26 Feb 07 jari 911         }
2 26 Feb 07 jari 912         else{
2 26 Feb 07 jari 913             if(left < insets.left + elementSize.width + 5)
2 26 Feb 07 jari 914                 return 0;
2 26 Feb 07 jari 915             return (left - insets.left - elementSize.width - 5)/elementSize.width;
2 26 Feb 07 jari 916         }
2 26 Feb 07 jari 917     }
2 26 Feb 07 jari 918     
2 26 Feb 07 jari 919     private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 920         if (right < 0) {
2 26 Feb 07 jari 921             return 0;
2 26 Feb 07 jari 922         }
2 26 Feb 07 jari 923         int result = 0;
2 26 Feb 07 jari 924         
2 26 Feb 07 jari 925         if(!hasCentroid)
2 26 Feb 07 jari 926             result = right/elementSize.width+1;
2 26 Feb 07 jari 927         else
2 26 Feb 07 jari 928             result = (right - (insets.left + elementSize.width + 5) )/elementSize.width + 1;
2 26 Feb 07 jari 929         
2 26 Feb 07 jari 930         return result > limit ? limit : result;
2 26 Feb 07 jari 931     }
2 26 Feb 07 jari 932     
2 26 Feb 07 jari 933     private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 934         if (bottom < 0) {
2 26 Feb 07 jari 935             return 0;
2 26 Feb 07 jari 936         }
2 26 Feb 07 jari 937         int result = bottom/elementSize.height+1;
2 26 Feb 07 jari 938         return result > limit ? limit : result;
2 26 Feb 07 jari 939     }
2 26 Feb 07 jari 940     
2 26 Feb 07 jari 941     /**
2 26 Feb 07 jari 942      * Finds column for specified x coordinate.
2 26 Feb 07 jari 943      * @return -1 if column was not found.
2 26 Feb 07 jari 944      */
2 26 Feb 07 jari 945     private int findColumn(int targetx) {
2 26 Feb 07 jari 946         int xSize = getCluster().length*elementSize.width;
2 26 Feb 07 jari 947         
2 26 Feb 07 jari 948         if(this.hasCentroid){
2 26 Feb 07 jari 949             xSize += elementSize.width + 5;
2 26 Feb 07 jari 950             if (targetx >= (xSize + insets.left) || targetx < insets.left + elementSize.width + 5) {
2 26 Feb 07 jari 951                 return -1;
2 26 Feb 07 jari 952             }
2 26 Feb 07 jari 953             return  (targetx - insets.left - elementSize.width  - 5)/elementSize.width;
2 26 Feb 07 jari 954         }
2 26 Feb 07 jari 955         
2 26 Feb 07 jari 956         if (targetx >= (xSize + insets.left) || targetx < insets.left) {
2 26 Feb 07 jari 957             return -1;
2 26 Feb 07 jari 958         }
2 26 Feb 07 jari 959         return (targetx - insets.left)/elementSize.width;
2 26 Feb 07 jari 960     }
2 26 Feb 07 jari 961     
2 26 Feb 07 jari 962     
2 26 Feb 07 jari 963     /**
2 26 Feb 07 jari 964      * Finds row for specified y coordinate.
2 26 Feb 07 jari 965      * @return -1 if row was not found.
2 26 Feb 07 jari 966      */
2 26 Feb 07 jari 967     private int findRow(int targety) {
2 26 Feb 07 jari 968         int ySize = genesOrder.length*elementSize.height;
2 26 Feb 07 jari 969         if (targety >= ySize || targety < 0)
2 26 Feb 07 jari 970             return -1;
2 26 Feb 07 jari 971         return targety/elementSize.height;
2 26 Feb 07 jari 972     }
2 26 Feb 07 jari 973     
2 26 Feb 07 jari 974     private boolean isLegalPosition(int row, int column) {
2 26 Feb 07 jari 975         if (isLegalRow(row) && isLegalColumn(column))
2 26 Feb 07 jari 976             return true;
2 26 Feb 07 jari 977         return false;
2 26 Feb 07 jari 978     }
2 26 Feb 07 jari 979     
2 26 Feb 07 jari 980     private boolean isLegalColumn(int column) {
2 26 Feb 07 jari 981         if (column < 0 || column > getCluster().length -1)
2 26 Feb 07 jari 982             return false;
2 26 Feb 07 jari 983         return true;
2 26 Feb 07 jari 984     }
2 26 Feb 07 jari 985     
2 26 Feb 07 jari 986     private boolean isLegalRow(int row) {
2 26 Feb 07 jari 987         if (row < 0 || row > genesOrder.length -1)
2 26 Feb 07 jari 988             return false;
2 26 Feb 07 jari 989         return true;
2 26 Feb 07 jari 990     }
2 26 Feb 07 jari 991     
2 26 Feb 07 jari 992     /**
2 26 Feb 07 jari 993      * Adds viewer specific menu items.
2 26 Feb 07 jari 994      */
2 26 Feb 07 jari 995     protected void addMenuItems(JPopupMenu menu, ActionListener listener) {
2 26 Feb 07 jari 996         JMenuItem menuItem;
2 26 Feb 07 jari 997         menuItem = new JMenuItem("Store cluster", GUIFactory.getIcon("new16.gif"));
2 26 Feb 07 jari 998         menuItem.setActionCommand(STORE_CLUSTER_CMD);
2 26 Feb 07 jari 999         menuItem.addActionListener(listener);
2 26 Feb 07 jari 1000         menu.add(menuItem);
2 26 Feb 07 jari 1001         
2 26 Feb 07 jari 1002         menu.addSeparator();
2 26 Feb 07 jari 1003         
2 26 Feb 07 jari 1004         menuItem = new JMenuItem("Launch new session", GUIFactory.getIcon("lanuch_new_mav.gif"));
2 26 Feb 07 jari 1005         menuItem.setActionCommand(LAUNCH_NEW_SESSION_CMD);
2 26 Feb 07 jari 1006         menuItem.addActionListener(listener);
2 26 Feb 07 jari 1007         menu.add(menuItem);
2 26 Feb 07 jari 1008         
2 26 Feb 07 jari 1009         menu.addSeparator();
2 26 Feb 07 jari 1010         
2 26 Feb 07 jari 1011         menuItem = new JMenuItem("Delete public cluster", GUIFactory.getIcon("delete16.gif"));
2 26 Feb 07 jari 1012         menuItem.setActionCommand(SET_DEF_COLOR_CMD);
2 26 Feb 07 jari 1013         menuItem.addActionListener(listener);
2 26 Feb 07 jari 1014         menu.add(menuItem);
2 26 Feb 07 jari 1015         
2 26 Feb 07 jari 1016         menu.addSeparator();
2 26 Feb 07 jari 1017         
2 26 Feb 07 jari 1018         menuItem = new JMenuItem("Save cluster...", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 1019         menuItem.setActionCommand(SAVE_CLUSTER_CMD);
2 26 Feb 07 jari 1020         menuItem.addActionListener(listener);
2 26 Feb 07 jari 1021         menu.add(menuItem);
2 26 Feb 07 jari 1022         
2 26 Feb 07 jari 1023         menuItem = new JMenuItem("Save all clusters...", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 1024         menuItem.setActionCommand(SAVE_ALL_CLUSTERS_CMD);
2 26 Feb 07 jari 1025         menuItem.addActionListener(listener);
2 26 Feb 07 jari 1026         menu.add(menuItem);
2 26 Feb 07 jari 1027     }
2 26 Feb 07 jari 1028     
2 26 Feb 07 jari 1029     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 1030      */
2 26 Feb 07 jari 1031     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 1032         return null;
2 26 Feb 07 jari 1033     }
2 26 Feb 07 jari 1034     
2 26 Feb 07 jari 1035     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 1036      * posibly null
2 26 Feb 07 jari 1037      */
2 26 Feb 07 jari 1038     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 1039         return null;
2 26 Feb 07 jari 1040     }
2 26 Feb 07 jari 1041         
2 26 Feb 07 jari 1042     /** Returns int value indicating viewer type
2 26 Feb 07 jari 1043      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 1044      */
2 26 Feb 07 jari 1045     public int getViewerType() {
2 26 Feb 07 jari 1046         return Cluster.EXPERIMENT_CLUSTER;
2 26 Feb 07 jari 1047     }
2 26 Feb 07 jari 1048     
2 26 Feb 07 jari 1049     /**
2 26 Feb 07 jari 1050      * The class to listen to mouse events.
2 26 Feb 07 jari 1051      */
2 26 Feb 07 jari 1052     private class Listener extends MouseAdapter implements MouseMotionListener {
2 26 Feb 07 jari 1053         
2 26 Feb 07 jari 1054         private String oldStatusText = "";
2 26 Feb 07 jari 1055         private int oldRow = -1;
2 26 Feb 07 jari 1056         private int oldColumn = -1;
2 26 Feb 07 jari 1057         
2 26 Feb 07 jari 1058         public void mouseClicked(MouseEvent event) {
2 26 Feb 07 jari 1059             if (SwingUtilities.isRightMouseButton(event)) {
2 26 Feb 07 jari 1060                 return;
2 26 Feb 07 jari 1061             }
2 26 Feb 07 jari 1062             int column = findColumn(event.getX());
2 26 Feb 07 jari 1063             int row = findRow(event.getY());
2 26 Feb 07 jari 1064             if (!isLegalPosition(row, column)) {
2 26 Feb 07 jari 1065                 return;
2 26 Feb 07 jari 1066             }
2 26 Feb 07 jari 1067             if (event.isControlDown()) { // single array viewer
2 26 Feb 07 jari 1068                 framework.displaySingleArrayViewer(experiment.getSampleIndex(getColumn(column)));
2 26 Feb 07 jari 1069                 return;
2 26 Feb 07 jari 1070             }
2 26 Feb 07 jari 1071             if (!event.isShiftDown()) { // element info
2 26 Feb 07 jari 1072                 framework.displaySlideElementInfo(experiment.getSampleIndex(getColumn(column)), getMultipleArrayDataRow(row));
2 26 Feb 07 jari 1073                 return;
2 26 Feb 07 jari 1074             }
2 26 Feb 07 jari 1075         }
2 26 Feb 07 jari 1076         
2 26 Feb 07 jari 1077         public void mouseMoved(MouseEvent event) {
2 26 Feb 07 jari 1078             if (experiment.getNumberOfSamples() == 0 || event.isShiftDown())
2 26 Feb 07 jari 1079                 return;
2 26 Feb 07 jari 1080             int column = findColumn(event.getX());
2 26 Feb 07 jari 1081             int row = findRow(event.getY());
2 26 Feb 07 jari 1082             if (isCurrentPosition(row, column)) {
2 26 Feb 07 jari 1083                 return;
2 26 Feb 07 jari 1084             }
2 26 Feb 07 jari 1085             Graphics g = null;
2 26 Feb 07 jari 1086             if (isLegalPosition(row, column)) {
2 26 Feb 07 jari 1087                 g = getGraphics();
2 26 Feb 07 jari 1088                 drawRectAt(g, row, column, Color.white);
2 26 Feb 07 jari 1089                 framework.setStatusText("Gene: "+data.getUniqueId(getMultipleArrayDataRow(row))+" Sample: "+data.getSampleName(experiment.getSampleIndex(getColumn(column)))+" Value: "+experiment.get(getExperimentRow(row), getColumn(column)));
2 26 Feb 07 jari 1090             } else {
2 26 Feb 07 jari 1091                 framework.setStatusText(oldStatusText);
2 26 Feb 07 jari 1092             }
2 26 Feb 07 jari 1093             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 1094                 g = g != null ? g : getGraphics();
2 26 Feb 07 jari 1095                 fillRectAt(g, oldRow, oldColumn);
2 26 Feb 07 jari 1096             }
2 26 Feb 07 jari 1097             setOldPosition(row, column);
2 26 Feb 07 jari 1098             if (g != null) {
2 26 Feb 07 jari 1099                 g.dispose();
2 26 Feb 07 jari 1100             }
2 26 Feb 07 jari 1101         }
2 26 Feb 07 jari 1102         
2 26 Feb 07 jari 1103         public void mouseEntered(MouseEvent event) {
2 26 Feb 07 jari 1104             oldStatusText = framework.getStatusText();
2 26 Feb 07 jari 1105         }
2 26 Feb 07 jari 1106         
2 26 Feb 07 jari 1107         public void mouseExited(MouseEvent event) {
2 26 Feb 07 jari 1108             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 1109                 Graphics g = getGraphics();
2 26 Feb 07 jari 1110                 fillRectAt(g, oldRow, oldColumn);
2 26 Feb 07 jari 1111                 g.dispose();
2 26 Feb 07 jari 1112             }
2 26 Feb 07 jari 1113             setOldPosition(-1, -1);
2 26 Feb 07 jari 1114             framework.setStatusText(oldStatusText);
2 26 Feb 07 jari 1115         }
2 26 Feb 07 jari 1116         
2 26 Feb 07 jari 1117         public void mouseDragged(MouseEvent event) {}
2 26 Feb 07 jari 1118         
2 26 Feb 07 jari 1119         private void setOldPosition(int row, int column) {
2 26 Feb 07 jari 1120             oldColumn = column;
2 26 Feb 07 jari 1121             oldRow = row;
2 26 Feb 07 jari 1122         }
2 26 Feb 07 jari 1123         
2 26 Feb 07 jari 1124         private boolean isCurrentPosition(int row, int column) {
2 26 Feb 07 jari 1125             return(row == oldRow && column == oldColumn);
2 26 Feb 07 jari 1126         }
2 26 Feb 07 jari 1127     }
2 26 Feb 07 jari 1128     
2 26 Feb 07 jari 1129   /* (non-Javadoc)
2 26 Feb 07 jari 1130    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExperimentID()
2 26 Feb 07 jari 1131    */
2 26 Feb 07 jari 1132   public int getExperimentID() {
2 26 Feb 07 jari 1133     return this.exptID;
2 26 Feb 07 jari 1134   }
2 26 Feb 07 jari 1135
2 26 Feb 07 jari 1136   /* (non-Javadoc)
2 26 Feb 07 jari 1137    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperimentID(int)
2 26 Feb 07 jari 1138    */
2 26 Feb 07 jari 1139   public void setExperimentID(int id) {
2 26 Feb 07 jari 1140     this.exptID = id;
2 26 Feb 07 jari 1141   }
2 26 Feb 07 jari 1142     
2 26 Feb 07 jari 1143 }
2 26 Feb 07 jari 1144