JAL-147 ViewportRanges calculate wrapped vertical scroll position
[jalview.git] / src / jalview / appletgui / AlignmentPanel.java
index 6826c4c..edf6ad4 100644 (file)
@@ -802,46 +802,45 @@ public class AlignmentPanel extends Panel implements AdjustmentListener,
     sendViewPosition();
   }
 
-  private void adjustVertical(int offy)
+  private void adjustVertical(int newY)
   {
-    int oldX = vpRanges.getStartRes();
-    int oldwidth = vpRanges.getViewportWidth();
-    int oldY = vpRanges.getStartSeq();
-    int oldheight = vpRanges.getViewportHeight();
-
     if (av.getWrapAlignment())
     {
-      int rowSize = seqPanel.seqCanvas
-              .getWrappedCanvasWidth(seqPanel.seqCanvas.getWidth());
-
-      // if we're scrolling to the position we're already at, stop
-      // this prevents infinite recursion of events when the scroll/viewport
-      // ranges values are the same
-      int newX = offy * rowSize;
-      newX += oldX % rowSize; // horizontal scroll offset if any
-      if ((newX == oldX) && (oldwidth == rowSize))
+      /*
+       * if we're scrolling to the position we're already at, stop
+       * this prevents infinite recursion of events when the scroll/viewport
+       * ranges values are the same
+       */
+      int oldX = vpRanges.getStartRes();
+      int oldY = vpRanges.getWrappedScrollPosition(oldX);
+      if (oldY == newY)
       {
         return;
       }
-      else if (offy > -1)
+      else if (newY > -1)
       {
-        // limit page up/down to one width's worth of positions
-        newX = newX > oldX ? oldX + rowSize : oldX - rowSize;
+        /*
+         * limit page up/down to one width's worth of positions
+         */
+        int rowSize = vpRanges.getViewportWidth();
+        int newX = newY > oldY ? oldX + rowSize : oldX - rowSize;
         vpRanges.setViewportStartAndWidth(newX, rowSize);
       }
     }
     else
     {
       int height = seqPanel.seqCanvas.getHeight() / av.getCharHeight();
+      int oldY = vpRanges.getStartSeq();
+      int oldheight = vpRanges.getViewportHeight();
 
       // if we're scrolling to the position we're already at, stop
       // this prevents infinite recursion of events when the scroll/viewport
       // ranges values are the same
-      if ((offy == oldY) && (height == oldheight))
+      if ((newY == oldY) && (height == oldheight))
       {
         return;
       }
-      vpRanges.setViewportStartAndHeight(offy, height);
+      vpRanges.setViewportStartAndHeight(newY, height);
     }
     if (av.getWrapAlignment() || !fastPaint)
     {
@@ -986,35 +985,20 @@ public class AlignmentPanel extends Panel implements AdjustmentListener,
 
   }
 
-  /*
+  /**
    * Set vertical scroll bar parameters for wrapped panel
-   * @param res 
-   *    the residue to scroll to
+   * 
+   * @param topLeftColumn
+   *          the column position at top left (0..)
    */
-  private void setScrollingForWrappedPanel(int res)
+  private void setScrollingForWrappedPanel(int topLeftColumn)
   {
-    // get the width of the alignment in residues
-    int maxwidth = av.getAlignment().getWidth();
-    if (av.hasHiddenColumns())
-    {
-      maxwidth = av.getAlignment().getHiddenColumns()
-              .findColumnPosition(maxwidth) - 1;
-    }
+    int scrollPosition = vpRanges.getWrappedScrollPosition(topLeftColumn);
+    int maxScroll = vpRanges.getWrappedScrollPosition(vpRanges
+            .getVisibleAlignmentWidth() - 1);
 
-    // get the width of the canvas in residues
-    int canvasWidth = seqPanel.seqCanvas
-            .getWrappedCanvasWidth(seqPanel.seqCanvas.getSize().width);
-    if (canvasWidth > 0)
-    {
-      // position we want to scroll to is number of canvasWidth's to get there
-      int current = res / canvasWidth;
-
-      // max scroll position: add one because extent is 1 and scrollbar value
-      // can only be set to at most max - extent
-      int max = maxwidth / canvasWidth + 1;
-      vscroll.setUnitIncrement(1);
-      vscroll.setValues(current, 1, 0, max);
-    }
+    vscroll.setUnitIncrement(1);
+    vscroll.setValues(scrollPosition, 1, 0, maxScroll);
   }
 
   protected Panel sequenceHolderPanel = new Panel();