X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fviewmodel%2FViewportRanges.java;h=9f54964e8f7ca4d80c763988a09c151e0ffa35d3;hb=51ca42a8c4525c6871e3c8ea529b6cb8a59bb10f;hp=9a1e13c4d6ead8cd4ea5c95dd4a375ebe3774e6b;hpb=6716ff86e500acc2800936b3f3c7132927a9246b;p=jalview.git diff --git a/src/jalview/viewmodel/ViewportRanges.java b/src/jalview/viewmodel/ViewportRanges.java index 9a1e13c..9f54964 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(); } /** @@ -137,11 +137,31 @@ public class ViewportRanges extends ViewportProperties int oldstartres = oldvalues[0]; int oldendres = oldvalues[1]; + if (oldstartres == startRes && oldendres == endRes) + { + return; // BH 2019.07.27 standard check for no changes + } + + // listeners include: + + // jalview.gui.SeqCanvas[,0,0,568x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] + // STARTRES, STARTRESANDSEQ + // jalview.gui.IdCanvas[,0,0,112x90,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=112,height=0]] + // jalview.gui.ScalePanel[,0,0,594x17,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=] + // jalview.gui.AnnotationPanel[,0,0,0x162,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=1,height=162]] + // jalview.gui.AlignmentPanel[,0,0,706x133,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777225,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=220,height=166]] + // jalview.gui.OverviewPanel[,0,0,543x135,layout=java.awt.BorderLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=543,height=135]] + + + // "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) { - // event won't be fired if start positions are same - // fire an event for the end positions in case they changed + // 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 changeSupport.firePropertyChange(ENDRES, oldendres, endRes); } } @@ -203,12 +223,13 @@ public class ViewportRanges extends ViewportProperties */ public void setStartSeq(int seq) { - int startseq = seq; int height = getViewportHeight(); - if (startseq + height - 1 > getVisibleAlignmentHeight() - 1) - { - startseq = getVisibleAlignmentHeight() - height; - } + int startseq = Math.max(seq, getVisibleAlignmentHeight() - height); + // BH 2019.07.27 cosmetic only -- was: + // if (startseq + height - 1 > getVisibleAlignmentHeight() - 1) + // { + // startseq = getVisibleAlignmentHeight() - height; + // } setStartEndSeq(startseq, startseq + height - 1); } @@ -224,15 +245,24 @@ public class ViewportRanges extends ViewportProperties */ public void setStartEndSeq(int start, int end) { + // System.out.println("ViewportRange setStartEndSeq " + start + " " + end); int[] oldvalues = updateStartEndSeq(start, end); int oldstartseq = oldvalues[0]; int oldendseq = oldvalues[1]; + if (oldstartseq == startSeq && oldendseq == endSeq) + { + return; // BH 2019.07.27 standard check for no changes + } + + // "STARTSEQ" is a misnomer here -- really "STARTORENDSEQ" changeSupport.firePropertyChange(STARTSEQ, oldstartseq, startSeq); if (oldstartseq == startSeq) { - // event won't be fired if start positions are the same - // fire in case the end positions changed + // Note that all listeners ignore this - could be removed, or there is a + // bug. + // "ENDSEQ" is a misnomer here -- really "ENDONLYSEQ" + // additional fire, only if only the end is changed changeSupport.firePropertyChange(ENDSEQ, oldendseq, endSeq); } } @@ -285,12 +315,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); } /** @@ -305,6 +335,7 @@ public class ViewportRanges extends ViewportProperties */ public void setStartResAndSeq(int res, int seq) { + // from Overview only int width = getViewportWidth(); int[] oldresvalues = updateStartEndRes(res, res + width - 1); @@ -316,9 +347,9 @@ public class ViewportRanges extends ViewportProperties } int[] oldseqvalues = updateStartEndSeq(startseq, startseq + height - 1); - int[] old = new int[] { oldresvalues[0], oldseqvalues[0] }; - int[] newresseq = new int[] { startRes, startSeq }; - changeSupport.firePropertyChange(STARTRESANDSEQ, old, newresseq); + int[] oldvalues = new int[] { oldresvalues[0], oldseqvalues[0] }; + int[] newvalues = new int[] { startRes, startSeq }; + changeSupport.firePropertyChange(STARTRESANDSEQ, oldvalues, newvalues); } /** @@ -425,17 +456,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,18 +579,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 +621,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 +644,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)) { @@ -614,33 +661,58 @@ public class ViewportRanges extends ViewportProperties } /** - * Set the viewport location so that a position is visible + * Set the viewport location so that a position is visible. From + * SeqPanel.scrollToVisible(true) only, from AlignFrame keyboard actions + * SeqPanel.scrollCursor[Row(VK_S)/Column(VK_C)/RowAndColumn(VK_ENTER,COMMA)/Position(VK_P)] + * * * @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; - if (startRes > x || x > endRes || startSeq > y && y > endSeq) - { - int width = getViewportWidth(); - int[] oldresvalues = updateStartEndRes(x, x + width - 1); - int startseq = y; - int height = getViewportHeight(); - if (startseq + height - 1 > getVisibleAlignmentHeight() - 1) + // 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 + if (startRes > visX || visX > endRes + || startSeq > visY && visY > endSeq) + { + 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); + + // 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); - int[] old = new int[] { oldresvalues[0], oldseqvalues[0] }; - int[] newresseq = new int[] { startRes, startSeq }; + newresseq = new int[] { startRes, startSeq }; + } changedLocation = true; changeSupport.firePropertyChange(MOVE_VIEWPORT, old, newresseq); }