[JAL-3226] problem that JavaScript (or Java) may consolidate multiple
authorhansonr <hansonr@STO24954W.ad.stolaf.edu>
Tue, 23 Apr 2019 03:48:49 +0000 (22:48 -0500)
committerhansonr <hansonr@STO24954W.ad.stolaf.edu>
Tue, 23 Apr 2019 03:48:49 +0000 (22:48 -0500)
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
src/jalview/gui/PaintRefresher.java
src/jalview/gui/SeqCanvas.java
src/jalview/viewmodel/AlignmentViewport.java

index a9af26d..4057cef 100755 (executable)
@@ -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());
     
index 54fe488..953fdc5 100755 (executable)
@@ -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();
     }
   }
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());
 
index f2ab8a6..ae101a3 100644 (file)
@@ -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)
     {