JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / appletgui / SeqPanel.java
index 10db71a..6ca9499 100644 (file)
@@ -432,8 +432,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
     else
     {
-      residue = "X".equalsIgnoreCase(displayChar) ? "X"
-              : ResidueProperties.aa2Triplet.get(displayChar);
+      residue = "X".equalsIgnoreCase(displayChar) ? "X" : ("*"
+              .equals(displayChar) ? "STOP" : ResidueProperties.aa2Triplet
+              .get(displayChar));
       if (residue != null)
       {
         text.append(" Residue: ").append(residue);
@@ -480,7 +481,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
          * Convert position in sequence (base 1) to sequence character array
          * index (base 0)
          */
-        int start = m.getStart() - 1;
+        int start = m.getStart() - m.getSequence().getStart();
         setStatusMessage(seq, start, sequenceIndex);
         return true;
       }
@@ -488,6 +489,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     return false;
   }
 
+  @Override
   public void mousePressed(MouseEvent evt)
   {
     lastMousePress = evt.getPoint();
@@ -538,6 +540,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     return;
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
     SequenceI sequence = av.getAlignment().getSequenceAt(findSeq(evt));
@@ -563,14 +566,15 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
       if (features != null && features.length > 0)
       {
-        seqCanvas.getFeatureRenderer().amendFeatures(new SequenceI[]
-        { sequence }, features, false, ap);
+        seqCanvas.getFeatureRenderer().amendFeatures(
+                new SequenceI[] { sequence }, features, false, ap);
 
         seqCanvas.highlightSearchResults(null);
       }
     }
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     mouseDragging = false;
@@ -606,8 +610,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
 
       int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
-              + hgap
-              + seqCanvas.getAnnotationHeight();
+              + hgap + seqCanvas.getAnnotationHeight();
 
       int y = evt.getY();
       y -= hgap;
@@ -664,8 +667,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       }
 
       int cHeight = av.getAlignment().getHeight() * av.getCharHeight()
-              + hgap
-              + seqCanvas.getAnnotationHeight();
+              + hgap + seqCanvas.getAnnotationHeight();
 
       y -= hgap;
 
@@ -716,6 +718,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
   String lastMessage;
 
+  @Override
   public void mouseOverSequence(SequenceI sequence, int index, int pos)
   {
     String tmp = sequence.hashCode() + index + "";
@@ -727,6 +730,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     lastMessage = tmp;
   }
 
+  @Override
   public void highlightSequence(SearchResults results)
   {
     if (av.isFollowHighlight())
@@ -747,12 +751,14 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     return this.ap == null ? null : this.ap.av;
   }
 
+  @Override
   public void updateColours(SequenceI seq, int index)
   {
     System.out.println("update the seqPanel colours");
     // repaint();
   }
 
+  @Override
   public void mouseMoved(MouseEvent evt)
   {
     int res = findRes(evt);
@@ -799,8 +805,8 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
     else
     {
-      obj = "X".equalsIgnoreCase(ch) ? "X"
-              : ResidueProperties.aa2Triplet.get(ch);
+      obj = "X".equalsIgnoreCase(ch) ? "X" : ResidueProperties.aa2Triplet
+              .get(ch);
       if (obj != null)
       {
         text.append(" Residue: ").append(obj);
@@ -884,13 +890,15 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       for (int i = 0; i < features.length; i++)
       {
         if (av.getFeaturesDisplayed() == null
-                || !av.getFeaturesDisplayed().isVisible(features[i].getType()))
+                || !av.getFeaturesDisplayed().isVisible(
+                        features[i].getType()))
         {
           continue;
         }
 
         if (features[i].featureGroup != null
-                && !seqCanvas.fr.checkGroupVisibility(features[i].featureGroup,false))
+                && !seqCanvas.fr.checkGroupVisibility(
+                        features[i].featureGroup, false))
         {
           continue;
         }
@@ -911,6 +919,15 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
   Tooltip tooltip;
 
+  /**
+   * set when the current UI interaction has resulted in a change that requires
+   * overview shading to be recalculated. this could be changed to something
+   * more expressive that indicates what actually has changed, so selective
+   * redraws can be applied
+   */
+  private boolean needOverviewUpdate; // TODO: refactor to avcontroller
+
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     if (mouseWheelPressed)
@@ -1046,8 +1063,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       if (editCommand == null)
       {
         editCommand = new EditCommand(MessageManager.formatMessage(
-                "label.edit_params", new String[]
-                { label }));
+                "label.edit_params", new String[] { label }));
       }
     }
 
@@ -1281,14 +1297,14 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         {
           for (int j = lastres; j < startres; j++)
           {
-            insertChar(j, new SequenceI[]
-            { seq }, fixedRight);
+            insertChar(j, new SequenceI[] { seq }, fixedRight);
           }
         }
         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
@@ -1303,8 +1319,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
               endEditing();
               break;
             }
-            deleteChar(startres, new SequenceI[]
-            { seq }, fixedRight);
+            deleteChar(startres, new SequenceI[] { seq }, fixedRight);
           }
         }
         else
@@ -1322,8 +1337,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
           if (max > 0)
           {
-            editCommand.appendEdit(Action.DELETE_GAP, new SequenceI[]
-            { seq }, startres, max, av.getAlignment(), true);
+            editCommand.appendEdit(Action.DELETE_GAP,
+                    new SequenceI[] { seq }, startres, max,
+                    av.getAlignment(), true);
           }
         }
       }
@@ -1513,9 +1529,11 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     {
       return;
     }
-
-    stretchGroup.recalcConservation(); // always do this - annotation has own
-                                       // state
+    // always do this - annotation has own state
+    // but defer colourscheme update until hidden sequences are passed in
+    boolean vischange = stretchGroup.recalcConservation(true);
+    // here we rely on stretchGroup == av.getSelection()
+    needOverviewUpdate |= vischange && av.isSelectionDefinedGroup();
     if (stretchGroup.cs != null)
     {
       stretchGroup.cs.alignmentChanged(stretchGroup,
@@ -1532,11 +1550,12 @@ public class SeqPanel extends Panel implements MouseMotionListener,
                 stretchGroup.getName());
       }
     }
+    PaintRefresher.Refresh(ap, av.getSequenceSetId());
+    ap.paintAlignment(needOverviewUpdate);
+    needOverviewUpdate = false;
     changeEndRes = false;
     changeStartRes = false;
     stretchGroup = null;
-    PaintRefresher.Refresh(ap, av.getSequenceSetId());
-    ap.paintAlignment(true);
     av.sendSelection();
   }
 
@@ -1588,6 +1607,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       if (res > (stretchGroup.getStartRes() - 1))
       {
         stretchGroup.setEndRes(res);
+        needOverviewUpdate |= av.isSelectionDefinedGroup();
       }
     }
     else if (changeStartRes)
@@ -1595,6 +1615,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       if (res < (stretchGroup.getEndRes() + 1))
       {
         stretchGroup.setStartRes(res);
+        needOverviewUpdate |= av.isSelectionDefinedGroup();
       }
     }
 
@@ -1628,6 +1649,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       if (stretchGroup.getSequences(null).contains(nextSeq))
       {
         stretchGroup.deleteSequence(seq, false);
+        needOverviewUpdate |= av.isSelectionDefinedGroup();
       }
       else
       {
@@ -1637,6 +1659,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         }
 
         stretchGroup.addSequence(nextSeq, false);
+        needOverviewUpdate |= av.isSelectionDefinedGroup();
       }
     }
 
@@ -1659,6 +1682,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     seqCanvas.repaint();
   }
 
+  @Override
   public void mouseEntered(MouseEvent e)
   {
     if (oldSeq < 0)
@@ -1673,6 +1697,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     }
   }
 
+  @Override
   public void mouseExited(MouseEvent e)
   {
     if (av.getWrapAlignment())
@@ -1732,6 +1757,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       running = false;
     }
 
+    @Override
     public void run()
     {
       running = true;
@@ -1776,6 +1802,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   /**
    * modify current selection according to a received message.
    */
+  @Override
   public void selection(SequenceGroup seqsel, ColumnSelection colsel,
           SelectionSource source)
   {
@@ -1801,9 +1828,12 @@ public class SeqPanel extends Panel implements MouseMotionListener,
 
     // do we want to thread this ? (contention with seqsel and colsel locks, I
     // suspect)
-    // rules are: colsel is copied if there is a real intersection between
-    // sequence selection
-    boolean repaint = false, copycolsel = true;
+    /*
+     * only copy colsel if there is a real intersection between
+     * sequence selection and this panel's alignment
+     */
+    boolean repaint = false;
+    boolean copycolsel = false;
     if (av.getSelectionGroup() == null || !av.isSelectionGroupChanged(true))
     {
       SequenceGroup sgroup = null;
@@ -1820,11 +1850,9 @@ public class SeqPanel extends Panel implements MouseMotionListener,
         }
         sgroup = seqsel.intersect(av.getAlignment(),
                 (av.hasHiddenRows()) ? av.getHiddenRepSequences() : null);
-        if ((sgroup == null || sgroup.getSize() == 0)
-                && (colsel == null || colsel.size() == 0))
+        if ((sgroup != null && sgroup.getSize() > 0))
         {
-          // don't copy columns if the region didn't intersect.
-          copycolsel = false;
+          copycolsel = true;
         }
       }
       if (sgroup != null && sgroup.getSize() > 0)
@@ -1843,7 +1871,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
     {
       // the current selection is unset or from a previous message
       // so import the new colsel.
-      if (colsel == null || colsel.size() == 0)
+      if (colsel == null || colsel.isEmpty())
       {
         if (av.getColumnSelection() != null)
         {
@@ -1928,33 +1956,34 @@ public class SeqPanel extends Panel implements MouseMotionListener,
   protected boolean selectionFromTranslation(SequenceGroup seqsel,
           ColumnSelection colsel, SelectionSource source)
   {
-    if (!(source instanceof AlignViewportI)) {
+    if (!(source instanceof AlignViewportI))
+    {
       return false;
     }
     final AlignViewportI sourceAv = (AlignViewportI) source;
-    if (sourceAv.getCodingComplement() != av && av.getCodingComplement() != sourceAv)
+    if (sourceAv.getCodingComplement() != av
+            && av.getCodingComplement() != sourceAv)
     {
       return false;
     }
-  
+
     /*
      * Map sequence selection
      */
     SequenceGroup sg = MappingUtils.mapSequenceGroup(seqsel, sourceAv, av);
     av.setSelectionGroup(sg);
     av.isSelectionGroupChanged(true);
-  
+
     /*
      * Map column selection
      */
     ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv,
             av);
     av.setColumnSelection(cs);
-    av.isColSelChanged(true);
-  
+
     ap.scalePanelHolder.repaint();
     ap.repaint();
-  
+
     return true;
   }