JAL-3446 from applet -- reload; also fixes some repaint issues
[jalview.git] / src / jalview / gui / PaintRefresher.java
index ced5544..7e203b2 100755 (executable)
@@ -39,7 +39,10 @@ import java.util.Map;
  */
 public class PaintRefresher
 {
-  static Map<String, List<Component>> components = new HashMap<String, List<Component>>();
+  private static final int ALIGNMENT_CHANGED = 1 << 0;
+  private static final int VALIDATE_SEQUENCES = 1 << 1;
+  
+  static Map<String, List<Component>> components = new HashMap<>();
 
   /**
    * Add the given component to those registered under the given sequence set
@@ -60,7 +63,7 @@ public class PaintRefresher
     }
     else
     {
-      List<Component> vcoms = new ArrayList<Component>();
+      List<Component> vcoms = new ArrayList<>();
       vcoms.add(comp);
       components.put(seqSetId, vcoms);
     }
@@ -101,30 +104,48 @@ public class PaintRefresher
   {
     List<Component> comps = components.get(id);
 
+    int mode = (alignmentChanged ? ALIGNMENT_CHANGED : 0) | (validateSequences ? VALIDATE_SEQUENCES : 0);
     if (comps == null)
     {
       return;
     }
+    repaintComponents(source, mode, comps.toArray(new Component[comps.size()]));
+  }
 
-    for (Component comp : comps)
+  public static void repaintComponents(Component source, int mode,
+          Component... comps)
+  {
+    for (int i = 0; i < comps.length; i++)
     {
-      if (comp == source)
+      Component comp = comps[i];
+      if (comp == null)
       {
         continue;
       }
-
-      if (validateSequences && comp instanceof AlignmentPanel
-              && source instanceof AlignmentPanel)
+      if (comp instanceof AlignmentPanel)
       {
-        validateSequences(((AlignmentPanel) source).av.getAlignment(),
-                ((AlignmentPanel) comp).av.getAlignment());
+        if ((mode & VALIDATE_SEQUENCES) != 0 && source instanceof AlignmentPanel)
+        {
+          validateSequences(((AlignmentPanel) source).av.getAlignment(),
+                  ((AlignmentPanel) comp).av.getAlignment());
+        }
+        if ((mode & ALIGNMENT_CHANGED) != 0)
+        {
+          ((AlignmentPanel) comp).alignmentChanged();
+        }
       }
-
-      if (comp instanceof AlignmentPanel && alignmentChanged)
+      else if (comp instanceof IdCanvas)
       {
-        ((AlignmentPanel) comp).alignmentChanged();
+        // BH 2019.04.22 fixes JS problem of repaint() consolidation
+        // that occurs in JavaScript but not Java [JAL-3226]
+        ((IdCanvas) comp).setNoFastPaint();
+      }
+      else if (comp instanceof SeqCanvas)
+      {
+        // BH 2019.04.22 fixes JS problem of repaint() consolidation
+        // that occurs in JavaScript but not Java [JAL-3226]
+        ((SeqCanvas) comp).setNoFastPaint();
       }
-
       comp.repaint();
     }
   }
@@ -186,8 +207,8 @@ public class PaintRefresher
             System.err.println(
                     "IMPLEMENTATION PROBLEM: DATASET out of sync due to an insert whilst calling PaintRefresher.validateSequences(AlignmentI, ALignmentI)");
           }
-          List<SequenceI> alsq;
-          synchronized (alsq = comp.getSequences())
+          List<SequenceI> alsq = comp.getSequences();
+          synchronized (alsq)
           {
             alsq.add(i, a1[i]);
           }
@@ -240,7 +261,7 @@ public class PaintRefresher
     {
       return new AlignmentPanel[0];
     }
-    List<AlignmentPanel> tmp = new ArrayList<AlignmentPanel>();
+    List<AlignmentPanel> tmp = new ArrayList<>();
     for (Component comp : comps)
     {
       if (comp instanceof AlignmentPanel)
@@ -251,4 +272,5 @@ public class PaintRefresher
     return tmp.toArray(new AlignmentPanel[tmp.size()]);
   }
 
+  
 }