Merge branch 'develop' into bug/JAL-4353_cannot_output_multiple_different_structure_i...
[jalview.git] / src / jalview / gui / SeqPanel.java
index 2caea17..845004b 100644 (file)
@@ -2221,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;
+          }
+        }
       }
     }