mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LEMThumbNail.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.BorderLayout;
2 26 Feb 07 jari 8 import java.awt.Color;
2 26 Feb 07 jari 9 import java.awt.Dimension;
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.Point;
2 26 Feb 07 jari 15 import java.awt.Toolkit;
2 26 Feb 07 jari 16 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 17 import java.awt.event.ActionListener;
2 26 Feb 07 jari 18 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 19 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 20 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 21
2 26 Feb 07 jari 22 import javax.swing.BorderFactory;
2 26 Feb 07 jari 23 import javax.swing.JButton;
2 26 Feb 07 jari 24 import javax.swing.JDialog;
2 26 Feb 07 jari 25 import javax.swing.JLabel;
2 26 Feb 07 jari 26 import javax.swing.JOptionPane;
2 26 Feb 07 jari 27 import javax.swing.JPanel;
2 26 Feb 07 jari 28 import javax.swing.JScrollPane;
2 26 Feb 07 jari 29 import javax.swing.JTabbedPane;
2 26 Feb 07 jari 30 import javax.swing.JTextField;
2 26 Feb 07 jari 31 import javax.swing.ToolTipManager;
2 26 Feb 07 jari 32 import javax.swing.border.BevelBorder;
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.ParameterPanel;
2 26 Feb 07 jari 37 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39 /**
2 26 Feb 07 jari 40  * @author braisted
2 26 Feb 07 jari 41  * 
2 26 Feb 07 jari 42  * LEMThumbNail is a dialog to support navigation within the LEM
2 26 Feb 07 jari 43  * Clicking on the Thumbnail moves the main display to that area
2 26 Feb 07 jari 44  * of the LEM.  Additional options allow navigation to specific
2 26 Feb 07 jari 45  * coordinates or specified locus.
2 26 Feb 07 jari 46  */
2 26 Feb 07 jari 47 public class LEMThumbNail extends JDialog {
2 26 Feb 07 jari 48   
2 26 Feb 07 jari 49   private IFramework framework;
2 26 Feb 07 jari 50   private Canvas canvas;
2 26 Feb 07 jari 51   private ControlPanel navPanel;
2 26 Feb 07 jari 52   private JScrollPane pane;
2 26 Feb 07 jari 53   
2 26 Feb 07 jari 54   private LinearExpressionMapViewer parent;
2 26 Feb 07 jari 55
2 26 Feb 07 jari 56   private int initHeight = 500;
2 26 Feb 07 jari 57   private int initWidth = 200;
2 26 Feb 07 jari 58   private int navInitWidth = 200;
2 26 Feb 07 jari 59   private int navInitHeight = 200;
2 26 Feb 07 jari 60   
2 26 Feb 07 jari 61   private int maxY = 0;
2 26 Feb 07 jari 62   
2 26 Feb 07 jari 63   private int [] startValues;
2 26 Feb 07 jari 64   private int [] endValues;
2 26 Feb 07 jari 65   private boolean [] isForward;
2 26 Feb 07 jari 66   private String [] locusIDs;
2 26 Feb 07 jari 67   private int [] strata;
2 26 Feb 07 jari 68   private int maxStrata;
2 26 Feb 07 jari 69   private boolean isFixedLength;
2 26 Feb 07 jari 70   
2 26 Feb 07 jari 71   public static final int TOP_WINDOW = 0;
2 26 Feb 07 jari 72   public static final int PREV_WINDOW = 1;
2 26 Feb 07 jari 73   public static final int NEXT_WINDOW = 2;
2 26 Feb 07 jari 74   public static final int END_WINDOW = 3;
2 26 Feb 07 jari 75   
2 26 Feb 07 jari 76   /**
2 26 Feb 07 jari 77    * Constructs a LEMThumbNail, note that the LEM parent is included to support interaction
2 26 Feb 07 jari 78    * @param framework framework object to act as a conduit outside LEM
2 26 Feb 07 jari 79    * @param parent parent LEM
2 26 Feb 07 jari 80    * @param startCoords array of start coordinates
2 26 Feb 07 jari 81    * @param endCoords array of end coordinates
2 26 Feb 07 jari 82    * @param fm FloatMatrix of locus values, passed on to canvas
2 26 Feb 07 jari 83    * @param upperThr current upper threshold for locus display (bin)
2 26 Feb 07 jari 84    * @param lowerThr current lower threshold for locus display (bin)
2 26 Feb 07 jari 85    * @param upperColor upper bin color
2 26 Feb 07 jari 86    * @param lowerColor lower bin color
2 26 Feb 07 jari 87    * @param midColor midrange, neutral color
2 26 Feb 07 jari 88    * @param parentHeight height of the actual LEM, used for scaling movement
2 26 Feb 07 jari 89    * @param mainViewY1 initial Lower locus index extent of parent LEM
2 26 Feb 07 jari 90    * @param mainViewY2 initial Upper locus index extent of parent LEM
2 26 Feb 07 jari 91    * @param locusIDFieldName Locus id annotation field name 
2 26 Feb 07 jari 92    */
2 26 Feb 07 jari 93   public LEMThumbNail(IFramework framework, LinearExpressionMapViewer parent, int [] startCoords, int [] endCoords, FloatMatrix fm, float upperThr, float lowerThr, Color upperColor, Color lowerColor, Color midColor, int parentHeight, int mainViewY1, int mainViewY2, String locusIDFieldName) {
2 26 Feb 07 jari 94     super(framework.getFrame(), "LEM Explorer", false);
2 26 Feb 07 jari 95     this.framework = framework;
2 26 Feb 07 jari 96     this.parent = parent;
2 26 Feb 07 jari 97
2 26 Feb 07 jari 98     startValues = parent.getStartValues();
2 26 Feb 07 jari 99     endValues = parent.getEndValues();
2 26 Feb 07 jari 100     isForward = parent.getDirectionArray();
2 26 Feb 07 jari 101     locusIDs = parent.getLocusIDArray();
2 26 Feb 07 jari 102     strata = parent.getStrata();
2 26 Feb 07 jari 103     maxStrata = parent.getMaxStrata();
2 26 Feb 07 jari 104     isFixedLength = parent.areArrowLengthsFixed();
2 26 Feb 07 jari 105     
2 26 Feb 07 jari 106     Listener listener = new Listener();
2 26 Feb 07 jari 107     canvas = new Canvas(startCoords, endCoords, fm, parentHeight, mainViewY1, mainViewY2, listener);    
2 26 Feb 07 jari 108     navPanel = new ControlPanel(listener, locusIDFieldName);
2 26 Feb 07 jari 109     pane = new JScrollPane();
2 26 Feb 07 jari 110     pane.setViewportView(canvas);  
2 26 Feb 07 jari 111         
2 26 Feb 07 jari 112     Point parentLoc = parent.getParent().getLocationOnScreen();
2 26 Feb 07 jari 113     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 114   
2 26 Feb 07 jari 115     int h = Math.min(initHeight, screenSize.height - parentLoc.y);
2 26 Feb 07 jari 116     //take less but if too low set back to initHeight    
2 26 Feb 07 jari 117     setSizes(initWidth, h < 400 ? 400 : h);
2 26 Feb 07 jari 118     
2 26 Feb 07 jari 119     JPanel controlPanel = new JPanel();
2 26 Feb 07 jari 120     controlPanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 121     Dimension dim = new Dimension(initWidth, 50);
2 26 Feb 07 jari 122     controlPanel.setPreferredSize(dim);
2 26 Feb 07 jari 123     controlPanel.setSize(dim);
2 26 Feb 07 jari 124
2 26 Feb 07 jari 125     JButton syncButton = new JButton("Update Overlay Window");
2 26 Feb 07 jari 126     syncButton.setFocusPainted(false);
2 26 Feb 07 jari 127     syncButton.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
2 26 Feb 07 jari 128     syncButton.setActionCommand("sync-view-overlay-command");
2 26 Feb 07 jari 129     syncButton.addActionListener(listener);
2 26 Feb 07 jari 130     syncButton.setPreferredSize(new Dimension(150,30));
2 26 Feb 07 jari 131     syncButton.setSize(150,30);    
2 26 Feb 07 jari 132     controlPanel.add(syncButton, new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 133     
2 26 Feb 07 jari 134     JPanel mainPanel = new JPanel();
2 26 Feb 07 jari 135     mainPanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 136     mainPanel.setBorder(BorderFactory.createLineBorder(Color.black));
2 26 Feb 07 jari 137   
2 26 Feb 07 jari 138     mainPanel.add(pane, new GridBagConstraints(0,0,1,1,1,0.8,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3,3,0,3), 0,0));
2 26 Feb 07 jari 139     mainPanel.add(controlPanel, new GridBagConstraints(0,1,1,1,1,0.05,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,3,0,3), 0,0));
2 26 Feb 07 jari 140     mainPanel.add(navPanel, new GridBagConstraints(0,2,1,1,1,0.05,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,3,3,3), 0,0));
2 26 Feb 07 jari 141       
2 26 Feb 07 jari 142     getContentPane().add(mainPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 143     navPanel.tabs.setSelectedIndex(1);
2 26 Feb 07 jari 144     pack();
2 26 Feb 07 jari 145     navPanel.tabs.setSelectedIndex(0);
2 26 Feb 07 jari 146   }
2 26 Feb 07 jari 147   
2 26 Feb 07 jari 148   /**
2 26 Feb 07 jari 149    * Displays the thumbnail to the left of MeV's View panel, if that puts it on screen
2 26 Feb 07 jari 150    * or else center
2 26 Feb 07 jari 151    */
2 26 Feb 07 jari 152   public void showThumbnail() {    
2 26 Feb 07 jari 153     Point parentLoc = parent.getParent().getLocationOnScreen();
2 26 Feb 07 jari 154     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 155     
2 26 Feb 07 jari 156     if(parentLoc != null && parentLoc.x-getWidth() > 0 && parentLoc.y > 0) {
2 26 Feb 07 jari 157       setLocation(parentLoc.x-getWidth(), parentLoc.y-parent.getHeaderComponent().getHeight());             
2 26 Feb 07 jari 158     } else {    
2 26 Feb 07 jari 159       setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);       
2 26 Feb 07 jari 160     }
2 26 Feb 07 jari 161     show();
2 26 Feb 07 jari 162   }
2 26 Feb 07 jari 163   
2 26 Feb 07 jari 164   /**
2 26 Feb 07 jari 165    * Disposes of the LEMThumbNail dialog
2 26 Feb 07 jari 166    *
2 26 Feb 07 jari 167    */
2 26 Feb 07 jari 168   public void hideThumbnail() {
2 26 Feb 07 jari 169     dispose();
2 26 Feb 07 jari 170   }
2 26 Feb 07 jari 171   
2 26 Feb 07 jari 172   /**
2 26 Feb 07 jari 173    * Set boolean to indicate if locus arrows are of fixed length or variable
2 26 Feb 07 jari 174    * Required to help navigation of the parent LEM
2 26 Feb 07 jari 175    * @param fixed true if arrow lengths are fixed
2 26 Feb 07 jari 176    */
2 26 Feb 07 jari 177   public void setIsFixedLength(boolean fixed) {
2 26 Feb 07 jari 178     this.isFixedLength = fixed;
2 26 Feb 07 jari 179   }
2 26 Feb 07 jari 180   
2 26 Feb 07 jari 181   /** 
2 26 Feb 07 jari 182    * Sets the size of the pane and canvase
2 26 Feb 07 jari 183    * @param w width
2 26 Feb 07 jari 184    * @param h height
2 26 Feb 07 jari 185    */
2 26 Feb 07 jari 186   private void setSizes(int w, int h) {
2 26 Feb 07 jari 187     setSize(w,h);
2 26 Feb 07 jari 188     pane.setSize(w, h - this.navInitHeight);
2 26 Feb 07 jari 189     pane.setPreferredSize(new Dimension(w, h-this.navInitHeight));
2 26 Feb 07 jari 190     canvas.setSize(w,this.locusIDs.length+1);
2 26 Feb 07 jari 191     canvas.setPreferredSize(new Dimension(w, this.locusIDs.length));
2 26 Feb 07 jari 192   }
2 26 Feb 07 jari 193   
2 26 Feb 07 jari 194   /**
2 26 Feb 07 jari 195    * Updates the coordinate valies and current parent height
2 26 Feb 07 jari 196    * @param start list of start locations
2 26 Feb 07 jari 197    * @param end list of end locations
2 26 Feb 07 jari 198    * @param parentHeight parent height
2 26 Feb 07 jari 199    */
2 26 Feb 07 jari 200   public void updateCoords(int [] start, int [] end, int parentHeight) {    
2 26 Feb 07 jari 201     canvas.updateCoords(start, end, parentHeight);  
2 26 Feb 07 jari 202   }
2 26 Feb 07 jari 203   
2 26 Feb 07 jari 204   /**
2 26 Feb 07 jari 205    * Jumps to indiated location, y is the y pixel on the parent
2 26 Feb 07 jari 206    * @param y
2 26 Feb 07 jari 207    */
2 26 Feb 07 jari 208   private void jumpToLocation(int y) {
2 26 Feb 07 jari 209     if(y > maxY || !parent.isVisible())
2 26 Feb 07 jari 210       return;
2 26 Feb 07 jari 211     
2 26 Feb 07 jari 212     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 213
2 26 Feb 07 jari 214     float loc = (float)Math.min(canvas.start[y], canvas.end[y]);
2 26 Feb 07 jari 215     framework.setContentLocation(0, (int)(loc));
2 26 Feb 07 jari 216     
2 26 Feb 07 jari 217     canvas.viewerY1 = y;      
2 26 Feb 07 jari 218     canvas.viewerY2 = y + Math.round(maxY * ((yClipBounds[1]- yClipBounds[0])/(float)canvas.parentHeight));
2 26 Feb 07 jari 219     canvas.repaint();
2 26 Feb 07 jari 220   }  
2 26 Feb 07 jari 221
2 26 Feb 07 jari 222   /**
2 26 Feb 07 jari 223    * Jumps to the designated location on the main viewer
2 26 Feb 07 jari 224    * @param y y-location on the parent viewer
2 26 Feb 07 jari 225    */
2 26 Feb 07 jari 226   private void jumpToMainViewerLocation(int y) {  
2 26 Feb 07 jari 227     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 228
2 26 Feb 07 jari 229     //don't jump if the full viewer is in screen
2 26 Feb 07 jari 230     if(yClipBounds[1] - yClipBounds[0] > canvas.parentHeight)
2 26 Feb 07 jari 231       return;
2 26 Feb 07 jari 232     
2 26 Feb 07 jari 233     framework.setContentLocation(0, y);
2 26 Feb 07 jari 234     
2 26 Feb 07 jari 235     //need to set canvas overlay bounds
2 26 Feb 07 jari 236     canvas.viewerY1 = (int)(maxY*(y/(float)canvas.parentHeight));      
2 26 Feb 07 jari 237     canvas.viewerY2 = canvas.viewerY1 + Math.round(maxY * ((yClipBounds[1]- yClipBounds[0])/(float)canvas.parentHeight));
2 26 Feb 07 jari 238     canvas.repaint();
2 26 Feb 07 jari 239   }
2 26 Feb 07 jari 240   
2 26 Feb 07 jari 241   /**
2 26 Feb 07 jari 242    * Scrolls the navigator pane to top
2 26 Feb 07 jari 243    */
2 26 Feb 07 jari 244   private void scrollPaneToStart() {
2 26 Feb 07 jari 245     pane.getViewport().setViewPosition(new Point(0, 0));
2 26 Feb 07 jari 246     pane.validate();
2 26 Feb 07 jari 247   }
2 26 Feb 07 jari 248   
2 26 Feb 07 jari 249   /**
2 26 Feb 07 jari 250    * Scrolls the navigator pane to the end
2 26 Feb 07 jari 251    */
2 26 Feb 07 jari 252   private void scrollPaneToEnd() {
2 26 Feb 07 jari 253     pane.getViewport().setViewPosition(new Point(0, canvas.getHeight()-(canvas.viewerY2-canvas.viewerY2)));    
2 26 Feb 07 jari 254     pane.validate();
2 26 Feb 07 jari 255   }
2 26 Feb 07 jari 256   
2 26 Feb 07 jari 257   /**
2 26 Feb 07 jari 258    * Advances parent lem and Thumbnail boundary indicator one
2 26 Feb 07 jari 259    * viewable window specified by next, previous, or end cases
2 26 Feb 07 jari 260    * @param mode
2 26 Feb 07 jari 261    */
2 26 Feb 07 jari 262   private void windowJump(int mode) {
2 26 Feb 07 jari 263     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 264     switch(mode) {
2 26 Feb 07 jari 265     case LEMThumbNail.TOP_WINDOW:
2 26 Feb 07 jari 266       jumpToMainViewerLocation(0);
2 26 Feb 07 jari 267       scrollPaneToStart();
2 26 Feb 07 jari 268       break;
2 26 Feb 07 jari 269     case LEMThumbNail.NEXT_WINDOW:
2 26 Feb 07 jari 270       if(yClipBounds[1] >= canvas.parentHeight)
2 26 Feb 07 jari 271         jumpToLocation(0);  //wrap to start
2 26 Feb 07 jari 272       else 
2 26 Feb 07 jari 273         jumpToMainViewerLocation(yClipBounds[1]);
2 26 Feb 07 jari 274       break;
2 26 Feb 07 jari 275     case LEMThumbNail.PREV_WINDOW:
2 26 Feb 07 jari 276       if(yClipBounds[0] < yClipBounds[1]-yClipBounds[0])
2 26 Feb 07 jari 277         windowJump(LEMThumbNail.END_WINDOW); //wrap to end
2 26 Feb 07 jari 278       else
2 26 Feb 07 jari 279         jumpToMainViewerLocation(2*yClipBounds[0] - yClipBounds[1]);
2 26 Feb 07 jari 280       break;
2 26 Feb 07 jari 281     case LEMThumbNail.END_WINDOW:
2 26 Feb 07 jari 282       jumpToMainViewerLocation(canvas.parentHeight - (yClipBounds[1]-yClipBounds[0]));
2 26 Feb 07 jari 283       scrollPaneToEnd();
2 26 Feb 07 jari 284       break;
2 26 Feb 07 jari 285     }
2 26 Feb 07 jari 286   }
2 26 Feb 07 jari 287   
2 26 Feb 07 jari 288   /**
2 26 Feb 07 jari 289    * Advances lem and thumbnail to a specified location determined in a dialog
2 26 Feb 07 jari 290    */
2 26 Feb 07 jari 291   private void jumpToBasePairLocataion(){  
2 26 Feb 07 jari 292     int loc = navPanel.getSelectedLocation();
2 26 Feb 07 jari 293     
2 26 Feb 07 jari 294     if(loc < 0) {
2 26 Feb 07 jari 295       JOptionPane.showMessageDialog(LEMThumbNail.this, "Improper BP location value.", "Format Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 296       return;
2 26 Feb 07 jari 297     }
2 26 Feb 07 jari 298     
2 26 Feb 07 jari 299     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 300     
2 26 Feb 07 jari 301     int viewerY = parent.jumpToLocation(loc);        
2 26 Feb 07 jari 302     //if found, move thumbnail overlay
2 26 Feb 07 jari 303     if(viewerY >= 0) {
2 26 Feb 07 jari 304       int y = Math.round(maxY*(viewerY/(float)canvas.parentHeight));
2 26 Feb 07 jari 305       canvas.viewerY1 = y;      
2 26 Feb 07 jari 306       canvas.viewerY2 = y + Math.round(maxY * ((yClipBounds[1]- yClipBounds[0])/(float)canvas.parentHeight));
2 26 Feb 07 jari 307       canvas.repaint();
2 26 Feb 07 jari 308     }
2 26 Feb 07 jari 309   }
2 26 Feb 07 jari 310   
2 26 Feb 07 jari 311   /**
2 26 Feb 07 jari 312    * Advances LEM and thumbnail to a specified locus location
2 26 Feb 07 jari 313    */
2 26 Feb 07 jari 314   private void jumpToLocusLocation() {
2 26 Feb 07 jari 315     String locusID = navPanel.getLocusID();
2 26 Feb 07 jari 316     
2 26 Feb 07 jari 317     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 318     
2 26 Feb 07 jari 319     int viewerY = parent.jumpToLocus(locusID);
2 26 Feb 07 jari 320     //if found, move thumbnail overlay    
2 26 Feb 07 jari 321     if(viewerY >= 0) {
2 26 Feb 07 jari 322       int y = Math.round(maxY*(viewerY/(float)canvas.parentHeight));
2 26 Feb 07 jari 323       canvas.viewerY1 = y;      
2 26 Feb 07 jari 324       canvas.viewerY2 = y + Math.round(maxY * ((yClipBounds[1]- yClipBounds[0])/(float)canvas.parentHeight));
2 26 Feb 07 jari 325       canvas.repaint();
2 26 Feb 07 jari 326     }    
2 26 Feb 07 jari 327   }
2 26 Feb 07 jari 328   
2 26 Feb 07 jari 329   
2 26 Feb 07 jari 330   /**
2 26 Feb 07 jari 331    * Coordinates overlay (indicator rectangle on thumbnail) to current
2 26 Feb 07 jari 332    * viewable area on canvas
2 26 Feb 07 jari 333    */
2 26 Feb 07 jari 334   private void syncOverlayPosition() {
2 26 Feb 07 jari 335     int [] yClipBounds = parent.getYClipBounds();
2 26 Feb 07 jari 336     canvas.viewerY1 = Math.round(yClipBounds[0]*(maxY/(float)canvas.parentHeight));    
2 26 Feb 07 jari 337     canvas.viewerY2 = canvas.viewerY1 + Math.round(maxY * ((yClipBounds[1]- yClipBounds[0])/(float)canvas.parentHeight));
2 26 Feb 07 jari 338     canvas.repaint();
2 26 Feb 07 jari 339   }
2 26 Feb 07 jari 340   
2 26 Feb 07 jari 341   
2 26 Feb 07 jari 342
2 26 Feb 07 jari 343   /**
2 26 Feb 07 jari 344    * 
2 26 Feb 07 jari 345    * @author braisted
2 26 Feb 07 jari 346    *
2 26 Feb 07 jari 347    * The Canvas class provides a JPanel on which to render the thumbnail
2 26 Feb 07 jari 348    * image of the LEM.
2 26 Feb 07 jari 349    */
2 26 Feb 07 jari 350   public class Canvas extends JPanel {
2 26 Feb 07 jari 351     
2 26 Feb 07 jari 352     //Start and end arrays
2 26 Feb 07 jari 353     private int [] start;
2 26 Feb 07 jari 354     private int [] end;
2 26 Feb 07 jari 355   
2 26 Feb 07 jari 356     //values to show
2 26 Feb 07 jari 357     private FloatMatrix matrix;
2 26 Feb 07 jari 358     
2 26 Feb 07 jari 359     private int numSamples;
2 26 Feb 07 jari 360     
2 26 Feb 07 jari 361     //parent LEM's pixel height
2 26 Feb 07 jari 362     private int parentHeight;
2 26 Feb 07 jari 363     
2 26 Feb 07 jari 364     //canvas height
2 26 Feb 07 jari 365     private int currHeight;
2 26 Feb 07 jari 366     
2 26 Feb 07 jari 367     //cursor location
2 26 Feb 07 jari 368     private int cursorY;
2 26 Feb 07 jari 369     private boolean cursorOnTop = false;
2 26 Feb 07 jari 370     
2 26 Feb 07 jari 371     private int viewerY1 = 0;
2 26 Feb 07 jari 372     private int viewerY2 = 0;
2 26 Feb 07 jari 373     
2 26 Feb 07 jari 374     /**
2 26 Feb 07 jari 375      * Constructs a canvas
2 26 Feb 07 jari 376      * @param startCoords locus start locations
2 26 Feb 07 jari 377      * @param endCoords locus end locations
2 26 Feb 07 jari 378      * @param fm <code>FloatMatrix</code> of data values to show
2 26 Feb 07 jari 379      * @param parentHeight initial height of the parent viewer
2 26 Feb 07 jari 380      * @param y1 current upper visible limit in LEM
2 26 Feb 07 jari 381      * @param y2 current lower visible limit in LEM
2 26 Feb 07 jari 382      * @param listener event listener
2 26 Feb 07 jari 383      */
2 26 Feb 07 jari 384     public Canvas(int [] startCoords, int [] endCoords, FloatMatrix fm, int parentHeight, int y1, int y2, Listener listener) {
2 26 Feb 07 jari 385       this.start = startCoords;
2 26 Feb 07 jari 386       this.end = endCoords;
2 26 Feb 07 jari 387       this.matrix = fm;
2 26 Feb 07 jari 388       this.parentHeight = parentHeight;
2 26 Feb 07 jari 389       this.numSamples = fm.getColumnDimension();
2 26 Feb 07 jari 390       initHeight = fm.getRowDimension();
2 26 Feb 07 jari 391       viewerY1 = (int)(initHeight*(y1/(float)parentHeight));
2 26 Feb 07 jari 392       viewerY2 = (int)(initHeight*(y2/(float)parentHeight));
2 26 Feb 07 jari 393
2 26 Feb 07 jari 394       setBackground(Color.white);
2 26 Feb 07 jari 395       ToolTipManager.sharedInstance().registerComponent(this);      
2 26 Feb 07 jari 396       addMouseMotionListener(listener);
2 26 Feb 07 jari 397       addMouseListener(listener);
2 26 Feb 07 jari 398     }
2 26 Feb 07 jari 399     
2 26 Feb 07 jari 400     /**
2 26 Feb 07 jari 401      * Provides tool tip text based on current cursor location
2 26 Feb 07 jari 402      */
2 26 Feb 07 jari 403     public String getToolTipText() {      
2 26 Feb 07 jari 404       if(cursorY >= 0 && cursorY < start.length) {
2 26 Feb 07 jari 405         return locusIDs[cursorY]+", "+String.valueOf(startValues[cursorY]+", "+String.valueOf(endValues[cursorY]));
2 26 Feb 07 jari 406       }
2 26 Feb 07 jari 407       return null;
2 26 Feb 07 jari 408     }
2 26 Feb 07 jari 409     
2 26 Feb 07 jari 410     /**
2 26 Feb 07 jari 411      * Updates coordinates and parrent height
2 26 Feb 07 jari 412      * @param start start locations
2 26 Feb 07 jari 413      * @param end end locations
2 26 Feb 07 jari 414      * @param parentHeight parent height
2 26 Feb 07 jari 415      */
2 26 Feb 07 jari 416     public void updateCoords(int [] start, int [] end, int parentHeight) {
2 26 Feb 07 jari 417       this.start = start;
2 26 Feb 07 jari 418       this.end = end;
2 26 Feb 07 jari 419       this.parentHeight = parentHeight;
2 26 Feb 07 jari 420       repaint();
2 26 Feb 07 jari 421     }
2 26 Feb 07 jari 422
2 26 Feb 07 jari 423     
2 26 Feb 07 jari 424     /**
2 26 Feb 07 jari 425      * renders the thumbnail
2 26 Feb 07 jari 426      */
2 26 Feb 07 jari 427     public void paint(Graphics g) {
2 26 Feb 07 jari 428       super.paint(g);
2 26 Feb 07 jari 429       
2 26 Feb 07 jari 430       currHeight = getHeight();
2 26 Feb 07 jari 431       int currWidth = getWidth();
2 26 Feb 07 jari 432       float convFactor = (float)((float)currHeight/parentHeight);
2 26 Feb 07 jari 433       
2 26 Feb 07 jari 434       int xStep;
2 26 Feb 07 jari 435       if(!isFixedLength)
2 26 Feb 07 jari 436         xStep = (int)(currWidth/(numSamples * (maxStrata + 1)));
2 26 Feb 07 jari 437       else
2 26 Feb 07 jari 438         xStep = (int)(currWidth/numSamples);
2 26 Feb 07 jari 439
2 26 Feb 07 jari 440       int elementInset = 0;
2 26 Feb 07 jari 441       int elementWidth = 0;
2 26 Feb 07 jari 442       if(xStep > 5) {
2 26 Feb 07 jari 443         elementInset = xStep/4;
2 26 Feb 07 jari 444         elementWidth = xStep - elementInset;
2 26 Feb 07 jari 445       }
2 26 Feb 07 jari 446       
2 26 Feb 07 jari 447       int currX;
2 26 Feb 07 jari 448       int currY = 0;
2 26 Feb 07 jari 449       int deltaY = 0;
2 26 Feb 07 jari 450       for(int i = 0; i < start.length; i++) {
2 26 Feb 07 jari 451         currX = 0;
2 26 Feb 07 jari 452   
2 26 Feb 07 jari 453         //try a fixed delta of 1
2 26 Feb 07 jari 454         deltaY = 1;
2 26 Feb 07 jari 455         
2 26 Feb 07 jari 456         //add an offset
2 26 Feb 07 jari 457         if(!isFixedLength)
2 26 Feb 07 jari 458           currX += strata[i]*xStep;
2 26 Feb 07 jari 459         
2 26 Feb 07 jari 460         for(int j = 0; j < numSamples; j++) {
2 26 Feb 07 jari 461           g.setColor(parent.getColor(matrix.get(i,j)));
2 26 Feb 07 jari 462           if(elementWidth > 0)
2 26 Feb 07 jari 463             g.fillRect(currX + elementInset, currY, elementWidth, deltaY);
2 26 Feb 07 jari 464           else        
2 26 Feb 07 jari 465             g.fillRect(currX, currY, xStep , deltaY);
2 26 Feb 07 jari 466
2 26 Feb 07 jari 467           if(!isFixedLength)
2 26 Feb 07 jari 468             currX += xStep * (maxStrata+1);
2 26 Feb 07 jari 469           else
2 26 Feb 07 jari 470             currX += xStep;
2 26 Feb 07 jari 471         }
2 26 Feb 07 jari 472         currY += deltaY;
2 26 Feb 07 jari 473       }
2 26 Feb 07 jari 474       
2 26 Feb 07 jari 475       maxY = currY;
2 26 Feb 07 jari 476       
2 26 Feb 07 jari 477       g.setColor(Color.blue);      
2 26 Feb 07 jari 478       g.drawRect(0, viewerY1, currWidth, viewerY2-viewerY1);
2 26 Feb 07 jari 479       g.drawRect(1, viewerY1+1, currWidth-2, viewerY2-viewerY1-2);      
2 26 Feb 07 jari 480     }
2 26 Feb 07 jari 481   }
2 26 Feb 07 jari 482   
2 26 Feb 07 jari 483   
2 26 Feb 07 jari 484   /**
2 26 Feb 07 jari 485    * @author braisted
2 26 Feb 07 jari 486    *
2 26 Feb 07 jari 487    * The control panel supports special navigation activities,
2 26 Feb 07 jari 488    * locus navigation, location navigation, and window jumping
2 26 Feb 07 jari 489    */
2 26 Feb 07 jari 490   public class ControlPanel extends JPanel {
2 26 Feb 07 jari 491   
2 26 Feb 07 jari 492     private JTextField idField;
2 26 Feb 07 jari 493     private JTextField locField;
2 26 Feb 07 jari 494     JTabbedPane tabs;
2 26 Feb 07 jari 495     
2 26 Feb 07 jari 496     /**
2 26 Feb 07 jari 497      * Constructs the ControlPanel
2 26 Feb 07 jari 498      * @param listener event listener
2 26 Feb 07 jari 499      * @param locusIDFieldName locus annotation field name (label)
2 26 Feb 07 jari 500      */
2 26 Feb 07 jari 501     public ControlPanel(Listener listener, String locusIDFieldName) {      
2 26 Feb 07 jari 502       tabs = new JTabbedPane();
2 26 Feb 07 jari 503
2 26 Feb 07 jari 504       Dimension dim = new Dimension(navInitWidth, navInitHeight);
2 26 Feb 07 jari 505       
2 26 Feb 07 jari 506       tabs.setPreferredSize(dim);
2 26 Feb 07 jari 507       tabs.setSize(dim);
2 26 Feb 07 jari 508       
2 26 Feb 07 jari 509       ParameterPanel windowPanel = new ParameterPanel("Navigate by Window Steps");
2 26 Feb 07 jari 510       windowPanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 511       windowPanel.setPreferredSize(dim);
2 26 Feb 07 jari 512       windowPanel.setSize(dim);
2 26 Feb 07 jari 513       
2 26 Feb 07 jari 514       JButton prevWindowButton = new JButton("Prev.", GUIFactory.getIcon("nav_arrow_up.gif"));      
2 26 Feb 07 jari 515       prevWindowButton.setHorizontalTextPosition(JButton.LEFT);
2 26 Feb 07 jari 516       prevWindowButton.setFocusPainted(false);
2 26 Feb 07 jari 517       prevWindowButton.setActionCommand("jump-to-previous-command");
2 26 Feb 07 jari 518       prevWindowButton.addActionListener(listener);      
2 26 Feb 07 jari 519       
2 26 Feb 07 jari 520       JButton nextWindowButton = new JButton("Next", GUIFactory.getIcon("nav_arrow_down.gif"));
2 26 Feb 07 jari 521       nextWindowButton.setHorizontalTextPosition(JButton.LEFT);
2 26 Feb 07 jari 522       nextWindowButton.setFocusPainted(false);
2 26 Feb 07 jari 523       nextWindowButton.setActionCommand("jump-to-next-command");
2 26 Feb 07 jari 524       nextWindowButton.addActionListener(listener);      
2 26 Feb 07 jari 525       
2 26 Feb 07 jari 526       JButton topWindowButton = new JButton("Start", GUIFactory.getIcon("nav_arrow_top.gif"));
2 26 Feb 07 jari 527       topWindowButton.setHorizontalTextPosition(JButton.LEFT);
2 26 Feb 07 jari 528       topWindowButton.setFocusPainted(false);
2 26 Feb 07 jari 529       topWindowButton.setActionCommand("jump-to-top-command");
2 26 Feb 07 jari 530       topWindowButton.addActionListener(listener);  
2 26 Feb 07 jari 531       
2 26 Feb 07 jari 532       JButton bottomWindowButton = new JButton("End", GUIFactory.getIcon("nav_arrow_end.gif"));
2 26 Feb 07 jari 533       bottomWindowButton.setHorizontalTextPosition(JButton.LEFT);
2 26 Feb 07 jari 534       bottomWindowButton.setFocusPainted(false);
2 26 Feb 07 jari 535       bottomWindowButton.setActionCommand("jump-to-end-command");
2 26 Feb 07 jari 536       bottomWindowButton.addActionListener(listener);  
2 26 Feb 07 jari 537       
2 26 Feb 07 jari 538       //add components
2 26 Feb 07 jari 539       windowPanel.add(topWindowButton, new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,10,10),0,0));
2 26 Feb 07 jari 540       windowPanel.add(prevWindowButton, new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,10,0),0,0));
2 26 Feb 07 jari 541       windowPanel.add(bottomWindowButton, new GridBagConstraints(0,1,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,10),0,0));
2 26 Feb 07 jari 542       windowPanel.add(nextWindowButton, new GridBagConstraints(1,1,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,10,0,0),0,0));
2 26 Feb 07 jari 543       
2 26 Feb 07 jari 544       tabs.add("Window Stepping", windowPanel);
2 26 Feb 07 jari 545       
2 26 Feb 07 jari 546       ParameterPanel idPanel = new ParameterPanel("Gene ID Navigation");
2 26 Feb 07 jari 547       idPanel.setLayout(new GridBagLayout());      
2 26 Feb 07 jari 548       idPanel.setPreferredSize(dim);
2 26 Feb 07 jari 549       idPanel.setSize(dim);
2 26 Feb 07 jari 550
2 26 Feb 07 jari 551       JLabel geneIDLabel = new JLabel("Enter Gene ID:");      
2 26 Feb 07 jari 552       JLabel geneIDFieldLabel = new JLabel("("+locusIDFieldName+")");
2 26 Feb 07 jari 553       idField = new JTextField();
2 26 Feb 07 jari 554       JButton idGOButton = new JButton("Find Gene");
2 26 Feb 07 jari 555       idGOButton.setFocusPainted(false);
2 26 Feb 07 jari 556       idGOButton.setActionCommand("jump-to-id-command");
2 26 Feb 07 jari 557       idGOButton.setPreferredSize(new Dimension(120,30));
2 26 Feb 07 jari 558       idGOButton.setSize(120,30);
2 26 Feb 07 jari 559       idGOButton.addActionListener(listener);
2 26 Feb 07 jari 560       
2 26 Feb 07 jari 561       idPanel.add(geneIDLabel, new GridBagConstraints(0,0,1,1,0.5,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,5,0,5),0,0));
2 26 Feb 07 jari 562       idPanel.add(idField, new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 563       idPanel.add(geneIDFieldLabel, new GridBagConstraints(0,1,2,1,1,0,GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,5,5,0),0,0));
2 26 Feb 07 jari 564       idPanel.add(idGOButton, new GridBagConstraints(0,2,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 565       
2 26 Feb 07 jari 566       tabs.add("Gene Locator", idPanel);
2 26 Feb 07 jari 567       
2 26 Feb 07 jari 568       ParameterPanel locPanel = new ParameterPanel("Location Navigation");
2 26 Feb 07 jari 569       locPanel.setLayout(new GridBagLayout());
2 26 Feb 07 jari 570       locPanel.setPreferredSize(dim);
2 26 Feb 07 jari 571       locPanel.setSize(dim);
2 26 Feb 07 jari 572
2 26 Feb 07 jari 573       JLabel locLabel = new JLabel("Base Pair Location:");      
2 26 Feb 07 jari 574       locField = new JTextField();
2 26 Feb 07 jari 575       JButton locButton = new JButton("Find Location");
2 26 Feb 07 jari 576       locButton.setFocusPainted(false);
2 26 Feb 07 jari 577       locButton.setActionCommand("jump-to-location-command");
2 26 Feb 07 jari 578       locButton.setPreferredSize(new Dimension(120,30));
2 26 Feb 07 jari 579       locButton.setSize(120,30);
2 26 Feb 07 jari 580       locButton.addActionListener(listener);      
2 26 Feb 07 jari 581       
2 26 Feb 07 jari 582       locPanel.add(locLabel, new GridBagConstraints(0,0,1,1,0.5,0,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,5,0,5),0,0));
2 26 Feb 07 jari 583       locPanel.add(locField, new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0,5,0,0),0,0));
2 26 Feb 07 jari 584       locPanel.add(locButton, new GridBagConstraints(0,1,2,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(10,0,0,0),0,0));
2 26 Feb 07 jari 585       
2 26 Feb 07 jari 586       tabs.add("Base Locator", locPanel);
2 26 Feb 07 jari 587       
2 26 Feb 07 jari 588       setLayout(new GridBagLayout());
2 26 Feb 07 jari 589       add(tabs, 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 590     }
2 26 Feb 07 jari 591     
2 26 Feb 07 jari 592     /**
2 26 Feb 07 jari 593      * Returns the locus ID in text field
2 26 Feb 07 jari 594      * @return locus id
2 26 Feb 07 jari 595      */
2 26 Feb 07 jari 596     public String getLocusID() {
2 26 Feb 07 jari 597       return this.idField.getText();
2 26 Feb 07 jari 598     }
2 26 Feb 07 jari 599     
2 26 Feb 07 jari 600     /**
2 26 Feb 07 jari 601      * Returns the selected location
2 26 Feb 07 jari 602      * @return location to go to, (chromosomal location)
2 26 Feb 07 jari 603      */
2 26 Feb 07 jari 604     public int getSelectedLocation() {
2 26 Feb 07 jari 605       int location = -1;
2 26 Feb 07 jari 606       try {
2 26 Feb 07 jari 607         location = Integer.parseInt(this.locField.getText());
2 26 Feb 07 jari 608       } catch (NumberFormatException nfe) {
2 26 Feb 07 jari 609         //pass on the -1 as a format exception;
2 26 Feb 07 jari 610       }      
2 26 Feb 07 jari 611       return location;      
2 26 Feb 07 jari 612     }
2 26 Feb 07 jari 613     
2 26 Feb 07 jari 614   }
2 26 Feb 07 jari 615   
2 26 Feb 07 jari 616   /**
2 26 Feb 07 jari 617    * 
2 26 Feb 07 jari 618    * @author braisted
2 26 Feb 07 jari 619    *
2 26 Feb 07 jari 620    * Listener class to support navigation events
2 26 Feb 07 jari 621    */
2 26 Feb 07 jari 622   public class Listener extends MouseAdapter implements ActionListener, MouseMotionListener {
2 26 Feb 07 jari 623     
2 26 Feb 07 jari 624     public void mouseClicked(MouseEvent me) {
2 26 Feb 07 jari 625       jumpToLocation(me.getY());      
2 26 Feb 07 jari 626     }
2 26 Feb 07 jari 627     
2 26 Feb 07 jari 628     public void mouseEntered(MouseEvent me) {
2 26 Feb 07 jari 629       canvas.cursorOnTop = true;      
2 26 Feb 07 jari 630     }
2 26 Feb 07 jari 631     
2 26 Feb 07 jari 632     public void mouseExited(MouseEvent me) {
2 26 Feb 07 jari 633       canvas.cursorOnTop = false;
2 26 Feb 07 jari 634     }
2 26 Feb 07 jari 635     /* (non-Javadoc)
2 26 Feb 07 jari 636      * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
2 26 Feb 07 jari 637      */
2 26 Feb 07 jari 638     public void mouseDragged(MouseEvent e) {
2 26 Feb 07 jari 639       
2 26 Feb 07 jari 640     }
2 26 Feb 07 jari 641     
2 26 Feb 07 jari 642     /* (non-Javadoc)
2 26 Feb 07 jari 643      * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
2 26 Feb 07 jari 644      */
2 26 Feb 07 jari 645     public void mouseMoved(MouseEvent e) {
2 26 Feb 07 jari 646       canvas.cursorY = e.getY();
2 26 Feb 07 jari 647     }
2 26 Feb 07 jari 648     
2 26 Feb 07 jari 649     /* (non-Javadoc)
2 26 Feb 07 jari 650      * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
2 26 Feb 07 jari 651      */
2 26 Feb 07 jari 652     public void actionPerformed(ActionEvent ae) {
2 26 Feb 07 jari 653       String command = ae.getActionCommand();
2 26 Feb 07 jari 654       if(command.equals("sync-view-overlay-command")) {
2 26 Feb 07 jari 655         syncOverlayPosition();
2 26 Feb 07 jari 656       } else if (command.equals("jump-to-top-command")) {
2 26 Feb 07 jari 657         windowJump(LEMThumbNail.TOP_WINDOW);
2 26 Feb 07 jari 658       } else if (command.equals("jump-to-next-command")) {
2 26 Feb 07 jari 659         windowJump(LEMThumbNail.NEXT_WINDOW);
2 26 Feb 07 jari 660       } else if (command.equals("jump-to-previous-command")) {
2 26 Feb 07 jari 661         windowJump(LEMThumbNail.PREV_WINDOW);
2 26 Feb 07 jari 662       } else if (command.equals("jump-to-end-command")) {
2 26 Feb 07 jari 663         windowJump(LEMThumbNail.END_WINDOW);
2 26 Feb 07 jari 664       } else if (command.equals("jump-to-location-command")) {      
2 26 Feb 07 jari 665         jumpToBasePairLocataion();
2 26 Feb 07 jari 666       } else if (command.equals("jump-to-id-command")) {      
2 26 Feb 07 jari 667         jumpToLocusLocation();
2 26 Feb 07 jari 668       }
2 26 Feb 07 jari 669     }
2 26 Feb 07 jari 670     
2 26 Feb 07 jari 671   }
2 26 Feb 07 jari 672   
2 26 Feb 07 jari 673 }