From c3db82330376f20423dc617cfa92d131dc40e515 Mon Sep 17 00:00:00 2001 From: jprocter Date: Fri, 20 May 2005 14:52:52 +0000 Subject: [PATCH] added tree node property for sequence placeholders. --- src/jalview/analysis/NJTree.java | 2 + src/jalview/appletgui/TreeCanvas.java | 15 +- src/jalview/appletgui/TreePanel.java | 307 ++++++++++++++++--------------- src/jalview/datamodel/SequenceNode.java | 17 +- src/jalview/jbappletgui/GTreePanel.java | 257 ++++++++++++++------------ 5 files changed, 322 insertions(+), 276 deletions(-) diff --git a/src/jalview/analysis/NJTree.java b/src/jalview/analysis/NJTree.java index 46d2844..8708f1d 100755 --- a/src/jalview/analysis/NJTree.java +++ b/src/jalview/analysis/NJTree.java @@ -80,6 +80,8 @@ public class NJTree { namesleft--; } else { j.setElement(new Sequence(realnam, "THISISAPLACEHLDER")); + j.setPlaceholder(true); + } } } diff --git a/src/jalview/appletgui/TreeCanvas.java b/src/jalview/appletgui/TreeCanvas.java index 7a79492..f00fd17 100755 --- a/src/jalview/appletgui/TreeCanvas.java +++ b/src/jalview/appletgui/TreeCanvas.java @@ -15,13 +15,14 @@ public class TreeCanvas extends Panel implements MouseListener NJTree tree; ScrollPane scrollPane; AlignViewport av; - + public static final String PLACEHOLDER=" * "; Font font; int fontSize = 12; boolean fitToWindow = true; boolean showDistances = false; boolean showBootstrap = false; + boolean markPlaceholders = false; int offx = 20; int offy = 20; @@ -122,10 +123,9 @@ public class TreeCanvas extends Panel implements MouseListener g.drawString(nodeLabel,xstart,ypos - 10); } - // Colour selected leaves differently - String name = node.getName(); + String name = (markPlaceholders && node.isPlaceholder()) ? (PLACEHOLDER+node.getName()) : node.getName(); FontMetrics fm = g.getFontMetrics(font); - int charWidth = fm.stringWidth(node.getName()) + 3; + int charWidth = fm.stringWidth(name) + 3; int charHeight = fm.getHeight(); Rectangle rect = new Rectangle(xend+20,ypos-charHeight, @@ -133,6 +133,7 @@ public class TreeCanvas extends Panel implements MouseListener nameHash.put((SequenceI)node.element(),rect); + // Colour selected leaves differently SequenceGroup selected = av.getSelectionGroup(); if (selected!=null && selected.sequences.contains((SequenceI)node.element())) { g.setColor(Color.gray); @@ -140,7 +141,7 @@ public class TreeCanvas extends Panel implements MouseListener g.fillRect(xend + 10, ypos - charHeight + 3,charWidth,charHeight); g.setColor(Color.white); } - g.drawString(node.getName(),xend+10,ypos); + g.drawString(name,xend+10,ypos); g.setColor(Color.black); } else { drawNode(g,(SequenceNode)node.left(), chunk,scale,width,offx,offy); @@ -425,6 +426,10 @@ public class TreeCanvas extends Panel implements MouseListener this.showBootstrap = state; repaint(); } + public void setMarkPlaceholders(boolean state) { + this.markPlaceholders = state; + repaint(); + } } diff --git a/src/jalview/appletgui/TreePanel.java b/src/jalview/appletgui/TreePanel.java index 2aeeaed..99d0328 100755 --- a/src/jalview/appletgui/TreePanel.java +++ b/src/jalview/appletgui/TreePanel.java @@ -1,149 +1,158 @@ -package jalview.appletgui; - -import jalview.datamodel.*; -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); - if(seq[i].getName().length()>longestName.length()) - longestName = seq[i].getName(); - } - // This constructor matches sequence names to treenodes and sets up the tree layouts. - tree = new NJTree(seq, newtree); - - tree.reCount(tree.getTopNode()); - tree.findHeight(tree.getTopNode()); - - treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName); - treeCanvas.setShowBootstrap(newtree.HasBootstrap()); - bootstrapMenu.setState(newtree.HasBootstrap()); - treeCanvas.setShowDistances(newtree.HasDistances()); - distanceMenu.setState(newtree.HasDistances()); - 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()); - } - -} +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()); + } + +} diff --git a/src/jalview/datamodel/SequenceNode.java b/src/jalview/datamodel/SequenceNode.java index 905bd15..5e16c57 100755 --- a/src/jalview/datamodel/SequenceNode.java +++ b/src/jalview/datamodel/SequenceNode.java @@ -1,6 +1,6 @@ package jalview.datamodel; -import java.awt.Color; +import java.awt.*; public class SequenceNode extends BinaryNode { @@ -10,6 +10,8 @@ public class SequenceNode extends BinaryNode { public float ycount; public Color color = Color.black; public boolean dummy = false; + private boolean placeholder = false; + public SequenceNode() { super(); } @@ -33,12 +35,25 @@ public class SequenceNode extends BinaryNode { public boolean isDummy() { return dummy; } + /* @param placeholder is true if the sequence refered to in the + * element node is not actually present in the associated alignment + */ + public boolean isPlaceholder() + { + return placeholder; + } + public boolean setDummy(boolean newstate) { boolean oldstate = dummy; dummy = newstate; return oldstate; } + public void setPlaceholder(boolean Placeholder) + { + this.placeholder = Placeholder; + } + /** * ascends the tree but doesn't stop until a non-dummy node is discovered. * This will probably break if the tree is a mixture of BinaryNodes and SequenceNodes. diff --git a/src/jalview/jbappletgui/GTreePanel.java b/src/jalview/jbappletgui/GTreePanel.java index 5224f61..3a7112a 100755 --- a/src/jalview/jbappletgui/GTreePanel.java +++ b/src/jalview/jbappletgui/GTreePanel.java @@ -1,121 +1,136 @@ -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 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); - } - }); - 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); - 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 fitToWindow_actionPerformed(ActionEvent e) - { - - } - - public void newickOutput_actionPerformed(ActionEvent actionEvent) - { - - } - -} +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) + { + + } + +} -- 1.7.10.2