03662ab2b8759ca34a586a2ddb41dae841816f9f
[jalview.git] / src / jalview / appletgui / TreePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.event.*;\r
25 import java.awt.*;\r
26 \r
27 import jalview.analysis.*;\r
28 import jalview.datamodel.*;\r
29 import jalview.io.*;\r
30 \r
31 public class TreePanel extends Frame\r
32 {\r
33   SequenceI[] seq;\r
34   String type;\r
35   String pwtype;\r
36   AlignmentPanel ap;\r
37   int start;\r
38   int end;\r
39   TreeCanvas treeCanvas;\r
40   NJTree tree;\r
41 \r
42   public NJTree getTree()\r
43   {\r
44     return tree;\r
45   }\r
46 \r
47   /**\r
48    * Creates a new TreePanel object.\r
49    *\r
50    * @param av DOCUMENT ME!\r
51    * @param seqVector DOCUMENT ME!\r
52    * @param type DOCUMENT ME!\r
53    * @param pwtype DOCUMENT ME!\r
54    * @param s DOCUMENT ME!\r
55    * @param e DOCUMENT ME!\r
56    */\r
57   public TreePanel(AlignViewport av, Vector seqVector, String type,\r
58                    String pwtype, int s, int e)\r
59   {\r
60     try\r
61     {\r
62       jbInit();\r
63       this.setMenuBar(jMenuBar1);\r
64     }\r
65     catch (Exception ex)\r
66     {\r
67       ex.printStackTrace();\r
68     }\r
69 \r
70     initTreePanel(av, seqVector, type, pwtype, s, e, null);\r
71   }\r
72 \r
73   /**\r
74    * Creates a new TreePanel object.\r
75    *\r
76    * @param av DOCUMENT ME!\r
77    * @param seqVector DOCUMENT ME!\r
78    * @param newtree DOCUMENT ME!\r
79    * @param type DOCUMENT ME!\r
80    * @param pwtype DOCUMENT ME!\r
81    */\r
82   public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
83                    String type, String pwtype)\r
84   {\r
85     try\r
86     {\r
87       jbInit();\r
88       this.setMenuBar(jMenuBar1);\r
89     }\r
90     catch (Exception e)\r
91     {\r
92       e.printStackTrace();\r
93     }\r
94 \r
95     initTreePanel(av, seqVector, type, pwtype, 0, seqVector.size(), newtree);\r
96   }\r
97 \r
98 \r
99   void initTreePanel(AlignViewport av, Vector seqVector, String type,\r
100                      String pwtype, int s, int e, NewickFile newTree)\r
101   {\r
102 \r
103     this.type = type;\r
104     this.pwtype = pwtype;\r
105 \r
106     start = s;\r
107     end = e;\r
108 \r
109     seq = new Sequence[seqVector.size()];\r
110     for(int i=0; i<seqVector.size(); i++)\r
111       seq[i] = (SequenceI)seqVector.elementAt(i);\r
112 \r
113 \r
114     treeCanvas = new TreeCanvas(av, scrollPane);\r
115     scrollPane.add(treeCanvas);\r
116 \r
117 \r
118     TreeLoader tl = new TreeLoader(newTree);\r
119     tl.start();\r
120 \r
121   }\r
122 \r
123   class TreeLoader extends Thread\r
124   {\r
125     NewickFile newtree;\r
126 \r
127     public TreeLoader(NewickFile newtree)\r
128     {\r
129       this.newtree = newtree;\r
130     }\r
131 \r
132     public void run()\r
133     {\r
134       if(newtree!=null)\r
135         tree = new NJTree(seq, newtree);\r
136       else\r
137         tree = new NJTree(seq, type, pwtype, start, end);\r
138 \r
139       tree.reCount(tree.getTopNode());\r
140       tree.findHeight(tree.getTopNode());\r
141       treeCanvas.setTree(tree);\r
142       if(newtree!=null)\r
143       {\r
144         distanceMenu.setState(newtree.HasDistances());\r
145         bootstrapMenu.setState(newtree.HasBootstrap());\r
146         treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
147         treeCanvas.setShowDistances(newtree.HasDistances());\r
148       }\r
149 \r
150 \r
151       treeCanvas.repaint();\r
152 \r
153     }\r
154   }\r
155 \r
156   public String getText(String format)\r
157   {\r
158     return null;\r
159   }\r
160 \r
161   protected void fitToWindow_actionPerformed(ActionEvent e)\r
162   {\r
163     treeCanvas.fitToWindow = fitToWindow.getState();\r
164     treeCanvas.repaint();\r
165   }\r
166 \r
167   public void newickOutput_actionPerformed(ActionEvent actionEvent)\r
168   {\r
169     jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
170     String output = fout.print(false, true);\r
171     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, ap.alignFrame.applet);\r
172     cap.setText(output);\r
173     java.awt.Frame frame = new java.awt.Frame();\r
174     frame.add(cap);\r
175     jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
176   }\r
177 \r
178   public java.awt.Font getTreeFont()\r
179   {\r
180     return treeCanvas.font;\r
181   }\r
182 \r
183   public void setTreeFont(java.awt.Font font)\r
184   {\r
185     treeCanvas.font = font;\r
186     treeCanvas.repaint();\r
187   }\r
188 \r
189   protected void fontSize_actionPerformed(ActionEvent e)\r
190   {\r
191      if( treeCanvas==null )\r
192         return;\r
193 \r
194     new FontChooser(this);\r
195   }\r
196 \r
197   protected void distanceMenu_actionPerformed(ActionEvent e)\r
198   {\r
199     treeCanvas.setShowDistances(distanceMenu.getState());\r
200   }\r
201 \r
202   protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
203   {\r
204     treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
205   }\r
206 \r
207   protected void placeholdersMenu_actionPerformed(ActionEvent e)\r
208   {\r
209     treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
210   }\r
211 \r
212   BorderLayout borderLayout1 = new BorderLayout();\r
213   protected ScrollPane scrollPane = new ScrollPane();\r
214   MenuBar jMenuBar1 = new MenuBar();\r
215   Menu jMenu2 = new Menu();\r
216   protected MenuItem fontSize = new MenuItem();\r
217   protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
218   protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
219   protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();\r
220   protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
221   Menu fileMenu = new Menu();\r
222   MenuItem newickOutput = new MenuItem();\r
223   CheckboxMenuItem fullId = new CheckboxMenuItem();\r
224 \r
225   private void jbInit() throws Exception {\r
226       setLayout(borderLayout1);\r
227       this.setBackground(Color.white);\r
228       this.setFont(new java.awt.Font("Verdana", 0, 12));\r
229       jMenu2.setLabel("View");\r
230       fontSize.setLabel("Font...");\r
231       fontSize.addActionListener(new java.awt.event.ActionListener() {\r
232               public void actionPerformed(ActionEvent e) {\r
233                   fontSize_actionPerformed(e);\r
234               }\r
235           });\r
236       bootstrapMenu.setLabel("Show Bootstrap Values");\r
237       bootstrapMenu.addItemListener(new java.awt.event.ItemListener() {\r
238               public void itemStateChanged(ItemEvent e) {\r
239                   bootstrapMenu_actionPerformed(null);\r
240               }\r
241           });\r
242       distanceMenu.setLabel("Show Distances");\r
243       distanceMenu.addItemListener(new java.awt.event.ItemListener() {\r
244               public void itemStateChanged(ItemEvent e) {\r
245                   distanceMenu_actionPerformed(null);\r
246               }\r
247           });\r
248       placeholdersMenu.setLabel("Mark Unassociated Leaves");\r
249       placeholdersMenu.addItemListener(new java.awt.event.ItemListener() {\r
250               public void itemStateChanged(ItemEvent e) {\r
251                   placeholdersMenu_actionPerformed(null);\r
252               }\r
253           });\r
254       fitToWindow.setState(true);\r
255       fitToWindow.setLabel("Fit To Window");\r
256       fitToWindow.addItemListener(new java.awt.event.ItemListener() {\r
257               public void itemStateChanged(ItemEvent e) {\r
258                   fitToWindow_actionPerformed(null);\r
259               }\r
260           });\r
261       fileMenu.setLabel("File");\r
262       newickOutput.setLabel("Newick Format");\r
263       newickOutput.addActionListener(new ActionListener() {\r
264               public void actionPerformed(ActionEvent actionEvent) {\r
265                   newickOutput_actionPerformed(actionEvent);\r
266               }\r
267           });\r
268     fullId.setLabel("Show Full Id");\r
269     fullId.addItemListener(new ItemListener()\r
270     {\r
271       public void itemStateChanged(ItemEvent itemEvent)\r
272       {\r
273         fullId_itemStateChanged(itemEvent);\r
274       }\r
275     });\r
276 \r
277     add(scrollPane, BorderLayout.CENTER);\r
278       jMenuBar1.add(fileMenu);\r
279       jMenuBar1.add(jMenu2);\r
280       jMenu2.add(fitToWindow);\r
281       jMenu2.add(fontSize);\r
282       jMenu2.add(distanceMenu);\r
283       jMenu2.add(bootstrapMenu);\r
284       jMenu2.add(placeholdersMenu);\r
285     jMenu2.add(fullId);\r
286     fullId.setState(true);\r
287     fileMenu.add(newickOutput);\r
288   }\r
289 \r
290 \r
291   public void fullId_itemStateChanged(ItemEvent itemEvent)\r
292   {\r
293       tree.findHeight(tree.getTopNode());\r
294 \r
295       // Now have to calculate longest name based on the leaves\r
296       Vector leaves = tree.findLeaves(tree.getTopNode(), new Vector());\r
297 \r
298       treeCanvas.longestName="";\r
299       for (int i = 0; i < leaves.size(); i++)\r
300       {\r
301         SequenceNode lf = (SequenceNode) leaves.elementAt(i);\r
302         Sequence seq = (Sequence) lf.element();\r
303         lf.setName(seq.getDisplayId(fullId.getState(), false));\r
304         if(lf.getName().length() > treeCanvas.longestName.length())\r
305           treeCanvas.longestName = lf.getName();\r
306       }\r
307 \r
308       treeCanvas.repaint();\r
309   }\r
310 \r
311 }\r