Don't parse input id, leave it as it is
[jalview.git] / src / jalview / gui / 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 package jalview.gui;\r
20 \r
21 import jalview.analysis.*;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 import jalview.io.*;\r
26 \r
27 import jalview.jbgui.*;\r
28 \r
29 \r
30 import java.awt.*;\r
31 import java.awt.event.*;\r
32 \r
33 import java.io.*;\r
34 \r
35 import java.util.*;\r
36 \r
37 import java.beans.PropertyChangeEvent;\r
38 \r
39 \r
40 /**\r
41  * DOCUMENT ME!\r
42  *\r
43  * @author $author$\r
44  * @version $Revision$\r
45  */\r
46 public class TreePanel extends GTreePanel\r
47 {\r
48     SequenceI[] seq;\r
49     String type;\r
50     String pwtype;\r
51     int start;\r
52     int end;\r
53     TreeCanvas treeCanvas;\r
54     NJTree tree;\r
55 \r
56     /**\r
57      * Creates a new TreePanel object.\r
58      *\r
59      * @param av DOCUMENT ME!\r
60      * @param seqVector DOCUMENT ME!\r
61      * @param type DOCUMENT ME!\r
62      * @param pwtype DOCUMENT ME!\r
63      * @param s DOCUMENT ME!\r
64      * @param e DOCUMENT ME!\r
65      */\r
66     public TreePanel(AlignViewport av, Vector seqVector, String type,\r
67                      String pwtype, int s, int e)\r
68     {\r
69       super();\r
70       initTreePanel(av, seqVector, type, pwtype, s, e, null);\r
71 \r
72       // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default\r
73       showDistances(true);\r
74     }\r
75 \r
76     /**\r
77      * Creates a new TreePanel object.\r
78      *\r
79      * @param av DOCUMENT ME!\r
80      * @param seqVector DOCUMENT ME!\r
81      * @param newtree DOCUMENT ME!\r
82      * @param type DOCUMENT ME!\r
83      * @param pwtype DOCUMENT ME!\r
84      */\r
85     public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
86                      String type, String pwtype)\r
87     {\r
88       super();\r
89       initTreePanel(av, seqVector, type, pwtype, 0, seqVector.size(), newtree);\r
90     }\r
91 \r
92     public AlignmentI getAlignment()\r
93     {\r
94       return treeCanvas.av.getAlignment();\r
95     }\r
96 \r
97 \r
98     void initTreePanel(AlignViewport av, Vector seqVector, String type,\r
99                        String pwtype, int s, int e, NewickFile newTree)\r
100     {\r
101 \r
102       this.type = type;\r
103       this.pwtype = pwtype;\r
104 \r
105       start = s;\r
106       end = e;\r
107 \r
108       seq = new Sequence[seqVector.size()];\r
109       seqVector.toArray(seq);\r
110 \r
111 \r
112       treeCanvas = new TreeCanvas(av, scrollPane);\r
113       scrollPane.setViewportView(treeCanvas);\r
114 \r
115       av.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
116       {\r
117         public void propertyChange(PropertyChangeEvent evt)\r
118         {\r
119           if (evt.getPropertyName().equals("alignment"))\r
120           {\r
121             if(tree==null)\r
122               System.out.println("tree is null");\r
123             if(evt.getNewValue()==null)\r
124               System.out.println("new value is null");\r
125 \r
126             tree.UpdatePlaceHolders( (Vector) evt.getNewValue());\r
127 \r
128             repaint();\r
129           }\r
130         }\r
131       });\r
132 \r
133 \r
134       TreeLoader tl = new TreeLoader(newTree);\r
135       tl.start();\r
136 \r
137     }\r
138 \r
139     class TreeLoader extends Thread\r
140     {\r
141       NewickFile newtree;\r
142 \r
143       public TreeLoader(NewickFile newtree)\r
144       {\r
145         this.newtree = newtree;\r
146         if (newtree != null)\r
147         {\r
148           // Must be outside run(), as Jalview2XML tries to\r
149           // update distance/bootstrap visibility at the same time\r
150           showBootstrap(newtree.HasBootstrap());\r
151           showDistances(newtree.HasDistances());\r
152           showPlaceholders(true);\r
153         }\r
154       }\r
155 \r
156       public void run()\r
157       {\r
158         if(newtree!=null)\r
159           tree = new NJTree(seq, newtree);\r
160         else\r
161           tree = new NJTree(seq, type, pwtype, start, end);\r
162 \r
163         tree.reCount(tree.getTopNode());\r
164         tree.findHeight(tree.getTopNode());\r
165         treeCanvas.setTree(tree);\r
166 \r
167         treeCanvas.repaint();\r
168       }\r
169 \r
170     }\r
171 \r
172     public void showDistances(boolean b)\r
173     {\r
174       treeCanvas.setShowDistances(b);\r
175       distanceMenu.setSelected(b);\r
176     }\r
177 \r
178     public void showBootstrap(boolean b)\r
179     {\r
180       treeCanvas.setShowBootstrap(b);\r
181       bootstrapMenu.setSelected(b);\r
182     }\r
183 \r
184     public void showPlaceholders(boolean b)\r
185     {\r
186       placeholdersMenu.setState(b);\r
187       treeCanvas.setMarkPlaceholders(b);\r
188     }\r
189 \r
190 \r
191 \r
192 \r
193     /**\r
194      * DOCUMENT ME!\r
195      *\r
196      * @return DOCUMENT ME!\r
197      */\r
198     public NJTree getTree()\r
199     {\r
200         return tree;\r
201     }\r
202 \r
203 \r
204     /**\r
205      * DOCUMENT ME!\r
206      *\r
207      * @param e DOCUMENT ME!\r
208      */\r
209     public void textbox_actionPerformed(ActionEvent e)\r
210     {\r
211         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
212 \r
213         StringBuffer buffer = new StringBuffer();\r
214 \r
215         if (type.equals("AV"))\r
216         {\r
217             buffer.append("Average distance tree using ");\r
218         }\r
219         else\r
220         {\r
221             buffer.append("Neighbour joining tree using ");\r
222         }\r
223 \r
224         if (pwtype.equals("BL"))\r
225         {\r
226             buffer.append("BLOSUM62");\r
227         }\r
228         else\r
229         {\r
230             buffer.append("PID");\r
231         }\r
232 \r
233         Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);\r
234 \r
235         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
236         cap.setText(fout.print(false, true));\r
237     }\r
238 \r
239     /**\r
240      * DOCUMENT ME!\r
241      *\r
242      * @param e DOCUMENT ME!\r
243      */\r
244     public void saveAsNewick_actionPerformed(ActionEvent e)\r
245     {\r
246         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
247                     "LAST_DIRECTORY"));\r
248         chooser.setFileView(new JalviewFileView());\r
249         chooser.setDialogTitle("Save tree as newick file");\r
250         chooser.setToolTipText("Save");\r
251 \r
252         int value = chooser.showSaveDialog(null);\r
253 \r
254         if (value == JalviewFileChooser.APPROVE_OPTION)\r
255         {\r
256             String choice = chooser.getSelectedFile().getPath();\r
257             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
258                 chooser.getSelectedFile().getParent());\r
259 \r
260             try\r
261             {\r
262                 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
263                 String output = fout.print(false, true); // distances only\r
264                 java.io.PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(\r
265                             choice));\r
266                 out.println(output);\r
267                 out.close();\r
268             }\r
269             catch (Exception ex)\r
270             {\r
271                 ex.printStackTrace();\r
272             }\r
273         }\r
274     }\r
275 \r
276     /**\r
277      * DOCUMENT ME!\r
278      *\r
279      * @param e DOCUMENT ME!\r
280      */\r
281     public void printMenu_actionPerformed(ActionEvent e)\r
282     {\r
283         //Putting in a thread avoids Swing painting problems\r
284         treeCanvas.startPrinting();\r
285     }\r
286 \r
287     /**\r
288      * DOCUMENT ME!\r
289      *\r
290      * @param e DOCUMENT ME!\r
291      */\r
292     public void fitToWindow_actionPerformed(ActionEvent e)\r
293     {\r
294         treeCanvas.fitToWindow = fitToWindow.isSelected();\r
295         repaint();\r
296     }\r
297 \r
298     /**\r
299      * DOCUMENT ME!\r
300      *\r
301      * @param e DOCUMENT ME!\r
302      */\r
303     public void font_actionPerformed(ActionEvent e)\r
304     {\r
305         if (treeCanvas == null)\r
306         {\r
307             return;\r
308         }\r
309 \r
310         new FontChooser(this);\r
311     }\r
312 \r
313     public Font getTreeFont()\r
314     {\r
315         return treeCanvas.font;\r
316     }\r
317 \r
318     public void setTreeFont(Font font)\r
319     {\r
320       if(treeCanvas!=null)\r
321       treeCanvas.setFont(font);\r
322     }\r
323 \r
324     /**\r
325      * DOCUMENT ME!\r
326      *\r
327      * @param e DOCUMENT ME!\r
328      */\r
329     public void distanceMenu_actionPerformed(ActionEvent e)\r
330     {\r
331         treeCanvas.setShowDistances(distanceMenu.isSelected());\r
332     }\r
333 \r
334     /**\r
335      * DOCUMENT ME!\r
336      *\r
337      * @param e DOCUMENT ME!\r
338      */\r
339     public void bootstrapMenu_actionPerformed(ActionEvent e)\r
340     {\r
341         treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
342     }\r
343 \r
344     /**\r
345      * DOCUMENT ME!\r
346      *\r
347      * @param e DOCUMENT ME!\r
348      */\r
349     public void placeholdersMenu_actionPerformed(ActionEvent e)\r
350     {\r
351         treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
352     }\r
353 \r
354 \r
355     /**\r
356      * DOCUMENT ME!\r
357      *\r
358      * @param e DOCUMENT ME!\r
359      */\r
360     public void epsTree_actionPerformed(ActionEvent e)\r
361     {\r
362       makeTreeImage(jalview.util.ImageMaker.EPS);\r
363     }\r
364 \r
365     /**\r
366      * DOCUMENT ME!\r
367      *\r
368      * @param e DOCUMENT ME!\r
369      */\r
370     public void pngTree_actionPerformed(ActionEvent e)\r
371     {\r
372        makeTreeImage(jalview.util.ImageMaker.PNG);\r
373     }\r
374 \r
375     void makeTreeImage(int type)\r
376     {\r
377       int width = treeCanvas.getWidth();\r
378       int height = treeCanvas.getHeight();\r
379 \r
380       jalview.util.ImageMaker im;\r
381 \r
382       if(type == jalview.util.ImageMaker.PNG)\r
383         im = new jalview.util.ImageMaker(this,\r
384                                          jalview.util.ImageMaker.PNG,\r
385                                          "Make PNG image from tree",\r
386                                          width, height,\r
387                                          null, null);\r
388         else\r
389           im = new jalview.util.ImageMaker(this,\r
390                                  jalview.util.ImageMaker.EPS,\r
391                                  "Make EPS file from tree",\r
392                                  width, height,\r
393                                  null, this.getTitle());\r
394 \r
395       if(im.getGraphics()!=null)\r
396       {\r
397         treeCanvas.draw(im.getGraphics(), width, height);\r
398         im.writeImage();\r
399       }\r
400     }\r
401 \r
402 }\r