Merge branch 'develop' into features/JAL-2446NCList
[jalview.git] / src / jalview / viewmodel / ViewportRanges.java
index abbc24c..42d490e 100644 (file)
@@ -135,9 +135,10 @@ public class ViewportRanges extends ViewportProperties
     /*
      * if not wrapped, don't leave white space at the right margin
      */
-    if (!wrappedMode && (start > getVisibleAlignmentWidth() - 1))
+    int lastColumn = getVisibleAlignmentWidth() - 1;
+    if (!wrappedMode && (start > lastColumn))
     {
-      startRes = Math.max(getVisibleAlignmentWidth() - 1, 0);
+      startRes = Math.max(lastColumn, 0);
     }
     else if (start < 0)
     {
@@ -153,9 +154,9 @@ public class ViewportRanges extends ViewportProperties
     {
       endRes = 0;
     }
-    else if (!wrappedMode && (end > getVisibleAlignmentWidth() - 1))
+    else if (!wrappedMode && (end > lastColumn))
     {
-      endRes = Math.max(getVisibleAlignmentWidth() - 1, 0);
+      endRes = Math.max(lastColumn, 0);
     }
     else
     {
@@ -172,30 +173,6 @@ public class ViewportRanges extends ViewportProperties
   }
 
   /**
-   * Set last residue visible in the viewport. Fires a property change event.
-   * 
-   * @param res
-   *          residue position
-   */
-  public void setEndRes(int res)
-  {
-    int startres = res;
-    int width = getViewportWidth();
-
-    /*
-     * if not wrapped, don't leave white space at the right margin
-     */
-    if (!wrappedMode)
-    {
-      if (startres + width - 1 > getVisibleAlignmentWidth() - 1)
-      {
-        startres = getVisibleAlignmentWidth() - width;
-      }
-    }
-    setStartEndRes(startres - width + 1, startres);
-  }
-
-  /**
    * Set the first sequence visible in the viewport, maintaining the height. If
    * the viewport would extend past the last sequence, sets the viewport so it
    * sits at the bottom of the alignment. Fires a property change event.
@@ -479,18 +456,42 @@ public class ViewportRanges extends ViewportProperties
   }
 
   /**
-   * Scroll a wrapped alignment so that the specified residue is visible. Fires
-   * a property change event.
+   * Scroll a wrapped alignment so that the specified residue is in the first
+   * repeat of the wrapped view. Fires a property change event. Answers true if
+   * the startRes changed, else false.
    * 
    * @param res
    *          residue position to scroll to
+   * @return
    */
-  public void scrollToWrappedVisible(int res)
+  public boolean scrollToWrappedVisible(int res)
   {
-    // get the start residue of the wrapped row which res is in
-    // and set that as our start residue
+    int oldStartRes = startRes;
     int width = getViewportWidth();
-    setStartRes((res / width) * width);
+
+    if (res >= oldStartRes && res < oldStartRes + width)
+    {
+      return false;
+    }
+
+    boolean up = res < oldStartRes;
+    int widthsToScroll = Math.abs((res - oldStartRes) / width);
+    if (up)
+    {
+      widthsToScroll++;
+    }
+
+    int residuesToScroll = width * widthsToScroll;
+    int newStartRes = up ? oldStartRes - residuesToScroll : oldStartRes
+            + residuesToScroll;
+    if (newStartRes < 0)
+    {
+      newStartRes = 0;
+    }
+
+    setStartRes(newStartRes);
+
+    return true;
   }
 
   /**
@@ -528,7 +529,7 @@ public class ViewportRanges extends ViewportProperties
       }
     }
   }
-  
+
   /**
    * Adjust sequence position for page up. Fires a property change event.
    */
@@ -544,7 +545,7 @@ public class ViewportRanges extends ViewportProperties
               getViewportHeight());
     }
   }
-  
+
   /**
    * Adjust sequence position for page down. Fires a property change event.
    */
@@ -579,16 +580,20 @@ public class ViewportRanges extends ViewportProperties
     wrappedMode = wrapped;
   }
 
+  public boolean isWrappedMode()
+  {
+    return wrappedMode;
+  }
+
   /**
    * Answers the vertical scroll position (0..) to set, given the visible column
-   * that is at top left. Note that if called with the total visible width of
-   * the alignment, this gives the maximum cursor scroll value.
+   * that is at top left.
    * 
    * <pre>
    * Example:
    *    viewport width 40 columns (0-39, 40-79, 80-119...)
    *    column 0 returns scroll position 0
-   *    columns 0-40 return scroll position 1
+   *    columns 1-40 return scroll position 1
    *    columns 41-80 return scroll position 2
    *    etc
    * </pre>
@@ -605,8 +610,35 @@ public class ViewportRanges extends ViewportProperties
      * visible whole widths
      */
     int scroll = topLeftColumn / w;
+
+    /*
+     * add 1 for a part width if there is one
+     */
     scroll += topLeftColumn % w > 0 ? 1 : 0;
 
     return scroll;
   }
+
+  /**
+   * Answers the maximum wrapped vertical scroll value, given the column
+   * position (0..) to show at top left of the visible region.
+   * 
+   * @param topLeftColumn
+   * @return
+   */
+  public int getWrappedMaxScroll(int topLeftColumn)
+  {
+    int scrollPosition = getWrappedScrollPosition(topLeftColumn);
+
+    /*
+     * how many more widths could be drawn after this one?
+     */
+    int columnsRemaining = getVisibleAlignmentWidth() - topLeftColumn;
+    int width = getViewportWidth();
+    int widthsRemaining = columnsRemaining / width
+            + (columnsRemaining % width > 0 ? 1 : 0) - 1;
+    int maxScroll = scrollPosition + widthsRemaining;
+
+    return maxScroll;
+  }
 }