mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LinearExpressionGraphViewer.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.BasicStroke;
2 26 Feb 07 jari 8 import java.awt.Color;
2 26 Feb 07 jari 9 import java.awt.Component;
2 26 Feb 07 jari 10 import java.awt.Dimension;
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.GridBagConstraints;
2 26 Feb 07 jari 14 import java.awt.GridBagLayout;
2 26 Feb 07 jari 15 import java.awt.Insets;
2 26 Feb 07 jari 16 import java.awt.RenderingHints;
2 26 Feb 07 jari 17 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 18 import java.awt.event.ActionListener;
2 26 Feb 07 jari 19 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 20 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 21 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 22 import java.beans.Expression;
2 26 Feb 07 jari 23 import java.util.Hashtable;
2 26 Feb 07 jari 24 import java.util.Vector;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import javax.swing.ButtonGroup;
2 26 Feb 07 jari 27 import javax.swing.JCheckBoxMenuItem;
2 26 Feb 07 jari 28 import javax.swing.JColorChooser;
2 26 Feb 07 jari 29 import javax.swing.JComponent;
2 26 Feb 07 jari 30 import javax.swing.JFrame;
2 26 Feb 07 jari 31 import javax.swing.JMenu;
2 26 Feb 07 jari 32 import javax.swing.JMenuItem;
2 26 Feb 07 jari 33 import javax.swing.JOptionPane;
2 26 Feb 07 jari 34 import javax.swing.JPanel;
2 26 Feb 07 jari 35 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 36 import javax.swing.JRadioButtonMenuItem;
2 26 Feb 07 jari 37 import javax.swing.JScrollBar;
2 26 Feb 07 jari 38 import javax.swing.JScrollPane;
2 26 Feb 07 jari 39 import javax.swing.JSplitPane;
2 26 Feb 07 jari 40 import javax.swing.JTable;
2 26 Feb 07 jari 41 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 42 import javax.swing.table.TableCellRenderer;
2 26 Feb 07 jari 43
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51 /**
2 26 Feb 07 jari 52  * @author braisted
2 26 Feb 07 jari 53  *
2 26 Feb 07 jari 54  * Class: LinearExpressionGraphViewer Description: Provides a multiple sample
2 26 Feb 07 jari 55  * expression view that is organized by chromosomal coordinates Each
2 26 Feb 07 jari 56  * chromosome, if there is more than one, will have a dedicated LEG in which
2 26 Feb 07 jari 57  * Loci are arranged based on coordinate order.
2 26 Feb 07 jari 58  * 
2 26 Feb 07 jari 59  */ 
2 26 Feb 07 jari 60 public class LinearExpressionGraphViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 61
2 26 Feb 07 jari 62   private JSplitPane splitPane;
2 26 Feb 07 jari 63   private Graph graph;
2 26 Feb 07 jari 64   private SampleTable table;
2 26 Feb 07 jari 65   private IData idata;  
2 26 Feb 07 jari 66   private int numberOfSamples;
2 26 Feb 07 jari 67   private boolean overlay = false;
2 26 Feb 07 jari 68   private IFramework framework;
2 26 Feb 07 jari 69   private JPopupMenu popup;
2 26 Feb 07 jari 70   private boolean showRefLine = false;
2 26 Feb 07 jari 71   private int exptID = 0;
2 26 Feb 07 jari 72   
2 26 Feb 07 jari 73   //EH state-saving additions
2 26 Feb 07 jari 74   String chrID;
2 26 Feb 07 jari 75   String[] sortedLocusIDs;
2 26 Feb 07 jari 76   int[] sortedStartArray, sortedEndArray;
2 26 Feb 07 jari 77   Experiment fullExperiment, reducedExperiment;
2 26 Feb 07 jari 78   int[][] replicates;
2 26 Feb 07 jari 79   String locusIDFieldName;
2 26 Feb 07 jari 80   
2 26 Feb 07 jari 81   
2 26 Feb 07 jari 82   /**
2 26 Feb 07 jari 83    * Class: LinearExpressionGraphViewer Description: Provides a multiple sample
2 26 Feb 07 jari 84    * expression view that is organized by chromosomal coordinates Each
2 26 Feb 07 jari 85    * chromosome, if there is more than one, will have a dedicated LEG in which
2 26 Feb 07 jari 86    * Loci are arranged based on coordinate order.
2 26 Feb 07 jari 87    * 
2 26 Feb 07 jari 88    * 
2 26 Feb 07 jari 89    * @param fullExperiment
2 26 Feb 07 jari 90    *            The current Experiment from IFramwork
2 26 Feb 07 jari 91    * @param reducedExperiment
2 26 Feb 07 jari 92    *            The reduced and sorted (by min coord.) Experiment
2 26 Feb 07 jari 93    * @param sortedLocusIDs
2 26 Feb 07 jari 94    *            Sorted Locus IDs
2 26 Feb 07 jari 95    * @param sortedStartArray
2 26 Feb 07 jari 96    *            Sorted min coordinates for each loci.
2 26 Feb 07 jari 97    * @param sortedEndArray
2 26 Feb 07 jari 98    *            Sorted max coordinates for each loci.
2 26 Feb 07 jari 99    * @param isForward
2 26 Feb 07 jari 100    *            Indicates if a loci is transcribe forward or reverse (rel. to
2 26 Feb 07 jari 101    *            coord. system)
2 26 Feb 07 jari 102    * @param strata
2 26 Feb 07 jari 103    *            renders loci that overlap as an offset from the main linear
2 26 Feb 07 jari 104    *            map.
2 26 Feb 07 jari 105    * @param chrID
2 26 Feb 07 jari 106    *            Identifies the chromosome in view.
2 26 Feb 07 jari 107    */    
2 26 Feb 07 jari 108   public LinearExpressionGraphViewer(Experiment fullExperiment,
2 26 Feb 07 jari 109       Experiment reducedExperiment, String[] sortedLocusIDs, int [] sortedStartArray,
2 26 Feb 07 jari 110         int[] sortedEndArray, int [][] replicates,
2 26 Feb 07 jari 111       String chrID, String locusIDFieldName) {
2 26 Feb 07 jari 112
2 26 Feb 07 jari 113     super(new GridBagLayout());
2 26 Feb 07 jari 114     
2 26 Feb 07 jari 115       this.numberOfSamples = fullExperiment.getNumberOfSamples();
2 26 Feb 07 jari 116       splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, graph, table);
2 26 Feb 07 jari 117       splitPane.setResizeWeight(1.0);
2 26 Feb 07 jari 118       splitPane.setDividerLocation(0.7);
2 26 Feb 07 jari 119       
2 26 Feb 07 jari 120       Listener listener = new Listener();
2 26 Feb 07 jari 121       popup = contructMenu(listener);
2 26 Feb 07 jari 122       
2 26 Feb 07 jari 123       //EH state-saving
2 26 Feb 07 jari 124       this.chrID = chrID;
2 26 Feb 07 jari 125       this.sortedLocusIDs = sortedLocusIDs;
2 26 Feb 07 jari 126       this.sortedStartArray = sortedStartArray;
2 26 Feb 07 jari 127       this.sortedEndArray = sortedEndArray;
2 26 Feb 07 jari 128       this.replicates = replicates;
2 26 Feb 07 jari 129       this.locusIDFieldName = locusIDFieldName;
2 26 Feb 07 jari 130       this.fullExperiment = fullExperiment;
2 26 Feb 07 jari 131       this.reducedExperiment = reducedExperiment;
2 26 Feb 07 jari 132   }
2 26 Feb 07 jari 133
2 26 Feb 07 jari 134   /**
2 26 Feb 07 jari 135    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExpression()
2 26 Feb 07 jari 136    */
2 26 Feb 07 jari 137   public Expression getExpression(){
2 26 Feb 07 jari 138     return new Expression(this, this.getClass(), "new", 
2 26 Feb 07 jari 139       new Object[]{this.fullExperiment, this.reducedExperiment, 
2 26 Feb 07 jari 140         this.sortedLocusIDs, this.sortedStartArray,
2 26 Feb 07 jari 141         this.sortedEndArray, this.replicates, 
2 26 Feb 07 jari 142         this.chrID, this.locusIDFieldName}); 
2 26 Feb 07 jari 143   }
2 26 Feb 07 jari 144   
2 26 Feb 07 jari 145   /**
2 26 Feb 07 jari 146    * Updates the viewer to display the display mode
2 26 Feb 07 jari 147    *
2 26 Feb 07 jari 148    */
2 26 Feb 07 jari 149   private void updateViewerModeView() {
2 26 Feb 07 jari 150     this.removeAll();
2 26 Feb 07 jari 151     if(overlay) {          
2 26 Feb 07 jari 152       add(splitPane, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 153
2 26 Feb 07 jari 154       //start in connected points view mode to make overlay meaningful
2 26 Feb 07 jari 155       graph.getGraphComponent().enableDiscreteValueOverlay(false);
2 26 Feb 07 jari 156       graph.getGraphComponent().enableOffsetLinesMode(false);
2 26 Feb 07 jari 157       
2 26 Feb 07 jari 158       graph.validateView();
2 26 Feb 07 jari 159       splitPane.validate();
2 26 Feb 07 jari 160       splitPane.setDividerLocation(0.7);
2 26 Feb 07 jari 161       repaint();
2 26 Feb 07 jari 162     } else {    
2 26 Feb 07 jari 163       graph.removeGraphComponent();
2 26 Feb 07 jari 164       add(graph.getGraphComponent(), new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));      
2 26 Feb 07 jari 165       graph.getGraphComponent().refreshGraph();
2 26 Feb 07 jari 166     }    
2 26 Feb 07 jari 167   }
2 26 Feb 07 jari 168   
2 26 Feb 07 jari 169   /**
2 26 Feb 07 jari 170    * Graph customization.
2 26 Feb 07 jari 171    * Pulls graph properties, constructs customization dialog, directs graph to
2 26 Feb 07 jari 172    * conform to input values.
2 26 Feb 07 jari 173    */
2 26 Feb 07 jari 174   private void customizeGraph() {
2 26 Feb 07 jari 175     Hashtable props = graph.getGraphComponent().getGraphProperties();
2 26 Feb 07 jari 176     
2 26 Feb 07 jari 177     GraphScaleCustomizationDialog dialog = new GraphScaleCustomizationDialog((JFrame)framework.getFrame(), true, props);    
2 26 Feb 07 jari 178     
2 26 Feb 07 jari 179     if(dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 180
2 26 Feb 07 jari 181       //grab the graph component            
2 26 Feb 07 jari 182       LEMGraphViewer lemGraph = graph.getGraphComponent();      
2 26 Feb 07 jari 183       
2 26 Feb 07 jari 184       //collect settings and forward to graph viewer
2 26 Feb 07 jari 185       int yRangeMode = dialog.getYRangeMode();
2 26 Feb 07 jari 186       
2 26 Feb 07 jari 187       lemGraph.setYAxisRangeMode(yRangeMode);
2 26 Feb 07 jari 188
2 26 Feb 07 jari 189       
2 26 Feb 07 jari 190       if(yRangeMode == 1 ) {//GraphScaleCustomizationDialog.YRANGE_OPTION_CUSTOM_RANGE) {
2 26 Feb 07 jari 191         lemGraph.setYRange(dialog.getYMin(), dialog.getYMax());
2 26 Feb 07 jari 192         lemGraph.setTicInterval(dialog.getYTicInterval());
2 26 Feb 07 jari 193       }
2 26 Feb 07 jari 194       
2 26 Feb 07 jari 195       lemGraph.setShowXAxis(dialog.showXAxisLine());
2 26 Feb 07 jari 196       lemGraph.setXAxisStroke(dialog.getXAxisStyle());
2 26 Feb 07 jari 197       lemGraph.setXAxisColor(dialog.getXAxisColor());
2 26 Feb 07 jari 198       lemGraph.setXAxisCrossPoint(dialog.getXAxisCrossPoint());
2 26 Feb 07 jari 199
2 26 Feb 07 jari 200       lemGraph.enableOffsetLinesMode(dialog.isOffsetLinesModeSelected());
2 26 Feb 07 jari 201       lemGraph.setOffsetLinesMidpoint(dialog.getOffsetMidpoint());
2 26 Feb 07 jari 202       
2 26 Feb 07 jari 203       lemGraph.setOffsetLinesMin(dialog.getOffsetMin());
2 26 Feb 07 jari 204       lemGraph.setOffsetLinesMax(dialog.getOffsetMax());
2 26 Feb 07 jari 205       lemGraph.enableDiscreteValueOverlay(dialog.getShowOverlay());
2 26 Feb 07 jari 206       
2 26 Feb 07 jari 207       lemGraph.refreshGraph();
2 26 Feb 07 jari 208     }
2 26 Feb 07 jari 209     
2 26 Feb 07 jari 210   }
2 26 Feb 07 jari 211   
2 26 Feb 07 jari 212   /**
2 26 Feb 07 jari 213    * Return the graph's content component
2 26 Feb 07 jari 214    */
2 26 Feb 07 jari 215   public JComponent getContentComponent() {
2 26 Feb 07 jari 216     return this;
2 26 Feb 07 jari 217   }
2 26 Feb 07 jari 218
2 26 Feb 07 jari 219   /**
2 26 Feb 07 jari 220    * returns the header component
2 26 Feb 07 jari 221    */
2 26 Feb 07 jari 222   public JComponent getHeaderComponent() {
2 26 Feb 07 jari 223       
2 26 Feb 07 jari 224       //JB, 5/5/06 state saving requires that graph be created
2 26 Feb 07 jari 225       //in onSelected but getHeaderComponent() is called first
2 26 Feb 07 jari 226       //construct graph to provide linked header rather than a new header
2 26 Feb 07 jari 227       
2 26 Feb 07 jari 228     
2 26 Feb 07 jari 229       if(graph == null){
2 26 Feb 07 jari 230           graph = new Graph(fullExperiment, reducedExperiment.getMatrix().A, chrID, sortedLocusIDs, sortedStartArray, sortedEndArray);
2 26 Feb 07 jari 231       
2 26 Feb 07 jari 232          // JB 5/5/06 can't construct table without idata
2 26 Feb 07 jari 233          // so set graph line and marker colors in onSelected 
2 26 Feb 07 jari 234          // graph.setSampleLineColors(table.lineColorVector);
2 26 Feb 07 jari 235          // graph.setSampleMarkerColors(table.markerColorVector);
2 26 Feb 07 jari 236           graph.getGraphComponent().addMouseListener(new Listener());
2 26 Feb 07 jari 237           graph.getGraphComponent().enableOverlay(overlay);
2 26 Feb 07 jari 238           splitPane.setTopComponent(graph);
2 26 Feb 07 jari 239       }
2 26 Feb 07 jari 240       return graph.getGraphComponent().getHeaderComponent();
2 26 Feb 07 jari 241   }
2 26 Feb 07 jari 242
2 26 Feb 07 jari 243   /**
2 26 Feb 07 jari 244    * Returns the row header component 
2 26 Feb 07 jari 245    */
2 26 Feb 07 jari 246   public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 247     return null;
2 26 Feb 07 jari 248   }
2 26 Feb 07 jari 249
2 26 Feb 07 jari 250   /**
2 26 Feb 07 jari 251    * Returns the cornoer component
2 26 Feb 07 jari 252    */
2 26 Feb 07 jari 253   public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 254     return null;
2 26 Feb 07 jari 255   }
2 26 Feb 07 jari 256
2 26 Feb 07 jari 257   /**
2 26 Feb 07 jari 258    * Prepares the viewer for display
2 26 Feb 07 jari 259    * Framework is MeV's IFramework object
2 26 Feb 07 jari 260    */
2 26 Feb 07 jari 261   public void onSelected(IFramework framework) {
2 26 Feb 07 jari 262     this.framework = framework;
2 26 Feb 07 jari 263     this.idata = framework.getData();
2 26 Feb 07 jari 264   
2 26 Feb 07 jari 265     if(table == null) {
2 26 Feb 07 jari 266       table = new SampleTable();
2 26 Feb 07 jari 267       //JB: 5/5/06 add to bottom component of split pane
2 26 Feb 07 jari 268       splitPane.setBottomComponent(table);
2 26 Feb 07 jari 269     }
2 26 Feb 07 jari 270       
2 26 Feb 07 jari 271     if(graph == null){
2 26 Feb 07 jari 272       graph = new Graph(fullExperiment, reducedExperiment.getMatrix().A, chrID, sortedLocusIDs, sortedStartArray, sortedEndArray);
2 26 Feb 07 jari 273       graph.setSampleLineColors(table.lineColorVector);
2 26 Feb 07 jari 274       graph.setSampleMarkerColors(table.markerColorVector);
2 26 Feb 07 jari 275       graph.getGraphComponent().addMouseListener(new Listener());
2 26 Feb 07 jari 276       graph.getGraphComponent().enableOverlay(overlay);
2 26 Feb 07 jari 277       //JB: 5/5/06 add to top component of split pane
2 26 Feb 07 jari 278       splitPane.setTopComponent(graph);
2 26 Feb 07 jari 279     }  
2 26 Feb 07 jari 280     
2 26 Feb 07 jari 281     //set these to coordinate
2 26 Feb 07 jari 282     graph.setSampleLineColors(table.lineColorVector);
2 26 Feb 07 jari 283     graph.setSampleMarkerColors(table.markerColorVector);
2 26 Feb 07 jari 284     
2 26 Feb 07 jari 285     updateViewerModeView();
2 26 Feb 07 jari 286     graph.onSelected(framework);
2 26 Feb 07 jari 287   }
2 26 Feb 07 jari 288
2 26 Feb 07 jari 289
2 26 Feb 07 jari 290   /**
2 26 Feb 07 jari 291    * handles data changes, IViewer interface method
2 26 Feb 07 jari 292    */
2 26 Feb 07 jari 293   public void onDataChanged(IData data) {    
2 26 Feb 07 jari 294   }
2 26 Feb 07 jari 295
2 26 Feb 07 jari 296
2 26 Feb 07 jari 297   /**
2 26 Feb 07 jari 298    * handles menu option changes (display menu)
2 26 Feb 07 jari 299    */
2 26 Feb 07 jari 300   public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 301     graph.getGraphComponent().onMenuChanged(menu);    
2 26 Feb 07 jari 302   }
2 26 Feb 07 jari 303
2 26 Feb 07 jari 304   /**
2 26 Feb 07 jari 305    * Handles deselection of the node
2 26 Feb 07 jari 306    */
2 26 Feb 07 jari 307   public void onDeselected() { }
2 26 Feb 07 jari 308
2 26 Feb 07 jari 309   /**
2 26 Feb 07 jari 310    * Handles closing event
2 26 Feb 07 jari 311    */
2 26 Feb 07 jari 312   public void onClosed() { }
2 26 Feb 07 jari 313
2 26 Feb 07 jari 314   /**
2 26 Feb 07 jari 315    * Returns the image, handled in MAV
2 26 Feb 07 jari 316    */
2 26 Feb 07 jari 317   public BufferedImage getImage() {
2 26 Feb 07 jari 318     return null;
2 26 Feb 07 jari 319   }
2 26 Feb 07 jari 320
2 26 Feb 07 jari 321   /**
2 26 Feb 07 jari 322    * Returns the cluster index object
2 26 Feb 07 jari 323    */
2 26 Feb 07 jari 324   public int[][] getClusters() {
2 26 Feb 07 jari 325     return null;
2 26 Feb 07 jari 326   }
2 26 Feb 07 jari 327
2 26 Feb 07 jari 328   /**
2 26 Feb 07 jari 329    * returns the experiment
2 26 Feb 07 jari 330    */
2 26 Feb 07 jari 331   public Experiment getExperiment() {
2 26 Feb 07 jari 332     return null;
2 26 Feb 07 jari 333   }
2 26 Feb 07 jari 334
2 26 Feb 07 jari 335   /**
2 26 Feb 07 jari 336    * Returns the viewer type 
2 26 Feb 07 jari 337    */
2 26 Feb 07 jari 338   public int getViewerType() {    
2 26 Feb 07 jari 339     return 0;
2 26 Feb 07 jari 340   }
2 26 Feb 07 jari 341
2 26 Feb 07 jari 342   /**
2 26 Feb 07 jari 343    * Builds the menu
2 26 Feb 07 jari 344    *
2 26 Feb 07 jari 345    * @param listener 
2 26 Feb 07 jari 346    * @return
2 26 Feb 07 jari 347    */
2 26 Feb 07 jari 348   private JPopupMenu contructMenu(Listener listener) {
2 26 Feb 07 jari 349     JPopupMenu menu = new JPopupMenu();
2 26 Feb 07 jari 350     
2 26 Feb 07 jari 351     JMenu submenu = new JMenu("Viewer Mode");
2 26 Feb 07 jari 352     ButtonGroup bg = new ButtonGroup();
2 26 Feb 07 jari 353     
2 26 Feb 07 jari 354     JRadioButtonMenuItem buttonItem = new JRadioButtonMenuItem("Tile Graphs", true);
2 26 Feb 07 jari 355     buttonItem.setFocusPainted(false);
2 26 Feb 07 jari 356     buttonItem.setActionCommand("tile-mode-command");
2 26 Feb 07 jari 357     buttonItem.addActionListener(listener);
2 26 Feb 07 jari 358     bg.add(buttonItem);
2 26 Feb 07 jari 359     submenu.add(buttonItem);    
2 26 Feb 07 jari 360         
2 26 Feb 07 jari 361     buttonItem = new JRadioButtonMenuItem("Overlay Graphs");
2 26 Feb 07 jari 362     buttonItem.setFocusPainted(false);
2 26 Feb 07 jari 363     buttonItem.setActionCommand("overlay-mode-command");
2 26 Feb 07 jari 364     buttonItem.addActionListener(listener);
2 26 Feb 07 jari 365     bg.add(buttonItem);
2 26 Feb 07 jari 366     submenu.add(buttonItem);    
2 26 Feb 07 jari 367     
2 26 Feb 07 jari 368     menu.add(submenu);
2 26 Feb 07 jari 369     
2 26 Feb 07 jari 370     JMenuItem item = new JMenuItem("Customize Graph");
2 26 Feb 07 jari 371     item.setFocusPainted(false);
2 26 Feb 07 jari 372     item.setActionCommand("customize-graph-range-command");
2 26 Feb 07 jari 373     item.addActionListener(listener);
2 26 Feb 07 jari 374     menu.addSeparator();
2 26 Feb 07 jari 375     menu.add(item);
2 26 Feb 07 jari 376     
2 26 Feb 07 jari 377     JCheckBoxMenuItem box = new JCheckBoxMenuItem("Show Locus Reference Line", false);
2 26 Feb 07 jari 378     box.setFocusPainted(false);
2 26 Feb 07 jari 379     box.setActionCommand("show-reference-line-command");
2 26 Feb 07 jari 380     box.addActionListener(listener);
2 26 Feb 07 jari 381     menu.add(box);
2 26 Feb 07 jari 382     
2 26 Feb 07 jari 383     item = new JMenuItem("Zoom Out (reset X range)");
2 26 Feb 07 jari 384     item.setFocusPainted(false);
2 26 Feb 07 jari 385     item.setActionCommand("reset-x-range-command");
2 26 Feb 07 jari 386     item.addActionListener(listener);
2 26 Feb 07 jari 387     menu.addSeparator();
2 26 Feb 07 jari 388     menu.add(item);
2 26 Feb 07 jari 389         
2 26 Feb 07 jari 390     return menu;
2 26 Feb 07 jari 391   }
2 26 Feb 07 jari 392   
2 26 Feb 07 jari 393   /**
2 26 Feb 07 jari 394    * 
2 26 Feb 07 jari 395    * @author braisted
2 26 Feb 07 jari 396    *
2 26 Feb 07 jari 397    * The SampleTable object displays the hybs that can be displayed in graphs
2 26 Feb 07 jari 398    * This class extends JTable and contains a JTable objext.
2 26 Feb 07 jari 399    */
2 26 Feb 07 jari 400   public class SampleTable extends JPanel {
2 26 Feb 07 jari 401
2 26 Feb 07 jari 402     protected JTable table;
2 26 Feb 07 jari 403     protected SampleTableModel model;
2 26 Feb 07 jari 404     protected JScrollPane pane;
2 26 Feb 07 jari 405     
2 26 Feb 07 jari 406       protected Vector lineColorVector;
2 26 Feb 07 jari 407       protected Vector markerColorVector;
2 26 Feb 07 jari 408       protected int numberOfLineColors;
2 26 Feb 07 jari 409       protected int numberOfMarkerColors;
2 26 Feb 07 jari 410       private int ROW_HEIGHT = 20;
2 26 Feb 07 jari 411       private int VISIBLE_ROWS = 8;
2 26 Feb 07 jari 412       
2 26 Feb 07 jari 413     public SampleTable() {
2 26 Feb 07 jari 414       super(new GridBagLayout());
2 26 Feb 07 jari 415       
2 26 Feb 07 jari 416       //default line colors
2 26 Feb 07 jari 417       lineColorVector = new Vector();
2 26 Feb 07 jari 418       lineColorVector.add(Color.lightGray);
2 26 Feb 07 jari 419       lineColorVector.add(Color.pink);
2 26 Feb 07 jari 420       lineColorVector.add(new Color(108,108,255)); //darker lavender
2 26 Feb 07 jari 421       lineColorVector.add(new Color(128,180,128)); //sage green
2 26 Feb 07 jari 422       lineColorVector.add(new Color(201,70,20)); //burnt sienna
2 26 Feb 07 jari 423       lineColorVector.add(new Color(77,140,149)); //dark green-blue      
2 26 Feb 07 jari 424       lineColorVector.add(new Color(173,52,131)); //dark magenta
2 26 Feb 07 jari 425       numberOfLineColors = lineColorVector.size();
2 26 Feb 07 jari 426       
2 26 Feb 07 jari 427       //default marker colors
2 26 Feb 07 jari 428       markerColorVector = new Vector();            
2 26 Feb 07 jari 429       markerColorVector.add(Color.blue);
2 26 Feb 07 jari 430       markerColorVector.add(Color.black);
2 26 Feb 07 jari 431       markerColorVector.add(new Color(92, 74, 145));
2 26 Feb 07 jari 432       markerColorVector.add(Color.gray);
2 26 Feb 07 jari 433       markerColorVector.add(new Color(7,120,67));      
2 26 Feb 07 jari 434       numberOfMarkerColors = markerColorVector.size();
2 26 Feb 07 jari 435
2 26 Feb 07 jari 436       //get sample names
2 26 Feb 07 jari 437       Vector headerNames = idata.getSampleAnnotationFieldNames(); 
2 26 Feb 07 jari 438       int numSampleAnnFields = headerNames.size();
2 26 Feb 07 jari 439       //append additional columns
2 26 Feb 07 jari 440       headerNames.add("Key");
2 26 Feb 07 jari 441       headerNames.add("Line Color");
2 26 Feb 07 jari 442       headerNames.add("Marker Color");      
2 26 Feb 07 jari 443       
2 26 Feb 07 jari 444       Object [][] data = new Object[numberOfSamples][headerNames.size()];
2 26 Feb 07 jari 445
2 26 Feb 07 jari 446       //construct new vectors for line and marker colors
2 26 Feb 07 jari 447       Vector newLineColorVector = new Vector();
2 26 Feb 07 jari 448       Vector newMarkerColorVector = new Vector();
2 26 Feb 07 jari 449       
2 26 Feb 07 jari 450       table = new JTable(); //just a temp to get default sel. background
2 26 Feb 07 jari 451       
2 26 Feb 07 jari 452       for(int i = 0; i < data.length; i++) {
2 26 Feb 07 jari 453         for(int j = 0; j < data[0].length; j++) {
2 26 Feb 07 jari 454           if(j < numSampleAnnFields)
2 26 Feb 07 jari 455             data[i][j] = idata.getSampleAnnotation(i, (String)headerNames.get(j));
2 26 Feb 07 jari 456           else {
2 26 Feb 07 jari 457             if(j == data[0].length-2) {
2 26 Feb 07 jari 458               data [i][j] = (Color)lineColorVector.get(i%numberOfLineColors);
2 26 Feb 07 jari 459               newLineColorVector.add(data[i][j]);
2 26 Feb 07 jari 460             } else if(j == data[0].length-1) {
2 26 Feb 07 jari 461               data [i][j] = (Color)markerColorVector.get(i%numberOfMarkerColors);
2 26 Feb 07 jari 462               newMarkerColorVector.add(data[i][j]);
2 26 Feb 07 jari 463             } else if(j == data[0].length-3) {
2 26 Feb 07 jari 464               data [i][j] = new LinePreview((Color)markerColorVector.get(i%numberOfMarkerColors), (Color)lineColorVector.get(i%numberOfLineColors), table.getSelectionBackground());
2 26 Feb 07 jari 465             }
2 26 Feb 07 jari 466           }
2 26 Feb 07 jari 467         }
2 26 Feb 07 jari 468       }
2 26 Feb 07 jari 469       
2 26 Feb 07 jari 470       //assign vectors reflecting current table
2 26 Feb 07 jari 471       lineColorVector = newLineColorVector;
2 26 Feb 07 jari 472       markerColorVector = newMarkerColorVector;      
2 26 Feb 07 jari 473                   
2 26 Feb 07 jari 474       model = new SampleTableModel(data, headerNames);
2 26 Feb 07 jari 475       table = new JTable(model);    
2 26 Feb 07 jari 476             
2 26 Feb 07 jari 477       table.setRowHeight(20);
2 26 Feb 07 jari 478       LEGTableCellRenderer renderer = new LEGTableCellRenderer();
2 26 Feb 07 jari 479       table.setDefaultRenderer(Color.class, renderer);
2 26 Feb 07 jari 480       table.setDefaultRenderer(LinePreview.class, renderer);
2 26 Feb 07 jari 481       
2 26 Feb 07 jari 482       table.addMouseListener(new TableListener());
2 26 Feb 07 jari 483       
2 26 Feb 07 jari 484       pane = new JScrollPane(table);      
2 26 Feb 07 jari 485       pane.setColumnHeaderView(table.getTableHeader());
2 26 Feb 07 jari 486       
2 26 Feb 07 jari 487       add(pane, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));          
2 26 Feb 07 jari 488   
2 26 Feb 07 jari 489       table.getSelectionModel().setSelectionInterval(0,0);
2 26 Feb 07 jari 490       Dimension dim = new Dimension(400, Math.min(VISIBLE_ROWS*ROW_HEIGHT, data.length*ROW_HEIGHT));
2 26 Feb 07 jari 491
2 26 Feb 07 jari 492       setPreferredSize(dim);
2 26 Feb 07 jari 493       setSize(dim);
2 26 Feb 07 jari 494     }
2 26 Feb 07 jari 495     
2 26 Feb 07 jari 496     /**
2 26 Feb 07 jari 497      * handles mouse events such as table row selection and graph display
2 26 Feb 07 jari 498      */
2 26 Feb 07 jari 499     public void processMouseEvent(MouseEvent me) {
2 26 Feb 07 jari 500       if(me.isPopupTrigger())
2 26 Feb 07 jari 501         return;
2 26 Feb 07 jari 502         
2 26 Feb 07 jari 503       int row = table.getSelectedRow();
2 26 Feb 07 jari 504       int col = table.getSelectedColumn();
2 26 Feb 07 jari 505             
2 26 Feb 07 jari 506       if(col >= table.getColumnCount()-2) {    
2 26 Feb 07 jari 507         Color color = JColorChooser.showDialog(LinearExpressionGraphViewer.this, "Color Selection", (Color)(table.getValueAt(row,col)));
2 26 Feb 07 jari 508         if(color != null) {          
2 26 Feb 07 jari 509           table.setValueAt(color, row, col);
2 26 Feb 07 jari 510           getPreviewPanel(row).setColors(getLineColor(row), getMarkerColor(col));
2 26 Feb 07 jari 511           if(col == table.getColumnCount()-2) {
2 26 Feb 07 jari 512             //update the vector
2 26 Feb 07 jari 513             lineColorVector.setElementAt(color, row);
2 26 Feb 07 jari 514             //update the graph
2 26 Feb 07 jari 515             graph.setSampleLineColors(lineColorVector);
2 26 Feb 07 jari 516           } else {
2 26 Feb 07 jari 517             //update the vector
2 26 Feb 07 jari 518             markerColorVector.setElementAt(color, row);            
2 26 Feb 07 jari 519             //update the graph
2 26 Feb 07 jari 520             graph.setSampleMarkerColors(markerColorVector);
2 26 Feb 07 jari 521           }
2 26 Feb 07 jari 522           //repaint updated color scheme
2 26 Feb 07 jari 523           graph.getGraphComponent().repaint();
2 26 Feb 07 jari 524         }
2 26 Feb 07 jari 525         table.repaint();
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      * Returns the line color for a particular row
2 26 Feb 07 jari 531      * @param row row index
2 26 Feb 07 jari 532      * @return line color
2 26 Feb 07 jari 533      */
2 26 Feb 07 jari 534     private Color getLineColor(int row) {
2 26 Feb 07 jari 535       return (Color)(table.getValueAt(row, table.getColumnCount()-2));
2 26 Feb 07 jari 536     }
2 26 Feb 07 jari 537
2 26 Feb 07 jari 538     /**
2 26 Feb 07 jari 539      * Returns the marker color for a particular row
2 26 Feb 07 jari 540      * @param row row index
2 26 Feb 07 jari 541      * @return marker color
2 26 Feb 07 jari 542      */
2 26 Feb 07 jari 543     private Color getMarkerColor(int row) {
2 26 Feb 07 jari 544       return (Color)(table.getValueAt(row, table.getColumnCount()-1));
2 26 Feb 07 jari 545     }
2 26 Feb 07 jari 546     
2 26 Feb 07 jari 547     /**
2 26 Feb 07 jari 548      * Returns the <code>LinePreview</code> for the given row
2 26 Feb 07 jari 549      * @param row row index
2 26 Feb 07 jari 550      * @return line style preview object
2 26 Feb 07 jari 551      */
2 26 Feb 07 jari 552     private LinePreview getPreviewPanel(int row) {
2 26 Feb 07 jari 553       return ((LinePreview)(table.getValueAt(row, table.getColumnCount()-3)));
2 26 Feb 07 jari 554     }
2 26 Feb 07 jari 555
2 26 Feb 07 jari 556     /**
2 26 Feb 07 jari 557      * Returns the selected rows in the table
2 26 Feb 07 jari 558      * @return row indices
2 26 Feb 07 jari 559      */
2 26 Feb 07 jari 560     public int [] getSelectedRows() {
2 26 Feb 07 jari 561       return table.getSelectedRows();
2 26 Feb 07 jari 562     }
2 26 Feb 07 jari 563     
2 26 Feb 07 jari 564     /**
2 26 Feb 07 jari 565      * sets the row selection
2 26 Feb 07 jari 566      * @param start first row index
2 26 Feb 07 jari 567      * @param end last row index
2 26 Feb 07 jari 568      */
2 26 Feb 07 jari 569     public void setSelectedRows(int start, int end) {
2 26 Feb 07 jari 570       table.getSelectionModel().setSelectionInterval(start, end);
2 26 Feb 07 jari 571       table.repaint();
2 26 Feb 07 jari 572     }
2 26 Feb 07 jari 573     
2 26 Feb 07 jari 574     /**
2 26 Feb 07 jari 575      * 
2 26 Feb 07 jari 576      * @author braisted
2 26 Feb 07 jari 577      *
2 26 Feb 07 jari 578      * Custom table model.  Holds and delivers table data.
2 26 Feb 07 jari 579      */
2 26 Feb 07 jari 580     public class SampleTableModel extends AbstractTableModel {
2 26 Feb 07 jari 581
2 26 Feb 07 jari 582       //data
2 26 Feb 07 jari 583       private Object [][] data;
2 26 Feb 07 jari 584       //header names
2 26 Feb 07 jari 585       private Vector headerNames;
2 26 Feb 07 jari 586       
2 26 Feb 07 jari 587       /**
2 26 Feb 07 jari 588        * Constructor
2 26 Feb 07 jari 589        * @param data table data
2 26 Feb 07 jari 590        * @param header header names
2 26 Feb 07 jari 591        */
2 26 Feb 07 jari 592       public SampleTableModel(Object data [][], Vector header) {
2 26 Feb 07 jari 593         super();
2 26 Feb 07 jari 594         this.data = data;
2 26 Feb 07 jari 595         this.headerNames = header;
2 26 Feb 07 jari 596       }
2 26 Feb 07 jari 597       
2 26 Feb 07 jari 598       /**
2 26 Feb 07 jari 599        * Returns the number of columns
2 26 Feb 07 jari 600        */
2 26 Feb 07 jari 601       public int getColumnCount() {        
2 26 Feb 07 jari 602         if(data.length == 0)
2 26 Feb 07 jari 603           return 0;
2 26 Feb 07 jari 604         else
2 26 Feb 07 jari 605           return data[0].length;
2 26 Feb 07 jari 606       }
2 26 Feb 07 jari 607
2 26 Feb 07 jari 608       /**
2 26 Feb 07 jari 609        * Returns the row count
2 26 Feb 07 jari 610        */
2 26 Feb 07 jari 611       public int getRowCount() {
2 26 Feb 07 jari 612         return data.length;
2 26 Feb 07 jari 613       }
2 26 Feb 07 jari 614       
2 26 Feb 07 jari 615       /**
2 26 Feb 07 jari 616        * Returns the column name for col (column index)
2 26 Feb 07 jari 617        */
2 26 Feb 07 jari 618       public String getColumnName(int col) {
2 26 Feb 07 jari 619         return (String)(headerNames.get(col));
2 26 Feb 07 jari 620       }
2 26 Feb 07 jari 621
2 26 Feb 07 jari 622       /**
2 26 Feb 07 jari 623        * Returns the value at the specified location
2 26 Feb 07 jari 624        */
2 26 Feb 07 jari 625       public Object getValueAt(int rowIndex, int columnIndex) {
2 26 Feb 07 jari 626         return data[rowIndex][columnIndex];
2 26 Feb 07 jari 627       }
2 26 Feb 07 jari 628       
2 26 Feb 07 jari 629       /**
2 26 Feb 07 jari 630        * Sets the value at the specified location
2 26 Feb 07 jari 631        */
2 26 Feb 07 jari 632       public void setValueAt(Object obj, int row, int col) {
2 26 Feb 07 jari 633         data[row][col] = obj;
2 26 Feb 07 jari 634       }
2 26 Feb 07 jari 635       
2 26 Feb 07 jari 636       /**
2 26 Feb 07 jari 637        * Returns true if the cell at row, col is editable
2 26 Feb 07 jari 638        * (Color columns)
2 26 Feb 07 jari 639        */
2 26 Feb 07 jari 640         public boolean isCellEditable(int row, int col) {          
2 26 Feb 07 jari 641           //last two color columns are editable          
2 26 Feb 07 jari 642           return (col >= table.getColumnCount()-2);
2 26 Feb 07 jari 643         }
2 26 Feb 07 jari 644         
2 26 Feb 07 jari 645         /**
2 26 Feb 07 jari 646          * Returns the class of the specified column
2 26 Feb 07 jari 647          */
2 26 Feb 07 jari 648         public Class getColumnClass(int col) {
2 26 Feb 07 jari 649           if(col == headerNames.size()-3)
2 26 Feb 07 jari 650             return LinePreview.class;
2 26 Feb 07 jari 651           if(col >= headerNames.size()-2)
2 26 Feb 07 jari 652             return Color.class;          
2 26 Feb 07 jari 653           return String.class;        
2 26 Feb 07 jari 654         }
2 26 Feb 07 jari 655       
2 26 Feb 07 jari 656     }
2 26 Feb 07 jari 657     
2 26 Feb 07 jari 658     /**
2 26 Feb 07 jari 659      * 
2 26 Feb 07 jari 660      * @author braisted
2 26 Feb 07 jari 661      *
2 26 Feb 07 jari 662      * Custom renderer for the table that can show Strings or line previews
2 26 Feb 07 jari 663      */
2 26 Feb 07 jari 664     public class LEGTableCellRenderer implements TableCellRenderer {
2 26 Feb 07 jari 665
2 26 Feb 07 jari 666       private JPanel panel;
2 26 Feb 07 jari 667
2 26 Feb 07 jari 668       /**
2 26 Feb 07 jari 669        * Constructs a renderer
2 26 Feb 07 jari 670        */
2 26 Feb 07 jari 671       public LEGTableCellRenderer() {
2 26 Feb 07 jari 672         panel = new JPanel();
2 26 Feb 07 jari 673       }
2 26 Feb 07 jari 674       
2 26 Feb 07 jari 675       /**
2 26 Feb 07 jari 676        * Retruns the renderer component, see TableCellRenderer for details
2 26 Feb 07 jari 677        */
2 26 Feb 07 jari 678       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
2 26 Feb 07 jari 679         
2 26 Feb 07 jari 680         //if it's a preview, set it selected, return value
2 26 Feb 07 jari 681         if(value instanceof LinePreview) {
2 26 Feb 07 jari 682           ((LinePreview)value).setSelected(isSelected);
2 26 Feb 07 jari 683           return (LinePreview)value;
2 26 Feb 07 jari 684         }
2 26 Feb 07 jari 685         
2 26 Feb 07 jari 686         //if it's a color return it
2 26 Feb 07 jari 687         if(value instanceof Color) {
2 26 Feb 07 jari 688           panel.setBackground((Color)value);
2 26 Feb 07 jari 689           return panel;
2 26 Feb 07 jari 690         }
2 26 Feb 07 jari 691         
2 26 Feb 07 jari 692         //else return null (String cells handle themselves)
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   
2 26 Feb 07 jari 698     /**
2 26 Feb 07 jari 699      * 
2 26 Feb 07 jari 700      * @author braisted
2 26 Feb 07 jari 701      *
2 26 Feb 07 jari 702      * LinePreview class extends JPanel and render the line and marker colors
2 26 Feb 07 jari 703      * 
2 26 Feb 07 jari 704      */
2 26 Feb 07 jari 705     public class LinePreview extends JPanel {
2 26 Feb 07 jari 706       private Color markerColor;
2 26 Feb 07 jari 707       private Color lineColor;
2 26 Feb 07 jari 708       private Color backgroundColor;
2 26 Feb 07 jari 709       private Color selectedBackgroundColor;
2 26 Feb 07 jari 710       private int x1, x2, y;
2 26 Feb 07 jari 711       private boolean selected;
2 26 Feb 07 jari 712       
2 26 Feb 07 jari 713       /**
2 26 Feb 07 jari 714        * Constructs a LinePreview
2 26 Feb 07 jari 715        * @param marker marker color
2 26 Feb 07 jari 716        * @param line line color
2 26 Feb 07 jari 717        * @param selBackgroundColor background color
2 26 Feb 07 jari 718        */
2 26 Feb 07 jari 719       public LinePreview(Color marker, Color line, Color selBackgroundColor) {
2 26 Feb 07 jari 720         super();
2 26 Feb 07 jari 721         markerColor = marker; 
2 26 Feb 07 jari 722         lineColor = line;
2 26 Feb 07 jari 723         setBackground(Color.white);
2 26 Feb 07 jari 724         backgroundColor = Color.white;
2 26 Feb 07 jari 725         selectedBackgroundColor = selBackgroundColor;        
2 26 Feb 07 jari 726         this.setPreferredSize(new Dimension(90, 25));
2 26 Feb 07 jari 727         x1 = 10;
2 26 Feb 07 jari 728         x2 = 10;
2 26 Feb 07 jari 729         y = 10;
2 26 Feb 07 jari 730       }
2 26 Feb 07 jari 731       
2 26 Feb 07 jari 732       /**
2 26 Feb 07 jari 733        * Sets marker color
2 26 Feb 07 jari 734        * @param color marker color
2 26 Feb 07 jari 735        */
2 26 Feb 07 jari 736       public void setMarkerColor(Color color) {
2 26 Feb 07 jari 737         markerColor = color;
2 26 Feb 07 jari 738       }
2 26 Feb 07 jari 739       
2 26 Feb 07 jari 740       /**
2 26 Feb 07 jari 741        * Sets line color
2 26 Feb 07 jari 742        * @param color line color
2 26 Feb 07 jari 743        */
2 26 Feb 07 jari 744       public void setLineColor(Color color) {
2 26 Feb 07 jari 745         lineColor = color;
2 26 Feb 07 jari 746       }
2 26 Feb 07 jari 747       
2 26 Feb 07 jari 748       /**
2 26 Feb 07 jari 749        * Sets line and marker color
2 26 Feb 07 jari 750        * @param c1 line color
2 26 Feb 07 jari 751        * @param c2 marker color
2 26 Feb 07 jari 752        */
2 26 Feb 07 jari 753       public void setColors(Color c1, Color c2) {
2 26 Feb 07 jari 754         lineColor = c1;
2 26 Feb 07 jari 755         markerColor = c2;
2 26 Feb 07 jari 756       }
2 26 Feb 07 jari 757       
2 26 Feb 07 jari 758       /**
2 26 Feb 07 jari 759        * Sets the selected field
2 26 Feb 07 jari 760        * @param selected true if preview is selected
2 26 Feb 07 jari 761        */
2 26 Feb 07 jari 762       public void setSelected(boolean selected) {
2 26 Feb 07 jari 763         this.selected = selected;
2 26 Feb 07 jari 764       }
2 26 Feb 07 jari 765       
2 26 Feb 07 jari 766       /**
2 26 Feb 07 jari 767        * Renders the line preview
2 26 Feb 07 jari 768        */
2 26 Feb 07 jari 769       public void paint(Graphics g) {
2 26 Feb 07 jari 770         if(!selected)
2 26 Feb 07 jari 771           setBackground(backgroundColor);
2 26 Feb 07 jari 772         else
2 26 Feb 07 jari 773           setBackground(selectedBackgroundColor);
2 26 Feb 07 jari 774         
2 26 Feb 07 jari 775         
2 26 Feb 07 jari 776         super.paint(g);
2 26 Feb 07 jari 777         Graphics2D g2 = (Graphics2D)g;
2 26 Feb 07 jari 778         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
2 26 Feb 07 jari 779         Dimension dim = this.getSize();
2 26 Feb 07 jari 780       
2 26 Feb 07 jari 781         g.setColor(lineColor);
2 26 Feb 07 jari 782         g.drawLine(x1, y, dim.width-x2, y);
2 26 Feb 07 jari 783         g.drawLine(x1, y+1, dim.width-x2, y+1);
2 26 Feb 07 jari 784         
2 26 Feb 07 jari 785         g.setColor(markerColor);
2 26 Feb 07 jari 786         g.fillOval(x1, y-1, 4,4);
2 26 Feb 07 jari 787         g.fillOval(dim.width - x2, y-1, 4, 4);                
2 26 Feb 07 jari 788       }
2 26 Feb 07 jari 789       
2 26 Feb 07 jari 790     }
2 26 Feb 07 jari 791   }
2 26 Feb 07 jari 792   
2 26 Feb 07 jari 793   /**
2 26 Feb 07 jari 794    * 
2 26 Feb 07 jari 795    * @author braisted
2 26 Feb 07 jari 796    *
2 26 Feb 07 jari 797    * The Graph class contains the LEMGraphViewer which actually displays the graph
2 26 Feb 07 jari 798    * this JPanel extention serves as a conatainer that can be embedded into the viewer.
2 26 Feb 07 jari 799    */
2 26 Feb 07 jari 800   public class Graph extends JPanel {
2 26 Feb 07 jari 801     private LEMGraphViewer graph;
2 26 Feb 07 jari 802     private JScrollBar horizGraphBar;    
2 26 Feb 07 jari 803     private boolean compressX;    
2 26 Feb 07 jari 804     JScrollPane pane;
2 26 Feb 07 jari 805     
2 26 Feb 07 jari 806     /**
2 26 Feb 07 jari 807      * Constructs the Graph object
2 26 Feb 07 jari 808      * @param fullExp the full experiment
2 26 Feb 07 jari 809      * @param data expression data
2 26 Feb 07 jari 810      * @param title graph's title
2 26 Feb 07 jari 811      * @param locusNames list of locus names
2 26 Feb 07 jari 812      * @param start start coordinates
2 26 Feb 07 jari 813      * @param end end coordinates
2 26 Feb 07 jari 814      */
2 26 Feb 07 jari 815     public Graph(Experiment fullExp, float [][] data, String title, String [] locusNames, int [] start, int [] end) {
2 26 Feb 07 jari 816       super(new GridBagLayout());
2 26 Feb 07 jari 817       setBackground(Color.white);
2 26 Feb 07 jari 818       
2 26 Feb 07 jari 819       Hashtable initProps = getInitialProperties();
2 26 Feb 07 jari 820       
2 26 Feb 07 jari 821       graph = new LEMGraphViewer(fullExp, data, title, initProps, locusNames, start, end);
2 26 Feb 07 jari 822       pane = new JScrollPane(graph);
2 26 Feb 07 jari 823       
2 26 Feb 07 jari 824       add(pane, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 825
2 26 Feb 07 jari 826       int indices [] = new int[]{0};
2 26 Feb 07 jari 827
2 26 Feb 07 jari 828       setGraphsToDisplay(indices);
2 26 Feb 07 jari 829       setBackground(Color.green);
2 26 Feb 07 jari 830     }
2 26 Feb 07 jari 831     
2 26 Feb 07 jari 832     /**
2 26 Feb 07 jari 833      * Builds the initial properties for the viewer
2 26 Feb 07 jari 834      * @return hashtable of properties
2 26 Feb 07 jari 835      */
2 26 Feb 07 jari 836     private Hashtable getInitialProperties() {
2 26 Feb 07 jari 837       Hashtable props = new Hashtable();
2 26 Feb 07 jari 838
2 26 Feb 07 jari 839       props.put("is-overlay-mode", new Boolean(false));
2 26 Feb 07 jari 840         props.put("y-range-mode", new Integer(GraphScaleCustomizationDialog.YRANGE_OPTION_DISPLAY_MENU));              
2 26 Feb 07 jari 841         props.put("y-axis-symetry", new Boolean(false));
2 26 Feb 07 jari 842         
2 26 Feb 07 jari 843         props.put("show-x-axis", new Boolean(true));      
2 26 Feb 07 jari 844         props.put("x-axis-color", Color.lightGray);
2 26 Feb 07 jari 845         props.put("x-axis-stroke", new BasicStroke(1f));
2 26 Feb 07 jari 846         
2 26 Feb 07 jari 847         props.put("offset-lines-mode", new Boolean(true));
2 26 Feb 07 jari 848         props.put("offset-graph-midpoint", new Float(0f));
2 26 Feb 07 jari 849     
2 26 Feb 07 jari 850         props.put("offset-graph-min", new Float(0f));
2 26 Feb 07 jari 851         props.put("offset-graph-max", new Float(0f));
2 26 Feb 07 jari 852       props.put("show-discrete-overlay", new Boolean(false));              
2 26 Feb 07 jari 853               
2 26 Feb 07 jari 854       return props;
2 26 Feb 07 jari 855     }
2 26 Feb 07 jari 856     
2 26 Feb 07 jari 857     /**
2 26 Feb 07 jari 858      * Sets the sample line colors
2 26 Feb 07 jari 859      * @param lineColors line colors
2 26 Feb 07 jari 860      */    
2 26 Feb 07 jari 861     public void setSampleLineColors(Vector lineColors) {
2 26 Feb 07 jari 862       graph.setSampleLineColors(lineColors);
2 26 Feb 07 jari 863     }
2 26 Feb 07 jari 864
2 26 Feb 07 jari 865     /**
2 26 Feb 07 jari 866      * Sets the marker colors
2 26 Feb 07 jari 867      * @param markerColors
2 26 Feb 07 jari 868      */
2 26 Feb 07 jari 869     public void setSampleMarkerColors(Vector markerColors) {
2 26 Feb 07 jari 870       graph.setSampleMarkerColors(markerColors);
2 26 Feb 07 jari 871     }
2 26 Feb 07 jari 872     
2 26 Feb 07 jari 873     /**
2 26 Feb 07 jari 874      * sets the graphs to display
2 26 Feb 07 jari 875      * @param selectedGraphs list of graph indices
2 26 Feb 07 jari 876      */
2 26 Feb 07 jari 877     public void setGraphsToDisplay(int [] selectedGraphs) {
2 26 Feb 07 jari 878       graph.setGraphsToDisplay(selectedGraphs);
2 26 Feb 07 jari 879     }
2 26 Feb 07 jari 880     
2 26 Feb 07 jari 881     /**
2 26 Feb 07 jari 882      * IViewer helper to pass on the LEMGraphViewer
2 26 Feb 07 jari 883      * @param framework
2 26 Feb 07 jari 884      */
2 26 Feb 07 jari 885     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 886       graph.onSelected(framework);
2 26 Feb 07 jari 887     }
2 26 Feb 07 jari 888     
2 26 Feb 07 jari 889     /**
2 26 Feb 07 jari 890      * returns the graph component
2 26 Feb 07 jari 891      * @return LEMGraphViewer conponent
2 26 Feb 07 jari 892      */
2 26 Feb 07 jari 893     public LEMGraphViewer getGraphComponent() {
2 26 Feb 07 jari 894       return graph;
2 26 Feb 07 jari 895     }
2 26 Feb 07 jari 896     
2 26 Feb 07 jari 897     /**
2 26 Feb 07 jari 898      * Validates the viewer, following resizing
2 26 Feb 07 jari 899      */
2 26 Feb 07 jari 900     public void validateView() {
2 26 Feb 07 jari 901       pane.setViewportView(graph);
2 26 Feb 07 jari 902       validate();
2 26 Feb 07 jari 903     }
2 26 Feb 07 jari 904
2 26 Feb 07 jari 905     /**
2 26 Feb 07 jari 906      * Removes the current graph component
2 26 Feb 07 jari 907      * 
2 26 Feb 07 jari 908      * often used during state changes
2 26 Feb 07 jari 909      */
2 26 Feb 07 jari 910     public void removeGraphComponent() {
2 26 Feb 07 jari 911       pane.remove(graph);
2 26 Feb 07 jari 912     }
2 26 Feb 07 jari 913
2 26 Feb 07 jari 914   }
2 26 Feb 07 jari 915   
2 26 Feb 07 jari 916   
2 26 Feb 07 jari 917   /**
2 26 Feb 07 jari 918    * 
2 26 Feb 07 jari 919    * @author braisted
2 26 Feb 07 jari 920    *
2 26 Feb 07 jari 921    * Listens to table events, updates viewer list to display
2 26 Feb 07 jari 922    */
2 26 Feb 07 jari 923   public class TableListener extends MouseAdapter{
2 26 Feb 07 jari 924     public void mouseReleased(MouseEvent me) {
2 26 Feb 07 jari 925       graph.setGraphsToDisplay(table.getSelectedRows());
2 26 Feb 07 jari 926       table.processMouseEvent(me);
2 26 Feb 07 jari 927     }
2 26 Feb 07 jari 928   }
2 26 Feb 07 jari 929   
2 26 Feb 07 jari 930   
2 26 Feb 07 jari 931   /**
2 26 Feb 07 jari 932    * 
2 26 Feb 07 jari 933    * @author braisted
2 26 Feb 07 jari 934    *
2 26 Feb 07 jari 935    * Menu listener
2 26 Feb 07 jari 936    */
2 26 Feb 07 jari 937   public class Listener extends MouseAdapter implements ActionListener {
2 26 Feb 07 jari 938
2 26 Feb 07 jari 939     public void actionPerformed(ActionEvent ae) {
2 26 Feb 07 jari 940       String command = ae.getActionCommand();
2 26 Feb 07 jari 941     
2 26 Feb 07 jari 942       if(command.equals("overlay-mode-command")) {
2 26 Feb 07 jari 943         overlay = true;
2 26 Feb 07 jari 944         graph.getGraphComponent().enableOverlay(overlay);
2 26 Feb 07 jari 945         splitPane.validate();
2 26 Feb 07 jari 946         table.setSelectedRows(0,0); //select first row
2 26 Feb 07 jari 947         graph.setGraphsToDisplay(table.getSelectedRows());
2 26 Feb 07 jari 948         updateViewerModeView();
2 26 Feb 07 jari 949         framework.refreshCurrentViewer();
2 26 Feb 07 jari 950         framework.getFrame().validate();
2 26 Feb 07 jari 951         framework.getFrame().repaint();        
2 26 Feb 07 jari 952       } else if(command.equals("tile-mode-command")) {
2 26 Feb 07 jari 953         overlay = false;      
2 26 Feb 07 jari 954         graph.getGraphComponent().enableOverlay(overlay);        
2 26 Feb 07 jari 955         updateViewerModeView();
2 26 Feb 07 jari 956         framework.refreshCurrentViewer();
2 26 Feb 07 jari 957         framework.getFrame().validate();
2 26 Feb 07 jari 958         framework.getFrame().repaint();              
2 26 Feb 07 jari 959       } else if(command.equals("customize-graph-range-command")) {
2 26 Feb 07 jari 960         customizeGraph();
2 26 Feb 07 jari 961       } else if(command.equals("show-reference-line-command")) {
2 26 Feb 07 jari 962         showRefLine = !showRefLine;
2 26 Feb 07 jari 963         graph.getGraphComponent().toggleReferenceLine();
2 26 Feb 07 jari 964       } else if(command.equals("reset-x-range-command")) {
2 26 Feb 07 jari 965         graph.getGraphComponent().resetXRange();
2 26 Feb 07 jari 966       }
2 26 Feb 07 jari 967     }
2 26 Feb 07 jari 968     
2 26 Feb 07 jari 969     public void mouseReleased(MouseEvent me) {
2 26 Feb 07 jari 970       if(me.isPopupTrigger()) {
2 26 Feb 07 jari 971         popup.show(graph.getGraphComponent(), me.getX(), me.getY());  
2 26 Feb 07 jari 972         return;
2 26 Feb 07 jari 973       }
2 26 Feb 07 jari 974       
2 26 Feb 07 jari 975       int column = table.getSelectedRows()[0];
2 26 Feb 07 jari 976       
2 26 Feb 07 jari 977     }
2 26 Feb 07 jari 978
2 26 Feb 07 jari 979     public void mousePressed(MouseEvent me) {
2 26 Feb 07 jari 980       if(me.isPopupTrigger())
2 26 Feb 07 jari 981         popup.show(graph.getGraphComponent(), me.getX(), me.getY());        
2 26 Feb 07 jari 982     }
2 26 Feb 07 jari 983   }
2 26 Feb 07 jari 984
2 26 Feb 07 jari 985
2 26 Feb 07 jari 986   /**
2 26 Feb 07 jari 987    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperiment(org.tigr.microarray.mev.cluster.gui.Experiment)
2 26 Feb 07 jari 988    */
2 26 Feb 07 jari 989   public void setExperiment(Experiment e) {
2 26 Feb 07 jari 990     
2 26 Feb 07 jari 991   }
2 26 Feb 07 jari 992
2 26 Feb 07 jari 993
2 26 Feb 07 jari 994
2 26 Feb 07 jari 995   /* (non-Javadoc)
2 26 Feb 07 jari 996    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExperimentID()
2 26 Feb 07 jari 997    */
2 26 Feb 07 jari 998   public int getExperimentID() {
2 26 Feb 07 jari 999     return this.exptID;
2 26 Feb 07 jari 1000   }
2 26 Feb 07 jari 1001
2 26 Feb 07 jari 1002
2 26 Feb 07 jari 1003
2 26 Feb 07 jari 1004   /* (non-Javadoc)
2 26 Feb 07 jari 1005    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperimentID(int)
2 26 Feb 07 jari 1006    */
2 26 Feb 07 jari 1007   public void setExperimentID(int id) {
2 26 Feb 07 jari 1008     this.exptID = id;
2 26 Feb 07 jari 1009   }
2 26 Feb 07 jari 1010
2 26 Feb 07 jari 1011
2 26 Feb 07 jari 1012   
2 26 Feb 07 jari 1013 }