X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSeqPanel.java;h=845004bdb05d1391565f86889238045bd45eb59a;hb=5640ec0623c6d1205e62f9fe15292f32bfdab7d9;hp=ce60be6f5718ab1d53f452aba3ba77ea56f406fd;hpb=c932f0e85a8852824cdd8ce790af68682732c85c;p=jalview.git diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index ce60be6..845004b 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -343,6 +343,15 @@ public class SeqPanel extends JPanel } /** + * @param evt + * @return absolute column in alignment nearest to the mouse pointer + */ + int findAlignmentColumn(MouseEvent evt) + { + return findNearestColumn(evt, true); + } + + /** * Returns the aligned sequence position (base 0) at the mouse position, or * the closest visible one *

@@ -354,6 +363,17 @@ public class SeqPanel extends JPanel */ int findColumn(MouseEvent evt) { + 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 + * @return nearest absolute column to mouse pointer + */ + private int findNearestColumn(MouseEvent evt, boolean nearestColumn) + { int res = 0; int x = evt.getX(); @@ -377,7 +397,14 @@ public class SeqPanel extends JPanel if (x < 0) { // mouse is over left scale - return -1; + if (!nearestColumn) + { + return -1; + } + else + { + x = 0; + } } int cwidth = seqCanvas.getWrappedCanvasWidth(this.getWidth()); @@ -387,8 +414,15 @@ public class SeqPanel extends JPanel } if (x >= cwidth * charWidth) { - // mouse is over right scale - return -1; + if (!nearestColumn) + { + // mouse is over right scale + return -1; + } + else + { + x = cwidth * charWidth - 1; + } } wrappedBlock = y / cHeight; @@ -405,8 +439,14 @@ public class SeqPanel extends JPanel * rather than right-hand gutter */ x = Math.min(x, seqCanvas.getX() + seqCanvas.getWidth()); + if (nearestColumn) + { + x = Math.max(x, 0); + } + res = (x / charWidth) + startRes; res = Math.min(res, av.getRanges().getEndRes()); + } if (av.hasHiddenColumns()) @@ -2181,32 +2221,85 @@ public class SeqPanel extends JPanel } } + /** + * Responds to a mouse wheel movement by scrolling the alignment + *

+ * 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; + } + } } }