mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/sota/SOTAExpCentroidExpressionViewer.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: SOTAExpCentroidExpressionViewer.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.Insets;
2 26 Feb 07 jari 23 import java.awt.Point;
2 26 Feb 07 jari 24 import java.awt.Rectangle;
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.MouseAdapter;
2 26 Feb 07 jari 28 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 29 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 30 import java.beans.Expression;
2 26 Feb 07 jari 31
2 26 Feb 07 jari 32 import java.io.IOException;
2 26 Feb 07 jari 33 import java.io.ObjectInputStream;
2 26 Feb 07 jari 34 import java.io.ObjectOutputStream;
2 26 Feb 07 jari 35 import java.util.ArrayList;
2 26 Feb 07 jari 36
2 26 Feb 07 jari 37 import javax.swing.JComponent;
2 26 Feb 07 jari 38 import javax.swing.JOptionPane;
2 26 Feb 07 jari 39 import javax.swing.JPanel;
2 26 Feb 07 jari 40
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.IFramework;
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.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 public class SOTAExpCentroidExpressionViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 51     
2 26 Feb 07 jari 52     private int numberOfCentroids;
2 26 Feb 07 jari 53     private int [] clusterPopulation;
2 26 Feb 07 jari 54     private FloatMatrix clusterDiversity;
2 26 Feb 07 jari 55     
2 26 Feb 07 jari 56     private int TEXT_LEFT_MARGIN = 20;
2 26 Feb 07 jari 57     private int CLUSTER_POP_SPACER = 20;
2 26 Feb 07 jari 58     private int POP_DIV_SPACER = 20;
2 26 Feb 07 jari 59     private static final float INITIAL_MAX_VALUE = 3f;
2 26 Feb 07 jari 60     private static final float INITIAL_MIN_VALUE = -3f;
2 26 Feb 07 jari 61     private static final String NO_GENES_STR = "No Experiments in Cluster!";
2 26 Feb 07 jari 62     private static final Font ERROR_FONT = new Font("monospaced", Font.BOLD, 20);
2 26 Feb 07 jari 63     
2 26 Feb 07 jari 64     private ColorBarHeader header;
2 26 Feb 07 jari 65     private Experiment experiment;
2 26 Feb 07 jari 66     private Experiment experimentMap;
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     private IFramework framework;
2 26 Feb 07 jari 69     private IData data;
2 26 Feb 07 jari 70     private int clusterIndex;
2 26 Feb 07 jari 71     private int labelIndex;
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 Insets insets = new Insets(0,10,0,0);
2 26 Feb 07 jari 90     private int numberOfGenes;
2 26 Feb 07 jari 91     private boolean haveColorBar = false;
2 26 Feb 07 jari 92     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 93     private int exptID = 0;
2 26 Feb 07 jari 94     
2 26 Feb 07 jari 95     
2 26 Feb 07 jari 96     /**
2 26 Feb 07 jari 97      * Constructs an <code>SOTAExpCentroidEpressionViewer</code> with specified
2 26 Feb 07 jari 98      * experiment, clusters, samples order and draw annotations attribute.
2 26 Feb 07 jari 99      *
2 26 Feb 07 jari 100      * @param centroidData, contains the values of the cluster centroids.
2 26 Feb 07 jari 101      * @param clusters the two dimensional array with gene indices.
2 26 Feb 07 jari 102      * @param samplesOrder the one dimensional array with samples indices.
2 26 Feb 07 jari 103      * @param clusterPop array containing genes per cluster
2 26 Feb 07 jari 104      * @param clusterDiv diversity measure of each cluster
2 26 Feb 07 jari 105      * @param selClusterList, ArrayList shared with parent viewer which accumulates selected clusters
2 26 Feb 07 jari 106      */
2 26 Feb 07 jari 107     public SOTAExpCentroidExpressionViewer(Experiment centroidData, Experiment experimentMap, int[][] clusters, int[] samplesOrder, int[] clusterPop, FloatMatrix clusterDiv, ArrayList selClusterList) {
2 26 Feb 07 jari 108         if (centroidData == null) {
2 26 Feb 07 jari 109             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 110         }
2 26 Feb 07 jari 111         this.experiment = centroidData;
2 26 Feb 07 jari 112         this.exptID = experiment.getId();
2 26 Feb 07 jari 113         this.experimentMap = experimentMap;
2 26 Feb 07 jari 114         this.numberOfGenes = this.experiment.getNumberOfGenes();
2 26 Feb 07 jari 115         this.clusterPopulation = clusterPop;
2 26 Feb 07 jari 116         this.clusterDiversity = clusterDiv;
2 26 Feb 07 jari 117         this.numberOfCentroids = clusterPopulation.length;
2 26 Feb 07 jari 118         this.selectedClusterList = selClusterList;
2 26 Feb 07 jari 119         this.clusters = clusters == null ? defGenesOrder(experiment.getNumberOfGenes()) : clusters;
2 26 Feb 07 jari 120         this.samplesOrder = samplesOrder == null ? defSamplesOrder(experiment.getNumberOfSamples()) : samplesOrder;
2 26 Feb 07 jari 121         this.header = new ColorBarHeader(this.numberOfCentroids);
2 26 Feb 07 jari 122         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 123         setBackground(Color.white);
2 26 Feb 07 jari 124         
2 26 Feb 07 jari 125         listener = new Listener();
2 26 Feb 07 jari 126         this.addMouseMotionListener(listener);
2 26 Feb 07 jari 127         this.addMouseListener(listener);
2 26 Feb 07 jari 128     }
2 26 Feb 07 jari 129     //Implemented only to satisfy IViewer interface.
2 26 Feb 07 jari 130     //This class is never saved.
2 26 Feb 07 jari 131     public Expression getExpression(){return null;}
2 26 Feb 07 jari 132     public int getExperimentID() {return exptID;}
2 26 Feb 07 jari 133     public void setExperimentID(int e){this.exptID = e;}
2 26 Feb 07 jari 134     public void setExperiment(Experiment e) {
2 26 Feb 07 jari 135       this.experiment = e;
2 26 Feb 07 jari 136       this.exptID = e.getId();
2 26 Feb 07 jari 137       this.numberOfGenes = this.experiment.getNumberOfGenes();
2 26 Feb 07 jari 138     }
2 26 Feb 07 jari 139
2 26 Feb 07 jari 140     
2 26 Feb 07 jari 141     /**
2 26 Feb 07 jari 142      * Constucts a default sample order, sequential
2 26 Feb 07 jari 143      */
2 26 Feb 07 jari 144     private static int[] defSamplesOrder(int size) {
2 26 Feb 07 jari 145         int[] order = new int[size];
2 26 Feb 07 jari 146         for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 147             order[i] = i;
2 26 Feb 07 jari 148         }
2 26 Feb 07 jari 149         return order;
2 26 Feb 07 jari 150     }
2 26 Feb 07 jari 151     
2 26 Feb 07 jari 152     /**
2 26 Feb 07 jari 153      * Constucts a default gene order, sequential
2 26 Feb 07 jari 154      */
2 26 Feb 07 jari 155     private static int[][] defGenesOrder(int size) {
2 26 Feb 07 jari 156         int[][] order = new int[1][size];
2 26 Feb 07 jari 157         for (int i=0; i<order[0].length; i++) {
2 26 Feb 07 jari 158             order[0][i] = i;
2 26 Feb 07 jari 159         }
2 26 Feb 07 jari 160         return order;
2 26 Feb 07 jari 161     }
2 26 Feb 07 jari 162     
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     /**
2 26 Feb 07 jari 165      * Returns component to render the experiment header.
2 26 Feb 07 jari 166      */
2 26 Feb 07 jari 167     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 168         return header;
2 26 Feb 07 jari 169     }
2 26 Feb 07 jari 170     
2 26 Feb 07 jari 171     /**
2 26 Feb 07 jari 172      * Returns component to render the experiment values.
2 26 Feb 07 jari 173      */
2 26 Feb 07 jari 174     public JComponent getContentComponent() {
2 26 Feb 07 jari 175         return this;
2 26 Feb 07 jari 176     }
2 26 Feb 07 jari 177     
2 26 Feb 07 jari 178     /**
2 26 Feb 07 jari 179      * Returns null.
2 26 Feb 07 jari 180      */
2 26 Feb 07 jari 181     public BufferedImage getImage() {
2 26 Feb 07 jari 182         return null;
2 26 Feb 07 jari 183     }
2 26 Feb 07 jari 184     
2 26 Feb 07 jari 185     /**
2 26 Feb 07 jari 186      * Returns a gradient image for positive values.
2 26 Feb 07 jari 187      */
2 26 Feb 07 jari 188     public BufferedImage getPosColorImage() {
2 26 Feb 07 jari 189         return posColorImage;
2 26 Feb 07 jari 190     }
2 26 Feb 07 jari 191     
2 26 Feb 07 jari 192     /**
2 26 Feb 07 jari 193      * Returns a gradient image for negative values.
2 26 Feb 07 jari 194      */
2 26 Feb 07 jari 195     public BufferedImage getNegColorImage() {
2 26 Feb 07 jari 196         return negColorImage;
2 26 Feb 07 jari 197     }
2 26 Feb 07 jari 198     
2 26 Feb 07 jari 199     /**
2 26 Feb 07 jari 200      * Returns a color assigned for a NaN value.
2 26 Feb 07 jari 201      */
2 26 Feb 07 jari 202     public Color getMissingColor() {
2 26 Feb 07 jari 203         return missingColor;
2 26 Feb 07 jari 204     }
2 26 Feb 07 jari 205     
2 26 Feb 07 jari 206     /**
2 26 Feb 07 jari 207      * returns true if a probe in the current viewer has color
2 26 Feb 07 jari 208      */
2 26 Feb 07 jari 209     protected  boolean areProbesColored() {
2 26 Feb 07 jari 210         int [] indices = this.getCluster();
2 26 Feb 07 jari 211         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 212             if( this.data.getProbeColor(this.getMultipleArrayDataRow(i)) != null){
2 26 Feb 07 jari 213                 return true;
2 26 Feb 07 jari 214             }
2 26 Feb 07 jari 215         }
2 26 Feb 07 jari 216         return false;
2 26 Feb 07 jari 217     }
2 26 Feb 07 jari 218     
2 26 Feb 07 jari 219     /**
2 26 Feb 07 jari 220      * Selects rows from start to end.
2 26 Feb 07 jari 221      */
2 26 Feb 07 jari 222     public void selectRows(int start, int end) {
2 26 Feb 07 jari 223         firstSelectedRow = start;
2 26 Feb 07 jari 224         lastSelectedRow  = end;
2 26 Feb 07 jari 225         repaint();
2 26 Feb 07 jari 226     }
2 26 Feb 07 jari 227     
2 26 Feb 07 jari 228     /**
2 26 Feb 07 jari 229      * Initializes appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 230      * @see IViewer#onSelected
2 26 Feb 07 jari 231      */
2 26 Feb 07 jari 232     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 233         this.framework = framework;
2 26 Feb 07 jari 234         this.data = framework.getData();
2 26 Feb 07 jari 235         
2 26 Feb 07 jari 236         Integer userObject = (Integer)framework.getUserObject();
2 26 Feb 07 jari 237         setClusterIndex(userObject == null ? 0 : userObject.intValue());
2 26 Feb 07 jari 238         IDisplayMenu menu = framework.getDisplayMenu();
2 26 Feb 07 jari 239         useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 240         this.labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 241         this.maxValue = Math.abs(menu.getMaxRatioScale());
2 26 Feb 07 jari 242         this.minValue = -Math.abs(menu.getMinRatioScale());
2 26 Feb 07 jari 243         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 244         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 245         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 246         
2 26 Feb 07 jari 247         updateSize();
2 26 Feb 07 jari 248         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 249         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 250         if(this.selectedClusterList.size() > 0)
2 26 Feb 07 jari 251             this.insets.top = elementSize.height+1;
2 26 Feb 07 jari 252         else
2 26 Feb 07 jari 253             this.insets.top = 0;
2 26 Feb 07 jari 254         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 255         //header.setValues(maxValue, minValue);
2 26 Feb 07 jari 256         header.setValues(minValue, maxValue);
2 26 Feb 07 jari 257         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 258         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 259     }
2 26 Feb 07 jari 260     
2 26 Feb 07 jari 261     
2 26 Feb 07 jari 262     
2 26 Feb 07 jari 263     /**
2 26 Feb 07 jari 264      * Updates appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 265      * @see IViewer#onMenuChanged
2 26 Feb 07 jari 266      */
2 26 Feb 07 jari 267     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 268       useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 269         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 270         this.labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 271         this.maxValue = Math.abs(menu.getMaxRatioScale());
2 26 Feb 07 jari 272         this.minValue = -Math.abs(menu.getMinRatioScale());
2 26 Feb 07 jari 273         header.setValues(minValue, maxValue);
2 26 Feb 07 jari 274         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 275         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 276         this.header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 277         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 278         if(this.selectedClusterList.size() > 0)
2 26 Feb 07 jari 279             this.insets.top = elementSize.height+1;
2 26 Feb 07 jari 280         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 281         haveColorBar = areProbesColored();
2 26 Feb 07 jari 282         updateSize();
2 26 Feb 07 jari 283         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 284         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 285     }
2 26 Feb 07 jari 286     
2 26 Feb 07 jari 287     /**
2 26 Feb 07 jari 288      * Sets data for this viewer and its header.
2 26 Feb 07 jari 289      * @see IViewer#onDataChanged
2 26 Feb 07 jari 290      */
2 26 Feb 07 jari 291     public void onDataChanged(IData data) {
2 26 Feb 07 jari 292         this.data = data;
2 26 Feb 07 jari 293         if(this.selectedClusterList.size() > 0)
2 26 Feb 07 jari 294             this.insets.top = elementSize.height + 1;
2 26 Feb 07 jari 295         else
2 26 Feb 07 jari 296             this.insets.top = 0;
2 26 Feb 07 jari 297     }
2 26 Feb 07 jari 298     
2 26 Feb 07 jari 299     public void onDeselected() {}
2 26 Feb 07 jari 300     public void onClosed() {}
2 26 Feb 07 jari 301     
2 26 Feb 07 jari 302     /**
2 26 Feb 07 jari 303      * Sets cluster index to be displayed.
2 26 Feb 07 jari 304      */
2 26 Feb 07 jari 305     public void setClusterIndex(int clusterIndex) {
2 26 Feb 07 jari 306         this.clusterIndex = clusterIndex;
2 26 Feb 07 jari 307     }
2 26 Feb 07 jari 308     
2 26 Feb 07 jari 309     /**
2 26 Feb 07 jari 310      * Returns index of current cluster.
2 26 Feb 07 jari 311      */
2 26 Feb 07 jari 312     public int getClusterIndex() {
2 26 Feb 07 jari 313         return clusterIndex;
2 26 Feb 07 jari 314     }
2 26 Feb 07 jari 315     
2 26 Feb 07 jari 316     /**
2 26 Feb 07 jari 317      * Returns indices of current cluster.
2 26 Feb 07 jari 318      */
2 26 Feb 07 jari 319     public int[] getCluster() {
2 26 Feb 07 jari 320         return clusters[this.clusterIndex];
2 26 Feb 07 jari 321     }
2 26 Feb 07 jari 322     
2 26 Feb 07 jari 323     /**
2 26 Feb 07 jari 324      * Returns all the clusters.
2 26 Feb 07 jari 325      */
2 26 Feb 07 jari 326     public int[][] getClusters() {
2 26 Feb 07 jari 327         return clusters;
2 26 Feb 07 jari 328     }
2 26 Feb 07 jari 329     
2 26 Feb 07 jari 330     private int getRow(int row) {
2 26 Feb 07 jari 331         return this.clusters[this.clusterIndex][row];
2 26 Feb 07 jari 332     }
2 26 Feb 07 jari 333     
2 26 Feb 07 jari 334     private int getColumn(int column) {
2 26 Feb 07 jari 335         return samplesOrder[column];
2 26 Feb 07 jari 336     }
2 26 Feb 07 jari 337     
2 26 Feb 07 jari 338     /**
2 26 Feb 07 jari 339      * Returns wrapped experiment.
2 26 Feb 07 jari 340      */
2 26 Feb 07 jari 341     public Experiment getExperiment() {
2 26 Feb 07 jari 342         return experiment;
2 26 Feb 07 jari 343     }
2 26 Feb 07 jari 344     
2 26 Feb 07 jari 345     /**
2 26 Feb 07 jari 346      *  Returns the row (index) within the main iData which corresponds to
2 26 Feb 07 jari 347      *  the passed index to the clusters array
2 26 Feb 07 jari 348      */
2 26 Feb 07 jari 349     private int getMultipleArrayDataRow(int clusterArrayRow) {
2 26 Feb 07 jari 350         return experimentMap.getGeneIndexMappedToData(clusterArrayRow);
2 26 Feb 07 jari 351     }
2 26 Feb 07 jari 352     
2 26 Feb 07 jari 353     /**
2 26 Feb 07 jari 354      * Converts cluster indicies from the experiment to IData rows which could be different
2 26 Feb 07 jari 355      */
2 26 Feb 07 jari 356     private int [] getIDataRowIndices(int [] expIndices){
2 26 Feb 07 jari 357         int [] dataIndices = new int[expIndices.length];
2 26 Feb 07 jari 358         for(int i = 0; i < expIndices.length; i++){
2 26 Feb 07 jari 359             dataIndices[i] = experimentMap.getGeneIndexMappedToData(expIndices[i]);
2 26 Feb 07 jari 360         }
2 26 Feb 07 jari 361         return dataIndices;
2 26 Feb 07 jari 362     }
2 26 Feb 07 jari 363     
2 26 Feb 07 jari 364     /**
2 26 Feb 07 jari 365      * Returns the data.
2 26 Feb 07 jari 366      */
2 26 Feb 07 jari 367     protected IData getData() {
2 26 Feb 07 jari 368         return data;
2 26 Feb 07 jari 369     }
2 26 Feb 07 jari 370     
2 26 Feb 07 jari 371     /**
2 26 Feb 07 jari 372      * Sets public color for the current cluster.
2 26 Feb 07 jari 373      */
2 26 Feb 07 jari 374     public void setClusterColor(Color color) {
2 26 Feb 07 jari 375         this.data.setExperimentColor(getIDataRowIndices(getCluster()), color);
2 26 Feb 07 jari 376         this.insets.top = elementSize.height+1;
2 26 Feb 07 jari 377     }
2 26 Feb 07 jari 378     
2 26 Feb 07 jari 379     /**
2 26 Feb 07 jari 380      * Saves all the clusters.
2 26 Feb 07 jari 381      */
2 26 Feb 07 jari 382     public void saveClusters(Frame frame) throws Exception {
2 26 Feb 07 jari 383         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 384         ExperimentUtil.saveAllExperimentClusters(frame, getExperiment(), getData(), getClusters());
2 26 Feb 07 jari 385     }
2 26 Feb 07 jari 386     
2 26 Feb 07 jari 387     /**
2 26 Feb 07 jari 388      * Saves current cluster.
2 26 Feb 07 jari 389      */
2 26 Feb 07 jari 390     public void saveCluster(Frame frame) throws Exception {
2 26 Feb 07 jari 391         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 392         ExperimentUtil.saveExperimentCluster(frame, getExperiment(), getData(), getCluster());
2 26 Feb 07 jari 393     }
2 26 Feb 07 jari 394     
2 26 Feb 07 jari 395     /**
2 26 Feb 07 jari 396      * Sets a shape size.
2 26 Feb 07 jari 397      */
2 26 Feb 07 jari 398     private void setElementSize(Dimension elementSize) {
2 26 Feb 07 jari 399         this.elementSize = new Dimension(elementSize);
2 26 Feb 07 jari 400     }
2 26 Feb 07 jari 401     
2 26 Feb 07 jari 402     /**
2 26 Feb 07 jari 403      * Sets anti-aliasing attribute.
2 26 Feb 07 jari 404      */
2 26 Feb 07 jari 405     private void setAntialiasing(boolean value) {
2 26 Feb 07 jari 406         this.isAntiAliasing = value;
2 26 Feb 07 jari 407     }
2 26 Feb 07 jari 408     
2 26 Feb 07 jari 409     /**
2 26 Feb 07 jari 410      * Sets draw borders attribute.
2 26 Feb 07 jari 411      */
2 26 Feb 07 jari 412     private void setDrawBorders(boolean value) {
2 26 Feb 07 jari 413         this.isDrawBorders = value;
2 26 Feb 07 jari 414     }
2 26 Feb 07 jari 415     
2 26 Feb 07 jari 416     /**
2 26 Feb 07 jari 417      * Creates a gradient image with specified initial colors.
2 26 Feb 07 jari 418      */
2 26 Feb 07 jari 419     public BufferedImage createGradientImage(Color color1, Color color2) {
2 26 Feb 07 jari 420         BufferedImage image = (BufferedImage)java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(256,1);
2 26 Feb 07 jari 421         Graphics2D graphics = image.createGraphics();
2 26 Feb 07 jari 422         GradientPaint gp = new GradientPaint(0, 0, color1, 255, 0, color2);
2 26 Feb 07 jari 423         graphics.setPaint(gp);
2 26 Feb 07 jari 424         graphics.drawRect(0, 0, 255, 1);
2 26 Feb 07 jari 425         return image;
2 26 Feb 07 jari 426     }
2 26 Feb 07 jari 427     
2 26 Feb 07 jari 428     /**
2 26 Feb 07 jari 429      * Updates size of this viewer.
2 26 Feb 07 jari 430      */
2 26 Feb 07 jari 431     private void updateSize() {
2 26 Feb 07 jari 432         
2 26 Feb 07 jari 433         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 434             setFont(ERROR_FONT);
2 26 Feb 07 jari 435             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 436             FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 437             int width = metrics.stringWidth(NO_GENES_STR)+10;
2 26 Feb 07 jari 438             int height = metrics.getHeight()+30;
2 26 Feb 07 jari 439             setSize(width, height);
2 26 Feb 07 jari 440             setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 441             return;
2 26 Feb 07 jari 442         }
2 26 Feb 07 jari 443         
2 26 Feb 07 jari 444         setFont(new Font("monospaced", Font.PLAIN, elementSize.height));
2 26 Feb 07 jari 445         Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 446         int width = elementSize.width*numberOfCentroids+insets.left+1;
2 26 Feb 07 jari 447         
2 26 Feb 07 jari 448         width += getAnnotationWidth(g) + 30;
2 26 Feb 07 jari 449         
2 26 Feb 07 jari 450         int height = elementSize.height*this.experiment.getNumberOfGenes()+insets.top+1;
2 26 Feb 07 jari 451         setSize(width, height);
2 26 Feb 07 jari 452         setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 453     }
2 26 Feb 07 jari 454     
2 26 Feb 07 jari 455     private int getAnnotationWidth(Graphics g){
2 26 Feb 07 jari 456         int maxWidth = 0;
2 26 Feb 07 jari 457         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 458         for(int i = 0; i < numberOfGenes; i++){
2 26 Feb 07 jari 459             maxWidth = Math.max(maxWidth, fm.stringWidth(data.getElementAttribute(getMultipleArrayDataRow(i), labelIndex)));
2 26 Feb 07 jari 460         }
2 26 Feb 07 jari 461         return maxWidth;
2 26 Feb 07 jari 462     }
2 26 Feb 07 jari 463     
2 26 Feb 07 jari 464     private int getClusterTextWidth(Graphics2D g){
2 26 Feb 07 jari 465         return getPopulationTextWidth(g) + getDiversityTextWidth(g) + getClusterNumberTextWidth(g);
2 26 Feb 07 jari 466     }
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     private int getPopulationTextWidth(Graphics2D g){
2 26 Feb 07 jari 469         int maxWidth = 0;
2 26 Feb 07 jari 470         int currWidth = 0;
2 26 Feb 07 jari 471         
2 26 Feb 07 jari 472         if(this.clusterPopulation == null) return 0;
2 26 Feb 07 jari 473         
2 26 Feb 07 jari 474         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 475         for(int i = 0; i < clusterPopulation.length; i++){
2 26 Feb 07 jari 476             currWidth = fm.stringWidth(String.valueOf(clusterPopulation[i]));
2 26 Feb 07 jari 477             if(currWidth > maxWidth)
2 26 Feb 07 jari 478                 maxWidth = currWidth;
2 26 Feb 07 jari 479         }
2 26 Feb 07 jari 480         return maxWidth;
2 26 Feb 07 jari 481     }
2 26 Feb 07 jari 482     
2 26 Feb 07 jari 483     
2 26 Feb 07 jari 484     private int getDiversityTextWidth(Graphics2D g){
2 26 Feb 07 jari 485         int maxWidth = 0;
2 26 Feb 07 jari 486         int currWidth = 0;
2 26 Feb 07 jari 487         int n;
2 26 Feb 07 jari 488         
2 26 Feb 07 jari 489         if(this.clusterDiversity == null) return 0;
2 26 Feb 07 jari 490         n = clusterDiversity.getRowDimension();
2 26 Feb 07 jari 491         
2 26 Feb 07 jari 492         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 493         for(int i = 0; i < n; i++){
2 26 Feb 07 jari 494             
2 26 Feb 07 jari 495             currWidth = fm.stringWidth(String.valueOf(clusterDiversity.get(i,0)));
2 26 Feb 07 jari 496             
2 26 Feb 07 jari 497             if(currWidth > maxWidth)
2 26 Feb 07 jari 498                 maxWidth = currWidth;
2 26 Feb 07 jari 499         }
2 26 Feb 07 jari 500         return maxWidth;
2 26 Feb 07 jari 501     }
2 26 Feb 07 jari 502     
2 26 Feb 07 jari 503     private int getClusterNumberTextWidth(Graphics2D g){
2 26 Feb 07 jari 504         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 505         return  fm.stringWidth(String.valueOf(numberOfCentroids));
2 26 Feb 07 jari 506     }
2 26 Feb 07 jari 507     
2 26 Feb 07 jari 508     
2 26 Feb 07 jari 509     /**
2 26 Feb 07 jari 510      * Calculates color for passed value.
2 26 Feb 07 jari 511      */
2 26 Feb 07 jari 512     private Color getColor(float value) {
2 26 Feb 07 jari 513         if (Float.isNaN(value)) {
2 26 Feb 07 jari 514             return missingColor;
2 26 Feb 07 jari 515         }
2 26 Feb 07 jari 516         
2 26 Feb 07 jari 517         float maximum;
2 26 Feb 07 jari 518         int colorIndex, rgb;
2 26 Feb 07 jari 519         
2 26 Feb 07 jari 520         if(useDoubleGradient) {
2 26 Feb 07 jari 521           maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 522       colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 523       colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 524       rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 525           : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 526         } else {
2 26 Feb 07 jari 527           float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 528           if(value <= minValue)
2 26 Feb 07 jari 529             colorIndex = 0;
2 26 Feb 07 jari 530           else if(value >= maxValue)
2 26 Feb 07 jari 531             colorIndex = 255;
2 26 Feb 07 jari 532           else
2 26 Feb 07 jari 533             colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 534            
2 26 Feb 07 jari 535           rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 536         }
2 26 Feb 07 jari 537         return new Color(rgb);
2 26 Feb 07 jari 538     }
2 26 Feb 07 jari 539     
2 26 Feb 07 jari 540     /**
2 26 Feb 07 jari 541      * Paint component into specified graphics.
2 26 Feb 07 jari 542      */
2 26 Feb 07 jari 543     public void paint(Graphics g) {
2 26 Feb 07 jari 544         super.paint(g);
2 26 Feb 07 jari 545         // if (this.data == null) {
2 26 Feb 07 jari 546         //    return;
2 26 Feb 07 jari 547         //}
2 26 Feb 07 jari 548         
2 26 Feb 07 jari 549         if (this.isAntiAliasing) {
2 26 Feb 07 jari 550             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 551             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 552         }
2 26 Feb 07 jari 553         else{
2 26 Feb 07 jari 554             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
2 26 Feb 07 jari 555             ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
2 26 Feb 07 jari 556         }
2 26 Feb 07 jari 557         
2 26 Feb 07 jari 558         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 559             g.setColor(new Color(0, 0, 128));
2 26 Feb 07 jari 560             g.setFont(ERROR_FONT);
2 26 Feb 07 jari 561             g.drawString(NO_GENES_STR, 10, 30);
2 26 Feb 07 jari 562             return;
2 26 Feb 07 jari 563         }
2 26 Feb 07 jari 564         
2 26 Feb 07 jari 565         Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 566         final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 567         final int bottom = getBottomIndex(bounds.y+bounds.height, getCluster().length);
2 26 Feb 07 jari 568         final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 569         final int right = getRightIndex(bounds.x+bounds.width, numberOfCentroids);
2 26 Feb 07 jari 570         
2 26 Feb 07 jari 571         int x, y;
2 26 Feb 07 jari 572         // draw rectangles
2 26 Feb 07 jari 573         for (int column=left; column<right; column++) {
2 26 Feb 07 jari 574             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 575                 fillRectAt(g, row, column);
2 26 Feb 07 jari 576             }
2 26 Feb 07 jari 577         }
2 26 Feb 07 jari 578         
2 26 Feb 07 jari 579         g.setColor(Color.black);
2 26 Feb 07 jari 580         //  int clusterNumX = elementSize.width*samples + TEXT_LEFT_MARGIN;
2 26 Feb 07 jari 581         //  int popX = clusterNumX + CLUSTER_POP_SPACER + getClusterNumberTextWidth((Graphics2D)g);
2 26 Feb 07 jari 582         //  int divX = popX + POP_DIV_SPACER + getPopulationTextWidth((Graphics2D)g);
2 26 Feb 07 jari 583         //  int centroidY;
2 26 Feb 07 jari 584         
2 26 Feb 07 jari 585         
2 26 Feb 07 jari 586         //draw the cluster information
2 26 Feb 07 jari 587 /*  for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 588             centroidY = (row+1)*elementSize.height;
2 26 Feb 07 jari 589             g.drawString(Integer.toString(row+1), clusterNumX,centroidY);
2 26 Feb 07 jari 590             g.drawString(Integer.toString(clusterPopulation[row]), popX, centroidY);
2 26 Feb 07 jari 591             g.drawString(Float.toString(clusterDiversity.get(row,0)), divX, centroidY);
2 26 Feb 07 jari 592         }
2 26 Feb 07 jari 593  */
2 26 Feb 07 jari 594         //draw cluster colors
2 26 Feb 07 jari 595         if(!selectedClusterList.isEmpty()){
2 26 Feb 07 jari 596             HCLCluster cluster;
2 26 Feb 07 jari 597             Color currColor = g.getColor();
2 26 Feb 07 jari 598             
2 26 Feb 07 jari 599             for(int i = 0; i < selectedClusterList.size(); i++){
2 26 Feb 07 jari 600                 cluster = (HCLCluster)selectedClusterList.get(i);
2 26 Feb 07 jari 601                 g.setColor(cluster.color);
2 26 Feb 07 jari 602                 //  g.fillRect( elementSize.width*numberOfCentroids + 2, elementSize.height*cluster.root, 15, elementSize.height);
2 26 Feb 07 jari 603                 g.fillRect( elementSize.width*cluster.root+insets.left, 0, elementSize.width, elementSize.height );
2 26 Feb 07 jari 604             }
2 26 Feb 07 jari 605         }
2 26 Feb 07 jari 606        
2 26 Feb 07 jari 607         
2 26 Feb 07 jari 608         if (right >= numberOfCentroids) {
2 26 Feb 07 jari 609             String label = "";
2 26 Feb 07 jari 610             g.setColor(Color.black);
2 26 Feb 07 jari 611             int uniqX = elementSize.width*numberOfCentroids+10;
2 26 Feb 07 jari 612             int annY;
2 26 Feb 07 jari 613             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 614                 if (labelIndex >= 0) {
2 26 Feb 07 jari 615                     label = data.getElementAttribute(getMultipleArrayDataRow(row), labelIndex);
2 26 Feb 07 jari 616                 }
2 26 Feb 07 jari 617                 annY = (row+1)*elementSize.height+insets.top;
2 26 Feb 07 jari 618                 g.drawString(label, uniqX + insets.left, annY);
2 26 Feb 07 jari 619             }
2 26 Feb 07 jari 620         }
2 26 Feb 07 jari 621     }
2 26 Feb 07 jari 622     
2 26 Feb 07 jari 623     /**
2 26 Feb 07 jari 624      * Fills rect with specified row and colunn.
2 26 Feb 07 jari 625      */
2 26 Feb 07 jari 626     private void fillRectAt(Graphics g, int row, int column) {
2 26 Feb 07 jari 627         int x = column*elementSize.width+insets.left;
2 26 Feb 07 jari 628         int y = row*elementSize.height + insets.top;
2 26 Feb 07 jari 629         boolean mask = this.firstSelectedRow >= 0 && this.lastSelectedRow >= 0 && (row < this.firstSelectedRow || row > this.lastSelectedRow);
2 26 Feb 07 jari 630         if(clusterPopulation[column] > 0)
2 26 Feb 07 jari 631             g.setColor(getColor(this.experiment.get(getRow(row), getColumn(column))));
2 26 Feb 07 jari 632         else
2 26 Feb 07 jari 633             g.setColor(missingColor);
2 26 Feb 07 jari 634         g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 635         if (mask) {
2 26 Feb 07 jari 636             g.setColor(maskColor);
2 26 Feb 07 jari 637             g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 638         }
2 26 Feb 07 jari 639         if (this.isDrawBorders) {
2 26 Feb 07 jari 640             g.setColor(Color.black);
2 26 Feb 07 jari 641             g.drawRect(x, y, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 642         }
2 26 Feb 07 jari 643     }
2 26 Feb 07 jari 644     
2 26 Feb 07 jari 645     /**
2 26 Feb 07 jari 646      * Draws rect with specified row, column and color.
2 26 Feb 07 jari 647      */
2 26 Feb 07 jari 648     private void drawRectAt(Graphics g, int row, int column, Color color) {
2 26 Feb 07 jari 649         g.setColor(color);
2 26 Feb 07 jari 650         g.drawRect(column*elementSize.width+insets.left, row*elementSize.height+insets.top, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 651     }
2 26 Feb 07 jari 652     
2 26 Feb 07 jari 653     private void drawCentroidRectangle(Graphics g, int centroidNumber, Color color){
2 26 Feb 07 jari 654         Color initColor = g.getColor();
2 26 Feb 07 jari 655         g.setColor(color);
2 26 Feb 07 jari 656         g.drawRect(centroidNumber * elementSize.width + insets.left, insets.top, elementSize.width-1,numberOfGenes * elementSize.height - 1);
2 26 Feb 07 jari 657         g.setColor(initColor);
2 26 Feb 07 jari 658     }
2 26 Feb 07 jari 659     
2 26 Feb 07 jari 660     private void fillCentroid(Graphics g, int centroidNumber){
2 26 Feb 07 jari 661         for(int row = 0; row < numberOfGenes; row++)
2 26 Feb 07 jari 662             fillRectAt(g, row, centroidNumber);
2 26 Feb 07 jari 663     }
2 26 Feb 07 jari 664     
2 26 Feb 07 jari 665     private int getTopIndex(int top) {
2 26 Feb 07 jari 666         if (top < insets.top) {
2 26 Feb 07 jari 667             return 0;
2 26 Feb 07 jari 668         }
2 26 Feb 07 jari 669         return (top - insets.top)/elementSize.height;
2 26 Feb 07 jari 670     }
2 26 Feb 07 jari 671     
2 26 Feb 07 jari 672     private int getLeftIndex(int left) {
2 26 Feb 07 jari 673         if (left < insets.left) {
2 26 Feb 07 jari 674             return 0;
2 26 Feb 07 jari 675         }
2 26 Feb 07 jari 676         return (left - insets.left)/elementSize.width;
2 26 Feb 07 jari 677     }
2 26 Feb 07 jari 678     
2 26 Feb 07 jari 679     private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 680         if (right < 0) {
2 26 Feb 07 jari 681             return 0;
2 26 Feb 07 jari 682         }
2 26 Feb 07 jari 683         int result = right/elementSize.width+1;
2 26 Feb 07 jari 684         return result > limit ? limit : result;
2 26 Feb 07 jari 685     }
2 26 Feb 07 jari 686     
2 26 Feb 07 jari 687     private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 688         if (bottom < 0) {
2 26 Feb 07 jari 689             return 0;
2 26 Feb 07 jari 690         }
2 26 Feb 07 jari 691         int result = (bottom - insets.top)/elementSize.height+1;
2 26 Feb 07 jari 692         return result > limit ? limit : result;
2 26 Feb 07 jari 693     }
2 26 Feb 07 jari 694     
2 26 Feb 07 jari 695     /**
2 26 Feb 07 jari 696      * Finds column for specified x coordinate.
2 26 Feb 07 jari 697      * @return -1 if column was not found.
2 26 Feb 07 jari 698      */
2 26 Feb 07 jari 699     private int findColumn(int targetx) {
2 26 Feb 07 jari 700         int xSize = experiment.getNumberOfSamples()*elementSize.width;
2 26 Feb 07 jari 701         if (targetx >= xSize || targetx < 0) {
2 26 Feb 07 jari 702             return -1;
2 26 Feb 07 jari 703         }
2 26 Feb 07 jari 704         return targetx/elementSize.width;
2 26 Feb 07 jari 705     }
2 26 Feb 07 jari 706     
2 26 Feb 07 jari 707     /**
2 26 Feb 07 jari 708      * Finds row for specified y coordinate.
2 26 Feb 07 jari 709      * @return -1 if row was not found.
2 26 Feb 07 jari 710      */
2 26 Feb 07 jari 711     private int findRow(int targety) {
2 26 Feb 07 jari 712         int ySize = getCluster().length*elementSize.height+insets.top;
2 26 Feb 07 jari 713         if (targety >= ySize || targety < insets.top)
2 26 Feb 07 jari 714             return -1;
2 26 Feb 07 jari 715         return (targety-insets.top)/elementSize.height;
2 26 Feb 07 jari 716     }
2 26 Feb 07 jari 717     
2 26 Feb 07 jari 718     private boolean isLegalPosition(int row, int column) {
2 26 Feb 07 jari 719         if (isLegalRow(row) && isLegalColumn(column))
2 26 Feb 07 jari 720             return true;
2 26 Feb 07 jari 721         return false;
2 26 Feb 07 jari 722     }
2 26 Feb 07 jari 723     
2 26 Feb 07 jari 724     private boolean isLegalColumn(int column) {
2 26 Feb 07 jari 725         if (column < 0 || column > experiment.getNumberOfSamples() -1)
2 26 Feb 07 jari 726             return false;
2 26 Feb 07 jari 727         return true;
2 26 Feb 07 jari 728     }
2 26 Feb 07 jari 729     
2 26 Feb 07 jari 730     private boolean isLegalRow(int row) {
2 26 Feb 07 jari 731         if (row < 0 || row > getCluster().length -1)
2 26 Feb 07 jari 732             return false;
2 26 Feb 07 jari 733         return true;
2 26 Feb 07 jari 734     }
2 26 Feb 07 jari 735     
2 26 Feb 07 jari 736     public int getCurrentCentroidNumber(){
2 26 Feb 07 jari 737         
2 26 Feb 07 jari 738         return this.listener.getCurrCentroidNumber();
2 26 Feb 07 jari 739     }
2 26 Feb 07 jari 740     
2 26 Feb 07 jari 741     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 742      */
2 26 Feb 07 jari 743     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 744         return null;
2 26 Feb 07 jari 745     }    
2 26 Feb 07 jari 746     
2 26 Feb 07 jari 747     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 748      * posibly null
2 26 Feb 07 jari 749      */
2 26 Feb 07 jari 750     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 751         return null;
2 26 Feb 07 jari 752     }    
2 26 Feb 07 jari 753     
2 26 Feb 07 jari 754     /** Returns int value indicating viewer type
2 26 Feb 07 jari 755      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 756      */
2 26 Feb 07 jari 757     public int getViewerType() {
2 26 Feb 07 jari 758         return -1;
2 26 Feb 07 jari 759     }
2 26 Feb 07 jari 760     
2 26 Feb 07 jari 761     /*
2 26 Feb 07 jari 762     public void setPopupLocation(int x, int y){
2 26 Feb 07 jari 763         this.infoPopup.setLocation(getLocationOnScreen().x+x,getLocationOnScreen().y+y);
2 26 Feb 07 jari 764     }
2 26 Feb 07 jari 765      
2 26 Feb 07 jari 766      */
2 26 Feb 07 jari 767     
2 26 Feb 07 jari 768     
2 26 Feb 07 jari 769     
2 26 Feb 07 jari 770     private class Listener extends MouseAdapter implements ActionListener, MouseMotionListener{
2 26 Feb 07 jari 771         
2 26 Feb 07 jari 772         int x = 0;
2 26 Feb 07 jari 773         int y = 0;
2 26 Feb 07 jari 774         int currCentroidNumber;
2 26 Feb 07 jari 775         int oldCentroidNumber;
2 26 Feb 07 jari 776         Point origin;
2 26 Feb 07 jari 777         int originX;
2 26 Feb 07 jari 778         int originY;
2 26 Feb 07 jari 779         Rectangle expBounds;
2 26 Feb 07 jari 780         float xDim;
2 26 Feb 07 jari 781         float yDim;
2 26 Feb 07 jari 782         Graphics g;
2 26 Feb 07 jari 783         Color rectangleColor = Color.white;
2 26 Feb 07 jari 784         
2 26 Feb 07 jari 785         public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
2 26 Feb 07 jari 786             
2 26 Feb 07 jari 787             
2 26 Feb 07 jari 788             
2 26 Feb 07 jari 789         }
2 26 Feb 07 jari 790         
2 26 Feb 07 jari 791         public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
2 26 Feb 07 jari 792         }
2 26 Feb 07 jari 793         
2 26 Feb 07 jari 794         public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {
2 26 Feb 07 jari 795             x = (int)mouseEvent.getX();
2 26 Feb 07 jari 796             y = (int)mouseEvent.getY();
2 26 Feb 07 jari 797             
2 26 Feb 07 jari 798             currCentroidNumber = cursorOverCentroid(x,y);
2 26 Feb 07 jari 799             
2 26 Feb 07 jari 800             if(currCentroidNumber != oldCentroidNumber){
2 26 Feb 07 jari 801                 g = getGraphics();
2 26 Feb 07 jari 802                 
2 26 Feb 07 jari 803                 if( currCentroidNumber != -1){
2 26 Feb 07 jari 804                     if(oldCentroidNumber != -1){
2 26 Feb 07 jari 805                         for(int row = 0; row < numberOfGenes; row++)
2 26 Feb 07 jari 806                             fillRectAt(g, row, oldCentroidNumber);
2 26 Feb 07 jari 807                     }
2 26 Feb 07 jari 808                     drawCentroidRectangle(g, currCentroidNumber, rectangleColor);
2 26 Feb 07 jari 809                     framework.setStatusText("Cluster # " +(currCentroidNumber+1)+",  Population: "+clusterPopulation[currCentroidNumber]+",  Diversity: "+clusterDiversity.get(currCentroidNumber,0));                    
2 26 Feb 07 jari 810                 }
2 26 Feb 07 jari 811                 if(currCentroidNumber == -1 && oldCentroidNumber != -1){
2 26 Feb 07 jari 812                     for(int row = 0; row < numberOfGenes; row++)
2 26 Feb 07 jari 813                         fillRectAt(g, row, oldCentroidNumber);
2 26 Feb 07 jari 814                     framework.setStatusText(" ");
2 26 Feb 07 jari 815                 }
2 26 Feb 07 jari 816                 
2 26 Feb 07 jari 817                 oldCentroidNumber = currCentroidNumber;
2 26 Feb 07 jari 818             }
2 26 Feb 07 jari 819         }
2 26 Feb 07 jari 820         
2 26 Feb 07 jari 821         public void mouseExited(java.awt.event.MouseEvent mouseEvent){
2 26 Feb 07 jari 822             Graphics g = getGraphics();
2 26 Feb 07 jari 823             if(currCentroidNumber != -1)
2 26 Feb 07 jari 824                 fillCentroid(g, currCentroidNumber);
2 26 Feb 07 jari 825             if(oldCentroidNumber != -1)
2 26 Feb 07 jari 826                 fillCentroid(g, oldCentroidNumber);
2 26 Feb 07 jari 827             currCentroidNumber = -1;
2 26 Feb 07 jari 828             
2 26 Feb 07 jari 829         }
2 26 Feb 07 jari 830         
2 26 Feb 07 jari 831         
2 26 Feb 07 jari 832         private int cursorOverCentroid(int x, int y){
2 26 Feb 07 jari 833             currCentroidNumber = -1;
2 26 Feb 07 jari 834             
2 26 Feb 07 jari 835             originX = 0;
2 26 Feb 07 jari 836             originY = 0;
2 26 Feb 07 jari 837             
2 26 Feb 07 jari 838             xDim = (float)numberOfCentroids * elementSize.width;
2 26 Feb 07 jari 839             yDim = (float)numberOfGenes * elementSize.height;
2 26 Feb 07 jari 840             //   xDim = (float)samplesOrder.length * elementSize.width;
2 26 Feb 07 jari 841             //   yDim = (float)numberOfCentroids * elementSize.height;
2 26 Feb 07 jari 842             
2 26 Feb 07 jari 843             if( (insets.left < x && x < insets.left + xDim) &&
2 26 Feb 07 jari 844             (originY < y && y < originY + yDim)){
2 26 Feb 07 jari 845                 currCentroidNumber = (int)(numberOfCentroids * (x - insets.left)/xDim);
2 26 Feb 07 jari 846             }
2 26 Feb 07 jari 847   /*          if(currCentroidNumber!=-1){
2 26 Feb 07 jari 848                 infoPopup.setValues(currCentroidNumber, clusterPopulation[currCentroidNumber], experiment.get(5,currCentroidNumber));
2 26 Feb 07 jari 849                 setPopupLocation(x,y);
2 26 Feb 07 jari 850                 infoPopup.setVisible(true);
2 26 Feb 07 jari 851             }
2 26 Feb 07 jari 852             else
2 26 Feb 07 jari 853                 infoPopup.setVisible(false);
2 26 Feb 07 jari 854    */
2 26 Feb 07 jari 855             return currCentroidNumber;
2 26 Feb 07 jari 856         }
2 26 Feb 07 jari 857         
2 26 Feb 07 jari 858         public int getCurrCentroidNumber(){
2 26 Feb 07 jari 859             return currCentroidNumber;
2 26 Feb 07 jari 860             
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     public class ColorBarHeader extends JPanel {
2 26 Feb 07 jari 866         
2 26 Feb 07 jari 867         private static final int RECT_HEIGHT = 15;
2 26 Feb 07 jari 868         private int elementWidth;
2 26 Feb 07 jari 869         private boolean isAntiAliasing = true;
2 26 Feb 07 jari 870         private float maxValue = 3f;
2 26 Feb 07 jari 871         private float minValue = -3f;
2 26 Feb 07 jari 872         private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 873         private int numberOfElements;
2 26 Feb 07 jari 874         private BufferedImage negColorImage;
2 26 Feb 07 jari 875         private BufferedImage posColorImage;
2 26 Feb 07 jari 876         
2 26 Feb 07 jari 877         
2 26 Feb 07 jari 878         /**
2 26 Feb 07 jari 879          * Construct an <code>ExperimentHeader</code> with specified experiment.
2 26 Feb 07 jari 880          */
2 26 Feb 07 jari 881         public ColorBarHeader(int NumberOfElements) {
2 26 Feb 07 jari 882             numberOfElements = NumberOfElements;
2 26 Feb 07 jari 883             setBackground(Color.white);
2 26 Feb 07 jari 884         }
2 26 Feb 07 jari 885         
2 26 Feb 07 jari 886         private void writeObject(ObjectOutputStream oos) throws IOException {
2 26 Feb 07 jari 887             oos.writeInt(elementWidth);
2 26 Feb 07 jari 888             oos.writeBoolean(isAntiAliasing);
2 26 Feb 07 jari 889             oos.writeFloat(maxValue);
2 26 Feb 07 jari 890             oos.writeFloat(minValue);
2 26 Feb 07 jari 891             oos.writeObject(insets);
2 26 Feb 07 jari 892             oos.writeInt(numberOfElements);
2 26 Feb 07 jari 893         }
2 26 Feb 07 jari 894         
2 26 Feb 07 jari 895         private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
2 26 Feb 07 jari 896             this.elementWidth = ois.readInt();
2 26 Feb 07 jari 897             this.isAntiAliasing = ois.readBoolean();
2 26 Feb 07 jari 898             this.maxValue = ois.readFloat();
2 26 Feb 07 jari 899             this.minValue = ois.readFloat();
2 26 Feb 07 jari 900             this.insets = (Insets)ois.readObject();
2 26 Feb 07 jari 901             this.numberOfElements = ois.readInt();
2 26 Feb 07 jari 902         }
2 26 Feb 07 jari 903         
2 26 Feb 07 jari 904         /**
2 26 Feb 07 jari 905          * Sets max and min experiment values.
2 26 Feb 07 jari 906          */
2 26 Feb 07 jari 907         public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 908             this.maxValue = maxValue;
2 26 Feb 07 jari 909             this.minValue = minValue;
2 26 Feb 07 jari 910         }
2 26 Feb 07 jari 911         
2 26 Feb 07 jari 912         /**
2 26 Feb 07 jari 913          * Sets positive and negative images
2 26 Feb 07 jari 914          */
2 26 Feb 07 jari 915         public void setNegAndPosColorImages(BufferedImage neg, BufferedImage pos){
2 26 Feb 07 jari 916             this.negColorImage = neg;
2 26 Feb 07 jari 917             this.posColorImage = pos;
2 26 Feb 07 jari 918         }
2 26 Feb 07 jari 919         
2 26 Feb 07 jari 920         /**
2 26 Feb 07 jari 921          * Sets anti-aliasing property.
2 26 Feb 07 jari 922          */
2 26 Feb 07 jari 923         public void setAntiAliasing(boolean isAntiAliasing) {
2 26 Feb 07 jari 924             this.isAntiAliasing = isAntiAliasing;
2 26 Feb 07 jari 925         }
2 26 Feb 07 jari 926         
2 26 Feb 07 jari 927         /**
2 26 Feb 07 jari 928          * Sets the left margin for the header
2 26 Feb 07 jari 929          */
2 26 Feb 07 jari 930         public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 931             insets.left = leftMargin;
2 26 Feb 07 jari 932         }
2 26 Feb 07 jari 933         
2 26 Feb 07 jari 934         /**
2 26 Feb 07 jari 935          * Sets an element width.
2 26 Feb 07 jari 936          */
2 26 Feb 07 jari 937         private void setElementWidth(int width) {
2 26 Feb 07 jari 938             this.elementWidth = width;
2 26 Feb 07 jari 939             if (width > 12) {
2 26 Feb 07 jari 940                 width = 12;
2 26 Feb 07 jari 941             }
2 26 Feb 07 jari 942             setFont(new Font("monospaced", Font.PLAIN, width));
2 26 Feb 07 jari 943         }
2 26 Feb 07 jari 944         
2 26 Feb 07 jari 945         /**
2 26 Feb 07 jari 946          * Updates size of this header.
2 26 Feb 07 jari 947          */
2 26 Feb 07 jari 948         public void updateSizes(int contentWidth, int elementWidth) {
2 26 Feb 07 jari 949             
2 26 Feb 07 jari 950             setElementWidth(elementWidth);
2 26 Feb 07 jari 951             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 952             if (g == null) {
2 26 Feb 07 jari 953                 return;
2 26 Feb 07 jari 954             }
2 26 Feb 07 jari 955             if (isAntiAliasing) {
2 26 Feb 07 jari 956                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 957                 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 958             }
2 26 Feb 07 jari 959             FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 960             int maxHeight = RECT_HEIGHT + 10 + fm.getHeight();
2 26 Feb 07 jari 961             int width = numberOfElements * elementWidth;
2 26 Feb 07 jari 962             setSize(width, maxHeight);
2 26 Feb 07 jari 963             setPreferredSize(new Dimension(width, maxHeight));
2 26 Feb 07 jari 964         }
2 26 Feb 07 jari 965         
2 26 Feb 07 jari 966         /**
2 26 Feb 07 jari 967          * Paints the header into specified graphics.
2 26 Feb 07 jari 968          */
2 26 Feb 07 jari 969         public void paint(Graphics g1D) {
2 26 Feb 07 jari 970             super.paint(g1D);
2 26 Feb 07 jari 971             Graphics2D g = (Graphics2D)g1D;
2 26 Feb 07 jari 972             if (isAntiAliasing) {
2 26 Feb 07 jari 973                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 974                 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 975             }
2 26 Feb 07 jari 976             drawHeader(g);
2 26 Feb 07 jari 977         }
2 26 Feb 07 jari 978         
2 26 Feb 07 jari 979         /**
2 26 Feb 07 jari 980          * Draws the header into specified graphics.
2 26 Feb 07 jari 981          */
2 26 Feb 07 jari 982         private void drawHeader(Graphics2D g) {
2 26 Feb 07 jari 983             
2 26 Feb 07 jari 984             int width = numberOfElements*elementWidth;
2 26 Feb 07 jari 985             if(useDoubleGradient) {
2 26 Feb 07 jari 986               g.drawImage(this.negColorImage, insets.left, 0, (int)(width/2f), RECT_HEIGHT, null);
2 26 Feb 07 jari 987               g.drawImage(this.posColorImage, (int)((width)/2f + insets.left), 0, (int)(width/2.0), RECT_HEIGHT, null);
2 26 Feb 07 jari 988             } else {
2 26 Feb 07 jari 989               g.drawImage(this.posColorImage, insets.left, 0, width, RECT_HEIGHT, null);                            
2 26 Feb 07 jari 990             }
2 26 Feb 07 jari 991             FontMetrics hfm = g.getFontMetrics();
2 26 Feb 07 jari 992             int descent = hfm.getDescent();
2 26 Feb 07 jari 993             int fHeight = hfm.getHeight();
2 26 Feb 07 jari 994             g.setColor(Color.black);
2 26 Feb 07 jari 995             int textWidth;
2 26 Feb 07 jari 996             g.drawString(String.valueOf(this.minValue), insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 997             textWidth = hfm.stringWidth("0.0");
2 26 Feb 07 jari 998             if(useDoubleGradient)
2 26 Feb 07 jari 999               g.drawString("0.0", (int)(width/2f)-textWidth/2 + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 1000             textWidth = hfm.stringWidth(String.valueOf(this.maxValue));
2 26 Feb 07 jari 1001             g.drawString(String.valueOf(this.maxValue), width-textWidth + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 1002         }
2 26 Feb 07 jari 1003         
2 26 Feb 07 jari 1004     }
2 26 Feb 07 jari 1005     
2 26 Feb 07 jari 1006   /*      public class InfoPopup extends JFrame{
2 26 Feb 07 jari 1007     //    JMenuItem clusterNumber;
2 26 Feb 07 jari 1008     //    JMenuItem clusterPop;
2 26 Feb 07 jari 1009     //    JMenuItem clusterDiv;
2 26 Feb 07 jari 1010             InfoPanel panel;
2 26 Feb 07 jari 1011         int num = 1;
2 26 Feb 07 jari 1012         int pop = 0;
2 26 Feb 07 jari 1013         float div = 0;
2 26 Feb 07 jari 1014    
2 26 Feb 07 jari 1015         public InfoPopup(){
2 26 Feb 07 jari 1016             super();
2 26 Feb 07 jari 1017             panel = new InfoPanel();
2 26 Feb 07 jari 1018             setSize(new Dimension(70, 50));
2 26 Feb 07 jari 1019             setBackground(Color.white);
2 26 Feb 07 jari 1020             getContentPane().add(panel);
2 26 Feb 07 jari 1021           //  clusterNumber = new JMenuItem();
2 26 Feb 07 jari 1022           //  clusterNumber.setBackground(Color.white);
2 26 Feb 07 jari 1023           //  clusterPop = new JMenuItem();
2 26 Feb 07 jari 1024          //   clusterPop.setBackground(Color.white);
2 26 Feb 07 jari 1025         //    clusterDiv = new JMenuItem();
2 26 Feb 07 jari 1026         //    clusterDiv.setBackground(Color.white);
2 26 Feb 07 jari 1027         //    add(clusterNumber);
2 26 Feb 07 jari 1028         //    add(clusterPop);
2 26 Feb 07 jari 1029         //    add(clusterDiv);
2 26 Feb 07 jari 1030         }
2 26 Feb 07 jari 1031    
2 26 Feb 07 jari 1032         public void setValues(int num, int pop, float div){
2 26 Feb 07 jari 1033            // clusterNumber.setText("Cluster #: "+num);
2 26 Feb 07 jari 1034           //  clusterPop.setText("Pop: "+pop);
2 26 Feb 07 jari 1035           //  clusterDiv.setText("Div: "+div);
2 26 Feb 07 jari 1036             this.num = num;
2 26 Feb 07 jari 1037           this.pop = pop;
2 26 Feb 07 jari 1038           this.div =div;
2 26 Feb 07 jari 1039         }
2 26 Feb 07 jari 1040    
2 26 Feb 07 jari 1041         public class InfoPanel extends JPanel{
2 26 Feb 07 jari 1042    
2 26 Feb 07 jari 1043             public InfoPanel(){
2 26 Feb 07 jari 1044             super();
2 26 Feb 07 jari 1045             setSize(70, 50);
2 26 Feb 07 jari 1046             setPreferredSize(new Dimension(70, 50));
2 26 Feb 07 jari 1047             setBackground(Color.white);
2 26 Feb 07 jari 1048             }
2 26 Feb 07 jari 1049    
2 26 Feb 07 jari 1050         public void paint(Graphics g){
2 26 Feb 07 jari 1051             super.paint(g);
2 26 Feb 07 jari 1052             g.drawString("Cluster #: " +(num+1), 5, 15);
2 26 Feb 07 jari 1053             g.drawString("Pop.: " +pop, 5, 30);
2 26 Feb 07 jari 1054             g.drawString("Div.: " +div, 5, 45);
2 26 Feb 07 jari 1055         }
2 26 Feb 07 jari 1056         }
2 26 Feb 07 jari 1057     }
2 26 Feb 07 jari 1058    */
2 26 Feb 07 jari 1059 }