diff --git a/uk/ac/sanger/artemis/components/alignment/JamView.java b/uk/ac/sanger/artemis/components/alignment/JamView.java index 7a9bfe53cabbd69ee0213e012b53e63e076a2768..2a06ec63657b11fda2cb9b7c3fd296ba1630b961 100644 --- a/uk/ac/sanger/artemis/components/alignment/JamView.java +++ b/uk/ac/sanger/artemis/components/alignment/JamView.java @@ -26,6 +26,7 @@ package uk.ac.sanger.artemis.components.alignment; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FontMetrics; @@ -33,6 +34,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.Stroke; @@ -46,7 +48,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.io.BufferedReader; @@ -405,7 +407,7 @@ public class JamView extends JPanel ruler.repaint(); int ypos = 0; - drawSelectionRange(g2, pixPerBase, start, end); + String refSeq = null; int refSeqStart = start; @@ -429,7 +431,7 @@ public class JamView extends JPanel g2.setColor(light_grey); g2.fillRect(xpos, ypos-11, jspView.getViewport().getWidth()+(ALIGNMENT_PIX_PER_BASE*2), 11); - + drawSelectionRange(g2, pixPerBase, start, end); g2.setColor(Color.black); g2.drawString(refSeq, xpos, ypos); @@ -444,6 +446,8 @@ public class JamView extends JPanel e.printStackTrace(); } } + else + drawSelectionRange(g2, pixPerBase, start, end); boolean drawn[] = new boolean[readsInView.size()]; @@ -804,37 +808,71 @@ public class JamView extends JPanel * Add the alignment view to the supplied <code>JPanel</code> in * a <code>JScrollPane</code>. * @param mainPanel panel to add the alignment to - * @param showTopanel true in standalone mode to show buttons in - * a panel at the top rather than in a popup menu. + * @param autohide automatically hide the top panel containing the buttons */ public void addJamToPanel(final JPanel mainPanel, - final boolean showTopanel) + final boolean autohide, + final FeatureDisplay feature_display) { this.mainPanel = mainPanel; - popup = new JPopupMenu(); - - JPanel topPanel = null; + + if(feature_display != null) + { + this.feature_display = feature_display; + this.selection = feature_display.getSelection(); + } + + final JPanel topPanel = new JPanel(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); - combo = new JComboBox(seqNames); - combo.setEditable(false); - if(showTopanel) + // auto hide top panel + final JCheckBox buttonAutoHide = new JCheckBox("Auto-hide", autohide); + final MouseMotionListener mouseMotionListener = new MouseMotionListener() { - topPanel = new JPanel(new GridBagLayout()); - combo.addItemListener(new ItemListener() + public void mouseDragged(MouseEvent event) { - public void itemStateChanged(ItemEvent e) + handleCanvasMouseDragOrClick(event); + } + + public void mouseMoved(MouseEvent e) + { + int thisHgt = HEIGHT; + if (thisHgt < 5) + thisHgt = 15; + + int y = (int) (e.getY() - jspView.getViewport().getViewRect().getY()); + if (y < thisHgt) { - laststart = -1; - lastend = -1; - setZoomLevel(JamView.this.nbasesInView); + if (!containsComponent(topPanel, mainPanel)) + mainPanel.add(topPanel, BorderLayout.NORTH); } - }); - gc.fill = GridBagConstraints.NONE; - gc.anchor = GridBagConstraints.NORTHWEST; - topPanel.add(combo, gc); - } - + else + { + if (buttonAutoHide.isSelected() && containsComponent(topPanel, mainPanel)) + mainPanel.remove(topPanel); + } + mainPanel.repaint(); + mainPanel.revalidate(); + } + }; + addMouseMotionListener(mouseMotionListener); + + combo = new JComboBox(seqNames); + combo.setEditable(false); + + combo.addItemListener(new ItemListener() + { + public void itemStateChanged(ItemEvent e) + { + laststart = -1; + lastend = -1; + setZoomLevel(JamView.this.nbasesInView); + } + }); + gc.fill = GridBagConstraints.NONE; + gc.anchor = GridBagConstraints.NORTHWEST; + topPanel.add(combo, gc); + checkBoxSingle = new JCheckBox("Single Reads"); checkBoxSingle.addActionListener(new ActionListener() { @@ -843,31 +881,25 @@ public class JamView extends JPanel repaint(); } }); - if(topPanel != null) - topPanel.add(checkBoxSingle, gc); - else - popup.add(checkBoxSingle); + topPanel.add(checkBoxSingle, gc); checkBoxSNPs = new JCheckBox("SNPs"); checkBoxSNPs.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - if(checkBoxSNPs.isSelected() && bases == null) + if (checkBoxSNPs.isSelected() && bases == null) { JOptionPane.showMessageDialog(null, - "No reference sequence supplied to identify SNPs.", - "SNPs", JOptionPane.INFORMATION_MESSAGE); + "No reference sequence supplied to identify SNPs.", "SNPs", + JOptionPane.INFORMATION_MESSAGE); } repaint(); } }); - if(topPanel != null) - topPanel.add(checkBoxSNPs, gc); - else - popup.add(checkBoxSNPs, gc); - - if (topPanel != null) + topPanel.add(checkBoxSNPs, gc); + + if (feature_display == null) { final JTextField baseText = new JTextField(10); JButton goTo = new JButton("GoTo:"); @@ -888,14 +920,12 @@ public class JamView extends JPanel } } }); - topPanel.add(goTo, gc); topPanel.add(baseText, gc); - } - if (topPanel != null) - { JButton zoomIn = new JButton("+"); + Insets ins = new Insets(0,0,0,0); + zoomIn.setMargin(ins); zoomIn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -923,23 +953,23 @@ public class JamView extends JPanel }); topPanel.add(zoomOut, gc); } + + topPanel.add(buttonAutoHide, gc); - mainPanel.setPreferredSize(new Dimension(800,400)); - jspView = new JScrollPane(this, - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + mainPanel.setPreferredSize(new Dimension(800, 400)); + jspView = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - + setDisplay(1, nbasesInView, null); mainPanel.setLayout(new BorderLayout()); - - if(topPanel != null) - mainPanel.add(topPanel, BorderLayout.NORTH); + + mainPanel.add(topPanel, BorderLayout.NORTH); mainPanel.add(jspView, BorderLayout.CENTER); jspView.getVerticalScrollBar().setValue( jspView.getVerticalScrollBar().getMaximum()); - if(topPanel != null) + if (feature_display == null) { addKeyListener(new KeyAdapter() { @@ -967,24 +997,32 @@ public class JamView extends JPanel } }); } - + addMouseListener(new PopupListener()); setFocusable(true); requestFocusInWindow(); - addFocusListener(new FocusListener() + addFocusListener(new FocusListener() { - public void focusGained(FocusEvent fe) {} - public void focusLost(FocusEvent fe) {} + public void focusGained(FocusEvent fe){} + public void focusLost(FocusEvent fe){} }); - // Listen for mouse motion events so that we can select ranges of bases. - addMouseMotionListener(new MouseMotionAdapter() + } + + /** + * Check to see if this component is contained by the display + * (FeatureDisplay) component. + * @return + */ + private boolean containsComponent(JPanel topPanel, JPanel mainPanel) + { + Component[] c = mainPanel.getComponents(); + for(int i=0; i<c.length; i++) { - public void mouseDragged(MouseEvent event) - { - // adjust for scrollbar - handleCanvasMouseDrag(event); - } - }); + if(c[i].equals(topPanel)) + return true; + } + + return false; } public void setVisible(boolean visible) @@ -1144,12 +1182,6 @@ public class JamView extends JPanel { return jspView; } - - public void setFeatureDisplay(FeatureDisplay feature_display) - { - this.feature_display = feature_display; - this.selection = feature_display.getSelection();; - } public void setBases(Bases bases) { @@ -1168,71 +1200,31 @@ public class JamView extends JPanel /** * Handle a mouse drag event on the drawing canvas. **/ - private void handleCanvasMouseDrag(final MouseEvent event) + private void handleCanvasMouseDragOrClick(final MouseEvent event) { - if(event.isShiftDown()) + if(!showBaseAlignment || event.isShiftDown()) return; String refName = (String) combo.getSelectedItem(); int seqLength = seqLengths.get(refName); - float pixPerBase = ((float)getWidth())/(float)(seqLength); - + float pixPerBase = ((float)getWidth())/(float)(seqLength); + int start = (int) Math.round(event.getPoint().getX()/pixPerBase); + if(start < 1) + start = 1; + if(start > seqLength) + start = seqLength; - -/* MarkerRange drag_range = getMarkerRangeFromPosition(event.getPoint()); - selection.setMarkerRange(marker_range); - if(drag_range == null) - return; - - final MarkerRange selected_range = getSelection().getMarkerRange(); - - // if the start and current positions of the drag are not on the - // same Strand then ignore this event - if(selected_range != null && - drag_range.getStrand() != selected_range.getStrand()) - return; - - try + MarkerRange drag_range; + try { - // user has dragged off the screen so use a marker at position 1 - if(drag_range.getStart().getPosition() < 1) - drag_range = new MarkerRange(drag_range.getStrand(), 1, 1); - - // user has dragged off the screen so use a marker at position the - // end of the sequence - if(drag_range.getEnd().getPosition() > getSequenceLength()) - drag_range = new MarkerRange(drag_range.getStrand(), - getSequenceLength(), - getSequenceLength()); + drag_range = new MarkerRange (bases.getForwardStrand(), start, start); + getSelection().setMarkerRange(drag_range); + repaint(); } - catch(OutOfRangeException e) + catch (OutOfRangeException e) { - throw new Error("internal error - unexpected OutOfRangeException"); + e.printStackTrace(); } - - final boolean start_base_is_visible = baseVisible(drag_range.getStart()); - final boolean end_base_is_visible = baseVisible(drag_range.getEnd()); - - if(!start_base_is_visible) - makeBaseVisible(drag_range.getStart()); - - if(!end_base_is_visible) - makeBaseVisible(drag_range.getEnd()); - - // scrolling was necessary so update the visible features vector - if(!start_base_is_visible || !end_base_is_visible) - needVisibleFeatureVectorUpdate(); - - final MarkerRange new_marker_range; - - if(click_range == null) - new_marker_range = drag_range; - else - new_marker_range = selected_range.combineRanges(drag_range, true); - - getSelection().setMarkerRange(new_marker_range); - - repaint();*/ } private Selection getSelection() @@ -1277,15 +1269,14 @@ public class JamView extends JPanel } /** - * * Popup menu listener - * */ class PopupListener extends MouseAdapter { public void mouseClicked(MouseEvent e) { JamView.this.requestFocus(); + handleCanvasMouseDragOrClick(e); } public void mousePressed(MouseEvent e) @@ -1428,7 +1419,7 @@ public class JamView extends JPanel public void windowLostFocus(WindowEvent e){} }); - view.addJamToPanel((JPanel)frame.getContentPane(), true); + view.addJamToPanel((JPanel)frame.getContentPane(), false, null); frame.pack(); view.jspView.getVerticalScrollBar().setValue(