From 42984135d36f8bb943fc4c20879359d1508bac0f Mon Sep 17 00:00:00 2001 From: hansonr Date: Mon, 22 Apr 2019 22:48:49 -0500 Subject: [PATCH] [JAL-3226] problem that JavaScript (or Java) may consolidate multiple repaint() requests in unpredictable ways. In this case, the issue was that in response to a CTRL-C/CTRL-V paste request, in Java a fast repaint request preceded two full requests, thus resulting in a full request for paint. In constrast, in JavaScript, the three requests were bundled together into one, so the fastPaint flag was still present for the second and third request. This resulted in incomplete painting. The solution was to set seqCanvas.fastPaint and idCanvas.fastPaint false in PaintRefresher when the target to be painted is one of those two components. BH 2019.04.22 --- src/jalview/gui/IdCanvas.java | 3 +- src/jalview/gui/PaintRefresher.java | 29 ++++++++++----- src/jalview/gui/SeqCanvas.java | 49 ++++++++++++++++---------- src/jalview/viewmodel/AlignmentViewport.java | 39 ++++++++++---------- 4 files changed, 72 insertions(+), 48 deletions(-) diff --git a/src/jalview/gui/IdCanvas.java b/src/jalview/gui/IdCanvas.java index a9af26d..4057cef 100755 --- a/src/jalview/gui/IdCanvas.java +++ b/src/jalview/gui/IdCanvas.java @@ -152,6 +152,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI */ public void fastPaint(int vertical) { + /* * for now, not attempting fast paint of wrapped ids... */ @@ -220,8 +221,6 @@ public class IdCanvas extends JPanel implements ViewportListenerI @Override public void paintComponent(Graphics g) { - //super.paintComponent(g); // BH 2019 - g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); diff --git a/src/jalview/gui/PaintRefresher.java b/src/jalview/gui/PaintRefresher.java index 54fe488..953fdc5 100755 --- a/src/jalview/gui/PaintRefresher.java +++ b/src/jalview/gui/PaintRefresher.java @@ -112,19 +112,30 @@ public class PaintRefresher { continue; } - - if (validateSequences && comp instanceof AlignmentPanel - && source instanceof AlignmentPanel) + if (comp instanceof AlignmentPanel) + { + if (validateSequences && source instanceof AlignmentPanel) + { + validateSequences(((AlignmentPanel) source).av.getAlignment(), + ((AlignmentPanel) comp).av.getAlignment()); + } + if (alignmentChanged) + { + ((AlignmentPanel) comp).alignmentChanged(); + } + } + else if (comp instanceof IdCanvas) { - validateSequences(((AlignmentPanel) source).av.getAlignment(), - ((AlignmentPanel) comp).av.getAlignment()); + // BH 2019.04.22 fixes JS problem of repaint() consolidation + // that occurs in JavaScript but not Java [JAL-3226] + ((IdCanvas) comp).fastPaint = false; } - - if (comp instanceof AlignmentPanel && alignmentChanged) + else if (comp instanceof SeqCanvas) { - ((AlignmentPanel) comp).alignmentChanged(); + // BH 2019.04.22 fixes JS problem of repaint() consolidation + // that occurs in JavaScript but not Java [JAL-3226] + ((SeqCanvas) comp).fastPaint = false; } - comp.repaint(); } } diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index c99041b..88d6db7 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -75,7 +75,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI private final SequenceRenderer seqRdr; - private boolean fastPaint = false; + boolean fastPaint = false; private boolean fastpainting = false; @@ -288,8 +288,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI public void fastPaint(int horizontal, int vertical) { - // System.err.println("<>SeqCanvas paintComponent " + fastPaint + "\n" - // + getVisibleRect() + "\n" + g.getClipBounds()); - // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent " - // + startRes + " " + endRes + " " + startSeq + " " + endSeq); + // [JAL-3226] problem that JavaScript (or Java) may consolidate multiple + // repaint() requests in unpredictable ways. In this case, the issue was + // that in response to a CTRL-C/CTRL-V paste request, in Java a fast + // repaint request preceded two full requests, thus resulting + // in a full request for paint. In constrast, in JavaScript, the three + // requests were bundled together into one, so the fastPaint flag was + // still present for the second and third request. + // + // This resulted in incomplete painting. + // + // The solution was to set seqCanvas.fastPaint and idCanvas.fastPaint false + // in PaintRefresher when the target to be painted is one of those two + // components. + // + // BH 2019.04.22 + // + // An initial idea; can be removed once we determine this issue is closed: + // if (av.isFastPaintDisabled()) + // { + // fastPaint = false; + // } + Rectangle vis, clip; if (img != null && (fastPaint @@ -413,7 +427,6 @@ public class SeqCanvas extends JPanel implements ViewportListenerI || vis.height != clip.height)) { g.drawImage(img, 0, 0, this); - // System.err.println(">>>>>>>>>>>>>>>>SeqCanvas paintComponent FAST"); drawSelectionGroup((Graphics2D) g, startRes, endRes, startSeq, endSeq); fastPaint = false; @@ -422,16 +435,16 @@ public class SeqCanvas extends JPanel implements ViewportListenerI else { // System.out.println("SeqCanvas full paint"); - /* - * img is a cached version of the last view we drew. - * If we have no img or the size has changed, make a new one - */ + + // img is a cached version of the last view we drew. + // If we have no img or the size has changed, make a new one. + // if (img == null || width != img.getWidth() || height != img.getHeight()) { img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } - + Graphics2D gg = (Graphics2D) img.getGraphics(); gg.setFont(av.getFont()); diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index f2ab8a6..ae101a3 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -1323,20 +1323,20 @@ public abstract class AlignmentViewport */ private boolean followHighlight = true; - private boolean disableFastPaint; // BH 2019.04.18 - - /** - * BH 2019.04.18 When gap filling is on and a modification is made to fill - * those, we need to disallow fast painting for paste just once - * - * @return - */ - public boolean isFastPaintDisabled() - { - boolean ret = disableFastPaint; - disableFastPaint = false; - return ret; - } + // private boolean disableFastPaint; // BH 2019.04.18 + // + // /** + // * BH 2019.04.18 When gap filling is on and a modification is made to fill + // * those, we need to disallow fast painting for paste just once + // * + // * @return + // */ + // public boolean isFastPaintDisabled() + // { + // boolean ret = disableFastPaint; + // disableFastPaint = false; + // return ret; + // } /** * Property change listener for changes in alignment @@ -1872,11 +1872,12 @@ public abstract class AlignmentViewport { if (isPadGaps()) { - if (alignment.padGaps()) - { - // the new alignment has been modified -- can't fast paint - disableFastPaint = true; - } + alignment.padGaps(); + // if (alignment.padGaps()) + // { + // // the new alignment has been modified -- can't fast paint + // disableFastPaint = true; + // } } if (autoCalculateConsensus) { -- 1.7.10.2