[JAL-3226] problem that JavaScript (or Java) may consolidate multiple
[jalview.git] / src / jalview / gui / SeqCanvas.java
index d1046f8..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;
 
@@ -287,8 +287,7 @@ 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();
@@ -375,6 +374,7 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
   @Override
   public void paintComponent(Graphics g)
   {
+
     int charHeight = av.getCharHeight();
     int charWidth = av.getCharWidth();
 
@@ -384,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,10 +397,28 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     int endRes = ranges.getEndRes();
     int endSeq = ranges.getEndSeq();
 
-    // 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
@@ -408,26 +427,24 @@ 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;
-      //System.out.println("SeqCanvas fast paint");
+      // System.out.println("SeqCanvas fast paint");
     }
     else
     {
+      // System.out.println("SeqCanvas full paint");
 
-      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());
 
@@ -2160,18 +2177,4 @@ public class SeqCanvas extends JPanel implements ViewportListenerI
     return labelWidthWest;
   }
 
-  /**
-   * Ensure that a full paint is done next, for whatever reason. This was
-   * necessary for JavaScript; apparently in Java the timing is just right on
-   * multiple threads (EventQueue-0, Consensus, Conservation) that we can get
-   * away with one fast paint before the others, but this ensures that in the
-   * end we get a full paint. Problem arose in relation to copy/paste, where the
-   * paste was not finalized with a full paint.
-   * 
-   * @author hansonr 2019.04.17
-   */
-  public void clearFastPaint()
-  {
-    fastPaint = false;
-  }
 }