return null;
}
+ private static final SequenceGroup[] noGroups = new SequenceGroup[0];
+
+ private ArrayList<SequenceGroup> temp = new ArrayList<>();
+
/*
* (non-Javadoc)
*
@Override
public SequenceGroup[] findAllGroups(SequenceI s)
{
- ArrayList<SequenceGroup> temp = new ArrayList<>();
synchronized (groups)
{
+ temp.clear();
int gSize = groups.size();
+ if (gSize == 0)
+ {
+ return noGroups;
+ }
for (int i = 0; i < gSize; i++)
{
SequenceGroup sg = groups.get(i);
gg.dispose();
+
fastPaint = true;
// Call repaint on alignment panel so that repaints from other alignment
// Here we only want to fastpaint on a scroll, with resize using a normal
// paint, so scroll events are identified as changes to the horizontal or
// vertical start value.
- if (evt.getPropertyName().equals(ViewportRanges.STARTRES))
+ switch (evt.getPropertyName())
{
+ case ViewportRanges.STARTRES:
fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (evt.getPropertyName().equals(ViewportRanges.STARTRESANDSEQ))
- {
+ break;
+ case ViewportRanges.STARTRESANDSEQ:
fastPaint(((int[]) evt.getNewValue())[0]
- ((int[]) evt.getOldValue())[0]);
- }
- else if (evt.getPropertyName().equals(ViewportRanges.MOVE_VIEWPORT))
- {
+ break;
+ case ViewportRanges.MOVE_VIEWPORT:
repaint();
+ break;
+ case ViewportRanges.STARTSEQ:
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // ignore
+ break;
}
}
@Override
public void propertyChange(PropertyChangeEvent evt)
{
+ // BH just clarifying logic
String propertyName = evt.getPropertyName();
- if (propertyName.equals(ViewportRanges.STARTSEQ)
- || (av.getWrapAlignment()
- && propertyName.equals(ViewportRanges.STARTRES)))
- {
+ switch (propertyName) {
+ case ViewportRanges.STARTSEQ:
fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
- {
+ return;
+ case ViewportRanges.STARTRES:
+ if (av.getWrapAlignment())
+ {
+ fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+ }
+ return;
+ case ViewportRanges.STARTRESANDSEQ:
fastPaint(((int[]) evt.getNewValue())[1]
- ((int[]) evt.getOldValue())[1]);
- }
- else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
- {
+ return;
+ case ViewportRanges.MOVE_VIEWPORT:
repaint();
+ return;
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // ignore ??
+ return;
}
+// BH 2019.07.27 was:
+// if (propertyName.equals(ViewportRanges.STARTSEQ)
+// || (av.getWrapAlignment()
+// && propertyName.equals(ViewportRanges.STARTRES)))
+// {
+// fastPaint((int) evt.getNewValue() - (int) evt.getOldValue());
+// }
+// else if (propertyName.equals(ViewportRanges.STARTRESANDSEQ))
+// {
+// fastPaint(((int[]) evt.getNewValue())[1]
+// - ((int[]) evt.getOldValue())[1]);
+// }
+// else if (propertyName.equals(ViewportRanges.MOVE_VIEWPORT))
+// {
+// repaint();
+ // }
}
}
public void propertyChange(PropertyChangeEvent evt)
{
String eventName = evt.getPropertyName();
- // System.err.println(">>SeqCanvas propertyChange " + eventName);
- if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
+
+ // BH 2019.07.27 removes dead code introduced in aad3650 and simplifies
+ // logic, emphasizing no check for ENDRES or ENDSEQ
+
+ // Both scrolling and resizing change viewport ranges: scrolling changes
+ // both start and end points, but resize only changes end values.
+ // Here we only want to fastpaint on a scroll, with resize using a normal
+ // paint, so scroll events are identified as changes to the horizontal or
+ // vertical start value.
+
+ // Make sure we're not trying to draw a panel
+ // larger than the visible window
+ int scrollX = 0;
+ switch (eventName)
{
+ case SequenceGroup.SEQ_GROUP_CHANGED:
fastPaint = true;
repaint();
return;
- }
- else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
- {
+ case ViewportRanges.MOVE_VIEWPORT:
fastPaint = false;
- // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
repaint();
return;
+ case ViewportRanges.STARTSEQ:
+ // meaning STARTOREND
+ // typically scroll, but possibly just the end changed
+ fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ return;
+ case ViewportRanges.ENDRES:
+ case ViewportRanges.ENDSEQ:
+ // meaning second event along with "START" -- ENDONLY,NOTSTART
+ // TODO: ignore??
+ return;
+ case ViewportRanges.STARTRES:
+ // meaning STARTOREND
+ scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+ break;
+ case ViewportRanges.STARTRESANDSEQ:
+ scrollX = ((int[]) evt.getNewValue())[0]
+ - ((int[]) evt.getOldValue())[0];
+ break;
+ }
+ ViewportRanges vpRanges = av.getRanges();
+ int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+ scrollX = Math.max(Math.min(scrollX, range), -range);
+ // only STARTRES or STARTRESANDSEQ:
+ if (av.getWrapAlignment())
+ {
+ fastPaintWrapped(scrollX);
}
-
- int scrollX = 0;
- if (eventName.equals(ViewportRanges.STARTRES)
- || eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ else
{
- // Make sure we're not trying to draw a panel
- // larger than the visible window
- if (eventName.equals(ViewportRanges.STARTRES))
- {
- scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
- }
- else
- {
- scrollX = ((int[]) evt.getNewValue())[0]
- - ((int[]) evt.getOldValue())[0];
- }
- ViewportRanges vpRanges = av.getRanges();
-
- int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
- if (scrollX > range)
- {
- scrollX = range;
- }
- else if (scrollX < -range)
- {
- scrollX = -range;
- }
+ fastPaint(scrollX, 0);
}
+
+ // BH 2019.07.27 was:
+ // if (eventName.equals(SequenceGroup.SEQ_GROUP_CHANGED))
+ // {
+ // fastPaint = true;
+ // repaint();
+ // return;
+ // }
+ // else if (eventName.equals(ViewportRanges.MOVE_VIEWPORT))
+ // {
+ // fastPaint = false;
+ // // System.err.println("!!!! fastPaint false from MOVE_VIEWPORT");
+ // repaint();
+ // return;
+ // }
+ //
+ // if (eventName.equals(ViewportRanges.STARTRES)
+ // || eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // // Make sure we're not trying to draw a panel
+ // // larger than the visible window
+ // if (eventName.equals(ViewportRanges.STARTRES))
+ // {
+ // scrollX = (int) evt.getNewValue() - (int) evt.getOldValue();
+ // }
+ // else
+ // {
+ // scrollX = ((int[]) evt.getNewValue())[0]
+ // - ((int[]) evt.getOldValue())[0];
+ // }
+ // ViewportRanges vpRanges = av.getRanges();
+ //
+ // int range = vpRanges.getEndRes() - vpRanges.getStartRes() + 1;
+ // if (scrollX > range)
+ // {
+ // scrollX = range;
+ // }
+ // else if (scrollX < -range)
+ // {
+ // scrollX = -range;
+ // }
+ // }
// Both scrolling and resizing change viewport ranges: scrolling changes
// both start and end points, but resize only changes end values.
// Here we only want to fastpaint on a scroll, with resize using a normal
// paint, so scroll events are identified as changes to the horizontal or
// vertical start value.
- if (eventName.equals(ViewportRanges.STARTRES))
- {
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- else
- {
- fastPaint(scrollX, 0);
- }
- }
- else if (eventName.equals(ViewportRanges.STARTSEQ))
- {
- // scroll
- fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
- {
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- else
- {
- fastPaint(scrollX, 0);
- }
- }
- else if (eventName.equals(ViewportRanges.STARTSEQ))
- {
- // scroll
- fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
- }
- else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
- {
- if (av.getWrapAlignment())
- {
- fastPaintWrapped(scrollX);
- }
- }
+ // BH 2019.07.27 was:
+ // if (eventName.equals(ViewportRanges.STARTRES))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // else
+ // {
+ // fastPaint(scrollX, 0);
+ // }
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTSEQ))
+ // {
+ // // scroll
+ // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // else
+ // {
+ // fastPaint(scrollX, 0);
+ // }
+ // }
+ //
+ // BH oops!
+ //
+ // else if (eventName.equals(ViewportRanges.STARTSEQ))
+ // {
+ // // scroll
+ // fastPaint(0, (int) evt.getNewValue() - (int) evt.getOldValue());
+ // }
+ // else if (eventName.equals(ViewportRanges.STARTRESANDSEQ))
+ // {
+ // if (av.getWrapAlignment())
+ // {
+ // fastPaintWrapped(scrollX);
+ // }
+ // }
}
/**
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);
}
}
*/
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);
}
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);
}
}
*/
public void setStartResAndSeq(int res, int seq)
{
+ // from Overview only
int width = getViewportWidth();
int[] oldresvalues = updateStartEndRes(res, res + width - 1);
}
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);
}
/**
}
/**
- * 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: absolute position in alignment