Merge branch 'develop' into features/JAL-2446NCList
[jalview.git] / src / jalview / gui / SeqPanel.java
index 1a3081f..e8cc68b 100644 (file)
@@ -73,9 +73,9 @@ import javax.swing.ToolTipManager;
  * @author $author$
  * @version $Revision: 1.130 $
  */
-public class SeqPanel extends JPanel implements MouseListener,
-        MouseMotionListener, MouseWheelListener, SequenceListener,
-        SelectionListener
+public class SeqPanel extends JPanel
+        implements MouseListener, MouseMotionListener, MouseWheelListener,
+        SequenceListener, SelectionListener
 
 {
   /** DOCUMENT ME!! */
@@ -201,6 +201,7 @@ public class SeqPanel extends JPanel implements MouseListener,
     int res = 0;
     int x = evt.getX();
 
+    int startRes = av.getRanges().getStartRes();
     if (av.getWrapAlignment())
     {
 
@@ -215,7 +216,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
       int y = evt.getY();
       y -= hgap;
-      x -= seqCanvas.labelWidthWest;
+      x = Math.max(0, x - seqCanvas.labelWidthWest);
 
       int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth());
       if (cwidth < 1)
@@ -224,10 +225,11 @@ public class SeqPanel extends JPanel implements MouseListener,
       }
 
       wrappedBlock = y / cHeight;
-      wrappedBlock += av.getRanges().getStartRes() / cwidth;
-
-      res = wrappedBlock * cwidth + x / av.getCharWidth();
-
+      wrappedBlock += startRes / cwidth;
+      // allow for wrapped view scrolled right (possible from Overview)
+      int startOffset = startRes % cwidth;
+      res = wrappedBlock * cwidth + startOffset
+              + +Math.min(cwidth - 1, x / av.getCharWidth());
     }
     else
     {
@@ -237,7 +239,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         // right-hand gutter
         x = seqCanvas.getX() + seqCanvas.getWidth();
       }
-      res = (x / av.getCharWidth()) + av.getRanges().getStartRes();
+      res = (x / av.getCharWidth()) + startRes;
       if (res > av.getRanges().getEndRes())
       {
         // moused off right
@@ -273,15 +275,14 @@ public class SeqPanel extends JPanel implements MouseListener,
 
       y -= hgap;
 
-      seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment()
-              .getHeight() - 1);
+      seq = Math.min((y % cHeight) / av.getCharHeight(),
+              av.getAlignment().getHeight() - 1);
     }
     else
     {
-      seq = Math.min((y / av.getCharHeight())
-              + av.getRanges().getStartSeq(),
-              av
-              .getAlignment().getHeight() - 1);
+      seq = Math.min(
+              (y / av.getCharHeight()) + av.getRanges().getStartSeq(),
+              av.getAlignment().getHeight() - 1);
     }
 
     return seq;
@@ -298,8 +299,8 @@ public class SeqPanel extends JPanel implements MouseListener,
       if (editCommand != null && editCommand.getSize() > 0)
       {
         ap.alignFrame.addHistoryItem(editCommand);
-        av.firePropertyChange("alignment", null, av.getAlignment()
-                .getSequences());
+        av.firePropertyChange("alignment", null,
+                av.getAlignment().getSequences());
       }
     } finally
     {
@@ -357,8 +358,7 @@ public class SeqPanel extends JPanel implements MouseListener,
 
     HiddenColumns hidden = av.getAlignment().getHiddenColumns();
 
-    if (av.hasHiddenColumns()
- && !hidden.isVisible(seqCanvas.cursorX))
+    if (av.hasHiddenColumns() && !hidden.isVisible(seqCanvas.cursorX))
     {
       int original = seqCanvas.cursorX - dx;
       int maxWidth = av.getAlignment().getWidth();
@@ -681,6 +681,8 @@ public class SeqPanel extends JPanel implements MouseListener,
     }
     lastSearchResults = results;
 
+    boolean wasScrolled = false;
+
     if (av.isFollowHighlight())
     {
       // don't allow highlight of protein/cDNA to also scroll a complementary
@@ -688,13 +690,16 @@ public class SeqPanel extends JPanel implements MouseListener,
       // over residue to change abruptly, causing highlighted residue in panel 2
       // to change, causing a scroll in panel 1 etc)
       ap.setToScrollComplementPanel(false);
-      if (ap.scrollToPosition(results, false))
+      wasScrolled = ap.scrollToPosition(results, false);
+      if (wasScrolled)
       {
         seqCanvas.revalidate();
       }
       ap.setToScrollComplementPanel(true);
     }
-    if (seqCanvas.highlightSearchResults(results))
+
+    boolean noFastPaint = wasScrolled && av.getWrapAlignment();
+    if (seqCanvas.highlightSearchResults(results, noFastPaint))
     {
       setStatusMessage(results);
     }
@@ -833,8 +838,9 @@ public class SeqPanel extends JPanel implements MouseListener,
     Point p = lastp;
     if (!event.isShiftDown() || p == null)
     {
-      p = (tooltipText != null && tooltipText.length() > 6) ? new Point(
-              event.getX() + wdth, event.getY() - 20) : null;
+      p = (tooltipText != null && tooltipText.length() > 6)
+              ? new Point(event.getX() + wdth, event.getY() - 20)
+              : null;
     }
     /*
      * TODO: try to modify position region is not obcured by tooltip
@@ -932,9 +938,9 @@ public class SeqPanel extends JPanel implements MouseListener,
       }
       else
       {
-        residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*"
-                .equals(displayChar) ? "STOP"
-                : ResidueProperties.aa2Triplet.get(displayChar));
+        residue = "X".equalsIgnoreCase(displayChar) ? "X"
+                : ("*".equals(displayChar) ? "STOP"
+                        : ResidueProperties.aa2Triplet.get(displayChar));
       }
       text.append(" ").append(nucleotide ? "Nucleotide" : "Residue")
               .append(": ").append(residue == null ? displayChar : residue);
@@ -991,8 +997,8 @@ public class SeqPanel extends JPanel implements MouseListener,
       int oldWidth = av.getCharWidth();
 
       // Which is bigger, left-right or up-down?
-      if (Math.abs(evt.getY() - lastMousePress.getY()) > Math.abs(evt
-              .getX() - lastMousePress.getX()))
+      if (Math.abs(evt.getY() - lastMousePress.getY()) > Math
+              .abs(evt.getX() - lastMousePress.getX()))
       {
         /*
          * on drag up or down, decrement or increment font size
@@ -1152,8 +1158,9 @@ public class SeqPanel extends JPanel implements MouseListener,
       }
       if (editCommand == null)
       {
-        editCommand = new EditCommand(MessageManager.formatMessage(
-                "label.edit_params", new String[] { label }));
+        editCommand = new EditCommand(MessageManager
+                .formatMessage("label.edit_params", new String[]
+                { label }));
       }
     }
 
@@ -1170,9 +1177,8 @@ public class SeqPanel extends JPanel implements MouseListener,
     ap.alignFrame.statusBar.setText(message.toString());
 
     // Are we editing within a selection group?
-    if (groupEditing
-            || (sg != null && sg.getSequences(av.getHiddenRepSequences())
-                    .contains(seq)))
+    if (groupEditing || (sg != null
+            && sg.getSequences(av.getHiddenRepSequences()).contains(seq)))
     {
       fixedColumns = true;
 
@@ -1268,7 +1274,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         // Find the next gap before the end
         // of the visible region boundary
         boolean blank = false;
-        for (fixedRight = fixedRight; fixedRight > lastres; fixedRight--)
+        for (; fixedRight > lastres; fixedRight--)
         {
           blank = true;
 
@@ -1360,8 +1366,8 @@ public class SeqPanel extends JPanel implements MouseListener,
         }
         else
         {
-          appendEdit(Action.INSERT_GAP, groupSeqs, startres, startres
-                  - lastres);
+          appendEdit(Action.INSERT_GAP, groupSeqs, startres,
+                  startres - lastres);
         }
       }
       else
@@ -1376,8 +1382,8 @@ public class SeqPanel extends JPanel implements MouseListener,
         }
         else
         {
-          appendEdit(Action.DELETE_GAP, groupSeqs, startres, lastres
-                  - startres);
+          appendEdit(Action.DELETE_GAP, groupSeqs, startres,
+                  lastres - startres);
         }
 
       }
@@ -1594,7 +1600,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         SearchResultsI highlight = new SearchResults();
         highlight.addResult(sequence, features.get(0).getBegin(), features
                 .get(0).getEnd());
-        seqCanvas.highlightSearchResults(highlight);
+        seqCanvas.highlightSearchResults(highlight, false);
 
         /*
          * open the Amend Features dialog; clear highlighting afterwards,
@@ -1620,7 +1626,7 @@ public class SeqPanel extends JPanel implements MouseListener,
         av.getRanges().scrollRight(true);
 
       }
-      else
+      else if (!av.getWrapAlignment())
       {
         av.getRanges().scrollUp(false);
       }
@@ -1631,7 +1637,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       {
         av.getRanges().scrollRight(false);
       }
-      else
+      else if (!av.getWrapAlignment())
       {
         av.getRanges().scrollUp(true);
       }
@@ -1656,8 +1662,9 @@ public class SeqPanel extends JPanel implements MouseListener,
 
     if (av.getWrapAlignment() && seq > av.getAlignment().getHeight())
     {
-      JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager
-              .getString("label.cannot_edit_annotations_in_wrapped_view"),
+      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
+              MessageManager.getString(
+                      "label.cannot_edit_annotations_in_wrapped_view"),
               MessageManager.getString("label.wrapped_view_no_edit"),
               JvOptionPane.WARNING_MESSAGE);
       return;
@@ -1808,7 +1815,8 @@ public class SeqPanel extends JPanel implements MouseListener,
       stretchGroup.cs.alignmentChanged(stretchGroup,
               av.getHiddenRepSequences());
 
-      ResidueShaderI groupColourScheme = stretchGroup.getGroupColourScheme();
+      ResidueShaderI groupColourScheme = stretchGroup
+              .getGroupColourScheme();
       String name = stretchGroup.getName();
       if (stretchGroup.cs.conservationApplied())
       {
@@ -2007,9 +2015,8 @@ public class SeqPanel extends JPanel implements MouseListener,
             running = av.getRanges().scrollUp(true);
           }
 
-          if (mouseDragging && (evt.getY() >= getHeight())
-                  && (av.getAlignment().getHeight() > av.getRanges()
-                          .getEndSeq()))
+          if (mouseDragging && (evt.getY() >= getHeight()) && (av
+                  .getAlignment().getHeight() > av.getRanges().getEndSeq()))
           {
             running = av.getRanges().scrollUp(false);
           }
@@ -2045,8 +2052,10 @@ public class SeqPanel extends JPanel implements MouseListener,
     // handles selection messages...
     // TODO: extend config options to allow user to control if selections may be
     // shared between viewports.
-    boolean iSentTheSelection = (av == source || (source instanceof AlignViewport && ((AlignmentViewport) source)
-            .getSequenceSetId().equals(av.getSequenceSetId())));
+    boolean iSentTheSelection = (av == source
+            || (source instanceof AlignViewport
+                    && ((AlignmentViewport) source).getSequenceSetId()
+                            .equals(av.getSequenceSetId())));
 
     if (iSentTheSelection)
     {
@@ -2148,8 +2157,7 @@ public class SeqPanel extends JPanel implements MouseListener,
       repaint = true;
     }
 
-    if (copycolsel
-            && av.hasHiddenColumns()
+    if (copycolsel && av.hasHiddenColumns()
             && (av.getAlignment().getHiddenColumns() == null))
     {
       System.err.println("Bad things");