From 51ca42a8c4525c6871e3c8ea529b6cb8a59bb10f Mon Sep 17 00:00:00 2001 From: hansonr Date: Mon, 29 Jul 2019 15:29:36 -0500 Subject: [PATCH] JAL-3383 JAL-3253-applet Java8 switches to clarify ViewportRanges listeners --- src/jalview/datamodel/Alignment.java | 10 +- src/jalview/gui/AnnotationPanel.java | 20 ++- src/jalview/gui/IdCanvas.java | 44 +++++-- src/jalview/gui/SeqCanvas.java | 200 +++++++++++++++++++---------- src/jalview/viewmodel/ViewportRanges.java | 59 +++++++-- 5 files changed, 231 insertions(+), 102 deletions(-) diff --git a/src/jalview/datamodel/Alignment.java b/src/jalview/datamodel/Alignment.java index b214934..91b29da 100755 --- a/src/jalview/datamodel/Alignment.java +++ b/src/jalview/datamodel/Alignment.java @@ -398,6 +398,10 @@ public class Alignment implements AlignmentI return null; } + private static final SequenceGroup[] noGroups = new SequenceGroup[0]; + + private ArrayList temp = new ArrayList<>(); + /* * (non-Javadoc) * @@ -407,11 +411,15 @@ public class Alignment implements AlignmentI @Override public SequenceGroup[] findAllGroups(SequenceI s) { - ArrayList 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); diff --git a/src/jalview/gui/AnnotationPanel.java b/src/jalview/gui/AnnotationPanel.java index 4ead210..af7bc26 100755 --- a/src/jalview/gui/AnnotationPanel.java +++ b/src/jalview/gui/AnnotationPanel.java @@ -1133,6 +1133,7 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, gg.dispose(); + fastPaint = true; // Call repaint on alignment panel so that repaints from other alignment @@ -1297,18 +1298,23 @@ public class AnnotationPanel extends JPanel implements AwtRenderPanelI, // 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; } } diff --git a/src/jalview/gui/IdCanvas.java b/src/jalview/gui/IdCanvas.java index 4057cef..e5a5946 100755 --- a/src/jalview/gui/IdCanvas.java +++ b/src/jalview/gui/IdCanvas.java @@ -579,21 +579,45 @@ public class IdCanvas extends JPanel implements ViewportListenerI @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(); + // } } } diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 076ce5b..0d27354 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -1676,92 +1676,150 @@ public class SeqCanvas extends JPanel implements ViewportListenerI 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); + // } + // } } /** diff --git a/src/jalview/viewmodel/ViewportRanges.java b/src/jalview/viewmodel/ViewportRanges.java index 4f671da..9f54964 100644 --- a/src/jalview/viewmodel/ViewportRanges.java +++ b/src/jalview/viewmodel/ViewportRanges.java @@ -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); } @@ -229,11 +250,19 @@ public class ViewportRanges extends ViewportProperties 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); } } @@ -306,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); @@ -317,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); } /** @@ -631,7 +661,10 @@ 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: absolute position in alignment -- 1.7.10.2