JAL-845 linked protein/dna 'slave' further PoC functionality
[jalview.git] / src / jalview / gui / TreeCanvas.java
index c5650f5..e700fb3 100755 (executable)
  */
 package jalview.gui;
 
-import java.util.*;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.print.*;
-import javax.swing.*;
-
-import jalview.analysis.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
-import jalview.util.*;
+import jalview.analysis.Conservation;
+import jalview.analysis.NJTree;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.datamodel.SequenceNode;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.ResidueProperties;
+import jalview.schemes.UserColourScheme;
+import jalview.structure.SelectionSource;
+import jalview.util.Format;
+import jalview.util.MappingUtils;
+import jalview.util.MessageManager;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import javax.swing.JColorChooser;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+import javax.swing.ToolTipManager;
 
 /**
  * DOCUMENT ME!
@@ -39,7 +68,7 @@ import jalview.util.*;
  * @version $Revision$
  */
 public class TreeCanvas extends JPanel implements MouseListener, Runnable,
-        Printable, MouseMotionListener
+        Printable, MouseMotionListener, SelectionSource
 {
   /** DOCUMENT ME!! */
   public static final String PLACEHOLDER = " * ";
@@ -208,7 +237,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
       if (node.element() instanceof SequenceI)
       {
-        SequenceI seq = (SequenceI) ((SequenceNode) node).element();
+        SequenceI seq = (SequenceI) node.element();
 
         if (av.getSequenceColour(seq) == Color.white)
         {
@@ -258,14 +287,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       Rectangle rect = new Rectangle(xend + 10, ypos - charHeight / 2,
               charWidth, charHeight);
 
-      nameHash.put((SequenceI) node.element(), rect);
+      nameHash.put(node.element(), rect);
 
       // Colour selected leaves differently
       SequenceGroup selected = av.getSelectionGroup();
 
       if ((selected != null)
               && selected.getSequences(null).contains(
-                      (SequenceI) node.element()))
+                      node.element()))
       {
         g.setColor(Color.gray);
 
@@ -290,7 +319,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       int xend = (int) (height * scale) + offx;
       int ypos = (int) (node.ycount * chunk) + offy;
 
-      g.setColor(((SequenceNode) node).color.darker());
+      g.setColor(node.color.darker());
 
       // Draw horizontal line
       g.drawLine(xstart, ypos, xend, ypos);
@@ -493,7 +522,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         {
           for (int a = 0; a < aps.length; a++)
           {
-            aps[a].av.setSequenceColour((SequenceI) node.element(), c);
+            final SequenceI seq = (SequenceI) node.element();
+            aps[a].av.setSequenceColour(seq, c);
           }
         }
       }
@@ -682,7 +712,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
     labelLength = fm.stringWidth(longestName) + 20; // 20 allows for scrollbar
 
-    float wscale = (float) (width - labelLength - (offx * 2))
+    float wscale = (width - labelLength - (offx * 2))
             / tree.getMaxHeight();
 
     SequenceNode top = tree.getTopNode();
@@ -708,7 +738,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         g2.setColor(Color.gray);
       }
 
-      int x = (int) ((threshold * (float) (getWidth() - labelLength - (2 * offx))) + offx);
+      int x = (int) ((threshold * (getWidth() - labelLength - (2 * offx))) + offx);
 
       g2.drawLine(x, 0, x, getHeight());
     }
@@ -854,12 +884,20 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
         AlignmentPanel[] aps = getAssociatedPanels();
 
+        // TODO push calls below into a single AlignViewportI method?
+        // see also AlignViewController.deleteGroups
         for (int a = 0; a < aps.length; a++)
         {
           aps[a].av.setSelectionGroup(null);
           aps[a].av.getAlignment().deleteAllGroups();
           aps[a].av.clearSequenceColours();
         }
+        if (av.getSlave() != null)
+        {
+          av.getSlave().setSelectionGroup(null);
+          av.getSlave().getAlignment().deleteAllGroups();
+          av.getSlave().clearSequenceColours();
+        }
         colourGroups();
       }
 
@@ -923,6 +961,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       // sg.recalcConservation();
       sg.setName("JTreeGroup:" + sg.hashCode());
       sg.setIdColour(col);
+
       for (int a = 0; a < aps.length; a++)
       {
         if (aps[a].av.getGlobalColourScheme() != null
@@ -939,7 +978,26 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
         aps[a].av.getAlignment().addGroup(new SequenceGroup(sg));
       }
+
+      // TODO can we push all of the below into AlignViewportI?
+      av.getAlignment().addGroup(sg);
+      if (av.getSlave() != null)
+      {
+        SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg, av,
+                av.getSlave());
+        if (mappedGroup.getSequences().size() > 0)
+        {
+          av.getSlave().getAlignment().addGroup(mappedGroup);
+          for (SequenceI seq : mappedGroup.getSequences())
+          {
+            av.getSlave().setSequenceColour(seq,
+                    mappedGroup.getIdColour().brighter());
+          }
+        }
+      }
+
     }
+
     // notify the panel to redo any group specific stuff.
     for (int a = 0; a < aps.length; a++)
     {
@@ -948,6 +1006,13 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       // to any Jmols listening in
     }
 
+    if (av.getSlave() != null)
+    {
+      ((AlignViewport) av.getSlave()).getAlignPanel().updateAnnotation();
+      /*
+       * idPanel. repaint ()
+       */
+    }
   }
 
   /**