mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/gdm/GDMGeneViewer.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: GDMGeneViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.11 $
2 26 Feb 07 jari 8  * $Date: 2006/05/02 16:56:57 $
2 26 Feb 07 jari 9  * $Author: eleanorahowe $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.gdm;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.BorderLayout;
2 26 Feb 07 jari 15 import java.awt.Color;
2 26 Feb 07 jari 16 import java.awt.Dimension;
2 26 Feb 07 jari 17 import java.awt.Font;
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.Rectangle;
2 26 Feb 07 jari 24 import java.awt.RenderingHints;
2 26 Feb 07 jari 25 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 26 import java.awt.event.ActionListener;
2 26 Feb 07 jari 27 import java.awt.event.KeyEvent;
2 26 Feb 07 jari 28 import java.awt.event.KeyListener;
2 26 Feb 07 jari 29 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 30 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 31 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 32 import java.awt.event.WindowEvent;
2 26 Feb 07 jari 33 import java.awt.event.WindowListener;
2 26 Feb 07 jari 34 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 35 import java.beans.Expression;
2 26 Feb 07 jari 36 import java.util.Enumeration;
2 26 Feb 07 jari 37 import java.util.HashMap;
2 26 Feb 07 jari 38 import java.util.Hashtable;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import javax.swing.AbstractAction;
2 26 Feb 07 jari 41 import javax.swing.Action;
2 26 Feb 07 jari 42 import javax.swing.BorderFactory;
2 26 Feb 07 jari 43 import javax.swing.ButtonGroup;
2 26 Feb 07 jari 44 import javax.swing.ImageIcon;
2 26 Feb 07 jari 45 import javax.swing.JCheckBoxMenuItem;
2 26 Feb 07 jari 46 import javax.swing.JComponent;
2 26 Feb 07 jari 47 import javax.swing.JFrame;
2 26 Feb 07 jari 48 import javax.swing.JMenu;
2 26 Feb 07 jari 49 import javax.swing.JMenuItem;
2 26 Feb 07 jari 50 import javax.swing.JOptionPane;
2 26 Feb 07 jari 51 import javax.swing.JPanel;
2 26 Feb 07 jari 52 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 53 import javax.swing.JRadioButtonMenuItem;
2 26 Feb 07 jari 54 import javax.swing.JScrollBar;
2 26 Feb 07 jari 55 import javax.swing.SwingUtilities;
2 26 Feb 07 jari 56 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 59 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 60 import org.tigr.microarray.mev.cluster.clusterUtil.Cluster;
2 26 Feb 07 jari 61 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 62 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 63 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 64 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 65 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 66 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 67 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentUtil;
2 26 Feb 07 jari 68 import org.tigr.microarray.util.SlideDataSorter;
2 26 Feb 07 jari 69 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 70 import org.tigr.util.QSort;
2 26 Feb 07 jari 71
2 26 Feb 07 jari 72 public class GDMGeneViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 73     
2 26 Feb 07 jari 74     private JPanel content;
2 26 Feb 07 jari 75     private GDMGeneHeader geneColumnHeaderSP;
2 26 Feb 07 jari 76     private GDMGeneHeader geneRowHeaderSP;
2 26 Feb 07 jari 77     private JScrollBar upperRightCornerSB;
2 26 Feb 07 jari 78     private JScrollBar lowerLeftCornerSB;
2 26 Feb 07 jari 79     
2 26 Feb 07 jari 80     private FloatMatrix geneDistMatrix;
2 26 Feb 07 jari 81     private FloatMatrix rawMatrix;
2 26 Feb 07 jari 82     
2 26 Feb 07 jari 83     private IData expData;
2 26 Feb 07 jari 84     private String [] fieldNames;
2 26 Feb 07 jari 85     private IFramework framework;
2 26 Feb 07 jari 86     private JFrame mainframe;
2 26 Feb 07 jari 87     
2 26 Feb 07 jari 88     private static final int TRACE_SPACE = 50;
2 26 Feb 07 jari 89     private static final int MAX_MATRIX_WIDTH = 400;
2 26 Feb 07 jari 90     private static final int MAX_COL_WIDTH = MAX_MATRIX_WIDTH;
2 26 Feb 07 jari 91     private static final int MAX_COL_HEIGHT = 500;
2 26 Feb 07 jari 92     private static final int MAX_ROW_WIDTH = MAX_COL_HEIGHT;
2 26 Feb 07 jari 93     private static final int MAX_ROW_HEIGHT = MAX_COL_WIDTH;
2 26 Feb 07 jari 94     private static final int NOT_UPDATE_ANNOTATION_SIZE = -1;
2 26 Feb 07 jari 95     
2 26 Feb 07 jari 96     private int num_genes;
2 26 Feb 07 jari 97     private int maxGeneNameLength;
2 26 Feb 07 jari 98     private int probes;
2 26 Feb 07 jari 99     private int featuresCount;
2 26 Feb 07 jari 100     private int [] indices;
2 26 Feb 07 jari 101     private int label;
2 26 Feb 07 jari 102     private int [] clusterlength;
2 26 Feb 07 jari 103     
2 26 Feb 07 jari 104     private Insets insets;
2 26 Feb 07 jari 105     
2 26 Feb 07 jari 106     private int elementWidth;
2 26 Feb 07 jari 107     private int paletteStyle;
2 26 Feb 07 jari 108     private int labelIndex = -1;
2 26 Feb 07 jari 109     private int maxLabelWidth = 0;
2 26 Feb 07 jari 110     private boolean isGRScale;
2 26 Feb 07 jari 111     private boolean isDrawBorders;
2 26 Feb 07 jari 112     private boolean isDrawClusterBorders=true;
2 26 Feb 07 jari 113     private boolean isAntiAliasing = true;
2 26 Feb 07 jari 114     private boolean isTracing = false;
2 26 Feb 07 jari 115     private int tracespace;
2 26 Feb 07 jari 116     private int xWidth;
2 26 Feb 07 jari 117     private int xHeight;
2 26 Feb 07 jari 118     private Dimension elementSize = new Dimension(10,10);
2 26 Feb 07 jari 119     private boolean sortByGeneProximity = true;
2 26 Feb 07 jari 120     
2 26 Feb 07 jari 121     private boolean imposeClusterOrder = false;
2 26 Feb 07 jari 122     
2 26 Feb 07 jari 123     public static Color zeroColor = Color.black;
2 26 Feb 07 jari 124     public static Color NaNColor = Color.gray;
2 26 Feb 07 jari 125     public static Color diagColor = Color.white;
2 26 Feb 07 jari 126     
2 26 Feb 07 jari 127     private float maxValue;
2 26 Feb 07 jari 128     private float minValue;
2 26 Feb 07 jari 129     private float origMaxValue;
2 26 Feb 07 jari 130     private float origMinValue;
2 26 Feb 07 jari 131     
2 26 Feb 07 jari 132     private int colorScheme = IDisplayMenu.GREEN_RED_SCHEME;
2 26 Feb 07 jari 133     private BufferedImage negGreenColorImage = createGradientImage(Color.green, Color.black);
2 26 Feb 07 jari 134     private BufferedImage posRedColorImage = createGradientImage(Color.black, Color.red);
2 26 Feb 07 jari 135     private BufferedImage negBlueColorImage = createGradientImage(Color.blue, Color.black);
2 26 Feb 07 jari 136     private BufferedImage posYellowColorImage = createGradientImage(Color.black, Color.yellow);
2 26 Feb 07 jari 137     private BufferedImage negCustomColorImage;
2 26 Feb 07 jari 138     private BufferedImage posCustomColorImage;
2 26 Feb 07 jari 139     
2 26 Feb 07 jari 140     private BufferedImage posColorImage = posRedColorImage;
2 26 Feb 07 jari 141     private BufferedImage negColorImage = negGreenColorImage;
2 26 Feb 07 jari 142     private Color borderColor;
2 26 Feb 07 jari 143     private Color clusterBorderColor;
2 26 Feb 07 jari 144     
2 26 Feb 07 jari 145     private String distanceMetric;
2 26 Feb 07 jari 146     private JPopupMenu popup;
2 26 Feb 07 jari 147     private JCheckBoxMenuItem drawClusterBorderItem;
2 26 Feb 07 jari 148     private JMenu sortMenu;
2 26 Feb 07 jari 149     
2 26 Feb 07 jari 150     private int displayEvery = 1;
2 26 Feb 07 jari 151     
2 26 Feb 07 jari 152     private Experiment experiment;
2 26 Feb 07 jari 153     private int [][] clusters;
2 26 Feb 07 jari 154     private int numOfClusters;
2 26 Feb 07 jari 155     
2 26 Feb 07 jari 156     private Listener listener;
2 26 Feb 07 jari 157     
2 26 Feb 07 jari 158     private HashMap actions = new HashMap();
2 26 Feb 07 jari 159     
2 26 Feb 07 jari 160     private static final String PARAMETER = "command-parameter";
2 26 Feb 07 jari 161     private static final String BORDER_COLOR_CMD = "select-border-color-cmd";
2 26 Feb 07 jari 162     private static final String COLOR_SCALE_CMD = "set-color-scale-cmd";
2 26 Feb 07 jari 163     private static final String GREEN_RED_COLOR_SCHEME_CMD = "display-green-red-scheme-cmd";
2 26 Feb 07 jari 164     private static final String BLUE_YELLOW_COLOR_SCHEME_CMD = "display-blue-yellow-scheme-cmd";
2 26 Feb 07 jari 165     private static final String NO_LABEL = "No Label";
2 26 Feb 07 jari 166     private static final String LABEL_BY = "Label by ";
2 26 Feb 07 jari 167     private static final String DISPLAY_LABEL_ACTION = "display--label-action";
2 26 Feb 07 jari 168     private static final String DISPLAY_LABEL_CMD    = "display-label-cmd";
2 26 Feb 07 jari 169     private static final String CUSTOM_COLOR_SCHEME_CMD = "display-custom-color-scheme-cmd";
2 26 Feb 07 jari 170     private static final String DISPLAY_DRAW_BORDERS_CMD = "display-draw-borders-cmd";
2 26 Feb 07 jari 171     private static final String DISPLAY_2X2_CMD = "display-2x2-cmd";
2 26 Feb 07 jari 172     private static final String DISPLAY_5X5_CMD = "display-5x5-cmd";
2 26 Feb 07 jari 173     private static final String DISPLAY_10X10_CMD = "display-10x10-cmd";
2 26 Feb 07 jari 174     private static final String DISPLAY_15X15_CMD = "display-15x15-cmd";
2 26 Feb 07 jari 175     private static final String DISPLAY_OTHER_CMD = "display-other-cmd";
2 26 Feb 07 jari 176     private static final String SET_CLUSTER_BORDER_CMD = "set-cluster-border-cmd";
2 26 Feb 07 jari 177     private static final String SORT_BY = "Sort by ";
2 26 Feb 07 jari 178     private static final String SORT_BY_CLUSTER_ORDER_CMD = "sort-by-cluster-order-cmd";
2 26 Feb 07 jari 179     private static final String SORT_BY_LOCATION_CMD = "sort-by-location-cmd";
2 26 Feb 07 jari 180     private static final String SORT_BY_RATIO_CMD = "sort-by-ratio-cmd";
2 26 Feb 07 jari 181     private static final String SORT_LABEL_ACTION = "sort-label-action";
2 26 Feb 07 jari 182     private static final String SORT_LABEL_CMD    = "sort-label-cmd";
2 26 Feb 07 jari 183     public static final String SORT_BY_GENE_PROXIMITY_CMD = "sort-by-gene-proximity-cmd";
2 26 Feb 07 jari 184     private static final String ANNOTATION_WIDTH_ACTION = "annotation-width-action";
2 26 Feb 07 jari 185     private static final String ANNOTATION_WIDTH_CMD = "annotation-width-cmd";
2 26 Feb 07 jari 186     private static final String CHANGE_ANNOTATION_WIDTH = "Change Annotation Width";
2 26 Feb 07 jari 187     private static final String TOGGLE_PROXIMITY_SORT_CMD = "Toggle-proximity-cmd";
2 26 Feb 07 jari 188     private static final String SAVE_NEIGHBORS_CMD = "Save-neighbors-cmd";
2 26 Feb 07 jari 189     
2 26 Feb 07 jari 190
2 26 Feb 07 jari 191     
2 26 Feb 07 jari 192
2 26 Feb 07 jari 193     
2 26 Feb 07 jari 194     /**
2 26 Feb 07 jari 195      * Constructs a <code>GDMGeneViewer</code> for specified results.
2 26 Feb 07 jari 196      */
2 26 Feb 07 jari 197     public GDMGeneViewer(IFramework fmwk, AlgorithmData aData, String distMetric, int displayEvery, int [][] clusters, int numOfClusters) {
2 26 Feb 07 jari 198         setBackground(Color.white);
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         this.framework = fmwk;
2 26 Feb 07 jari 201         this.distanceMetric = distMetric;
2 26 Feb 07 jari 202         
2 26 Feb 07 jari 203         IDisplayMenu menu = framework.getDisplayMenu();
2 26 Feb 07 jari 204         setElementWidth(elementSize.width);
2 26 Feb 07 jari 205         
2 26 Feb 07 jari 206         this.expData = fmwk.getData();
2 26 Feb 07 jari 207         this.fieldNames = this.expData.getFieldNames();
2 26 Feb 07 jari 208         this.experiment = expData.getExperiment();
2 26 Feb 07 jari 209         
2 26 Feb 07 jari 210         //System.out.println("new GDMGeneViewer has exptID " + exptID);
2 26 Feb 07 jari 211         this.probes = expData.getFeaturesSize();
2 26 Feb 07 jari 212         this.featuresCount = expData.getFeaturesCount();
2 26 Feb 07 jari 213         
2 26 Feb 07 jari 214         this.geneDistMatrix = aData.getMatrix("gdMatrix");
2 26 Feb 07 jari 215         this.rawMatrix = aData.getMatrix("rawMatrix");
2 26 Feb 07 jari 216         
2 26 Feb 07 jari 217         AlgorithmParameters params = aData.getParams();
2 26 Feb 07 jari 218         
2 26 Feb 07 jari 219         this.minValue = params.getFloat("minDist");
2 26 Feb 07 jari 220         this.origMaxValue = maxValue;
2 26 Feb 07 jari 221         this.origMinValue = minValue;
2 26 Feb 07 jari 222         this.displayEvery = displayEvery;
2 26 Feb 07 jari 223         
2 26 Feb 07 jari 224         this.clusters = clusters;
2 26 Feb 07 jari 225         this.numOfClusters = numOfClusters;
2 26 Feb 07 jari 226         
2 26 Feb 07 jari 227         this.maxValue = params.getFloat("maxDist");
2 26 Feb 07 jari 228         this.maxGeneNameLength = params.getInt("maxGeneNameLength");
2 26 Feb 07 jari 229         
2 26 Feb 07 jari 230         this.num_genes = geneDistMatrix.getRowDimension()/displayEvery;
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         this.borderColor = Color.black;
2 26 Feb 07 jari 233         this.clusterBorderColor = Color.white;
2 26 Feb 07 jari 234         
2 26 Feb 07 jari 235         this.insets = new Insets(1, 1, 1, 1);
2 26 Feb 07 jari 236         
2 26 Feb 07 jari 237         xWidth = getXSize();
2 26 Feb 07 jari 238         xHeight = getYSize();
2 26 Feb 07 jari 239         
2 26 Feb 07 jari 240         if(this.displayEvery==1) {
2 26 Feb 07 jari 241             setIndices(createIndices());
2 26 Feb 07 jari 242         } else if (this.displayEvery > 1) {
2 26 Feb 07 jari 243             setIndices(createIndices(this.displayEvery));
2 26 Feb 07 jari 244         }
2 26 Feb 07 jari 245         
2 26 Feb 07 jari 246         listener = new Listener();
2 26 Feb 07 jari 247         addMouseMotionListener(listener);
2 26 Feb 07 jari 248         addKeyListener(listener);
2 26 Feb 07 jari 249         
2 26 Feb 07 jari 250         initLabelActions(expData.getFieldNames());
2 26 Feb 07 jari 251         initSortActions(expData.getFieldNames());
2 26 Feb 07 jari 252         initAnnotationWidthActions();
2 26 Feb 07 jari 253         
2 26 Feb 07 jari 254         this.geneColumnHeaderSP = createHeader(TRACE_SPACE, true, xWidth, MAX_COL_HEIGHT, elementSize, experiment);
2 26 Feb 07 jari 255         this.geneColumnHeaderSP.setBorder(BorderFactory.createLineBorder(Color.white));
2 26 Feb 07 jari 256         
2 26 Feb 07 jari 257         this.geneRowHeaderSP = createHeader(TRACE_SPACE, false, MAX_ROW_WIDTH, xHeight, elementSize, experiment);
2 26 Feb 07 jari 258         this.content = createContent(MAX_MATRIX_WIDTH, MAX_MATRIX_WIDTH, listener);
2 26 Feb 07 jari 259         
2 26 Feb 07 jari 260         this.geneColumnHeaderSP.setMatrixListener(listener);
2 26 Feb 07 jari 261         this.geneRowHeaderSP.setMatrixListener(listener);
2 26 Feb 07 jari 262         
2 26 Feb 07 jari 263         this.upperRightCornerSB = createScrollBar(JScrollBar.VERTICAL);
2 26 Feb 07 jari 264         this.lowerLeftCornerSB = createScrollBar(JScrollBar.HORIZONTAL);
2 26 Feb 07 jari 265         
2 26 Feb 07 jari 266         setMaxWidth(content, geneColumnHeaderSP);
2 26 Feb 07 jari 267         setMaxHeight(content, geneRowHeaderSP);
2 26 Feb 07 jari 268         
2 26 Feb 07 jari 269         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 270         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 271         
2 26 Feb 07 jari 272         geneColumnHeaderSP.setIndices(indices);
2 26 Feb 07 jari 273         geneRowHeaderSP.setIndices(indices);
2 26 Feb 07 jari 274         
2 26 Feb 07 jari 275         add(content);
2 26 Feb 07 jari 276         
2 26 Feb 07 jari 277         // Create a "pop-up" context menu for GDM Viewer
2 26 Feb 07 jari 278         popup = createJPopupMenu(listener);
2 26 Feb 07 jari 279         
2 26 Feb 07 jari 280         getContentComponent().addMouseListener(listener);
2 26 Feb 07 jari 281         
2 26 Feb 07 jari 282         setBackground(Color.white);
2 26 Feb 07 jari 283         setOpaque(true);
2 26 Feb 07 jari 284     }
2 26 Feb 07 jari 285     
2 26 Feb 07 jari 286     public GDMGeneViewer() {}
2 26 Feb 07 jari 287
2 26 Feb 07 jari 288     /**
2 26 Feb 07 jari 289    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExpression()
2 26 Feb 07 jari 290    */
2 26 Feb 07 jari 291     public Expression getExpression(){
2 26 Feb 07 jari 292       return new Expression(this, this.getClass(), "new", 
2 26 Feb 07 jari 293           new Object[]{this.experiment, geneDistMatrix, rawMatrix, 
2 26 Feb 07 jari 294           new Integer(probes), new Integer(featuresCount), new Float(minValue), distanceMetric,
2 26 Feb 07 jari 295         new Float(origMaxValue), new Float(origMinValue), new Float(maxValue), new Integer(maxGeneNameLength), 
2 26 Feb 07 jari 296         fieldNames, 
2 26 Feb 07 jari 297         new Integer(displayEvery), clusters, new Integer(numOfClusters)});
2 26 Feb 07 jari 298     }
2 26 Feb 07 jari 299     
2 26 Feb 07 jari 300   /**
2 26 Feb 07 jari 301    * 
2 26 Feb 07 jari 302      * Creates a new GDMExpViewer from saved state data.  
2 26 Feb 07 jari 303      * setExperiment must be called for the viewer to be fully initialized.
2 26 Feb 07 jari 304    * @param exptID
2 26 Feb 07 jari 305    * @param geneDistMatrix
2 26 Feb 07 jari 306    * @param rawMatrix
2 26 Feb 07 jari 307    * @param probes
2 26 Feb 07 jari 308    * @param featuresCount
2 26 Feb 07 jari 309    * @param minValue
2 26 Feb 07 jari 310    * @param distMetric
2 26 Feb 07 jari 311    * @param origMaxValue
2 26 Feb 07 jari 312    * @param origMinValue
2 26 Feb 07 jari 313    * @param maxValue
2 26 Feb 07 jari 314    * @param maxGeneNameLength
2 26 Feb 07 jari 315    * @param fieldNames
2 26 Feb 07 jari 316    * @param displayEvery
2 26 Feb 07 jari 317    * @param clusters
2 26 Feb 07 jari 318    * @param numOfClusters
2 26 Feb 07 jari 319    */
2 26 Feb 07 jari 320     public GDMGeneViewer(Experiment e, FloatMatrix geneDistMatrix, FloatMatrix rawMatrix, 
2 26 Feb 07 jari 321         Integer probes, Integer featuresCount, Float minValue, String distMetric, 
2 26 Feb 07 jari 322       Float origMaxValue, Float origMinValue, Float maxValue, Integer maxGeneNameLength, 
2 26 Feb 07 jari 323       String[] fieldNames, 
2 26 Feb 07 jari 324       Integer displayEvery, int [][] clusters, Integer numOfClusters) {
2 26 Feb 07 jari 325         setBackground(Color.white);
2 26 Feb 07 jari 326         this.distanceMetric = distMetric;
2 26 Feb 07 jari 327         setElementWidth(elementSize.width);
2 26 Feb 07 jari 328         
2 26 Feb 07 jari 329         this.fieldNames = fieldNames;
2 26 Feb 07 jari 330         this.probes = probes.intValue();
2 26 Feb 07 jari 331         this.featuresCount = featuresCount.intValue();
2 26 Feb 07 jari 332         
2 26 Feb 07 jari 333         this.geneDistMatrix = geneDistMatrix;
2 26 Feb 07 jari 334         this.rawMatrix = rawMatrix;
2 26 Feb 07 jari 335         
2 26 Feb 07 jari 336         this.minValue = minValue.floatValue();
2 26 Feb 07 jari 337         this.origMaxValue = origMaxValue.floatValue();
2 26 Feb 07 jari 338         this.origMinValue = origMinValue.floatValue();
2 26 Feb 07 jari 339         this.displayEvery = displayEvery.intValue();
2 26 Feb 07 jari 340         
2 26 Feb 07 jari 341         this.clusters = clusters;
2 26 Feb 07 jari 342         this.numOfClusters = numOfClusters.intValue();
2 26 Feb 07 jari 343         
2 26 Feb 07 jari 344         this.maxValue = maxValue.floatValue();
2 26 Feb 07 jari 345         this.maxGeneNameLength = maxGeneNameLength.intValue();
2 26 Feb 07 jari 346         
2 26 Feb 07 jari 347         this.num_genes = geneDistMatrix.getRowDimension()/(displayEvery.intValue());
2 26 Feb 07 jari 348         
2 26 Feb 07 jari 349         this.borderColor = Color.black;
2 26 Feb 07 jari 350         this.clusterBorderColor = Color.white;
2 26 Feb 07 jari 351         
2 26 Feb 07 jari 352         this.insets = new Insets(1, 1, 1, 1);
2 26 Feb 07 jari 353         
2 26 Feb 07 jari 354         xWidth = getXSize();
2 26 Feb 07 jari 355         xHeight = getYSize();
2 26 Feb 07 jari 356         
2 26 Feb 07 jari 357         if(this.displayEvery==1) {
2 26 Feb 07 jari 358             setIndices(createIndices());
2 26 Feb 07 jari 359         } else if (this.displayEvery > 1) {
2 26 Feb 07 jari 360             setIndices(createIndices(this.displayEvery));
2 26 Feb 07 jari 361         }
2 26 Feb 07 jari 362     this.experiment = e;
2 26 Feb 07 jari 363
2 26 Feb 07 jari 364         listener = new Listener();
2 26 Feb 07 jari 365         addMouseMotionListener(listener);
2 26 Feb 07 jari 366         addKeyListener(listener);
2 26 Feb 07 jari 367         
2 26 Feb 07 jari 368         this.geneColumnHeaderSP = createHeader(TRACE_SPACE, true, xWidth, MAX_COL_HEIGHT, elementSize, experiment);
2 26 Feb 07 jari 369         this.geneColumnHeaderSP.setBorder(BorderFactory.createLineBorder(Color.white));
2 26 Feb 07 jari 370         
2 26 Feb 07 jari 371         this.geneRowHeaderSP = createHeader(TRACE_SPACE, false, MAX_ROW_WIDTH, xHeight, elementSize, experiment);
2 26 Feb 07 jari 372         this.content = createContent(MAX_MATRIX_WIDTH, MAX_MATRIX_WIDTH, listener);
2 26 Feb 07 jari 373         
2 26 Feb 07 jari 374         this.geneColumnHeaderSP.setMatrixListener(listener);
2 26 Feb 07 jari 375         this.geneRowHeaderSP.setMatrixListener(listener);
2 26 Feb 07 jari 376         
2 26 Feb 07 jari 377         this.upperRightCornerSB = createScrollBar(JScrollBar.VERTICAL);
2 26 Feb 07 jari 378         this.lowerLeftCornerSB = createScrollBar(JScrollBar.HORIZONTAL);
2 26 Feb 07 jari 379         
2 26 Feb 07 jari 380         setMaxWidth(content, geneColumnHeaderSP);
2 26 Feb 07 jari 381         setMaxHeight(content, geneRowHeaderSP);
2 26 Feb 07 jari 382         
2 26 Feb 07 jari 383         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 384         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 385         
2 26 Feb 07 jari 386         geneColumnHeaderSP.setIndices(indices);
2 26 Feb 07 jari 387         geneRowHeaderSP.setIndices(indices);
2 26 Feb 07 jari 388         
2 26 Feb 07 jari 389         add(content);
2 26 Feb 07 jari 390         
2 26 Feb 07 jari 391         // Create a "pop-up" context menu for GDM Viewer
2 26 Feb 07 jari 392         popup = createJPopupMenu(listener);
2 26 Feb 07 jari 393         
2 26 Feb 07 jari 394         getContentComponent().addMouseListener(listener);
2 26 Feb 07 jari 395         
2 26 Feb 07 jari 396         setBackground(Color.white);
2 26 Feb 07 jari 397         setOpaque(true);
2 26 Feb 07 jari 398         
2 26 Feb 07 jari 399     }
2 26 Feb 07 jari 400   /** 
2 26 Feb 07 jari 401    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperiment(org.tigr.microarray.mev.cluster.gui.Experiment)
2 26 Feb 07 jari 402    */
2 26 Feb 07 jari 403   public void setExperiment(Experiment e) {
2 26 Feb 07 jari 404     this.experiment = e;
2 26 Feb 07 jari 405
2 26 Feb 07 jari 406     }
2 26 Feb 07 jari 407     
2 26 Feb 07 jari 408     /**
2 26 Feb 07 jari 409      * Initializes 'display/label' menu actions.
2 26 Feb 07 jari 410      */
2 26 Feb 07 jari 411     private void initLabelActions(String[] labels) {
2 26 Feb 07 jari 412         DefaultAction action = new DefaultAction(NO_LABEL, DISPLAY_LABEL_CMD);
2 26 Feb 07 jari 413         action.putValue(PARAMETER, String.valueOf(-1));
2 26 Feb 07 jari 414         actions.put(DISPLAY_LABEL_ACTION+String.valueOf(-1), action);
2 26 Feb 07 jari 415         for (int i=0; i<labels.length; i++) {
2 26 Feb 07 jari 416             action = new DefaultAction(LABEL_BY+labels[i], DISPLAY_LABEL_CMD);
2 26 Feb 07 jari 417             action.putValue(PARAMETER, String.valueOf(i));
2 26 Feb 07 jari 418             actions.put(DISPLAY_LABEL_ACTION+String.valueOf(i), action);
2 26 Feb 07 jari 419         }
2 26 Feb 07 jari 420     }
2 26 Feb 07 jari 421     
2 26 Feb 07 jari 422     /**
2 26 Feb 07 jari 423      * Initializes sorting actions.
2 26 Feb 07 jari 424      */
2 26 Feb 07 jari 425     private void initSortActions(String[] labels) {
2 26 Feb 07 jari 426         DefaultAction action;
2 26 Feb 07 jari 427         for (int i=0; i<labels.length; i++) {
2 26 Feb 07 jari 428             action = new DefaultAction(SORT_BY+labels[i], SORT_LABEL_CMD);
2 26 Feb 07 jari 429             action.putValue(PARAMETER, String.valueOf(i));
2 26 Feb 07 jari 430             actions.put(SORT_LABEL_ACTION+String.valueOf(i), action);
2 26 Feb 07 jari 431         }
2 26 Feb 07 jari 432     }
2 26 Feb 07 jari 433     
2 26 Feb 07 jari 434     /**
2 26 Feb 07 jari 435      * Initializes 'Annotation Width' menu actions.
2 26 Feb 07 jari 436      */
2 26 Feb 07 jari 437     private void initAnnotationWidthActions() {
2 26 Feb 07 jari 438         DefaultAction action = new DefaultAction(CHANGE_ANNOTATION_WIDTH, ANNOTATION_WIDTH_CMD);
2 26 Feb 07 jari 439         action.putValue(PARAMETER, String.valueOf(-1));
2 26 Feb 07 jari 440         actions.put(ANNOTATION_WIDTH_ACTION+String.valueOf(-1), action);
2 26 Feb 07 jari 441     }
2 26 Feb 07 jari 442     
2 26 Feb 07 jari 443     
2 26 Feb 07 jari 444     /**
2 26 Feb 07 jari 445      * Rturns an action by its name.
2 26 Feb 07 jari 446      */
2 26 Feb 07 jari 447     public Action getAction(String name) {
2 26 Feb 07 jari 448         return(Action)actions.get(name);
2 26 Feb 07 jari 449     }
2 26 Feb 07 jari 450     
2 26 Feb 07 jari 451     public void setMainFrame(JFrame mframe) {
2 26 Feb 07 jari 452         this.mainframe = mframe;
2 26 Feb 07 jari 453     }
2 26 Feb 07 jari 454     
2 26 Feb 07 jari 455     private void setIndices(int [] indexes) {
2 26 Feb 07 jari 456         this.indices = indexes;
2 26 Feb 07 jari 457     }
2 26 Feb 07 jari 458     
2 26 Feb 07 jari 459     private int [] getIndices() {
2 26 Feb 07 jari 460         return this.indices;
2 26 Feb 07 jari 461     }
2 26 Feb 07 jari 462     
2 26 Feb 07 jari 463     private int [] createIndices(int displayEvery) {
2 26 Feb 07 jari 464         
2 26 Feb 07 jari 465         int indicesSize = this.num_genes;
2 26 Feb 07 jari 466         int [] indices = new int [indicesSize];
2 26 Feb 07 jari 467         int i=0, total=0, index=0;
2 26 Feb 07 jari 468         
2 26 Feb 07 jari 469         for (index=0; index < this.probes; index++) {
2 26 Feb 07 jari 470             if ((total % this.displayEvery == 0) && (i<indicesSize)) {
2 26 Feb 07 jari 471                 indices[i] = index;
2 26 Feb 07 jari 472                 i++;
2 26 Feb 07 jari 473             }
2 26 Feb 07 jari 474             total++;
2 26 Feb 07 jari 475         }
2 26 Feb 07 jari 476         total = 0;
2 26 Feb 07 jari 477         if (this.numOfClusters > 0) {
2 26 Feb 07 jari 478             clusterlength = new int [numOfClusters];
2 26 Feb 07 jari 479             i=0;
2 26 Feb 07 jari 480             for (int j=0; j<this.numOfClusters; j++) {
2 26 Feb 07 jari 481                 for(int k=0; k<clusters[j].length; k++) {
2 26 Feb 07 jari 482                     if ( (total % this.displayEvery == 0) && (i < indicesSize)) {
2 26 Feb 07 jari 483                         indices[i] = clusters[j][k];
2 26 Feb 07 jari 484                         i++;
2 26 Feb 07 jari 485                         clusterlength[j] ++;
2 26 Feb 07 jari 486                     }
2 26 Feb 07 jari 487                     total++;
2 26 Feb 07 jari 488                 }
2 26 Feb 07 jari 489             }
2 26 Feb 07 jari 490         }
2 26 Feb 07 jari 491         
2 26 Feb 07 jari 492         return indices;
2 26 Feb 07 jari 493     }
2 26 Feb 07 jari 494     
2 26 Feb 07 jari 495     private int [] createIndices() {
2 26 Feb 07 jari 496         int [] indices = new int [this.num_genes];
2 26 Feb 07 jari 497         for (int i=0; i<indices.length; i++) {
2 26 Feb 07 jari 498             indices[i] = i;
2 26 Feb 07 jari 499         }
2 26 Feb 07 jari 500         
2 26 Feb 07 jari 501         
2 26 Feb 07 jari 502         if (this.numOfClusters > 0) {
2 26 Feb 07 jari 503             clusterlength = new int [this.num_genes];
2 26 Feb 07 jari 504             int i=0;
2 26 Feb 07 jari 505             
2 26 Feb 07 jari 506             for (int j=0; j<this.numOfClusters; j++) {
2 26 Feb 07 jari 507                 for(int k=0; k<clusters[j].length; k++) {
2 26 Feb 07 jari 508                     indices[i] = clusters[j][k];
2 26 Feb 07 jari 509                     clusterlength[j] ++;
2 26 Feb 07 jari 510                     i++;
2 26 Feb 07 jari 511                 }
2 26 Feb 07 jari 512             }
2 26 Feb 07 jari 513         }
2 26 Feb 07 jari 514         
2 26 Feb 07 jari 515         return indices;
2 26 Feb 07 jari 516     }
2 26 Feb 07 jari 517     
2 26 Feb 07 jari 518     private void setMaxWidth(JComponent content, JComponent header) {
2 26 Feb 07 jari 519         int c_width = content.getPreferredSize().width;
2 26 Feb 07 jari 520         int h_width = header.getPreferredSize().width;
2 26 Feb 07 jari 521         if (c_width > h_width) {
2 26 Feb 07 jari 522             header.setPreferredSize(new Dimension(c_width, header.getPreferredSize().height));
2 26 Feb 07 jari 523         } else {
2 26 Feb 07 jari 524             content.setPreferredSize(new Dimension(h_width, content.getPreferredSize().height));
2 26 Feb 07 jari 525         }
2 26 Feb 07 jari 526     }
2 26 Feb 07 jari 527     
2 26 Feb 07 jari 528     private void setMaxHeight(JComponent content, JComponent header) {
2 26 Feb 07 jari 529         int c_height = content.getPreferredSize().height;
2 26 Feb 07 jari 530         int h_height = header.getPreferredSize().height;
2 26 Feb 07 jari 531         if (c_height > h_height) {
2 26 Feb 07 jari 532             header.setPreferredSize(new Dimension(header.getPreferredSize().width, c_height));
2 26 Feb 07 jari 533         } else {
2 26 Feb 07 jari 534             content.setPreferredSize(new Dimension(content.getPreferredSize().width, h_height));
2 26 Feb 07 jari 535         }
2 26 Feb 07 jari 536     }
2 26 Feb 07 jari 537     
2 26 Feb 07 jari 538     /**
2 26 Feb 07 jari 539      * Returns a gradient image for positive values.
2 26 Feb 07 jari 540      */
2 26 Feb 07 jari 541     public BufferedImage getPosColorImage() {
2 26 Feb 07 jari 542         return posColorImage;
2 26 Feb 07 jari 543     }
2 26 Feb 07 jari 544     
2 26 Feb 07 jari 545     /**
2 26 Feb 07 jari 546      * Returns a gradient image for negative values.
2 26 Feb 07 jari 547      */
2 26 Feb 07 jari 548     public BufferedImage getNegColorImage() {
2 26 Feb 07 jari 549         return negColorImage;
2 26 Feb 07 jari 550     }
2 26 Feb 07 jari 551     
2 26 Feb 07 jari 552     
2 26 Feb 07 jari 553     /**
2 26 Feb 07 jari 554      * Returns a gradient image for positive values.
2 26 Feb 07 jari 555      */
2 26 Feb 07 jari 556     public void setPosColorImage(BufferedImage image) {
2 26 Feb 07 jari 557         this.posColorImage = image;
2 26 Feb 07 jari 558     }
2 26 Feb 07 jari 559     
2 26 Feb 07 jari 560     /**
2 26 Feb 07 jari 561      * Returns a gradient image for negative values.
2 26 Feb 07 jari 562      */
2 26 Feb 07 jari 563     public void setNegColorImage(BufferedImage image) {
2 26 Feb 07 jari 564         this.negColorImage = image;
2 26 Feb 07 jari 565     }
2 26 Feb 07 jari 566     
2 26 Feb 07 jari 567     public void setBorderColor(Color color) {
2 26 Feb 07 jari 568         this.borderColor = color;
2 26 Feb 07 jari 569     }
2 26 Feb 07 jari 570     
2 26 Feb 07 jari 571     private GDMGeneHeader createHeader(int tracespace, boolean colHdr,
2 26 Feb 07 jari 572     int width, int height, Dimension eSize, Experiment experiment) {
2 26 Feb 07 jari 573         
2 26 Feb 07 jari 574         GDMGeneHeader hdr = new GDMGeneHeader(this.insets, tracespace, colHdr, experiment, width,
2 26 Feb 07 jari 575         height, eSize, maxGeneNameLength, num_genes, getIndices());
2 26 Feb 07 jari 576         return hdr;
2 26 Feb 07 jari 577     }
2 26 Feb 07 jari 578     
2 26 Feb 07 jari 579     private JPanel createContent(int width, int height, Listener listener) {
2 26 Feb 07 jari 580         JPanel cPanel = new JPanel(new BorderLayout());
2 26 Feb 07 jari 581         cPanel.setBackground(Color.white);
2 26 Feb 07 jari 582         xWidth = getXSize();
2 26 Feb 07 jari 583         xHeight = getYSize();
2 26 Feb 07 jari 584         cPanel.setSize(xWidth+5, xHeight+5);
2 26 Feb 07 jari 585         cPanel.setPreferredSize(new Dimension(xWidth+5, xHeight+5));
2 26 Feb 07 jari 586         cPanel.setOpaque(true);
2 26 Feb 07 jari 587         cPanel.setVisible(true);
2 26 Feb 07 jari 588         return cPanel;
2 26 Feb 07 jari 589     }
2 26 Feb 07 jari 590     
2 26 Feb 07 jari 591     
2 26 Feb 07 jari 592     private JScrollBar createScrollBar(int orientation) {
2 26 Feb 07 jari 593         
2 26 Feb 07 jari 594         JScrollBar jsb = new JScrollBar(orientation);
2 26 Feb 07 jari 595         
2 26 Feb 07 jari 596         // VERTICAL Upper Right Corner ScrollBar for Column Header component
2 26 Feb 07 jari 597         if (orientation == JScrollBar.VERTICAL) {
2 26 Feb 07 jari 598             jsb.setModel(geneColumnHeaderSP.getVerticalScrollBar().getModel());
2 26 Feb 07 jari 599         } else {
2 26 Feb 07 jari 600             // HORIZONTAL Lower Left Corner ScrollBar for Row Header component
2 26 Feb 07 jari 601             jsb.setModel(geneRowHeaderSP.getHorizontalScrollBar().getModel());
2 26 Feb 07 jari 602         }
2 26 Feb 07 jari 603         return jsb;
2 26 Feb 07 jari 604     }
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     /**
2 26 Feb 07 jari 607      * Returns index of top row.
2 26 Feb 07 jari 608      */
2 26 Feb 07 jari 609     private int getTopIndex(int top) {
2 26 Feb 07 jari 610         if (top<0) {
2 26 Feb 07 jari 611             return 0;
2 26 Feb 07 jari 612         }
2 26 Feb 07 jari 613         return (top-insets.top)/elementSize.height;
2 26 Feb 07 jari 614     }
2 26 Feb 07 jari 615     
2 26 Feb 07 jari 616     /**
2 26 Feb 07 jari 617      * Returns index of left column.
2 26 Feb 07 jari 618      */
2 26 Feb 07 jari 619     private int getLeftIndex(int left) {
2 26 Feb 07 jari 620         if (left<0) {
2 26 Feb 07 jari 621             return 0;
2 26 Feb 07 jari 622         }
2 26 Feb 07 jari 623         return (left-insets.left)/(elementSize.width+getSpacing());
2 26 Feb 07 jari 624     }
2 26 Feb 07 jari 625     
2 26 Feb 07 jari 626     /**
2 26 Feb 07 jari 627      * Returns index of right column.
2 26 Feb 07 jari 628      */
2 26 Feb 07 jari 629     private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 630         if (right<0) {
2 26 Feb 07 jari 631             return 0;
2 26 Feb 07 jari 632         }
2 26 Feb 07 jari 633         int result = (right-insets.left)/(elementSize.width+getSpacing())+1;
2 26 Feb 07 jari 634         return result > limit ? limit : result;
2 26 Feb 07 jari 635     }
2 26 Feb 07 jari 636     
2 26 Feb 07 jari 637     /**
2 26 Feb 07 jari 638      * Returns index of bottom row.
2 26 Feb 07 jari 639      */
2 26 Feb 07 jari 640     private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 641         if (bottom<0) {
2 26 Feb 07 jari 642             return 0;
2 26 Feb 07 jari 643         }
2 26 Feb 07 jari 644         int result = (bottom-insets.top)/elementSize.height+1;
2 26 Feb 07 jari 645         return result > limit ? limit : result;
2 26 Feb 07 jari 646     }
2 26 Feb 07 jari 647     
2 26 Feb 07 jari 648     public void paint(Graphics g1D) {
2 26 Feb 07 jari 649         super.paint(g1D);
2 26 Feb 07 jari 650         if (num_genes == 0 || framework == null) { // empty data
2 26 Feb 07 jari 651             return;
2 26 Feb 07 jari 652         }
2 26 Feb 07 jari 653         
2 26 Feb 07 jari 654         Graphics2D g2D = (Graphics2D)g1D;
2 26 Feb 07 jari 655         
2 26 Feb 07 jari 656         if (isAntiAliasing) {//Anti-aliasing is on
2 26 Feb 07 jari 657             g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 658             g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 659         }
2 26 Feb 07 jari 660         
2 26 Feb 07 jari 661         drawColumns(g2D);
2 26 Feb 07 jari 662         
2 26 Feb 07 jari 663         if (isDrawClusterBorders && numOfClusters > 0 ) {
2 26 Feb 07 jari 664             drawClusterBorder(g2D);
2 26 Feb 07 jari 665         }
2 26 Feb 07 jari 666         
2 26 Feb 07 jari 667         drawPerimeter(g2D);
2 26 Feb 07 jari 668         
2 26 Feb 07 jari 669         return;
2 26 Feb 07 jari 670     }
2 26 Feb 07 jari 671     
2 26 Feb 07 jari 672     private void drawClusterBorder(Graphics2D g2d) {
2 26 Feb 07 jari 673         
2 26 Feb 07 jari 674         int xPosition = insets.left;
2 26 Feb 07 jari 675         int yPosition = insets.top;
2 26 Feb 07 jari 676         int width=0, height=0;
2 26 Feb 07 jari 677         
2 26 Feb 07 jari 678         Graphics g = (Graphics) g2d;
2 26 Feb 07 jari 679         
2 26 Feb 07 jari 680         g.setColor(clusterBorderColor);
2 26 Feb 07 jari 681         
2 26 Feb 07 jari 682         for (int i = 0; i < this.numOfClusters; i++) {
2 26 Feb 07 jari 683             height = this.clusterlength[i]* (this.elementSize.height + getSpacing());
2 26 Feb 07 jari 684             xPosition = insets.left;
2 26 Feb 07 jari 685             
2 26 Feb 07 jari 686             for (int j = 0; j < this.numOfClusters; j++) {
2 26 Feb 07 jari 687                 width = this.clusterlength[j] * (this.elementSize.width + getSpacing());
2 26 Feb 07 jari 688                 g.drawRect( xPosition, yPosition, width, height);
2 26 Feb 07 jari 689                 xPosition += width;
2 26 Feb 07 jari 690             }
2 26 Feb 07 jari 691             yPosition += height;
2 26 Feb 07 jari 692         }
2 26 Feb 07 jari 693     }
2 26 Feb 07 jari 694     
2 26 Feb 07 jari 695     private void drawColumns(Graphics2D g) {
2 26 Feb 07 jari 696         
2 26 Feb 07 jari 697         Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 698         final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 699         final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 700         
2 26 Feb 07 jari 701         int bottom = 0;
2 26 Feb 07 jari 702         int right = 0;
2 26 Feb 07 jari 703         
2 26 Feb 07 jari 704         bottom = getBottomIndex(bounds.y+bounds.height, num_genes);
2 26 Feb 07 jari 705         right = getRightIndex(bounds.x+bounds.width, num_genes);
2 26 Feb 07 jari 706         
2 26 Feb 07 jari 707         for (int column = left; column < right; column++) {
2 26 Feb 07 jari 708             drawColumn(g, column, top, bottom);
2 26 Feb 07 jari 709         }
2 26 Feb 07 jari 710     }
2 26 Feb 07 jari 711     
2 26 Feb 07 jari 712     private void drawPerimeter(Graphics2D g){
2 26 Feb 07 jari 713         Color color = g.getColor();
2 26 Feb 07 jari 714         g.setColor(Color.black);
2 26 Feb 07 jari 715         if(this.isDrawClusterBorders && this.numOfClusters > 0)
2 26 Feb 07 jari 716             g.drawRect(0,0, getXSize()-insets.right+1, getYSize()-insets.bottom+1);
2 26 Feb 07 jari 717         else
2 26 Feb 07 jari 718             g.drawRect(0,0, getXSize()-insets.right, getYSize()-insets.bottom);
2 26 Feb 07 jari 719         g.setColor(color);
2 26 Feb 07 jari 720     }
2 26 Feb 07 jari 721     
2 26 Feb 07 jari 722     /**
2 26 Feb 07 jari 723      * Draws a specified column.
2 26 Feb 07 jari 724      */
2 26 Feb 07 jari 725     private void drawColumn(Graphics2D g, int column, final int top, final int bottom) {
2 26 Feb 07 jari 726         for (int row = top; row < bottom; row++) {
2 26 Feb 07 jari 727             drawSlideDataElement(g, row, column);
2 26 Feb 07 jari 728         }
2 26 Feb 07 jari 729     }
2 26 Feb 07 jari 730     
2 26 Feb 07 jari 731     /**
2 26 Feb 07 jari 732      * Draws an element rectangle to specified row and column.
2 26 Feb 07 jari 733      */
2 26 Feb 07 jari 734     private void drawSlideDataElement(Graphics g, final int row, final int column) {
2 26 Feb 07 jari 735         
2 26 Feb 07 jari 736         Color holdColor;
2 26 Feb 07 jari 737         
2 26 Feb 07 jari 738         float distance = geneDistMatrix.get(indices[row], indices[column]);
2 26 Feb 07 jari 739         if (Float.isNaN(distance)) {
2 26 Feb 07 jari 740             holdColor = NaNColor;
2 26 Feb 07 jari 741         } else if (distance == 0 && row == column) {
2 26 Feb 07 jari 742             holdColor = diagColor;
2 26 Feb 07 jari 743         } else if (distance == 0 && row != column) {
2 26 Feb 07 jari 744             holdColor = zeroColor;
2 26 Feb 07 jari 745         } else {
2 26 Feb 07 jari 746             holdColor = getColor(distance);
2 26 Feb 07 jari 747         }
2 26 Feb 07 jari 748         g.setColor(holdColor);
2 26 Feb 07 jari 749         g.fillRect( getXPos(column), getYPos(row), elementSize.width, elementSize.height);
2 26 Feb 07 jari 750         
2 26 Feb 07 jari 751         if (isDrawBorders && elementSize.width > 2) {
2 26 Feb 07 jari 752             g.setColor(borderColor);
2 26 Feb 07 jari 753             g.drawRect( getXPos(column), getYPos(row), elementSize.width -1, elementSize.height -1);
2 26 Feb 07 jari 754         }
2 26 Feb 07 jari 755     }
2 26 Feb 07 jari 756     
2 26 Feb 07 jari 757     /**
2 26 Feb 07 jari 758      * Creates a gradient image with specified initial colors.
2 26 Feb 07 jari 759      */
2 26 Feb 07 jari 760     private BufferedImage createGradientImage(Color color1, Color color2) {
2 26 Feb 07 jari 761         BufferedImage image = new BufferedImage(256, 1, BufferedImage.TYPE_3BYTE_BGR);
2 26 Feb 07 jari 762         Graphics2D graphics = image.createGraphics();
2 26 Feb 07 jari 763         GradientPaint gp = new GradientPaint(0, 0, color1, 255, 0, color2);
2 26 Feb 07 jari 764         graphics.setPaint(gp);
2 26 Feb 07 jari 765         graphics.drawRect(0, 0, 255, 1);
2 26 Feb 07 jari 766         return image;
2 26 Feb 07 jari 767     }
2 26 Feb 07 jari 768     
2 26 Feb 07 jari 769     private Color getColor(float value) {
2 26 Feb 07 jari 770         if (Float.isNaN(value) || posColorImage == null || negColorImage == null) {
2 26 Feb 07 jari 771             return NaNColor;
2 26 Feb 07 jari 772         }
2 26 Feb 07 jari 773         //float maximum = value < 0 ? this.minValue : this.maxValue;
2 26 Feb 07 jari 774         
2 26 Feb 07 jari 775         int colorIndex = (int)(255*(value-this.minValue)/this.maxValue);
2 26 Feb 07 jari 776         if(colorIndex > 255)
2 26 Feb 07 jari 777             colorIndex = 255;
2 26 Feb 07 jari 778         if(colorIndex < 0)
2 26 Feb 07 jari 779             colorIndex = 0;
2 26 Feb 07 jari 780         int rgb = value < 0 ? negColorImage.getRGB(255-colorIndex, 0) : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 781         
2 26 Feb 07 jari 782         return new Color(rgb);
2 26 Feb 07 jari 783     }
2 26 Feb 07 jari 784     
2 26 Feb 07 jari 785     private void setFontSize(int width) {
2 26 Feb 07 jari 786         if (width > 12)
2 26 Feb 07 jari 787             width = 12;
2 26 Feb 07 jari 788         setFont(new Font("monspaced", Font.PLAIN, width));
2 26 Feb 07 jari 789     }
2 26 Feb 07 jari 790     
2 26 Feb 07 jari 791     public void setElementWidth(int width) {
2 26 Feb 07 jari 792         this.elementWidth = width;
2 26 Feb 07 jari 793         setFontSize(width);
2 26 Feb 07 jari 794     }
2 26 Feb 07 jari 795     
2 26 Feb 07 jari 796     public int getElementWidth() {
2 26 Feb 07 jari 797         return this.elementWidth;
2 26 Feb 07 jari 798     }
2 26 Feb 07 jari 799     
2 26 Feb 07 jari 800     void setTracing(boolean isTracing) {
2 26 Feb 07 jari 801         this.isTracing = isTracing;
2 26 Feb 07 jari 802     }
2 26 Feb 07 jari 803     
2 26 Feb 07 jari 804     private int getSpacing() {
2 26 Feb 07 jari 805         if (isTracing)
2 26 Feb 07 jari 806             return tracespace;
2 26 Feb 07 jari 807         return 0;
2 26 Feb 07 jari 808     }
2 26 Feb 07 jari 809     
2 26 Feb 07 jari 810     public JComponent getContentComponent() {
2 26 Feb 07 jari 811         return this;
2 26 Feb 07 jari 812     }
2 26 Feb 07 jari 813     
2 26 Feb 07 jari 814     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 815         return geneColumnHeaderSP;
2 26 Feb 07 jari 816     }
2 26 Feb 07 jari 817     
2 26 Feb 07 jari 818     public JComponent getColumnHeaderComponent() {
2 26 Feb 07 jari 819         return geneColumnHeaderSP;
2 26 Feb 07 jari 820     }
2 26 Feb 07 jari 821     
2 26 Feb 07 jari 822     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 823         return geneRowHeaderSP;
2 26 Feb 07 jari 824     }
2 26 Feb 07 jari 825     
2 26 Feb 07 jari 826     public JComponent getUpperRightCornerSB() {
2 26 Feb 07 jari 827         return upperRightCornerSB;
2 26 Feb 07 jari 828     }
2 26 Feb 07 jari 829     
2 26 Feb 07 jari 830     public JComponent getLowerLeftCornerSB() {
2 26 Feb 07 jari 831         return lowerLeftCornerSB;
2 26 Feb 07 jari 832     }
2 26 Feb 07 jari 833     
2 26 Feb 07 jari 834     /**
2 26 Feb 07 jari 835      * Returns a width of the viewer.
2 26 Feb 07 jari 836      */
2 26 Feb 07 jari 837     private int getXSize() {
2 26 Feb 07 jari 838         int size = 0;
2 26 Feb 07 jari 839         size = (num_genes*elementSize.width)+((num_genes-1)*getSpacing())+insets.left+insets.right;
2 26 Feb 07 jari 840         
2 26 Feb 07 jari 841         return size;
2 26 Feb 07 jari 842     }
2 26 Feb 07 jari 843     
2 26 Feb 07 jari 844     /**
2 26 Feb 07 jari 845      * Returns a height of the viewer.
2 26 Feb 07 jari 846      */
2 26 Feb 07 jari 847     private int getYSize() {
2 26 Feb 07 jari 848         int size = 0;
2 26 Feb 07 jari 849         size = (num_genes*elementSize.height)+((num_genes-1)*getSpacing()+insets.top+insets.bottom);
2 26 Feb 07 jari 850         
2 26 Feb 07 jari 851         return size;
2 26 Feb 07 jari 852     }
2 26 Feb 07 jari 853     
2 26 Feb 07 jari 854     /**
2 26 Feb 07 jari 855      * Returns max label width.
2 26 Feb 07 jari 856      */
2 26 Feb 07 jari 857     private int getMaxGeneNameLength() {
2 26 Feb 07 jari 858         return maxGeneNameLength;
2 26 Feb 07 jari 859     }
2 26 Feb 07 jari 860     
2 26 Feb 07 jari 861     
2 26 Feb 07 jari 862     /**
2 26 Feb 07 jari 863      * Updates the viewer size.
2 26 Feb 07 jari 864      */
2 26 Feb 07 jari 865     private void updateSize(int annotationSize) {
2 26 Feb 07 jari 866         
2 26 Feb 07 jari 867         int width = getXSize();
2 26 Feb 07 jari 868         int height = getYSize();
2 26 Feb 07 jari 869         
2 26 Feb 07 jari 870         setSize(width, height);
2 26 Feb 07 jari 871         setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 872         
2 26 Feb 07 jari 873         geneColumnHeaderSP.setNumGenes(num_genes);
2 26 Feb 07 jari 874         geneColumnHeaderSP.updateSize(annotationSize);
2 26 Feb 07 jari 875         
2 26 Feb 07 jari 876         geneRowHeaderSP.setNumGenes(num_genes);
2 26 Feb 07 jari 877         geneRowHeaderSP.updateSize(annotationSize);
2 26 Feb 07 jari 878         
2 26 Feb 07 jari 879         setMaxWidth(content, geneColumnHeaderSP);
2 26 Feb 07 jari 880         setMaxHeight(content, geneRowHeaderSP);
2 26 Feb 07 jari 881         
2 26 Feb 07 jari 882         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 883         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 884         
2 26 Feb 07 jari 885         repaint();
2 26 Feb 07 jari 886     }
2 26 Feb 07 jari 887     
2 26 Feb 07 jari 888     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 889         
2 26 Feb 07 jari 890         this.framework = framework;
2 26 Feb 07 jari 891         this.expData = framework.getData();
2 26 Feb 07 jari 892         
2 26 Feb 07 jari 893         onDataChanged(this.expData);
2 26 Feb 07 jari 894         
2 26 Feb 07 jari 895         this.probes = expData.getFeaturesSize();
2 26 Feb 07 jari 896         this.featuresCount = expData.getFeaturesCount();
2 26 Feb 07 jari 897         
2 26 Feb 07 jari 898         this.num_genes = geneDistMatrix.getRowDimension()/displayEvery;
2 26 Feb 07 jari 899         
2 26 Feb 07 jari 900         IDisplayMenu menu = framework.getDisplayMenu();
2 26 Feb 07 jari 901         setFontSize(elementSize.width);
2 26 Feb 07 jari 902         
2 26 Feb 07 jari 903         xWidth = getXSize();
2 26 Feb 07 jari 904         xHeight = getYSize();
2 26 Feb 07 jari 905         
2 26 Feb 07 jari 906         geneColumnHeaderSP.setData(this.expData);
2 26 Feb 07 jari 907         geneColumnHeaderSP.setContentWidth(xWidth+10);
2 26 Feb 07 jari 908         geneColumnHeaderSP.setElementWidth(elementSize.width);
2 26 Feb 07 jari 909         
2 26 Feb 07 jari 910         geneRowHeaderSP.setData(this.expData);
2 26 Feb 07 jari 911         geneRowHeaderSP.setContentHeight(xHeight+10);
2 26 Feb 07 jari 912         geneRowHeaderSP.setElementHeight(elementSize.height);
2 26 Feb 07 jari 913         
2 26 Feb 07 jari 914         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 915         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 916         
2 26 Feb 07 jari 917         onMenuChanged(menu);
2 26 Feb 07 jari 918         onDataChanged(this.expData);
2 26 Feb 07 jari 919     }
2 26 Feb 07 jari 920     
2 26 Feb 07 jari 921     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 922         
2 26 Feb 07 jari 923         this.probes = expData.getFeaturesSize();
2 26 Feb 07 jari 924         this.featuresCount = expData.getFeaturesCount();
2 26 Feb 07 jari 925         this.num_genes = geneDistMatrix.getRowDimension()/displayEvery;
2 26 Feb 07 jari 926         
2 26 Feb 07 jari 927         paletteStyle = menu.getPaletteStyle();
2 26 Feb 07 jari 928         isGRScale = menu.isGRScale();
2 26 Feb 07 jari 929         if (menu.isTracing() == isTracing &&
2 26 Feb 07 jari 930         labelIndex == menu.getLabelIndex() &&
2 26 Feb 07 jari 931         isAntiAliasing == menu.isAntiAliasing()) {
2 26 Feb 07 jari 932             return;
2 26 Feb 07 jari 933         }
2 26 Feb 07 jari 934         
2 26 Feb 07 jari 935         isAntiAliasing = menu.isAntiAliasing();
2 26 Feb 07 jari 936         geneColumnHeaderSP.setAntiAliasing(isAntiAliasing);
2 26 Feb 07 jari 937         geneRowHeaderSP.setAntiAliasing(isAntiAliasing);
2 26 Feb 07 jari 938         labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 939         isTracing = menu.isTracing();
2 26 Feb 07 jari 940         setFont(new Font("monospaced", Font.BOLD, elementSize.height));
2 26 Feb 07 jari 941         
2 26 Feb 07 jari 942         xWidth = getXSize();
2 26 Feb 07 jari 943         xHeight = getYSize();
2 26 Feb 07 jari 944         
2 26 Feb 07 jari 945         geneColumnHeaderSP.setContentWidth(xWidth);
2 26 Feb 07 jari 946         geneColumnHeaderSP.setElementWidth(elementSize.width);
2 26 Feb 07 jari 947         geneColumnHeaderSP.setTracing(isTracing);
2 26 Feb 07 jari 948         
2 26 Feb 07 jari 949         geneRowHeaderSP.setContentHeight(xHeight);
2 26 Feb 07 jari 950         geneRowHeaderSP.setElementHeight(elementSize.height);
2 26 Feb 07 jari 951         geneRowHeaderSP.setTracing(isTracing);
2 26 Feb 07 jari 952         
2 26 Feb 07 jari 953         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 954         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 955         
2 26 Feb 07 jari 956         updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 957     }
2 26 Feb 07 jari 958     
2 26 Feb 07 jari 959     public void onDataChanged(IData data) {
2 26 Feb 07 jari 960         
2 26 Feb 07 jari 961         this.expData = data;
2 26 Feb 07 jari 962         
2 26 Feb 07 jari 963         this.probes = expData.getFeaturesSize();
2 26 Feb 07 jari 964         this.featuresCount = expData.getFeaturesCount();
2 26 Feb 07 jari 965         
2 26 Feb 07 jari 966         this.num_genes = geneDistMatrix.getRowDimension()/displayEvery;
2 26 Feb 07 jari 967         
2 26 Feb 07 jari 968         geneColumnHeaderSP.setData(data);
2 26 Feb 07 jari 969         geneRowHeaderSP.setData(data);
2 26 Feb 07 jari 970         
2 26 Feb 07 jari 971         updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 972     }
2 26 Feb 07 jari 973     
2 26 Feb 07 jari 974     public void onDeselected() {
2 26 Feb 07 jari 975         return;
2 26 Feb 07 jari 976     }
2 26 Feb 07 jari 977     
2 26 Feb 07 jari 978     public void onClosed() {
2 26 Feb 07 jari 979         return;
2 26 Feb 07 jari 980     }
2 26 Feb 07 jari 981     
2 26 Feb 07 jari 982     public BufferedImage getImage() {
2 26 Feb 07 jari 983         return null;
2 26 Feb 07 jari 984     }
2 26 Feb 07 jari 985     
2 26 Feb 07 jari 986     /**
2 26 Feb 07 jari 987      * @return true, if specified row and column are exists.
2 26 Feb 07 jari 988      */
2 26 Feb 07 jari 989     private boolean isLegalPosition(int row, int column) {
2 26 Feb 07 jari 990         if (isLegalRow(row) && isLegalColumn(column)) {
2 26 Feb 07 jari 991             return true;
2 26 Feb 07 jari 992         }
2 26 Feb 07 jari 993         return false;
2 26 Feb 07 jari 994     }
2 26 Feb 07 jari 995     
2 26 Feb 07 jari 996     /**
2 26 Feb 07 jari 997      * @return true, if specified column is exists.
2 26 Feb 07 jari 998      */
2 26 Feb 07 jari 999     private boolean isLegalColumn(int column) {
2 26 Feb 07 jari 1000         if (column < 0 || column > num_genes -1) {
2 26 Feb 07 jari 1001             return false;
2 26 Feb 07 jari 1002         }
2 26 Feb 07 jari 1003         return true;
2 26 Feb 07 jari 1004     }
2 26 Feb 07 jari 1005     
2 26 Feb 07 jari 1006     /**
2 26 Feb 07 jari 1007      * @return true, if specified row is exists.
2 26 Feb 07 jari 1008      */
2 26 Feb 07 jari 1009     private boolean isLegalRow(int row) {
2 26 Feb 07 jari 1010         if (row < 0 || row > num_genes -1) {
2 26 Feb 07 jari 1011             return false;
2 26 Feb 07 jari 1012         }
2 26 Feb 07 jari 1013         return true;
2 26 Feb 07 jari 1014     }
2 26 Feb 07 jari 1015     
2 26 Feb 07 jari 1016     /**
2 26 Feb 07 jari 1017      * Finds column by specified x coordinate.
2 26 Feb 07 jari 1018      * @return -1 if column was not found.
2 26 Feb 07 jari 1019      */
2 26 Feb 07 jari 1020     private int findColumn(int targetx) {
2 26 Feb 07 jari 1021         int columnSize = elementSize.width + getSpacing();
2 26 Feb 07 jari 1022         
2 26 Feb 07 jari 1023         if (targetx > num_genes*columnSize - getSpacing() + insets.left || targetx < this.insets.left) {
2 26 Feb 07 jari 1024             return -1;
2 26 Feb 07 jari 1025         } else {
2 26 Feb 07 jari 1026             return ((targetx)/columnSize);
2 26 Feb 07 jari 1027         }
2 26 Feb 07 jari 1028     }
2 26 Feb 07 jari 1029     
2 26 Feb 07 jari 1030     /**
2 26 Feb 07 jari 1031      * Finds row by specified y coordinate.
2 26 Feb 07 jari 1032      * @return -1 if row was not found.
2 26 Feb 07 jari 1033      */
2 26 Feb 07 jari 1034     private int findRow(int targety) {
2 26 Feb 07 jari 1035         int rowSize = num_genes*elementSize.height;
2 26 Feb 07 jari 1036         if (targety > rowSize + insets.top || targety < insets.top) {
2 26 Feb 07 jari 1037             return -1;
2 26 Feb 07 jari 1038         } else {
2 26 Feb 07 jari 1039             return (targety)/elementSize.height;
2 26 Feb 07 jari 1040         }
2 26 Feb 07 jari 1041     }
2 26 Feb 07 jari 1042     
2 26 Feb 07 jari 1043     /**
2 26 Feb 07 jari 1044      * Returns x coordinate of a column.
2 26 Feb 07 jari 1045      */
2 26 Feb 07 jari 1046     private int getXPos(int column) {
2 26 Feb 07 jari 1047         return column*(elementSize.width + getSpacing())+ insets.left;
2 26 Feb 07 jari 1048     }
2 26 Feb 07 jari 1049     
2 26 Feb 07 jari 1050     /**
2 26 Feb 07 jari 1051      * Returns y coordinate of a row.
2 26 Feb 07 jari 1052      */
2 26 Feb 07 jari 1053     private int getYPos(int row) {
2 26 Feb 07 jari 1054         return row * elementSize.height + insets.top;
2 26 Feb 07 jari 1055     }
2 26 Feb 07 jari 1056     
2 26 Feb 07 jari 1057     /**
2 26 Feb 07 jari 1058      * Draws a rectangle with specified color.
2 26 Feb 07 jari 1059      */
2 26 Feb 07 jari 1060     private void drawColoredBoxAt(Graphics g, int row, int column, Color color) {
2 26 Feb 07 jari 1061         g.setColor(color);
2 26 Feb 07 jari 1062         g.drawRect(insets.left + column*(elementSize.width+getSpacing()), insets.top + row*elementSize.height, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 1063     }
2 26 Feb 07 jari 1064     
2 26 Feb 07 jari 1065     public void displayGDMSpotInfo(int colIndex, int rowIndex, int column, int row) {
2 26 Feb 07 jari 1066         new GDMGeneSpotInfoDisplay(mainframe, this.experiment, this.expData, geneDistMatrix, rawMatrix, distanceMetric, colIndex, rowIndex, column, row);
2 26 Feb 07 jari 1067     }
2 26 Feb 07 jari 1068     
2 26 Feb 07 jari 1069     /**
2 26 Feb 07 jari 1070      * Creates a check box menu item with specified name, acton command and state.
2 26 Feb 07 jari 1071      */
2 26 Feb 07 jari 1072     private JCheckBoxMenuItem createJCheckBoxMenuItem(String name, String command, Listener listener, boolean isSelected) {
2 26 Feb 07 jari 1073         JCheckBoxMenuItem item = new JCheckBoxMenuItem(name);
2 26 Feb 07 jari 1074         item.setActionCommand(command);
2 26 Feb 07 jari 1075         item.addActionListener(listener);
2 26 Feb 07 jari 1076         item.setSelected(isSelected);
2 26 Feb 07 jari 1077         return item;
2 26 Feb 07 jari 1078     }
2 26 Feb 07 jari 1079     
2 26 Feb 07 jari 1080     /**
2 26 Feb 07 jari 1081      * Creates a check box menu item with specified name and acton command.
2 26 Feb 07 jari 1082      */
2 26 Feb 07 jari 1083     private JCheckBoxMenuItem createJCheckBoxMenuItem(String name, String command, Listener listener) {
2 26 Feb 07 jari 1084         return createJCheckBoxMenuItem(name, command, listener, false);
2 26 Feb 07 jari 1085     }
2 26 Feb 07 jari 1086     
2 26 Feb 07 jari 1087     /**
2 26 Feb 07 jari 1088      * Creates a radio button menu item with specified name, acton command and state.
2 26 Feb 07 jari 1089      */
2 26 Feb 07 jari 1090     private JRadioButtonMenuItem createJRadioButtonMenuItem(String name, String command, Listener listener, ButtonGroup buttonGroup, boolean isSelected) {
2 26 Feb 07 jari 1091         JRadioButtonMenuItem item = new JRadioButtonMenuItem(name);
2 26 Feb 07 jari 1092         item.setActionCommand(command);
2 26 Feb 07 jari 1093         item.addActionListener(listener);
2 26 Feb 07 jari 1094         item.setSelected(isSelected);
2 26 Feb 07 jari 1095         if (buttonGroup != null) {
2 26 Feb 07 jari 1096             buttonGroup.add(item);
2 26 Feb 07 jari 1097         }
2 26 Feb 07 jari 1098         return item;
2 26 Feb 07 jari 1099     }
2 26 Feb 07 jari 1100     
2 26 Feb 07 jari 1101     /**
2 26 Feb 07 jari 1102      * Creates a radio button menu item with specified name, acton command and button group.
2 26 Feb 07 jari 1103      */
2 26 Feb 07 jari 1104     private JRadioButtonMenuItem createJRadioButtonMenuItem(String name, String command, Listener listener, ButtonGroup buttonGroup) {
2 26 Feb 07 jari 1105         return createJRadioButtonMenuItem(name, command, listener, buttonGroup, false);
2 26 Feb 07 jari 1106     }
2 26 Feb 07 jari 1107     
2 26 Feb 07 jari 1108     
2 26 Feb 07 jari 1109     private JPopupMenu createJPopupMenu(Listener listener) {
2 26 Feb 07 jari 1110         JPopupMenu popup = new JPopupMenu();
2 26 Feb 07 jari 1111         addMenuItems(popup, listener);
2 26 Feb 07 jari 1112         return popup;
2 26 Feb 07 jari 1113     }
2 26 Feb 07 jari 1114     
2 26 Feb 07 jari 1115     private void addMenuItems(JPopupMenu menu, Listener listener) {
2 26 Feb 07 jari 1116         JMenuItem item;
2 26 Feb 07 jari 1117         ButtonGroup buttonGroup;
2 26 Feb 07 jari 1118         
2 26 Feb 07 jari 1119         JMenu colorSchemeMenu = new JMenu("Color Scheme");
2 26 Feb 07 jari 1120         buttonGroup = new ButtonGroup();
2 26 Feb 07 jari 1121         colorSchemeMenu.add(createJRadioButtonMenuItem("Black/Red Scheme", GREEN_RED_COLOR_SCHEME_CMD, listener, buttonGroup, true));
2 26 Feb 07 jari 1122         colorSchemeMenu.add(createJRadioButtonMenuItem("Black/Yellow Scheme",BLUE_YELLOW_COLOR_SCHEME_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1123         colorSchemeMenu.add(createJRadioButtonMenuItem("Custom Color Scheme", CUSTOM_COLOR_SCHEME_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1124         menu.add(colorSchemeMenu);
2 26 Feb 07 jari 1125         menu.addSeparator();
2 26 Feb 07 jari 1126         
2 26 Feb 07 jari 1127         JMenu sizeMenu = new JMenu("Element Size");
2 26 Feb 07 jari 1128         buttonGroup = new ButtonGroup();
2 26 Feb 07 jari 1129         sizeMenu.add(createJRadioButtonMenuItem("2 x 2", DISPLAY_2X2_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1130         sizeMenu.add(createJRadioButtonMenuItem("5 x 5", DISPLAY_5X5_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1131         sizeMenu.add(createJRadioButtonMenuItem("10 x 10", DISPLAY_10X10_CMD, listener, buttonGroup, true));
2 26 Feb 07 jari 1132         sizeMenu.add(createJRadioButtonMenuItem("15 x 15", DISPLAY_15X15_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1133         sizeMenu.add(createJRadioButtonMenuItem("Other", DISPLAY_OTHER_CMD, listener, buttonGroup));
2 26 Feb 07 jari 1134         menu.add(sizeMenu);
2 26 Feb 07 jari 1135         menu.addSeparator();
2 26 Feb 07 jari 1136         
2 26 Feb 07 jari 1137         menu.add(createJCheckBoxMenuItem("Draw Borders", DISPLAY_DRAW_BORDERS_CMD, listener));
2 26 Feb 07 jari 1138         if (numOfClusters > 0) {
2 26 Feb 07 jari 1139             drawClusterBorderItem = createJCheckBoxMenuItem("Draw Cluster Borders", SET_CLUSTER_BORDER_CMD, listener, true);
2 26 Feb 07 jari 1140             menu.add(drawClusterBorderItem);
2 26 Feb 07 jari 1141         }
2 26 Feb 07 jari 1142         
2 26 Feb 07 jari 1143         menu.addSeparator();
2 26 Feb 07 jari 1144         
2 26 Feb 07 jari 1145         item = new JMenuItem("Select Border Color");
2 26 Feb 07 jari 1146         item.setActionCommand(BORDER_COLOR_CMD);
2 26 Feb 07 jari 1147         item.addActionListener(listener);
2 26 Feb 07 jari 1148         menu.add(item);
2 26 Feb 07 jari 1149         menu.addSeparator();
2 26 Feb 07 jari 1150         
2 26 Feb 07 jari 1151         item = new JMenuItem("Set Color Scale");
2 26 Feb 07 jari 1152         item.setActionCommand(COLOR_SCALE_CMD);
2 26 Feb 07 jari 1153         item.addActionListener(listener);
2 26 Feb 07 jari 1154         menu.add(item);
2 26 Feb 07 jari 1155         menu.addSeparator();
2 26 Feb 07 jari 1156         
2 26 Feb 07 jari 1157         item = new JMenuItem("Toggle Sort on Proximity");
2 26 Feb 07 jari 1158         item.setActionCommand(TOGGLE_PROXIMITY_SORT_CMD);
2 26 Feb 07 jari 1159         item.addActionListener(listener);
2 26 Feb 07 jari 1160         menu.add(item);
2 26 Feb 07 jari 1161         
2 26 Feb 07 jari 1162         item = new JMenuItem("Save k Neighbors");
2 26 Feb 07 jari 1163         item.setActionCommand(SAVE_NEIGHBORS_CMD);
2 26 Feb 07 jari 1164         item.addActionListener(listener);
2 26 Feb 07 jari 1165         menu.add(item);
2 26 Feb 07 jari 1166         menu.addSeparator();
2 26 Feb 07 jari 1167         
2 26 Feb 07 jari 1168         sortMenu = new JMenu("Sort");
2 26 Feb 07 jari 1169         buttonGroup = new ButtonGroup();
2 26 Feb 07 jari 1170         if(numOfClusters > 0) {
2 26 Feb 07 jari 1171             sortMenu.add(createJRadioButtonMenuItem("Sort by Location", SORT_BY_LOCATION_CMD, listener, buttonGroup, false));
2 26 Feb 07 jari 1172         } else {
2 26 Feb 07 jari 1173             sortMenu.add(createJRadioButtonMenuItem("Sort by Location", SORT_BY_LOCATION_CMD, listener, buttonGroup, false));
2 26 Feb 07 jari 1174         }
2 26 Feb 07 jari 1175         
2 26 Feb 07 jari 1176         addSortMenuItems(sortMenu, buttonGroup);
2 26 Feb 07 jari 1177         
2 26 Feb 07 jari 1178         if(numOfClusters > 0) {
2 26 Feb 07 jari 1179             addSortClusterMenuItems(sortMenu, buttonGroup, listener);
2 26 Feb 07 jari 1180         }
2 26 Feb 07 jari 1181         menu.add(sortMenu);
2 26 Feb 07 jari 1182         
2 26 Feb 07 jari 1183         menu.addSeparator();
2 26 Feb 07 jari 1184         
2 26 Feb 07 jari 1185         item = new JMenuItem("Impose Cluster Result");
2 26 Feb 07 jari 1186         item.setActionCommand("impose-cluster-order");
2 26 Feb 07 jari 1187         item.addActionListener(listener);
2 26 Feb 07 jari 1188         menu.add(item);
2 26 Feb 07 jari 1189         
2 26 Feb 07 jari 1190         menu.addSeparator();
2 26 Feb 07 jari 1191         
2 26 Feb 07 jari 1192         JMenu annotationMenu = new JMenu("Change Annotation");
2 26 Feb 07 jari 1193         buttonGroup = new ButtonGroup();
2 26 Feb 07 jari 1194         addLabelMenuItems(annotationMenu, buttonGroup);
2 26 Feb 07 jari 1195         menu.add(annotationMenu);
2 26 Feb 07 jari 1196         
2 26 Feb 07 jari 1197         menu.addSeparator();
2 26 Feb 07 jari 1198         item = new JMenuItem("Change annotation Width");
2 26 Feb 07 jari 1199         item.setActionCommand(ANNOTATION_WIDTH_CMD);
2 26 Feb 07 jari 1200         item.addActionListener(listener);
2 26 Feb 07 jari 1201         menu.add(item);
2 26 Feb 07 jari 1202     }
2 26 Feb 07 jari 1203     
2 26 Feb 07 jari 1204     /**
2 26 Feb 07 jari 1205      * Adds label menu items.
2 26 Feb 07 jari 1206      */
2 26 Feb 07 jari 1207     
2 26 Feb 07 jari 1208     private void addLabelMenuItems(JMenu menu, ButtonGroup buttonGroup){
2 26 Feb 07 jari 1209         int index = -1;
2 26 Feb 07 jari 1210         JRadioButtonMenuItem item;
2 26 Feb 07 jari 1211         Action action;
2 26 Feb 07 jari 1212         while ((action = getAction(DISPLAY_LABEL_ACTION+String.valueOf(index)))!=null) {
2 26 Feb 07 jari 1213             item = new JRadioButtonMenuItem(action);
2 26 Feb 07 jari 1214             buttonGroup.add(item);
2 26 Feb 07 jari 1215             if (index < 1) {
2 26 Feb 07 jari 1216                 item.setSelected(true);
2 26 Feb 07 jari 1217                 String indexStr = (String)action.getValue(PARAMETER);
2 26 Feb 07 jari 1218                 label = Integer.parseInt(indexStr);
2 26 Feb 07 jari 1219             }
2 26 Feb 07 jari 1220             menu.add(item);
2 26 Feb 07 jari 1221             index++;
2 26 Feb 07 jari 1222         }
2 26 Feb 07 jari 1223     }
2 26 Feb 07 jari 1224     
2 26 Feb 07 jari 1225     /**
2 26 Feb 07 jari 1226      * Adds sort menu items.
2 26 Feb 07 jari 1227      */
2 26 Feb 07 jari 1228     
2 26 Feb 07 jari 1229     private void addSortMenuItems(JMenu menu, ButtonGroup buttonGroup) {
2 26 Feb 07 jari 1230         int index = 0;
2 26 Feb 07 jari 1231         JRadioButtonMenuItem item;
2 26 Feb 07 jari 1232         Action action;
2 26 Feb 07 jari 1233         while ((action = getAction(SORT_LABEL_ACTION+String.valueOf(index)))!=null) {
2 26 Feb 07 jari 1234             item = new JRadioButtonMenuItem(action);
2 26 Feb 07 jari 1235             buttonGroup.add(item);
2 26 Feb 07 jari 1236             menu.add(item);
2 26 Feb 07 jari 1237             index++;
2 26 Feb 07 jari 1238         }
2 26 Feb 07 jari 1239     }
2 26 Feb 07 jari 1240     
2 26 Feb 07 jari 1241     private void addSortClusterMenuItems(JMenu menu, ButtonGroup buttonGroup, Listener listener) {
2 26 Feb 07 jari 1242         menu.add(createJRadioButtonMenuItem("Sort by Cluster Number", SORT_BY_CLUSTER_ORDER_CMD, listener, buttonGroup, true));
2 26 Feb 07 jari 1243     }
2 26 Feb 07 jari 1244     
2 26 Feb 07 jari 1245     /**
2 26 Feb 07 jari 1246      * Sets the user specified spot size.
2 26 Feb 07 jari 1247      */
2 26 Feb 07 jari 1248     
2 26 Feb 07 jari 1249     private void onElementSizeChanged(int width, int height) {
2 26 Feb 07 jari 1250         this.elementSize = new Dimension(width, height);
2 26 Feb 07 jari 1251         xWidth = getXSize();
2 26 Feb 07 jari 1252         xHeight = getYSize();
2 26 Feb 07 jari 1253         
2 26 Feb 07 jari 1254         geneColumnHeaderSP.setContentWidth(xWidth);
2 26 Feb 07 jari 1255         geneColumnHeaderSP.setElementWidth(elementSize.width);
2 26 Feb 07 jari 1256         geneColumnHeaderSP.setElementHeight(elementSize.height);
2 26 Feb 07 jari 1257         
2 26 Feb 07 jari 1258         geneRowHeaderSP.setContentHeight(xHeight);
2 26 Feb 07 jari 1259         geneRowHeaderSP.setElementWidth(elementSize.width);
2 26 Feb 07 jari 1260         geneRowHeaderSP.setElementHeight(elementSize.height);
2 26 Feb 07 jari 1261         
2 26 Feb 07 jari 1262         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1263         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1264         
2 26 Feb 07 jari 1265         updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1266         this.validate();
2 26 Feb 07 jari 1267     }
2 26 Feb 07 jari 1268     
2 26 Feb 07 jari 1269     /**
2 26 Feb 07 jari 1270      * Sets the user specified spot size.
2 26 Feb 07 jari 1271      */
2 26 Feb 07 jari 1272     private void onElementSizeChanged() {
2 26 Feb 07 jari 1273         GDMElementSizeDialog dialog = new GDMElementSizeDialog(mainframe, elementSize);
2 26 Feb 07 jari 1274         if (dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 1275             Dimension size = dialog.getElementSize();
2 26 Feb 07 jari 1276             onElementSizeChanged(size.width, size.height);
2 26 Feb 07 jari 1277         }
2 26 Feb 07 jari 1278     }
2 26 Feb 07 jari 1279     
2 26 Feb 07 jari 1280     private void onDrawBordersChanged(boolean state) {
2 26 Feb 07 jari 1281         isDrawBorders = state;
2 26 Feb 07 jari 1282         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1283         repaint();
2 26 Feb 07 jari 1284     }
2 26 Feb 07 jari 1285     
2 26 Feb 07 jari 1286     private void onDrawClusterBorderChange(boolean state) {
2 26 Feb 07 jari 1287         if (numOfClusters > 0 ) {
2 26 Feb 07 jari 1288             isDrawClusterBorders = state;
2 26 Feb 07 jari 1289             geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1290             repaint();
2 26 Feb 07 jari 1291         }
2 26 Feb 07 jari 1292     }
2 26 Feb 07 jari 1293     
2 26 Feb 07 jari 1294     /**
2 26 Feb 07 jari 1295      * Sets the color pallete colors
2 26 Feb 07 jari 1296      */
2 26 Feb 07 jari 1297     private void onColorSchemeChange(int scheme){
2 26 Feb 07 jari 1298         
2 26 Feb 07 jari 1299         
2 26 Feb 07 jari 1300         if (this.colorScheme == scheme && scheme != IDisplayMenu.CUSTOM_COLOR_SCHEME) {
2 26 Feb 07 jari 1301             return;
2 26 Feb 07 jari 1302         } else {
2 26 Feb 07 jari 1303             if (scheme == IDisplayMenu.GREEN_RED_SCHEME) {
2 26 Feb 07 jari 1304                 setPosColorImage(posRedColorImage);
2 26 Feb 07 jari 1305                 this.colorScheme = scheme;
2 26 Feb 07 jari 1306             } else if (scheme == IDisplayMenu.BLUE_YELLOW_SCHEME) {
2 26 Feb 07 jari 1307                 setPosColorImage(posYellowColorImage);
2 26 Feb 07 jari 1308                 this.colorScheme = scheme;
2 26 Feb 07 jari 1309             } else {  // custom scheme request
2 26 Feb 07 jari 1310                 GDMColorSelectionDialog dialog = new GDMColorSelectionDialog((Frame)mainframe, true, getPosColorImage());
2 26 Feb 07 jari 1311                 
2 26 Feb 07 jari 1312                 if(dialog.showModal() != JOptionPane.OK_OPTION)
2 26 Feb 07 jari 1313                     return;
2 26 Feb 07 jari 1314                 setPosColorImage(dialog.getPositiveGradient());
2 26 Feb 07 jari 1315                 this.colorScheme = scheme;
2 26 Feb 07 jari 1316             }
2 26 Feb 07 jari 1317             
2 26 Feb 07 jari 1318         }
2 26 Feb 07 jari 1319         
2 26 Feb 07 jari 1320         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1321         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1322         
2 26 Feb 07 jari 1323         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1324         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1325         
2 26 Feb 07 jari 1326         repaint();
2 26 Feb 07 jari 1327     }
2 26 Feb 07 jari 1328     
2 26 Feb 07 jari 1329     private void onBorderColorChanged() {
2 26 Feb 07 jari 1330         
2 26 Feb 07 jari 1331         GDMBorderColorDialog dialog = new GDMBorderColorDialog((Frame)mainframe, true, borderColor);
2 26 Feb 07 jari 1332         if (dialog.showModal() != JOptionPane.OK_OPTION)
2 26 Feb 07 jari 1333             return;
2 26 Feb 07 jari 1334         setBorderColor(dialog.getBorderColor());
2 26 Feb 07 jari 1335         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1336         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1337         repaint();
2 26 Feb 07 jari 1338     }
2 26 Feb 07 jari 1339     
2 26 Feb 07 jari 1340     private void onColorScaleChanged() {
2 26 Feb 07 jari 1341         
2 26 Feb 07 jari 1342         BufferedImage grad = getPosColorImage();
2 26 Feb 07 jari 1343         Color lowerColor = new Color(grad.getRGB(0,0));
2 26 Feb 07 jari 1344         Color upperColor = new Color(grad.getRGB(grad.getWidth()-1, 0));
2 26 Feb 07 jari 1345         
2 26 Feb 07 jari 1346         GDMColorScaleDialog dialog = new GDMColorScaleDialog((Frame)mainframe, minValue, maxValue, geneDistMatrix, num_genes, lowerColor, upperColor);
2 26 Feb 07 jari 1347         dialog.setGDMScaleListener(new ScaleListener());
2 26 Feb 07 jari 1348         int res = dialog.showModal();
2 26 Feb 07 jari 1349         minValue = dialog.getLowerLimit();  // if reset it will return the original values.
2 26 Feb 07 jari 1350         maxValue = dialog.getUpperLimit();
2 26 Feb 07 jari 1351         geneColumnHeaderSP.setValues(minValue, maxValue);
2 26 Feb 07 jari 1352         geneRowHeaderSP.setValues(minValue, maxValue);
2 26 Feb 07 jari 1353         geneColumnHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1354         geneRowHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1355         // geneRowHeaderSP.setContentH;
2 26 Feb 07 jari 1356         
2 26 Feb 07 jari 1357         revalidate();
2 26 Feb 07 jari 1358         // geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1359         // geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1360         // repaint();
2 26 Feb 07 jari 1361     }
2 26 Feb 07 jari 1362     
2 26 Feb 07 jari 1363     private void onSortByClusterChange() {
2 26 Feb 07 jari 1364         if (numOfClusters > 0) {
2 26 Feb 07 jari 1365             isDrawClusterBorders=true;
2 26 Feb 07 jari 1366             //  drawClusterBorderItem.setState(true);
2 26 Feb 07 jari 1367             
2 26 Feb 07 jari 1368             if(this.displayEvery==1) {
2 26 Feb 07 jari 1369                 setIndices(createIndices());
2 26 Feb 07 jari 1370             } else if (this.displayEvery > 1) {
2 26 Feb 07 jari 1371                 setIndices(createIndices(this.displayEvery));
2 26 Feb 07 jari 1372             }
2 26 Feb 07 jari 1373             
2 26 Feb 07 jari 1374             geneColumnHeaderSP.setIndices(indices);
2 26 Feb 07 jari 1375             geneRowHeaderSP.setIndices(indices);
2 26 Feb 07 jari 1376             
2 26 Feb 07 jari 1377             onDataChanged(this.expData);
2 26 Feb 07 jari 1378         }
2 26 Feb 07 jari 1379     }
2 26 Feb 07 jari 1380     
2 26 Feb 07 jari 1381     private void toggleSortByGeneProximity(){
2 26 Feb 07 jari 1382         sortByGeneProximity = !sortByGeneProximity;
2 26 Feb 07 jari 1383         this.geneColumnHeaderSP.setSortByGeneProximity(sortByGeneProximity);
2 26 Feb 07 jari 1384         this.geneRowHeaderSP.setSortByGeneProximity(sortByGeneProximity);
2 26 Feb 07 jari 1385     }
2 26 Feb 07 jari 1386     
2 26 Feb 07 jari 1387     private void onSortByGeneProximity(int baseIndex) {
2 26 Feb 07 jari 1388         
2 26 Feb 07 jari 1389         this.isDrawClusterBorders = false;
2 26 Feb 07 jari 1390         
2 26 Feb 07 jari 1391         QSort qsort = new QSort(this.geneDistMatrix.A[baseIndex]);
2 26 Feb 07 jari 1392         int [] sortedIndices = qsort.getOrigIndx();
2 26 Feb 07 jari 1393         
2 26 Feb 07 jari 1394         //to handle random placement of base if sorting on NaN or have a tie
2 26 Feb 07 jari 1395         if(sortedIndices[0] != baseIndex){
2 26 Feb 07 jari 1396             boolean notFound = true;
2 26 Feb 07 jari 1397             for(int i=0; i<sortedIndices.length && notFound; i++){
2 26 Feb 07 jari 1398                 if(sortedIndices[i] == baseIndex){
2 26 Feb 07 jari 1399                     sortedIndices[i] = sortedIndices[0];
2 26 Feb 07 jari 1400                     sortedIndices[0] = baseIndex;
2 26 Feb 07 jari 1401                     notFound = false;
2 26 Feb 07 jari 1402                 }
2 26 Feb 07 jari 1403             }
2 26 Feb 07 jari 1404         }
2 26 Feb 07 jari 1405         
2 26 Feb 07 jari 1406         setIndices(sortedIndices);
2 26 Feb 07 jari 1407         
2 26 Feb 07 jari 1408         geneColumnHeaderSP.setIndices(sortedIndices);
2 26 Feb 07 jari 1409         geneRowHeaderSP.setIndices(sortedIndices);
2 26 Feb 07 jari 1410         
2 26 Feb 07 jari 1411         onDataChanged(this.expData);
2 26 Feb 07 jari 1412         validate();
2 26 Feb 07 jari 1413         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1414         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1415     }
2 26 Feb 07 jari 1416     
2 26 Feb 07 jari 1417     private void clearSortSelection(){
2 26 Feb 07 jari 1418         ButtonGroup group = new ButtonGroup();
2 26 Feb 07 jari 1419         for(int i = 0; i < sortMenu.getMenuComponentCount(); i++){
2 26 Feb 07 jari 1420             ((JRadioButtonMenuItem)(sortMenu.getMenuComponent(i))).setSelected(false);
2 26 Feb 07 jari 1421             group.add((JRadioButtonMenuItem)(sortMenu.getMenuComponent(i)));
2 26 Feb 07 jari 1422         }
2 26 Feb 07 jari 1423     }
2 26 Feb 07 jari 1424     
2 26 Feb 07 jari 1425     /**
2 26 Feb 07 jari 1426      * Invoked when a sort menu item is changed.
2 26 Feb 07 jari 1427      */
2 26 Feb 07 jari 1428     private void onSort(Action action) {
2 26 Feb 07 jari 1429         String index = (String)action.getValue(PARAMETER);
2 26 Feb 07 jari 1430         this.isDrawClusterBorders = false;
2 26 Feb 07 jari 1431         onSort(Integer.parseInt(index));
2 26 Feb 07 jari 1432     }
2 26 Feb 07 jari 1433     
2 26 Feb 07 jari 1434     /**
2 26 Feb 07 jari 1435      * Sorts the framework data.
2 26 Feb 07 jari 1436      */
2 26 Feb 07 jari 1437     private void onSort(int style) {
2 26 Feb 07 jari 1438         //set initial indices
2 26 Feb 07 jari 1439         setIndices(createIndices(this.displayEvery));
2 26 Feb 07 jari 1440         
2 26 Feb 07 jari 1441         isDrawClusterBorders=false;
2 26 Feb 07 jari 1442         if(drawClusterBorderItem != null)
2 26 Feb 07 jari 1443             drawClusterBorderItem.setState(false);
2 26 Feb 07 jari 1444         sortIndices(style);
2 26 Feb 07 jari 1445         onDataChanged(expData);
2 26 Feb 07 jari 1446     }
2 26 Feb 07 jari 1447     
2 26 Feb 07 jari 1448     private void sortIndices(int style) {
2 26 Feb 07 jari 1449         SlideDataSorter sorter = new SlideDataSorter();
2 26 Feb 07 jari 1450         sorter.setSlideData(expData.getFeature(0));
2 26 Feb 07 jari 1451         
2 26 Feb 07 jari 1452         int [] indexes = getIndices();
2 26 Feb 07 jari 1453         sorter.sort(indexes, style);
2 26 Feb 07 jari 1454         setIndices(indexes);
2 26 Feb 07 jari 1455         
2 26 Feb 07 jari 1456         geneColumnHeaderSP.setIndices(indexes);
2 26 Feb 07 jari 1457         geneRowHeaderSP.setIndices(indexes);
2 26 Feb 07 jari 1458         
2 26 Feb 07 jari 1459         geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1460         geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1461     }
2 26 Feb 07 jari 1462     
2 26 Feb 07 jari 1463     /**
2 26 Feb 07 jari 1464      * Sets the user specified label order.
2 26 Feb 07 jari 1465      */
2 26 Feb 07 jari 1466     
2 26 Feb 07 jari 1467     private void onLabelChanged(Action action){
2 26 Feb 07 jari 1468         String index = (String)action.getValue(PARAMETER);
2 26 Feb 07 jari 1469         
2 26 Feb 07 jari 1470         setLabelIndex(Integer.parseInt(index));
2 26 Feb 07 jari 1471         
2 26 Feb 07 jari 1472         geneColumnHeaderSP.setLabelIndex(label);
2 26 Feb 07 jari 1473         geneRowHeaderSP.setLabelIndex(label);
2 26 Feb 07 jari 1474         
2 26 Feb 07 jari 1475         onDataChanged(expData);
2 26 Feb 07 jari 1476         
2 26 Feb 07 jari 1477         this.geneColumnHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1478         this.geneRowHeaderSP.setPosColorImages(posColorImage);
2 26 Feb 07 jari 1479         
2 26 Feb 07 jari 1480         geneColumnHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1481         geneRowHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1482         
2 26 Feb 07 jari 1483         geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1484         geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1485         
2 26 Feb 07 jari 1486         updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1487         repaint();
2 26 Feb 07 jari 1488     }
2 26 Feb 07 jari 1489     
2 26 Feb 07 jari 1490     /**
2 26 Feb 07 jari 1491      * Sets the user specified spot size.
2 26 Feb 07 jari 1492      */
2 26 Feb 07 jari 1493     private void onAnnotationWidthChanged() {
2 26 Feb 07 jari 1494         
2 26 Feb 07 jari 1495         GDMAnnotationSizeDialog dialog = new GDMAnnotationSizeDialog(mainframe);
2 26 Feb 07 jari 1496         
2 26 Feb 07 jari 1497         if (dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 1498             int annotationSize = dialog.getAnnotationSize();
2 26 Feb 07 jari 1499             
2 26 Feb 07 jari 1500             geneColumnHeaderSP.setAnnotationSize(annotationSize);
2 26 Feb 07 jari 1501             geneRowHeaderSP.setAnnotationSize(annotationSize);
2 26 Feb 07 jari 1502             
2 26 Feb 07 jari 1503             //geneColumnHeaderSP.updateSize(annotationSize);
2 26 Feb 07 jari 1504             //geneRowHeaderSP.updateSize(annotationSize);
2 26 Feb 07 jari 1505             
2 26 Feb 07 jari 1506             geneColumnHeaderSP.setSize(geneColumnHeaderSP.getWidth(), annotationSize);
2 26 Feb 07 jari 1507             geneColumnHeaderSP.setPreferredSize(new Dimension(geneColumnHeaderSP.getWidth(), annotationSize));
2 26 Feb 07 jari 1508             
2 26 Feb 07 jari 1509             geneRowHeaderSP.setSize(annotationSize, geneRowHeaderSP.getHeight());
2 26 Feb 07 jari 1510             
2 26 Feb 07 jari 1511             geneRowHeaderSP.setPreferredSize(new Dimension(annotationSize, geneRowHeaderSP.getHeight()));
2 26 Feb 07 jari 1512             
2 26 Feb 07 jari 1513             geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1514             geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1515             
2 26 Feb 07 jari 1516             updateSize(annotationSize);
2 26 Feb 07 jari 1517             repaint();
2 26 Feb 07 jari 1518         }
2 26 Feb 07 jari 1519         
2 26 Feb 07 jari 1520     }
2 26 Feb 07 jari 1521     
2 26 Feb 07 jari 1522     private void setLabelIndex(int style) {
2 26 Feb 07 jari 1523         label = style;
2 26 Feb 07 jari 1524     }
2 26 Feb 07 jari 1525     
2 26 Feb 07 jari 1526     private void onSaveNeighbors(){
2 26 Feb 07 jari 1527         
2 26 Feb 07 jari 1528         GDMMemberSelectionDialog dialog = new GDMMemberSelectionDialog(new JFrame(), this.num_genes);
2 26 Feb 07 jari 1529         if(dialog.showModal() == JOptionPane.OK_OPTION){
2 26 Feb 07 jari 1530             int k = dialog.getK();
2 26 Feb 07 jari 1531             if(k <= 0)
2 26 Feb 07 jari 1532                 return;
2 26 Feb 07 jari 1533             if(k > num_genes)
2 26 Feb 07 jari 1534                 k = num_genes;
2 26 Feb 07 jari 1535             
2 26 Feb 07 jari 1536             int [] rows = getRows(k); //getIDataRows(k);
2 26 Feb 07 jari 1537             
2 26 Feb 07 jari 1538             //get aux. data for ENTIRE set of genes relative to the base gene., rows will extract from here
2 26 Feb 07 jari 1539             String [][] auxData = getAuxilaryData(num_genes);
2 26 Feb 07 jari 1540             String [] auxHeaders = new String[3];
2 26 Feb 07 jari 1541             auxHeaders[0] = "Scaled Dist.";
2 26 Feb 07 jari 1542             auxHeaders[1] = "Actual Dist.";
2 26 Feb 07 jari 1543             auxHeaders[2] = "Value Pairs";
2 26 Feb 07 jari 1544             
2 26 Feb 07 jari 1545             try{
2 26 Feb 07 jari 1546                 ExperimentUtil.saveGeneClusterWithAux(framework.getFrame(), this.experiment, this.expData, rows, auxHeaders, auxData);
2 26 Feb 07 jari 1547             } catch (Exception e){
2 26 Feb 07 jari 1548                 e.printStackTrace();
2 26 Feb 07 jari 1549                 JOptionPane.showMessageDialog(framework.getFrame(), "Error saving file: "+e.getMessage(), "Output Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 1550             }
2 26 Feb 07 jari 1551         }
2 26 Feb 07 jari 1552     }
2 26 Feb 07 jari 1553     
2 26 Feb 07 jari 1554     private int [] getIDataRows(int k) {
2 26 Feb 07 jari 1555         int [] rows = new int[k];
2 26 Feb 07 jari 1556         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 1557             rows[i] = experiment.getGeneIndexMappedToData(indices[i]);
2 26 Feb 07 jari 1558         }
2 26 Feb 07 jari 1559         return rows;
2 26 Feb 07 jari 1560     }
2 26 Feb 07 jari 1561
2 26 Feb 07 jari 1562     private int [] getRows(int k) {
2 26 Feb 07 jari 1563         int [] rows = new int[k];
2 26 Feb 07 jari 1564         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 1565             rows[i] = indices[i];
2 26 Feb 07 jari 1566         }
2 26 Feb 07 jari 1567         return rows;
2 26 Feb 07 jari 1568     }
2 26 Feb 07 jari 1569     
2 26 Feb 07 jari 1570     
2 26 Feb 07 jari 1571     //get aux data for the entire gene set
2 26 Feb 07 jari 1572     private String [][] getAuxilaryData(int k){
2 26 Feb 07 jari 1573         String [][] data = new String[k][3];
2 26 Feb 07 jari 1574         FloatMatrix matrix = this.experiment.getMatrix();
2 26 Feb 07 jari 1575         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 1576             data[i][0] = Float.toString(this.geneDistMatrix.get(indices[0], i));
2 26 Feb 07 jari 1577             data[i][1] = Float.toString(this.rawMatrix.get(indices[0], i));
2 26 Feb 07 jari 1578             data[i][2] = getValuePairCount(matrix, indices[0], i);
2 26 Feb 07 jari 1579         }
2 26 Feb 07 jari 1580         return data;
2 26 Feb 07 jari 1581     }
2 26 Feb 07 jari 1582     
2 26 Feb 07 jari 1583     private String getValuePairCount(FloatMatrix matrix, int row, int col){
2 26 Feb 07 jari 1584         int cols = matrix.getColumnDimension();
2 26 Feb 07 jari 1585         int count = 0;
2 26 Feb 07 jari 1586         for(int i = 0; i < cols; i++){
2 26 Feb 07 jari 1587             if(!Float.isNaN(matrix.get(row, i)) && !Float.isNaN(matrix.get(col, i)))
2 26 Feb 07 jari 1588                 count++;
2 26 Feb 07 jari 1589         }
2 26 Feb 07 jari 1590         return Integer.toString(count);
2 26 Feb 07 jari 1591     }
2 26 Feb 07 jari 1592     
2 26 Feb 07 jari 1593     private void imposeClusterOrder() {
2 26 Feb 07 jari 1594         
2 26 Feb 07 jari 1595         Hashtable results = getResultHash();
2 26 Feb 07 jari 1596         boolean noUseableResult = false;
2 26 Feb 07 jari 1597         
2 26 Feb 07 jari 1598         Hashtable goodResults = new Hashtable();
2 26 Feb 07 jari 1599         
2 26 Feb 07 jari 1600         Enumeration keys = results.keys();
2 26 Feb 07 jari 1601         String key = "";
2 26 Feb 07 jari 1602         Object [] result;
2 26 Feb 07 jari 1603         
2 26 Feb 07 jari 1604         while(keys.hasMoreElements()){
2 26 Feb 07 jari 1605             key = (String)keys.nextElement();
2 26 Feb 07 jari 1606             result = (Object [])(results.get(key));
2 26 Feb 07 jari 1607             
2 26 Feb 07 jari 1608             //need to handle HCL differently since it can be a gene or an experiemnt order
2 26 Feb 07 jari 1609             if(key.indexOf("HCL") != -1) {
2 26 Feb 07 jari 1610                 int [][] clusters = new int[1][];
2 26 Feb 07 jari 1611                 clusters[0] = ((int[][])result[1])[0];
2 26 Feb 07 jari 1612                 
2 26 Feb 07 jari 1613                 if(clusters[0] == null)
2 26 Feb 07 jari 1614                     continue;
2 26 Feb 07 jari 1615                 
2 26 Feb 07 jari 1616                 if((this.experiment == result[0]) && checkClustersSize(clusters)) {
2 26 Feb 07 jari 1617                     goodResults.put(key, clusters);
2 26 Feb 07 jari 1618                 }             
2 26 Feb 07 jari 1619             }
2 26 Feb 07 jari 1620             
2 26 Feb 07 jari 1621             //make sure it's the same experiment (same cutoffs), same number of genes (not exp. cluster)
2 26 Feb 07 jari 1622             else if((this.experiment == result[0]) && checkClustersSize((int[][])result[1]) ) {
2 26 Feb 07 jari 1623                 goodResults.put(key, result[1]);
2 26 Feb 07 jari 1624             }
2 26 Feb 07 jari 1625         }
2 26 Feb 07 jari 1626         
2 26 Feb 07 jari 1627         if(goodResults.size() > 0) {
2 26 Feb 07 jari 1628             GDMResultSelectionDialog dialog = new GDMResultSelectionDialog((JFrame)framework.getFrame(), goodResults.keys());
2 26 Feb 07 jari 1629             if( dialog.showModal() == JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 1630                 int [][] clusters = ((int [][])goodResults.get(dialog.getSelectedResult()));
2 26 Feb 07 jari 1631                 imposeClusterOrder(clusters);
2 26 Feb 07 jari 1632             }
2 26 Feb 07 jari 1633         } else {
2 26 Feb 07 jari 1634             JOptionPane.showMessageDialog(framework.getFrame(), "There are currently no appropriate clustering results to apply to this GDM.", "No Results Available", JOptionPane.INFORMATION_MESSAGE);
2 26 Feb 07 jari 1635         }
2 26 Feb 07 jari 1636     }
2 26 Feb 07 jari 1637     
2 26 Feb 07 jari 1638     private boolean checkClustersSize(int [][] clusters) {
2 26 Feb 07 jari 1639         int cnt = 0;
2 26 Feb 07 jari 1640         for(int i = 0; i < clusters.length; i++) {
2 26 Feb 07 jari 1641             cnt += clusters[i].length;
2 26 Feb 07 jari 1642         }
2 26 Feb 07 jari 1643         
2 26 Feb 07 jari 1644         if( ((int)(cnt/displayEvery)) == this.num_genes)
2 26 Feb 07 jari 1645             return true;
2 26 Feb 07 jari 1646         return false;
2 26 Feb 07 jari 1647     }
2 26 Feb 07 jari 1648     
2 26 Feb 07 jari 1649     
2 26 Feb 07 jari 1650     
2 26 Feb 07 jari 1651     public Hashtable getResultHash(){
2 26 Feb 07 jari 1652         Hashtable table = new Hashtable();
2 26 Feb 07 jari 1653         DefaultMutableTreeNode analysisNode = framework.getResultTree().getAnalysisNode();
2 26 Feb 07 jari 1654         DefaultMutableTreeNode analysisRoot;
2 26 Feb 07 jari 1655         DefaultMutableTreeNode currentNode;
2 26 Feb 07 jari 1656         Object object;
2 26 Feb 07 jari 1657         Object [] vals;
2 26 Feb 07 jari 1658         boolean stop = false;
2 26 Feb 07 jari 1659         
2 26 Feb 07 jari 1660         IViewer viewer;
2 26 Feb 07 jari 1661         Experiment exp;
2 26 Feb 07 jari 1662         int [][] clusters;
2 26 Feb 07 jari 1663         
2 26 Feb 07 jari 1664         int childCount = analysisNode.getChildCount();
2 26 Feb 07 jari 1665         //String algTitles = new String[analysisNode.getChildCount()];
2 26 Feb 07 jari 1666         String algName = "";
2 26 Feb 07 jari 1667         Enumeration _enum;
2 26 Feb 07 jari 1668         
2 26 Feb 07 jari 1669         for(int i = 0; i < childCount; i++){
2 26 Feb 07 jari 1670             analysisRoot = ((DefaultMutableTreeNode)(analysisNode.getChildAt(i)));
2 26 Feb 07 jari 1671             object = analysisRoot.getUserObject();
2 26 Feb 07 jari 1672             if(object != null){
2 26 Feb 07 jari 1673                 if(object instanceof LeafInfo){
2 26 Feb 07 jari 1674                     algName = ((LeafInfo)object).toString();
2 26 Feb 07 jari 1675                 } else if(object instanceof String) {
2 26 Feb 07 jari 1676                     algName = (String)object;
2 26 Feb 07 jari 1677                 }
2 26 Feb 07 jari 1678                 
2 26 Feb 07 jari 1679                 _enum = analysisRoot.depthFirstEnumeration();
2 26 Feb 07 jari 1680                 while (!stop && _enum.hasMoreElements()){
2 26 Feb 07 jari 1681                     currentNode = (DefaultMutableTreeNode)_enum.nextElement();
2 26 Feb 07 jari 1682                     if(currentNode.getUserObject() instanceof LeafInfo){
2 26 Feb 07 jari 1683                         viewer = ((LeafInfo)currentNode.getUserObject()).getViewer();
2 26 Feb 07 jari 1684                         if(viewer != null) {
2 26 Feb 07 jari 1685                             exp = viewer.getExperiment();
2 26 Feb 07 jari 1686                             clusters = viewer.getClusters();
2 26 Feb 07 jari 1687                             if(exp != null && clusters != null) {
2 26 Feb 07 jari 1688                                 vals = new Object[2];
2 26 Feb 07 jari 1689                                 vals[0] = exp;
2 26 Feb 07 jari 1690                                 vals[1] = clusters;
2 26 Feb 07 jari 1691                                 table.put(algName, vals);
2 26 Feb 07 jari 1692                                 stop = true;
2 26 Feb 07 jari 1693                             }
2 26 Feb 07 jari 1694                         }
2 26 Feb 07 jari 1695                     }
2 26 Feb 07 jari 1696                 }
2 26 Feb 07 jari 1697                 stop = false;
2 26 Feb 07 jari 1698             }
2 26 Feb 07 jari 1699         }
2 26 Feb 07 jari 1700         return table;
2 26 Feb 07 jari 1701     }
2 26 Feb 07 jari 1702     
2 26 Feb 07 jari 1703     
2 26 Feb 07 jari 1704     private void imposeClusterOrder(int [][] newClusters) {
2 26 Feb 07 jari 1705         this.clusters = newClusters;
2 26 Feb 07 jari 1706         this.numOfClusters = clusters.length;
2 26 Feb 07 jari 1707         onSortByClusterChange();
2 26 Feb 07 jari 1708     }
2 26 Feb 07 jari 1709     
2 26 Feb 07 jari 1710     
2 26 Feb 07 jari 1711     
2 26 Feb 07 jari 1712     
2 26 Feb 07 jari 1713     /**
2 26 Feb 07 jari 1714      * The listener to listen to mouse, keyboard and window events.
2 26 Feb 07 jari 1715      */
2 26 Feb 07 jari 1716     
2 26 Feb 07 jari 1717     private class Listener extends MouseAdapter implements ActionListener, MouseMotionListener, KeyListener, WindowListener {
2 26 Feb 07 jari 1718         
2 26 Feb 07 jari 1719         private int oldRow = -1;
2 26 Feb 07 jari 1720         private int oldColumn = -1;
2 26 Feb 07 jari 1721         private String oldStatusText;
2 26 Feb 07 jari 1722         
2 26 Feb 07 jari 1723         public void actionPerformed(ActionEvent event) {
2 26 Feb 07 jari 1724             String command = event.getActionCommand();
2 26 Feb 07 jari 1725             
2 26 Feb 07 jari 1726             if(command.equals(DISPLAY_LABEL_CMD)) {
2 26 Feb 07 jari 1727                 onLabelChanged((Action)event.getSource());
2 26 Feb 07 jari 1728             } else if (command.equals(ANNOTATION_WIDTH_CMD)) {
2 26 Feb 07 jari 1729                 onAnnotationWidthChanged();
2 26 Feb 07 jari 1730             } else if (command.equals(DISPLAY_2X2_CMD)) {
2 26 Feb 07 jari 1731                 onElementSizeChanged(2, 2);
2 26 Feb 07 jari 1732             } else if (command.equals(DISPLAY_5X5_CMD)) {
2 26 Feb 07 jari 1733                 onElementSizeChanged(5, 5);
2 26 Feb 07 jari 1734             } else if (command.equals(DISPLAY_10X10_CMD)) {
2 26 Feb 07 jari 1735                 onElementSizeChanged(10, 10);
2 26 Feb 07 jari 1736             } else if (command.equals(DISPLAY_15X15_CMD)) {
2 26 Feb 07 jari 1737                 onElementSizeChanged(15, 15);
2 26 Feb 07 jari 1738             } else if (command.equals(DISPLAY_OTHER_CMD)) {
2 26 Feb 07 jari 1739                 onElementSizeChanged();
2 26 Feb 07 jari 1740             } else if (command.equals(GREEN_RED_COLOR_SCHEME_CMD)){
2 26 Feb 07 jari 1741                 onColorSchemeChange(IDisplayMenu.GREEN_RED_SCHEME);
2 26 Feb 07 jari 1742             } else if (command.equals(BLUE_YELLOW_COLOR_SCHEME_CMD)){
2 26 Feb 07 jari 1743                 onColorSchemeChange(IDisplayMenu.BLUE_YELLOW_SCHEME);
2 26 Feb 07 jari 1744             } else if (command.equals(CUSTOM_COLOR_SCHEME_CMD)){
2 26 Feb 07 jari 1745                 onColorSchemeChange(IDisplayMenu.CUSTOM_COLOR_SCHEME);
2 26 Feb 07 jari 1746             } else if (command.equals(DISPLAY_DRAW_BORDERS_CMD)) {
2 26 Feb 07 jari 1747                 onDrawBordersChanged(((javax.swing.JCheckBoxMenuItem)(event.getSource())).isSelected());
2 26 Feb 07 jari 1748             } else if (command.equals(BORDER_COLOR_CMD)) {
2 26 Feb 07 jari 1749                 onBorderColorChanged();
2 26 Feb 07 jari 1750             } else if (command.equals(COLOR_SCALE_CMD)) {
2 26 Feb 07 jari 1751                 onColorScaleChanged();
2 26 Feb 07 jari 1752             } else if (command.equals(SORT_BY_LOCATION_CMD)) {
2 26 Feb 07 jari 1753                 onSort(SlideDataSorter.SORT_BY_LOCATION);
2 26 Feb 07 jari 1754             } else if (command.equals(SORT_BY_RATIO_CMD)) {
2 26 Feb 07 jari 1755                 onSort(SlideDataSorter.SORT_BY_RATIO);
2 26 Feb 07 jari 1756             } else if (command.equals(SORT_LABEL_CMD)) {
2 26 Feb 07 jari 1757                 onSort((Action)event.getSource());
2 26 Feb 07 jari 1758             } else if (command.equals(SORT_BY_CLUSTER_ORDER_CMD)) {
2 26 Feb 07 jari 1759                 onSortByClusterChange();
2 26 Feb 07 jari 1760             } else if (command.equals(SORT_BY_GENE_PROXIMITY_CMD)) {
2 26 Feb 07 jari 1761                 onSortByGeneProximity(event.getID());
2 26 Feb 07 jari 1762             } else if (command.equals(TOGGLE_PROXIMITY_SORT_CMD)) {
2 26 Feb 07 jari 1763                 toggleSortByGeneProximity();
2 26 Feb 07 jari 1764             } else if (command.equals(SET_CLUSTER_BORDER_CMD)) {
2 26 Feb 07 jari 1765                 onDrawClusterBorderChange(((javax.swing.JCheckBoxMenuItem)(event.getSource())).isSelected());
2 26 Feb 07 jari 1766             } else if (command.equals(SAVE_NEIGHBORS_CMD)){
2 26 Feb 07 jari 1767                 onSaveNeighbors();
2 26 Feb 07 jari 1768             } else if (command.equals("impose-cluster-order")) {
2 26 Feb 07 jari 1769                 imposeClusterOrder();
2 26 Feb 07 jari 1770             }
2 26 Feb 07 jari 1771         }
2 26 Feb 07 jari 1772         
2 26 Feb 07 jari 1773         
2 26 Feb 07 jari 1774         public void mousePressed(MouseEvent event) {
2 26 Feb 07 jari 1775             requestFocus();
2 26 Feb 07 jari 1776         }
2 26 Feb 07 jari 1777         
2 26 Feb 07 jari 1778         public void mouseClicked(MouseEvent event) {
2 26 Feb 07 jari 1779             if (SwingUtilities.isLeftMouseButton(event)) {
2 26 Feb 07 jari 1780                 int column = findColumn(event.getX());
2 26 Feb 07 jari 1781                 int row = findRow(event.getY());
2 26 Feb 07 jari 1782                 
2 26 Feb 07 jari 1783                 if (!isLegalPosition(row, column)) {
2 26 Feb 07 jari 1784                     return;
2 26 Feb 07 jari 1785                 }
2 26 Feb 07 jari 1786                 
2 26 Feb 07 jari 1787                 displayGDMSpotInfo(indices[column], indices[row], column, row);
2 26 Feb 07 jari 1788             }
2 26 Feb 07 jari 1789             else {
2 26 Feb 07 jari 1790                 int column = findColumn(event.getX());
2 26 Feb 07 jari 1791                 int row = findRow(event.getY());
2 26 Feb 07 jari 1792                 
2 26 Feb 07 jari 1793                 popup.show(event.getComponent(), event.getX(), event.getY());
2 26 Feb 07 jari 1794             }
2 26 Feb 07 jari 1795         }
2 26 Feb 07 jari 1796         
2 26 Feb 07 jari 1797         public void mouseMoved(MouseEvent event) {
2 26 Feb 07 jari 1798             if (num_genes == 0 || event.isShiftDown())
2 26 Feb 07 jari 1799                 return;
2 26 Feb 07 jari 1800             int column = findColumn(event.getX());
2 26 Feb 07 jari 1801             int row = findRow(event.getY());
2 26 Feb 07 jari 1802             if (isCurrentPosition(row, column)) {
2 26 Feb 07 jari 1803                 return;
2 26 Feb 07 jari 1804             }
2 26 Feb 07 jari 1805             Graphics g = null;
2 26 Feb 07 jari 1806             Graphics2D g2D = (Graphics2D) g;
2 26 Feb 07 jari 1807             if (isLegalPosition(row, column)) {
2 26 Feb 07 jari 1808                 g = getGraphics();
2 26 Feb 07 jari 1809                 drawColoredBoxAt(g, row, column, Color.white);
2 26 Feb 07 jari 1810                 framework.setStatusText(
2 26 Feb 07 jari 1811                 " Column: " + (column+1) +
2 26 Feb 07 jari 1812                 "     " +  //some padding
2 26 Feb 07 jari 1813                 " Row: " + (row+1) +
2 26 Feb 07 jari 1814                 "     " +  //some padding
2 26 Feb 07 jari 1815                 " Scaled Distance: "    + geneDistMatrix.get(indices[column], indices[row]) +
2 26 Feb 07 jari 1816                 "     " +  //some padding
2 26 Feb 07 jari 1817                 " Actual Distance: " + rawMatrix.get(indices[column], indices[row]));
2 26 Feb 07 jari 1818             } else {
2 26 Feb 07 jari 1819                 framework.setStatusText(oldStatusText);
2 26 Feb 07 jari 1820             }
2 26 Feb 07 jari 1821             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 1822                 g2D = g != null ? (Graphics2D)g : (Graphics2D)getGraphics();
2 26 Feb 07 jari 1823                 drawSlideDataElement(g2D, oldRow, oldColumn);
2 26 Feb 07 jari 1824             }
2 26 Feb 07 jari 1825             setOldPosition(row, column);
2 26 Feb 07 jari 1826             
2 26 Feb 07 jari 1827             if(g != null) {
2 26 Feb 07 jari 1828                 if(isDrawClusterBorders && numOfClusters > 0)
2 26 Feb 07 jari 1829                     drawClusterBorder((Graphics2D)g);
2 26 Feb 07 jari 1830             } else if (g2D != null) {
2 26 Feb 07 jari 1831                 if(isDrawClusterBorders && numOfClusters > 0)
2 26 Feb 07 jari 1832                     drawClusterBorder(g2D);
2 26 Feb 07 jari 1833             }
2 26 Feb 07 jari 1834             
2 26 Feb 07 jari 1835             if (g != null) {
2 26 Feb 07 jari 1836                 g.dispose();
2 26 Feb 07 jari 1837             }
2 26 Feb 07 jari 1838         }
2 26 Feb 07 jari 1839         
2 26 Feb 07 jari 1840         public void mouseExited(MouseEvent event) {
2 26 Feb 07 jari 1841             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 1842                 Graphics g = getGraphics();
2 26 Feb 07 jari 1843                 Graphics2D g2D = (Graphics2D)g;
2 26 Feb 07 jari 1844                 drawSlideDataElement(g2D, oldRow, oldColumn);
2 26 Feb 07 jari 1845                 g2D.dispose();
2 26 Feb 07 jari 1846                 if(isDrawClusterBorders && numOfClusters > 0)
2 26 Feb 07 jari 1847                     drawClusterBorder(g2D);
2 26 Feb 07 jari 1848             }
2 26 Feb 07 jari 1849             
2 26 Feb 07 jari 1850             setOldPosition(-1, -1);
2 26 Feb 07 jari 1851             framework.setStatusText("  ");  // blank Status bar
2 26 Feb 07 jari 1852         }
2 26 Feb 07 jari 1853         
2 26 Feb 07 jari 1854         public void mouseEntered(MouseEvent event) {
2 26 Feb 07 jari 1855             oldStatusText = framework.getStatusText();
2 26 Feb 07 jari 1856         }
2 26 Feb 07 jari 1857         
2 26 Feb 07 jari 1858         private void setOldPosition(int row, int column) {
2 26 Feb 07 jari 1859             oldColumn = column;
2 26 Feb 07 jari 1860             oldRow = row;
2 26 Feb 07 jari 1861         }
2 26 Feb 07 jari 1862         
2 26 Feb 07 jari 1863         private boolean isCurrentPosition(int row, int column) {
2 26 Feb 07 jari 1864             return(row == oldRow && column == oldColumn);
2 26 Feb 07 jari 1865         }
2 26 Feb 07 jari 1866         
2 26 Feb 07 jari 1867         public void mouseDragged(MouseEvent event) {}
2 26 Feb 07 jari 1868         public void keyReleased(KeyEvent event) {}
2 26 Feb 07 jari 1869         public void keyPressed(KeyEvent e) {}
2 26 Feb 07 jari 1870         public void keyTyped(KeyEvent e) {}
2 26 Feb 07 jari 1871         public void windowClosing(WindowEvent e) {}
2 26 Feb 07 jari 1872         public void windowOpened(WindowEvent e) {}
2 26 Feb 07 jari 1873         public void windowClosed(WindowEvent e) {}
2 26 Feb 07 jari 1874         public void windowIconified(WindowEvent e) {}
2 26 Feb 07 jari 1875         public void windowDeiconified(WindowEvent e) {}
2 26 Feb 07 jari 1876         public void windowActivated(WindowEvent e) {}
2 26 Feb 07 jari 1877         public void windowDeactivated(WindowEvent e) {}
2 26 Feb 07 jari 1878     }
2 26 Feb 07 jari 1879     
2 26 Feb 07 jari 1880     private class ScaleListener extends GDMScaleListener{
2 26 Feb 07 jari 1881         
2 26 Feb 07 jari 1882         public void scaleChanged(float lower, float upper) {
2 26 Feb 07 jari 1883             minValue = lower;
2 26 Feb 07 jari 1884             maxValue = upper;
2 26 Feb 07 jari 1885             geneColumnHeaderSP.setValues(minValue, maxValue);
2 26 Feb 07 jari 1886             geneRowHeaderSP.setValues(minValue, maxValue);
2 26 Feb 07 jari 1887             geneColumnHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1888             geneRowHeaderSP.updateSize(NOT_UPDATE_ANNOTATION_SIZE);
2 26 Feb 07 jari 1889             geneColumnHeaderSP.validate();
2 26 Feb 07 jari 1890             geneRowHeaderSP.validate();
2 26 Feb 07 jari 1891             validate();
2 26 Feb 07 jari 1892             geneColumnHeaderSP.repaint();
2 26 Feb 07 jari 1893             geneRowHeaderSP.repaint();
2 26 Feb 07 jari 1894             repaint();
2 26 Feb 07 jari 1895         }
2 26 Feb 07 jari 1896     }
2 26 Feb 07 jari 1897     
2 26 Feb 07 jari 1898     /**
2 26 Feb 07 jari 1899      * returns true if a probe in the current viewer has color
2 26 Feb 07 jari 1900      */
2 26 Feb 07 jari 1901     protected  boolean areProbesColored() {
2 26 Feb 07 jari 1902         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 1903             if( this.expData.getProbeColor(indices[i]) != null){
2 26 Feb 07 jari 1904                 return true;
2 26 Feb 07 jari 1905             }
2 26 Feb 07 jari 1906         }
2 26 Feb 07 jari 1907         return false;
2 26 Feb 07 jari 1908     }
2 26 Feb 07 jari 1909     
2 26 Feb 07 jari 1910     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 1911      * posibly null
2 26 Feb 07 jari 1912      */
2 26 Feb 07 jari 1913     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 1914         if(cornerIndex == IViewer.UPPER_RIGHT_CORNER)
2 26 Feb 07 jari 1915             return this.upperRightCornerSB;
2 26 Feb 07 jari 1916         else if(cornerIndex == IViewer.LOWER_LEFT_CORNER)
2 26 Feb 07 jari 1917             return this.lowerLeftCornerSB;
2 26 Feb 07 jari 1918         return null;
2 26 Feb 07 jari 1919     }
2 26 Feb 07 jari 1920     
2 26 Feb 07 jari 1921     public int[][] getClusters() {
2 26 Feb 07 jari 1922         return null;
2 26 Feb 07 jari 1923     }
2 26 Feb 07 jari 1924     
2 26 Feb 07 jari 1925     public Experiment getExperiment() {
2 26 Feb 07 jari 1926         return experiment;
2 26 Feb 07 jari 1927     }
2 26 Feb 07 jari 1928     
2 26 Feb 07 jari 1929     /** Returns int value indicating viewer type
2 26 Feb 07 jari 1930      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 1931      */
2 26 Feb 07 jari 1932     public int getViewerType() {
2 26 Feb 07 jari 1933         return Cluster.GENE_CLUSTER;
2 26 Feb 07 jari 1934     }
2 26 Feb 07 jari 1935     
2 26 Feb 07 jari 1936     private class DefaultAction extends AbstractAction {
2 26 Feb 07 jari 1937         
2 26 Feb 07 jari 1938         /**
2 26 Feb 07 jari 1939          * Constructs <code>DefaultAction</code> with a specified name
2 26 Feb 07 jari 1940          * and an action command.
2 26 Feb 07 jari 1941          */
2 26 Feb 07 jari 1942         public DefaultAction(String name, String command) {
2 26 Feb 07 jari 1943             this(name, command, null);
2 26 Feb 07 jari 1944         }
2 26 Feb 07 jari 1945         
2 26 Feb 07 jari 1946         /**
2 26 Feb 07 jari 1947          * Constructs <code>DefaultAction</code> with a specified name,
2 26 Feb 07 jari 1948          * an action command and a small icon.
2 26 Feb 07 jari 1949          */
2 26 Feb 07 jari 1950         public DefaultAction(String name, String command, ImageIcon smallIcon) {
2 26 Feb 07 jari 1951             putValue(Action.NAME, name);
2 26 Feb 07 jari 1952             putValue(Action.SHORT_DESCRIPTION, name);
2 26 Feb 07 jari 1953             putValue(Action.ACTION_COMMAND_KEY, command);
2 26 Feb 07 jari 1954             putValue(Action.SMALL_ICON, smallIcon);
2 26 Feb 07 jari 1955         }
2 26 Feb 07 jari 1956         
2 26 Feb 07 jari 1957         /**
2 26 Feb 07 jari 1958          * Delegates this invokation to a wrapped action manager.
2 26 Feb 07 jari 1959          */
2 26 Feb 07 jari 1960         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 1961             listener.actionPerformed(new ActionEvent(this, e.getID(), (String)getValue(Action.ACTION_COMMAND_KEY)));
2 26 Feb 07 jari 1962         }
2 26 Feb 07 jari 1963     }
2 26 Feb 07 jari 1964
2 26 Feb 07 jari 1965
2 26 Feb 07 jari 1966
2 26 Feb 07 jari 1967   /* (non-Javadoc)
2 26 Feb 07 jari 1968    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExperimentID()
2 26 Feb 07 jari 1969    */
2 26 Feb 07 jari 1970   public int getExperimentID() {
2 26 Feb 07 jari 1971     return 0;
2 26 Feb 07 jari 1972   }
2 26 Feb 07 jari 1973
2 26 Feb 07 jari 1974   /* (non-Javadoc)
2 26 Feb 07 jari 1975    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperimentID(int)
2 26 Feb 07 jari 1976    */
2 26 Feb 07 jari 1977   public void setExperimentID(int id) {
2 26 Feb 07 jari 1978     ;
2 26 Feb 07 jari 1979   }
2 26 Feb 07 jari 1980
2 26 Feb 07 jari 1981
2 26 Feb 07 jari 1982 }