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);
}
return maxScroll;
}
+
+ @Override
+ public String toString()
+ {
+ return "[ViewportRange startRes=" + startRes + " endRes=" + endRes
+ + " startSeq=" + startSeq + " endSeq=" + endSeq + "]";
+ }
}