JAL-3210 Barebones gradle/buildship/eclipse. See README
[jalview.git] / src / jalview / viewmodel / ViewportRanges.java
index e463cc3..4f671da 100644 (file)
@@ -97,7 +97,7 @@ public class ViewportRanges extends ViewportProperties
    */
   public int getVisibleAlignmentWidth()
   {
-    return al.getWidth() - al.getHiddenColumns().getSize();
+    return al.getVisibleWidth();
   }
 
   /**
@@ -224,6 +224,7 @@ public class ViewportRanges extends ViewportProperties
    */
   public void setStartEndSeq(int start, int end)
   {
+    // System.out.println("ViewportRange setStartEndSeq " + start + " " + end);
     int[] oldvalues = updateStartEndSeq(start, end);
     int oldstartseq = oldvalues[0];
     int oldendseq = oldvalues[1];
@@ -285,12 +286,12 @@ public class ViewportRanges extends ViewportProperties
    * event.
    * 
    * @param seq
-   *          sequence position
+   *          sequence position in the range [0, height)
    */
   public void setEndSeq(int seq)
   {
-    int height = getViewportHeight();
-    setStartEndSeq(seq - height + 1, seq);
+    // BH 2018.04.18 added safety for seq < 0; comment about not being >= height
+    setStartEndSeq(Math.max(0, seq + 1 - getViewportHeight()), seq);
   }
 
   /**
@@ -425,17 +426,21 @@ public class ViewportRanges extends ViewportProperties
   public void setViewportStartAndHeight(int start, int h)
   {
     int vpstart = start;
+
+    int visHeight = getVisibleAlignmentHeight();
     if (vpstart < 0)
     {
       vpstart = 0;
     }
-    else if ((h <= getVisibleAlignmentHeight())
-            && (vpstart + h - 1 > getVisibleAlignmentHeight() - 1))
+    else if (h <= visHeight && vpstart + h > visHeight)
     // viewport height is less than the full alignment and we are running off
     // the bottom
     {
-      vpstart = getVisibleAlignmentHeight() - h;
+      vpstart = visHeight - h;
     }
+    // System.out.println("ViewportRanges setviewportStartAndHeight " + vpstart
+    // + " " + start + " " + h + " " + getVisibleAlignmentHeight());
+
     setStartEndSeq(vpstart, vpstart + h - 1);
   }
 
@@ -544,7 +549,8 @@ public class ViewportRanges extends ViewportProperties
    * the startRes changed, else false.
    * 
    * @param res
-   *          residue position to scroll to
+   *          residue position to scroll to NB visible position not absolute
+   *          alignment position
    * @return
    */
   public boolean scrollToWrappedVisible(int res)
@@ -563,7 +569,7 @@ public class ViewportRanges extends ViewportProperties
    * Calculate wrapped start residue from visible start residue
    * 
    * @param res
-   *          absolute start residue
+   *          visible start residue
    * @return left column of panel res will be located in
    */
   private int calcWrappedStartResidue(int res)
@@ -571,11 +577,6 @@ public class ViewportRanges extends ViewportProperties
     int oldStartRes = startRes;
     int width = getViewportWidth();
 
-    /*if (res >= oldStartRes && res < oldStartRes + width)
-    {
-      return false;
-    }*/
-
     boolean up = res < oldStartRes;
     int widthsToScroll = Math.abs((res - oldStartRes) / width);
     if (up)
@@ -597,9 +598,9 @@ public class ViewportRanges extends ViewportProperties
    * Scroll so that (x,y) is visible. Fires a property change event.
    * 
    * @param x
-   *          x position in alignment
+   *          x position in alignment (absolute position)
    * @param y
-   *          y position in alignment
+   *          y position in alignment (absolute position)
    */
   public void scrollToVisible(int x, int y)
   {
@@ -613,14 +614,14 @@ public class ViewportRanges extends ViewportProperties
     }
     
     HiddenColumns hidden = al.getHiddenColumns();
-    while (x < hidden.adjustForHiddenColumns(startRes))
+    while (x < hidden.visibleToAbsoluteColumn(startRes))
     {
       if (!scrollRight(false))
       {
         break;
       }
     }
-    while (x > hidden.adjustForHiddenColumns(endRes))
+    while (x > hidden.visibleToAbsoluteColumn(endRes))
     {
       if (!scrollRight(true))
       {
@@ -633,16 +634,16 @@ public class ViewportRanges extends ViewportProperties
    * Set the viewport location so that a position is visible
    * 
    * @param x
-   *          column to be visible
+   *          column to be visible: absolute position in alignment
    * @param y
-   *          row to be visible
+   *          row to be visible: absolute position in alignment
    */
   public boolean setViewportLocation(int x, int y)
   {
     boolean changedLocation = false;
 
-    // convert the x,y location to absolute values
-    int visX = al.getHiddenColumns().findColumnPosition(x);
+    // convert the x,y location to visible coordinates
+    int visX = al.getHiddenColumns().absoluteToVisibleColumn(x);
     int visY = al.getHiddenSequences().findIndexWithoutHiddenSeqs(y);
 
     // if (vis_x,vis_y) is already visible don't do anything
@@ -660,18 +661,22 @@ public class ViewportRanges extends ViewportProperties
       else
       {
         // set the viewport x location to contain vis_x
+        int newstartres = visX;
         int width = getViewportWidth();
-        updateStartEndRes(visX, visX + width - 1);
+        if (newstartres + width - 1 > getVisibleAlignmentWidth() - 1)
+        {
+          newstartres = getVisibleAlignmentWidth() - width;
+        }
+        updateStartEndRes(newstartres, newstartres + width - 1);
 
         // set the viewport y location to contain vis_y
-        int startseq = visY;
+        int newstartseq = visY;
         int height = getViewportHeight();
-        if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
+        if (newstartseq + height - 1 > getVisibleAlignmentHeight() - 1)
         {
-          startseq = getVisibleAlignmentHeight() - height;
+          newstartseq = getVisibleAlignmentHeight() - height;
         }
-        updateStartEndSeq(startseq,
-              startseq + height - 1);
+        updateStartEndSeq(newstartseq, newstartseq + height - 1);
 
         newresseq = new int[] { startRes, startSeq };
       }