[JAL-3226] problem that JavaScript (or Java) may consolidate multiple
[jalview.git] / src / jalview / gui / SeqCanvas.java
index c99041b..88d6db7 100755 (executable)
@@ -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 fastPaint " + fastpainting + " "
-    // + horizontal + " " + vertical);
     // effectively:
     // if (horizontal != 0 && vertical != 0)
     // throw new InvalidArgumentException();
@@ -376,6 +374,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   @Override
   public void paintComponent(Graphics g)
   {
+
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
 
@@ -385,7 +384,8 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     width -= (width % charWidth);
     height -= (height % charHeight);
 
-    // BH 2019 can't possibly fastPaint if width and height are 0
+    // BH 2019 can't possibly fastPaint if either width or height is 0
+
     if (width == 0 || height == 0)
     {
       return;
@@ -396,15 +396,29 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     int startSeq = ranges.getStartSeq();
     int endRes = ranges.getEndRes();
     int endSeq = ranges.getEndSeq();
-    if (av.isFastPaintDisabled())
-    {
-      fastPaint = false;
-    }
 
-    // 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());