Merge branch 'bug/JAL-2934proportionalScrolling' into develop
[jalview.git] / src / jalview / gui / SeqPanel.java
index d39f937..845004b 100644 (file)
@@ -348,8 +348,9 @@ public class SeqPanel extends JPanel
    */
   int findAlignmentColumn(MouseEvent evt)
   {
-    return findNearestColumn(evt,true);
+    return findNearestColumn(evt, true);
   }
+
   /**
    * Returns the aligned sequence position (base 0) at the mouse position, or
    * the closest visible one
@@ -364,9 +365,11 @@ public class SeqPanel extends JPanel
   {
     return findNearestColumn(evt, false);
   }
-  
+
   /**
-   * @param nearestColumn when false returns negative values for out of bound positions - -1 for scale left/right, <-1 if far to right
+   * @param nearestColumn
+   *          when false returns negative values for out of bound positions - -1
+   *          for scale left/right, <-1 if far to right
    * @return nearest absolute column to mouse pointer
    */
   private int findNearestColumn(MouseEvent evt, boolean nearestColumn)
@@ -394,9 +397,12 @@ public class SeqPanel extends JPanel
       if (x < 0)
       {
         // mouse is over left scale
-        if (!nearestColumn) {
+        if (!nearestColumn)
+        {
           return -1;
-        } else {
+        }
+        else
+        {
           x = 0;
         }
       }
@@ -408,11 +414,14 @@ public class SeqPanel extends JPanel
       }
       if (x >= cwidth * charWidth)
       {
-        if (!nearestColumn) {
+        if (!nearestColumn)
+        {
           // mouse is over right scale
           return -1;
-        } else {
-          x = cwidth*charWidth -1;
+        }
+        else
+        {
+          x = cwidth * charWidth - 1;
         }
       }
 
@@ -439,7 +448,6 @@ public class SeqPanel extends JPanel
       res = Math.min(res, av.getRanges().getEndRes());
 
     }
-    
 
     if (av.hasHiddenColumns())
     {
@@ -2213,32 +2221,85 @@ public class SeqPanel extends JPanel
     }
   }
 
+  /**
+   * Responds to a mouse wheel movement by scrolling the alignment
+   * <ul>
+   * <li>left or right, if the shift key is down, else up or down</li>
+   * <li>right (or down) if the reported mouse movement is positive</li>
+   * <li>left (or up) if the reported mouse movement is negative</li>
+   * </ul>
+   * Note that this method may also be fired by scrolling with a gesture on a
+   * trackpad.
+   */
   @Override
   public void mouseWheelMoved(MouseWheelEvent e)
   {
     e.consume();
     double wheelRotation = e.getPreciseWheelRotation();
+
+    /*
+     * scroll more for large (fast) mouse movements
+     */
+    int size = 1 + (int) Math.abs(wheelRotation);
+
     if (wheelRotation > 0)
     {
       if (e.isShiftDown())
       {
-        av.getRanges().scrollRight(true);
-
+        /*
+         * scroll right
+         * stop trying to scroll right when limit is reached (saves
+         * expensive calls to Alignment.getWidth())
+         */
+        while (size-- > 0 && !ap.isScrolledFullyRight())
+        {
+          if (!av.getRanges().scrollRight(true))
+          {
+            break;
+          }
+        }
       }
       else
       {
-        av.getRanges().scrollUp(false);
+        /*
+         * scroll down
+         */
+        while (size-- > 0)
+        {
+          if (!av.getRanges().scrollUp(false))
+          {
+            break;
+          }
+        }
       }
     }
     else if (wheelRotation < 0)
     {
       if (e.isShiftDown())
       {
-        av.getRanges().scrollRight(false);
+        /*
+         * scroll left
+         */
+        while (size-- > 0)
+        {
+          if (!av.getRanges().scrollRight(false))
+          {
+            break;
+          }
+        }
       }
       else
       {
-        av.getRanges().scrollUp(true);
+        /*
+         * scroll up
+         */
+        while (size-- > 0)
+        {
+          if (!av.getRanges().scrollUp(true))
+          {
+            break;
+          }
+        }
       }
     }