JAL-4023 use %g for distances (scientific notation for very small or large values)
[jalview.git] / src / jalview / gui / TreeCanvas.java
index f1bdd31..6f143db 100755 (executable)
  */
 package jalview.gui;
 
-import jalview.analysis.Conservation;
-import jalview.analysis.TreeModel;
-import jalview.api.AlignViewportI;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.datamodel.SequenceNode;
-import jalview.schemes.ColourSchemeI;
-import jalview.structure.SelectionSource;
-import jalview.util.Format;
-import jalview.util.MessageManager;
-
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Font;
@@ -48,17 +36,30 @@ 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.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Vector;
 
-import javax.swing.JColorChooser;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
+import jalview.analysis.Conservation;
+import jalview.analysis.TreeModel;
+import jalview.api.AlignViewportI;
+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.structure.SelectionSource;
+import jalview.util.Format;
+import jalview.util.MessageManager;
+
 /**
  * DOCUMENT ME!
  * 
@@ -77,9 +78,9 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
   TreePanel tp;
 
-  AlignViewport av;
+  private AlignViewport av;
 
-  AlignmentPanel ap;
+  private AlignmentPanel ap;
 
   Font font;
 
@@ -97,15 +98,15 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
   int offy;
 
-  float threshold;
+  private float threshold;
 
   String longestName;
 
   int labelLength = -1;
 
-  Hashtable nameHash = new Hashtable();
+  Map<Object, Rectangle> nameHash = new Hashtable<>();
 
-  Hashtable nodeHash = new Hashtable();
+  Map<SequenceNode, Rectangle> nodeHash = new Hashtable<>();
 
   SequenceNode highlightNode;
 
@@ -127,7 +128,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);
@@ -258,7 +259,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
       if (showDistances && (node.dist > 0))
       {
-        nodeLabel = new Format("%-.2f").form(node.dist);
+        nodeLabel = new Format("%g").form(node.dist);
       }
 
       if (showBootstrap && node.bootstrap > -1)
@@ -346,7 +347,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
 
       if (showDistances && (node.dist > 0))
       {
-        nodeLabel = new Format("%-.2f").form(node.dist);
+        nodeLabel = new Format("%g").form(node.dist);
       }
 
       if (showBootstrap && node.bootstrap > -1)
@@ -378,31 +379,25 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
    */
   public Object findElement(int x, int y)
   {
-    Enumeration keys = nameHash.keys();
-
-    while (keys.hasMoreElements())
+    for (Entry<Object, Rectangle> entry : nameHash.entrySet())
     {
-      Object ob = keys.nextElement();
-      Rectangle rect = (Rectangle) nameHash.get(ob);
+      Rectangle rect = entry.getValue();
 
       if ((x >= rect.x) && (x <= (rect.x + rect.width)) && (y >= rect.y)
               && (y <= (rect.y + rect.height)))
       {
-        return ob;
+        return entry.getKey();
       }
     }
 
-    keys = nodeHash.keys();
-
-    while (keys.hasMoreElements())
+    for (Entry<SequenceNode, Rectangle> entry : nodeHash.entrySet())
     {
-      Object ob = keys.nextElement();
-      Rectangle rect = (Rectangle) nodeHash.get(ob);
+      Rectangle rect = entry.getValue();
 
       if ((x >= rect.x) && (x <= (rect.x + rect.width)) && (y >= rect.y)
               && (y <= (rect.y + rect.height)))
       {
-        return ob;
+        return entry.getKey();
       }
     }
 
@@ -464,9 +459,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     if ((node.left() == null) && (node.right() == null))
     {
       double height = node.height;
-      double dist = node.dist;
-
-      int xstart = (int) ((height - dist) * wscale) + offx;
+      // double dist = node.dist;
+      // int xstart = (int) ((height - dist) * wscale) + offx;
       int xend = (int) (height * wscale) + offx;
 
       int ypos = (int) (node.ycount * chunk) + offy;
@@ -651,13 +645,14 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
     {
       fm = g.getFontMetrics(font);
 
-      if (nameHash.size() == 0)
+      int nameCount = nameHash.size();
+      if (nameCount == 0)
       {
         repaint();
       }
 
       if (fitToWindow || (!fitToWindow && (scrollPane
-              .getHeight() > ((fm.getHeight() * nameHash.size()) + offy))))
+              .getHeight() > ((fm.getHeight() * nameCount) + offy))))
       {
         draw(g, scrollPane.getWidth(), scrollPane.getHeight());
         setPreferredSize(null);
@@ -665,8 +660,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       else
       {
         setPreferredSize(new Dimension(scrollPane.getWidth(),
-                fm.getHeight() * nameHash.size()));
-        draw(g, scrollPane.getWidth(), fm.getHeight() * nameHash.size());
+                fm.getHeight() * nameCount));
+        draw(g, scrollPane.getWidth(), fm.getHeight() * nameCount);
       }
 
       scrollPane.revalidate();
@@ -830,15 +825,19 @@ 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)
+    String ttl = MessageManager.getString("label.select_subtree_colour");
+    ColourChooserListener listener = new ColourChooserListener()
     {
-      setColor(highlightNode, col);
-      PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
-      repaint();
-    }
+      @Override
+      public void colourSelected(Color c)
+      {
+        setColor(highlightNode, c);
+        PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
+        repaint();
+      }
+    };
+    JalviewColourChooser.showColourChooser(this, ttl, highlightNode.color,
+            listener);
   }
 
   @Override
@@ -917,7 +916,8 @@ 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;
@@ -949,6 +949,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
                     .deleteAllGroups();
             aps[a].av.getCodingComplement().clearSequenceColours();
           }
+          aps[a].av.setUpdateStructures(true);
         }
         colourGroups(groups);
 
@@ -962,7 +963,8 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         }
       }
 
-      PaintRefresher.Refresh(tp, ap.av.getSequenceSetId());
+      PaintRefresher.Refresh(tp,
+              getAssociatedPanel().av.getSequenceSetId());
       repaint();
     }
 
@@ -1006,8 +1008,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
         // Propagate group colours in each view
         if (viewport.getGlobalColourScheme() != null)
         {
-          cs = viewport.getGlobalColourScheme().getInstance(viewport, sg,
-                  null);
+          cs = viewport.getGlobalColourScheme().getInstance(viewport, sg);
           sg.setColourScheme(cs);
           sg.getGroupColourScheme().setThreshold(
                   viewport.getResidueShading().getThreshold(),
@@ -1089,7 +1090,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;
+  }
 }