X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FViewportRanges.java;h=78337780f043d334a34b119dd1b4f1fa53f339f6;hb=c553d9c48f3813ed32342416c3015795869efd2b;hp=e463cc3e29731f1baa4d004d9832ed114be3d3d3;hpb=c55dd45c7f7eeb986ed32189dea45d1caa464b74;p=jalview.git diff --git a/src/jalview/viewmodel/ViewportRanges.java b/src/jalview/viewmodel/ViewportRanges.java index e463cc3..7833778 100644 --- a/src/jalview/viewmodel/ViewportRanges.java +++ b/src/jalview/viewmodel/ViewportRanges.java @@ -97,7 +97,7 @@ public class ViewportRanges extends ViewportProperties */ public int getVisibleAlignmentWidth() { - return al.getWidth() - al.getHiddenColumns().getSize(); + return al.getVisibleWidth(); } /** @@ -136,13 +136,25 @@ public class ViewportRanges extends ViewportProperties int[] oldvalues = updateStartEndRes(start, end); int oldstartres = oldvalues[0]; int oldendres = oldvalues[1]; + + if (oldstartres == startRes && oldendres == endRes) + { + return; // BH 2019.07.27 standard check for no changes + } + // "STARTRES" is a misnomer here -- really "STARTORENDRES" + // note that this could be "no change" if the range is just being expanded changeSupport.firePropertyChange(STARTRES, oldstartres, startRes); if (oldstartres == startRes) { + // only caught in ViewportRangesTest + // No listener cares about this + // "ENDRES" is a misnomer here -- really "ENDONLYRES" + // BH 2019.07.27 adds end change check + // fire only if only the end is changed // event won't be fired if start positions are same // fire an event for the end positions in case they changed - changeSupport.firePropertyChange(ENDRES, oldendres, endRes); + changeSupport.firePropertyChange(ENDRES, oldendres, endRes); } } @@ -249,6 +261,11 @@ public class ViewportRanges extends ViewportProperties */ private int[] updateStartEndSeq(int start, int end) { + + if (end == 3 && this.endSeq == 14 || end == 13 && this.endSeq == 3) { + new NullPointerException().printStackTrace(); + System.out.println("ViewportRange updateStartEndSeq " + start + " " + end + " " + Thread.currentThread()); + } int oldstartseq = this.startSeq; int visibleHeight = getVisibleAlignmentHeight(); if (start > visibleHeight - 1) @@ -285,12 +302,12 @@ public class ViewportRanges extends ViewportProperties * event. * * @param seq - * sequence position + * sequence position in the range [0, height) */ public void setEndSeq(int seq) { - int height = getViewportHeight(); - setStartEndSeq(seq - height + 1, seq); + // BH 2018.04.18 added safety for seq < 0; comment about not being >= height + setStartEndSeq(Math.max(0, seq + 1 - getViewportHeight()), seq); } /** @@ -425,17 +442,21 @@ public class ViewportRanges extends ViewportProperties public void setViewportStartAndHeight(int start, int h) { int vpstart = start; + + int visHeight = getVisibleAlignmentHeight(); if (vpstart < 0) { vpstart = 0; } - else if ((h <= getVisibleAlignmentHeight()) - && (vpstart + h - 1 > getVisibleAlignmentHeight() - 1)) + else if (h <= visHeight && vpstart + h > visHeight) // viewport height is less than the full alignment and we are running off // the bottom { - vpstart = getVisibleAlignmentHeight() - h; + vpstart = visHeight - h; } + // System.out.println("ViewportRanges setviewportStartAndHeight " + vpstart + // + " " + start + " " + h + " " + getVisibleAlignmentHeight()); + setStartEndSeq(vpstart, vpstart + h - 1); } @@ -544,7 +565,8 @@ 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) @@ -563,7 +585,7 @@ public class ViewportRanges extends ViewportProperties * Calculate wrapped start residue from visible start residue * * @param res - * absolute start residue + * visible start residue * @return left column of panel res will be located in */ private int calcWrappedStartResidue(int res) @@ -571,11 +593,6 @@ public class ViewportRanges extends ViewportProperties int oldStartRes = startRes; int width = getViewportWidth(); - /*if (res >= oldStartRes && res < oldStartRes + width) - { - return false; - }*/ - boolean up = res < oldStartRes; int widthsToScroll = Math.abs((res - oldStartRes) / width); if (up) @@ -597,9 +614,9 @@ public class ViewportRanges extends ViewportProperties * 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) { @@ -613,14 +630,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)) { @@ -633,16 +650,16 @@ 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) { boolean changedLocation = false; - // convert the x,y location to absolute values - int visX = al.getHiddenColumns().findColumnPosition(x); + // convert the x,y location to visible coordinates + int visX = al.getHiddenColumns().absoluteToVisibleColumn(x); int visY = al.getHiddenSequences().findIndexWithoutHiddenSeqs(y); // if (vis_x,vis_y) is already visible don't do anything @@ -660,18 +677,22 @@ public class ViewportRanges extends ViewportProperties else { // set the viewport x location to contain vis_x + int newstartres = visX; int width = getViewportWidth(); - updateStartEndRes(visX, visX + width - 1); + if (newstartres + width - 1 > getVisibleAlignmentWidth() - 1) + { + newstartres = getVisibleAlignmentWidth() - width; + } + updateStartEndRes(newstartres, newstartres + width - 1); // set the viewport y location to contain vis_y - int startseq = visY; + int newstartseq = visY; int height = getViewportHeight(); - if (startseq + height - 1 > getVisibleAlignmentHeight() - 1) + if (newstartseq + height - 1 > getVisibleAlignmentHeight() - 1) { - startseq = getVisibleAlignmentHeight() - height; + newstartseq = getVisibleAlignmentHeight() - height; } - updateStartEndSeq(startseq, - startseq + height - 1); + updateStartEndSeq(newstartseq, newstartseq + height - 1); newresseq = new int[] { startRes, startSeq }; } @@ -792,4 +813,10 @@ public class ViewportRanges extends ViewportProperties return maxScroll; } + + + @Override + public String toString() { + return "[ViewportRange " + startSeq + "-" + endSeq + ", "+ startRes + "-" + endRes + "]"; + } }