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