added tree node property for sequence placeholders.
authorjprocter <Jim Procter>
Fri, 20 May 2005 14:52:52 +0000 (14:52 +0000)
committerjprocter <Jim Procter>
Fri, 20 May 2005 14:52:52 +0000 (14:52 +0000)
src/jalview/analysis/NJTree.java
src/jalview/appletgui/TreeCanvas.java
src/jalview/appletgui/TreePanel.java
src/jalview/datamodel/SequenceNode.java
src/jalview/jbappletgui/GTreePanel.java

index 46d2844..8708f1d 100755 (executable)
@@ -80,6 +80,8 @@ public class NJTree {
         namesleft--;\r
       } else {\r
         j.setElement(new Sequence(realnam, "THISISAPLACEHLDER"));\r
+        j.setPlaceholder(true);\r
+\r
       }\r
     }\r
   }\r
index 7a79492..f00fd17 100755 (executable)
@@ -15,13 +15,14 @@ public class TreeCanvas extends Panel implements MouseListener
   NJTree tree;\r
   ScrollPane scrollPane;\r
   AlignViewport av;\r
-\r
+  public static final String PLACEHOLDER=" * ";\r
   Font font;\r
   int  fontSize = 12;\r
 \r
   boolean fitToWindow = true;\r
   boolean showDistances = false;\r
   boolean showBootstrap = false;\r
+  boolean markPlaceholders = false;\r
 \r
   int offx = 20;\r
   int offy = 20;\r
@@ -122,10 +123,9 @@ public class TreeCanvas extends Panel implements MouseListener
       g.drawString(nodeLabel,xstart,ypos - 10);\r
       }\r
 \r
-      // Colour selected leaves differently\r
-      String name    = node.getName();\r
+      String name    = (markPlaceholders && node.isPlaceholder()) ? (PLACEHOLDER+node.getName()) : node.getName();\r
       FontMetrics fm = g.getFontMetrics(font);\r
-      int charWidth  = fm.stringWidth(node.getName()) + 3;\r
+      int charWidth  = fm.stringWidth(name) + 3;\r
       int charHeight = fm.getHeight();\r
 \r
       Rectangle rect = new Rectangle(xend+20,ypos-charHeight,\r
@@ -133,6 +133,7 @@ public class TreeCanvas extends Panel implements MouseListener
 \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
         g.setColor(Color.gray);\r
@@ -140,7 +141,7 @@ public class TreeCanvas extends Panel implements MouseListener
         g.fillRect(xend + 10, ypos - charHeight + 3,charWidth,charHeight);\r
         g.setColor(Color.white);\r
       }\r
-      g.drawString(node.getName(),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
@@ -425,6 +426,10 @@ public class TreeCanvas extends Panel implements MouseListener
       this.showBootstrap = state;\r
       repaint();\r
     }\r
+    public void setMarkPlaceholders(boolean state) {\r
+            this.markPlaceholders = state;\r
+            repaint();\r
+    }\r
 \r
 }\r
 \r
index 2aeeaed..99d0328 100755 (executable)
-package jalview.appletgui;\r
-\r
-import jalview.datamodel.*;\r
-import jalview.analysis.*;\r
-import jalview.jbappletgui.GTreePanel;\r
-import java.awt.event.*;\r
-import java.util.*;\r
-import jalview.io.NewickFile;\r
-\r
-\r
-public class TreePanel extends GTreePanel\r
-{\r
-  SequenceI[] seq;\r
-  String type;\r
-  String pwtype;\r
-  AlignViewport av;\r
-  int start;\r
-  int end;\r
-  TreeCanvas treeCanvas;\r
-  NJTree tree;\r
-\r
-  public NJTree getTree()\r
-  {\r
-    return tree;\r
-  }\r
-\r
-  public TreePanel(AlignViewport av, Vector seqVector, String type, String pwtype, int s, int e)\r
-  {\r
-    super();\r
-\r
-    this.type = type;\r
-    this.pwtype = pwtype;\r
-\r
-    start = s;\r
-    end = e;\r
-\r
-    String longestName = "";\r
-    seq = new Sequence [seqVector.size()];\r
-    for (int i=0;i < seqVector.size();i++)\r
-    {\r
-      seq[i] = (Sequence) seqVector.elementAt(i);\r
-      if(seq[i].getName().length()>longestName.length())\r
-        longestName = seq[i].getName();\r
-    }\r
-\r
-    tree = new NJTree(seq, type, pwtype, start, end);\r
-\r
-    treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
-\r
-    tree.reCount(tree.getTopNode());\r
-    tree.findHeight(tree.getTopNode());\r
-    scrollPane.add(treeCanvas);\r
-\r
-  }\r
-\r
-public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
-               String type, String pwtype)\r
-{\r
-  super();\r
-  // These are probably only  arbitrary strings reflecting source of tree\r
-  this.type = type;\r
-  this.pwtype = pwtype;\r
-\r
-  start = 0;\r
-  end = seqVector.size();\r
-\r
-  String longestName = "";\r
-  seq = new Sequence [seqVector.size()];\r
-  for (int i=0;i < seqVector.size();i++)\r
-  {\r
-    seq[i] = (Sequence) seqVector.elementAt(i);\r
-    if(seq[i].getName().length()>longestName.length())\r
-      longestName = seq[i].getName();\r
-  }\r
-  // This constructor matches sequence names to treenodes and sets up the tree layouts.\r
-  tree = new NJTree(seq, newtree);\r
-\r
-  tree.reCount(tree.getTopNode());\r
-  tree.findHeight(tree.getTopNode());\r
-\r
-  treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
-  treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
-  bootstrapMenu.setState(newtree.HasBootstrap());\r
-  treeCanvas.setShowDistances(newtree.HasDistances());\r
-  distanceMenu.setState(newtree.HasDistances());\r
-  scrollPane.add(treeCanvas);\r
-\r
-}\r
-\r
-\r
-\r
-public String getText(String format) {\r
-  return null;\r
-}\r
-\r
-  protected void fitToWindow_actionPerformed(ActionEvent e)\r
-  {\r
-    treeCanvas.fitToWindow = fitToWindow.getState();\r
-    repaint();\r
-  }\r
-\r
-  public void newickOutput_actionPerformed(ActionEvent actionEvent)\r
-  {\r
-    jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
-    String output = fout.print(false, true);\r
-    CutAndPasteTransfer cap = new CutAndPasteTransfer(false);\r
-    cap.setText(output);\r
-    java.awt.Frame frame = new java.awt.Frame();\r
-    frame.add(cap);\r
-    jalview.bin.JalviewLite.addFrame(frame, type+" "+pwtype, 500,500);\r
-  }\r
-\r
-\r
-\r
-  protected void fontSize_actionPerformed(ActionEvent e)\r
-  {\r
- /*   if( treeCanvas==null )\r
-     return;\r
-\r
-   String size = fontSize.getLabel().substring( fontSize.getLabel().indexOf("-")+1);\r
-\r
-   Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
-                               "Select font size",\r
-                               "Font size",\r
-                               JOptionPane.QUESTION_MESSAGE,\r
-                               null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
-                               ,"Font Size - "+size);\r
-   if(selection!=null)\r
-   {\r
-     fontSize.setText("Font Size - " + selection);\r
-\r
-     int i = Integer.parseInt(selection.toString());\r
-     treeCanvas.setFontSize(i);\r
-   }\r
-    scrollPane.setViewportView(treeCanvas);\r
-*/\r
-  }\r
-\r
-  protected void distanceMenu_actionPerformed(ActionEvent e)\r
-  {\r
-    treeCanvas.setShowDistances(distanceMenu.getState());\r
-  }\r
-\r
-  protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
-  {\r
-    treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
-  }\r
-\r
-}\r
+package jalview.appletgui;
+
+import jalview.datamodel.*;
+import jalview.io.NewickFile;
+import jalview.analysis.*;
+import jalview.jbappletgui.GTreePanel;
+import java.awt.event.*;
+import java.util.*;
+import jalview.io.NewickFile;
+
+
+public class TreePanel extends GTreePanel
+{
+  SequenceI[] seq;
+  String type;
+  String pwtype;
+  AlignViewport av;
+  int start;
+  int end;
+  TreeCanvas treeCanvas;
+  NJTree tree;
+
+  public NJTree getTree()
+  {
+    return tree;
+  }
+
+  public TreePanel(AlignViewport av, Vector seqVector, String type, String pwtype, int s, int e)
+  {
+    super();
+
+    this.type = type;
+    this.pwtype = pwtype;
+
+    start = s;
+    end = e;
+
+    String longestName = "";
+    seq = new Sequence [seqVector.size()];
+    for (int i=0;i < seqVector.size();i++)
+    {
+      seq[i] = (Sequence) seqVector.elementAt(i);
+      if(seq[i].getName().length()>longestName.length())
+        longestName = seq[i].getName();
+    }
+
+    tree = new NJTree(seq, type, pwtype, start, end);
+
+    treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);
+
+    tree.reCount(tree.getTopNode());
+    tree.findHeight(tree.getTopNode());
+    scrollPane.add(treeCanvas);
+
+  }
+  public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,
+                   String type, String pwtype)
+    {
+      super();
+      // These are probably only  arbitrary strings reflecting source of tree
+      this.type = type;
+      this.pwtype = pwtype;
+
+      start = 0;
+      end = seqVector.size();
+
+      String longestName = "";
+      seq = new Sequence [seqVector.size()];
+      for (int i=0;i < seqVector.size();i++)
+      {
+        seq[i] = (Sequence) seqVector.elementAt(i);
+      }
+      // This constructor matches sequence names to treenodes and sets up the tree layouts.
+      tree = new NJTree(seq, newtree);
+      // Now have to calculate longest name based on the leaves
+      Vector leaves = tree.findLeaves(tree.getTopNode(),new Vector());
+
+      for (int i=0;i < leaves.size();i++)
+        if (longestName.length()<((Sequence) ((SequenceNode) leaves.elementAt(i)).element()).getName().length())
+          longestName = TreeCanvas.PLACEHOLDER+((Sequence) ((SequenceNode) leaves.elementAt(i)).element()).getName();
+
+      tree.reCount(tree.getTopNode());
+      tree.findHeight(tree.getTopNode());
+
+      treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);
+      treeCanvas.setShowBootstrap(newtree.HasBootstrap());
+      treeCanvas.setShowDistances(newtree.HasDistances());
+      distanceMenu.setState(newtree.HasDistances());
+      bootstrapMenu.setState(newtree.HasBootstrap());
+      if (true) // JBPNote TODO: preference for always marking placeholders in new associated tree
+        placeholdersMenu.setState(treeCanvas.markPlaceholders);
+      scrollPane.add(treeCanvas);
+
+    }
+
+public String getText(String format) {
+  return null;
+}
+
+  protected void fitToWindow_actionPerformed(ActionEvent e)
+  {
+    treeCanvas.fitToWindow = fitToWindow.getState();
+    repaint();
+  }
+
+  public void newickOutput_actionPerformed(ActionEvent actionEvent)
+  {
+    jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());
+    String output = fout.print(false, true);
+    CutAndPasteTransfer cap = new CutAndPasteTransfer(false);
+    cap.setText(output);
+    java.awt.Frame frame = new java.awt.Frame();
+    frame.add(cap);
+    jalview.bin.JalviewLite.addFrame(frame, type+" "+pwtype, 500,500);
+  }
+
+
+
+  protected void fontSize_actionPerformed(ActionEvent e)
+  {
+ /*   if( treeCanvas==null )
+     return;
+
+   String size = fontSize.getLabel().substring( fontSize.getLabel().indexOf("-")+1);
+
+   Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,
+                               "Select font size",
+                               "Font size",
+                               JOptionPane.QUESTION_MESSAGE,
+                               null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}
+                               ,"Font Size - "+size);
+   if(selection!=null)
+   {
+     fontSize.setText("Font Size - " + selection);
+
+     int i = Integer.parseInt(selection.toString());
+     treeCanvas.setFontSize(i);
+   }
+    scrollPane.setViewportView(treeCanvas);
+*/
+  }
+
+  protected void distanceMenu_actionPerformed(ActionEvent e)
+  {
+    treeCanvas.setShowDistances(distanceMenu.getState());
+  }
+
+  protected void bootstrapMenu_actionPerformed(ActionEvent e)
+  {
+    treeCanvas.setShowBootstrap(bootstrapMenu.getState());
+  }
+
+  protected void placeholdersMenu_actionPerformed(ActionEvent e)
+  {
+      treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());
+  }
+
+}
index 905bd15..5e16c57 100755 (executable)
@@ -1,6 +1,6 @@
 package jalview.datamodel;\r
 \r
-import java.awt.Color;\r
+import java.awt.*;\r
 \r
 public class SequenceNode extends BinaryNode {\r
 \r
@@ -10,6 +10,8 @@ public class SequenceNode extends BinaryNode {
   public float ycount;\r
   public Color color = Color.black;\r
   public boolean dummy = false;\r
+  private boolean placeholder = false;\r
+\r
   public SequenceNode() {\r
     super();\r
   }\r
@@ -33,12 +35,25 @@ public class SequenceNode extends BinaryNode {
   public boolean isDummy() {\r
     return dummy;\r
   }\r
+  /* @param placeholder is true if the sequence refered to in the\r
+   *  element node is not actually present in the associated alignment\r
+   */\r
+  public boolean isPlaceholder()\r
+  {\r
+    return placeholder;\r
+  }\r
+\r
   public boolean setDummy(boolean newstate) {\r
     boolean oldstate = dummy;\r
     dummy = newstate;\r
     return oldstate;\r
   }\r
 \r
+  public void setPlaceholder(boolean Placeholder)\r
+  {\r
+    this.placeholder = Placeholder;\r
+  }\r
+\r
   /**\r
    * ascends the tree but doesn't stop until a non-dummy node is discovered.\r
    * This will probably break if the tree is a mixture of BinaryNodes and SequenceNodes.\r
index 5224f61..3a7112a 100755 (executable)
-package jalview.jbappletgui;\r
-\r
-import java.awt.*;\r
-import java.awt.event.*;\r
-\r
-public class GTreePanel extends Frame\r
-{\r
-  BorderLayout borderLayout1 = new BorderLayout();\r
-  protected ScrollPane scrollPane = new ScrollPane();\r
-  MenuBar jMenuBar1 = new MenuBar();\r
-  Menu jMenu2 = new Menu();\r
-  protected MenuItem fontSize = new MenuItem();\r
-  protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
-  protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
-  protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
-  Menu fileMenu = new Menu();\r
-  MenuItem newickOutput = new MenuItem();\r
-\r
-  public GTreePanel()\r
-  {\r
-    try\r
-    {\r
-      jbInit();\r
-      this.setMenuBar(jMenuBar1);\r
-    }\r
-    catch(Exception e)\r
-    {\r
-      e.printStackTrace();\r
-    }\r
-\r
-  }\r
-  private void jbInit() throws Exception\r
-  {\r
-    setLayout(borderLayout1);\r
-    this.setBackground(Color.white);\r
-    this.setFont(new java.awt.Font("Verdana", 0, 12));\r
-    jMenu2.setLabel("View");\r
-    fontSize.setLabel("Font Size - 12");\r
-    fontSize.addActionListener(new java.awt.event.ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent e)\r
-      {\r
-        fontSize_actionPerformed(e);\r
-      }\r
-    });\r
-    bootstrapMenu.setLabel("Show Bootstrap values");\r
-    bootstrapMenu.addItemListener(new java.awt.event.ItemListener()\r
-    {\r
-      public void itemStateChanged(ItemEvent e)\r
-      {\r
-        bootstrapMenu_actionPerformed(null);\r
-      }\r
-    });\r
-    distanceMenu.setLabel("Show Distances");\r
-    distanceMenu.addItemListener(new java.awt.event.ItemListener()\r
-    {\r
-      public void itemStateChanged(ItemEvent e)\r
-      {\r
-        distanceMenu_actionPerformed(null);\r
-      }\r
-    });\r
-    fitToWindow.setState(true);\r
-    fitToWindow.setLabel("Fit to window");\r
-    fitToWindow.addItemListener(new java.awt.event.ItemListener()\r
-    {\r
-      public void itemStateChanged(ItemEvent e)\r
-      {\r
-        fitToWindow_actionPerformed(null);\r
-      }\r
-    });\r
-    fileMenu.setLabel("File");\r
-    newickOutput.setLabel("Newick Format");\r
-    newickOutput.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent actionEvent)\r
-      {\r
-        newickOutput_actionPerformed(actionEvent);\r
-      }\r
-    });\r
-    add(scrollPane, BorderLayout.CENTER);\r
-    jMenuBar1.add(fileMenu);\r
-    jMenuBar1.add(jMenu2);\r
-    jMenu2.add(fitToWindow);\r
-    jMenu2.add(fontSize);\r
-    jMenu2.add(distanceMenu);\r
-    jMenu2.add(bootstrapMenu);\r
-    fileMenu.add(newickOutput);\r
-  }\r
-\r
-\r
-  protected void printMenu_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  protected void fontSize_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  protected void distanceMenu_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  protected void fitToWindow_actionPerformed(ActionEvent e)\r
-  {\r
-\r
-  }\r
-\r
-  public void newickOutput_actionPerformed(ActionEvent actionEvent)\r
-  {\r
-\r
-  }\r
-\r
-}\r
+package jalview.jbappletgui;
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class GTreePanel extends Frame
+{
+  BorderLayout borderLayout1 = new BorderLayout();
+  protected ScrollPane scrollPane = new ScrollPane();
+  MenuBar jMenuBar1 = new MenuBar();
+  Menu jMenu2 = new Menu();
+  protected MenuItem fontSize = new MenuItem();
+  protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();
+  protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();
+  protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();
+  protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();
+  Menu fileMenu = new Menu();
+  MenuItem newickOutput = new MenuItem();
+
+  public GTreePanel()
+  {
+    try
+    {
+      jbInit();
+      this.setMenuBar(jMenuBar1);
+    }
+    catch(Exception e)
+    {
+      e.printStackTrace();
+    }
+
+  }
+  private void jbInit() throws Exception
+  {
+    setLayout(borderLayout1);
+    this.setBackground(Color.white);
+    this.setFont(new java.awt.Font("Verdana", 0, 12));
+    jMenu2.setLabel("View");
+    fontSize.setLabel("Font Size - 12");
+    fontSize.addActionListener(new java.awt.event.ActionListener()
+    {
+      public void actionPerformed(ActionEvent e)
+      {
+        fontSize_actionPerformed(e);
+      }
+    });
+    bootstrapMenu.setLabel("Show Bootstrap values");
+    bootstrapMenu.addItemListener(new java.awt.event.ItemListener()
+    {
+      public void itemStateChanged(ItemEvent e)
+      {
+        bootstrapMenu_actionPerformed(null);
+      }
+    });
+    distanceMenu.setLabel("Show Distances");
+    distanceMenu.addItemListener(new java.awt.event.ItemListener()
+    {
+      public void itemStateChanged(ItemEvent e)
+      {
+        distanceMenu_actionPerformed(null);
+      }
+    });
+    placeholdersMenu.setLabel("Mark Unassociated Leaves");
+    placeholdersMenu.addItemListener(new java.awt.event.ItemListener()
+    {
+      public void itemStateChanged(ItemEvent e)
+      {
+        placeholdersMenu_actionPerformed(null);
+      }
+    });
+    fitToWindow.setState(true);
+    fitToWindow.setLabel("Fit to window");
+    fitToWindow.addItemListener(new java.awt.event.ItemListener()
+    {
+      public void itemStateChanged(ItemEvent e)
+      {
+        fitToWindow_actionPerformed(null);
+      }
+    });
+    fileMenu.setLabel("File");
+    newickOutput.setLabel("Newick format");
+    newickOutput.addActionListener(new ActionListener()
+    {
+      public void actionPerformed(ActionEvent actionEvent)
+      {
+        newickOutput_actionPerformed(actionEvent);
+      }
+    });
+    add(scrollPane, BorderLayout.CENTER);
+    jMenuBar1.add(fileMenu);
+    jMenuBar1.add(jMenu2);
+    jMenu2.add(fitToWindow);
+    jMenu2.add(fontSize);
+    jMenu2.add(distanceMenu);
+    jMenu2.add(bootstrapMenu);
+    jMenu2.add(placeholdersMenu);
+    fileMenu.add(newickOutput);
+  }
+
+
+  protected void printMenu_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  protected void fontSize_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  protected void distanceMenu_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  protected void bootstrapMenu_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  protected void placeholdersMenu_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  protected void fitToWindow_actionPerformed(ActionEvent e)
+  {
+
+  }
+
+  public void newickOutput_actionPerformed(ActionEvent actionEvent)
+  {
+
+  }
+
+}