use fontchooser to change fonts
[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 font_actionPerformed(ActionEvent e)\r
308     {\r
309         if (treeCanvas == null)\r
310         {\r
311             return;\r
312         }\r
313 \r
314         FontChooser fontchooser = new FontChooser(this);\r
315     }\r
316 \r
317     public Font getFont()\r
318     {\r
319       return treeCanvas.font;\r
320     }\r
321 \r
322     public void setFont(Font font)\r
323     {\r
324       if(treeCanvas!=null)\r
325       treeCanvas.setFont(font);\r
326     }\r
327 \r
328     /**\r
329      * DOCUMENT ME!\r
330      *\r
331      * @param e DOCUMENT ME!\r
332      */\r
333     public void distanceMenu_actionPerformed(ActionEvent e)\r
334     {\r
335         treeCanvas.setShowDistances(distanceMenu.isSelected());\r
336     }\r
337 \r
338     /**\r
339      * DOCUMENT ME!\r
340      *\r
341      * @param e DOCUMENT ME!\r
342      */\r
343     public void bootstrapMenu_actionPerformed(ActionEvent e)\r
344     {\r
345         treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
346     }\r
347 \r
348     /**\r
349      * DOCUMENT ME!\r
350      *\r
351      * @param e DOCUMENT ME!\r
352      */\r
353     public void placeholdersMenu_actionPerformed(ActionEvent e)\r
354     {\r
355         treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
356     }\r
357 \r
358     /**\r
359      * DOCUMENT ME!\r
360      *\r
361      * @param e DOCUMENT ME!\r
362      */\r
363     public void epsTree_actionPerformed(ActionEvent e)\r
364     {\r
365       boolean accurateText = true;\r
366 \r
367       String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",\r
368           "Prompt each time");\r
369 \r
370     // If we need to prompt, and if the GUI is visible then\r
371     // Prompt for EPS rendering style\r
372       if (renderStyle.equalsIgnoreCase("Prompt each time")\r
373           && !\r
374           (System.getProperty("java.awt.headless") != null\r
375            && System.getProperty("java.awt.headless").equals("true")))\r
376       {\r
377         EPSOptions eps = new EPSOptions();\r
378         renderStyle = eps.getValue();\r
379 \r
380         if (renderStyle==null || eps.cancelled)\r
381           return;\r
382 \r
383 \r
384       }\r
385 \r
386       if (renderStyle.equalsIgnoreCase("text"))\r
387       {\r
388         accurateText = false;\r
389       }\r
390 \r
391         int width = treeCanvas.getWidth();\r
392         int height = treeCanvas.getHeight();\r
393 \r
394         try\r
395         {\r
396             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
397                         "LAST_DIRECTORY"), new String[] { "eps" },\r
398                     new String[] { "Encapsulated Postscript" },\r
399                     "Encapsulated Postscript");\r
400             chooser.setFileView(new jalview.io.JalviewFileView());\r
401             chooser.setDialogTitle("Create EPS file from tree");\r
402             chooser.setToolTipText("Save");\r
403 \r
404             int value = chooser.showSaveDialog(this);\r
405 \r
406             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
407             {\r
408                 return;\r
409             }\r
410 \r
411             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
412                                           chooser.getSelectedFile().getParent());\r
413 \r
414             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
415             EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,\r
416                                                  height);\r
417 \r
418             pg.setAccurateTextMode(accurateText);\r
419 \r
420             treeCanvas.draw(pg, width, height);\r
421 \r
422             pg.flush();\r
423             pg.close();\r
424         }\r
425         catch (Exception ex)\r
426         {\r
427             ex.printStackTrace();\r
428         }\r
429     }\r
430 \r
431     /**\r
432      * DOCUMENT ME!\r
433      *\r
434      * @param e DOCUMENT ME!\r
435      */\r
436     public void pngTree_actionPerformed(ActionEvent e)\r
437     {\r
438         int width = treeCanvas.getWidth();\r
439         int height = treeCanvas.getHeight();\r
440 \r
441         try\r
442         {\r
443             jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
444                         "LAST_DIRECTORY"), new String[] { "png" },\r
445                     new String[] { "Portable network graphics" },\r
446                     "Portable network graphics");\r
447 \r
448             chooser.setFileView(new jalview.io.JalviewFileView());\r
449             chooser.setDialogTitle("Create PNG image from tree");\r
450             chooser.setToolTipText("Save");\r
451 \r
452             int value = chooser.showSaveDialog(this);\r
453 \r
454             if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
455             {\r
456                 return;\r
457             }\r
458 \r
459             jalview.bin.Cache.setProperty("LAST_DIRECTORY",\r
460                 chooser.getSelectedFile().getParent());\r
461 \r
462             FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
463 \r
464             BufferedImage bi = new BufferedImage(width, height,\r
465                     BufferedImage.TYPE_INT_RGB);\r
466             Graphics png = bi.getGraphics();\r
467 \r
468             treeCanvas.draw(png, width, height);\r
469 \r
470             ImageIO.write(bi, "png", out);\r
471             out.close();\r
472         }\r
473         catch (Exception ex)\r
474         {\r
475             ex.printStackTrace();\r
476         }\r
477     }\r
478 }\r