mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/pca/PCA2DViewer.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2005, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * PCA2DViewer.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on October 25, 2004, 2:41 PM
2 26 Feb 07 jari 9  */
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 package org.tigr.microarray.mev.cluster.gui.impl.pca;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.BasicStroke;
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.Component;
2 26 Feb 07 jari 16 import java.awt.FontMetrics;
2 26 Feb 07 jari 17 import java.awt.Frame;
2 26 Feb 07 jari 18 import java.awt.Graphics;
2 26 Feb 07 jari 19 import java.awt.Graphics2D;
2 26 Feb 07 jari 20 import java.awt.Rectangle;
2 26 Feb 07 jari 21 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 22 import java.awt.event.ActionListener;
2 26 Feb 07 jari 23 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 24 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 25 import java.awt.geom.Ellipse2D;
2 26 Feb 07 jari 26 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 27 import java.beans.Expression;
2 26 Feb 07 jari 28 import java.text.DecimalFormat;
2 26 Feb 07 jari 29 import java.util.Vector;
2 26 Feb 07 jari 30
2 26 Feb 07 jari 31 import javax.swing.JCheckBoxMenuItem;
2 26 Feb 07 jari 32 import javax.swing.JComponent;
2 26 Feb 07 jari 33 import javax.swing.JMenuItem;
2 26 Feb 07 jari 34 import javax.swing.JOptionPane;
2 26 Feb 07 jari 35 import javax.swing.JPanel;
2 26 Feb 07 jari 36 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 37 import javax.swing.event.MouseInputAdapter;
2 26 Feb 07 jari 38 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.clusterUtil.Cluster;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentUtil;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 49 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51 /**
2 26 Feb 07 jari 52  *
2 26 Feb 07 jari 53  * @author  nbhagaba
2 26 Feb 07 jari 54  */
2 26 Feb 07 jari 55 public class PCA2DViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 56     
2 26 Feb 07 jari 57     private static final String SAVE_CMD    = "save-cmd";
2 26 Feb 07 jari 58     private static final String SHOW_TEXT_CMD = "show-text-cmd";
2 26 Feb 07 jari 59     private static final String SHOW_TICK_LABELS_CMD = "show-tick-labels-cmd";
2 26 Feb 07 jari 60     private static final String STORE_CLUSTER_CMD = "store-cluster-cmd";
2 26 Feb 07 jari 61     private static final String LAUNCH_NEW_SESSION_CMD = "launch-new-session-cmd";  
2 26 Feb 07 jari 62     private static final String DISPLAY_EXPT_NAMES_CMD = "display-expt-names-cmd";
2 26 Feb 07 jari 63     private static final String SHOW_LARGER_POINTS_CMD = "show-larger-points-cmd";
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     private float[] yArray, xArray;     
2 26 Feb 07 jari 66     //int originX, originY;
2 26 Feb 07 jari 67     private int axis1, axis2;  
2 26 Feb 07 jari 68     private FloatMatrix UMatrix;
2 26 Feb 07 jari 69     private Experiment experiment; 
2 26 Feb 07 jari 70     private IFramework framework;
2 26 Feb 07 jari 71     private Frame frame;
2 26 Feb 07 jari 72     private IData data; 
2 26 Feb 07 jari 73     private JPopupMenu popup; 
2 26 Feb 07 jari 74     private Ellipse2D.Double ellipse;
2 26 Feb 07 jari 75     private boolean displayExptNames, showLargePoints, geneViewer, showTickLabels;
2 26 Feb 07 jari 76     Rectangle currentRect = null;
2 26 Feb 07 jari 77     Rectangle rectToDraw = null;
2 26 Feb 07 jari 78     Rectangle previousRectDrawn = new Rectangle();    
2 26 Feb 07 jari 79     private int exptID = 0;
2 26 Feb 07 jari 80     
2 26 Feb 07 jari 81     /** Creates a new instance of PCA2DViewer */
2 26 Feb 07 jari 82     public PCA2DViewer(Experiment experiment, float[] xArray, float[] yArray, boolean geneViewer, int axis1, int axis2) {
2 26 Feb 07 jari 83        this.yArray = yArray;
2 26 Feb 07 jari 84         this.xArray = xArray;
2 26 Feb 07 jari 85         this.displayExptNames = false;
2 26 Feb 07 jari 86         this.showLargePoints = false;
2 26 Feb 07 jari 87         this.showTickLabels = true;
2 26 Feb 07 jari 88         this.geneViewer = geneViewer;
2 26 Feb 07 jari 89         this.axis1 = axis1;
2 26 Feb 07 jari 90         this.axis2 = axis2;
2 26 Feb 07 jari 91         this.experiment = experiment;
2 26 Feb 07 jari 92         this.exptID = experiment.getId();
2 26 Feb 07 jari 93         this.ellipse = new Ellipse2D.Double();
2 26 Feb 07 jari 94         this.setBackground(Color.white);   
2 26 Feb 07 jari 95         
2 26 Feb 07 jari 96         popup = createJPopupMenu();        
2 26 Feb 07 jari 97         
2 26 Feb 07 jari 98         GraphListener graphListener = new GraphListener();
2 26 Feb 07 jari 99         addMouseListener(graphListener);
2 26 Feb 07 jari 100         addMouseMotionListener(graphListener);      
2 26 Feb 07 jari 101     }
2 26 Feb 07 jari 102     
2 26 Feb 07 jari 103     /** Creates a new instance of PCA2DViewer */
2 26 Feb 07 jari 104     public PCA2DViewer(Experiment experiment, FloatMatrix UMatrix, boolean geneViewer, int axis1, int axis2) {
2 26 Feb 07 jari 105         this.UMatrix = UMatrix;
2 26 Feb 07 jari 106         this.axis1 = axis1;
2 26 Feb 07 jari 107         this.axis2 = axis2;        
2 26 Feb 07 jari 108         this.xArray = getFloatArray(UMatrix, axis1);
2 26 Feb 07 jari 109         this.yArray = getFloatArray(UMatrix, axis2);
2 26 Feb 07 jari 110         this.displayExptNames = false;
2 26 Feb 07 jari 111         this.showLargePoints = false;
2 26 Feb 07 jari 112         this.showTickLabels = true;
2 26 Feb 07 jari 113         this.geneViewer = geneViewer;
2 26 Feb 07 jari 114         this.experiment = experiment;
2 26 Feb 07 jari 115         this.exptID = experiment.getId();
2 26 Feb 07 jari 116         this.ellipse = new Ellipse2D.Double();
2 26 Feb 07 jari 117         this.setBackground(Color.white); 
2 26 Feb 07 jari 118         
2 26 Feb 07 jari 119         popup = createJPopupMenu();
2 26 Feb 07 jari 120         
2 26 Feb 07 jari 121         GraphListener graphListener = new GraphListener();
2 26 Feb 07 jari 122         addMouseListener(graphListener);
2 26 Feb 07 jari 123         addMouseMotionListener(graphListener);        
2 26 Feb 07 jari 124     }    
2 26 Feb 07 jari 125     /** Creates a new instance of PCA2DViewer */
2 26 Feb 07 jari 126     public PCA2DViewer(Experiment e, FloatMatrix UMatrix, Boolean geneViewer, Integer axis1, Integer axis2) {
2 26 Feb 07 jari 127       this.UMatrix = UMatrix;
2 26 Feb 07 jari 128         this.axis1 = axis1.intValue();
2 26 Feb 07 jari 129         this.axis2 = axis2.intValue();
2 26 Feb 07 jari 130         this.xArray = getFloatArray(UMatrix, this.axis1);
2 26 Feb 07 jari 131         this.yArray = getFloatArray(UMatrix, this.axis2);
2 26 Feb 07 jari 132         this.displayExptNames = false;
2 26 Feb 07 jari 133         this.showLargePoints = false;
2 26 Feb 07 jari 134         this.showTickLabels = true;
2 26 Feb 07 jari 135         this.geneViewer = geneViewer.booleanValue();
2 26 Feb 07 jari 136         this.ellipse = new Ellipse2D.Double();
2 26 Feb 07 jari 137         this.setBackground(Color.white); 
2 26 Feb 07 jari 138     
2 26 Feb 07 jari 139         popup = createJPopupMenu();
2 26 Feb 07 jari 140     
2 26 Feb 07 jari 141         GraphListener graphListener = new GraphListener();
2 26 Feb 07 jari 142         addMouseListener(graphListener);
2 26 Feb 07 jari 143         addMouseMotionListener(graphListener);  
2 26 Feb 07 jari 144         setExperiment(e);
2 26 Feb 07 jari 145     }     
2 26 Feb 07 jari 146     /**
2 26 Feb 07 jari 147      * @inheritDoc
2 26 Feb 07 jari 148      */
2 26 Feb 07 jari 149     public Expression getExpression(){
2 26 Feb 07 jari 150       return new Expression(this, this.getClass(), "new", 
2 26 Feb 07 jari 151           new Object[]{this.experiment, UMatrix, new Boolean(geneViewer), new Integer(axis1), new Integer(axis2)});
2 26 Feb 07 jari 152     }
2 26 Feb 07 jari 153    
2 26 Feb 07 jari 154     
2 26 Feb 07 jari 155    private float[] getFloatArray(FloatMatrix matrix, int column) {
2 26 Feb 07 jari 156        float[] array = new float[matrix.getRowDimension()];
2 26 Feb 07 jari 157        for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 158            array[i] = matrix.A[i][column];
2 26 Feb 07 jari 159        }
2 26 Feb 07 jari 160        return array;
2 26 Feb 07 jari 161    }    
2 26 Feb 07 jari 162     
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     public void paint(Graphics g) {
2 26 Feb 07 jari 165         super.paint(g);
2 26 Feb 07 jari 166         Graphics2D g2D = (Graphics2D)g;
2 26 Feb 07 jari 167         int panelWidth = this.getWidth();
2 26 Feb 07 jari 168         int panelHeight = this.getHeight();
2 26 Feb 07 jari 169         int originX = (int)Math.round((double)(this.getWidth()/2));
2 26 Feb 07 jari 170         int originY = (int)Math.round((double)(this.getHeight()/2));
2 26 Feb 07 jari 171         double origMaxXValue = getMax(xArray);
2 26 Feb 07 jari 172         double origMaxYValue = getMax(yArray);
2 26 Feb 07 jari 173         double origMinXValue = getMin(xArray);
2 26 Feb 07 jari 174         double origMinYValue = getMin(yArray);
2 26 Feb 07 jari 175         
2 26 Feb 07 jari 176         double xScalingFactor = getXScalingFactor(origMaxXValue, origMinXValue); // relative to originX and originY
2 26 Feb 07 jari 177         double yScalingFactor = getYScalingFactor(origMaxYValue, origMinYValue); // relative to originX and originY   
2 26 Feb 07 jari 178         
2 26 Feb 07 jari 179         //draw axes
2 26 Feb 07 jari 180         g2D.setStroke(new BasicStroke(2.0f));
2 26 Feb 07 jari 181         g2D.drawLine(0, (int)Math.round((double)(this.getHeight()/2)), this.getWidth(), (int)Math.round((double)(this.getHeight()/2)));
2 26 Feb 07 jari 182         g2D.drawLine((int)Math.round((double)(this.getWidth()/2)), 0, (int)Math.round((double)(this.getWidth()/2)), this.getHeight());  
2 26 Feb 07 jari 183         
2 26 Feb 07 jari 184         double[] xIntervalArray = new double[6];
2 26 Feb 07 jari 185         double[] yIntervalArray = new double[6];
2 26 Feb 07 jari 186         
2 26 Feb 07 jari 187         double xIncrement = 0.0d;
2 26 Feb 07 jari 188         double yIncrement = 0.0d;
2 26 Feb 07 jari 189         
2 26 Feb 07 jari 190         if (Math.abs(origMaxXValue) > Math.abs(origMinXValue)) {
2 26 Feb 07 jari 191             xIncrement = Math.abs((double)(origMaxXValue/5.0d));
2 26 Feb 07 jari 192         } else {
2 26 Feb 07 jari 193             xIncrement = Math.abs((double)(origMinXValue/5.0d));
2 26 Feb 07 jari 194         }
2 26 Feb 07 jari 195         
2 26 Feb 07 jari 196         if (Math.abs(origMaxYValue) > Math.abs(origMinYValue)) {
2 26 Feb 07 jari 197             yIncrement = Math.abs((double)(origMaxYValue/5.0d));
2 26 Feb 07 jari 198         } else {
2 26 Feb 07 jari 199             yIncrement = Math.abs((double)(origMinYValue/5.0d));
2 26 Feb 07 jari 200         }    
2 26 Feb 07 jari 201         
2 26 Feb 07 jari 202         double xCounter = 0.0d;
2 26 Feb 07 jari 203         double yCounter = 0.0d;
2 26 Feb 07 jari 204         for (int i = 0; i < xIntervalArray.length; i++) {
2 26 Feb 07 jari 205             xIntervalArray[i] = xCounter;
2 26 Feb 07 jari 206             xCounter = xCounter + xIncrement;
2 26 Feb 07 jari 207             yIntervalArray[i] = yCounter;
2 26 Feb 07 jari 208             yCounter = yCounter + yIncrement;
2 26 Feb 07 jari 209         }
2 26 Feb 07 jari 210         
2 26 Feb 07 jari 211         if (this.showTickLabels) {
2 26 Feb 07 jari 212             //draw x tick marks
2 26 Feb 07 jari 213             
2 26 Feb 07 jari 214             for (int i = 1; i < xIntervalArray.length; i++) {
2 26 Feb 07 jari 215                 g2D.drawLine((int)Math.round(xIntervalArray[i]*xScalingFactor) +this.getWidth()/2, this.getHeight()/2 - 5, (int)Math.round(xIntervalArray[i]*xScalingFactor) +this.getWidth()/2, this.getHeight()/2 + 5);
2 26 Feb 07 jari 216             }
2 26 Feb 07 jari 217             
2 26 Feb 07 jari 218             for (int i = 1; i < xIntervalArray.length; i++) {
2 26 Feb 07 jari 219                 g2D.drawLine(this.getWidth()/2 - (int)Math.round(xIntervalArray[i]*xScalingFactor), this.getHeight()/2 - 5, this.getWidth()/2 - (int)Math.round(xIntervalArray[i]*xScalingFactor), this.getHeight()/2 + 5);
2 26 Feb 07 jari 220             }
2 26 Feb 07 jari 221             
2 26 Feb 07 jari 222             //draw y tick marks
2 26 Feb 07 jari 223             for (int i = 1; i < yIntervalArray.length; i++) {
2 26 Feb 07 jari 224                 g2D.drawLine(this.getWidth()/2 - 5, this.getHeight()/2 + (int)Math.round(yIntervalArray[i]*yScalingFactor), this.getWidth()/2 + 5, this.getHeight()/2 + (int)Math.round(yIntervalArray[i]*yScalingFactor));
2 26 Feb 07 jari 225             }
2 26 Feb 07 jari 226             
2 26 Feb 07 jari 227             for (int i = 1; i < yIntervalArray.length; i++) {
2 26 Feb 07 jari 228                 g2D.drawLine(this.getWidth()/2 - 5, this.getHeight()/2 - (int)Math.round(yIntervalArray[i]*yScalingFactor), this.getWidth()/2 + 5, this.getHeight()/2 - (int)Math.round(yIntervalArray[i]*yScalingFactor));
2 26 Feb 07 jari 229             }
2 26 Feb 07 jari 230             
2 26 Feb 07 jari 231             g2D.setStroke(new BasicStroke(2.0f));
2 26 Feb 07 jari 232             g2D.setColor(Color.black);
2 26 Feb 07 jari 233             
2 26 Feb 07 jari 234             DecimalFormat nf = new DecimalFormat();
2 26 Feb 07 jari 235             nf.setMaximumFractionDigits(2);
2 26 Feb 07 jari 236             
2 26 Feb 07 jari 237             //tick labels
2 26 Feb 07 jari 238             for (int i = 1; i < xIntervalArray.length; i++) {
2 26 Feb 07 jari 239                 double stringWidth = (g2D.getFontMetrics()).stringWidth(nf.format(xIntervalArray[i]));
2 26 Feb 07 jari 240                 g2D.drawString(nf.format((double)xIntervalArray[i]), (int)Math.round(xIntervalArray[i]*xScalingFactor) +this.getWidth()/2 - (int)Math.round(0.5d*stringWidth), this.getHeight()/2 + 20);
2 26 Feb 07 jari 241             }
2 26 Feb 07 jari 242             
2 26 Feb 07 jari 243             for (int i = 1; i < xIntervalArray.length; i++) {
2 26 Feb 07 jari 244                 double stringWidth = (g2D.getFontMetrics()).stringWidth("-" + nf.format(xIntervalArray[i]));
2 26 Feb 07 jari 245                 g2D.drawString("-" + nf.format((double)xIntervalArray[i]), this.getWidth()/2 - (int)Math.round(xIntervalArray[i]*xScalingFactor) - (int)Math.round(0.5d*stringWidth), this.getHeight()/2 + 20);
2 26 Feb 07 jari 246             }
2 26 Feb 07 jari 247             
2 26 Feb 07 jari 248             for (int i = 1; i < yIntervalArray.length; i++) {
2 26 Feb 07 jari 249                 //double stringWidth = (g2D.getFontMetrics()).stringWidth(nf.format(yIntervalArray[i]));
2 26 Feb 07 jari 250                 g2D.drawString(nf.format((double)yIntervalArray[i]), this.getWidth()/2 + 10, this.getHeight()/2 - (int)Math.round(yIntervalArray[i]*yScalingFactor) );
2 26 Feb 07 jari 251             }
2 26 Feb 07 jari 252             
2 26 Feb 07 jari 253             for (int i = 1; i < yIntervalArray.length; i++) {
2 26 Feb 07 jari 254                 g2D.drawString("-" + nf.format((double)yIntervalArray[i]), this.getWidth()/2 + 10, this.getHeight()/2 + (int)Math.round(yIntervalArray[i]*yScalingFactor) );
2 26 Feb 07 jari 255             }
2 26 Feb 07 jari 256         }
2 26 Feb 07 jari 257         
2 26 Feb 07 jari 258         //Color[] pointColor = new Color[xArray.length];
2 26 Feb 07 jari 259         
2 26 Feb 07 jari 260         //if ((geneOrExpt == COAGUI.GENES) || (geneOrExpt == COAGUI.EXPTS)) {
2 26 Feb 07 jari 261             /*
2 26 Feb 07 jari 262             for (int i = 0; i < pointColor.length; i++) {
2 26 Feb 07 jari 263                 pointColor[i] = Color.black; //just for now, will add cluster colors later
2 26 Feb 07 jari 264             }
2 26 Feb 07 jari 265              */
2 26 Feb 07 jari 266             //draw data points
2 26 Feb 07 jari 267             for (int i = 0; i < xArray.length; i++) {
2 26 Feb 07 jari 268                 Color currPointColor = Color.black;
2 26 Feb 07 jari 269                 if (this.geneViewer) {
2 26 Feb 07 jari 270                   this.experiment.toString();
2 26 Feb 07 jari 271                     currPointColor = this.data.getProbeColor(this.experiment.getGeneIndexMappedToData(i));
2 26 Feb 07 jari 272                     if (currPointColor == null) currPointColor = Color.black;
2 26 Feb 07 jari 273                 } else {
2 26 Feb 07 jari 274                     currPointColor = this.data.getExperimentColor(i);
2 26 Feb 07 jari 275                     if (currPointColor == null) currPointColor = Color.black;
2 26 Feb 07 jari 276                 }
2 26 Feb 07 jari 277                 g2D.setColor(currPointColor);
2 26 Feb 07 jari 278                 if (showLargePoints) {
2 26 Feb 07 jari 279                     drawRectPoint(g2D, xArray[i], yArray[i], getXScalingFactor(origMaxXValue, origMinXValue), getYScalingFactor(origMaxYValue, origMinYValue), 8);
2 26 Feb 07 jari 280                 } else {
2 26 Feb 07 jari 281                     drawPoint(g2D, xArray[i], yArray[i], getXScalingFactor(origMaxXValue, origMinXValue), getYScalingFactor(origMaxYValue, origMinYValue), 5);
2 26 Feb 07 jari 282                 }
2 26 Feb 07 jari 283                 g2D.setColor(Color.black);
2 26 Feb 07 jari 284                 //g2D.drawOval((midX + expectedXArray[i]),
2 26 Feb 07 jari 285             }
2 26 Feb 07 jari 286             g2D.drawString( "X axis = " + (axis1 + 1) + ", Y axis = " + (axis2 + 1), this.getWidth()/2 + 25, this.getHeight() - 25);
2 26 Feb 07 jari 287             
2 26 Feb 07 jari 288         //} 
2 26 Feb 07 jari 289         
2 26 Feb 07 jari 290         // display expt names
2 26 Feb 07 jari 291         
2 26 Feb 07 jari 292         if (!this.geneViewer) {
2 26 Feb 07 jari 293             if (this.displayExptNames) {
2 26 Feb 07 jari 294                 FontMetrics fmet = g2D.getFontMetrics(g2D.getFont());
2 26 Feb 07 jari 295                 double ascent = (double)(fmet.getAscent());
2 26 Feb 07 jari 296                 double advance = (double)(fmet.getMaxAdvance());
2 26 Feb 07 jari 297                 for (int i = 0; i < xArray.length; i++) {
2 26 Feb 07 jari 298                     double currCoords[] = getCoords(xArray[i], yArray[i]);
2 26 Feb 07 jari 299                     String currName = data.getSampleName(i);
2 26 Feb 07 jari 300                     double stringWidth = (double)(fmet.stringWidth(currName));
2 26 Feb 07 jari 301                     if ((currCoords[0] + 0.5d*advance + stringWidth) > (double)(this.getWidth())) {
2 26 Feb 07 jari 302                         g2D.drawString(currName, (float)(currCoords[0] - stringWidth - 0.25d*advance), (float)(currCoords[1] + 0.5d*ascent));
2 26 Feb 07 jari 303                     }
2 26 Feb 07 jari 304                     else {
2 26 Feb 07 jari 305                         g2D.drawString(currName, (float)(currCoords[0] + 0.5d*advance), (float)(currCoords[1] + 0.5d*ascent));
2 26 Feb 07 jari 306                     }                    
2 26 Feb 07 jari 307                     //g2D.drawString(currName, (float)(currCoords[0] + 0.5d*advance), (float)(currCoords[1] + 0.5d*ascent));
2 26 Feb 07 jari 308                 }
2 26 Feb 07 jari 309             }
2 26 Feb 07 jari 310         }        
2 26 Feb 07 jari 311         
2 26 Feb 07 jari 312         if (currentRect != null) {
2 26 Feb 07 jari 313             g2D.setXORMode(Color.white);//Color of line varies
2 26 Feb 07 jari 314                                            //depending on image colors
2 26 Feb 07 jari 315             g2D.draw(ellipse);
2 26 Feb 07 jari 316         }
2 26 Feb 07 jari 317     }
2 26 Feb 07 jari 318     
2 26 Feb 07 jari 319     private void drawPoint(Graphics2D g2D, double xValue, double yValue, double xScale, double yScale, int diameter) {
2 26 Feb 07 jari 320         int xRaw = (int)Math.round(xValue*xScale);
2 26 Feb 07 jari 321         int yRaw = (int)Math.round(yValue*yScale);
2 26 Feb 07 jari 322         //System.out.println("xValue = " + xValue + " , yValue = " + yValue + ", xRaw = " + xRaw + ", yRaw  = " + yRaw);
2 26 Feb 07 jari 323         
2 26 Feb 07 jari 324         int xCoord = (int)Math.round((double)(this.getWidth()/2)) + xRaw;
2 26 Feb 07 jari 325         int yCoord = (int)Math.round((double)(this.getHeight()/2)) - yRaw;
2 26 Feb 07 jari 326         
2 26 Feb 07 jari 327         g2D.fillOval(xCoord, yCoord, diameter, diameter);   
2 26 Feb 07 jari 328     } 
2 26 Feb 07 jari 329     
2 26 Feb 07 jari 330     private void drawRectPoint(Graphics2D g2D, double xValue, double yValue, double xScale, double yScale, int dim) {
2 26 Feb 07 jari 331         int xRaw = (int)Math.round(xValue*xScale);
2 26 Feb 07 jari 332         int yRaw = (int)Math.round(yValue*yScale);
2 26 Feb 07 jari 333         //System.out.println("xValue = " + xValue + " , yValue = " + yValue + ", xRaw = " + xRaw + ", yRaw  = " + yRaw);
2 26 Feb 07 jari 334         
2 26 Feb 07 jari 335         int xCoord = (int)Math.round((double)(this.getWidth()/2)) + xRaw;
2 26 Feb 07 jari 336         int yCoord = (int)Math.round((double)(this.getHeight()/2)) - yRaw;
2 26 Feb 07 jari 337         
2 26 Feb 07 jari 338         g2D.fillRect(xCoord, yCoord, dim, dim);
2 26 Feb 07 jari 339     }
2 26 Feb 07 jari 340     
2 26 Feb 07 jari 341     private double getMax(float[] array) {
2 26 Feb 07 jari 342         float max = Float.NEGATIVE_INFINITY;
2 26 Feb 07 jari 343         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 344             if (max < array[i]) {
2 26 Feb 07 jari 345                 max = array[i];
2 26 Feb 07 jari 346             }
2 26 Feb 07 jari 347         }
2 26 Feb 07 jari 348         return (double)max;
2 26 Feb 07 jari 349     }
2 26 Feb 07 jari 350     
2 26 Feb 07 jari 351     private double getMin(float[] array) {
2 26 Feb 07 jari 352         float min = Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 353         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 354             if (min > array[i]) {
2 26 Feb 07 jari 355                 min = array[i];
2 26 Feb 07 jari 356             }
2 26 Feb 07 jari 357         }
2 26 Feb 07 jari 358         return (double)min;
2 26 Feb 07 jari 359     }    
2 26 Feb 07 jari 360     
2 26 Feb 07 jari 361     private double getXScalingFactor(double maxValue, double minValue) {
2 26 Feb 07 jari 362         double largest = 1;
2 26 Feb 07 jari 363         if ((maxValue > 0)&&(minValue > 0)) {
2 26 Feb 07 jari 364             largest = maxValue;
2 26 Feb 07 jari 365         } else if ((maxValue > 0)&&(minValue < 0)) {
2 26 Feb 07 jari 366             if (maxValue > Math.abs(minValue)) {
2 26 Feb 07 jari 367                 largest = maxValue;
2 26 Feb 07 jari 368             } else {
2 26 Feb 07 jari 369                 largest = Math.abs(minValue);
2 26 Feb 07 jari 370             }
2 26 Feb 07 jari 371         } else if (maxValue <= 0) {
2 26 Feb 07 jari 372             largest = Math.abs(minValue);
2 26 Feb 07 jari 373         } else if (minValue == 0) {
2 26 Feb 07 jari 374             largest = maxValue;
2 26 Feb 07 jari 375         }
2 26 Feb 07 jari 376         
2 26 Feb 07 jari 377         double scalingFactor =0;
2 26 Feb 07 jari 378         scalingFactor = (this.getWidth()/2 - 50)/largest;       
2 26 Feb 07 jari 379         return scalingFactor;
2 26 Feb 07 jari 380     }   
2 26 Feb 07 jari 381     
2 26 Feb 07 jari 382     private double getYScalingFactor(double maxValue, double minValue) {
2 26 Feb 07 jari 383         double largest = 1;
2 26 Feb 07 jari 384         if ((maxValue > 0)&&(minValue > 0)) {
2 26 Feb 07 jari 385             largest = maxValue;
2 26 Feb 07 jari 386         } else if ((maxValue > 0)&&(minValue < 0)) {
2 26 Feb 07 jari 387             if (maxValue > Math.abs(minValue)) {
2 26 Feb 07 jari 388                 largest = maxValue;
2 26 Feb 07 jari 389             } else {
2 26 Feb 07 jari 390                 largest = Math.abs(minValue);
2 26 Feb 07 jari 391             }
2 26 Feb 07 jari 392         } else if (maxValue <= 0) {
2 26 Feb 07 jari 393             largest = Math.abs(minValue);
2 26 Feb 07 jari 394         } else if (minValue == 0) {
2 26 Feb 07 jari 395             largest = maxValue;
2 26 Feb 07 jari 396         }
2 26 Feb 07 jari 397         
2 26 Feb 07 jari 398         double scalingFactor = 0;
2 26 Feb 07 jari 399         scalingFactor = (this.getHeight()/2 - 50)/largest;
2 26 Feb 07 jari 400         return scalingFactor;
2 26 Feb 07 jari 401     }    
2 26 Feb 07 jari 402     
2 26 Feb 07 jari 403     /** Returns the viewer's clusters or null
2 26 Feb 07 jari 404      */
2 26 Feb 07 jari 405     public int[][] getClusters() {
2 26 Feb 07 jari 406         return null;
2 26 Feb 07 jari 407     }
2 26 Feb 07 jari 408     
2 26 Feb 07 jari 409     public int[] getSelectedPoints() {
2 26 Feb 07 jari 410         Vector selPointsVector = new Vector();
2 26 Feb 07 jari 411         for (int i = 0; i < UMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 412             double[] currCoords = getCoords(xArray[i], yArray[i]);
2 26 Feb 07 jari 413             if (ellipse.contains(currCoords[0], currCoords[1])) {
2 26 Feb 07 jari 414                 if (this.geneViewer) {
2 26 Feb 07 jari 415                     selPointsVector.add(new Integer(experiment.getGeneIndexMappedToData(i)));
2 26 Feb 07 jari 416                 } else {
2 26 Feb 07 jari 417                     selPointsVector.add(new Integer(experiment.getSampleIndex(i)));
2 26 Feb 07 jari 418                 }
2 26 Feb 07 jari 419             }
2 26 Feb 07 jari 420         }
2 26 Feb 07 jari 421         
2 26 Feb 07 jari 422         int[] selPoints = new int[selPointsVector.size()];
2 26 Feb 07 jari 423         for (int i = 0; i < selPoints.length; i++) {
2 26 Feb 07 jari 424             selPoints[i] = ((Integer)(selPointsVector.get(i))).intValue();
2 26 Feb 07 jari 425         }
2 26 Feb 07 jari 426         
2 26 Feb 07 jari 427         return selPoints;
2 26 Feb 07 jari 428     }    
2 26 Feb 07 jari 429     
2 26 Feb 07 jari 430     private double[] getCoords(double xValue, double yValue) {
2 26 Feb 07 jari 431         double origMaxXValue = getMax(xArray);
2 26 Feb 07 jari 432         double origMaxYValue = getMax(yArray);
2 26 Feb 07 jari 433         double origMinXValue = getMin(xArray);
2 26 Feb 07 jari 434         double origMinYValue = getMin(yArray);
2 26 Feb 07 jari 435         
2 26 Feb 07 jari 436         double xScalingFactor = getXScalingFactor(origMaxXValue, origMinXValue); // relative to originX and originY
2 26 Feb 07 jari 437         double yScalingFactor = getYScalingFactor(origMaxYValue, origMinYValue); // relative to originX and originY  
2 26 Feb 07 jari 438         
2 26 Feb 07 jari 439         double xRaw = Math.round(xValue*xScalingFactor);
2 26 Feb 07 jari 440         double yRaw= Math.round(yValue*yScalingFactor);
2 26 Feb 07 jari 441         
2 26 Feb 07 jari 442         double xCoord = Math.round((double)(this.getWidth()/2)) + xRaw;
2 26 Feb 07 jari 443         double yCoord = Math.round((double)(this.getHeight()/2)) - yRaw;      
2 26 Feb 07 jari 444         
2 26 Feb 07 jari 445        double[] coords = {xCoord, yCoord};
2 26 Feb 07 jari 446        return coords;
2 26 Feb 07 jari 447     }
2 26 Feb 07 jari 448     
2 26 Feb 07 jari 449     /** Returns a component to be inserted into scroll pane view port.
2 26 Feb 07 jari 450      */
2 26 Feb 07 jari 451     public JComponent getContentComponent() {
2 26 Feb 07 jari 452         return this;
2 26 Feb 07 jari 453     }
2 26 Feb 07 jari 454     
2 26 Feb 07 jari 455     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 456      * posibly null
2 26 Feb 07 jari 457      */
2 26 Feb 07 jari 458     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 459         return null;
2 26 Feb 07 jari 460     }
2 26 Feb 07 jari 461     
2 26 Feb 07 jari 462     /**  Returns the viewer's experiment or null
2 26 Feb 07 jari 463      */
2 26 Feb 07 jari 464     public Experiment getExperiment() {
2 26 Feb 07 jari 465         return experiment;
2 26 Feb 07 jari 466     }
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     /** Returns a component to be inserted into scroll pane header.
2 26 Feb 07 jari 469      */
2 26 Feb 07 jari 470     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 471         return null;
2 26 Feb 07 jari 472     }
2 26 Feb 07 jari 473     
2 26 Feb 07 jari 474     /** Invoked by the framework to save or to print viewer image.
2 26 Feb 07 jari 475      */
2 26 Feb 07 jari 476     public BufferedImage getImage() {
2 26 Feb 07 jari 477         return null;
2 26 Feb 07 jari 478     }
2 26 Feb 07 jari 479     
2 26 Feb 07 jari 480     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 481      */
2 26 Feb 07 jari 482     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 483         return null;
2 26 Feb 07 jari 484     }
2 26 Feb 07 jari 485     
2 26 Feb 07 jari 486     /** Invoked when the framework is going to be closed.
2 26 Feb 07 jari 487      */
2 26 Feb 07 jari 488     public void onClosed() {
2 26 Feb 07 jari 489     }
2 26 Feb 07 jari 490     
2 26 Feb 07 jari 491     /** Invoked by the framework when data is changed,
2 26 Feb 07 jari 492      * if this viewer is selected.
2 26 Feb 07 jari 493      * @see IData
2 26 Feb 07 jari 494      */
2 26 Feb 07 jari 495     public void onDataChanged(IData data) {
2 26 Feb 07 jari 496         setData(data);        
2 26 Feb 07 jari 497     }
2 26 Feb 07 jari 498     
2 26 Feb 07 jari 499     /** Invoked by the framework when this viewer was deselected.
2 26 Feb 07 jari 500      */
2 26 Feb 07 jari 501     public void onDeselected() {
2 26 Feb 07 jari 502     }
2 26 Feb 07 jari 503     
2 26 Feb 07 jari 504     /** Invoked by the framework when display menu is changed,
2 26 Feb 07 jari 505      * if this viewer is selected.
2 26 Feb 07 jari 506      * @see IDisplayMenu
2 26 Feb 07 jari 507      */
2 26 Feb 07 jari 508     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 509     }
2 26 Feb 07 jari 510     
2 26 Feb 07 jari 511     /** Invoked by the framework when this viewer is selected.
2 26 Feb 07 jari 512      */
2 26 Feb 07 jari 513     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 514         this.framework = framework;
2 26 Feb 07 jari 515         this.frame = framework.getFrame();
2 26 Feb 07 jari 516         setData(framework.getData());   
2 26 Feb 07 jari 517         
2 26 Feb 07 jari 518         //In case it is viewed after serialization
2 26 Feb 07 jari 519         if(popup == null){
2 26 Feb 07 jari 520             popup = createJPopupMenu(); 
2 26 Feb 07 jari 521             DefaultMutableTreeNode node = framework.getCurrentNode();
2 26 Feb 07 jari 522             if(node != null){
2 26 Feb 07 jari 523                 if(node.getUserObject() instanceof LeafInfo){
2 26 Feb 07 jari 524                     LeafInfo leafInfo = (LeafInfo) node.getUserObject();
2 26 Feb 07 jari 525                     leafInfo.setPopupMenu(this.popup);
2 26 Feb 07 jari 526                 }
2 26 Feb 07 jari 527             }
2 26 Feb 07 jari 528         }         
2 26 Feb 07 jari 529     }
2 26 Feb 07 jari 530     
2 26 Feb 07 jari 531     public void setData(IData data) {
2 26 Feb 07 jari 532         this.data = data;
2 26 Feb 07 jari 533     }    
2 26 Feb 07 jari 534     
2 26 Feb 07 jari 535     private class GraphListener extends MouseInputAdapter {
2 26 Feb 07 jari 536        
2 26 Feb 07 jari 537         public void mousePressed(MouseEvent e) {
2 26 Feb 07 jari 538             int x = e.getX();
2 26 Feb 07 jari 539             int y = e.getY();
2 26 Feb 07 jari 540             currentRect = new Rectangle(x, y, 0, 0);
2 26 Feb 07 jari 541             updateDrawableRect(getWidth(), getHeight());
2 26 Feb 07 jari 542             repaint();
2 26 Feb 07 jari 543             onShowSelection();
2 26 Feb 07 jari 544         }
2 26 Feb 07 jari 545         
2 26 Feb 07 jari 546         public void mouseDragged(MouseEvent e) {                        
2 26 Feb 07 jari 547             updateSize(e);
2 26 Feb 07 jari 548         }   
2 26 Feb 07 jari 549         
2 26 Feb 07 jari 550         public void mouseReleased(MouseEvent e) {                       
2 26 Feb 07 jari 551             updateSize(e);
2 26 Feb 07 jari 552         }
2 26 Feb 07 jari 553         
2 26 Feb 07 jari 554         void updateSize(MouseEvent e) {
2 26 Feb 07 jari 555             int x = e.getX();
2 26 Feb 07 jari 556             int y = e.getY();
2 26 Feb 07 jari 557             currentRect.setSize(x - currentRect.x,
2 26 Feb 07 jari 558             y - currentRect.y);
2 26 Feb 07 jari 559             updateDrawableRect(getWidth(), getHeight());
2 26 Feb 07 jari 560             Rectangle totalRepaint = rectToDraw.union(previousRectDrawn); 
2 26 Feb 07 jari 561             ellipse.setFrame(totalRepaint.getX(), totalRepaint.getY(), totalRepaint.getWidth(), totalRepaint.getHeight());
2 26 Feb 07 jari 562             PCA2DViewer.this.repaint();
2 26 Feb 07 jari 563             onShowSelection();
2 26 Feb 07 jari 564             //repaint(totalRepaint.x, totalRepaint.y,
2 26 Feb 07 jari 565             //totalRepaint.width, totalRepaint.height);
2 26 Feb 07 jari 566         }   
2 26 Feb 07 jari 567         
2 26 Feb 07 jari 568         private void updateDrawableRect(int compWidth, int compHeight) {
2 26 Feb 07 jari 569             int x = currentRect.x;
2 26 Feb 07 jari 570             int y = currentRect.y;
2 26 Feb 07 jari 571             int width = currentRect.width;
2 26 Feb 07 jari 572             int height = currentRect.height;
2 26 Feb 07 jari 573     
2 26 Feb 07 jari 574             //Make the width and height positive, if necessary.
2 26 Feb 07 jari 575             if (width < 0) {
2 26 Feb 07 jari 576                 width = 0 - width;
2 26 Feb 07 jari 577                 x = x - width + 1; 
2 26 Feb 07 jari 578                 if (x < 0) {
2 26 Feb 07 jari 579                     width += x; 
2 26 Feb 07 jari 580                     x = 0;
2 26 Feb 07 jari 581                 }
2 26 Feb 07 jari 582             }
2 26 Feb 07 jari 583             if (height < 0) {
2 26 Feb 07 jari 584                 height = 0 - height;
2 26 Feb 07 jari 585                 y = y - height + 1; 
2 26 Feb 07 jari 586                 if (y < 0) {
2 26 Feb 07 jari 587                     height += y; 
2 26 Feb 07 jari 588                     y = 0;
2 26 Feb 07 jari 589                 }
2 26 Feb 07 jari 590             }
2 26 Feb 07 jari 591     
2 26 Feb 07 jari 592             //The rectangle shouldn't extend past the drawing area.
2 26 Feb 07 jari 593             if ((x + width) > compWidth) {
2 26 Feb 07 jari 594                 width = compWidth - x;
2 26 Feb 07 jari 595             }
2 26 Feb 07 jari 596             if ((y + height) > compHeight) {
2 26 Feb 07 jari 597                 height = compHeight - y;
2 26 Feb 07 jari 598             }
2 26 Feb 07 jari 599           
2 26 Feb 07 jari 600             //Update rectToDraw after saving old value.
2 26 Feb 07 jari 601             if (rectToDraw != null) {
2 26 Feb 07 jari 602                 previousRectDrawn.setBounds(
2 26 Feb 07 jari 603                             rectToDraw.x, rectToDraw.y, 
2 26 Feb 07 jari 604                             rectToDraw.width, rectToDraw.height);
2 26 Feb 07 jari 605                 rectToDraw.setBounds(x, y, width, height);
2 26 Feb 07 jari 606             } else {
2 26 Feb 07 jari 607                 rectToDraw = new Rectangle(x, y, width, height);
2 26 Feb 07 jari 608             }
2 26 Feb 07 jari 609         }        
2 26 Feb 07 jari 610         
2 26 Feb 07 jari 611     }
2 26 Feb 07 jari 612     
2 26 Feb 07 jari 613     
2 26 Feb 07 jari 614     /**
2 26 Feb 07 jari 615      * Returns the viewer popup menu.
2 26 Feb 07 jari 616      */
2 26 Feb 07 jari 617     public JPopupMenu getJPopupMenu() {
2 26 Feb 07 jari 618         return popup;
2 26 Feb 07 jari 619     }
2 26 Feb 07 jari 620     
2 26 Feb 07 jari 621     /**
2 26 Feb 07 jari 622      * Creates the viewer popup menu.
2 26 Feb 07 jari 623      */
2 26 Feb 07 jari 624     private JPopupMenu createJPopupMenu() {
2 26 Feb 07 jari 625         JPopupMenu popup = new JPopupMenu();
2 26 Feb 07 jari 626         addMenuItems(popup);
2 26 Feb 07 jari 627         return popup;
2 26 Feb 07 jari 628     }  
2 26 Feb 07 jari 629     
2 26 Feb 07 jari 630    
2 26 Feb 07 jari 631     /**
2 26 Feb 07 jari 632      * Adds the viewer specific menu items.
2 26 Feb 07 jari 633      */
2 26 Feb 07 jari 634     private void addMenuItems(JPopupMenu menu) {
2 26 Feb 07 jari 635         Listener listener = new Listener();
2 26 Feb 07 jari 636         JMenuItem menuItem;
2 26 Feb 07 jari 637         
2 26 Feb 07 jari 638         menuItem = new JMenuItem("Store cluster...", GUIFactory.getIcon("new16.gif"));
2 26 Feb 07 jari 639         menuItem.setEnabled(false);
2 26 Feb 07 jari 640         menuItem.setActionCommand(STORE_CLUSTER_CMD);
2 26 Feb 07 jari 641         menuItem.addActionListener(listener);
2 26 Feb 07 jari 642         menu.add(menuItem);
2 26 Feb 07 jari 643         
2 26 Feb 07 jari 644         menuItem = new JMenuItem("Launch new session", GUIFactory.getIcon("launch_new_mav.gif"));
2 26 Feb 07 jari 645         menuItem.setEnabled(false);
2 26 Feb 07 jari 646         menuItem.setActionCommand(LAUNCH_NEW_SESSION_CMD);
2 26 Feb 07 jari 647         menuItem.addActionListener(listener);
2 26 Feb 07 jari 648         menu.add(menuItem);
2 26 Feb 07 jari 649         
2 26 Feb 07 jari 650         menuItem = new JMenuItem("Save cluster...", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 651         menuItem.setEnabled(false);
2 26 Feb 07 jari 652         menuItem.setActionCommand(SAVE_CMD);
2 26 Feb 07 jari 653         menuItem.addActionListener(listener);
2 26 Feb 07 jari 654         menu.add(menuItem);
2 26 Feb 07 jari 655         //menu.addSeparator();
2 26 Feb 07 jari 656            
2 26 Feb 07 jari 657         if (!this.geneViewer) {
2 26 Feb 07 jari 658             menu.addSeparator();
2 26 Feb 07 jari 659             menuItem = new JCheckBoxMenuItem("Show sample names");
2 26 Feb 07 jari 660             menuItem.setEnabled(true);
2 26 Feb 07 jari 661             menuItem.setActionCommand(DISPLAY_EXPT_NAMES_CMD);
2 26 Feb 07 jari 662             menuItem.addActionListener(listener);
2 26 Feb 07 jari 663             menu.add(menuItem);          
2 26 Feb 07 jari 664         }        
2 26 Feb 07 jari 665         
2 26 Feb 07 jari 666         menuItem = new JCheckBoxMenuItem("Larger point size");
2 26 Feb 07 jari 667         menuItem.setEnabled(true);
2 26 Feb 07 jari 668         menuItem.setActionCommand(SHOW_LARGER_POINTS_CMD);
2 26 Feb 07 jari 669         menuItem.addActionListener(listener);
2 26 Feb 07 jari 670         menu.add(menuItem);           
2 26 Feb 07 jari 671         
2 26 Feb 07 jari 672         menuItem = new JCheckBoxMenuItem("Show tick marks and labels");
2 26 Feb 07 jari 673         menuItem.setEnabled(true);
2 26 Feb 07 jari 674         menuItem.setSelected(true);
2 26 Feb 07 jari 675         menuItem.setActionCommand(SHOW_TICK_LABELS_CMD);
2 26 Feb 07 jari 676         menuItem.addActionListener(listener);
2 26 Feb 07 jari 677         menu.add(menuItem);        
2 26 Feb 07 jari 678         
2 26 Feb 07 jari 679     }   
2 26 Feb 07 jari 680     
2 26 Feb 07 jari 681     /**
2 26 Feb 07 jari 682      * Returns a menu item by specified action command.
2 26 Feb 07 jari 683      */
2 26 Feb 07 jari 684     private JMenuItem getJMenuItem(String command) {
2 26 Feb 07 jari 685         JMenuItem item;
2 26 Feb 07 jari 686         Component[] components = popup.getComponents();
2 26 Feb 07 jari 687         for (int i=0; i<components.length; i++) {
2 26 Feb 07 jari 688             if (components[i] instanceof JMenuItem) {
2 26 Feb 07 jari 689                 if (((JMenuItem)components[i]).getActionCommand().equals(command))
2 26 Feb 07 jari 690                     return(JMenuItem)components[i];
2 26 Feb 07 jari 691             }
2 26 Feb 07 jari 692         }
2 26 Feb 07 jari 693         return null;
2 26 Feb 07 jari 694     }    
2 26 Feb 07 jari 695     
2 26 Feb 07 jari 696     /**
2 26 Feb 07 jari 697      * Sets a menu item state.
2 26 Feb 07 jari 698      */
2 26 Feb 07 jari 699     private void setEnableMenuItem(String command, boolean enable) {
2 26 Feb 07 jari 700         JMenuItem item = getJMenuItem(command);
2 26 Feb 07 jari 701         if (item == null) {
2 26 Feb 07 jari 702             return;
2 26 Feb 07 jari 703         }
2 26 Feb 07 jari 704         item.setEnabled(enable);
2 26 Feb 07 jari 705     }    
2 26 Feb 07 jari 706     
2 26 Feb 07 jari 707    /**
2 26 Feb 07 jari 708      * Saves selected genes.
2 26 Feb 07 jari 709      */
2 26 Feb 07 jari 710     private void onSave() {
2 26 Feb 07 jari 711         try {
2 26 Feb 07 jari 712             if(this.geneViewer)
2 26 Feb 07 jari 713                 ExperimentUtil.saveExperiment(frame, experiment, data, getSelectedPoints());
2 26 Feb 07 jari 714             else 
2 26 Feb 07 jari 715                 ExperimentUtil.saveExperimentCluster(frame, experiment, data, getSelectedPoints());
2 26 Feb 07 jari 716         } catch (Exception e) {
2 26 Feb 07 jari 717             JOptionPane.showMessageDialog(frame, "Can not save matrix!", e.toString(), JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 718             e.printStackTrace();
2 26 Feb 07 jari 719         }
2 26 Feb 07 jari 720     }
2 26 Feb 07 jari 721     
2 26 Feb 07 jari 722    
2 26 Feb 07 jari 723     /**
2 26 Feb 07 jari 724      * Stores the selected cluster
2 26 Feb 07 jari 725      */
2 26 Feb 07 jari 726     private void storeCluster(){
2 26 Feb 07 jari 727         if(this.geneViewer)
2 26 Feb 07 jari 728             framework.storeSubCluster(getSelectedPoints(), experiment, Cluster.GENE_CLUSTER);
2 26 Feb 07 jari 729         else 
2 26 Feb 07 jari 730             framework.storeSubCluster(getSelectedPoints(), experiment, Cluster.EXPERIMENT_CLUSTER);
2 26 Feb 07 jari 731         //content.setSelection(false);
2 26 Feb 07 jari 732         //onHideSelection(); 
2 26 Feb 07 jari 733         this.onDataChanged(this.data);
2 26 Feb 07 jari 734         this.repaint();
2 26 Feb 07 jari 735         //content.updateScene();        
2 26 Feb 07 jari 736     }
2 26 Feb 07 jari 737     
2 26 Feb 07 jari 738     /**
2 26 Feb 07 jari 739      * Launches a new MultipleArrayViewer using selected elements
2 26 Feb 07 jari 740      */
2 26 Feb 07 jari 741     private void launchNewSession(){
2 26 Feb 07 jari 742         if(this.geneViewer)
2 26 Feb 07 jari 743             framework.launchNewMAV(getSelectedPoints(), this.experiment, "Multiple Experiment Viewer - Cluster Viewer", Cluster.GENE_CLUSTER);
2 26 Feb 07 jari 744         else 
2 26 Feb 07 jari 745             framework.launchNewMAV(getSelectedPoints(), this.experiment, "Multiple Experiment Viewer - Cluster Viewer", Cluster.EXPERIMENT_CLUSTER);        
2 26 Feb 07 jari 746     }
2 26 Feb 07 jari 747     
2 26 Feb 07 jari 748     /**
2 26 Feb 07 jari 749      * Handles the selection box state.
2 26 Feb 07 jari 750      */
2 26 Feb 07 jari 751     private void onShowSelection() {
2 26 Feb 07 jari 752        // if ((geneOrExpt == COAGUI.GENES) || (geneOrExpt == COAGUI.EXPTS)) {
2 26 Feb 07 jari 753             JMenuItem saveClusterItem = getJMenuItem(SAVE_CMD);
2 26 Feb 07 jari 754             JMenuItem storeClusterItem = getJMenuItem(STORE_CLUSTER_CMD);
2 26 Feb 07 jari 755             JMenuItem launchNewItem = getJMenuItem(LAUNCH_NEW_SESSION_CMD);
2 26 Feb 07 jari 756             if (!ellipse.isEmpty()) {
2 26 Feb 07 jari 757                 //content.setSelection(true);
2 26 Feb 07 jari 758                 //content.setSelectionBox(!hideBoxItem.isSelected());
2 26 Feb 07 jari 759                 //selectionAreaItem.setEnabled(true);
2 26 Feb 07 jari 760                 saveClusterItem.setEnabled(true);
2 26 Feb 07 jari 761                 //hideBoxItem.setEnabled(true);
2 26 Feb 07 jari 762                 storeClusterItem.setEnabled(true);
2 26 Feb 07 jari 763                 launchNewItem.setEnabled(true);
2 26 Feb 07 jari 764             } else {
2 26 Feb 07 jari 765                 //content.setSelection(false);
2 26 Feb 07 jari 766                 //content.setSelectionBox(false);
2 26 Feb 07 jari 767                 //selectionAreaItem.setEnabled(false);
2 26 Feb 07 jari 768                 saveClusterItem.setEnabled(false);
2 26 Feb 07 jari 769                 //hideBoxItem.setEnabled(false);
2 26 Feb 07 jari 770                 storeClusterItem.setEnabled(false);
2 26 Feb 07 jari 771                 launchNewItem.setEnabled(false);
2 26 Feb 07 jari 772             }
2 26 Feb 07 jari 773         //} 
2 26 Feb 07 jari 774         //content.updateScene();
2 26 Feb 07 jari 775     }  
2 26 Feb 07 jari 776     
2 26 Feb 07 jari 777     private void showExptNames() {
2 26 Feb 07 jari 778         displayExptNames  = !(displayExptNames);
2 26 Feb 07 jari 779         this.repaint();
2 26 Feb 07 jari 780     }
2 26 Feb 07 jari 781     
2 26 Feb 07 jari 782     private void displayLargePoints() {
2 26 Feb 07 jari 783         showLargePoints = !(showLargePoints);
2 26 Feb 07 jari 784         this.repaint();
2 26 Feb 07 jari 785     }
2 26 Feb 07 jari 786     
2 26 Feb 07 jari 787     private void displayTickLabels() {
2 26 Feb 07 jari 788         showTickLabels = !(showTickLabels);
2 26 Feb 07 jari 789         this.repaint();
2 26 Feb 07 jari 790     }
2 26 Feb 07 jari 791     
2 26 Feb 07 jari 792     /** Returns int value indicating viewer type
2 26 Feb 07 jari 793      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 794      */
2 26 Feb 07 jari 795     public int getViewerType() {
2 26 Feb 07 jari 796         return -1;
2 26 Feb 07 jari 797     }
2 26 Feb 07 jari 798     
2 26 Feb 07 jari 799     /**
2 26 Feb 07 jari 800      * The listener to listen to menu items events.
2 26 Feb 07 jari 801      */
2 26 Feb 07 jari 802     private class Listener extends MouseAdapter implements ActionListener {
2 26 Feb 07 jari 803         public void actionPerformed(ActionEvent event) {
2 26 Feb 07 jari 804             String command = event.getActionCommand();
2 26 Feb 07 jari 805             if (command.equals(SAVE_CMD)) {
2 26 Feb 07 jari 806                 onSave();
2 26 Feb 07 jari 807             } else if (command.equals(STORE_CLUSTER_CMD)){
2 26 Feb 07 jari 808                 storeCluster();
2 26 Feb 07 jari 809             } else if (command.equals(LAUNCH_NEW_SESSION_CMD)){
2 26 Feb 07 jari 810                 launchNewSession();
2 26 Feb 07 jari 811             } else if (command.equals(DISPLAY_EXPT_NAMES_CMD)) {
2 26 Feb 07 jari 812                 showExptNames();
2 26 Feb 07 jari 813             } else if (command.equals(SHOW_LARGER_POINTS_CMD)) {
2 26 Feb 07 jari 814                 displayLargePoints();
2 26 Feb 07 jari 815             } else if (command.equals(SHOW_TICK_LABELS_CMD)) {
2 26 Feb 07 jari 816                 displayTickLabels();
2 26 Feb 07 jari 817             }
2 26 Feb 07 jari 818         }        
2 26 Feb 07 jari 819     }    
2 26 Feb 07 jari 820     
2 26 Feb 07 jari 821
2 26 Feb 07 jari 822   /**
2 26 Feb 07 jari 823    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperiment(org.tigr.microarray.mev.cluster.gui.Experiment)
2 26 Feb 07 jari 824    */
2 26 Feb 07 jari 825   public void setExperiment(Experiment e) {
2 26 Feb 07 jari 826     this.experiment = e;
2 26 Feb 07 jari 827     this.exptID = experiment.getId();
2 26 Feb 07 jari 828   }
2 26 Feb 07 jari 829
2 26 Feb 07 jari 830   /**
2 26 Feb 07 jari 831    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExperimentID()
2 26 Feb 07 jari 832    */
2 26 Feb 07 jari 833   public int getExperimentID() {
2 26 Feb 07 jari 834     return this.exptID;
2 26 Feb 07 jari 835   }
2 26 Feb 07 jari 836
2 26 Feb 07 jari 837   /**
2 26 Feb 07 jari 838    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperimentID(int)
2 26 Feb 07 jari 839    */
2 26 Feb 07 jari 840   public void setExperimentID(int id) {
2 26 Feb 07 jari 841     this.exptID = id;
2 26 Feb 07 jari 842   }    
2 26 Feb 07 jari 843 }