mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LEMSelectionEditor.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.FontMetrics;
2 26 Feb 07 jari 10 import java.awt.Graphics;
2 26 Feb 07 jari 11 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 12 import java.awt.GridBagLayout;
2 26 Feb 07 jari 13 import java.awt.Insets;
2 26 Feb 07 jari 14 import java.awt.Toolkit;
2 26 Feb 07 jari 15 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 16 import java.awt.event.ActionListener;
2 26 Feb 07 jari 17 import java.awt.event.KeyEvent;
2 26 Feb 07 jari 18 import java.awt.event.KeyListener;
2 26 Feb 07 jari 19 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 20 import java.awt.event.MouseListener;
2 26 Feb 07 jari 21 import java.awt.event.WindowAdapter;
2 26 Feb 07 jari 22 import java.util.Vector;
2 26 Feb 07 jari 23
2 26 Feb 07 jari 24 import javax.swing.BorderFactory;
2 26 Feb 07 jari 25 import javax.swing.JCheckBoxMenuItem;
2 26 Feb 07 jari 26 import javax.swing.JDialog;
2 26 Feb 07 jari 27 import javax.swing.JFrame;
2 26 Feb 07 jari 28 import javax.swing.JMenu;
2 26 Feb 07 jari 29 import javax.swing.JMenuBar;
2 26 Feb 07 jari 30 import javax.swing.JMenuItem;
2 26 Feb 07 jari 31 import javax.swing.JOptionPane;
2 26 Feb 07 jari 32 import javax.swing.JPanel;
2 26 Feb 07 jari 33 import javax.swing.JScrollPane;
2 26 Feb 07 jari 34 import javax.swing.JTable;
2 26 Feb 07 jari 35 import javax.swing.JTextPane;
2 26 Feb 07 jari 36 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 import org.tigr.graph.GC;
2 26 Feb 07 jari 39 import org.tigr.graph.GraphLine;
2 26 Feb 07 jari 40 import org.tigr.graph.GraphPoint;
2 26 Feb 07 jari 41 import org.tigr.graph.GraphTick;
2 26 Feb 07 jari 42 import org.tigr.graph.GraphViewer;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.AlgorithmDialog;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.ParameterPanel;
2 26 Feb 07 jari 46 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 47 import org.tigr.util.QSort;
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49 /**
2 26 Feb 07 jari 50  * @author braisted
2 26 Feb 07 jari 51  * 
2 26 Feb 07 jari 52  * The LEMSelectionEditor presents a table of selected loci.
2 26 Feb 07 jari 53  * A graph representation of each selected loci can be displayed.
2 26 Feb 07 jari 54  * File output and list editing is supported.
2 26 Feb 07 jari 55  */
2 26 Feb 07 jari 56 public class LEMSelectionEditor extends AlgorithmDialog {
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58   private JTable selectionList;
2 26 Feb 07 jari 59   private LinearExpressionMapViewer lem;
2 26 Feb 07 jari 60   private SelectionTableModel model;
2 26 Feb 07 jari 61   private JTable table;
2 26 Feb 07 jari 62   private JMenu saveSelectedMenu;
2 26 Feb 07 jari 63   private JMenu fileMenu;
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65   
2 26 Feb 07 jari 66   private JPanel mainpanel;
2 26 Feb 07 jari 67   private JTextPane infoPane;
2 26 Feb 07 jari 68   private ParameterPanel locusTablePanel;
2 26 Feb 07 jari 69   private String infoText;
2 26 Feb 07 jari 70
2 26 Feb 07 jari 71   private IData data;
2 26 Feb 07 jari 72   private int numSamples;
2 26 Feb 07 jari 73   private Vector selectedIndices;
2 26 Feb 07 jari 74   private FloatMatrix meanMatrix;
2 26 Feb 07 jari 75   private JCheckBoxMenuItem coloredLociBox;
2 26 Feb 07 jari 76   private JMenuItem hideGraphItem;
2 26 Feb 07 jari 77   private boolean showGraph;
2 26 Feb 07 jari 78   
2 26 Feb 07 jari 79   private LocusGraph locusGraph;
2 26 Feb 07 jari 80
2 26 Feb 07 jari 81   
2 26 Feb 07 jari 82   public LEMSelectionEditor (JFrame frame, LinearExpressionMapViewer lem, Vector selectedIndices) {
2 26 Feb 07 jari 83     super(frame, "LEM Locus Selection List", false);
2 26 Feb 07 jari 84     
2 26 Feb 07 jari 85     this.lem = lem;
2 26 Feb 07 jari 86     this.meanMatrix = lem.getLocusMeanMatrix();
2 26 Feb 07 jari 87     numSamples = lem.getExperiment().getNumberOfSamples();
2 26 Feb 07 jari 88     
2 26 Feb 07 jari 89     this.selectedIndices = selectedIndices;
2 26 Feb 07 jari 90     showGraph = true;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     // infoPanel
2 26 Feb 07 jari 93     infoPane = new JTextPane();
2 26 Feb 07 jari 94     infoPane.setContentType("text/html");
2 26 Feb 07 jari 95     infoPane.setEditable(false);
2 26 Feb 07 jari 96     infoPane.setBackground(Color.white);
2 26 Feb 07 jari 97     infoPane.setBorder(BorderFactory.createLineBorder(Color.black, 1));
2 26 Feb 07 jari 98
2 26 Feb 07 jari 99     infoText = "<html><body><font size = 5><b><u><center>Locus Selection List</center></u></b></font>";
2 26 Feb 07 jari 100     infoText += "<center>Use <b>shift-left-click</b> on a locus arrow to add to the list.<br></center>";
2 26 Feb 07 jari 101     infoText += "</body></html>";
2 26 Feb 07 jari 102     infoPane.setText(infoText);
2 26 Feb 07 jari 103     
2 26 Feb 07 jari 104     infoPane.setMargin(new Insets(5,20,5,20));
2 26 Feb 07 jari 105     Dimension dim = new Dimension(200, 80);
2 26 Feb 07 jari 106     infoPane.setPreferredSize(dim);
2 26 Feb 07 jari 107     infoPane.setSize(dim);
2 26 Feb 07 jari 108     
2 26 Feb 07 jari 109     //menu
2 26 Feb 07 jari 110     JMenuBar menu = new JMenuBar();
2 26 Feb 07 jari 111     Listener listener = new Listener();
2 26 Feb 07 jari 112     
2 26 Feb 07 jari 113     fileMenu = new JMenu("File");    
2 26 Feb 07 jari 114     
2 26 Feb 07 jari 115     saveSelectedMenu = new JMenu("Save Selected Loci");
2 26 Feb 07 jari 116         
2 26 Feb 07 jari 117     JMenuItem item = new JMenuItem("Locus Level Detail");
2 26 Feb 07 jari 118     item.setActionCommand("save-selected-loci-detail-command");
2 26 Feb 07 jari 119     item.addActionListener(listener);
2 26 Feb 07 jari 120     saveSelectedMenu.add(item);
2 26 Feb 07 jari 121         
2 26 Feb 07 jari 122     item = new JMenuItem("Spot Level Detail");
2 26 Feb 07 jari 123     item.setActionCommand("save-selected-spot-detail-command");
2 26 Feb 07 jari 124     item.addActionListener(listener);
2 26 Feb 07 jari 125     saveSelectedMenu.add(item);
2 26 Feb 07 jari 126     
2 26 Feb 07 jari 127     fileMenu.add(saveSelectedMenu);
2 26 Feb 07 jari 128     
2 26 Feb 07 jari 129     JMenu saveAllMenu = new JMenu("Save All Loci");
2 26 Feb 07 jari 130     
2 26 Feb 07 jari 131     item = new JMenuItem("Locus Level Detail");
2 26 Feb 07 jari 132     item.setActionCommand("save-all-loci-detail-command");
2 26 Feb 07 jari 133     item.addActionListener(listener);
2 26 Feb 07 jari 134     saveAllMenu.add(item);
2 26 Feb 07 jari 135         
2 26 Feb 07 jari 136     item = new JMenuItem("Spot Level Detail");
2 26 Feb 07 jari 137     item.setActionCommand("save-all-spot-detail-command");
2 26 Feb 07 jari 138     item.addActionListener(listener);
2 26 Feb 07 jari 139     saveAllMenu.add(item);
2 26 Feb 07 jari 140
2 26 Feb 07 jari 141     fileMenu.add(saveAllMenu);
2 26 Feb 07 jari 142     
2 26 Feb 07 jari 143     JMenu selectMenu = new JMenu("Select");
2 26 Feb 07 jari 144     
2 26 Feb 07 jari 145     item = new JMenuItem("Locus List Selection");
2 26 Feb 07 jari 146     item.setActionCommand("loci-list-selection-command");
2 26 Feb 07 jari 147     item.addActionListener(listener);
2 26 Feb 07 jari 148     selectMenu.add(item);
2 26 Feb 07 jari 149     
2 26 Feb 07 jari 150     item = new JMenuItem("Base Range Selection");
2 26 Feb 07 jari 151     item.setActionCommand("base-range-selection-command");
2 26 Feb 07 jari 152     item.addActionListener(listener);
2 26 Feb 07 jari 153     selectMenu.add(item);
2 26 Feb 07 jari 154     
2 26 Feb 07 jari 155     /*JMenu viewMenu = new JMenu("View");
2 26 Feb 07 jari 156     showExpressionGraphItem = new JMenuItem("Show Expression Graphs");
2 26 Feb 07 jari 157     
2 26 Feb 07 jari 158     if(selectedIndices.size() == 0)
2 26 Feb 07 jari 159       showExpressionGraphItem.setEnabled(false);
2 26 Feb 07 jari 160
2 26 Feb 07 jari 161     showExpressionGraphItem.setActionCommand("toggle-show-expression-graph-command");
2 26 Feb 07 jari 162       */
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     JMenu viewerMenu = new JMenu("Graph Options");
2 26 Feb 07 jari 165     
2 26 Feb 07 jari 166     hideGraphItem = new JMenuItem("Hide Locus Graph");
2 26 Feb 07 jari 167     hideGraphItem.setActionCommand("toggle-hide-graph-command");
2 26 Feb 07 jari 168     hideGraphItem.addActionListener(listener);
2 26 Feb 07 jari 169     viewerMenu.add(hideGraphItem);
2 26 Feb 07 jari 170     
2 26 Feb 07 jari 171     coloredLociBox = new JCheckBoxMenuItem("Multi-colored Graphs", false);
2 26 Feb 07 jari 172     coloredLociBox.setActionCommand("toggle-multi-colored-graphs");
2 26 Feb 07 jari 173     coloredLociBox.addActionListener(listener);
2 26 Feb 07 jari 174     viewerMenu.add(coloredLociBox);
2 26 Feb 07 jari 175     
2 26 Feb 07 jari 176     menu.add(fileMenu);
2 26 Feb 07 jari 177     menu.add(selectMenu);
2 26 Feb 07 jari 178     menu.add(viewerMenu);
2 26 Feb 07 jari 179     menu.setBorder(BorderFactory.createLineBorder(Color.black));
2 26 Feb 07 jari 180     menu.setMinimumSize(new Dimension(100, 20));
2 26 Feb 07 jari 181     menu.setMaximumSize(new Dimension(1000, 20));
2 26 Feb 07 jari 182         
2 26 Feb 07 jari 183     //set the menu bar (via cast)
2 26 Feb 07 jari 184     JDialog dialog = (JDialog)this;    
2 26 Feb 07 jari 185
2 26 Feb 07 jari 186     //JTable construction
2 26 Feb 07 jari 187     table = new JTable();
2 26 Feb 07 jari 188     table.addMouseListener(listener);
2 26 Feb 07 jari 189     table.addKeyListener(listener);
2 26 Feb 07 jari 190     
2 26 Feb 07 jari 191     Vector headerVector = new Vector();
2 26 Feb 07 jari 192     headerVector.add("Locus");
2 26 Feb 07 jari 193     headerVector.add("5'");
2 26 Feb 07 jari 194     headerVector.add("3'");
2 26 Feb 07 jari 195     headerVector.add("# spots/locus");
2 26 Feb 07 jari 196     
2 26 Feb 07 jari 197     model = new SelectionTableModel(selectedIndices, headerVector);
2 26 Feb 07 jari 198     table.setModel(model);    
2 26 Feb 07 jari 199     
2 26 Feb 07 jari 200     JScrollPane pane = new JScrollPane(table);
2 26 Feb 07 jari 201     dim = new Dimension(550, 150);
2 26 Feb 07 jari 202     pane.setPreferredSize(dim);
2 26 Feb 07 jari 203     pane.setSize(dim);
2 26 Feb 07 jari 204         
2 26 Feb 07 jari 205     mainpanel = new JPanel();
2 26 Feb 07 jari 206     mainpanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 207     
2 26 Feb 07 jari 208     locusTablePanel = new ParameterPanel("Selected Loci");
2 26 Feb 07 jari 209     locusTablePanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 210
2 26 Feb 07 jari 211     dim.height = 200;
2 26 Feb 07 jari 212     locusTablePanel.setPreferredSize(dim);
2 26 Feb 07 jari 213     locusTablePanel.setSize(dim);
2 26 Feb 07 jari 214     
2 26 Feb 07 jari 215     locusTablePanel.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 216
2 26 Feb 07 jari 217     mainpanel.add(menu, new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 218     mainpanel.add(infoPane, new GridBagConstraints(0,1,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 219
2 26 Feb 07 jari 220     locusGraph = new LocusGraph();
2 26 Feb 07 jari 221     
2 26 Feb 07 jari 222     mainpanel.add(locusGraph, new GridBagConstraints(0,2,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));    
2 26 Feb 07 jari 223     mainpanel.add(locusTablePanel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 224     
2 26 Feb 07 jari 225     //alter button text
2 26 Feb 07 jari 226     okButton.setText("Close");
2 26 Feb 07 jari 227     resetButton.setText("Remove Selected");
2 26 Feb 07 jari 228     dim = new Dimension(120, 30);
2 26 Feb 07 jari 229     resetButton.setPreferredSize(dim);
2 26 Feb 07 jari 230     resetButton.setSize(dim);
2 26 Feb 07 jari 231     cancelButton.setText("Clear All");
2 26 Feb 07 jari 232     cancelButton.setPreferredSize(dim);
2 26 Feb 07 jari 233     cancelButton.setSize(dim);
2 26 Feb 07 jari 234     
2 26 Feb 07 jari 235     validateMenuItemsAndButtons();
2 26 Feb 07 jari 236     
2 26 Feb 07 jari 237     addContent(mainpanel);
2 26 Feb 07 jari 238     setActionListeners(listener);
2 26 Feb 07 jari 239     addWindowListener(listener);
2 26 Feb 07 jari 240     pack();
2 26 Feb 07 jari 241   }
2 26 Feb 07 jari 242   
2 26 Feb 07 jari 243   /**
2 26 Feb 07 jari 244    * updates the information text to reflect list changes, row count
2 26 Feb 07 jari 245    *
2 26 Feb 07 jari 246    */
2 26 Feb 07 jari 247   public void updateSelectionText() {
2 26 Feb 07 jari 248     infoText = "<html><body><font size = 5><b><u><center>Locus Selection List</center></u></b></font>";
2 26 Feb 07 jari 249     infoText += "<center>Use <b>shift-left-click</b> on a locus arrow to add to the list.<br>";
2 26 Feb 07 jari 250     infoText += "Number of Loci in the List: <b>"+this.model.getRowCount()+"</b></center></body></html>";
2 26 Feb 07 jari 251     infoPane.setText(infoText);
2 26 Feb 07 jari 252     infoPane.setCaretPosition(0);
2 26 Feb 07 jari 253   }
2 26 Feb 07 jari 254   
2 26 Feb 07 jari 255   /**
2 26 Feb 07 jari 256    * validates the state of buttons based on the list population
2 26 Feb 07 jari 257    */
2 26 Feb 07 jari 258   private void validateMenuItemsAndButtons() {
2 26 Feb 07 jari 259     boolean isNotEmpty = (table.getRowCount() > 0);
2 26 Feb 07 jari 260     fileMenu.setEnabled(isNotEmpty);
2 26 Feb 07 jari 261     resetButton.setEnabled(isNotEmpty);
2 26 Feb 07 jari 262     cancelButton.setEnabled(isNotEmpty);
2 26 Feb 07 jari 263     
2 26 Feb 07 jari 264     int [] selRows = table.getSelectedRows();
2 26 Feb 07 jari 265     saveSelectedMenu.setEnabled(selRows!=null && selRows.length > 0);
2 26 Feb 07 jari 266   }
2 26 Feb 07 jari 267   
2 26 Feb 07 jari 268   /**
2 26 Feb 07 jari 269    * Displays the dialog centered on screen
2 26 Feb 07 jari 270    */
2 26 Feb 07 jari 271   public void showDialog() {
2 26 Feb 07 jari 272     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();      
2 26 Feb 07 jari 273     setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);      
2 26 Feb 07 jari 274     validateMenuItemsAndButtons();
2 26 Feb 07 jari 275     updateSelectionText();
2 26 Feb 07 jari 276     show();      
2 26 Feb 07 jari 277   }
2 26 Feb 07 jari 278   
2 26 Feb 07 jari 279   /**
2 26 Feb 07 jari 280    * Method to re-center the dialog
2 26 Feb 07 jari 281    */
2 26 Feb 07 jari 282   public void centerDialog() {
2 26 Feb 07 jari 283     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();      
2 26 Feb 07 jari 284     setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);          
2 26 Feb 07 jari 285   }
2 26 Feb 07 jari 286   
2 26 Feb 07 jari 287   /**
2 26 Feb 07 jari 288    * handles additions to loucs list
2 26 Feb 07 jari 289    */
2 26 Feb 07 jari 290   public void fireLocusAdded() {
2 26 Feb 07 jari 291     model.sortByMinLocation();
2 26 Feb 07 jari 292     model.fireRowInserted();
2 26 Feb 07 jari 293     validateMenuItemsAndButtons();
2 26 Feb 07 jari 294     updateSelectionText();
2 26 Feb 07 jari 295     locusGraph.refresh();
2 26 Feb 07 jari 296     //validate();
2 26 Feb 07 jari 297   }
2 26 Feb 07 jari 298   
2 26 Feb 07 jari 299   /**
2 26 Feb 07 jari 300    * Handles removals from the locus list
2 26 Feb 07 jari 301    */
2 26 Feb 07 jari 302   public void fireLocusRemoved() {
2 26 Feb 07 jari 303     model.sortByMinLocation();
2 26 Feb 07 jari 304     model.fireRowDeleted();
2 26 Feb 07 jari 305     validateMenuItemsAndButtons();
2 26 Feb 07 jari 306     updateSelectionText();
2 26 Feb 07 jari 307     locusGraph.refresh();
2 26 Feb 07 jari 308     //validate();
2 26 Feb 07 jari 309   }
2 26 Feb 07 jari 310   
2 26 Feb 07 jari 311   /**
2 26 Feb 07 jari 312    * Remove a selected loci based on JTable row selection
2 26 Feb 07 jari 313    */
2 26 Feb 07 jari 314   public void removeSelectedLoci() {
2 26 Feb 07 jari 315     int [] rows = table.getSelectedRows();
2 26 Feb 07 jari 316     if(rows.length == 0)
2 26 Feb 07 jari 317       return;
2 26 Feb 07 jari 318     model.removeSelectedRows(rows);    
2 26 Feb 07 jari 319     lem.repaint();    
2 26 Feb 07 jari 320   }
2 26 Feb 07 jari 321   
2 26 Feb 07 jari 322   /**
2 26 Feb 07 jari 323    * Clears the list
2 26 Feb 07 jari 324    * @return true if successful
2 26 Feb 07 jari 325    */
2 26 Feb 07 jari 326   public boolean clearAll() {
2 26 Feb 07 jari 327     boolean cleared = false;
2 26 Feb 07 jari 328     if(JOptionPane.showConfirmDialog(this, "Are you sure you are ready to clear the list?", "Clear All Selected Loci", JOptionPane.YES_NO_OPTION ) == JOptionPane.YES_OPTION ) {
2 26 Feb 07 jari 329       model.removeAllRows();
2 26 Feb 07 jari 330       cleared = true;
2 26 Feb 07 jari 331       lem.repaint();
2 26 Feb 07 jari 332     }
2 26 Feb 07 jari 333     return cleared;
2 26 Feb 07 jari 334   }
2 26 Feb 07 jari 335   
2 26 Feb 07 jari 336   /**
2 26 Feb 07 jari 337    * Retruns the locus indices corresponding to selected rows
2 26 Feb 07 jari 338    * @return array of locus indices
2 26 Feb 07 jari 339    */
2 26 Feb 07 jari 340   private int [] getSelectedLocusIndices() {
2 26 Feb 07 jari 341     int [] rows = table.getSelectedRows();
2 26 Feb 07 jari 342
2 26 Feb 07 jari 343     if(rows.length == 0)
2 26 Feb 07 jari 344       return new int[0];
2 26 Feb 07 jari 345
2 26 Feb 07 jari 346     return model.getLocusIndices(rows);    
2 26 Feb 07 jari 347   }
2 26 Feb 07 jari 348   
2 26 Feb 07 jari 349   /**
2 26 Feb 07 jari 350    * Saves the selected loci
2 26 Feb 07 jari 351    */
2 26 Feb 07 jari 352   public void saveSelectedLoci() {
2 26 Feb 07 jari 353     lem.saveLocusList(getSelectedLocusIndices());
2 26 Feb 07 jari 354   }
2 26 Feb 07 jari 355   
2 26 Feb 07 jari 356   /**
2 26 Feb 07 jari 357    * Saves the selected loci, spot level detail
2 26 Feb 07 jari 358    */
2 26 Feb 07 jari 359   public void saveSelectedSpotDetail() {
2 26 Feb 07 jari 360     lem.saveSpotsForLocusList(getSelectedLocusIndices());
2 26 Feb 07 jari 361   }
2 26 Feb 07 jari 362   
2 26 Feb 07 jari 363   /**
2 26 Feb 07 jari 364    * Saves all loci in the list to file
2 26 Feb 07 jari 365    */
2 26 Feb 07 jari 366   public void saveAllLoci() {
2 26 Feb 07 jari 367     lem.saveLocusList(model.getAllLocusIndices());
2 26 Feb 07 jari 368   }
2 26 Feb 07 jari 369   
2 26 Feb 07 jari 370   /**
2 26 Feb 07 jari 371    * Saves all loci in the list to file, spot level detail (replicate data)
2 26 Feb 07 jari 372    */
2 26 Feb 07 jari 373   public void saveAllSpotDetai() {
2 26 Feb 07 jari 374     lem.saveSpotsForLocusList(model.getAllLocusIndices());
2 26 Feb 07 jari 375   }
2 26 Feb 07 jari 376
2 26 Feb 07 jari 377   /**
2 26 Feb 07 jari 378    * Trigger a selection loci based on a location range
2 26 Feb 07 jari 379    */
2 26 Feb 07 jari 380   public void baseRangeSelection() {
2 26 Feb 07 jari 381     if(lem.selectBaseRange())
2 26 Feb 07 jari 382       locusGraph.refresh();
2 26 Feb 07 jari 383   }
2 26 Feb 07 jari 384   
2 26 Feb 07 jari 385   /**
2 26 Feb 07 jari 386    * Toggles the display of locus graphs
2 26 Feb 07 jari 387    */
2 26 Feb 07 jari 388   private void toggleLocusGraph() {
2 26 Feb 07 jari 389     //toggle show graph
2 26 Feb 07 jari 390     showGraph = !this.showGraph;
2 26 Feb 07 jari 391     this.coloredLociBox.setEnabled(showGraph);
2 26 Feb 07 jari 392
2 26 Feb 07 jari 393     int componentCount = mainPanel.getComponentCount();
2 26 Feb 07 jari 394     //remove graph
2 26 Feb 07 jari 395     if(!showGraph) {
2 26 Feb 07 jari 396       this.hideGraphItem.setText("Show Locus Graph");
2 26 Feb 07 jari 397       //remove table and graph
2 26 Feb 07 jari 398       mainpanel.remove(this.locusTablePanel);
2 26 Feb 07 jari 399       mainpanel.remove(this.locusGraph);      
2 26 Feb 07 jari 400
2 26 Feb 07 jari 401       //replace table in y pos = 2
2 26 Feb 07 jari 402       mainpanel.add(locusTablePanel, new GridBagConstraints(0,2,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));      
2 26 Feb 07 jari 403     } else {
2 26 Feb 07 jari 404       this.hideGraphItem.setText("Hide Locus Graph");
2 26 Feb 07 jari 405       //remove table
2 26 Feb 07 jari 406       mainpanel.remove(this.locusTablePanel);      
2 26 Feb 07 jari 407
2 26 Feb 07 jari 408       locusGraph.refresh();
2 26 Feb 07 jari 409       
2 26 Feb 07 jari 410       //insert graph and table
2 26 Feb 07 jari 411       mainpanel.add(locusGraph, new GridBagConstraints(0,2,1,1,1,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));    
2 26 Feb 07 jari 412       mainpanel.add(locusTablePanel, new GridBagConstraints(0,3,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));      
2 26 Feb 07 jari 413     }
2 26 Feb 07 jari 414     validate();
2 26 Feb 07 jari 415     pack();    
2 26 Feb 07 jari 416   }
2 26 Feb 07 jari 417   
2 26 Feb 07 jari 418   
2 26 Feb 07 jari 419   /**
2 26 Feb 07 jari 420    * 
2 26 Feb 07 jari 421    * @author braisted
2 26 Feb 07 jari 422    *
2 26 Feb 07 jari 423    * Selection model for the locus table
2 26 Feb 07 jari 424    */
2 26 Feb 07 jari 425   public class SelectionTableModel extends AbstractTableModel {
2 26 Feb 07 jari 426     
2 26 Feb 07 jari 427     /**
2 26 Feb 07 jari 428      * Indices of selected orfs
2 26 Feb 07 jari 429      */
2 26 Feb 07 jari 430     private Vector indices;
2 26 Feb 07 jari 431     private Vector headerNames;
2 26 Feb 07 jari 432     private int [] sortedIndices;
2 26 Feb 07 jari 433     
2 26 Feb 07 jari 434     /**
2 26 Feb 07 jari 435      * Constructor
2 26 Feb 07 jari 436      * @param data Data Vector
2 26 Feb 07 jari 437      * @param header header names
2 26 Feb 07 jari 438      */
2 26 Feb 07 jari 439     public SelectionTableModel(Vector data, Vector header) {      
2 26 Feb 07 jari 440       indices = data;
2 26 Feb 07 jari 441       this.headerNames = header;
2 26 Feb 07 jari 442     }
2 26 Feb 07 jari 443     
2 26 Feb 07 jari 444     /**
2 26 Feb 07 jari 445      * Returns the value at row and col
2 26 Feb 07 jari 446      */
2 26 Feb 07 jari 447     public Object getValueAt(int row, int col) {
2 26 Feb 07 jari 448       if(col == 0)
2 26 Feb 07 jari 449         return lem.getLocusID(getLocusIndex(row));
2 26 Feb 07 jari 450       else if(col == 1)
2 26 Feb 07 jari 451         return new Integer(lem.getStart(getLocusIndex(row)));
2 26 Feb 07 jari 452       else if(col == 2)
2 26 Feb 07 jari 453         return new Integer(lem.getEnd(getLocusIndex(row)));
2 26 Feb 07 jari 454       else
2 26 Feb 07 jari 455         return new Integer(lem.getNumReplicates(getLocusIndex(row)));        
2 26 Feb 07 jari 456     }
2 26 Feb 07 jari 457     
2 26 Feb 07 jari 458     /**
2 26 Feb 07 jari 459      * Returns a locus index corresponding to the given row
2 26 Feb 07 jari 460      * @param row row index
2 26 Feb 07 jari 461      * @return locus index
2 26 Feb 07 jari 462      */
2 26 Feb 07 jari 463     private int getLocusIndex(int row) {
2 26 Feb 07 jari 464       row = sortedIndices[row];
2 26 Feb 07 jari 465       return ((Integer)(indices.get(row))).intValue();
2 26 Feb 07 jari 466     }
2 26 Feb 07 jari 467
2 26 Feb 07 jari 468     /**
2 26 Feb 07 jari 469      * Returns locus indices corresponding the indicated rows
2 26 Feb 07 jari 470      * @param rows row indices for which to pull locus indices
2 26 Feb 07 jari 471      * @return list of locus indices
2 26 Feb 07 jari 472      */
2 26 Feb 07 jari 473     public int [] getLocusIndices(int [] rows) {
2 26 Feb 07 jari 474       int [] locusIndices = new int[rows.length];
2 26 Feb 07 jari 475       
2 26 Feb 07 jari 476       for(int i = 0; i < locusIndices.length; i++) {
2 26 Feb 07 jari 477         locusIndices[i] = getLocusIndex(rows[i]);
2 26 Feb 07 jari 478       }      
2 26 Feb 07 jari 479       return locusIndices;
2 26 Feb 07 jari 480     }
2 26 Feb 07 jari 481
2 26 Feb 07 jari 482     /**
2 26 Feb 07 jari 483      * Returns all locus indices in the list
2 26 Feb 07 jari 484      * @return all locus indices
2 26 Feb 07 jari 485      */
2 26 Feb 07 jari 486     public int [] getAllLocusIndices() {      
2 26 Feb 07 jari 487       int [] locusIndices = new int[getRowCount()];
2 26 Feb 07 jari 488       
2 26 Feb 07 jari 489       for(int i = 0; i < locusIndices.length; i++) {
2 26 Feb 07 jari 490         locusIndices[i] = getLocusIndex(i);
2 26 Feb 07 jari 491       }      
2 26 Feb 07 jari 492       return locusIndices;
2 26 Feb 07 jari 493     }
2 26 Feb 07 jari 494
2 26 Feb 07 jari 495     /**
2 26 Feb 07 jari 496      * Returns the column count of the table
2 26 Feb 07 jari 497      */
2 26 Feb 07 jari 498     public int getColumnCount() {
2 26 Feb 07 jari 499       return 4;
2 26 Feb 07 jari 500     }
2 26 Feb 07 jari 501
2 26 Feb 07 jari 502     /**
2 26 Feb 07 jari 503      * Returns the number of rows in the table
2 26 Feb 07 jari 504      */
2 26 Feb 07 jari 505     public int getRowCount() {
2 26 Feb 07 jari 506       return indices.size();
2 26 Feb 07 jari 507     }
2 26 Feb 07 jari 508
2 26 Feb 07 jari 509     /**
2 26 Feb 07 jari 510      * Returns the column name specified by col
2 26 Feb 07 jari 511      */
2 26 Feb 07 jari 512     public String getColumnName(int col) {
2 26 Feb 07 jari 513       return (String)(headerNames.get(col));
2 26 Feb 07 jari 514     }
2 26 Feb 07 jari 515     
2 26 Feb 07 jari 516     /**
2 26 Feb 07 jari 517      * updates the table when rows are inserted
2 26 Feb 07 jari 518      */
2 26 Feb 07 jari 519     public void fireRowInserted() {      
2 26 Feb 07 jari 520       this.fireTableRowsInserted(indices.size()-1, indices.size()-1);    
2 26 Feb 07 jari 521     }
2 26 Feb 07 jari 522     
2 26 Feb 07 jari 523     /**
2 26 Feb 07 jari 524      * updates the table when rows are deleted
2 26 Feb 07 jari 525      */
2 26 Feb 07 jari 526     public void fireRowDeleted() {
2 26 Feb 07 jari 527       if(indices.size() > 0)
2 26 Feb 07 jari 528         //this.fireTableRowsDeleted(row, row);
2 26 Feb 07 jari 529         this.fireTableRowsDeleted(indices.size()-1, indices.size()-1);
2 26 Feb 07 jari 530       else
2 26 Feb 07 jari 531         this.fireTableRowsDeleted(-1, -1);        
2 26 Feb 07 jari 532     }
2 26 Feb 07 jari 533     
2 26 Feb 07 jari 534     /**
2 26 Feb 07 jari 535      * Removes specified rows
2 26 Feb 07 jari 536      * @param rows table rows to remove
2 26 Feb 07 jari 537      */
2 26 Feb 07 jari 538     public void removeSelectedRows(int [] rows) {
2 26 Feb 07 jari 539       Object [] objs = new Object[rows.length];
2 26 Feb 07 jari 540
2 26 Feb 07 jari 541       for(int i = 0; i < rows.length; i++) {
2 26 Feb 07 jari 542         objs[i] = indices.get(sortedIndices[rows[i]]);
2 26 Feb 07 jari 543       }
2 26 Feb 07 jari 544       
2 26 Feb 07 jari 545       for(int i = 0; i < rows.length; i++) {
2 26 Feb 07 jari 546         //let lem mod shared structure, and selected boolean
2 26 Feb 07 jari 547         lem.toggleSelectedLocus( ((Integer)objs[i]).intValue() );
2 26 Feb 07 jari 548         fireRowDeleted();
2 26 Feb 07 jari 549       }
2 26 Feb 07 jari 550       sortByMinLocation();
2 26 Feb 07 jari 551     }
2 26 Feb 07 jari 552     
2 26 Feb 07 jari 553     /**
2 26 Feb 07 jari 554      * Remove all rows
2 26 Feb 07 jari 555      */
2 26 Feb 07 jari 556     public void removeAllRows() {
2 26 Feb 07 jari 557       int [] rows = new int[indices.size()];
2 26 Feb 07 jari 558       for(int i = 0; i < rows.length; i++)
2 26 Feb 07 jari 559         rows[i] = i;
2 26 Feb 07 jari 560       removeSelectedRows(rows);
2 26 Feb 07 jari 561       sortByMinLocation();
2 26 Feb 07 jari 562     }
2 26 Feb 07 jari 563     
2 26 Feb 07 jari 564     /**
2 26 Feb 07 jari 565      * sorts locus rows by the smaller coordinate of each locus
2 26 Feb 07 jari 566      *
2 26 Feb 07 jari 567      */
2 26 Feb 07 jari 568     public void sortByMinLocation() {
2 26 Feb 07 jari 569                 
2 26 Feb 07 jari 570       float [] minCoord = new float[this.getRowCount()];
2 26 Feb 07 jari 571       
2 26 Feb 07 jari 572       if(minCoord.length == 0) {
2 26 Feb 07 jari 573         sortedIndices = new int[0];
2 26 Feb 07 jari 574         return;
2 26 Feb 07 jari 575       }
2 26 Feb 07 jari 576       
2 26 Feb 07 jari 577       for(int row = 0; row < minCoord.length; row++)
2 26 Feb 07 jari 578         minCoord[row]= (float)Math.min(lem.getStart(((Integer)indices.get(row)).intValue()),lem.getEnd(((Integer)indices.get(row)).intValue()));
2 26 Feb 07 jari 579
2 26 Feb 07 jari 580       QSort qsort = new QSort(minCoord);      
2 26 Feb 07 jari 581       sortedIndices = qsort.getOrigIndx();                
2 26 Feb 07 jari 582     }    
2 26 Feb 07 jari 583   }
2 26 Feb 07 jari 584   
2 26 Feb 07 jari 585   /**
2 26 Feb 07 jari 586    * 
2 26 Feb 07 jari 587    * @author braisted
2 26 Feb 07 jari 588    *
2 26 Feb 07 jari 589    * LocusGraph zero or more graphs present in the table
2 26 Feb 07 jari 590    * Two main modes exist, 1.) Monochrom overlay mode and
2 26 Feb 07 jari 591    * 2.) Multicolored display with key to associate locus with graph line
2 26 Feb 07 jari 592    */
2 26 Feb 07 jari 593   private class LocusGraph extends JPanel {
2 26 Feb 07 jari 594   
2 26 Feb 07 jari 595     private GraphViewer graph;
2 26 Feb 07 jari 596     private Vector lineColorVector;
2 26 Feb 07 jari 597     private int numberOfLineColors;
2 26 Feb 07 jari 598     private boolean multiColored;
2 26 Feb 07 jari 599     private KeyPanel key;
2 26 Feb 07 jari 600     
2 26 Feb 07 jari 601     private JScrollPane keyPane;
2 26 Feb 07 jari 602     
2 26 Feb 07 jari 603     /**
2 26 Feb 07 jari 604      * Constructs a LocusGraph object
2 26 Feb 07 jari 605      */
2 26 Feb 07 jari 606     public LocusGraph() {
2 26 Feb 07 jari 607       setLayout(new GridBagLayout());
2 26 Feb 07 jari 608       setBackground(Color.white);
2 26 Feb 07 jari 609       setBorder(BorderFactory.createLineBorder(Color.black));      
2 26 Feb 07 jari 610       multiColored = false;
2 26 Feb 07 jari 611       
2 26 Feb 07 jari 612       lineColorVector = new Vector();
2 26 Feb 07 jari 613       lineColorVector.add(Color.magenta);
2 26 Feb 07 jari 614       lineColorVector.add(new Color(0, 143, 0));
2 26 Feb 07 jari 615       lineColorVector.add(Color.cyan);
2 26 Feb 07 jari 616       lineColorVector.add(Color.blue);
2 26 Feb 07 jari 617       lineColorVector.add(Color.red);
2 26 Feb 07 jari 618       lineColorVector.add(Color.black);
2 26 Feb 07 jari 619       lineColorVector.add(Color.pink);
2 26 Feb 07 jari 620       lineColorVector.add(Color.gray);
2 26 Feb 07 jari 621       lineColorVector.add(Color.green);
2 26 Feb 07 jari 622       numberOfLineColors = lineColorVector.size();
2 26 Feb 07 jari 623       
2 26 Feb 07 jari 624       graph = createGraphViewer();
2 26 Feb 07 jari 625       
2 26 Feb 07 jari 626       add(graph, 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 627     
2 26 Feb 07 jari 628       key = new KeyPanel();
2 26 Feb 07 jari 629       keyPane = new JScrollPane(key);
2 26 Feb 07 jari 630       
2 26 Feb 07 jari 631       Dimension dim = new Dimension(180, 150);
2 26 Feb 07 jari 632       keyPane.setPreferredSize(dim);
2 26 Feb 07 jari 633       keyPane.setSize(dim);
2 26 Feb 07 jari 634     }
2 26 Feb 07 jari 635
2 26 Feb 07 jari 636     /**
2 26 Feb 07 jari 637      * Constructs a new graph viewer based current selection
2 26 Feb 07 jari 638      */
2 26 Feb 07 jari 639     public void createNewGraph() {
2 26 Feb 07 jari 640       GraphViewer newGraph = createGraphViewer();
2 26 Feb 07 jari 641       
2 26 Feb 07 jari 642       //replace component
2 26 Feb 07 jari 643       this.removeAll();
2 26 Feb 07 jari 644       
2 26 Feb 07 jari 645       if(multiColored) {
2 26 Feb 07 jari 646         //share space
2 26 Feb 07 jari 647         key.updateSize();        
2 26 Feb 07 jari 648         add(newGraph, new GridBagConstraints(0,0,1,1,0.7,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));      
2 26 Feb 07 jari 649         add(keyPane, new GridBagConstraints(1,0,1,1,0.3,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));              
2 26 Feb 07 jari 650       } else {
2 26 Feb 07 jari 651         add(newGraph, 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 652       }
2 26 Feb 07 jari 653       
2 26 Feb 07 jari 654       graph = newGraph;      
2 26 Feb 07 jari 655       validate();
2 26 Feb 07 jari 656     }
2 26 Feb 07 jari 657     
2 26 Feb 07 jari 658     /**
2 26 Feb 07 jari 659      * Refreshes the display, important after locus addition
2 26 Feb 07 jari 660      */
2 26 Feb 07 jari 661     public void refresh() {
2 26 Feb 07 jari 662       createNewGraph();
2 26 Feb 07 jari 663       key.updateSize();        
2 26 Feb 07 jari 664     }
2 26 Feb 07 jari 665     
2 26 Feb 07 jari 666     /**
2 26 Feb 07 jari 667      * Toggles the monochrome/multi-colored option
2 26 Feb 07 jari 668      */
2 26 Feb 07 jari 669     public void toggleMultiColored() {
2 26 Feb 07 jari 670       multiColored = !multiColored;
2 26 Feb 07 jari 671       refresh();        
2 26 Feb 07 jari 672     }
2 26 Feb 07 jari 673     
2 26 Feb 07 jari 674     /**
2 26 Feb 07 jari 675      * Returns the line color for the specified table row index
2 26 Feb 07 jari 676      * @param index row index
2 26 Feb 07 jari 677      * @return line color
2 26 Feb 07 jari 678      */
2 26 Feb 07 jari 679     public Color getLineColor(int index) {
2 26 Feb 07 jari 680       return (Color)(lineColorVector.get(index%numberOfLineColors));
2 26 Feb 07 jari 681     }
2 26 Feb 07 jari 682         
2 26 Feb 07 jari 683     /**
2 26 Feb 07 jari 684      * Constructs a new <code>GraphViewer</code>
2 26 Feb 07 jari 685      * @return new GraphViewer
2 26 Feb 07 jari 686      */
2 26 Feb 07 jari 687     private GraphViewer createGraphViewer() {
2 26 Feb 07 jari 688
2 26 Feb 07 jari 689       int locusIndex;
2 26 Feb 07 jari 690       String locusName;
2 26 Feb 07 jari 691       float [] meanValues;
2 26 Feb 07 jari 692       Color lineColor = Color.magenta;      
2 26 Feb 07 jari 693       String [] names = new String[numSamples];  
2 26 Feb 07 jari 694       int rows [] = table.getSelectedRows();      
2 26 Feb 07 jari 695       int [] indices = model.getLocusIndices(table.getSelectedRows());        
2 26 Feb 07 jari 696       float [] maxAndMin = getMaxAndMin(meanMatrix, indices);
2 26 Feb 07 jari 697       
2 26 Feb 07 jari 698       //constant avoids max = min ==> upperY == lowerY, for flat genes
2 26 Feb 07 jari 699       int upperY = (int)Math.ceil(maxAndMin[0]+0.001f);
2 26 Feb 07 jari 700       int lowerY = (int)Math.floor(maxAndMin[1]-0.001f);  
2 26 Feb 07 jari 701               
2 26 Feb 07 jari 702       GraphViewer graph = new GraphViewer(null, 0, 425, 0, 300, 0, numSamples, lowerY, upperY, 40, 40, 40, 40, "Mean Locus Expression", "Sample Number", "Log\u2082(Cy5 / Cy3)");
2 26 Feb 07 jari 703       graph.setXAxisValue(lowerY);      
2 26 Feb 07 jari 704       graph.setShowCoordinates(true);    
2 26 Feb 07 jari 705
2 26 Feb 07 jari 706       Dimension size = new Dimension(250, 250);        
2 26 Feb 07 jari 707       
2 26 Feb 07 jari 708       graph.setPreferredSize(size);
2 26 Feb 07 jari 709         graph.setSize(size);
2 26 Feb 07 jari 710         
2 26 Feb 07 jari 711       GraphTick tick = new GraphTick(0, 8, Color.black, GC.HORIZONTAL, GC.C, "", Color.black);    
2 26 Feb 07 jari 712     
2 26 Feb 07 jari 713       graph.addGraphElement(tick);
2 26 Feb 07 jari 714
2 26 Feb 07 jari 715       //zero line
2 26 Feb 07 jari 716       graph.addGraphElement(new GraphLine(0, 0, numSamples, 0, Color.black));
2 26 Feb 07 jari 717
2 26 Feb 07 jari 718       //ticks, and last tick
2 26 Feb 07 jari 719       for(int i = 0; i < numSamples-1; i++) {                  
2 26 Feb 07 jari 720         tick = new GraphTick(i+1, 8, Color.black, GC.HORIZONTAL, GC.C, String.valueOf(i+1), Color.black);
2 26 Feb 07 jari 721         graph.addGraphElement(tick);
2 26 Feb 07 jari 722       }
2 26 Feb 07 jari 723       tick = new GraphTick(numSamples, 8, Color.black, GC.HORIZONTAL, GC.C, String.valueOf(numSamples), Color.black);
2 26 Feb 07 jari 724       graph.addGraphElement(tick);
2 26 Feb 07 jari 725
2 26 Feb 07 jari 726       
2 26 Feb 07 jari 727       for(int locus = 0; locus < indices.length; locus++) {
2 26 Feb 07 jari 728         locusIndex = indices[locus];
2 26 Feb 07 jari 729         lineColor = (Color)(lineColorVector.get(locus%numberOfLineColors));
2 26 Feb 07 jari 730         for(int i = 0; i < numSamples-1; i++) {
2 26 Feb 07 jari 731                   
2 26 Feb 07 jari 732           if(!Float.isNaN(meanMatrix.A[indices[locus]][i]) && !Float.isNaN(meanMatrix.A[indices[locus]][i+1])) {
2 26 Feb 07 jari 733             if(multiColored)
2 26 Feb 07 jari 734               graph.addGraphElement(new GraphLine(i+1, meanMatrix.A[indices[locus]][i], i+2, meanMatrix.A[indices[locus]][i+1], lineColor));
2 26 Feb 07 jari 735             else
2 26 Feb 07 jari 736               graph.addGraphElement(new GraphLine(i+1, meanMatrix.A[indices[locus]][i], i+2, meanMatrix.A[indices[locus]][i+1], Color.magenta));              
2 26 Feb 07 jari 737           }
2 26 Feb 07 jari 738         
2 26 Feb 07 jari 739           if(!Float.isNaN(meanMatrix.A[indices[locus]][i]))      
2 26 Feb 07 jari 740             graph.addGraphElement(new GraphPoint(i+1, meanMatrix.A[indices[locus]][i], Color.blue, 5));
2 26 Feb 07 jari 741       
2 26 Feb 07 jari 742         }
2 26 Feb 07 jari 743         
2 26 Feb 07 jari 744         if(!Float.isNaN(meanMatrix.A[indices[locus]][numSamples-1]))      
2 26 Feb 07 jari 745           graph.addGraphElement(new GraphPoint(numSamples, meanMatrix.A[indices[locus]][numSamples-1], Color.blue, 5));
2 26 Feb 07 jari 746                 
2 26 Feb 07 jari 747       }
2 26 Feb 07 jari 748     
2 26 Feb 07 jari 749           for (int i = lowerY; i <= upperY; i++) {
2 26 Feb 07 jari 750               if (i == 0) 
2 26 Feb 07 jari 751                 tick = new GraphTick(i, 8, Color.black, GC.VERTICAL, GC.C, "0", Color.black);
2 26 Feb 07 jari 752               else 
2 26 Feb 07 jari 753                 tick = new GraphTick(i, 8, Color.black, GC.VERTICAL, GC.C, "" + i, Color.black);            
2 26 Feb 07 jari 754               graph.addGraphElement(tick);
2 26 Feb 07 jari 755           }
2 26 Feb 07 jari 756           
2 26 Feb 07 jari 757           return graph;
2 26 Feb 07 jari 758     }
2 26 Feb 07 jari 759     
2 26 Feb 07 jari 760     /**
2 26 Feb 07 jari 761      * Returns the min and max values, in that order in a two member float array
2 26 Feb 07 jari 762      * for the float matrix and indicated row indices
2 26 Feb 07 jari 763      * @param meanMatrix input matrix
2 26 Feb 07 jari 764      * @param indices row indices
2 26 Feb 07 jari 765      * @return float array with min value and max value
2 26 Feb 07 jari 766      */
2 26 Feb 07 jari 767     private float [] getMaxAndMin(FloatMatrix meanMatrix, int [] indices) {
2 26 Feb 07 jari 768       float [] maxAndMin = new float[2];
2 26 Feb 07 jari 769       maxAndMin[0] = Float.NEGATIVE_INFINITY;
2 26 Feb 07 jari 770       maxAndMin[1] = Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 771       int index;
2 26 Feb 07 jari 772       
2 26 Feb 07 jari 773       for(int i = 0; i < indices.length; i++) {
2 26 Feb 07 jari 774         index = indices[i];
2 26 Feb 07 jari 775         for(int j = 0; j < meanMatrix.A[index].length; j++) {
2 26 Feb 07 jari 776           if(!Float.isNaN(meanMatrix.A[index][j])) {
2 26 Feb 07 jari 777             maxAndMin[0] = Math.max(maxAndMin[0], meanMatrix.A[index][j]);
2 26 Feb 07 jari 778             maxAndMin[1] = Math.min(maxAndMin[1], meanMatrix.A[index][j]);
2 26 Feb 07 jari 779           }
2 26 Feb 07 jari 780         }
2 26 Feb 07 jari 781       }
2 26 Feb 07 jari 782       
2 26 Feb 07 jari 783       if(maxAndMin[0] == Float.NEGATIVE_INFINITY)
2 26 Feb 07 jari 784         maxAndMin[0] = 0;
2 26 Feb 07 jari 785       if(maxAndMin[1] == Float.POSITIVE_INFINITY)
2 26 Feb 07 jari 786         maxAndMin[1] = 0;
2 26 Feb 07 jari 787       
2 26 Feb 07 jari 788       return maxAndMin;
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      * @author braisted
2 26 Feb 07 jari 794      *
2 26 Feb 07 jari 795      * The KeyPanel displays the color scheme for locus lines in the display
2 26 Feb 07 jari 796      * while in the multicolor display mode
2 26 Feb 07 jari 797      */
2 26 Feb 07 jari 798     public class KeyPanel extends JPanel {
2 26 Feb 07 jari 799       private JScrollPane pane;
2 26 Feb 07 jari 800       private int maxIDWidth;
2 26 Feb 07 jari 801       
2 26 Feb 07 jari 802       /**
2 26 Feb 07 jari 803        * Constructs a new key panel
2 26 Feb 07 jari 804        */
2 26 Feb 07 jari 805       public KeyPanel() {
2 26 Feb 07 jari 806         super();
2 26 Feb 07 jari 807         setBackground(Color.white);
2 26 Feb 07 jari 808       }
2 26 Feb 07 jari 809
2 26 Feb 07 jari 810       /**
2 26 Feb 07 jari 811        * Updates the key panel size, important after locus list changes
2 26 Feb 07 jari 812        */
2 26 Feb 07 jari 813       public void updateSize() {
2 26 Feb 07 jari 814         int [] indices = table.getSelectedRows();
2 26 Feb 07 jari 815
2 26 Feb 07 jari 816         FontMetrics fm = getFontMetrics(getFont());
2 26 Feb 07 jari 817         if(fm == null) {
2 26 Feb 07 jari 818           return;
2 26 Feb 07 jari 819         }
2 26 Feb 07 jari 820         
2 26 Feb 07 jari 821         int w;
2 26 Feb 07 jari 822         int h = (int)(fm.getHeight() * 1.5) * indices.length;        
2 26 Feb 07 jari 823         h = Math.max(locusGraph.getHeight(), h);
2 26 Feb 07 jari 824
2 26 Feb 07 jari 825         int stringWidth = 0;
2 26 Feb 07 jari 826               
2 26 Feb 07 jari 827         for(int i = 0; i < indices.length; i++) {          
2 26 Feb 07 jari 828           stringWidth = Math.max(stringWidth, fm.stringWidth((String)(model.getValueAt(indices[i], 0))));
2 26 Feb 07 jari 829         }
2 26 Feb 07 jari 830
2 26 Feb 07 jari 831         w = stringWidth + 75;
2 26 Feb 07 jari 832         
2 26 Feb 07 jari 833         setPreferredSize(new Dimension(w,h));
2 26 Feb 07 jari 834         setSize(w,h);        
2 26 Feb 07 jari 835       }
2 26 Feb 07 jari 836       
2 26 Feb 07 jari 837       /**
2 26 Feb 07 jari 838        * Paints the panel information, line previews, to the specified Graphics object
2 26 Feb 07 jari 839        */
2 26 Feb 07 jari 840       public void paint(Graphics g) {
2 26 Feb 07 jari 841         super.paint(g);
2 26 Feb 07 jari 842         FontMetrics fm  = g.getFontMetrics();
2 26 Feb 07 jari 843         int h = (int)(fm.getHeight() * 1.5);
2 26 Feb 07 jari 844         int offset = h;
2 26 Feb 07 jari 845         String id;
2 26 Feb 07 jari 846                 
2 26 Feb 07 jari 847         int [] indices = table.getSelectedRows();
2 26 Feb 07 jari 848         
2 26 Feb 07 jari 849         for(int i = 0; i < indices.length; i++) {          
2 26 Feb 07 jari 850           //id = (String)(model.getValueAt(indices[i], 0));
2 26 Feb 07 jari 851           id = (String)table.getValueAt(indices[i], 0);
2 26 Feb 07 jari 852           
2 26 Feb 07 jari 853           g.setColor(getLineColor(i));
2 26 Feb 07 jari 854           g.drawLine(7, offset-3, 55, offset-3);
2 26 Feb 07 jari 855
2 26 Feb 07 jari 856           g.setColor(Color.blue);                  
2 26 Feb 07 jari 857           g.fillRect(5, offset-5, 5, 5);
2 26 Feb 07 jari 858           g.fillRect(55, offset-5, 5, 5);          
2 26 Feb 07 jari 859
2 26 Feb 07 jari 860           g.setColor(Color.black);
2 26 Feb 07 jari 861           g.drawString(id, 75, offset);
2 26 Feb 07 jari 862
2 26 Feb 07 jari 863           offset += h;
2 26 Feb 07 jari 864         }                
2 26 Feb 07 jari 865       }
2 26 Feb 07 jari 866       
2 26 Feb 07 jari 867       
2 26 Feb 07 jari 868     }
2 26 Feb 07 jari 869     
2 26 Feb 07 jari 870   }
2 26 Feb 07 jari 871   
2 26 Feb 07 jari 872
2 26 Feb 07 jari 873   /**
2 26 Feb 07 jari 874    * @author braisted
2 26 Feb 07 jari 875    *
2 26 Feb 07 jari 876    * Listener listens to button and menu <code>ActionEvent</code>s and delegates
2 26 Feb 07 jari 877    * event handling. 
2 26 Feb 07 jari 878    */
2 26 Feb 07 jari 879   private class Listener extends WindowAdapter implements ActionListener, MouseListener, KeyListener
2 26 Feb 07 jari 880   {
2 26 Feb 07 jari 881
2 26 Feb 07 jari 882     public void actionPerformed(ActionEvent ae) {
2 26 Feb 07 jari 883       String command = ae.getActionCommand();
2 26 Feb 07 jari 884       if(command.equals("ok-command")) {
2 26 Feb 07 jari 885         dispose();;
2 26 Feb 07 jari 886       } else if(command.equals("cancel-command")) {
2 26 Feb 07 jari 887         //prompt to check then clear list
2 26 Feb 07 jari 888         if(clearAll()) {            
2 26 Feb 07 jari 889           validateMenuItemsAndButtons();          
2 26 Feb 07 jari 890           locusGraph.refresh();
2 26 Feb 07 jari 891         }
2 26 Feb 07 jari 892       } else if(command.equals("reset-command")) {
2 26 Feb 07 jari 893         removeSelectedLoci();
2 26 Feb 07 jari 894         validateMenuItemsAndButtons();        
2 26 Feb 07 jari 895         locusGraph.refresh();
2 26 Feb 07 jari 896       } else if(command.equals("info-command")) {
2 26 Feb 07 jari 897         
2 26 Feb 07 jari 898       } else if(command.equals("save-selected-spot-detail-command")) {
2 26 Feb 07 jari 899         saveSelectedSpotDetail();
2 26 Feb 07 jari 900       } else if(command.equals("save-selected-loci-detail-command")) {
2 26 Feb 07 jari 901         saveSelectedLoci();
2 26 Feb 07 jari 902       } else if(command.equals("save-all-loci-detail-command")) {
2 26 Feb 07 jari 903         saveAllLoci();
2 26 Feb 07 jari 904       } else if(command.equals("save-all-spot-detail-command")) {
2 26 Feb 07 jari 905         saveAllSpotDetai();
2 26 Feb 07 jari 906       } else if(command.equals("loci-list-selection-command")) {
2 26 Feb 07 jari 907         
2 26 Feb 07 jari 908       } else if(command.equals("base-range-selection-command")) {
2 26 Feb 07 jari 909         baseRangeSelection();
2 26 Feb 07 jari 910       } else if(command.equals("toggle-multi-colored-graphs")) {
2 26 Feb 07 jari 911         locusGraph.toggleMultiColored();
2 26 Feb 07 jari 912       } else if(command.equals("toggle-hide-graph-command")) {
2 26 Feb 07 jari 913         toggleLocusGraph();
2 26 Feb 07 jari 914       }
2 26 Feb 07 jari 915     }
2 26 Feb 07 jari 916     
2 26 Feb 07 jari 917     public void mouseClicked(MouseEvent e) {  
2 26 Feb 07 jari 918       validateMenuItemsAndButtons();
2 26 Feb 07 jari 919     }
2 26 Feb 07 jari 920
2 26 Feb 07 jari 921   
2 26 Feb 07 jari 922     public void mouseEntered(MouseEvent e) {    
2 26 Feb 07 jari 923     }
2 26 Feb 07 jari 924
2 26 Feb 07 jari 925
2 26 Feb 07 jari 926     public void mouseExited(MouseEvent e) {  
2 26 Feb 07 jari 927     }
2 26 Feb 07 jari 928
2 26 Feb 07 jari 929
2 26 Feb 07 jari 930     public void mousePressed(MouseEvent e) {  
2 26 Feb 07 jari 931       validateMenuItemsAndButtons();
2 26 Feb 07 jari 932     }
2 26 Feb 07 jari 933
2 26 Feb 07 jari 934
2 26 Feb 07 jari 935     public void mouseReleased(MouseEvent e) {
2 26 Feb 07 jari 936       validateMenuItemsAndButtons();
2 26 Feb 07 jari 937       locusGraph.refresh();
2 26 Feb 07 jari 938     }
2 26 Feb 07 jari 939
2 26 Feb 07 jari 940     public void keyPressed(KeyEvent e) {
2 26 Feb 07 jari 941
2 26 Feb 07 jari 942     }
2 26 Feb 07 jari 943
2 26 Feb 07 jari 944   
2 26 Feb 07 jari 945     public void keyReleased(KeyEvent e) {
2 26 Feb 07 jari 946       if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
2 26 Feb 07 jari 947         locusGraph.refresh();
2 26 Feb 07 jari 948       }  
2 26 Feb 07 jari 949     }
2 26 Feb 07 jari 950
2 26 Feb 07 jari 951     public void keyTyped(KeyEvent e) {
2 26 Feb 07 jari 952   
2 26 Feb 07 jari 953     }
2 26 Feb 07 jari 954     
2 26 Feb 07 jari 955   }
2 26 Feb 07 jari 956   
2 26 Feb 07 jari 957 }