mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LEMHeader.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2006, 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 package org.tigr.microarray.mev.cluster.gui.impl.lem;
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 import java.awt.Color;
2 26 Feb 07 jari 8 import java.awt.Dimension;
2 26 Feb 07 jari 9 import java.awt.Font;
2 26 Feb 07 jari 10 import java.awt.FontMetrics;
2 26 Feb 07 jari 11 import java.awt.Graphics;
2 26 Feb 07 jari 12 import java.awt.Graphics2D;
2 26 Feb 07 jari 13 import java.awt.Insets;
2 26 Feb 07 jari 14 import java.awt.RenderingHints;
2 26 Feb 07 jari 15 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17 import javax.swing.JComponent;
2 26 Feb 07 jari 18 import javax.swing.JPanel;
2 26 Feb 07 jari 19
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 /**
2 26 Feb 07 jari 24  * @author braisted
2 26 Feb 07 jari 25  * 
2 26 Feb 07 jari 26  * LEMHeader displays sample names, the current gradient option either gradient
2 26 Feb 07 jari 27  * or bin colors
2 26 Feb 07 jari 28  */
2 26 Feb 07 jari 29 public class LEMHeader extends JPanel {
2 26 Feb 07 jari 30       
2 26 Feb 07 jari 31       private static final int RECT_HEIGHT = 15;
2 26 Feb 07 jari 32       private static final int COLOR_BAR_HEIGHT = 10;
2 26 Feb 07 jari 33       private int MIN_WIDTH = 180;
2 26 Feb 07 jari 34       private Experiment experiment;
2 26 Feb 07 jari 35       private IData data;
2 26 Feb 07 jari 36       private int[] samplesOrder;
2 26 Feb 07 jari 37     
2 26 Feb 07 jari 38       private int columnSpacing;
2 26 Feb 07 jari 39       private int arrowWidth;
2 26 Feb 07 jari 40       private int wingWidth;
2 26 Feb 07 jari 41       private boolean isAntiAliasing = true;
2 26 Feb 07 jari 42       private float maxValue = 3f;
2 26 Feb 07 jari 43       private float minValue = -3f;
2 26 Feb 07 jari 44       private float midValue = 0.0f;
2 26 Feb 07 jari 45       private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47       private int colorMode = LinearExpressionMapViewer.COLOR_MODE_GRADIENT;     
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49       private BufferedImage negColorImage;
2 26 Feb 07 jari 50       private BufferedImage posColorImage;
2 26 Feb 07 jari 51       
2 26 Feb 07 jari 52       private Color c1 = new Color(10, 159, 1);
2 26 Feb 07 jari 53       private Color c2 = new Color(187, 240, 181);
2 26 Feb 07 jari 54       private Color midColor = Color.white;
2 26 Feb 07 jari 55       private Color c3 = new Color(243, 169, 160);
2 26 Feb 07 jari 56       private Color c4 = Color.red;
2 26 Feb 07 jari 57             
2 26 Feb 07 jari 58     private float cutoff1 = -3f;
2 26 Feb 07 jari 59     private float cutoff2 = -1f;
2 26 Feb 07 jari 60     private float binMidValue = 0f;
2 26 Feb 07 jari 61     private float cutoff3 = 1f;
2 26 Feb 07 jari 62     private float cutoff4 = 3f;
2 26 Feb 07 jari 63       
2 26 Feb 07 jari 64       private boolean useDoubleGradient = true;
2 26 Feb 07 jari 65       
2 26 Feb 07 jari 66       /**
2 26 Feb 07 jari 67        * Construct an <code>ExperimentHeader</code> with specified experiment.
2 26 Feb 07 jari 68        */
2 26 Feb 07 jari 69       public LEMHeader(Experiment experiment) {
2 26 Feb 07 jari 70           this(experiment, null);
2 26 Feb 07 jari 71       }
2 26 Feb 07 jari 72       
2 26 Feb 07 jari 73       /**
2 26 Feb 07 jari 74        * Construct an <code>ExperimentHeader</code> with specified experiment
2 26 Feb 07 jari 75        * and samples order.
2 26 Feb 07 jari 76        */
2 26 Feb 07 jari 77       public LEMHeader(Experiment experiment, int[] samplesOrder) {
2 26 Feb 07 jari 78           this.experiment = experiment;
2 26 Feb 07 jari 79           this.samplesOrder = samplesOrder == null ? createSamplesOrder(experiment) : samplesOrder;
2 26 Feb 07 jari 80           setBackground(Color.white);
2 26 Feb 07 jari 81       }
2 26 Feb 07 jari 82       
2 26 Feb 07 jari 83       /**
2 26 Feb 07 jari 84        * Returns a component to be inserted into scroll pane view port.
2 26 Feb 07 jari 85        */
2 26 Feb 07 jari 86       public JComponent getContentComponent() {
2 26 Feb 07 jari 87           return this;
2 26 Feb 07 jari 88       }
2 26 Feb 07 jari 89       
2 26 Feb 07 jari 90       /**
2 26 Feb 07 jari 91        * returns the default sample ordering
2 26 Feb 07 jari 92        * @param experiment
2 26 Feb 07 jari 93        * @return
2 26 Feb 07 jari 94        */
2 26 Feb 07 jari 95       private static int[] createSamplesOrder(Experiment experiment) {
2 26 Feb 07 jari 96           int[] order = new int[experiment.getNumberOfSamples()];
2 26 Feb 07 jari 97           for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 98               order[i] = i;
2 26 Feb 07 jari 99           }
2 26 Feb 07 jari 100           return order;
2 26 Feb 07 jari 101       }
2 26 Feb 07 jari 102       
2 26 Feb 07 jari 103       /**
2 26 Feb 07 jari 104        * Sets data.
2 26 Feb 07 jari 105        */
2 26 Feb 07 jari 106       public void setData(IData data) {
2 26 Feb 07 jari 107           this.data = data;
2 26 Feb 07 jari 108       }
2 26 Feb 07 jari 109       
2 26 Feb 07 jari 110       /**
2 26 Feb 07 jari 111        * Sets max and min experiment values.
2 26 Feb 07 jari 112        */
2 26 Feb 07 jari 113       public void setValues(float minValue, float midValue, float maxValue) {
2 26 Feb 07 jari 114           this.maxValue = maxValue;
2 26 Feb 07 jari 115           this.minValue = minValue;
2 26 Feb 07 jari 116           this.midValue = midValue;
2 26 Feb 07 jari 117       }
2 26 Feb 07 jari 118       
2 26 Feb 07 jari 119       /**
2 26 Feb 07 jari 120        * sets the color bin policy, gradient, 3 bin, or 5 bin
2 26 Feb 07 jari 121        * @param binOption gradient, 3 bin, or 5 bin as specified by
2 26 Feb 07 jari 122        * <code>LinearExpressionMapViewer</code> static fields
2 26 Feb 07 jari 123        */
2 26 Feb 07 jari 124       public void setColorBinPolicy(int binOption) {
2 26 Feb 07 jari 125         colorMode = binOption;      
2 26 Feb 07 jari 126       }
2 26 Feb 07 jari 127       
2 26 Feb 07 jari 128       /**
2 26 Feb 07 jari 129        * Sets bin colors
2 26 Feb 07 jari 130        * @param c1
2 26 Feb 07 jari 131        * @param c2
2 26 Feb 07 jari 132        * @param c3
2 26 Feb 07 jari 133        * @param c4
2 26 Feb 07 jari 134        */
2 26 Feb 07 jari 135       public void setBinColors(Color c1, Color c2, Color c3, Color c4) {
2 26 Feb 07 jari 136         this.c1 = c1;
2 26 Feb 07 jari 137         this.c2 = c2;
2 26 Feb 07 jari 138         this.c3 = c3;
2 26 Feb 07 jari 139         this.c4 = c4;        
2 26 Feb 07 jari 140       }
2 26 Feb 07 jari 141
2 26 Feb 07 jari 142       /**
2 26 Feb 07 jari 143        * sets bin cutoffs
2 26 Feb 07 jari 144        * @param c1
2 26 Feb 07 jari 145        * @param c2
2 26 Feb 07 jari 146        * @param mid
2 26 Feb 07 jari 147        * @param c3
2 26 Feb 07 jari 148        * @param c4
2 26 Feb 07 jari 149        */
2 26 Feb 07 jari 150       public void setBinCutoffs(float c1, float c2, float mid, float c3, float c4) {
2 26 Feb 07 jari 151         this.cutoff1 = c1;
2 26 Feb 07 jari 152         this.cutoff2 = c2;
2 26 Feb 07 jari 153         this.binMidValue = mid;
2 26 Feb 07 jari 154         this.cutoff3 = c3;
2 26 Feb 07 jari 155         this.cutoff4 = c4;        
2 26 Feb 07 jari 156       }
2 26 Feb 07 jari 157       
2 26 Feb 07 jari 158       /**
2 26 Feb 07 jari 159        * Sets arrow width property to match the rendered arrow width (shaft width)
2 26 Feb 07 jari 160        * @param arrowWidth
2 26 Feb 07 jari 161        */
2 26 Feb 07 jari 162       public void setArrowWidth(int arrowWidth) {
2 26 Feb 07 jari 163         this.arrowWidth = arrowWidth;
2 26 Feb 07 jari 164       }
2 26 Feb 07 jari 165       
2 26 Feb 07 jari 166       /**
2 26 Feb 07 jari 167        * Sets the width of the arrow 'wing' from shaft to secondary point
2 26 Feb 07 jari 168        * @param arrowWingWidth
2 26 Feb 07 jari 169        */
2 26 Feb 07 jari 170       public void setArrowWingWidth(int arrowWingWidth) {
2 26 Feb 07 jari 171         this.wingWidth = arrowWingWidth;
2 26 Feb 07 jari 172       }
2 26 Feb 07 jari 173       
2 26 Feb 07 jari 174       /**
2 26 Feb 07 jari 175        * Sets max and min experiment values.
2 26 Feb 07 jari 176        */
2 26 Feb 07 jari 177       public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 178           this.maxValue = maxValue;
2 26 Feb 07 jari 179           this.minValue = minValue;
2 26 Feb 07 jari 180       }
2 26 Feb 07 jari 181       
2 26 Feb 07 jari 182       /**
2 26 Feb 07 jari 183        * Sets positive and negative images
2 26 Feb 07 jari 184        */
2 26 Feb 07 jari 185       public void setNegAndPosColorImages(BufferedImage neg, BufferedImage pos){
2 26 Feb 07 jari 186           this.negColorImage = neg;
2 26 Feb 07 jari 187           this.posColorImage = pos;
2 26 Feb 07 jari 188       }
2 26 Feb 07 jari 189       
2 26 Feb 07 jari 190       /**
2 26 Feb 07 jari 191        * Sets flag to use a double gradient 
2 26 Feb 07 jari 192        */
2 26 Feb 07 jari 193       public void setUseDoubleGradient(boolean useDouble) {
2 26 Feb 07 jari 194         this.useDoubleGradient = useDouble;
2 26 Feb 07 jari 195       }    
2 26 Feb 07 jari 196        
2 26 Feb 07 jari 197       /**
2 26 Feb 07 jari 198        * Sets anti-aliasing property.
2 26 Feb 07 jari 199        */
2 26 Feb 07 jari 200       public void setAntiAliasing(boolean isAntiAliasing) {
2 26 Feb 07 jari 201           this.isAntiAliasing = isAntiAliasing;
2 26 Feb 07 jari 202       }
2 26 Feb 07 jari 203       
2 26 Feb 07 jari 204       /**
2 26 Feb 07 jari 205        * Sets the left margin for the header
2 26 Feb 07 jari 206        */
2 26 Feb 07 jari 207       public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 208           insets.left = leftMargin;
2 26 Feb 07 jari 209       }
2 26 Feb 07 jari 210       
2 26 Feb 07 jari 211       /**
2 26 Feb 07 jari 212        * Returns height of color bar for experiments
2 26 Feb 07 jari 213        */
2 26 Feb 07 jari 214       private int getColorBarHeight(){
2 26 Feb 07 jari 215           for( int sample = 0; sample < samplesOrder.length ; sample++){
2 26 Feb 07 jari 216               if(data.getExperimentColor(experiment.getSampleIndex(this.samplesOrder[sample])) != null)
2 26 Feb 07 jari 217                   return COLOR_BAR_HEIGHT;
2 26 Feb 07 jari 218           }
2 26 Feb 07 jari 219           return 0;
2 26 Feb 07 jari 220       }
2 26 Feb 07 jari 221       
2 26 Feb 07 jari 222       /**
2 26 Feb 07 jari 223        * Sets an element width.
2 26 Feb 07 jari 224        */
2 26 Feb 07 jari 225       public void setColumnSpacing(int width) {
2 26 Feb 07 jari 226           this.columnSpacing = width;
2 26 Feb 07 jari 227           if (width > 12) {
2 26 Feb 07 jari 228               width = 12;
2 26 Feb 07 jari 229           }
2 26 Feb 07 jari 230           setFont(new Font("monospaced", Font.PLAIN, width));
2 26 Feb 07 jari 231       }
2 26 Feb 07 jari 232       
2 26 Feb 07 jari 233       /**
2 26 Feb 07 jari 234        * Updates size of this header.
2 26 Feb 07 jari 235        */
2 26 Feb 07 jari 236       public void updateSizes(int contentWidth, int columnSpacing) {
2 26 Feb 07 jari 237           if(data == null)
2 26 Feb 07 jari 238               return;
2 26 Feb 07 jari 239           setColumnSpacing(columnSpacing);
2 26 Feb 07 jari 240           Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 241           if (g == null) {
2 26 Feb 07 jari 242               return;
2 26 Feb 07 jari 243           }
2 26 Feb 07 jari 244           if (isAntiAliasing) {
2 26 Feb 07 jari 245               g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 246               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 247           }
2 26 Feb 07 jari 248           FontMetrics hfm = g.getFontMetrics();
2 26 Feb 07 jari 249           int maxHeight = 0;
2 26 Feb 07 jari 250           String name;
2 26 Feb 07 jari 251           final int size = this.experiment.getNumberOfSamples();
2 26 Feb 07 jari 252           for (int feature = 0; feature < size; feature++) {
2 26 Feb 07 jari 253               name = data.getSampleName(experiment.getSampleIndex(feature));
2 26 Feb 07 jari 254               maxHeight = Math.max(maxHeight, hfm.stringWidth(name));
2 26 Feb 07 jari 255           }
2 26 Feb 07 jari 256           maxHeight += RECT_HEIGHT + hfm.getHeight() + 10;
2 26 Feb 07 jari 257           maxHeight += getColorBarHeight();
2 26 Feb 07 jari 258           if(contentWidth < MIN_WIDTH)
2 26 Feb 07 jari 259             contentWidth = MIN_WIDTH;
2 26 Feb 07 jari 260           setSize(contentWidth, maxHeight);
2 26 Feb 07 jari 261           setPreferredSize(new Dimension(contentWidth, maxHeight));
2 26 Feb 07 jari 262       }
2 26 Feb 07 jari 263       
2 26 Feb 07 jari 264       /**
2 26 Feb 07 jari 265        * Paints the header into specified graphics.
2 26 Feb 07 jari 266        */
2 26 Feb 07 jari 267       public void paint(Graphics g1D) {
2 26 Feb 07 jari 268           super.paint(g1D);
2 26 Feb 07 jari 269           if (data == null) {
2 26 Feb 07 jari 270               return;
2 26 Feb 07 jari 271           }
2 26 Feb 07 jari 272           Graphics2D g = (Graphics2D)g1D;
2 26 Feb 07 jari 273           if (isAntiAliasing) {
2 26 Feb 07 jari 274               g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 275               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 276           }
2 26 Feb 07 jari 277           drawHeader(g);
2 26 Feb 07 jari 278       }
2 26 Feb 07 jari 279       
2 26 Feb 07 jari 280       /**
2 26 Feb 07 jari 281        * Draws the header into specified graphics.
2 26 Feb 07 jari 282        */
2 26 Feb 07 jari 283       private void drawHeader(Graphics2D g) {
2 26 Feb 07 jari 284           final int samples = this.experiment.getNumberOfSamples();
2 26 Feb 07 jari 285           
2 26 Feb 07 jari 286           if (samples == 0) {
2 26 Feb 07 jari 287               return;
2 26 Feb 07 jari 288           }
2 26 Feb 07 jari 289           
2 26 Feb 07 jari 290           int width = samples*columnSpacing;
2 26 Feb 07 jari 291           if(width < MIN_WIDTH)
2 26 Feb 07 jari 292             width = MIN_WIDTH;
2 26 Feb 07 jari 293           
2 26 Feb 07 jari 294           int textWidth;
2 26 Feb 07 jari 295           FontMetrics hfm = g.getFontMetrics();
2 26 Feb 07 jari 296           int descent = hfm.getDescent();
2 26 Feb 07 jari 297           int fHeight = hfm.getHeight();          
2 26 Feb 07 jari 298
2 26 Feb 07 jari 299           //color image rep
2 26 Feb 07 jari 300           
2 26 Feb 07 jari 301           if(colorMode == LinearExpressionMapViewer.COLOR_MODE_GRADIENT){
2 26 Feb 07 jari 302             if(useDoubleGradient) {
2 26 Feb 07 jari 303               g.drawImage(this.negColorImage, insets.left, 0, (int)(width/2f), RECT_HEIGHT, null);
2 26 Feb 07 jari 304               g.drawImage(this.posColorImage, (int)((width)/2f + insets.left), 0, (int)(width/2.0), RECT_HEIGHT, null);
2 26 Feb 07 jari 305             } else {
2 26 Feb 07 jari 306               g.drawImage(this.posColorImage, insets.left, 0, width, RECT_HEIGHT, null);
2 26 Feb 07 jari 307             }
2 26 Feb 07 jari 308             
2 26 Feb 07 jari 309             //render limits
2 26 Feb 07 jari 310             g.setColor(Color.black);                        
2 26 Feb 07 jari 311             g.drawString(String.valueOf(this.minValue), insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 312             textWidth = hfm.stringWidth(String.valueOf(midValue));
2 26 Feb 07 jari 313             if(useDoubleGradient)
2 26 Feb 07 jari 314               g.drawString(String.valueOf(midValue), (int)(width/2f)-textWidth/2 + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 315             textWidth = hfm.stringWidth(String.valueOf(this.maxValue));
2 26 Feb 07 jari 316             g.drawString(String.valueOf(this.maxValue), width-textWidth + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 317
2 26 Feb 07 jari 318           } else if(colorMode == LinearExpressionMapViewer.COLOR_MODE_2_BIN) {
2 26 Feb 07 jari 319             //fill bins
2 26 Feb 07 jari 320             g.setColor(c1);
2 26 Feb 07 jari 321             g.fillRect(insets.left, 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 322             g.setColor(midColor);
2 26 Feb 07 jari 323             g.fillRect(insets.left + (int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 324             g.fillRect(insets.left + 2*(int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 325             g.setColor(c4);
2 26 Feb 07 jari 326             g.fillRect(insets.left + 3*(int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);                      
2 26 Feb 07 jari 327
2 26 Feb 07 jari 328             //outline bins
2 26 Feb 07 jari 329             g.setColor(Color.black);
2 26 Feb 07 jari 330             g.drawRect(insets.left, 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 331             g.drawRect(insets.left + (int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 332             g.drawRect(insets.left + 2*(int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);
2 26 Feb 07 jari 333             g.drawRect(insets.left + 3*(int)(width/4f), 0, (int)(width/4f), RECT_HEIGHT);    
2 26 Feb 07 jari 334
2 26 Feb 07 jari 335             //cutoff labels
2 26 Feb 07 jari 336             g.drawString(String.valueOf(cutoff1), insets.left + (int)(width/4f)- (hfm.stringWidth(String.valueOf(cutoff1))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 337             g.drawString(String.valueOf(binMidValue), insets.left + 2*(int)(width/4f)- (hfm.stringWidth(String.valueOf(binMidValue))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 338             g.drawString(String.valueOf(cutoff4), insets.left + 3*(int)(width/4f)- (hfm.stringWidth(String.valueOf(cutoff4))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 339             
2 26 Feb 07 jari 340           } else if(colorMode == LinearExpressionMapViewer.COLOR_MODE_4_BIN) {
2 26 Feb 07 jari 341             //fill bins
2 26 Feb 07 jari 342             g.setColor(c1);
2 26 Feb 07 jari 343             g.fillRect(insets.left, 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 344             g.setColor(c2);
2 26 Feb 07 jari 345             g.fillRect(insets.left + (int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 346             g.setColor(midColor);
2 26 Feb 07 jari 347             g.fillRect(insets.left + 2*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 348             g.fillRect(insets.left + 3*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 349             g.setColor(c3);
2 26 Feb 07 jari 350             g.fillRect(insets.left + 4*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);                      
2 26 Feb 07 jari 351             g.setColor(c4);
2 26 Feb 07 jari 352             g.fillRect(insets.left + 5*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);                      
2 26 Feb 07 jari 353
2 26 Feb 07 jari 354             //outline bins
2 26 Feb 07 jari 355             g.setColor(Color.black);
2 26 Feb 07 jari 356             g.drawRect(insets.left, 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 357             g.drawRect(insets.left + (int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 358             g.drawRect(insets.left + 2*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 359             g.drawRect(insets.left + 3*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);
2 26 Feb 07 jari 360             g.drawRect(insets.left + 4*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);                      
2 26 Feb 07 jari 361             g.drawRect(insets.left + 5*(int)(width/6f), 0, (int)(width/6f), RECT_HEIGHT);                                  
2 26 Feb 07 jari 362
2 26 Feb 07 jari 363             //cutoff labels
2 26 Feb 07 jari 364             g.drawString(String.valueOf(cutoff1), insets.left + (int)(width/6f) - (hfm.stringWidth(String.valueOf(cutoff1))/2), RECT_HEIGHT + fHeight);            
2 26 Feb 07 jari 365             g.drawString(String.valueOf(cutoff2), insets.left + 2*(int)(width/6f) - (hfm.stringWidth(String.valueOf(cutoff2))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 366             g.drawString(String.valueOf(binMidValue), insets.left + 3*(int)(width/6f) - (hfm.stringWidth(String.valueOf(binMidValue))/2), RECT_HEIGHT + fHeight);            
2 26 Feb 07 jari 367             g.drawString(String.valueOf(cutoff3), insets.left + 4*(int)(width/6f)- (hfm.stringWidth(String.valueOf(cutoff3))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 368             g.drawString(String.valueOf(cutoff4), insets.left + 5*(int)(width/6f)- (hfm.stringWidth(String.valueOf(cutoff4))/2), RECT_HEIGHT + fHeight);
2 26 Feb 07 jari 369           }
2 26 Feb 07 jari 370           
2 26 Feb 07 jari 371           //draw possible clusters
2 26 Feb 07 jari 372           int h = -getSize().height + 5;
2 26 Feb 07 jari 373           boolean hasColorBar = false;
2 26 Feb 07 jari 374           if(this.getColorBarHeight() > 0){
2 26 Feb 07 jari 375               h += COLOR_BAR_HEIGHT;
2 26 Feb 07 jari 376               hasColorBar = true;
2 26 Feb 07 jari 377           }
2 26 Feb 07 jari 378           
2 26 Feb 07 jari 379           // draw feature names
2 26 Feb 07 jari 380           String name;
2 26 Feb 07 jari 381           g.rotate(-Math.PI/2);
2 26 Feb 07 jari 382           int currX = insets.left + arrowWidth/2 + wingWidth + descent;
2 26 Feb 07 jari 383           for (int sample = 0; sample < samples; sample++) {
2 26 Feb 07 jari 384               name = data.getSampleName(experiment.getSampleIndex(this.samplesOrder[sample]));
2 26 Feb 07 jari 385               g.drawString(name, h, currX);
2 26 Feb 07 jari 386               currX += columnSpacing;              
2 26 Feb 07 jari 387           }
2 26 Feb 07 jari 388           g.rotate(Math.PI/2);
2 26 Feb 07 jari 389           
2 26 Feb 07 jari 390           if(hasColorBar){
2 26 Feb 07 jari 391               Color color;
2 26 Feb 07 jari 392               for(int sample = 0; sample < samples; sample++){
2 26 Feb 07 jari 393                   color = data.getExperimentColor(experiment.getSampleIndex(this.samplesOrder[sample]));
2 26 Feb 07 jari 394                   if(color != null)
2 26 Feb 07 jari 395                       g.setColor(color);
2 26 Feb 07 jari 396                   else
2 26 Feb 07 jari 397                       g.setColor(Color.white);
2 26 Feb 07 jari 398                   g.fillRect(sample*columnSpacing + insets.left, getSize().height - COLOR_BAR_HEIGHT - 2, columnSpacing, COLOR_BAR_HEIGHT);
2 26 Feb 07 jari 399               }
2 26 Feb 07 jari 400           }
2 26 Feb 07 jari 401       }
2 26 Feb 07 jari 402       
2 26 Feb 07 jari 403       /*
2 26 Feb 07 jari 404       private void writeObject(ObjectOutputStream oos) throws IOException {       
2 26 Feb 07 jari 405           oos.writeObject(experiment);              
2 26 Feb 07 jari 406           oos.writeObject(samplesOrder);
2 26 Feb 07 jari 407           oos.writeInt(columnSpacing);
2 26 Feb 07 jari 408           oos.writeObject(insets);
2 26 Feb 07 jari 409           oos.writeBoolean(useDoubleGradient);
2 26 Feb 07 jari 410       }
2 26 Feb 07 jari 411       
2 26 Feb 07 jari 412       
2 26 Feb 07 jari 413       private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {     
2 26 Feb 07 jari 414           experiment = (Experiment)ois.readObject();
2 26 Feb 07 jari 415           samplesOrder = (int[])ois.readObject();
2 26 Feb 07 jari 416           columnSpacing = ois.readInt();
2 26 Feb 07 jari 417           insets = (Insets)ois.readObject();
2 26 Feb 07 jari 418           this.useDoubleGradient = ois.readBoolean();
2 26 Feb 07 jari 419       }
2 26 Feb 07 jari 420       */
2 26 Feb 07 jari 421 }