getalignment method added
[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 java.beans.PropertyChangeEvent;\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       showDistances(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     public AlignmentI getAlignment()\r
97     {\r
98       return treeCanvas.av.getAlignment();\r
99     }\r
100 \r
101 \r
102     void initTreePanel(AlignViewport av, Vector seqVector, String type,\r
103                        String pwtype, int s, int e, NewickFile newTree)\r
104     {\r
105 \r
106       this.type = type;\r
107       this.pwtype = pwtype;\r
108 \r
109       start = s;\r
110       end = e;\r
111 \r
112       seq = new Sequence[seqVector.size()];\r
113       seqVector.toArray(seq);\r
114 \r
115 \r
116       treeCanvas = new TreeCanvas(av, scrollPane);\r
117       scrollPane.setViewportView(treeCanvas);\r
118 \r
119       av.addPropertyChangeListener(new java.beans.PropertyChangeListener()\r
120       {\r
121         public void propertyChange(PropertyChangeEvent evt)\r
122         {\r
123           if (evt.getPropertyName().equals("alignment"))\r
124           {\r
125             if(tree==null)\r
126               System.out.println("tree is null");\r
127             if(evt.getNewValue()==null)\r
128               System.out.println("new value is null");\r
129 \r
130             tree.UpdatePlaceHolders( (Vector) evt.getNewValue());\r
131 \r
132             repaint();\r
133           }\r
134         }\r
135       });\r
136 \r
137 \r
138       TreeLoader tl = new TreeLoader(newTree);\r
139       tl.start();\r
140 \r
141     }\r
142 \r
143     class TreeLoader extends Thread\r
144     {\r
145       NewickFile newtree;\r
146 \r
147       public TreeLoader(NewickFile newtree)\r
148       {\r
149         this.newtree = newtree;\r
150         if (newtree != null)\r
151         {\r
152           // Must be outside run(), as Jalview2XML tries to\r
153           // update distance/bootstrap visibility at the same time\r
154           showBootstrap(newtree.HasBootstrap());\r
155           showDistances(newtree.HasDistances());\r
156         }\r
157       }\r
158 \r
159       public void run()\r
160       {\r
161         if(newtree!=null)\r
162           tree = new NJTree(seq, newtree);\r
163         else\r
164           tree = new NJTree(seq, type, pwtype, start, end);\r
165 \r
166         tree.reCount(tree.getTopNode());\r
167         tree.findHeight(tree.getTopNode());\r
168         treeCanvas.setTree(tree);\r
169 \r
170         treeCanvas.repaint();\r
171 \r
172       }\r
173     }\r
174 \r
175     public void showDistances(boolean b)\r
176     {\r
177       treeCanvas.setShowDistances(b);\r
178       distanceMenu.setSelected(b);\r
179     }\r
180 \r
181     public void showBootstrap(boolean b)\r
182     {\r
183       treeCanvas.setShowBootstrap(b);\r
184       bootstrapMenu.setSelected(b);\r
185     }\r
186 \r
187     public void showPlaceholders(boolean b)\r
188     {\r
189       placeholdersMenu.setState(b);\r
190       treeCanvas.setMarkPlaceholders(b);\r
191     }\r
192 \r
193 \r
194 \r
195 \r
196     /**\r
197      * DOCUMENT ME!\r
198      *\r
199      * @return DOCUMENT ME!\r
200      */\r
201     public NJTree getTree()\r
202     {\r
203         return tree;\r
204     }\r
205 \r
206 \r
207     /**\r
208      * DOCUMENT ME!\r
209      *\r
210      * @param e DOCUMENT ME!\r
211      */\r
212     public void textbox_actionPerformed(ActionEvent e)\r
213     {\r
214         CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
215 \r
216         StringBuffer buffer = new StringBuffer();\r
217 \r
218         if (type.equals("AV"))\r
219         {\r
220             buffer.append("Average distance tree using ");\r
221         }\r
222         else\r
223         {\r
224             buffer.append("Neighbour joining tree using ");\r
225         }\r
226 \r
227         if (pwtype.equals("BL"))\r
228         {\r
229             buffer.append("BLOSUM62");\r
230         }\r
231         else\r
232         {\r
233             buffer.append("PID");\r
234         }\r
235 \r
236         Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);\r
237 \r
238         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
239         cap.setText(fout.print(false, true));\r
240     }\r
241 \r
242     /**\r
243      * DOCUMENT ME!\r
244      *\r
245      * @param e DOCUMENT ME!\r
246      */\r
247     public void saveAsNewick_actionPerformed(ActionEvent e)\r
248     {\r
249         JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(\r
250                     "LAST_DIRECTORY"));\r
251         chooser.setFileView(new JalviewFileView());\r
252         chooser.setDialogTitle("Save tree as newick file");\r
253         chooser.setToolTipText("Save");\r
254 \r
255         int value = chooser.showSaveDialog(null);\r
256 \r
257         if (value == JalviewFileChooser.APPROVE_OPTION)\r
258         {\r
259             String choice = chooser.getSelectedFile().getPath();\r
260             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
261                 chooser.getSelectedFile().getParent());\r
262 \r
263             try\r
264             {\r
265                 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
266                 String output = fout.print(false, true); // distances only\r
267                 java.io.PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(\r
268                             choice));\r
269                 out.println(output);\r
270                 out.close();\r
271             }\r
272             catch (Exception ex)\r
273             {\r
274                 ex.printStackTrace();\r
275             }\r
276         }\r
277     }\r
278 \r
279     /**\r
280      * DOCUMENT ME!\r
281      *\r
282      * @param e DOCUMENT ME!\r
283      */\r
284     public void printMenu_actionPerformed(ActionEvent e)\r
285     {\r
286         //Putting in a thread avoids Swing painting problems\r
287         treeCanvas.startPrinting();\r
288     }\r
289 \r
290     /**\r
291      * DOCUMENT ME!\r
292      *\r
293      * @param e DOCUMENT ME!\r
294      */\r
295     public void fitToWindow_actionPerformed(ActionEvent e)\r
296     {\r
297         treeCanvas.fitToWindow = fitToWindow.isSelected();\r
298         repaint();\r
299     }\r
300 \r
301     /**\r
302      * DOCUMENT ME!\r
303      *\r
304      * @param e DOCUMENT ME!\r
305      */\r
306     public void font_actionPerformed(ActionEvent e)\r
307     {\r
308         if (treeCanvas == null)\r
309         {\r
310             return;\r
311         }\r
312 \r
313         new FontChooser(this);\r
314     }\r
315 \r
316     public Font getTreeFont()\r
317     {\r
318         return treeCanvas.font;\r
319     }\r
320 \r
321     public void setTreeFont(Font font)\r
322     {\r
323       if(treeCanvas!=null)\r
324       treeCanvas.setFont(font);\r
325     }\r
326 \r
327     /**\r
328      * DOCUMENT ME!\r
329      *\r
330      * @param e DOCUMENT ME!\r
331      */\r
332     public void distanceMenu_actionPerformed(ActionEvent e)\r
333     {\r
334         treeCanvas.setShowDistances(distanceMenu.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 bootstrapMenu_actionPerformed(ActionEvent e)\r
343     {\r
344         treeCanvas.setShowBootstrap(bootstrapMenu.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 placeholdersMenu_actionPerformed(ActionEvent e)\r
353     {\r
354         treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
355     }\r
356 \r
357     /**\r
358      * DOCUMENT ME!\r
359      *\r
360      * @param e DOCUMENT ME!\r
361      */\r
362     public void epsTree_actionPerformed(ActionEvent e)\r
363     {\r
364       boolean accurateText = true;\r
365 \r
366       String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",\r
367           "Prompt each time");\r
368 \r
369     // If we need to prompt, and if the GUI is visible then\r
370     // Prompt for EPS rendering style\r
371       if (renderStyle.equalsIgnoreCase("Prompt each time")\r
372           && !\r
373           (System.getProperty("java.awt.headless") != null\r
374            && System.getProperty("java.awt.headless").equals("true")))\r
375       {\r
376         EPSOptions eps = new EPSOptions();\r
377         renderStyle = eps.getValue();\r
378 \r
379         if (renderStyle==null || eps.cancelled)\r
380           return;\r
381 \r
382 \r
383       }\r
384 \r
385       if (renderStyle.equalsIgnoreCase("text"))\r
386       {\r
387         accurateText = false;\r
388       }\r
389 \r
390         int width = treeCanvas.getWidth();\r
391         int height = treeCanvas.getHeight();\r
392 \r
393         try\r
394         {\r
395             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
396                         "LAST_DIRECTORY"), new String[] { "eps" },\r
397                     new String[] { "Encapsulated Postscript" },\r
398                     "Encapsulated Postscript");\r
399             chooser.setFileView(new jalview.io.JalviewFileView());\r
400             chooser.setDialogTitle("Create EPS file from tree");\r
401             chooser.setToolTipText("Save");\r
402 \r
403             int value = chooser.showSaveDialog(this);\r
404 \r
405             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
406             {\r
407                 return;\r
408             }\r
409 \r
410             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
411                                           chooser.getSelectedFile().getParent());\r
412 \r
413             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
414             EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,\r
415                                                  height);\r
416 \r
417             pg.setAccurateTextMode(accurateText);\r
418 \r
419             treeCanvas.draw(pg, width, height);\r
420 \r
421             pg.flush();\r
422             pg.close();\r
423         }\r
424         catch (Exception ex)\r
425         {\r
426             ex.printStackTrace();\r
427         }\r
428     }\r
429 \r
430     /**\r
431      * DOCUMENT ME!\r
432      *\r
433      * @param e DOCUMENT ME!\r
434      */\r
435     public void pngTree_actionPerformed(ActionEvent e)\r
436     {\r
437         int width = treeCanvas.getWidth();\r
438         int height = treeCanvas.getHeight();\r
439 \r
440         try\r
441         {\r
442             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
443                         "LAST_DIRECTORY"), new String[] { "png" },\r
444                     new String[] { "Portable network graphics" },\r
445                     "Portable network graphics");\r
446 \r
447             chooser.setFileView(new jalview.io.JalviewFileView());\r
448             chooser.setDialogTitle("Create PNG image from tree");\r
449             chooser.setToolTipText("Save");\r
450 \r
451             int value = chooser.showSaveDialog(this);\r
452 \r
453             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
454             {\r
455                 return;\r
456             }\r
457 \r
458             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
459                 chooser.getSelectedFile().getParent());\r
460 \r
461             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
462 \r
463             BufferedImage bi = new BufferedImage(width, height,\r
464                     BufferedImage.TYPE_INT_RGB);\r
465             Graphics png = bi.getGraphics();\r
466 \r
467             treeCanvas.draw(png, width, height);\r
468 \r
469             ImageIO.write(bi, "png", out);\r
470             out.close();\r
471         }\r
472         catch (Exception ex)\r
473         {\r
474             ex.printStackTrace();\r
475         }\r
476     }\r
477 }\r