mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/gdm/GDMGeneHeader.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, 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: GDMGeneHeader.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.6 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 20:22:00 $
2 26 Feb 07 jari 9  * $Author: braistedj $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 package org.tigr.microarray.mev.cluster.gui.impl.gdm;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import java.awt.BorderLayout;
2 26 Feb 07 jari 16 import java.awt.Color;
2 26 Feb 07 jari 17 import java.awt.Dimension;
2 26 Feb 07 jari 18 import java.awt.Font;
2 26 Feb 07 jari 19 import java.awt.FontMetrics;
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.MouseAdapter;
2 26 Feb 07 jari 28 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 29 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 30 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 31 import java.text.DecimalFormat;
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 import javax.swing.JPanel;
2 26 Feb 07 jari 34 import javax.swing.JScrollBar;
2 26 Feb 07 jari 35
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39 public class GDMGeneHeader extends JPanel {
2 26 Feb 07 jari 40     
2 26 Feb 07 jari 41     private static final String GDM_VECTOR_STRING = "GDM Vector";
2 26 Feb 07 jari 42     
2 26 Feb 07 jari 43     private int [] indices;
2 26 Feb 07 jari 44     private int labelIndex;
2 26 Feb 07 jari 45     private Insets insets;
2 26 Feb 07 jari 46     private int num_genes;
2 26 Feb 07 jari 47     private boolean showClusters = true;
2 26 Feb 07 jari 48     private boolean hasColorBar = false;
2 26 Feb 07 jari 49     private boolean isColumnHeader;
2 26 Feb 07 jari 50     
2 26 Feb 07 jari 51     private IData expData;
2 26 Feb 07 jari 52     private int contentWidth;
2 26 Feb 07 jari 53     private int contentHeight;
2 26 Feb 07 jari 54     private int elementWidth;
2 26 Feb 07 jari 55     private int elementHeight;
2 26 Feb 07 jari 56     private int tracespace;
2 26 Feb 07 jari 57     private int maxGeneNameLength;
2 26 Feb 07 jari 58     private Experiment experiment;
2 26 Feb 07 jari 59     
2 26 Feb 07 jari 60     private boolean isAntiAliasing = false;
2 26 Feb 07 jari 61     private boolean isTracing = true;
2 26 Feb 07 jari 62     
2 26 Feb 07 jari 63     private final int OFFSET = 5;
2 26 Feb 07 jari 64     private final int MIN_LABEL_PANEL_SIZE = 1;
2 26 Feb 07 jari 65     private final int MAX_LABEL_PANEL_SIZE = 200;
2 26 Feb 07 jari 66     private static final int NOT_UPDATE_ANNOTATION_SIZE = -1;
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     private int annotationSize;
2 26 Feb 07 jari 69     
2 26 Feb 07 jari 70     private GDMGeneGradientLabelPanel gdmGradientLabelPanel;
2 26 Feb 07 jari 71     private GDMColorBarPanel gdmColorBarPanel;
2 26 Feb 07 jari 72     
2 26 Feb 07 jari 73     private float minValue = 0.0f;
2 26 Feb 07 jari 74     private float maxValue = 1.0f;
2 26 Feb 07 jari 75     
2 26 Feb 07 jari 76     private final int RECT_HEIGHT = 10;
2 26 Feb 07 jari 77     private final int RECT_WIDTH = 200;
2 26 Feb 07 jari 78     private int maxColorScaleTextWidth = 0;
2 26 Feb 07 jari 79     private int maxColorScaleTextHeight = 0;
2 26 Feb 07 jari 80     
2 26 Feb 07 jari 81     private int probes;
2 26 Feb 07 jari 82     
2 26 Feb 07 jari 83     private int headerWidth;
2 26 Feb 07 jari 84     private int headerHeight;
2 26 Feb 07 jari 85     
2 26 Feb 07 jari 86     private int gradientPanelWidth;
2 26 Feb 07 jari 87     private int gradientPanelHeight;
2 26 Feb 07 jari 88     
2 26 Feb 07 jari 89     private int labelPanelWidth;
2 26 Feb 07 jari 90     private int labelPanelHeight;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     private int colorBarWidth;
2 26 Feb 07 jari 93     private int colorBarHeight;
2 26 Feb 07 jari 94     private DecimalFormat decFormat;
2 26 Feb 07 jari 95     private boolean sortByGeneProximity = true;
2 26 Feb 07 jari 96     private ActionListener matrixListener;
2 26 Feb 07 jari 97     
2 26 Feb 07 jari 98     private int currentIndex = 0;
2 26 Feb 07 jari 99     
2 26 Feb 07 jari 100     /**
2 26 Feb 07 jari 101      * Constructs a <code>MultipleArrayHeader</code> with specified
2 26 Feb 07 jari 102      * insets and trace space.
2 26 Feb 07 jari 103      */
2 26 Feb 07 jari 104     public GDMGeneHeader(Insets insets, int tracespace, boolean colHdr, Experiment experiment,
2 26 Feb 07 jari 105     int width, int height, Dimension eSize, int maxGeneLen, int num_genes,
2 26 Feb 07 jari 106     int [] indexes) {
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         this.setLayout(new BorderLayout());
2 26 Feb 07 jari 109         
2 26 Feb 07 jari 110         this.insets = new Insets(0, 0, 0, 0);
2 26 Feb 07 jari 111
2 26 Feb 07 jari 112         this.tracespace = tracespace;
2 26 Feb 07 jari 113         this.experiment = experiment;
2 26 Feb 07 jari 114         this.elementWidth = eSize.width;
2 26 Feb 07 jari 115         this.elementHeight = eSize.height;
2 26 Feb 07 jari 116         this.isColumnHeader = colHdr;
2 26 Feb 07 jari 117         this.contentWidth = width;
2 26 Feb 07 jari 118         this.contentHeight = height;
2 26 Feb 07 jari 119         this.indices = indexes;
2 26 Feb 07 jari 120         this.probes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 121         this.num_genes = num_genes;
2 26 Feb 07 jari 122         this.maxGeneNameLength = maxGeneLen * elementWidth;
2 26 Feb 07 jari 123         
2 26 Feb 07 jari 124         gdmGradientLabelPanel = new GDMGeneGradientLabelPanel(insets, tracespace, colHdr, experiment, width,
2 26 Feb 07 jari 125         height, eSize, maxGeneLen, num_genes, indexes);
2 26 Feb 07 jari 126         
2 26 Feb 07 jari 127         gdmColorBarPanel = new GDMColorBarPanel();
2 26 Feb 07 jari 128         
2 26 Feb 07 jari 129         setFontSize(elementWidth);
2 26 Feb 07 jari 130
2 26 Feb 07 jari 131         if (isColumnHeader == true) {
2 26 Feb 07 jari 132             add(gdmGradientLabelPanel, BorderLayout.NORTH);
2 26 Feb 07 jari 133             if(hasColorBar)
2 26 Feb 07 jari 134                 add(gdmColorBarPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 135         } else {
2 26 Feb 07 jari 136             add(gdmGradientLabelPanel, BorderLayout.WEST);
2 26 Feb 07 jari 137             if(hasColorBar)
2 26 Feb 07 jari 138                 add(gdmColorBarPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 139         }
2 26 Feb 07 jari 140         
2 26 Feb 07 jari 141         decFormat = new DecimalFormat();
2 26 Feb 07 jari 142         decFormat.setMaximumFractionDigits(3);
2 26 Feb 07 jari 143         decFormat.setMinimumFractionDigits(1);
2 26 Feb 07 jari 144         
2 26 Feb 07 jari 145         Listener listener = new Listener();
2 26 Feb 07 jari 146         gdmGradientLabelPanel.getLabelPanel().addMouseListener(listener);
2 26 Feb 07 jari 147         gdmGradientLabelPanel.getLabelPanel().addMouseMotionListener(listener);
2 26 Feb 07 jari 148         
2 26 Feb 07 jari 149         setBackground(Color.white);
2 26 Feb 07 jari 150         setOpaque(true);
2 26 Feb 07 jari 151     }
2 26 Feb 07 jari 152     
2 26 Feb 07 jari 153     
2 26 Feb 07 jari 154     private class Listener extends MouseAdapter implements ActionListener, MouseMotionListener {
2 26 Feb 07 jari 155         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 156             String command = e.getActionCommand();
2 26 Feb 07 jari 157         }
2 26 Feb 07 jari 158         
2 26 Feb 07 jari 159         public void mouseClicked(MouseEvent evt){
2 26 Feb 07 jari 160             if(sortByGeneProximity){
2 26 Feb 07 jari 161                 int loc = 0;
2 26 Feb 07 jari 162                 if(GDMGeneHeader.this.isColumnHeader)
2 26 Feb 07 jari 163                     loc = evt.getX();
2 26 Feb 07 jari 164                 else
2 26 Feb 07 jari 165                     loc = evt.getY();
2 26 Feb 07 jari 166                 int index = (int)((loc - insets.left)/elementWidth);
2 26 Feb 07 jari 167                 fireGDMSortEvent(indices[index]);
2 26 Feb 07 jari 168             }
2 26 Feb 07 jari 169         }
2 26 Feb 07 jari 170         
2 26 Feb 07 jari 171         public void mouseMoved(MouseEvent event) {
2 26 Feb 07 jari 172             if(sortByGeneProximity){
2 26 Feb 07 jari 173                 Graphics2D g2D = (Graphics2D)gdmGradientLabelPanel.getLabelPanelGraphics();
2 26 Feb 07 jari 174                 if(g2D == null)
2 26 Feb 07 jari 175                     return;
2 26 Feb 07 jari 176                 
2 26 Feb 07 jari 177                 int x = event.getX();
2 26 Feb 07 jari 178                 int y = event.getY();
2 26 Feb 07 jari 179                 int elementIndex;
2 26 Feb 07 jari 180                 if(isColumnHeader){
2 26 Feb 07 jari 181                     elementIndex = x/elementWidth;
2 26 Feb 07 jari 182                     if(elementIndex >= num_genes){
2 26 Feb 07 jari 183                         repaint();
2 26 Feb 07 jari 184                         return;
2 26 Feb 07 jari 185                     }
2 26 Feb 07 jari 186                     if(elementIndex != currentIndex){
2 26 Feb 07 jari 187                         g2D.setColor(Color.white);
2 26 Feb 07 jari 188                         g2D.drawRect(currentIndex*elementWidth, 0, elementWidth, gdmGradientLabelPanel.getLabelPanel().getHeight()-1);
2 26 Feb 07 jari 189                     }
2 26 Feb 07 jari 190                     g2D.setColor(Color.blue);
2 26 Feb 07 jari 191                     g2D.drawRect(elementIndex*elementWidth, 0, elementWidth, gdmGradientLabelPanel.getLabelPanel().getHeight()-1);
2 26 Feb 07 jari 192                 } else {
2 26 Feb 07 jari 193                     elementIndex = y/elementWidth;
2 26 Feb 07 jari 194                     if(elementIndex >= num_genes){
2 26 Feb 07 jari 195                         repaint();
2 26 Feb 07 jari 196                         return;
2 26 Feb 07 jari 197                     }
2 26 Feb 07 jari 198                     if(elementIndex != currentIndex){
2 26 Feb 07 jari 199                         g2D.setColor(Color.white);
2 26 Feb 07 jari 200                         g2D.drawRect( 0, currentIndex*elementWidth, gdmGradientLabelPanel.getLabelPanel().getWidth()-1, elementHeight);
2 26 Feb 07 jari 201                     }
2 26 Feb 07 jari 202                     g2D.setColor(Color.blue);
2 26 Feb 07 jari 203                     g2D.drawRect(0, elementIndex*elementWidth, gdmGradientLabelPanel.getLabelPanel().getWidth()-1, elementHeight);
2 26 Feb 07 jari 204                 }               
2 26 Feb 07 jari 205                 currentIndex = elementIndex;
2 26 Feb 07 jari 206             }
2 26 Feb 07 jari 207         }
2 26 Feb 07 jari 208         
2 26 Feb 07 jari 209         public void mouseExited(MouseEvent event) {
2 26 Feb 07 jari 210             repaint();
2 26 Feb 07 jari 211         }
2 26 Feb 07 jari 212         public void mouseEntered(MouseEvent event) {}
2 26 Feb 07 jari 213         public void mouseDragged(MouseEvent event) {}
2 26 Feb 07 jari 214     }
2 26 Feb 07 jari 215     
2 26 Feb 07 jari 216     /**
2 26 Feb 07 jari 217      * Sets the label index
2 26 Feb 07 jari 218      */
2 26 Feb 07 jari 219     public void setLabelIndex(int label) {
2 26 Feb 07 jari 220         this.labelIndex = label;
2 26 Feb 07 jari 221         this.gdmGradientLabelPanel.setLabelIndex(label);
2 26 Feb 07 jari 222     }
2 26 Feb 07 jari 223     
2 26 Feb 07 jari 224     /**
2 26 Feb 07 jari 225      * Sets matrix listener
2 26 Feb 07 jari 226      */
2 26 Feb 07 jari 227     public void setMatrixListener(ActionListener aL){
2 26 Feb 07 jari 228         this.matrixListener = aL;
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     public void setSortByGeneProximity(boolean allowSort){
2 26 Feb 07 jari 232         this.sortByGeneProximity = allowSort;
2 26 Feb 07 jari 233     }
2 26 Feb 07 jari 234     
2 26 Feb 07 jari 235     /**
2 26 Feb 07 jari 236      *  GDMGeneHeader: updateSize.
2 26 Feb 07 jari 237      */
2 26 Feb 07 jari 238     public void updateSize(int size) {
2 26 Feb 07 jari 239         
2 26 Feb 07 jari 240         int geneNameLength;
2 26 Feb 07 jari 241         updateMaxGeneNameLength();
2 26 Feb 07 jari 242         geneNameLength = getMaxGeneNameLength();
2 26 Feb 07 jari 243         
2 26 Feb 07 jari 244         int maxTextSize=0;
2 26 Feb 07 jari 245         
2 26 Feb 07 jari 246         if (size == NOT_UPDATE_ANNOTATION_SIZE) {
2 26 Feb 07 jari 247             if (geneNameLength < MIN_LABEL_PANEL_SIZE) {
2 26 Feb 07 jari 248                 setAnnotationSize(MIN_LABEL_PANEL_SIZE);
2 26 Feb 07 jari 249             } else if (geneNameLength > MAX_LABEL_PANEL_SIZE) {
2 26 Feb 07 jari 250                 setAnnotationSize(MAX_LABEL_PANEL_SIZE);
2 26 Feb 07 jari 251             } else {
2 26 Feb 07 jari 252                 setAnnotationSize(geneNameLength);
2 26 Feb 07 jari 253             }
2 26 Feb 07 jari 254         } else {
2 26 Feb 07 jari 255             setAnnotationSize(size);
2 26 Feb 07 jari 256         }
2 26 Feb 07 jari 257         
2 26 Feb 07 jari 258         boolean tempBool;
2 26 Feb 07 jari 259         if(showClusters) {
2 26 Feb 07 jari 260             tempBool = areProbesColored();
2 26 Feb 07 jari 261             if(tempBool && !hasColorBar){
2 26 Feb 07 jari 262                 this.add(gdmColorBarPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 263                 this.validate();
2 26 Feb 07 jari 264             } else if(!tempBool && hasColorBar){
2 26 Feb 07 jari 265                 this.remove(gdmColorBarPanel);
2 26 Feb 07 jari 266                 this.validate();
2 26 Feb 07 jari 267             }
2 26 Feb 07 jari 268             hasColorBar = tempBool;
2 26 Feb 07 jari 269         }
2 26 Feb 07 jari 270         else {
2 26 Feb 07 jari 271             hasColorBar = false;
2 26 Feb 07 jari 272         }
2 26 Feb 07 jari 273         
2 26 Feb 07 jari 274         if (isColumnHeader == true) {
2 26 Feb 07 jari 275             headerWidth = contentWidth + (int) (elementWidth/2);
2 26 Feb 07 jari 276             gradientPanelWidth = headerWidth;
2 26 Feb 07 jari 277             labelPanelWidth = headerWidth;
2 26 Feb 07 jari 278             colorBarWidth = headerWidth;
2 26 Feb 07 jari 279             colorBarHeight = 0;
2 26 Feb 07 jari 280             
2 26 Feb 07 jari 281         } else {
2 26 Feb 07 jari 282             headerHeight = contentHeight + (int) (elementHeight/2);
2 26 Feb 07 jari 283             gradientPanelHeight = headerHeight;
2 26 Feb 07 jari 284             labelPanelHeight = headerHeight;
2 26 Feb 07 jari 285             colorBarWidth = 0;
2 26 Feb 07 jari 286             colorBarHeight = headerHeight;
2 26 Feb 07 jari 287             
2 26 Feb 07 jari 288         }
2 26 Feb 07 jari 289         
2 26 Feb 07 jari 290         Graphics2D g = (Graphics2D)getColorScaleGraphics();
2 26 Feb 07 jari 291         FontMetrics hfm;
2 26 Feb 07 jari 292         int textHeight = 0;
2 26 Feb 07 jari 293         
2 26 Feb 07 jari 294         if (g != null) {
2 26 Feb 07 jari 295             hfm = g.getFontMetrics();
2 26 Feb 07 jari 296             maxColorScaleTextHeight = hfm.getHeight();
2 26 Feb 07 jari 297             
2 26 Feb 07 jari 298             float midValue = (minValue + maxValue)/2f;
2 26 Feb 07 jari 299             String minString = decFormat.format(minValue);
2 26 Feb 07 jari 300             String maxString = decFormat.format(maxValue);
2 26 Feb 07 jari 301             String midString = decFormat.format(midValue);
2 26 Feb 07 jari 302             // midValue = (float) (new BigDecimal(midValue).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
2 26 Feb 07 jari 303             //  minValue = (float) (new BigDecimal(minValue).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
2 26 Feb 07 jari 304             //  maxValue = (float) (new BigDecimal(maxValue).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue());
2 26 Feb 07 jari 305             int textWidth1 = hfm.stringWidth(minString);
2 26 Feb 07 jari 306             int textWidth2 = hfm.stringWidth(maxString);
2 26 Feb 07 jari 307             int textWidth3 = hfm.stringWidth(midString);
2 26 Feb 07 jari 308             
2 26 Feb 07 jari 309             maxColorScaleTextWidth = Math.max(Math.max(textWidth1, textWidth2), textWidth3);
2 26 Feb 07 jari 310             textHeight = hfm.getHeight();
2 26 Feb 07 jari 311         }
2 26 Feb 07 jari 312         
2 26 Feb 07 jari 313         maxTextSize = Math.max(maxColorScaleTextWidth, maxColorScaleTextHeight);
2 26 Feb 07 jari 314         
2 26 Feb 07 jari 315         
2 26 Feb 07 jari 316         if (isColumnHeader == true) {
2 26 Feb 07 jari 317             
2 26 Feb 07 jari 318             gradientPanelHeight = RECT_HEIGHT + textHeight + 2*OFFSET;
2 26 Feb 07 jari 319             labelPanelHeight = annotationSize + 10;// + (elementHeight/2);
2 26 Feb 07 jari 320             
2 26 Feb 07 jari 321             if (hasColorBar) {
2 26 Feb 07 jari 322                 colorBarHeight = OFFSET + (elementHeight >= 10 ? elementHeight : 10) ;
2 26 Feb 07 jari 323             } else {
2 26 Feb 07 jari 324                 colorBarHeight = 0;
2 26 Feb 07 jari 325             }
2 26 Feb 07 jari 326             
2 26 Feb 07 jari 327             headerHeight =  gradientPanelHeight + labelPanelHeight + colorBarHeight + 4;
2 26 Feb 07 jari 328             
2 26 Feb 07 jari 329             this.setSize(headerWidth, headerHeight);
2 26 Feb 07 jari 330             this.setPreferredSize(new Dimension(headerWidth, headerHeight));
2 26 Feb 07 jari 331         } else {
2 26 Feb 07 jari 332             
2 26 Feb 07 jari 333             gradientPanelWidth = RECT_HEIGHT + maxColorScaleTextWidth + 2*OFFSET;
2 26 Feb 07 jari 334             labelPanelWidth = annotationSize + 10;// + (elementHeight/2);
2 26 Feb 07 jari 335             
2 26 Feb 07 jari 336             if (hasColorBar) {
2 26 Feb 07 jari 337                 colorBarWidth = OFFSET + (elementWidth >= 10 ? elementWidth : 10);
2 26 Feb 07 jari 338             } else {
2 26 Feb 07 jari 339                 colorBarWidth = 0;
2 26 Feb 07 jari 340             }
2 26 Feb 07 jari 341             
2 26 Feb 07 jari 342             headerWidth = gradientPanelWidth + labelPanelWidth + colorBarWidth + 4;
2 26 Feb 07 jari 343             
2 26 Feb 07 jari 344             this.setSize(headerWidth, headerHeight);
2 26 Feb 07 jari 345             this.setPreferredSize(new Dimension(headerWidth, headerHeight));
2 26 Feb 07 jari 346         }
2 26 Feb 07 jari 347         
2 26 Feb 07 jari 348         gdmGradientLabelPanel.updateSize();
2 26 Feb 07 jari 349         gdmColorBarPanel.updateSize();
2 26 Feb 07 jari 350         validate();
2 26 Feb 07 jari 351     }
2 26 Feb 07 jari 352     
2 26 Feb 07 jari 353     private Graphics getColorScaleGraphics(){
2 26 Feb 07 jari 354         return this.gdmGradientLabelPanel.getColorScaleGraphics();
2 26 Feb 07 jari 355     }
2 26 Feb 07 jari 356     
2 26 Feb 07 jari 357     
2 26 Feb 07 jari 358     
2 26 Feb 07 jari 359     private void updateMaxGeneNameLength() {
2 26 Feb 07 jari 360         Graphics2D g = (Graphics2D)this.gdmGradientLabelPanel.getLabelPanelGraphics();
2 26 Feb 07 jari 361         if (g == null) {
2 26 Feb 07 jari 362             return;
2 26 Feb 07 jari 363         }
2 26 Feb 07 jari 364         if (isAntiAliasing) {  //Anti-aliasing is on
2 26 Feb 07 jari 365             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 366             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 367         }
2 26 Feb 07 jari 368         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 369         String geneName="";
2 26 Feb 07 jari 370         int maxLength = 0;
2 26 Feb 07 jari 371         int [] indices = getIndices();
2 26 Feb 07 jari 372         
2 26 Feb 07 jari 373         for (int i = 0; i<num_genes; i++) {
2 26 Feb 07 jari 374             if (indices != null) {
2 26 Feb 07 jari 375                 if (labelIndex >= 0) {
2 26 Feb 07 jari 376                     geneName = expData.getElementAttribute(experiment.getGeneIndexMappedToData(indices[i]), labelIndex);
2 26 Feb 07 jari 377                 }
2 26 Feb 07 jari 378             } else {
2 26 Feb 07 jari 379                 if (labelIndex >= 0) {
2 26 Feb 07 jari 380                     geneName = expData.getElementAttribute(experiment.getGeneIndexMappedToData(i), labelIndex);
2 26 Feb 07 jari 381                 }
2 26 Feb 07 jari 382             }
2 26 Feb 07 jari 383             maxLength = Math.max(maxLength, fm.stringWidth(geneName));
2 26 Feb 07 jari 384         }
2 26 Feb 07 jari 385         maxGeneNameLength = maxLength;
2 26 Feb 07 jari 386     }
2 26 Feb 07 jari 387     
2 26 Feb 07 jari 388     /**
2 26 Feb 07 jari 389      * Returns max label width.
2 26 Feb 07 jari 390      */
2 26 Feb 07 jari 391     private int getMaxGeneNameLength() {
2 26 Feb 07 jari 392         return maxGeneNameLength;
2 26 Feb 07 jari 393     }
2 26 Feb 07 jari 394     
2 26 Feb 07 jari 395     public void setNumGenes(int num_genes){
2 26 Feb 07 jari 396         this.num_genes = num_genes;
2 26 Feb 07 jari 397         this.gdmGradientLabelPanel.setNumGenes(num_genes);
2 26 Feb 07 jari 398     }
2 26 Feb 07 jari 399     
2 26 Feb 07 jari 400     public void setIndices(int [] indexes) {
2 26 Feb 07 jari 401         this.indices = indexes;
2 26 Feb 07 jari 402         this.gdmGradientLabelPanel.setIndices(indexes);
2 26 Feb 07 jari 403     }
2 26 Feb 07 jari 404     
2 26 Feb 07 jari 405     public int [] getIndices() {
2 26 Feb 07 jari 406         return this.indices;
2 26 Feb 07 jari 407     }
2 26 Feb 07 jari 408     
2 26 Feb 07 jari 409     /**
2 26 Feb 07 jari 410      * Sets gradient images.
2 26 Feb 07 jari 411      */
2 26 Feb 07 jari 412     public void setPosColorImages(BufferedImage posColorImage) {
2 26 Feb 07 jari 413         this.gdmGradientLabelPanel.setPosColorImages(posColorImage);
2 26 Feb 07 jari 414         this.gdmGradientLabelPanel.repaint();
2 26 Feb 07 jari 415     }
2 26 Feb 07 jari 416     
2 26 Feb 07 jari 417     public JScrollBar getVerticalScrollBar() {
2 26 Feb 07 jari 418         return gdmGradientLabelPanel.getVerticalScrollBar();
2 26 Feb 07 jari 419     };
2 26 Feb 07 jari 420     
2 26 Feb 07 jari 421     public JScrollBar getHorizontalScrollBar() {
2 26 Feb 07 jari 422         return gdmGradientLabelPanel.getHorizontalScrollBar();
2 26 Feb 07 jari 423     };
2 26 Feb 07 jari 424     
2 26 Feb 07 jari 425     /**
2 26 Feb 07 jari 426      * Sets left margin
2 26 Feb 07 jari 427      */
2 26 Feb 07 jari 428     public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 429         this.insets.left = leftMargin;
2 26 Feb 07 jari 430         this.setLeftInset(leftMargin);
2 26 Feb 07 jari 431         this.gdmGradientLabelPanel.setLeftInset(leftMargin);
2 26 Feb 07 jari 432     }
2 26 Feb 07 jari 433     
2 26 Feb 07 jari 434     /**
2 26 Feb 07 jari 435      * Sets top margin
2 26 Feb 07 jari 436      */
2 26 Feb 07 jari 437     public void setTopInset(int topMargin){
2 26 Feb 07 jari 438         insets.top = topMargin;
2 26 Feb 07 jari 439         this.gdmGradientLabelPanel.setTopInset(topMargin);
2 26 Feb 07 jari 440     }
2 26 Feb 07 jari 441     
2 26 Feb 07 jari 442     /**
2 26 Feb 07 jari 443      * Sets the component data.
2 26 Feb 07 jari 444      */
2 26 Feb 07 jari 445     public void setData(IData data) {
2 26 Feb 07 jari 446         this.expData = data;
2 26 Feb 07 jari 447         this.gdmGradientLabelPanel.setData(data);
2 26 Feb 07 jari 448     }
2 26 Feb 07 jari 449     
2 26 Feb 07 jari 450     
2 26 Feb 07 jari 451     /**
2 26 Feb 07 jari 452      * Sets the anti-aliasing attribute.
2 26 Feb 07 jari 453      */
2 26 Feb 07 jari 454     public void setAntiAliasing(boolean isAntiAliasing) {
2 26 Feb 07 jari 455         this.isAntiAliasing = isAntiAliasing;
2 26 Feb 07 jari 456         this.gdmGradientLabelPanel.setAntiAliasing(isAntiAliasing);
2 26 Feb 07 jari 457     }
2 26 Feb 07 jari 458     
2 26 Feb 07 jari 459     /**
2 26 Feb 07 jari 460      * Sets the element width attribute.
2 26 Feb 07 jari 461      */
2 26 Feb 07 jari 462     void setElementWidth(int width) {
2 26 Feb 07 jari 463         this.elementWidth = width;
2 26 Feb 07 jari 464         setFontSize(width);
2 26 Feb 07 jari 465         this.gdmGradientLabelPanel.setElementWidth(width);
2 26 Feb 07 jari 466     }
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     /**
2 26 Feb 07 jari 469      * Sets the element height attribute.
2 26 Feb 07 jari 470      */
2 26 Feb 07 jari 471     void setElementHeight(int height) {
2 26 Feb 07 jari 472         this.elementHeight = height;
2 26 Feb 07 jari 473         setFontSize(height);
2 26 Feb 07 jari 474         this.gdmGradientLabelPanel.setElementHeight(height);
2 26 Feb 07 jari 475     }
2 26 Feb 07 jari 476     
2 26 Feb 07 jari 477     int getElementWidth() {
2 26 Feb 07 jari 478         return this.elementWidth;
2 26 Feb 07 jari 479     }
2 26 Feb 07 jari 480     
2 26 Feb 07 jari 481     /**
2 26 Feb 07 jari 482      * Sets the max header width attribute.
2 26 Feb 07 jari 483      */
2 26 Feb 07 jari 484     void setAnnotationSize(int size) {
2 26 Feb 07 jari 485         this.annotationSize = size;
2 26 Feb 07 jari 486         this.gdmGradientLabelPanel.setAnnotationSize(size);
2 26 Feb 07 jari 487     }
2 26 Feb 07 jari 488     
2 26 Feb 07 jari 489     /**
2 26 Feb 07 jari 490      * Sets the content width attribute.
2 26 Feb 07 jari 491      */
2 26 Feb 07 jari 492     void setContentWidth(int width) {
2 26 Feb 07 jari 493         this.contentWidth = width;
2 26 Feb 07 jari 494         this.gdmGradientLabelPanel.setContentWidth(width);
2 26 Feb 07 jari 495     }
2 26 Feb 07 jari 496     
2 26 Feb 07 jari 497     /**
2 26 Feb 07 jari 498      * Sets the content height attribute.
2 26 Feb 07 jari 499      */
2 26 Feb 07 jari 500     void setContentHeight(int height) {
2 26 Feb 07 jari 501         this.contentHeight = height;
2 26 Feb 07 jari 502         this.gdmGradientLabelPanel.setContentHeight(height);
2 26 Feb 07 jari 503     }
2 26 Feb 07 jari 504     
2 26 Feb 07 jari 505     /**
2 26 Feb 07 jari 506      * Sets the isTracing attribute.
2 26 Feb 07 jari 507      */
2 26 Feb 07 jari 508     void setTracing(boolean isTracing) {
2 26 Feb 07 jari 509         this.isTracing = isTracing;
2 26 Feb 07 jari 510         this.gdmGradientLabelPanel.setTracing(isTracing);
2 26 Feb 07 jari 511     }
2 26 Feb 07 jari 512     
2 26 Feb 07 jari 513     /**
2 26 Feb 07 jari 514      * Returns a trace space value.
2 26 Feb 07 jari 515      */
2 26 Feb 07 jari 516     private int getSpacing() {
2 26 Feb 07 jari 517         if (isTracing) {
2 26 Feb 07 jari 518             return tracespace;
2 26 Feb 07 jari 519         }
2 26 Feb 07 jari 520         return 0;
2 26 Feb 07 jari 521     }
2 26 Feb 07 jari 522     
2 26 Feb 07 jari 523     /**
2 26 Feb 07 jari 524      * Sets the component font size.
2 26 Feb 07 jari 525      */
2 26 Feb 07 jari 526     private void setFontSize(int size) {
2 26 Feb 07 jari 527         if (size > 12) {
2 26 Feb 07 jari 528             size = 12;
2 26 Feb 07 jari 529         }
2 26 Feb 07 jari 530         setFont(new Font("monospaced", Font.PLAIN, size));
2 26 Feb 07 jari 531     }
2 26 Feb 07 jari 532     
2 26 Feb 07 jari 533     public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 534         this.minValue = minValue;
2 26 Feb 07 jari 535         this.maxValue = maxValue;
2 26 Feb 07 jari 536         this.gdmGradientLabelPanel.setValues(minValue, maxValue);
2 26 Feb 07 jari 537     }
2 26 Feb 07 jari 538     
2 26 Feb 07 jari 539     /**
2 26 Feb 07 jari 540      * returns true if a probe in the current viewer has color
2 26 Feb 07 jari 541      */
2 26 Feb 07 jari 542     public boolean areProbesColored() {
2 26 Feb 07 jari 543         if (indices == null) return false;
2 26 Feb 07 jari 544         
2 26 Feb 07 jari 545         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 546             if( this.expData.getProbeColor(experiment.getGeneIndexMappedToData(indices[i])) != null){
2 26 Feb 07 jari 547                 return true;
2 26 Feb 07 jari 548             }
2 26 Feb 07 jari 549         }
2 26 Feb 07 jari 550         return false;
2 26 Feb 07 jari 551     }
2 26 Feb 07 jari 552     
2 26 Feb 07 jari 553     /**
2 26 Feb 07 jari 554      * signals the matrix to sort on proximity about the provided index
2 26 Feb 07 jari 555      */
2 26 Feb 07 jari 556     private void fireGDMSortEvent(int index){
2 26 Feb 07 jari 557         ActionEvent ae = new ActionEvent(this, index, GDMGeneViewer.SORT_BY_GENE_PROXIMITY_CMD);
2 26 Feb 07 jari 558         if(matrixListener != null){
2 26 Feb 07 jari 559             matrixListener.actionPerformed(ae);
2 26 Feb 07 jari 560         }
2 26 Feb 07 jari 561     }
2 26 Feb 07 jari 562     
2 26 Feb 07 jari 563     
2 26 Feb 07 jari 564     private class GDMColorBarPanel extends JPanel {
2 26 Feb 07 jari 565  
2 26 Feb 07 jari 566         public GDMColorBarPanel() {
2 26 Feb 07 jari 567             setBackground(Color.white);
2 26 Feb 07 jari 568             setSize(0,0);
2 26 Feb 07 jari 569             setPreferredSize(new Dimension(0,0));
2 26 Feb 07 jari 570             setOpaque(true);
2 26 Feb 07 jari 571             
2 26 Feb 07 jari 572         }
2 26 Feb 07 jari 573         
2 26 Feb 07 jari 574         /**
2 26 Feb 07 jari 575          * Sets the component font size.
2 26 Feb 07 jari 576          */
2 26 Feb 07 jari 577         private void setFontSize(int width) {
2 26 Feb 07 jari 578             if (width > 12) {
2 26 Feb 07 jari 579                 width = 12;
2 26 Feb 07 jari 580             }
2 26 Feb 07 jari 581             setFont(new Font("monospaced", Font.PLAIN, width));
2 26 Feb 07 jari 582         }
2 26 Feb 07 jari 583         
2 26 Feb 07 jari 584         /**
2 26 Feb 07 jari 585          * GDMColorBarPanel: updateSize
2 26 Feb 07 jari 586          */
2 26 Feb 07 jari 587         public void updateSize() {
2 26 Feb 07 jari 588             int w, h;
2 26 Feb 07 jari 589             
2 26 Feb 07 jari 590 /*
2 26 Feb 07 jari 591             if (isColumnHeader == true) {
2 26 Feb 07 jari 592                 w = headerWidth;
2 26 Feb 07 jari 593                 h = colorBarHeight;
2 26 Feb 07 jari 594             } else {
2 26 Feb 07 jari 595                 h = headerHeight;
2 26 Feb 07 jari 596                 w = colorBarHeight;
2 26 Feb 07 jari 597             }
2 26 Feb 07 jari 598  
2 26 Feb 07 jari 599             this.setSize(w, h);
2 26 Feb 07 jari 600             this.setPreferredSize(new Dimension(w, h));
2 26 Feb 07 jari 601  */
2 26 Feb 07 jari 602             this.setSize(colorBarWidth, colorBarHeight);
2 26 Feb 07 jari 603             this.setPreferredSize(new Dimension(colorBarWidth, colorBarHeight));
2 26 Feb 07 jari 604         }
2 26 Feb 07 jari 605         
2 26 Feb 07 jari 606         /**
2 26 Feb 07 jari 607          * GDMColorBarPanel: paint
2 26 Feb 07 jari 608          */
2 26 Feb 07 jari 609         public void paint(Graphics g1D) {
2 26 Feb 07 jari 610             super.paint(g1D);
2 26 Feb 07 jari 611             if(!GDMGeneHeader.this.hasColorBar)
2 26 Feb 07 jari 612                 return;
2 26 Feb 07 jari 613             if (expData == null) {
2 26 Feb 07 jari 614                 return;
2 26 Feb 07 jari 615             }
2 26 Feb 07 jari 616             Graphics2D g = (Graphics2D)g1D;
2 26 Feb 07 jari 617             if (isAntiAliasing) {
2 26 Feb 07 jari 618                 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 619                 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 620             }
2 26 Feb 07 jari 621             
2 26 Feb 07 jari 622             if (isColumnHeader == true) {
2 26 Feb 07 jari 623                 drawColumnColorBar(g);
2 26 Feb 07 jari 624             } else {
2 26 Feb 07 jari 625                 drawRowColorBar(g);
2 26 Feb 07 jari 626             }
2 26 Feb 07 jari 627         }
2 26 Feb 07 jari 628         
2 26 Feb 07 jari 629         
2 26 Feb 07 jari 630         private void drawRowColorBar(Graphics2D g) {
2 26 Feb 07 jari 631             Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 632             final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 633             int bottom =0;
2 26 Feb 07 jari 634             
2 26 Feb 07 jari 635             bottom = getBottomIndex(bounds.y+bounds.height, num_genes);
2 26 Feb 07 jari 636             
2 26 Feb 07 jari 637             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 638                 fillRowColorRectAt(g, OFFSET/2, row);
2 26 Feb 07 jari 639             }
2 26 Feb 07 jari 640         }
2 26 Feb 07 jari 641         
2 26 Feb 07 jari 642         /**
2 26 Feb 07 jari 643          * fills cluster colors
2 26 Feb 07 jari 644          */
2 26 Feb 07 jari 645         private void fillRowColorRectAt(Graphics g, int xLoc, int row) {
2 26 Feb 07 jari 646             
2 26 Feb 07 jari 647             Color geneColor = null;
2 26 Feb 07 jari 648             
2 26 Feb 07 jari 649             geneColor = expData.getProbeColor(experiment.getGeneIndexMappedToData(indices[row]));
2 26 Feb 07 jari 650             
2 26 Feb 07 jari 651             if(geneColor == null)
2 26 Feb 07 jari 652                 geneColor = Color.white;
2 26 Feb 07 jari 653
2 26 Feb 07 jari 654             g.setColor(geneColor);
2 26 Feb 07 jari 655             g.fillRect(xLoc, row*elementHeight, colorBarWidth-OFFSET, elementHeight);
2 26 Feb 07 jari 656         }
2 26 Feb 07 jari 657         
2 26 Feb 07 jari 658         private void drawColumnColorBar(Graphics2D g) {
2 26 Feb 07 jari 659             Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 660             final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 661             int right = 0;
2 26 Feb 07 jari 662             
2 26 Feb 07 jari 663             right = getRightIndex(bounds.x+bounds.width, num_genes);
2 26 Feb 07 jari 664             
2 26 Feb 07 jari 665             for (int column = left; column < right; column++) {
2 26 Feb 07 jari 666                 fillColumnColorRectAt(g, column, OFFSET/2 );
2 26 Feb 07 jari 667             }
2 26 Feb 07 jari 668         }
2 26 Feb 07 jari 669         
2 26 Feb 07 jari 670         /**
2 26 Feb 07 jari 671          * fills cluster colors
2 26 Feb 07 jari 672          */
2 26 Feb 07 jari 673         private void fillColumnColorRectAt(Graphics g, int column, int yLoc) {
2 26 Feb 07 jari 674             
2 26 Feb 07 jari 675             Color geneColor = null;
2 26 Feb 07 jari 676             
2 26 Feb 07 jari 677             geneColor = expData.getProbeColor(experiment.getGeneIndexMappedToData(indices[column]));
2 26 Feb 07 jari 678             
2 26 Feb 07 jari 679             if(geneColor == null)
2 26 Feb 07 jari 680                 geneColor = Color.white;
2 26 Feb 07 jari 681             
2 26 Feb 07 jari 682             g.setColor(geneColor);
2 26 Feb 07 jari 683             g.fillRect(column*elementWidth, yLoc, elementWidth, colorBarHeight-OFFSET);
2 26 Feb 07 jari 684         }
2 26 Feb 07 jari 685         
2 26 Feb 07 jari 686         
2 26 Feb 07 jari 687         /**
2 26 Feb 07 jari 688          * Returns index of top row.
2 26 Feb 07 jari 689          */
2 26 Feb 07 jari 690         private int getTopIndex(int top) {
2 26 Feb 07 jari 691             if (top<0) {
2 26 Feb 07 jari 692                 return 0;
2 26 Feb 07 jari 693             }
2 26 Feb 07 jari 694             return top/elementHeight;
2 26 Feb 07 jari 695         }
2 26 Feb 07 jari 696         
2 26 Feb 07 jari 697         /**
2 26 Feb 07 jari 698          * Returns index of left column.
2 26 Feb 07 jari 699          */
2 26 Feb 07 jari 700         private int getLeftIndex(int left) {
2 26 Feb 07 jari 701             if (left<0) {
2 26 Feb 07 jari 702                 return 0;
2 26 Feb 07 jari 703             }
2 26 Feb 07 jari 704             return left/(elementWidth+getSpacing());
2 26 Feb 07 jari 705         }
2 26 Feb 07 jari 706         
2 26 Feb 07 jari 707         /**
2 26 Feb 07 jari 708          * Returns index of right column.
2 26 Feb 07 jari 709          */
2 26 Feb 07 jari 710         private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 711             if (right<0) {
2 26 Feb 07 jari 712                 return 0;
2 26 Feb 07 jari 713             }
2 26 Feb 07 jari 714             int result = right/(elementWidth+getSpacing())+1;
2 26 Feb 07 jari 715             return result > limit ? limit : result;
2 26 Feb 07 jari 716         }
2 26 Feb 07 jari 717         
2 26 Feb 07 jari 718         /**
2 26 Feb 07 jari 719          * Returns index of bottom row.
2 26 Feb 07 jari 720          */
2 26 Feb 07 jari 721         private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 722             if (bottom<0) {
2 26 Feb 07 jari 723                 return 0;
2 26 Feb 07 jari 724             }
2 26 Feb 07 jari 725             int result = bottom/elementHeight+1;
2 26 Feb 07 jari 726             return result > limit ? limit : result;
2 26 Feb 07 jari 727         }
2 26 Feb 07 jari 728     }
2 26 Feb 07 jari 729     
2 26 Feb 07 jari 730 }