mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/sota/SOTACentroidExpressionViewer.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, 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: SOTACentroidExpressionViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.9 $
2 26 Feb 07 jari 8  * $Date: 2006/03/24 15:51:44 $
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 package org.tigr.microarray.mev.cluster.gui.impl.sota;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.Dimension;
2 26 Feb 07 jari 16 import java.awt.Font;
2 26 Feb 07 jari 17 import java.awt.FontMetrics;
2 26 Feb 07 jari 18 import java.awt.Frame;
2 26 Feb 07 jari 19 import java.awt.GradientPaint;
2 26 Feb 07 jari 20 import java.awt.Graphics;
2 26 Feb 07 jari 21 import java.awt.Graphics2D;
2 26 Feb 07 jari 22 import java.awt.Point;
2 26 Feb 07 jari 23 import java.awt.Rectangle;
2 26 Feb 07 jari 24 import java.awt.RenderingHints;
2 26 Feb 07 jari 25 import java.awt.event.ActionListener;
2 26 Feb 07 jari 26 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 27 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 28 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 29 import java.beans.Expression;
2 26 Feb 07 jari 30
2 26 Feb 07 jari 31 import java.io.IOException;
2 26 Feb 07 jari 32 import java.io.ObjectInputStream;
2 26 Feb 07 jari 33 import java.io.ObjectOutputStream;
2 26 Feb 07 jari 34 import java.util.ArrayList;
2 26 Feb 07 jari 35
2 26 Feb 07 jari 36 import javax.swing.JComponent;
2 26 Feb 07 jari 37 import javax.swing.JOptionPane;
2 26 Feb 07 jari 38 import javax.swing.JPanel;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentHeader;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentUtil;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.gui.impl.hcl.HCLCluster;
2 26 Feb 07 jari 48 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 49
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51 public class SOTACentroidExpressionViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 52      
2 26 Feb 07 jari 53     private int numberOfCentroids;
2 26 Feb 07 jari 54     private int [] clusterPopulation;
2 26 Feb 07 jari 55     private FloatMatrix clusterDiversity;
2 26 Feb 07 jari 56     
2 26 Feb 07 jari 57     
2 26 Feb 07 jari 58     private int TEXT_LEFT_MARGIN = 20;
2 26 Feb 07 jari 59     private int CLUSTER_POP_SPACER = 20;
2 26 Feb 07 jari 60     private int POP_DIV_SPACER = 20;
2 26 Feb 07 jari 61     private static final float INITIAL_MAX_VALUE = 3f;
2 26 Feb 07 jari 62     private static final float INITIAL_MIN_VALUE = -3f;
2 26 Feb 07 jari 63     private static final String NO_GENES_STR = "No Genes in Cluster!";
2 26 Feb 07 jari 64     private static final Font ERROR_FONT = new Font("monospaced", Font.BOLD, 20);
2 26 Feb 07 jari 65     
2 26 Feb 07 jari 66     private ExperimentHeader header;
2 26 Feb 07 jari 67     private Experiment experiment;
2 26 Feb 07 jari 68
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[] samplesOrder;
2 26 Feb 07 jari 74     private Dimension elementSize = new Dimension(40, 20);
2 26 Feb 07 jari 75     private boolean isAntiAliasing = true;
2 26 Feb 07 jari 76     private boolean isDrawBorders = true;
2 26 Feb 07 jari 77     public static Color missingColor = new Color(128, 128, 128);
2 26 Feb 07 jari 78     public static Color maskColor = new Color(255, 255, 255, 128);
2 26 Feb 07 jari 79     private float maxValue = INITIAL_MAX_VALUE;
2 26 Feb 07 jari 80     private float minValue = INITIAL_MIN_VALUE;
2 26 Feb 07 jari 81     private float midValue = 0.0f;
2 26 Feb 07 jari 82     private int firstSelectedRow = -1;
2 26 Feb 07 jari 83     private int lastSelectedRow  = -1;
2 26 Feb 07 jari 84     private ArrayList selectedClusterList;
2 26 Feb 07 jari 85     public BufferedImage posColorImage = createGradientImage(Color.black, Color.red);
2 26 Feb 07 jari 86     public BufferedImage negColorImage = createGradientImage(Color.green, Color.black);
2 26 Feb 07 jari 87     private int maxUniqueIDWidth, maxGeneNameWidth;
2 26 Feb 07 jari 88     private Listener listener;
2 26 Feb 07 jari 89     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 90     private int exptID = 0;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     /**
2 26 Feb 07 jari 93      * Constructs an <code>SOTACentroidEpressionViewer</code> with specified
2 26 Feb 07 jari 94      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 95      *
2 26 Feb 07 jari 96      * @param centroidData, contains the values of the cluster centroids.
2 26 Feb 07 jari 97      * @param clusters the two dimensional array with gene indices.
2 26 Feb 07 jari 98      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 99      * @param clusterPop array containing genes per cluster
2 26 Feb 07 jari 100      * @param clusterDiv diversity measure of each cluster
2 26 Feb 07 jari 101      * @param selClusterList, ArrayList shared with parent viewer which accumulates selected clusters
2 26 Feb 07 jari 102      */
2 26 Feb 07 jari 103     public SOTACentroidExpressionViewer(Experiment centroidData, int[][] clusters, int[] samplesOrder, int[] clusterPop, FloatMatrix clusterDiv, ArrayList selClusterList) {
2 26 Feb 07 jari 104         if (centroidData == null) {
2 26 Feb 07 jari 105             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 106         }
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         this.experiment = centroidData;
2 26 Feb 07 jari 109         this.exptID = experiment.getId();
2 26 Feb 07 jari 110         this.clusterPopulation = clusterPop;
2 26 Feb 07 jari 111         this.clusterDiversity = clusterDiv;
2 26 Feb 07 jari 112         this.numberOfCentroids = clusterPopulation.length;
2 26 Feb 07 jari 113         this.selectedClusterList = selClusterList;
2 26 Feb 07 jari 114         this.clusters = clusters == null ? defGenesOrder(experiment.getNumberOfGenes()) : clusters;
2 26 Feb 07 jari 115         this.samplesOrder = samplesOrder == null ? defSamplesOrder(experiment.getNumberOfSamples()) : samplesOrder;
2 26 Feb 07 jari 116         this.header = new ExperimentHeader(this.experiment, this.clusters, this.samplesOrder);
2 26 Feb 07 jari 117         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 118         setBackground(Color.white);
2 26 Feb 07 jari 119         
2 26 Feb 07 jari 120         listener = new Listener();
2 26 Feb 07 jari 121         this.addMouseMotionListener(listener);
2 26 Feb 07 jari 122         this.addMouseListener(listener);
2 26 Feb 07 jari 123     }
2 26 Feb 07 jari 124     
2 26 Feb 07 jari 125     //These methods are used only for compatibility with IViewer
2 26 Feb 07 jari 126     public Expression getExpression(){return null;}
2 26 Feb 07 jari 127     public int getExperimentID(){return exptID;}
2 26 Feb 07 jari 128     public void setExperimentID(int i){this.exptID = i;}
2 26 Feb 07 jari 129     public void setExperiment(Experiment e){
2 26 Feb 07 jari 130       this.experiment = e;
2 26 Feb 07 jari 131       this.exptID = e.getId();
2 26 Feb 07 jari 132       this.header.setExperiment(e);
2 26 Feb 07 jari 133     }
2 26 Feb 07 jari 134     
2 26 Feb 07 jari 135     /**
2 26 Feb 07 jari 136      * Constucts a default sample order, sequential
2 26 Feb 07 jari 137      */
2 26 Feb 07 jari 138     private static int[] defSamplesOrder(int size) {
2 26 Feb 07 jari 139         int[] order = new int[size];
2 26 Feb 07 jari 140         for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 141             order[i] = i;
2 26 Feb 07 jari 142         }
2 26 Feb 07 jari 143         return order;
2 26 Feb 07 jari 144     }
2 26 Feb 07 jari 145     
2 26 Feb 07 jari 146     /**
2 26 Feb 07 jari 147      * Constucts a default gene order, sequential
2 26 Feb 07 jari 148      */
2 26 Feb 07 jari 149     private static int[][] defGenesOrder(int size) {
2 26 Feb 07 jari 150         int[][] order = new int[1][size];
2 26 Feb 07 jari 151         for (int i=0; i<order[0].length; i++) {
2 26 Feb 07 jari 152             order[0][i] = i;
2 26 Feb 07 jari 153         }
2 26 Feb 07 jari 154         return order;
2 26 Feb 07 jari 155     }
2 26 Feb 07 jari 156     
2 26 Feb 07 jari 157     
2 26 Feb 07 jari 158     /**
2 26 Feb 07 jari 159      * Returns component to render the experiment header.
2 26 Feb 07 jari 160      */
2 26 Feb 07 jari 161     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 162         return header;
2 26 Feb 07 jari 163     }
2 26 Feb 07 jari 164     
2 26 Feb 07 jari 165     /**
2 26 Feb 07 jari 166      * Returns component to render the experiment values.
2 26 Feb 07 jari 167      */
2 26 Feb 07 jari 168     public JComponent getContentComponent() {
2 26 Feb 07 jari 169         return this;
2 26 Feb 07 jari 170     }
2 26 Feb 07 jari 171     
2 26 Feb 07 jari 172     /**
2 26 Feb 07 jari 173      * Returns null.
2 26 Feb 07 jari 174      */
2 26 Feb 07 jari 175     public BufferedImage getImage() {
2 26 Feb 07 jari 176         return null;
2 26 Feb 07 jari 177     }
2 26 Feb 07 jari 178     
2 26 Feb 07 jari 179     /**
2 26 Feb 07 jari 180      * Returns a gradient image for positive values.
2 26 Feb 07 jari 181      */
2 26 Feb 07 jari 182     public BufferedImage getPosColorImage() {
2 26 Feb 07 jari 183         return posColorImage;
2 26 Feb 07 jari 184     }
2 26 Feb 07 jari 185     
2 26 Feb 07 jari 186     /**
2 26 Feb 07 jari 187      * Returns a gradient image for negative values.
2 26 Feb 07 jari 188      */
2 26 Feb 07 jari 189     public BufferedImage getNegColorImage() {
2 26 Feb 07 jari 190         return negColorImage;
2 26 Feb 07 jari 191     }
2 26 Feb 07 jari 192     
2 26 Feb 07 jari 193     /**
2 26 Feb 07 jari 194      * Returns a color assigned for a NaN value.
2 26 Feb 07 jari 195      */
2 26 Feb 07 jari 196     public Color getMissingColor() {
2 26 Feb 07 jari 197         return missingColor;
2 26 Feb 07 jari 198     }
2 26 Feb 07 jari 199     
2 26 Feb 07 jari 200     /**
2 26 Feb 07 jari 201      * Selects rows from start to end.
2 26 Feb 07 jari 202      */
2 26 Feb 07 jari 203     public void selectRows(int start, int end) {
2 26 Feb 07 jari 204         firstSelectedRow = start;
2 26 Feb 07 jari 205         lastSelectedRow  = end;
2 26 Feb 07 jari 206         repaint();
2 26 Feb 07 jari 207     }
2 26 Feb 07 jari 208     
2 26 Feb 07 jari 209     /**
2 26 Feb 07 jari 210      * Initializes appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 211      * @see IViewer#onSelected
2 26 Feb 07 jari 212      */
2 26 Feb 07 jari 213     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 214         this.framework = framework;
2 26 Feb 07 jari 215         this.data = framework.getData();
2 26 Feb 07 jari 216         header.setData(data);
2 26 Feb 07 jari 217         
2 26 Feb 07 jari 218         Integer userObject = (Integer)framework.getUserObject();
2 26 Feb 07 jari 219         setClusterIndex(userObject == null ? 0 : userObject.intValue());
2 26 Feb 07 jari 220         IDisplayMenu menu = framework.getDisplayMenu();        
2 26 Feb 07 jari 221         useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 222         header.setUseDoubleGradient(useDoubleGradient);
2 26 Feb 07 jari 223         
2 26 Feb 07 jari 224         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 225         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 226         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 227         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 228         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 229         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 230         
2 26 Feb 07 jari 231         updateSize();
2 26 Feb 07 jari 232         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 233         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 234         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 235         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 236         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 237         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 238         
2 26 Feb 07 jari 239     }
2 26 Feb 07 jari 240     
2 26 Feb 07 jari 241     
2 26 Feb 07 jari 242     
2 26 Feb 07 jari 243     /**
2 26 Feb 07 jari 244      * Updates appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 245      * @see IViewer#onMenuChanged
2 26 Feb 07 jari 246      */
2 26 Feb 07 jari 247     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 248       useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 249       header.setUseDoubleGradient(useDoubleGradient);
2 26 Feb 07 jari 250       setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 251         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 252         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 253         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 254         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 255         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 256         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 257         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 258         if (this.elementSize.equals(menu.getElementSize()) &&
2 26 Feb 07 jari 259         this.isAntiAliasing == menu.isAntiAliasing()) {
2 26 Feb 07 jari 260             return;
2 26 Feb 07 jari 261         }
2 26 Feb 07 jari 262         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 263         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 264         updateSize();
2 26 Feb 07 jari 265         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 266         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 267     }
2 26 Feb 07 jari 268     
2 26 Feb 07 jari 269     /**
2 26 Feb 07 jari 270      * Sets data for this viewer and its header.
2 26 Feb 07 jari 271      * @see IViewer#onDataChanged
2 26 Feb 07 jari 272      */
2 26 Feb 07 jari 273     public void onDataChanged(IData data) {
2 26 Feb 07 jari 274         this.data = data;
2 26 Feb 07 jari 275         this.header.setData(data);
2 26 Feb 07 jari 276     }
2 26 Feb 07 jari 277     
2 26 Feb 07 jari 278     public void onDeselected() {}
2 26 Feb 07 jari 279     public void onClosed() {}
2 26 Feb 07 jari 280     
2 26 Feb 07 jari 281     /**
2 26 Feb 07 jari 282      * Sets cluster index to be displayed.
2 26 Feb 07 jari 283      */
2 26 Feb 07 jari 284     public void setClusterIndex(int clusterIndex) {
2 26 Feb 07 jari 285         this.clusterIndex = clusterIndex;
2 26 Feb 07 jari 286     }
2 26 Feb 07 jari 287     
2 26 Feb 07 jari 288     /**
2 26 Feb 07 jari 289      * Returns index of current cluster.
2 26 Feb 07 jari 290      */
2 26 Feb 07 jari 291     public int getClusterIndex() {
2 26 Feb 07 jari 292         return clusterIndex;
2 26 Feb 07 jari 293     }
2 26 Feb 07 jari 294     
2 26 Feb 07 jari 295     /**
2 26 Feb 07 jari 296      * Returns indices of current cluster.
2 26 Feb 07 jari 297      */
2 26 Feb 07 jari 298     public int[] getCluster() {
2 26 Feb 07 jari 299         return clusters[this.clusterIndex];
2 26 Feb 07 jari 300     }
2 26 Feb 07 jari 301     
2 26 Feb 07 jari 302     /**
2 26 Feb 07 jari 303      * Returns all the clusters.
2 26 Feb 07 jari 304      */
2 26 Feb 07 jari 305     public int[][] getClusters() {
2 26 Feb 07 jari 306         return clusters;
2 26 Feb 07 jari 307     }
2 26 Feb 07 jari 308     
2 26 Feb 07 jari 309     private int getRow(int row) {
2 26 Feb 07 jari 310         return this.clusters[this.clusterIndex][row];
2 26 Feb 07 jari 311     }
2 26 Feb 07 jari 312     
2 26 Feb 07 jari 313     private int getColumn(int column) {
2 26 Feb 07 jari 314         return samplesOrder[column];
2 26 Feb 07 jari 315     }
2 26 Feb 07 jari 316     
2 26 Feb 07 jari 317     /**
2 26 Feb 07 jari 318      * Returns wrapped experiment.
2 26 Feb 07 jari 319      */
2 26 Feb 07 jari 320     public Experiment getExperiment() {
2 26 Feb 07 jari 321         return experiment;
2 26 Feb 07 jari 322     }
2 26 Feb 07 jari 323     
2 26 Feb 07 jari 324     /**
2 26 Feb 07 jari 325      * Returns the data.
2 26 Feb 07 jari 326      */
2 26 Feb 07 jari 327     protected IData getData() {
2 26 Feb 07 jari 328         return data;
2 26 Feb 07 jari 329     }
2 26 Feb 07 jari 330     
2 26 Feb 07 jari 331     /**
2 26 Feb 07 jari 332      * Sets public color for the current cluster.
2 26 Feb 07 jari 333      */
2 26 Feb 07 jari 334     public void setClusterColor(Color color) {
2 26 Feb 07 jari 335         this.data.setProbesColor(getCluster(), color);
2 26 Feb 07 jari 336     }
2 26 Feb 07 jari 337     
2 26 Feb 07 jari 338     /**
2 26 Feb 07 jari 339      * Saves all the clusters.
2 26 Feb 07 jari 340      */
2 26 Feb 07 jari 341 //    public void saveClusters(Frame frame) throws Exception {
2 26 Feb 07 jari 342 //        frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 343 //        ExperimentUtil.saveExperiment(frame, getExperiment(), getData(), getClusters());
2 26 Feb 07 jari 344 //    }
2 26 Feb 07 jari 345     
2 26 Feb 07 jari 346     /**
2 26 Feb 07 jari 347      * Saves current cluster.
2 26 Feb 07 jari 348      */
2 26 Feb 07 jari 349 //    public void saveCluster(Frame frame) throws Exception {
2 26 Feb 07 jari 350 //        frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 351 //        ExperimentUtil.saveExperiment(frame, getExperiment(), getData(), getCluster());
2 26 Feb 07 jari 352 //    }
2 26 Feb 07 jari 353     
2 26 Feb 07 jari 354     /**
2 26 Feb 07 jari 355      * Sets a shape size.
2 26 Feb 07 jari 356      */
2 26 Feb 07 jari 357     private void setElementSize(Dimension elementSize) {
2 26 Feb 07 jari 358         this.elementSize = new Dimension(elementSize);
2 26 Feb 07 jari 359     }
2 26 Feb 07 jari 360     
2 26 Feb 07 jari 361     /**
2 26 Feb 07 jari 362      * Sets anti-aliasing attribute.
2 26 Feb 07 jari 363      */
2 26 Feb 07 jari 364     private void setAntialiasing(boolean value) {
2 26 Feb 07 jari 365         this.isAntiAliasing = value;
2 26 Feb 07 jari 366     }
2 26 Feb 07 jari 367     
2 26 Feb 07 jari 368     /**
2 26 Feb 07 jari 369      * Sets draw borders attribute.
2 26 Feb 07 jari 370      */
2 26 Feb 07 jari 371     private void setDrawBorders(boolean value) {
2 26 Feb 07 jari 372         this.isDrawBorders = value;
2 26 Feb 07 jari 373     }
2 26 Feb 07 jari 374     
2 26 Feb 07 jari 375     /**
2 26 Feb 07 jari 376      * Creates a gradient image with specified initial colors.
2 26 Feb 07 jari 377      */
2 26 Feb 07 jari 378     public BufferedImage createGradientImage(Color color1, Color color2) {
2 26 Feb 07 jari 379         BufferedImage image = (BufferedImage)java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(256, 1);        
2 26 Feb 07 jari 380
2 26 Feb 07 jari 381         Graphics2D graphics = image.createGraphics();
2 26 Feb 07 jari 382         GradientPaint gp = new GradientPaint(0, 0, color1, 255, 0, color2);
2 26 Feb 07 jari 383         graphics.setPaint(gp);
2 26 Feb 07 jari 384         graphics.drawRect(0, 0, 255, 1);
2 26 Feb 07 jari 385         return image;
2 26 Feb 07 jari 386     }
2 26 Feb 07 jari 387     
2 26 Feb 07 jari 388     /**
2 26 Feb 07 jari 389      * Updates size of this viewer.
2 26 Feb 07 jari 390      */
2 26 Feb 07 jari 391     private void updateSize() {
2 26 Feb 07 jari 392         
2 26 Feb 07 jari 393         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 394             setFont(ERROR_FONT);
2 26 Feb 07 jari 395             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 396             FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 397             int width = metrics.stringWidth(NO_GENES_STR)+10;
2 26 Feb 07 jari 398             int height = metrics.getHeight()+30;
2 26 Feb 07 jari 399             setSize(width, height);
2 26 Feb 07 jari 400             setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 401             return;
2 26 Feb 07 jari 402         }
2 26 Feb 07 jari 403         
2 26 Feb 07 jari 404         
2 26 Feb 07 jari 405         setFont(new Font("monospaced", Font.PLAIN, elementSize.height));
2 26 Feb 07 jari 406         Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 407         int width = elementSize.width*experiment.getNumberOfSamples()+1;
2 26 Feb 07 jari 408         
2 26 Feb 07 jari 409         width += getClusterTextWidth(g) + TEXT_LEFT_MARGIN + CLUSTER_POP_SPACER + POP_DIV_SPACER;
2 26 Feb 07 jari 410         
2 26 Feb 07 jari 411         int height = elementSize.height*numberOfCentroids+1;
2 26 Feb 07 jari 412         setSize(width, height);
2 26 Feb 07 jari 413         setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 414     }
2 26 Feb 07 jari 415     
2 26 Feb 07 jari 416     
2 26 Feb 07 jari 417     private int getClusterTextWidth(Graphics2D g){
2 26 Feb 07 jari 418         return getPopulationTextWidth(g) + getDiversityTextWidth(g) + getClusterNumberTextWidth(g);
2 26 Feb 07 jari 419     }
2 26 Feb 07 jari 420     
2 26 Feb 07 jari 421     private int getPopulationTextWidth(Graphics2D g){
2 26 Feb 07 jari 422         int maxWidth = 0;
2 26 Feb 07 jari 423         int currWidth = 0;
2 26 Feb 07 jari 424         
2 26 Feb 07 jari 425         if(this.clusterPopulation == null) return 0;
2 26 Feb 07 jari 426         
2 26 Feb 07 jari 427         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 428         for(int i = 0; i < clusterPopulation.length; i++){
2 26 Feb 07 jari 429             
2 26 Feb 07 jari 430             currWidth = fm.stringWidth(String.valueOf(clusterPopulation[i]));
2 26 Feb 07 jari 431             
2 26 Feb 07 jari 432             if(currWidth > maxWidth)
2 26 Feb 07 jari 433                 maxWidth = currWidth;
2 26 Feb 07 jari 434         }
2 26 Feb 07 jari 435         
2 26 Feb 07 jari 436         return maxWidth;
2 26 Feb 07 jari 437     }
2 26 Feb 07 jari 438     
2 26 Feb 07 jari 439     
2 26 Feb 07 jari 440     private int getDiversityTextWidth(Graphics2D g){
2 26 Feb 07 jari 441         int maxWidth = 0;
2 26 Feb 07 jari 442         int currWidth = 0;
2 26 Feb 07 jari 443         int n;
2 26 Feb 07 jari 444         
2 26 Feb 07 jari 445         if(this.clusterDiversity == null) return 0;
2 26 Feb 07 jari 446         n = clusterDiversity.getRowDimension();
2 26 Feb 07 jari 447         
2 26 Feb 07 jari 448         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 449         for(int i = 0; i < n; i++){
2 26 Feb 07 jari 450             
2 26 Feb 07 jari 451             currWidth = fm.stringWidth(String.valueOf(clusterDiversity.get(i,0)));
2 26 Feb 07 jari 452             
2 26 Feb 07 jari 453             if(currWidth > maxWidth)
2 26 Feb 07 jari 454                 maxWidth = currWidth;
2 26 Feb 07 jari 455         }
2 26 Feb 07 jari 456         return maxWidth;
2 26 Feb 07 jari 457     }
2 26 Feb 07 jari 458     
2 26 Feb 07 jari 459     private int getClusterNumberTextWidth(Graphics2D g){
2 26 Feb 07 jari 460         
2 26 Feb 07 jari 461         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         return  fm.stringWidth(String.valueOf(numberOfCentroids));
2 26 Feb 07 jari 464     }
2 26 Feb 07 jari 465     
2 26 Feb 07 jari 466     
2 26 Feb 07 jari 467     /**
2 26 Feb 07 jari 468      * Calculates color for passed value.
2 26 Feb 07 jari 469      */
2 26 Feb 07 jari 470     private Color getColor(float value) {
2 26 Feb 07 jari 471         if (Float.isNaN(value)) {
2 26 Feb 07 jari 472             return missingColor;
2 26 Feb 07 jari 473         }
2 26 Feb 07 jari 474         
2 26 Feb 07 jari 475         float maximum;
2 26 Feb 07 jari 476         int colorIndex, rgb;
2 26 Feb 07 jari 477         
2 26 Feb 07 jari 478         if(useDoubleGradient) {
2 26 Feb 07 jari 479           maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 480       colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 481       colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 482       rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 483           : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 484         } else {
2 26 Feb 07 jari 485           float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 486           if(value <= minValue)
2 26 Feb 07 jari 487             colorIndex = 0;
2 26 Feb 07 jari 488           else if(value >= maxValue)
2 26 Feb 07 jari 489             colorIndex = 255;
2 26 Feb 07 jari 490           else
2 26 Feb 07 jari 491             colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 492            
2 26 Feb 07 jari 493           rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 494         }
2 26 Feb 07 jari 495         return new Color(rgb);
2 26 Feb 07 jari 496     }
2 26 Feb 07 jari 497     
2 26 Feb 07 jari 498     
2 26 Feb 07 jari 499     /**
2 26 Feb 07 jari 500      * Paint component into specified graphics.
2 26 Feb 07 jari 501      */
2 26 Feb 07 jari 502     public void paint(Graphics g) {
2 26 Feb 07 jari 503         super.paint(g);
2 26 Feb 07 jari 504         // if (this.data == null) {
2 26 Feb 07 jari 505         //    return;
2 26 Feb 07 jari 506         //}
2 26 Feb 07 jari 507         if(this.elementSize.getHeight() < 1)
2 26 Feb 07 jari 508             return;
2 26 Feb 07 jari 509         
2 26 Feb 07 jari 510         if (this.isAntiAliasing) {
2 26 Feb 07 jari 511             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 512             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 513         }
2 26 Feb 07 jari 514         else{
2 26 Feb 07 jari 515             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
2 26 Feb 07 jari 516             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
2 26 Feb 07 jari 517         }
2 26 Feb 07 jari 518         
2 26 Feb 07 jari 519         final int samples = experiment.getNumberOfSamples();
2 26 Feb 07 jari 520         
2 26 Feb 07 jari 521         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 522             g.setColor(new Color(0, 0, 128));
2 26 Feb 07 jari 523             g.setFont(ERROR_FONT);
2 26 Feb 07 jari 524             g.drawString(NO_GENES_STR, 10, 30);
2 26 Feb 07 jari 525             return;
2 26 Feb 07 jari 526         }
2 26 Feb 07 jari 527         
2 26 Feb 07 jari 528         Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 529         final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 530         final int bottom = getBottomIndex(bounds.y+bounds.height, getCluster().length);
2 26 Feb 07 jari 531         final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 532         final int right = getRightIndex(bounds.x+bounds.width, samples);
2 26 Feb 07 jari 533         
2 26 Feb 07 jari 534         int x, y;
2 26 Feb 07 jari 535         // draw rectangles
2 26 Feb 07 jari 536         for (int column=left; column<right; column++) {
2 26 Feb 07 jari 537             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 538                 fillRectAt(g, row, column);
2 26 Feb 07 jari 539             }
2 26 Feb 07 jari 540         }
2 26 Feb 07 jari 541         
2 26 Feb 07 jari 542         g.setColor(Color.black);
2 26 Feb 07 jari 543         int clusterNumX = elementSize.width*samples + TEXT_LEFT_MARGIN;
2 26 Feb 07 jari 544         int popX = clusterNumX + CLUSTER_POP_SPACER + getClusterNumberTextWidth((Graphics2D)g);
2 26 Feb 07 jari 545         int divX = popX + POP_DIV_SPACER + getPopulationTextWidth((Graphics2D)g);
2 26 Feb 07 jari 546         int centroidY;
2 26 Feb 07 jari 547         
2 26 Feb 07 jari 548         
2 26 Feb 07 jari 549         //draw the cluster information
2 26 Feb 07 jari 550         for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 551             centroidY = (row+1)*elementSize.height;
2 26 Feb 07 jari 552             g.drawString(Integer.toString(row+1), clusterNumX,centroidY);
2 26 Feb 07 jari 553             g.drawString(Integer.toString(clusterPopulation[row]), popX, centroidY);
2 26 Feb 07 jari 554             g.drawString(Float.toString(clusterDiversity.get(row,0)), divX, centroidY);
2 26 Feb 07 jari 555         }
2 26 Feb 07 jari 556         
2 26 Feb 07 jari 557         //draw cluster colors
2 26 Feb 07 jari 558         if(!selectedClusterList.isEmpty()){
2 26 Feb 07 jari 559             HCLCluster cluster;
2 26 Feb 07 jari 560             Color currColor = g.getColor();
2 26 Feb 07 jari 561             
2 26 Feb 07 jari 562             for(int i = 0; i < selectedClusterList.size(); i++){
2 26 Feb 07 jari 563                 cluster = (HCLCluster)selectedClusterList.get(i);
2 26 Feb 07 jari 564                 
2 26 Feb 07 jari 565                 g.setColor(cluster.color);
2 26 Feb 07 jari 566                 g.fillRect( elementSize.width*samples + 2, elementSize.height*cluster.root, 15, elementSize.height);
2 26 Feb 07 jari 567             }
2 26 Feb 07 jari 568             
2 26 Feb 07 jari 569         }
2 26 Feb 07 jari 570     }
2 26 Feb 07 jari 571     
2 26 Feb 07 jari 572     /**
2 26 Feb 07 jari 573      * Fills rect with specified row and colunn.
2 26 Feb 07 jari 574      */
2 26 Feb 07 jari 575     private void fillRectAt(Graphics g, int row, int column) {
2 26 Feb 07 jari 576         int x = column*elementSize.width;
2 26 Feb 07 jari 577         int y = row*elementSize.height;
2 26 Feb 07 jari 578         boolean mask = this.firstSelectedRow >= 0 && this.lastSelectedRow >= 0 && (row < this.firstSelectedRow || row > this.lastSelectedRow);
2 26 Feb 07 jari 579         g.setColor(getColor(this.experiment.get(getRow(row), getColumn(column))));
2 26 Feb 07 jari 580         g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 581         if (mask) {
2 26 Feb 07 jari 582             g.setColor(maskColor);
2 26 Feb 07 jari 583             g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 584         }
2 26 Feb 07 jari 585         if (this.isDrawBorders) {
2 26 Feb 07 jari 586             g.setColor(Color.black);
2 26 Feb 07 jari 587             g.drawRect(x, y, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 588         }
2 26 Feb 07 jari 589     }
2 26 Feb 07 jari 590     
2 26 Feb 07 jari 591     /**
2 26 Feb 07 jari 592      * Draws rect with specified row, column and color.
2 26 Feb 07 jari 593      */
2 26 Feb 07 jari 594     private void drawRectAt(Graphics g, int row, int column, Color color) {
2 26 Feb 07 jari 595         g.setColor(color);
2 26 Feb 07 jari 596         g.drawRect(column*elementSize.width, row*elementSize.height, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 597     }
2 26 Feb 07 jari 598     
2 26 Feb 07 jari 599     private void drawCentroidRectangle(Graphics g, int centroidNumber, Color color){
2 26 Feb 07 jari 600         Color initColor = g.getColor();
2 26 Feb 07 jari 601         g.setColor(color);
2 26 Feb 07 jari 602         g.drawRect(0, centroidNumber * elementSize.height, samplesOrder.length * elementSize.width - 1, elementSize.height - 1);
2 26 Feb 07 jari 603         g.setColor(initColor);
2 26 Feb 07 jari 604     }
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     private void fillCentroid(Graphics g, int centroidNumber){
2 26 Feb 07 jari 607         for(int col = 0; col < samplesOrder.length; col++)
2 26 Feb 07 jari 608             fillRectAt(g, centroidNumber, col);
2 26 Feb 07 jari 609     }
2 26 Feb 07 jari 610     
2 26 Feb 07 jari 611     private int getTopIndex(int top) {
2 26 Feb 07 jari 612         if (top < 0) {
2 26 Feb 07 jari 613             return 0;
2 26 Feb 07 jari 614         }
2 26 Feb 07 jari 615         return top/elementSize.height;
2 26 Feb 07 jari 616     }
2 26 Feb 07 jari 617     
2 26 Feb 07 jari 618     private int getLeftIndex(int left) {
2 26 Feb 07 jari 619         if (left < 0) {
2 26 Feb 07 jari 620             return 0;
2 26 Feb 07 jari 621         }
2 26 Feb 07 jari 622         return left/elementSize.width;
2 26 Feb 07 jari 623     }
2 26 Feb 07 jari 624     
2 26 Feb 07 jari 625     private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 626         if (right < 0) {
2 26 Feb 07 jari 627             return 0;
2 26 Feb 07 jari 628         }
2 26 Feb 07 jari 629         int result = right/elementSize.width+1;
2 26 Feb 07 jari 630         return result > limit ? limit : result;
2 26 Feb 07 jari 631     }
2 26 Feb 07 jari 632     
2 26 Feb 07 jari 633     private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 634         if (bottom < 0) {
2 26 Feb 07 jari 635             return 0;
2 26 Feb 07 jari 636         }
2 26 Feb 07 jari 637         int result = bottom/elementSize.height+1;
2 26 Feb 07 jari 638         return result > limit ? limit : result;
2 26 Feb 07 jari 639     }
2 26 Feb 07 jari 640     
2 26 Feb 07 jari 641     /**
2 26 Feb 07 jari 642      * Finds column for specified x coordinate.
2 26 Feb 07 jari 643      * @return -1 if column was not found.
2 26 Feb 07 jari 644      */
2 26 Feb 07 jari 645     private int findColumn(int targetx) {
2 26 Feb 07 jari 646         int xSize = experiment.getNumberOfSamples()*elementSize.width;
2 26 Feb 07 jari 647         if (targetx >= xSize || targetx < 0) {
2 26 Feb 07 jari 648             return -1;
2 26 Feb 07 jari 649         }
2 26 Feb 07 jari 650         return targetx/elementSize.width;
2 26 Feb 07 jari 651     }
2 26 Feb 07 jari 652     
2 26 Feb 07 jari 653     /**
2 26 Feb 07 jari 654      * Finds row for specified y coordinate.
2 26 Feb 07 jari 655      * @return -1 if row was not found.
2 26 Feb 07 jari 656      */
2 26 Feb 07 jari 657     private int findRow(int targety) {
2 26 Feb 07 jari 658         int ySize = getCluster().length*elementSize.height;
2 26 Feb 07 jari 659         if (targety >= ySize || targety < 0)
2 26 Feb 07 jari 660             return -1;
2 26 Feb 07 jari 661         return targety/elementSize.height;
2 26 Feb 07 jari 662     }
2 26 Feb 07 jari 663     
2 26 Feb 07 jari 664     private boolean isLegalPosition(int row, int column) {
2 26 Feb 07 jari 665         if (isLegalRow(row) && isLegalColumn(column))
2 26 Feb 07 jari 666             return true;
2 26 Feb 07 jari 667         return false;
2 26 Feb 07 jari 668     }
2 26 Feb 07 jari 669     
2 26 Feb 07 jari 670     private boolean isLegalColumn(int column) {
2 26 Feb 07 jari 671         if (column < 0 || column > experiment.getNumberOfSamples() -1)
2 26 Feb 07 jari 672             return false;
2 26 Feb 07 jari 673         return true;
2 26 Feb 07 jari 674     }
2 26 Feb 07 jari 675     
2 26 Feb 07 jari 676     private boolean isLegalRow(int row) {
2 26 Feb 07 jari 677         if (row < 0 || row > getCluster().length -1)
2 26 Feb 07 jari 678             return false;
2 26 Feb 07 jari 679         return true;
2 26 Feb 07 jari 680     }
2 26 Feb 07 jari 681     
2 26 Feb 07 jari 682     public int getCurrentCentroidNumber(){
2 26 Feb 07 jari 683         return this.listener.getCurrCentroidNumber();
2 26 Feb 07 jari 684     }
2 26 Feb 07 jari 685     
2 26 Feb 07 jari 686     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 687      */
2 26 Feb 07 jari 688     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 689         return null;
2 26 Feb 07 jari 690     }    
2 26 Feb 07 jari 691     
2 26 Feb 07 jari 692     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 693      * posibly null
2 26 Feb 07 jari 694      */
2 26 Feb 07 jari 695     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 696         return null;
2 26 Feb 07 jari 697     }
2 26 Feb 07 jari 698     
2 26 Feb 07 jari 699     /** Returns int value indicating viewer type
2 26 Feb 07 jari 700      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 701      */
2 26 Feb 07 jari 702     public int getViewerType() {
2 26 Feb 07 jari 703         return org.tigr.microarray.mev.cluster.clusterUtil.Cluster.GENE_CLUSTER;
2 26 Feb 07 jari 704     }
2 26 Feb 07 jari 705     
2 26 Feb 07 jari 706     private class Listener extends MouseAdapter implements ActionListener, MouseMotionListener{
2 26 Feb 07 jari 707         
2 26 Feb 07 jari 708         int x = 0;
2 26 Feb 07 jari 709         int y = 0;
2 26 Feb 07 jari 710         int currCentroidNumber;
2 26 Feb 07 jari 711         int oldCentroidNumber;
2 26 Feb 07 jari 712         Point origin;
2 26 Feb 07 jari 713         int originX;
2 26 Feb 07 jari 714         int originY;
2 26 Feb 07 jari 715         Rectangle expBounds;
2 26 Feb 07 jari 716         float xDim;
2 26 Feb 07 jari 717         float yDim;
2 26 Feb 07 jari 718         Graphics g;
2 26 Feb 07 jari 719         Color rectangleColor = Color.white;
2 26 Feb 07 jari 720         
2 26 Feb 07 jari 721         public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
2 26 Feb 07 jari 722             
2 26 Feb 07 jari 723             
2 26 Feb 07 jari 724             
2 26 Feb 07 jari 725         }
2 26 Feb 07 jari 726         
2 26 Feb 07 jari 727         public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
2 26 Feb 07 jari 728         }
2 26 Feb 07 jari 729         
2 26 Feb 07 jari 730         public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {
2 26 Feb 07 jari 731             x = (int)mouseEvent.getX();
2 26 Feb 07 jari 732             y = (int)mouseEvent.getY();
2 26 Feb 07 jari 733             
2 26 Feb 07 jari 734             currCentroidNumber = cursorOverCentroid(x,y);
2 26 Feb 07 jari 735             
2 26 Feb 07 jari 736             if(currCentroidNumber != oldCentroidNumber){
2 26 Feb 07 jari 737                 g = getGraphics();
2 26 Feb 07 jari 738                 
2 26 Feb 07 jari 739                 if( currCentroidNumber != -1){
2 26 Feb 07 jari 740                     if(oldCentroidNumber != -1){
2 26 Feb 07 jari 741                         for(int col = 0; col < samplesOrder.length; col++)
2 26 Feb 07 jari 742                             fillRectAt(g, oldCentroidNumber, col);
2 26 Feb 07 jari 743                     }
2 26 Feb 07 jari 744                     
2 26 Feb 07 jari 745                     drawCentroidRectangle(g, currCentroidNumber, rectangleColor);
2 26 Feb 07 jari 746                     framework.setStatusText("Cluster # " +(currCentroidNumber+1)+",  Population: "+clusterPopulation[currCentroidNumber]+",  Diversity: "+clusterDiversity.get(currCentroidNumber,0));
2 26 Feb 07 jari 747                     
2 26 Feb 07 jari 748                 }
2 26 Feb 07 jari 749                 if(currCentroidNumber == -1 && oldCentroidNumber != -1){
2 26 Feb 07 jari 750                     for(int col = 0; col < samplesOrder.length; col++)
2 26 Feb 07 jari 751                         fillRectAt(g, oldCentroidNumber, col);
2 26 Feb 07 jari 752                     framework.setStatusText(" ");
2 26 Feb 07 jari 753                 }
2 26 Feb 07 jari 754                 
2 26 Feb 07 jari 755                 oldCentroidNumber = currCentroidNumber;
2 26 Feb 07 jari 756             }
2 26 Feb 07 jari 757         }
2 26 Feb 07 jari 758         
2 26 Feb 07 jari 759         public void mouseExited(java.awt.event.MouseEvent mouseEvent){
2 26 Feb 07 jari 760             Graphics g = getGraphics();
2 26 Feb 07 jari 761             if(currCentroidNumber != -1)
2 26 Feb 07 jari 762                 fillCentroid(g, currCentroidNumber);
2 26 Feb 07 jari 763             if(oldCentroidNumber != -1)
2 26 Feb 07 jari 764                 fillCentroid(g, oldCentroidNumber);
2 26 Feb 07 jari 765             currCentroidNumber = -1;
2 26 Feb 07 jari 766         }
2 26 Feb 07 jari 767         
2 26 Feb 07 jari 768         
2 26 Feb 07 jari 769         private int cursorOverCentroid(int x, int y){
2 26 Feb 07 jari 770             currCentroidNumber = -1;
2 26 Feb 07 jari 771             
2 26 Feb 07 jari 772             originX = 0;
2 26 Feb 07 jari 773             originY = 0;
2 26 Feb 07 jari 774             
2 26 Feb 07 jari 775             xDim = (float)samplesOrder.length * elementSize.width;
2 26 Feb 07 jari 776             yDim = (float)numberOfCentroids * elementSize.height;
2 26 Feb 07 jari 777             
2 26 Feb 07 jari 778             if( (originX < x && x < originX + xDim) &&
2 26 Feb 07 jari 779             (originY < y && y < originY + yDim)){
2 26 Feb 07 jari 780                 
2 26 Feb 07 jari 781                 currCentroidNumber = (int)(numberOfCentroids * (y - originY)/yDim);
2 26 Feb 07 jari 782                 
2 26 Feb 07 jari 783             }
2 26 Feb 07 jari 784             
2 26 Feb 07 jari 785             
2 26 Feb 07 jari 786             return currCentroidNumber;
2 26 Feb 07 jari 787         }
2 26 Feb 07 jari 788         
2 26 Feb 07 jari 789         public int getCurrCentroidNumber(){
2 26 Feb 07 jari 790             return currCentroidNumber;
2 26 Feb 07 jari 791             
2 26 Feb 07 jari 792         }
2 26 Feb 07 jari 793         
2 26 Feb 07 jari 794     }
2 26 Feb 07 jari 795     
2 26 Feb 07 jari 796     
2 26 Feb 07 jari 797     
2 26 Feb 07 jari 798     
2 26 Feb 07 jari 799     
2 26 Feb 07 jari 800 }