JAL-2605 ensure correct scale width calculation
[jalview.git] / src / jalview / appletgui / SeqCanvas.java
index 94f1caa..0f10363 100755 (executable)
@@ -420,6 +420,9 @@ public class SeqCanvas extends Panel implements ViewportListenerI
 
     FontMetrics fm = getFontMetrics(av.getFont());
 
+    LABEL_EAST = 0;
+    LABEL_WEST = 0;
+
     if (av.getScaleRightWrapped())
     {
       LABEL_EAST = fm.stringWidth(getMask());
@@ -441,7 +444,7 @@ public class SeqCanvas extends Panel implements ViewportListenerI
 
     av.setWrappedWidth(cWidth);
 
-    av.getRanges().setEndRes(av.getRanges().getStartRes() + cWidth - 1);
+    av.getRanges().setViewportStartAndWidth(startRes, cWidth);
 
     int endx;
     int ypos = hgap;
@@ -570,7 +573,7 @@ public class SeqCanvas extends Panel implements ViewportListenerI
       if (av.hasHiddenColumns())
       {
         HiddenColumns hidden = av.getAlignment().getHiddenColumns();
-        for (int[] region : hidden)
+        for (int[] region : hidden.getHiddenColumnsCopy())
         {
           int hideStart = region[0];
           int hideEnd = region[1];
@@ -873,32 +876,44 @@ public class SeqCanvas extends Panel implements ViewportListenerI
   @Override
   public void propertyChange(PropertyChangeEvent evt)
   {
+    String eventName = evt.getPropertyName();
+
     if (!av.getWrapAlignment())
     {
-      if (evt.getPropertyName().equals("startres")
-              || evt.getPropertyName().equals("endres"))
+      int scrollX = 0;
+      if (eventName.equals(ViewportRanges.STARTRES))
       {
         // Make sure we're not trying to draw a panel
         // larger than the visible window
         ViewportRanges vpRanges = av.getRanges();
-        int scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
-        if (scrollX > vpRanges.getEndRes() - vpRanges.getStartRes())
+        scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+        int range = vpRanges.getEndRes() - vpRanges.getStartRes();
+        if (scrollX > range)
         {
-          scrollX = vpRanges.getEndRes() - vpRanges.getStartRes();
+          scrollX = range;
         }
-        else if (scrollX < vpRanges.getStartRes() - vpRanges.getEndRes())
+        else if (scrollX < -range)
         {
-          scrollX = vpRanges.getStartRes() - vpRanges.getEndRes();
+          scrollX = -range;
         }
+      }
+
+      // Both scrolling and resizing change viewport ranges: scrolling changes
+      // both start and end points, but resize only changes end values.
+      // Here we only want to fastpaint on a scroll, with resize using a normal
+      // paint, so scroll events are identified as changes to the horizontal or
+      // vertical start value.
+      if (eventName.equals(ViewportRanges.STARTRES))
+      {
+        // scroll - startres and endres both change
         fastPaint(scrollX, 0);
       }
-      else if (evt.getPropertyName().equals("startseq")
-              || evt.getPropertyName().equals("endseq"))
+      else if (eventName.equals(ViewportRanges.STARTSEQ))
       {
+        // scroll
         fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
       }
     }
-
   }
 
 }