Only 1 NJtree
[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 import org.jibble.epsgraphics.*;\r
30 \r
31 import java.awt.*;\r
32 import java.awt.event.*;\r
33 import java.awt.image.*;\r
34 \r
35 import java.io.*;\r
36 \r
37 import java.util.*;\r
38 \r
39 import javax.imageio.*;\r
40 \r
41 import javax.swing.*;\r
42 import java.beans.PropertyChangeEvent;\r
43 \r
44 \r
45 /**\r
46  * DOCUMENT ME!\r
47  *\r
48  * @author $author$\r
49  * @version $Revision$\r
50  */\r
51 public class TreePanel extends GTreePanel\r
52 {\r
53     SequenceI[] seq;\r
54     String type;\r
55     String pwtype;\r
56     int start;\r
57     int end;\r
58     TreeCanvas treeCanvas;\r
59     NJTree tree;\r
60 \r
61     /**\r
62      * Creates a new TreePanel object.\r
63      *\r
64      * @param av DOCUMENT ME!\r
65      * @param seqVector DOCUMENT ME!\r
66      * @param type DOCUMENT ME!\r
67      * @param pwtype DOCUMENT ME!\r
68      * @param s DOCUMENT ME!\r
69      * @param e DOCUMENT ME!\r
70      */\r
71     public TreePanel(AlignViewport av, Vector seqVector, String type,\r
72                      String pwtype, int s, int e)\r
73     {\r
74       super();\r
75       initTreePanel(av, seqVector, type, pwtype, s, e, null);\r
76 \r
77       // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default\r
78       treeCanvas.setShowDistances(true);\r
79     }\r
80 \r
81     /**\r
82      * Creates a new TreePanel object.\r
83      *\r
84      * @param av DOCUMENT ME!\r
85      * @param seqVector DOCUMENT ME!\r
86      * @param newtree DOCUMENT ME!\r
87      * @param type DOCUMENT ME!\r
88      * @param pwtype DOCUMENT ME!\r
89      */\r
90     public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
91                      String type, String pwtype)\r
92     {\r
93       super();\r
94       initTreePanel(av, seqVector, type, pwtype, 0, seqVector.size(), newtree);\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       }\r
147 \r
148       public void run()\r
149       {\r
150         if(newtree!=null)\r
151           tree = new NJTree(seq, newtree);\r
152         else\r
153           tree = new NJTree(seq, type, pwtype, start, end);\r
154 \r
155         tree.reCount(tree.getTopNode());\r
156         tree.findHeight(tree.getTopNode());\r
157         treeCanvas.setTree(tree);\r
158         if(newtree!=null)\r
159         {\r
160           treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
161           treeCanvas.setShowDistances(newtree.HasDistances());\r
162         }\r
163 \r
164         setViewStateFromTreeCanvas(treeCanvas);\r
165 \r
166         treeCanvas.repaint();\r
167 \r
168       }\r
169     }\r
170 \r
171 \r
172     /**\r
173      * DOCUMENT ME!\r
174      *\r
175      * @return DOCUMENT ME!\r
176      */\r
177     public NJTree getTree()\r
178     {\r
179         return tree;\r
180     }\r
181 \r
182     /**\r
183      * DOCUMENT ME!\r
184      *\r
185      * @param tree DOCUMENT ME!\r
186      */\r
187     private void setViewStateFromTreeCanvas(TreeCanvas tree)\r
188     {\r
189         // update view menu state from treeCanvas render state\r
190         distanceMenu.setSelected(tree.showDistances);\r
191         bootstrapMenu.setSelected(tree.showBootstrap);\r
192         placeholdersMenu.setSelected(tree.markPlaceholders);\r
193     }\r
194 \r
195     /**\r
196      * DOCUMENT ME!\r
197      *\r
198      * @param tree DOCUMENT ME!\r
199      */\r
200     private void setTreeCanvasFromViewState(TreeCanvas tree)\r
201     {\r
202         // update view menu state from treeCanvas render state\r
203         tree.showDistances = distanceMenu.isSelected();\r
204         tree.showBootstrap = bootstrapMenu.isSelected();\r
205         tree.markPlaceholders = placeholdersMenu.isSelected();\r
206     }\r
207 \r
208     /**\r
209      * DOCUMENT ME!\r
210      *\r
211      * @param e DOCUMENT ME!\r
212      */\r
213     public void textbox_actionPerformed(ActionEvent e)\r
214     {\r
215         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
216 \r
217         StringBuffer buffer = new StringBuffer();\r
218 \r
219         if (type.equals("AV"))\r
220         {\r
221             buffer.append("Average distance tree using ");\r
222         }\r
223         else\r
224         {\r
225             buffer.append("Neighbour joining tree using ");\r
226         }\r
227 \r
228         if (pwtype.equals("BL"))\r
229         {\r
230             buffer.append("BLOSUM62");\r
231         }\r
232         else\r
233         {\r
234             buffer.append("PID");\r
235         }\r
236 \r
237         Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);\r
238 \r
239         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
240         cap.setText(fout.print(false, true));\r
241     }\r
242 \r
243     /**\r
244      * DOCUMENT ME!\r
245      *\r
246      * @param e DOCUMENT ME!\r
247      */\r
248     public void saveAsNewick_actionPerformed(ActionEvent e)\r
249     {\r
250         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
251                     "LAST_DIRECTORY"));\r
252         chooser.setFileView(new JalviewFileView());\r
253         chooser.setDialogTitle("Save tree as newick file");\r
254         chooser.setToolTipText("Save");\r
255 \r
256         int value = chooser.showSaveDialog(null);\r
257 \r
258         if (value == JalviewFileChooser.APPROVE_OPTION)\r
259         {\r
260             String choice = chooser.getSelectedFile().getPath();\r
261             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
262                 chooser.getSelectedFile().getParent());\r
263 \r
264             try\r
265             {\r
266                 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
267                 String output = fout.print(false, true); // distances only\r
268                 java.io.PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(\r
269                             choice));\r
270                 out.println(output);\r
271                 out.close();\r
272             }\r
273             catch (Exception ex)\r
274             {\r
275                 ex.printStackTrace();\r
276             }\r
277         }\r
278     }\r
279 \r
280     /**\r
281      * DOCUMENT ME!\r
282      *\r
283      * @param e DOCUMENT ME!\r
284      */\r
285     public void printMenu_actionPerformed(ActionEvent e)\r
286     {\r
287         //Putting in a thread avoids Swing painting problems\r
288         treeCanvas.startPrinting();\r
289     }\r
290 \r
291     /**\r
292      * DOCUMENT ME!\r
293      *\r
294      * @param e DOCUMENT ME!\r
295      */\r
296     public void fitToWindow_actionPerformed(ActionEvent e)\r
297     {\r
298         treeCanvas.fitToWindow = fitToWindow.isSelected();\r
299         repaint();\r
300     }\r
301 \r
302     /**\r
303      * DOCUMENT ME!\r
304      *\r
305      * @param e DOCUMENT ME!\r
306      */\r
307     public void fontSize_actionPerformed(ActionEvent e)\r
308     {\r
309         if (treeCanvas == null)\r
310         {\r
311             return;\r
312         }\r
313 \r
314         String size = fontSize.getText().substring(fontSize.getText().indexOf("-") +\r
315                 1);\r
316 \r
317         Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
318                 "Select font size", "Font size", JOptionPane.QUESTION_MESSAGE,\r
319                 null,\r
320                 new String[]\r
321                 {\r
322                     "1", "2", "4", "6", "8", "10", "12", "14", "16", "18", "20"\r
323                 }, "Font Size - " + size);\r
324 \r
325         if (selection != null)\r
326         {\r
327             fontSize.setText("Font Size - " + selection);\r
328 \r
329             int i = Integer.parseInt(selection.toString());\r
330             treeCanvas.setFontSize(i);\r
331         }\r
332 \r
333         scrollPane.setViewportView(treeCanvas);\r
334     }\r
335 \r
336     /**\r
337      * DOCUMENT ME!\r
338      *\r
339      * @param e DOCUMENT ME!\r
340      */\r
341     public void distanceMenu_actionPerformed(ActionEvent e)\r
342     {\r
343         treeCanvas.setShowDistances(distanceMenu.isSelected());\r
344     }\r
345 \r
346     /**\r
347      * DOCUMENT ME!\r
348      *\r
349      * @param e DOCUMENT ME!\r
350      */\r
351     public void bootstrapMenu_actionPerformed(ActionEvent e)\r
352     {\r
353         treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
354     }\r
355 \r
356     /**\r
357      * DOCUMENT ME!\r
358      *\r
359      * @param e DOCUMENT ME!\r
360      */\r
361     public void placeholdersMenu_actionPerformed(ActionEvent e)\r
362     {\r
363         treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
364     }\r
365 \r
366     /**\r
367      * DOCUMENT ME!\r
368      *\r
369      * @param e DOCUMENT ME!\r
370      */\r
371     public void epsTree_actionPerformed(ActionEvent e)\r
372     {\r
373         int width = treeCanvas.getWidth();\r
374         int height = treeCanvas.getHeight();\r
375 \r
376         try\r
377         {\r
378             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
379                         "LAST_DIRECTORY"), new String[] { "eps" },\r
380                     new String[] { "Encapsulated Postscript" },\r
381                     "Encapsulated Postscript");\r
382             chooser.setFileView(new jalview.io.JalviewFileView());\r
383             chooser.setDialogTitle("Create EPS file from tree");\r
384             chooser.setToolTipText("Save");\r
385 \r
386             int value = chooser.showSaveDialog(this);\r
387 \r
388             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
389             {\r
390                 return;\r
391             }\r
392 \r
393             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
394                 chooser.getSelectedFile().getParent());\r
395 \r
396             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
397             EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,\r
398                     height);\r
399 \r
400             treeCanvas.draw(pg, width, height);\r
401 \r
402             pg.flush();\r
403             pg.close();\r
404         }\r
405         catch (Exception ex)\r
406         {\r
407             ex.printStackTrace();\r
408         }\r
409     }\r
410 \r
411     /**\r
412      * DOCUMENT ME!\r
413      *\r
414      * @param e DOCUMENT ME!\r
415      */\r
416     public void pngTree_actionPerformed(ActionEvent e)\r
417     {\r
418         int width = treeCanvas.getWidth();\r
419         int height = treeCanvas.getHeight();\r
420 \r
421         try\r
422         {\r
423             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
424                         "LAST_DIRECTORY"), new String[] { "png" },\r
425                     new String[] { "Portable network graphics" },\r
426                     "Portable network graphics");\r
427 \r
428             chooser.setFileView(new jalview.io.JalviewFileView());\r
429             chooser.setDialogTitle("Create PNG image from tree");\r
430             chooser.setToolTipText("Save");\r
431 \r
432             int value = chooser.showSaveDialog(this);\r
433 \r
434             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
435             {\r
436                 return;\r
437             }\r
438 \r
439             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
440                 chooser.getSelectedFile().getParent());\r
441 \r
442             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
443 \r
444             BufferedImage bi = new BufferedImage(width, height,\r
445                     BufferedImage.TYPE_INT_RGB);\r
446             Graphics png = bi.getGraphics();\r
447 \r
448             treeCanvas.draw(png, width, height);\r
449 \r
450             ImageIO.write(bi, "png", out);\r
451             out.close();\r
452         }\r
453         catch (Exception ex)\r
454         {\r
455             ex.printStackTrace();\r
456         }\r
457     }\r
458 }\r