Merge branch 'master' into portforward/JAL-2675_2102b1to2103
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index f854e03..f36a8e2 100644 (file)
@@ -132,8 +132,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     if (editCommand != null && editCommand.getSize() > 0)
     {
       ap.alignFrame.addHistoryItem(editCommand);
-      av.firePropertyChange("alignment", null, av.getAlignment()
-              .getSequences());
+      av.firePropertyChange("alignment", null,
+              av.getAlignment().getSequences());
     }
 
     startseq = -1;
@@ -183,23 +183,21 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
     seqCanvas.cursorX += dx;
     seqCanvas.cursorY += dy;
-    if (av.hasHiddenColumns()
-            && !av.getAlignment().getHiddenColumns()
-                    .isVisible(seqCanvas.cursorX))
+    if (av.hasHiddenColumns() && !av.getAlignment().getHiddenColumns()
+            .isVisible(seqCanvas.cursorX))
     {
       int original = seqCanvas.cursorX - dx;
       int maxWidth = av.getAlignment().getWidth();
 
       while (!av.getAlignment().getHiddenColumns()
-              .isVisible(seqCanvas.cursorX)
-              && seqCanvas.cursorX < maxWidth && seqCanvas.cursorX > 0)
+              .isVisible(seqCanvas.cursorX) && seqCanvas.cursorX < maxWidth
+              && seqCanvas.cursorX > 0)
       {
         seqCanvas.cursorX += dx;
       }
 
-      if (seqCanvas.cursorX >= maxWidth
-              || !av.getAlignment().getHiddenColumns()
-                      .isVisible(seqCanvas.cursorX))
+      if (seqCanvas.cursorX >= maxWidth || !av.getAlignment()
+              .getHiddenColumns().isVisible(seqCanvas.cursorX))
       {
         seqCanvas.cursorX = original;
       }
@@ -244,8 +242,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       {
         ranges.scrollUp(false);
       }
-      while (seqCanvas.cursorX < hidden.adjustForHiddenColumns(ranges
-              .getStartRes()))
+      while (seqCanvas.cursorX < hidden
+              .adjustForHiddenColumns(ranges.getStartRes()))
       {
 
         if (!ranges.scrollRight(false))
@@ -253,8 +251,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           break;
         }
       }
-      while (seqCanvas.cursorX > hidden.adjustForHiddenColumns(ranges
-              .getEndRes()))
+      while (seqCanvas.cursorX > hidden
+              .adjustForHiddenColumns(ranges.getEndRes()))
       {
         if (!ranges.scrollRight(true))
         {
@@ -443,9 +441,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
     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));
       if (residue != null)
       {
         text.append(" Residue: ").append(residue);
@@ -507,7 +505,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
     // For now, ignore the mouseWheel font resizing on Macs
     // As the Button2_mask always seems to be true
-    if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON2_MASK) == InputEvent.BUTTON2_MASK
             && !av.MAC)
     {
       mouseWheelPressed = true;
@@ -572,12 +571,13 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       if (!features.isEmpty())
       {
         SearchResultsI highlight = new SearchResults();
-        highlight.addResult(sequence, features.get(0).getBegin(), features
-                .get(0).getEnd());
+        highlight.addResult(sequence, features.get(0).getBegin(),
+                features.get(0).getEnd());
         seqCanvas.highlightSearchResults(highlight);
         seqCanvas.getFeatureRenderer().amendFeatures(
                 Collections.singletonList(sequence), features, false, ap);
-        seqCanvas.highlightSearchResults(null);
+        av.setSearchResults(null); // clear highlighting
+        seqCanvas.repaint(); // draw new/amended features
       }
     }
   }
@@ -615,6 +615,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     int res = 0;
     int x = evt.getX();
 
+    int startRes = av.getRanges().getStartRes();
     if (av.getWrapAlignment())
     {
 
@@ -629,7 +630,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
       int y = evt.getY();
       y -= hgap;
-      x -= seqCanvas.LABEL_WEST;
+      x = Math.max(0, x - seqCanvas.LABEL_WEST);
 
       int cwidth = seqCanvas.getWrappedCanvasWidth(getSize().width);
       if (cwidth < 1)
@@ -638,14 +639,15 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
 
       wrappedBlock = y / cHeight;
-      wrappedBlock += av.getRanges().getStartRes() / cwidth;
-
-      res = wrappedBlock * cwidth + x / av.getCharWidth();
-
+      wrappedBlock += startRes / cwidth;
+      int startOffset = startRes % cwidth; // in case start is scrolled right
+                                           // from 0
+      res = wrappedBlock * cwidth + startOffset
+              + +Math.min(cwidth - 1, x / av.getCharWidth());
     }
     else
     {
-      res = (x / av.getCharWidth()) + av.getRanges().getStartRes();
+      res = (x / av.getCharWidth()) + startRes;
     }
 
     if (av.hasHiddenColumns())
@@ -687,8 +689,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
       y -= hgap;
 
-      seq = Math.min((y % cHeight) / av.getCharHeight(), av.getAlignment()
-              .getHeight() - 1);
+      seq = Math.min((y % cHeight) / av.getCharHeight(),
+              av.getAlignment().getHeight() - 1);
       if (seq < 0)
       {
         seq = -1;
@@ -696,10 +698,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
     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);
       if (seq < 0)
       {
         seq = -1;
@@ -831,8 +832,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       else
       {
         String residue = (ch == 'x' || ch == 'X') ? "X"
-                : ResidueProperties.aa2Triplet
-                .get(String.valueOf(ch));
+                : ResidueProperties.aa2Triplet.get(String.valueOf(ch));
         text.append(" Residue: ").append(residue == null ? ch : residue);
       }
       text.append(" (").append(Integer.toString(respos)).append(")");
@@ -846,7 +846,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     {
       for (int g = 0; g < groups.length; g++)
       {
-        if (groups[g].getStartRes() <= column && groups[g].getEndRes() >= column)
+        if (groups[g].getStartRes() <= column
+                && groups[g].getEndRes() >= column)
         {
           if (!groups[g].getName().startsWith("JTreeGroup")
                   && !groups[g].getName().startsWith("JGroup"))
@@ -934,8 +935,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       int oldWidth = av.getCharWidth();
 
       // Which is bigger, left-right or up-down?
-      if (Math.abs(evt.getY() - lastMousePress.y) > Math.abs(evt.getX()
-              - lastMousePress.x))
+      if (Math.abs(evt.getY() - lastMousePress.y) > Math
+              .abs(evt.getX() - lastMousePress.x))
       {
         int fontSize = av.font.getSize();
 
@@ -1044,8 +1045,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     StringBuffer message = new StringBuffer();
     if (groupEditing)
     {
-      message.append(MessageManager.getString("action.edit_group")).append(
-              ":");
+      message.append(MessageManager.getString("action.edit_group"))
+              .append(":");
       if (editCommand == null)
       {
         editCommand = new EditCommand(
@@ -1063,8 +1064,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
       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 }));
       }
     }
 
@@ -1081,9 +1083,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     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;
 
@@ -1183,8 +1184,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           {
             for (int j = 0; j < startres - lastres; j++)
             {
-              if (!jalview.util.Comparison.isGap(gs.getCharAt(fixedRight
-                      - j)))
+              if (!jalview.util.Comparison
+                      .isGap(gs.getCharAt(fixedRight - j)))
               {
                 blank = false;
                 break;
@@ -1305,9 +1306,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         }
         else
         {
-          editCommand.appendEdit(Action.INSERT_GAP,
-                  new SequenceI[] { seq }, lastres, startres - lastres,
-                  av.getAlignment(), true);
+          editCommand.appendEdit(Action.INSERT_GAP, new SequenceI[] { seq },
+                  lastres, startres - lastres, av.getAlignment(), true);
         }
       }
       else
@@ -1341,8 +1341,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           if (max > 0)
           {
             editCommand.appendEdit(Action.DELETE_GAP,
-                    new SequenceI[] { seq }, startres, max,
-                    av.getAlignment(), true);
+                    new SequenceI[]
+                    { seq }, startres, max, av.getAlignment(), true);
           }
         }
       }
@@ -1402,7 +1402,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
     if (scrollThread != null)
     {
-      scrollThread.running = false;
+      scrollThread.threadRunning = false;
       scrollThread = null;
     }
 
@@ -1437,7 +1437,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
 
     // DETECT RIGHT MOUSE BUTTON IN AWT
-    if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
       List<SequenceFeature> allFeatures = findFeaturesAtColumn(sequence,
               sequence.findPosition(column + 1));
@@ -1648,7 +1649,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       mouseExited(evt);
     }
 
-    if (scrollThread != null)
+    if ((scrollThread != null) && (scrollThread.isRunning()))
     {
       scrollThread.setEvent(evt);
     }
@@ -1664,9 +1665,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       oldSeq = 0;
     }
 
-    if (scrollThread != null)
+    if ((scrollThread != null) && (scrollThread.isRunning()))
     {
-      scrollThread.running = false;
+      scrollThread.stopScrolling();
       scrollThread = null;
     }
   }
@@ -1689,9 +1690,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
     if (evt == null)
     {
-      if (scrollThread != null)
+      if ((scrollThread != null) && (scrollThread.isRunning()))
       {
-        scrollThread.running = false;
+        scrollThread.stopScrolling();
         scrollThread = null;
       }
       mouseDragging = false;
@@ -1714,7 +1715,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
     MouseEvent evt;
 
-    boolean running = false;
+    private volatile boolean threadRunning = true;
 
     public ScrollThread()
     {
@@ -1728,14 +1729,18 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
     public void stopScrolling()
     {
-      running = false;
+      threadRunning = false;
+    }
+
+    public boolean isRunning()
+    {
+      return threadRunning;
     }
 
     @Override
     public void run()
     {
-      running = true;
-      while (running)
+      while (threadRunning)
       {
 
         if (evt != null)
@@ -1744,24 +1749,23 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           if (mouseDragging && evt.getY() < 0
                   && av.getRanges().getStartSeq() > 0)
           {
-            running = av.getRanges().scrollUp(true);
+            av.getRanges().scrollUp(true);
           }
 
-          if (mouseDragging && evt.getY() >= getSize().height
-                  && av.getAlignment().getHeight() > av.getRanges()
-                          .getEndSeq())
+          if (mouseDragging && evt.getY() >= getSize().height && av
+                  .getAlignment().getHeight() > av.getRanges().getEndSeq())
           {
-            running = av.getRanges().scrollUp(false);
+            av.getRanges().scrollUp(false);
           }
 
           if (mouseDragging && evt.getX() < 0)
           {
-            running = av.getRanges().scrollRight(false);
+            av.getRanges().scrollRight(false);
           }
 
           else if (mouseDragging && evt.getX() >= getSize().width)
           {
-            running = av.getRanges().scrollRight(true);
+            av.getRanges().scrollRight(true);
           }
         }
 
@@ -1786,9 +1790,10 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     // handles selection messages...
     // TODO: extend config options to allow user to control if selections may be
     // shared between viewports.
-    if (av != null
-            && (av == source || !av.followSelection || (source instanceof AlignViewport && ((AlignmentViewport) source)
-                    .getSequenceSetId().equals(av.getSequenceSetId()))))
+    if (av != null && (av == source || !av.followSelection
+            || (source instanceof AlignViewport
+                    && ((AlignmentViewport) source).getSequenceSetId()
+                            .equals(av.getSequenceSetId()))))
     {
       return;
     }
@@ -1817,11 +1822,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       {
         if (av.getAlignment() == null)
         {
-          System.out
-                  .println("Selection message: alignviewport av SeqSetId="
-                          + av.getSequenceSetId() + " ViewId="
-                          + av.getViewId()
-                          + " 's alignment is NULL! returning immediatly.");
+          System.out.println("Selection message: alignviewport av SeqSetId="
+                  + av.getSequenceSetId() + " ViewId=" + av.getViewId()
+                  + " 's alignment is NULL! returning immediatly.");
           return;
         }
         sgroup = seqsel.intersect(av.getAlignment(),
@@ -1841,9 +1844,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
       repaint = av.isSelectionGroupChanged(true);
     }
-    if (copycolsel
-            && (av.getColumnSelection() == null || !av
-                    .isColSelChanged(true)))
+    if (copycolsel && (av.getColumnSelection() == null
+            || !av.isColSelChanged(true)))
     {
       // the current selection is unset or from a previous message
       // so import the new colsel.
@@ -1869,8 +1871,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
       repaint |= av.isColSelChanged(true);
     }
-    if (copycolsel
-            && av.hasHiddenColumns()
+    if (copycolsel && av.hasHiddenColumns()
             && (av.getColumnSelection() == null))
     {
       System.err.println("Bad things");
@@ -1905,8 +1906,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
 
     row = row < 0 ? ap.av.getRanges().getStartSeq() : row;
-    ap.scrollTo(ap.av.getRanges().getStartRes(), ap.av.getRanges()
-            .getStartRes(), row, true, true);
+    ap.scrollTo(ap.av.getRanges().getStartRes(),
+            ap.av.getRanges().getStartRes(), row, true, true);
   }
 
   /**
@@ -1918,7 +1919,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   {
 
     column = column < 0 ? ap.av.getRanges().getStartRes() : column;
-    ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true, true);
+    ap.scrollTo(column, column, ap.av.getRanges().getStartSeq(), true,
+            true);
   }
 
   /**