*/
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
{
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)
if (x < 0)
{
// mouse is over left scale
- if (!nearestColumn) {
+ if (!nearestColumn)
+ {
return -1;
- } else {
+ }
+ else
+ {
x = 0;
}
}
}
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;
}
}
res = Math.min(res, av.getRanges().getEndRes());
}
-
if (av.hasHiddenColumns())
{
}
}
+ /**
+ * 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;
+ }
+ }
}
}