optimize repaints
[jalview.git] / src / jalview / appletgui / TreeCanvas.java
index 1c1e7cf..c38b1a5 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2007 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
@@ -55,7 +55,6 @@ public class TreeCanvas
 \r
   SequenceNode highlightNode;\r
 \r
-\r
   public TreeCanvas(AlignViewport av, ScrollPane scroller)\r
   {\r
     this.av = av;\r
@@ -65,7 +64,7 @@ public class TreeCanvas
     addMouseMotionListener(this);\r
     setLayout(null);\r
 \r
-    PaintRefresher.Register(this, av.alignment);\r
+    PaintRefresher.Register(this, av.getSequenceSetId());\r
   }\r
 \r
   public void treeSelectionChanged(SequenceI sequence)\r
@@ -77,7 +76,7 @@ public class TreeCanvas
       av.setSelectionGroup(selected);\r
     }\r
 \r
-    selected.setEndRes(av.alignment.getWidth()-1);\r
+    selected.setEndRes(av.alignment.getWidth() - 1);\r
     selected.addOrRemove(sequence, true);\r
   }\r
 \r
@@ -168,7 +167,7 @@ public class TreeCanvas
       }\r
       if (!nodeLabel.equals(""))\r
       {\r
-        g.drawString(nodeLabel, xstart+2, ypos - 2);\r
+        g.drawString(nodeLabel, xstart + 2, ypos - 2);\r
       }\r
 \r
       String name = (markPlaceholders && node.isPlaceholder()) ?\r
@@ -185,7 +184,7 @@ public class TreeCanvas
       // Colour selected leaves differently\r
       SequenceGroup selected = av.getSelectionGroup();\r
       if (selected != null &&\r
-          selected.getSequences(false).contains( (SequenceI) node.element()))\r
+          selected.getSequences(null).contains( (SequenceI) node.element()))\r
       {\r
         g.setColor(Color.gray);\r
 \r
@@ -212,9 +211,13 @@ public class TreeCanvas
       // Draw horizontal line\r
       g.drawLine(xstart, ypos, xend, ypos);\r
       if (node == highlightNode)\r
+      {\r
         g.fillRect(xend - 3, ypos - 3, 6, 6);\r
+      }\r
       else\r
+      {\r
         g.fillRect(xend - 2, ypos - 2, 4, 4);\r
+      }\r
 \r
       int ystart = (int) ( ( (SequenceNode) node.left()).ycount * chunk) + offy;\r
       int yend = (int) ( ( (SequenceNode) node.right()).ycount * chunk) + offy;\r
@@ -227,7 +230,7 @@ public class TreeCanvas
 \r
       if (showDistances && node.dist > 0)\r
       {\r
-        g.drawString(new Format("%-.2f").form(node.dist), xstart+2, ypos - 2);\r
+        g.drawString(new Format("%-.2f").form(node.dist), xstart + 2, ypos - 2);\r
       }\r
 \r
     }\r
@@ -337,7 +340,7 @@ public class TreeCanvas
 \r
       if (node.element() instanceof SequenceI)\r
       {\r
-        av.setSequenceColour((SequenceI) node.element(), c);\r
+        av.setSequenceColour( (SequenceI) node.element(), c);\r
       }\r
     }\r
     else\r
@@ -353,55 +356,43 @@ public class TreeCanvas
     paint(g);\r
   }\r
 \r
-  Image offscreen;\r
-  public void paint(Graphics g1)\r
+  public void paint(Graphics g)\r
   {\r
-\r
-    if(tree==null)\r
+    if (tree == null)\r
+    {\r
       return;\r
+    }\r
 \r
     if (nameHash.size() == 0)\r
     {\r
       repaint();\r
     }\r
 \r
-    FontMetrics fm = g1.getFontMetrics(font);\r
-\r
     int width = scrollPane.getSize().width;\r
     int height = scrollPane.getSize().height;\r
-    if(!fitToWindow)\r
-      height = fm.getHeight() * nameHash.size();\r
-\r
+    if (!fitToWindow)\r
+    {\r
+      height = g.getFontMetrics(font).getHeight() * nameHash.size();\r
+    }\r
 \r
-    if(offscreen==null || offscreen.getWidth(this)!=width\r
-    || offscreen.getHeight(this)!=height)\r
-      offscreen = createImage(width, height);\r
+    if (getSize().width > width)\r
+    {\r
+      setSize(new Dimension(width, height));\r
+      scrollPane.validate();\r
+      return;\r
+    }\r
 \r
-    Graphics g = offscreen.getGraphics();\r
+    setSize(new Dimension(width, height));\r
 \r
     g.setFont(font);\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,\r
-                            fm.getHeight() * nameHash.size()));\r
-      draw(g, scrollPane.getSize().width, fm.getHeight() * nameHash.size());\r
-    }\r
+    draw(g, width, height);\r
 \r
-    g1.drawImage(offscreen, 0, 0, this);\r
-    scrollPane.validate();\r
   }\r
 \r
-\r
   public void draw(Graphics g, int width, int height)\r
   {\r
-    offy = font.getSize()+10;\r
+    offy = font.getSize() + 10;\r
 \r
     g.setColor(Color.white);\r
     g.fillRect(0, 0, width, height);\r
@@ -472,7 +463,7 @@ public class TreeCanvas
         }\r
       }\r
 \r
-      PaintRefresher.Refresh(this, av.alignment);\r
+      PaintRefresher.Refresh(this, av.getSequenceSetId());\r
       repaint();\r
     }\r
   }\r
@@ -480,7 +471,6 @@ public class TreeCanvas
   public void mouseDragged(MouseEvent ect)\r
   {}\r
 \r
-\r
   public void mouseMoved(MouseEvent evt)\r
   {\r
     av.setCurrentTree(tree);\r
@@ -514,11 +504,11 @@ public class TreeCanvas
     if (ob instanceof SequenceI)\r
     {\r
       treeSelectionChanged( (Sequence) ob);\r
-      PaintRefresher.Refresh(this, av.alignment);\r
+      PaintRefresher.Refresh(this, av.getSequenceSetId());\r
       repaint();\r
       return;\r
     }\r
-    else if ( !(ob instanceof SequenceNode))\r
+    else if (! (ob instanceof SequenceNode))\r
     {\r
       // Find threshold\r
 \r
@@ -533,14 +523,14 @@ public class TreeCanvas
 \r
         av.setSelectionGroup(null);\r
         av.alignment.deleteAllGroups();\r
-        av.sequenceColours.clear();\r
+        av.sequenceColours = null;\r
 \r
         colourGroups();\r
 \r
       }\r
     }\r
 \r
-    PaintRefresher.Refresh(this, av.alignment);\r
+    PaintRefresher.Refresh(this, av.getSequenceSetId());\r
     repaint();\r
 \r
   }\r
@@ -548,69 +538,76 @@ public class TreeCanvas
   void colourGroups()\r
   {\r
     for (int i = 0; i < tree.getGroups().size(); i++)\r
-        {\r
+    {\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
+      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
-          Vector l = tree.findLeaves( (SequenceNode) tree.getGroups().elementAt(\r
-              i), new Vector());\r
+      Vector l = tree.findLeaves( (SequenceNode) tree.getGroups().elementAt(\r
+          i), new Vector());\r
 \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
+      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
+        {\r
+          sequences.addElement(s1);\r
+        }\r
+      }\r
 \r
-          ColourSchemeI cs = null;\r
+      ColourSchemeI cs = null;\r
 \r
-          if (av.getGlobalColourScheme() != null)\r
-          {\r
-            if (av.getGlobalColourScheme() instanceof UserColourScheme)\r
-            {\r
-              cs = new UserColourScheme(\r
-                  ( (UserColourScheme) av.getGlobalColourScheme()).getColours());\r
-\r
-            }\r
-            else\r
-              cs = ColourSchemeProperty.getColour(sequences,\r
-                                                  av.alignment.getWidth(),\r
-                                                  ColourSchemeProperty.getColourName(\r
-                                                      av.getGlobalColourScheme()));\r
-\r
-              cs.setThreshold(av.getGlobalColourScheme().getThreshold(),\r
-                                                   av.getIgnoreGapsConsensus());\r
-          }\r
+      if (av.getGlobalColourScheme() != null)\r
+      {\r
+        if (av.getGlobalColourScheme() instanceof UserColourScheme)\r
+        {\r
+          cs = new UserColourScheme(\r
+              ( (UserColourScheme) av.getGlobalColourScheme()).getColours());\r
 \r
-          SequenceGroup sg = new SequenceGroup(sequences, "TreeGroup",\r
-                                               cs, true, true,\r
-                                               false, 0, av.alignment.getWidth()-1);\r
+        }\r
+        else\r
+        {\r
+          cs = ColourSchemeProperty.getColour(sequences,\r
+                                              av.alignment.getWidth(),\r
+                                              ColourSchemeProperty.\r
+                                              getColourName(\r
+                                                  av.getGlobalColourScheme()));\r
+        }\r
 \r
+        cs.setThreshold(av.getGlobalColourScheme().getThreshold(),\r
+                        av.getIgnoreGapsConsensus());\r
+      }\r
 \r
-          if (  av.getGlobalColourScheme()!=null\r
-             && av.getGlobalColourScheme().conservationApplied())\r
-            {\r
-            Conservation c = new Conservation("Group",\r
-                                              ResidueProperties.propHash, 3,\r
-                                              sg.getSequences(false),\r
-                                              sg.getStartRes(),\r
-                                              sg.getEndRes());\r
+      SequenceGroup sg = new SequenceGroup(sequences, "",\r
+                                           cs, true, true,\r
+                                           false, 0,\r
+                                           av.alignment.getWidth() - 1);\r
 \r
-            c.calculate();\r
-            c.verdict(false, av.ConsPercGaps);\r
-            cs.setConservation(c);\r
+      sg.setName("JTreeGroup:" + sg.hashCode());\r
 \r
-            sg.cs = cs;\r
+      if (av.getGlobalColourScheme() != null\r
+          && av.getGlobalColourScheme().conservationApplied())\r
+      {\r
+        Conservation c = new Conservation("Group",\r
+                                          ResidueProperties.propHash, 3,\r
+                                          sg.getSequences(null),\r
+                                          sg.getStartRes(),\r
+                                          sg.getEndRes());\r
 \r
-          }\r
+        c.calculate();\r
+        c.verdict(false, av.ConsPercGaps);\r
+        cs.setConservation(c);\r
 \r
-          av.alignment.addGroup(sg);\r
+        sg.cs = cs;\r
 \r
-        }\r
+      }\r
+\r
+      av.alignment.addGroup(sg);\r
+\r
+    }\r
 \r
   }\r
 \r