this.startRes = 0;
this.endRes = alignment.getWidth() - 1;
this.startSeq = 0;
- this.endSeq = alignment.getHeight() - 1;
+ this.setEndSeqTest(alignment.getHeight() - 1);
this.al = alignment;
}
+ public static String sTest = "";
+
+ private void setEndSeqTest(int val)
+ {
+ sTest += "ViewPortRanges.setEndseqTest " + val + " "
+ + Thread.currentThread() + "\n";
+ endSeq = val;
+ }
/**
* Get alignment width in cols, including hidden cols
*/
*/
public int getVisibleAlignmentWidth()
{
- return al.getWidth() - al.getHiddenColumns().getSize();
+ return al.getVisibleWidth();
}
/**
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)
{
- // 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);
}
}
*/
public void setStartSeq(int seq)
{
- int startseq = seq;
int height = getViewportHeight();
- if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
- {
- startseq = getVisibleAlignmentHeight() - height;
- }
+ int startseq = Math.min(seq, getVisibleAlignmentHeight() - height);
+ // BH 2019.07.27 cosmetic only -- was:
+ // if (startseq + height - 1 > getVisibleAlignmentHeight() - 1)
+ // {
+ // startseq = getVisibleAlignmentHeight() - height;
+ // }
setStartEndSeq(startseq, startseq + height - 1);
}
*/
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);
}
}
int oldendseq = this.endSeq;
if (end >= visibleHeight)
{
- endSeq = Math.max(visibleHeight - 1, 0);
+ setEndSeqTest(Math.max(visibleHeight - 1, 0));
}
else if (end < 0)
{
- endSeq = 0;
+ setEndSeqTest(0);
}
else
{
- endSeq = end;
+ setEndSeqTest(end);
}
return new int[] { oldstartseq, oldendseq };
}
* 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);
}
/**
}
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);
}
/**
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;
}
+
setStartEndSeq(vpstart, vpstart + h - 1);
}
* 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)
* 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)
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)
* 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)
{
}
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))
{
* 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
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 };
}
return maxScroll;
}
+
+ @Override
+ public String toString()
+ {
+ return "[ViewportRange startRes=" + startRes + " endRes=" + endRes
+ + " startSeq=" + startSeq + " endSeq=" + endSeq + "]";
+ }
}