Conservation colour scheme is no more
[jalview.git] / src / jalview / appletgui / TreeCanvas.java
index be37813..a6bc5df 100755 (executable)
@@ -1,42 +1,43 @@
 /*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
 \r
 package jalview.appletgui;\r
 \r
+import java.util.*;\r
 \r
-import jalview.analysis.*;\r
-import jalview.datamodel.*;\r
-import jalview.util.*;\r
-import jalview.schemes.*;\r
 import java.awt.*;\r
 import java.awt.event.*;\r
-import java.util.*;\r
 \r
+import jalview.analysis.*;\r
+import jalview.datamodel.*;\r
+import jalview.schemes.*;\r
+import jalview.util.*;\r
 \r
-public class TreeCanvas extends Panel implements MouseListener\r
+public class TreeCanvas\r
+    extends Panel implements MouseListener\r
 {\r
   NJTree tree;\r
   ScrollPane scrollPane;\r
   AlignViewport av;\r
-  public static final String PLACEHOLDER=" * ";\r
+  public static final String PLACEHOLDER = " * ";\r
   Font font;\r
-  int  fontSize = 12;\r
+  int fontSize = 12;\r
 \r
   boolean fitToWindow = true;\r
   boolean showDistances = false;\r
@@ -49,406 +50,488 @@ public class TreeCanvas extends Panel implements MouseListener
   float threshold;\r
 \r
   String longestName;\r
-  int labelLength=-1;\r
+  int labelLength = -1;\r
 \r
   //RubberbandRectangle rubberband;\r
 \r
-  Vector    listeners;\r
+  Vector listeners;\r
 \r
   Hashtable nameHash = new Hashtable();\r
   Hashtable nodeHash = new Hashtable();\r
 \r
-  public TreeCanvas(AlignViewport av, NJTree tree, ScrollPane scroller, String label)\r
+  public TreeCanvas(AlignViewport av, NJTree tree, ScrollPane scroller,\r
+                    String label)\r
   {\r
     this.av = av;\r
-    this.tree     = tree;\r
+    this.tree = tree;\r
     scrollPane = scroller;\r
     addMouseListener(this);\r
     tree.findHeight(tree.getTopNode());\r
     longestName = label;\r
     setLayout(null);\r
 \r
-    PaintRefresher.Register(this);\r
+    PaintRefresher.Register(this, av.alignment);\r
   }\r
+\r
   public void TreeSelectionChanged(Sequence sequence)\r
- {\r
+  {\r
     SequenceGroup selected = av.getSelectionGroup();\r
-    if(selected == null)\r
+    if (selected == null)\r
     {\r
       selected = new SequenceGroup();\r
       av.setSelectionGroup(selected);\r
     }\r
 \r
     selected.setEndRes(av.alignment.getWidth());\r
-    selected.addOrRemove(sequence);\r
+    selected.addOrRemove(sequence, true);\r
 \r
-\r
-    PaintRefresher.Refresh(this);\r
+System.out.println("called here");\r
+    PaintRefresher.Refresh(this, av.alignment);\r
     repaint();\r
- }\r
-\r
-\r
+  }\r
 \r
-  public void setTree(NJTree tree) {\r
+  public void setTree(NJTree tree)\r
+  {\r
     this.tree = tree;\r
     tree.findHeight(tree.getTopNode());\r
   }\r
 \r
-    public void drawNode(Graphics g,SequenceNode node, float chunk, float scale, int width,int offx, int offy) {\r
-    if (node == null) {\r
+  public void drawNode(Graphics g, SequenceNode node, float chunk, float scale,\r
+                       int width, int offx, int offy)\r
+  {\r
+    if (node == null)\r
+    {\r
       return;\r
     }\r
 \r
-    if (node.left() == null && node.right() == null) {\r
+    if (node.left() == null && node.right() == null)\r
+    {\r
       // Drawing leaf node\r
 \r
       float height = node.height;\r
-      float dist   = node.dist;\r
+      float dist = node.dist;\r
 \r
-      int xstart = (int)((height-dist)*scale) + offx;\r
-      int xend =   (int)(height*scale)        + offx;\r
+      int xstart = (int) ( (height - dist) * scale) + offx;\r
+      int xend = (int) (height * scale) + offx;\r
 \r
-      int ypos = (int)(node.ycount * chunk) + offy;\r
+      int ypos = (int) (node.ycount * chunk) + offy;\r
 \r
       if (node.element() instanceof SequenceI)\r
       {\r
-       if ( ( (SequenceI) ( (SequenceNode) node).element()).getColor() == Color.white)\r
-       {\r
-         g.setColor(Color.black);\r
-       }\r
-       else\r
-        g.setColor( ( (SequenceI) ( (SequenceNode) node).element()).getColor().\r
-                   darker());\r
+        if ( ( (SequenceI) ( (SequenceNode) node).element()).getColor() ==\r
+            Color.white)\r
+        {\r
+          g.setColor(Color.black);\r
+        }\r
+        else\r
+        {\r
+          g.setColor( ( (SequenceI) ( (SequenceNode) node).element()).getColor().\r
+                     darker());\r
+        }\r
 \r
       }\r
       else\r
-          g.setColor(Color.black);\r
-\r
+      {\r
+        g.setColor(Color.black);\r
+      }\r
 \r
       // Draw horizontal line\r
-      g.drawLine(xstart,ypos,xend,ypos);\r
+      g.drawLine(xstart, ypos, xend, ypos);\r
 \r
       String nodeLabel = "";\r
-      if (showDistances && node.dist > 0) {\r
+      if (showDistances && node.dist > 0)\r
+      {\r
         nodeLabel = new Format("%5.2f").form(node.dist);\r
       }\r
-      if (showBootstrap) {\r
-        if (showDistances) {\r
+      if (showBootstrap)\r
+      {\r
+        if (showDistances)\r
+        {\r
           nodeLabel = nodeLabel + " : ";\r
         }\r
         nodeLabel = nodeLabel + String.valueOf(node.getBootstrap());\r
       }\r
-      if (! nodeLabel.equals("")) {\r
-      g.drawString(nodeLabel,xstart,ypos - 10);\r
+      if (!nodeLabel.equals(""))\r
+      {\r
+        g.drawString(nodeLabel, xstart, ypos - 10);\r
       }\r
 \r
-      String name    = (markPlaceholders && node.isPlaceholder()) ? (PLACEHOLDER+node.getName()) : node.getName();\r
+      String name = (markPlaceholders && node.isPlaceholder()) ?\r
+          (PLACEHOLDER + node.getName()) : node.getName();\r
       FontMetrics fm = g.getFontMetrics(font);\r
-      int charWidth  = fm.stringWidth(name) + 3;\r
+      int charWidth = fm.stringWidth(name) + 3;\r
       int charHeight = fm.getHeight();\r
 \r
-      Rectangle rect = new Rectangle(xend+20,ypos-charHeight,\r
-                                     charWidth,charHeight);\r
+      Rectangle rect = new Rectangle(xend + 20, ypos - charHeight,\r
+                                     charWidth, charHeight);\r
 \r
-      nameHash.put((SequenceI)node.element(),rect);\r
+      nameHash.put( (SequenceI) node.element(), rect);\r
 \r
       // Colour selected leaves differently\r
       SequenceGroup selected = av.getSelectionGroup();\r
-      if (selected!=null && selected.sequences.contains((SequenceI)node.element())) {\r
+      if (selected != null &&\r
+          selected.sequences.contains( (SequenceI) node.element()))\r
+      {\r
         g.setColor(Color.gray);\r
 \r
-        g.fillRect(xend + 10, ypos - charHeight + 3,charWidth,charHeight);\r
+        g.fillRect(xend + 10, ypos - charHeight + 3, charWidth, charHeight);\r
         g.setColor(Color.white);\r
       }\r
-      g.drawString(name,xend+10,ypos);\r
+      g.drawString(name, xend + 10, ypos);\r
       g.setColor(Color.black);\r
-    } else {\r
-      drawNode(g,(SequenceNode)node.left(), chunk,scale,width,offx,offy);\r
-      drawNode(g,(SequenceNode)node.right(),chunk,scale,width,offx,offy);\r
+    }\r
+    else\r
+    {\r
+      drawNode(g, (SequenceNode) node.left(), chunk, scale, width, offx, offy);\r
+      drawNode(g, (SequenceNode) node.right(), chunk, scale, width, offx, offy);\r
 \r
       float height = node.height;\r
-      float dist   = node.dist;\r
+      float dist = node.dist;\r
 \r
-      int xstart = (int)((height-dist)*scale) + offx;\r
-      int xend   = (int)(height       *scale) + offx;\r
-      int ypos   = (int)(node.ycount  *chunk) + offy;\r
+      int xstart = (int) ( (height - dist) * scale) + offx;\r
+      int xend = (int) (height * scale) + offx;\r
+      int ypos = (int) (node.ycount * chunk) + offy;\r
 \r
-      g.setColor(((SequenceNode)node).color.darker());\r
+      g.setColor( ( (SequenceNode) node).color.darker());\r
 \r
       // Draw horizontal line\r
-      g.drawLine(xstart,ypos,xend,ypos);\r
-      g.fillRect(xend-2, ypos-2, 4,4);\r
+      g.drawLine(xstart, ypos, xend, ypos);\r
+      g.fillRect(xend - 2, ypos - 2, 4, 4);\r
 \r
-      int ystart = (int)(((SequenceNode)node.left()) .ycount * chunk) + offy;\r
-      int yend   = (int)(((SequenceNode)node.right()).ycount * chunk) + offy;\r
+      int ystart = (int) ( ( (SequenceNode) node.left()).ycount * chunk) + offy;\r
+      int yend = (int) ( ( (SequenceNode) node.right()).ycount * chunk) + offy;\r
 \r
-      Rectangle pos = new Rectangle(xend-2,ypos-2,5,5);\r
-      nodeHash.put(node,pos);\r
+      Rectangle pos = new Rectangle(xend - 2, ypos - 2, 5, 5);\r
+      nodeHash.put(node, pos);\r
 \r
-      g.drawLine((int)(height*scale) + offx, ystart,\r
-                 (int)(height*scale) + offx, yend);\r
+      g.drawLine( (int) (height * scale) + offx, ystart,\r
+                 (int) (height * scale) + offx, yend);\r
 \r
-      if (showDistances && node.dist > 0) {\r
-        g.drawString(new Format("%5.2f").form(node.dist),xstart,ypos - 5);\r
+      if (showDistances && node.dist > 0)\r
+      {\r
+        g.drawString(new Format("%5.2f").form(node.dist), xstart, ypos - 5);\r
       }\r
 \r
     }\r
   }\r
-  public Object findElement(int x, int y) {\r
-       Enumeration keys = nameHash.keys();\r
 \r
-    while (keys.hasMoreElements()) {\r
-            Object ob = keys.nextElement();\r
-            Rectangle rect = (Rectangle)nameHash.get(ob);\r
+  public Object findElement(int x, int y)\r
+  {\r
+    Enumeration keys = nameHash.keys();\r
 \r
-            if (x >= rect.x && x <= (rect.x + rect.width) &&\r
-              y >= rect.y && y <= (rect.y + rect.height)) {\r
-              return ob;\r
-            }\r
-  }\r
-  keys = nodeHash.keys();\r
+    while (keys.hasMoreElements())\r
+    {\r
+      Object ob = keys.nextElement();\r
+      Rectangle rect = (Rectangle) nameHash.get(ob);\r
 \r
-    while (keys.hasMoreElements()) {\r
-            Object ob = keys.nextElement();\r
-            Rectangle rect = (Rectangle)nodeHash.get(ob);\r
+      if (x >= rect.x && x <= (rect.x + rect.width) &&\r
+          y >= rect.y && y <= (rect.y + rect.height))\r
+      {\r
+        return ob;\r
+      }\r
+    }\r
+    keys = nodeHash.keys();\r
+\r
+    while (keys.hasMoreElements())\r
+    {\r
+      Object ob = keys.nextElement();\r
+      Rectangle rect = (Rectangle) nodeHash.get(ob);\r
 \r
-            if (x >= rect.x && x <= (rect.x + rect.width) &&\r
-              y >= rect.y && y <= (rect.y + rect.height)) {\r
-              return ob;\r
-            }\r
+      if (x >= rect.x && x <= (rect.x + rect.width) &&\r
+          y >= rect.y && y <= (rect.y + rect.height))\r
+      {\r
+        return ob;\r
+      }\r
     }\r
-      return null;\r
+    return null;\r
 \r
   }\r
 \r
-  public void pickNodes(Rectangle pickBox) {\r
-    int width  = getSize().width;\r
+  public void pickNodes(Rectangle pickBox)\r
+  {\r
+    int width = getSize().width;\r
     int height = getSize().height;\r
 \r
     SequenceNode top = tree.getTopNode();\r
 \r
-    float wscale = (float)(width*.8-offx*2)/tree.getMaxHeight()\r
-;\r
-    if (top.count == 0) {\r
-      top.count = ((SequenceNode)top.left()).count + ((SequenceNode)top.right()).count ;\r
+    float wscale = (float) (width * .8 - offx * 2) / tree.getMaxHeight()\r
+        ;\r
+    if (top.count == 0)\r
+    {\r
+      top.count = ( (SequenceNode) top.left()).count +\r
+          ( (SequenceNode) top.right()).count;\r
     }\r
-    float chunk = (float)(height-offy*2)/top.count;\r
+    float chunk = (float) (height - offy * 2) / top.count;\r
 \r
-    pickNode(pickBox,top,chunk,wscale,width,offx,offy);\r
+    pickNode(pickBox, top, chunk, wscale, width, offx, offy);\r
   }\r
 \r
-  public void pickNode(Rectangle pickBox, SequenceNode node, float chunk, float scale, int width,int offx, int offy) {\r
-    if (node == null) {\r
+  public void pickNode(Rectangle pickBox, SequenceNode node, float chunk,\r
+                       float scale, int width, int offx, int offy)\r
+  {\r
+    if (node == null)\r
+    {\r
       return;\r
     }\r
 \r
-    if (node.left() == null && node.right() == null) {\r
+    if (node.left() == null && node.right() == null)\r
+    {\r
       float height = node.height;\r
-      float dist   = node.dist;\r
+      float dist = node.dist;\r
 \r
-      int xstart = (int)((height-dist)*scale) + offx;\r
-      int xend   = (int)(height*scale) + offx;\r
+      int xstart = (int) ( (height - dist) * scale) + offx;\r
+      int xend = (int) (height * scale) + offx;\r
 \r
-      int ypos = (int)(node.ycount * chunk) + offy;\r
+      int ypos = (int) (node.ycount * chunk) + offy;\r
 \r
-      if (pickBox.contains(new Point(xend,ypos))) {\r
-        if (node.element() instanceof SequenceI) {\r
-          SequenceI seq = (SequenceI)node.element();\r
+      if (pickBox.contains(new Point(xend, ypos)))\r
+      {\r
+        if (node.element() instanceof SequenceI)\r
+        {\r
+          SequenceI seq = (SequenceI) node.element();\r
           SequenceGroup sg = av.getSelectionGroup();\r
-          if(sg!=null)\r
-            sg.addOrRemove(seq);\r
+          if (sg != null)\r
+          {\r
+            sg.addOrRemove(seq, true);\r
+          }\r
         }\r
       }\r
-    } else {\r
-      pickNode(pickBox,(SequenceNode)node.left(), chunk,scale,width,offx,offy);\r
-      pickNode(pickBox,(SequenceNode)node.right(),chunk,scale,width,offx,offy);\r
+    }\r
+    else\r
+    {\r
+      pickNode(pickBox, (SequenceNode) node.left(), chunk, scale, width, offx,\r
+               offy);\r
+      pickNode(pickBox, (SequenceNode) node.right(), chunk, scale, width, offx,\r
+               offy);\r
     }\r
   }\r
 \r
   public void setColor(SequenceNode node, Color c)\r
   {\r
     if (node == null)\r
+    {\r
       return;\r
+    }\r
 \r
     if (node.left() == null && node.right() == null)\r
     {\r
       node.color = c;\r
 \r
       if (node.element() instanceof SequenceI)\r
-          ((SequenceI)node.element()).setColor(c);\r
-    } else\r
+      {\r
+        ( (SequenceI) node.element()).setColor(c);\r
+      }\r
+    }\r
+    else\r
     {\r
       node.color = c;\r
-      setColor((SequenceNode)node.left(),c);\r
-      setColor((SequenceNode)node.right(),c);\r
+      setColor( (SequenceNode) node.left(), c);\r
+      setColor( (SequenceNode) node.right(), c);\r
     }\r
   }\r
 \r
-\r
   public void paint(Graphics g)\r
   {\r
 \r
-    font = new Font("Verdana",Font.PLAIN,fontSize);\r
+    font = new Font("Verdana", Font.PLAIN, fontSize);\r
     g.setFont(font);\r
 \r
     FontMetrics fm = g.getFontMetrics(font);\r
 \r
-    if(nameHash.size()==0)\r
+    if (nameHash.size() == 0)\r
+    {\r
       repaint();\r
+    }\r
 \r
-\r
-    if( fitToWindow || (!fitToWindow && scrollPane.getSize().height > fm.getHeight() * nameHash.size()+offy ) )\r
-     {\r
-         draw(g,scrollPane.getSize().width,scrollPane.getSize().height);\r
-     }\r
+    if (fitToWindow ||\r
+        (!fitToWindow &&\r
+         scrollPane.getSize().height > fm.getHeight() * nameHash.size() + offy))\r
+    {\r
+      draw(g, scrollPane.getSize().width, scrollPane.getSize().height);\r
+    }\r
     else\r
-     {\r
-         setSize(new Dimension(scrollPane.getSize().width, fm.getHeight() * nameHash.size()));\r
-         draw( g,scrollPane.getSize().width, fm.getHeight() * nameHash.size());\r
-     }\r
+    {\r
+      setSize(new Dimension(scrollPane.getSize().width,\r
+                            fm.getHeight() * nameHash.size()));\r
+      draw(g, scrollPane.getSize().width, fm.getHeight() * nameHash.size());\r
+    }\r
 \r
     scrollPane.validate();\r
   }\r
-    public int getFontSize() {\r
-        return fontSize;\r
-    }\r
-    public void setFontSize(int fontSize) {\r
-        this.fontSize = fontSize;\r
-        repaint();\r
-    }\r
-  public void draw(Graphics g, int width, int height) {\r
 \r
-      g.setColor(Color.white);\r
-      g.fillRect(0,0,width,height);\r
+  public int getFontSize()\r
+  {\r
+    return fontSize;\r
+  }\r
 \r
+  public void setFontSize(int fontSize)\r
+  {\r
+    this.fontSize = fontSize;\r
+    repaint();\r
+  }\r
 \r
-      labelLength = g.getFontMetrics(font).stringWidth(longestName)+ 20;//20 allows for scrollbar\r
+  public void draw(Graphics g, int width, int height)\r
+  {\r
 \r
-      float wscale =(float)(width - labelLength -offx*2)/tree.getMaxHeight();\r
+    g.setColor(Color.white);\r
+    g.fillRect(0, 0, width, height);\r
 \r
-      SequenceNode top = tree.getTopNode();\r
+    labelLength = g.getFontMetrics(font).stringWidth(longestName) + 20; //20 allows for scrollbar\r
 \r
-      if (top.count == 0) {\r
-          top.count = ((SequenceNode)top.left()).count + ((SequenceNode)top.right()).count ;\r
-      }\r
-      float chunk = (float)(height-offy*2)/top.count ;\r
+    float wscale = (float) (width - labelLength - offx * 2) / tree.getMaxHeight();\r
 \r
-      drawNode(g,tree.getTopNode(),chunk,wscale,width,offx,offy);\r
+    SequenceNode top = tree.getTopNode();\r
 \r
-      if (threshold != 0)\r
-      {\r
-        if(av.getCurrentTree() == tree)\r
-          g.setColor(Color.red);\r
-        else\r
-          g.setColor(Color.gray);\r
+    if (top.count == 0)\r
+    {\r
+      top.count = ( (SequenceNode) top.left()).count +\r
+          ( (SequenceNode) top.right()).count;\r
+    }\r
+    float chunk = (float) (height - offy * 2) / top.count;\r
 \r
-          int x = (int)(    threshold * (float)(getSize().width-labelLength - 2*offx) +offx   ) ;\r
+    drawNode(g, tree.getTopNode(), chunk, wscale, width, offx, offy);\r
 \r
-          g.drawLine(x,0,x,getSize().height);\r
+    if (threshold != 0)\r
+    {\r
+      if (av.getCurrentTree() == tree)\r
+      {\r
+        g.setColor(Color.red);\r
       }\r
+      else\r
+      {\r
+        g.setColor(Color.gray);\r
+      }\r
+\r
+      int x = (int) (threshold *\r
+                     (float) (getSize().width - labelLength - 2 * offx) + offx);\r
+\r
+      g.drawLine(x, 0, x, getSize().height);\r
+    }\r
 \r
   }\r
 \r
-  public void mouseReleased(MouseEvent e) { }\r
-  public void mouseEntered(MouseEvent e) { }\r
-  public void mouseExited(MouseEvent e) { }\r
-  public void mouseClicked(MouseEvent e) {\r
+  public void mouseReleased(MouseEvent e)\r
+  {}\r
+\r
+  public void mouseEntered(MouseEvent e)\r
+  {}\r
+\r
+  public void mouseExited(MouseEvent e)\r
+  {}\r
+\r
+  public void mouseClicked(MouseEvent e)\r
+  {\r
   }\r
 \r
-  public void mousePressed(MouseEvent e) {\r
+  public void mousePressed(MouseEvent e)\r
+  {\r
+    av.setCurrentTree(tree);\r
 \r
-      av.setCurrentTree(tree);\r
+    int x = e.getX();\r
+    int y = e.getY();\r
 \r
-      int x = e.getX();\r
-      int y = e.getY();\r
+    Object ob = findElement(x, y);\r
 \r
-      Object ob = findElement(x,y);\r
+    if (ob instanceof SequenceI)\r
+    {\r
+      TreeSelectionChanged( (Sequence) ob);\r
+      repaint();\r
+      return;\r
 \r
-      if (ob instanceof SequenceI)\r
+    }\r
+    else if (ob instanceof SequenceNode)\r
+    {\r
+      SequenceNode tmpnode = (SequenceNode) ob;\r
+      tree.swapNodes(tmpnode);\r
+      tree.reCount(tree.getTopNode());\r
+      tree.findHeight(tree.getTopNode());\r
+    }\r
+    else\r
+    {\r
+      // Find threshold\r
+\r
+      if (tree.getMaxHeight() != 0)\r
       {\r
-          TreeSelectionChanged((Sequence)ob);\r
-          repaint();\r
-          return;\r
+        threshold = (float) (x - offx) /\r
+            (float) (getSize().width - labelLength - 2 * offx);\r
 \r
-      } else if (ob instanceof SequenceNode) {\r
-          SequenceNode tmpnode = (SequenceNode)ob;\r
-          tree.swapNodes(tmpnode);\r
-          tree.reCount(tree.getTopNode());\r
-          tree.findHeight(tree.getTopNode());\r
-      } else {\r
-          // Find threshold\r
+        tree.getGroups().removeAllElements();\r
+        tree.groupNodes(tree.getTopNode(), threshold);\r
+        setColor(tree.getTopNode(), Color.black);\r
 \r
-          if (tree.getMaxHeight() != 0) {\r
-              threshold = (float)(x - offx)/(float)(getSize().width-labelLength - 2*offx);\r
+        av.setSelectionGroup(null);\r
+        av.alignment.deleteAllGroups();\r
 \r
-              tree.getGroups().removeAllElements();\r
-              tree.groupNodes(tree.getTopNode(),threshold);\r
-              setColor(tree.getTopNode(),Color.black);\r
+        for (int i = 0; i < tree.getGroups().size(); i++)\r
+        {\r
 \r
-              av.setSelectionGroup(null);\r
-              av.alignment.deleteAllGroups();\r
+          Color col = new Color( (int) (Math.random() * 255),\r
+                                (int) (Math.random() * 255),\r
+                                (int) (Math.random() * 255));\r
+          setColor( (SequenceNode) tree.getGroups().elementAt(i), col.brighter());\r
 \r
-              for (int i=0; i < tree.getGroups().size(); i++)\r
-              {\r
+          Vector l = tree.findLeaves( (SequenceNode) tree.getGroups().elementAt(\r
+              i), new Vector());\r
 \r
-                  Color col = new Color((int)(Math.random()*255),\r
-                                        (int)(Math.random()*255),\r
-                                        (int)(Math.random()*255));\r
-                  setColor((SequenceNode)tree.getGroups().elementAt(i),col.brighter());\r
+          Vector sequences = new Vector();\r
+          for (int j = 0; j < l.size(); j++)\r
+          {\r
+            SequenceI s1 = (SequenceI) ( (SequenceNode) l.elementAt(j)).element();\r
+            if(!sequences.contains(s1))\r
+              sequences.addElement(s1);\r
+          }\r
 \r
-                  Vector l = tree.findLeaves((SequenceNode)tree.getGroups().elementAt(i),new Vector());\r
-                  SequenceGroup sg = null;\r
-                  for (int j = 0; j < l.size(); j++)\r
-                  {\r
-                    SequenceNode sn = (SequenceNode) l.elementAt(j);\r
-                    if(sg==null)\r
-                       sg = new SequenceGroup("TreeGroup", av.getGlobalColourScheme(), true, true,false,0,av.alignment.getWidth());\r
+          ColourSchemeI cs = ColourSchemeProperty.getColour(sequences, av.alignment.getWidth(),\r
+              ColourSchemeProperty.getColourName(av.getGlobalColourScheme()));\r
 \r
-                    sg.addSequence( (Sequence) sn.element());\r
-                  }\r
 \r
-                  if (av.getGlobalColourScheme() instanceof ConservationColourScheme)\r
-                  {\r
-                    ConservationColourScheme ccs = (ConservationColourScheme) av.getGlobalColourScheme();\r
-                    Conservation c = new Conservation("Group",\r
-                                                      ResidueProperties.propHash, 3,\r
-                                                      sg.sequences, sg.getStartRes(),\r
-                                                      sg.getEndRes());\r
+          SequenceGroup sg = new SequenceGroup(sequences, "TreeGroup",\r
+                                               cs, true, true,\r
+                                               false, 0, av.alignment.getWidth());\r
 \r
-                    c.calculate();\r
-                    c.verdict(false, av.ConsPercGaps);\r
-                    ccs = new ConservationColourScheme(c, ccs.cs);\r
 \r
-                    sg.cs = ccs;\r
+          if (av.getGlobalColourScheme().conservationApplied())\r
+          {\r
+            Conservation c = new Conservation("Group",\r
+                                              ResidueProperties.propHash, 3,\r
+                                              sg.sequences, sg.getStartRes(),\r
+                                              sg.getEndRes());\r
 \r
-                  }\r
+            c.calculate();\r
+            c.verdict(false, av.ConsPercGaps);\r
+            cs.setConservation(c);\r
 \r
+            sg.cs = cs;\r
 \r
+          }\r
 \r
-                  av.alignment.addGroup(sg);\r
+          av.alignment.addGroup(sg);\r
 \r
-              }\r
-          }\r
+        }\r
       }\r
+    }\r
 \r
-      PaintRefresher.Refresh(this);\r
-      repaint();\r
+    PaintRefresher.Refresh(this, av.alignment);\r
+    repaint();\r
 \r
   }\r
 \r
-    public void setShowDistances(boolean state) {\r
-        this.showDistances = state;\r
-        repaint();\r
-    }\r
+  public void setShowDistances(boolean state)\r
+  {\r
+    this.showDistances = state;\r
+    repaint();\r
+  }\r
 \r
-    public void setShowBootstrap(boolean state) {\r
-      this.showBootstrap = state;\r
-      repaint();\r
-    }\r
-    public void setMarkPlaceholders(boolean state) {\r
-            this.markPlaceholders = state;\r
-            repaint();\r
-    }\r
+  public void setShowBootstrap(boolean state)\r
+  {\r
+    this.showBootstrap = state;\r
+    repaint();\r
+  }\r
 \r
-}\r
+  public void setMarkPlaceholders(boolean state)\r
+  {\r
+    this.markPlaceholders = state;\r
+    repaint();\r
+  }\r
 \r
+}\r