X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FViewportRanges.java;h=691e4924cdd34bcde5ed2cc97c89c672fc0ec890;hb=375a7d14a156804a7b2771e7bd813e17f2f8397e;hp=0e7b431988aa156fd517d2a6ce7605eb3519ab44;hpb=24eed665b66cab524acc09a392af9189c4b51706;p=jalview.git diff --git a/src/jalview/viewmodel/ViewportRanges.java b/src/jalview/viewmodel/ViewportRanges.java index 0e7b431..691e492 100644 --- a/src/jalview/viewmodel/ViewportRanges.java +++ b/src/jalview/viewmodel/ViewportRanges.java @@ -544,18 +544,33 @@ public class ViewportRanges extends ViewportProperties * the startRes changed, else false. * * @param res - * residue position to scroll to + * residue position to scroll to NB visible position not absolute + * alignment position * @return */ public boolean scrollToWrappedVisible(int res) { - int oldStartRes = startRes; - int width = getViewportWidth(); - - if (res >= oldStartRes && res < oldStartRes + width) + int newStartRes = calcWrappedStartResidue(res); + if (newStartRes == startRes) { return false; } + setStartRes(newStartRes); + + return true; + } + + /** + * Calculate wrapped start residue from visible start residue + * + * @param res + * visible start residue + * @return left column of panel res will be located in + */ + private int calcWrappedStartResidue(int res) + { + int oldStartRes = startRes; + int width = getViewportWidth(); boolean up = res < oldStartRes; int widthsToScroll = Math.abs((res - oldStartRes) / width); @@ -571,19 +586,16 @@ public class ViewportRanges extends ViewportProperties { newStartRes = 0; } - - setStartRes(newStartRes); - - return true; + return newStartRes; } /** * Scroll so that (x,y) is visible. Fires a property change event. * * @param x - * x position in alignment + * x position in alignment (absolute position) * @param y - * y position in alignment + * y position in alignment (absolute position) */ public void scrollToVisible(int x, int y) { @@ -597,14 +609,14 @@ public class ViewportRanges extends ViewportProperties } HiddenColumns hidden = al.getHiddenColumns(); - while (x < hidden.adjustForHiddenColumns(startRes)) + while (x < hidden.visibleToAbsoluteColumn(startRes)) { if (!scrollRight(false)) { break; } } - while (x > hidden.adjustForHiddenColumns(endRes)) + while (x > hidden.visibleToAbsoluteColumn(endRes)) { if (!scrollRight(true)) { @@ -617,35 +629,52 @@ public class ViewportRanges extends ViewportProperties * Set the viewport location so that a position is visible * * @param x - * column to be visible + * column to be visible: absolute position in alignment * @param y - * row to be visible + * row to be visible: absolute position in alignment */ public boolean setViewportLocation(int x, int y) { - // if (x,y) is already visible don't do anything boolean changedLocation = false; - int vis_x = al.getHiddenColumns().findColumnPosition(x); - int vis_y = al.getHiddenSequences().findIndexWithoutHiddenSeqs(y); + // convert the x,y location to visible coordinates + int visX = al.getHiddenColumns().absoluteToVisibleColumn(x); + int visY = al.getHiddenSequences().findIndexWithoutHiddenSeqs(y); - if (startRes > vis_x || vis_x > endRes - || startSeq > vis_y && vis_y > endSeq) + // if (vis_x,vis_y) is already visible don't do anything + if (startRes > visX || visX > endRes + || startSeq > visY && visY > endSeq) { - int width = getViewportWidth(); - int[] oldresvalues = updateStartEndRes(vis_x, vis_x + width - 1); - - int startseq = vis_y; - int height = getViewportHeight(); - if (startseq + height - 1 > getVisibleAlignmentHeight() - 1) + int[] old = new int[] { startRes, startSeq }; + int[] newresseq; + if (wrappedMode) { - startseq = getVisibleAlignmentHeight() - height; + int newstartres = calcWrappedStartResidue(visX); + setStartRes(newstartres); + newresseq = new int[] { startRes, startSeq }; } - int[] oldseqvalues = updateStartEndSeq(startseq, - startseq + height - 1); + else + { + // set the viewport x location to contain vis_x + int newstartres = visX; + int width = getViewportWidth(); + if (newstartres + width - 1 > getVisibleAlignmentWidth() - 1) + { + newstartres = getVisibleAlignmentWidth() - width; + } + updateStartEndRes(newstartres, newstartres + width - 1); - int[] old = new int[] { oldresvalues[0], oldseqvalues[0] }; - int[] newresseq = new int[] { startRes, startSeq }; + // set the viewport y location to contain vis_y + int newstartseq = visY; + int height = getViewportHeight(); + if (newstartseq + height - 1 > getVisibleAlignmentHeight() - 1) + { + newstartseq = getVisibleAlignmentHeight() - height; + } + updateStartEndSeq(newstartseq, newstartseq + height - 1); + + newresseq = new int[] { startRes, startSeq }; + } changedLocation = true; changeSupport.firePropertyChange(MOVE_VIEWPORT, old, newresseq); }