Merge remote-tracking branch 'origin/merge/Jalview-JS/develop_feature/JAL-3690_callba...
[jalview.git] / src / jalview / gui / TreeCanvas.java
index 85ee4bf..e59dfcc 100755 (executable)
@@ -27,9 +27,8 @@ import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.SequenceNode;
+import jalview.gui.JalviewColourChooser.ColourChooserListener;
 import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ColourSchemeProperty;
-import jalview.schemes.UserColourScheme;
 import jalview.structure.SelectionSource;
 import jalview.util.Format;
 import jalview.util.MessageManager;
@@ -55,7 +54,6 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
-import javax.swing.JColorChooser;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
@@ -79,9 +77,9 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
   TreePanel tp;
 
-  AlignViewport av;
+  private AlignViewport av;
 
-  AlignmentPanel ap;
+  private AlignmentPanel ap;
 
   Font font;
 
@@ -99,7 +97,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
   int offy;
 
-  float threshold;
+  private float threshold;
 
   String longestName;
 
@@ -129,7 +127,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
   {
     this.tp = tp;
     this.av = ap.av;
-    this.ap = ap;
+    this.setAssociatedPanel(ap);
     font = av.getFont();
     scrollPane = scroller;
     addMouseListener(this);
@@ -514,21 +512,18 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     node.color = c;
     if (node.element() instanceof SequenceI)
     {
+      final SequenceI seq = (SequenceI) node.element();
       AlignmentPanel[] aps = getAssociatedPanels();
       if (aps != null)
       {
         for (int a = 0; a < aps.length; a++)
         {
-          final SequenceI seq = (SequenceI) node.element();
           aps[a].av.setSequenceColour(seq, c);
         }
       }
     }
-    if ((node.left() != null) || (node.right() != null)) // TODO: internal node
-    {
-      setColor((SequenceNode) node.left(), c);
-      setColor((SequenceNode) node.right(), c);
-    }
+    setColor((SequenceNode) node.left(), c);
+    setColor((SequenceNode) node.right(), c);
   }
 
   /**
@@ -766,7 +761,9 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
      */
     if (e.isPopupTrigger())
     {
-      chooseSubtreeColour();
+      if (highlightNode != null) {
+        chooseSubtreeColour();
+      }
       e.consume(); // prevent mouseClicked happening
     }
   }
@@ -835,15 +832,17 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
    */
   void chooseSubtreeColour()
   {
-    Color col = JColorChooser.showDialog(this,
-            MessageManager.getString("label.select_subtree_colour"),
-            highlightNode.color);
-    if (col != null)
-    {
-      setColor(highlightNode, col);
-      PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
-      repaint();
-    }
+    String ttl = MessageManager.getString("label.select_subtree_colour");
+    ColourChooserListener listener = new ColourChooserListener() {
+      @Override
+      public void colourSelected(Color c)
+      {
+        setColor(highlightNode, c);
+        PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
+        repaint();
+      }
+    };
+    JalviewColourChooser.showColourChooser(this, ttl,  highlightNode.color, listener);
   }
 
   @Override
@@ -922,7 +921,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     if (ob instanceof SequenceI)
     {
       treeSelectionChanged((Sequence) ob);
-      PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
+      PaintRefresher.Refresh(tp, getAssociatedPanel().av.getSequenceSetId());
       repaint();
       av.sendSelection();
       return;
@@ -954,6 +953,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
                     .deleteAllGroups();
             aps[a].av.getCodingComplement().clearSequenceColours();
           }
+          aps[a].av.setUpdateStructures(true);
         }
         colourGroups(groups);
 
@@ -967,7 +967,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         }
       }
 
-      PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
+      PaintRefresher.Refresh(tp, getAssociatedPanel().av.getSequenceSetId());
       repaint();
     }
 
@@ -997,54 +997,40 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       }
 
       ColourSchemeI cs = null;
-      SequenceGroup sg = new SequenceGroup(sequences, null, cs, true, true,
+      SequenceGroup _sg = new SequenceGroup(sequences, null, cs, true, true,
               false, 0, av.getAlignment().getWidth() - 1);
 
-      if (av.getGlobalColourScheme() != null)
-      {
-        if (av.getGlobalColourScheme() instanceof UserColourScheme)
-        {
-          cs = new UserColourScheme(
-                  ((UserColourScheme) av.getGlobalColourScheme())
-                          .getColours());
-
-        }
-        else
-        {
-          cs = ColourSchemeProperty.getColourScheme(av, sg,
-                  ColourSchemeProperty
-                  .getColourName(av.getGlobalColourScheme()));
-        }
-        // cs is null if shading is an annotationColourGradient
-        // if (cs != null)
-        // {
-        // cs.setThreshold(av.getViewportColourScheme().getThreshold(),
-        // av.isIgnoreGapsConsensus());
-        // }
-      }
-      sg.setColourScheme(cs);
-      sg.getGroupColourScheme().setThreshold(
-              av.getResidueShading().getThreshold(),
-              av.isIgnoreGapsConsensus());
-      // sg.recalcConservation();
-      sg.setName("JTreeGroup:" + sg.hashCode());
-      sg.setIdColour(col);
+      _sg.setName("JTreeGroup:" + _sg.hashCode());
+      _sg.setIdColour(col);
 
       for (int a = 0; a < aps.length; a++)
       {
-        if (aps[a].av.getGlobalColourScheme() != null
-                && aps[a].av.getResidueShading().conservationApplied())
+        SequenceGroup sg = new SequenceGroup(_sg);
+        AlignViewport viewport = aps[a].av;
+
+        // Propagate group colours in each view
+        if (viewport.getGlobalColourScheme() != null)
         {
-          Conservation c = new Conservation("Group", sg.getSequences(null),
-                  sg.getStartRes(), sg.getEndRes());
-          c.calculate();
-          c.verdict(false, aps[a].av.getConsPercGaps());
-          sg.cs.setConservation(c);
+          cs = viewport.getGlobalColourScheme().getInstance(viewport, sg);
+          sg.setColourScheme(cs);
+          sg.getGroupColourScheme().setThreshold(
+                  viewport.getResidueShading().getThreshold(),
+                  viewport.isIgnoreGapsConsensus());
+
+          if (viewport.getResidueShading().conservationApplied())
+          {
+            Conservation c = new Conservation("Group",
+                    sg.getSequences(null), sg.getStartRes(),
+                    sg.getEndRes());
+            c.calculate();
+            c.verdict(false, viewport.getConsPercGaps());
+            sg.cs.setConservation(c);
+          }
         }
         // indicate that associated structure views will need an update
-        aps[a].av.setUpdateStructures(true);
+        viewport.setUpdateStructures(true);
         // propagate structure view update and sequence group to complement view
-        aps[a].av.addSequenceGroup(new SequenceGroup(sg));
+        viewport.addSequenceGroup(sg);
       }
     }
 
@@ -1107,7 +1093,47 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     }
     else
     {
-      return new AlignmentPanel[] { ap };
+      return new AlignmentPanel[] { getAssociatedPanel() };
     }
   }
+
+  public AlignmentPanel getAssociatedPanel()
+  {
+    return ap;
+  }
+
+  public void setAssociatedPanel(AlignmentPanel ap)
+  {
+    this.ap = ap;
+  }
+
+  public AlignViewport getViewport()
+  {
+    return av;
+  }
+
+  public void setViewport(AlignViewport av)
+  {
+    this.av = av;
+  }
+
+  public float getThreshold()
+  {
+    return threshold;
+  }
+
+  public void setThreshold(float threshold)
+  {
+    this.threshold = threshold;
+  }
+
+  public boolean isApplyToAllViews()
+  {
+    return this.applyToAllViews;
+  }
+
+  public void setApplyToAllViews(boolean applyToAllViews)
+  {
+    this.applyToAllViews = applyToAllViews;
+  }
 }