e58615ecf0c8bef65fa76ea09ac2b4cfd4fd89c2
[jalview.git] / src / jalview / gui / TreePanel.java
1 package jalview.gui;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.analysis.*;\r
5 import jalview.jbgui.GTreePanel;\r
6 import jalview.io.*;\r
7 import java.awt.event.*;\r
8 import java.util.*;\r
9 import java.io.*;\r
10 import jalview.util.*;\r
11 import javax.swing.*;\r
12 import java.awt.print.*;\r
13 import java.awt.*;\r
14 import java.awt.image.*;\r
15 import org.jibble.epsgraphics.*;\r
16 import javax.imageio.*;\r
17 \r
18 \r
19 \r
20 \r
21 public class TreePanel extends GTreePanel\r
22 {\r
23   SequenceI[] seq;\r
24   String type;\r
25   String pwtype;\r
26   AlignViewport av;\r
27   int start;\r
28   int end;\r
29   TreeCanvas treeCanvas;\r
30   NJTree tree;\r
31 \r
32 \r
33   public TreePanel(AlignViewport av, Vector seqVector, String type, String pwtype, int s, int e)\r
34   {\r
35     super();\r
36 \r
37     this.type = type;\r
38     this.pwtype = pwtype;\r
39 \r
40     start = s;\r
41     end = e;\r
42 \r
43     String longestName = "";\r
44     seq = new Sequence [seqVector.size()];\r
45     for (int i=0;i < seqVector.size();i++)\r
46     {\r
47       seq[i] = (Sequence) seqVector.elementAt(i);\r
48       if(seq[i].getName().length()>longestName.length())\r
49         longestName = seq[i].getName();\r
50     }\r
51 \r
52     tree = new NJTree(seq, type, pwtype, start, end);\r
53     av.setCurrentTree(tree);\r
54 \r
55     treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
56 \r
57     tree.reCount(tree.getTopNode());\r
58     tree.findHeight(tree.getTopNode());\r
59     scrollPane.setViewportView(treeCanvas);\r
60 \r
61   }\r
62   public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
63                    String type, String pwtype)\r
64     {\r
65       super();\r
66       // These are probably only  arbitrary strings reflecting source of tree\r
67       this.type = type;\r
68       this.pwtype = pwtype;\r
69 \r
70       start = 0;\r
71       end = seqVector.size();\r
72 \r
73       String longestName = "";\r
74       seq = new Sequence [seqVector.size()];\r
75       for (int i=0;i < seqVector.size();i++)\r
76       {\r
77         seq[i] = (Sequence) seqVector.elementAt(i);\r
78         if(seq[i].getName().length()>longestName.length())\r
79           longestName = seq[i].getName();\r
80       }\r
81       // This constructor matches sequence names to treenodes and sets up the tree layouts.\r
82       tree = new NJTree(seq, newtree);\r
83       av.setCurrentTree(tree);\r
84 \r
85 \r
86       tree.reCount(tree.getTopNode());\r
87       tree.findHeight(tree.getTopNode());\r
88 \r
89       treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
90       scrollPane.setViewportView(treeCanvas);\r
91 \r
92     }\r
93 \r
94 \r
95 \r
96 public String getText(String format) {\r
97   return null;\r
98 }\r
99 \r
100 \r
101   protected void saveMenu_actionPerformed(ActionEvent e)\r
102   {\r
103     JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
104         getProperty("LAST_DIRECTORY"));\r
105     chooser.setFileView(new JalviewFileView());\r
106     chooser.setDialogTitle("Save tree as newick file");\r
107     chooser.setToolTipText("Save");\r
108     int value = chooser.showSaveDialog(null);\r
109     if (value == JalviewFileChooser.APPROVE_OPTION) {\r
110       String choice =  chooser.getSelectedFile().getPath();\r
111       jalview.bin.Cache.setProperty("LAST_DIRECTORY",  choice);\r
112       try{\r
113         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
114         String output = fout.print(false,true); // distances only\r
115         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
116         out.println(output);\r
117         out.close();\r
118       }\r
119       catch (Exception ex) {\r
120         ex.printStackTrace();\r
121       }\r
122     }\r
123   }\r
124 \r
125   protected void printMenu_actionPerformed(ActionEvent e)\r
126   {\r
127 \r
128     //Putting in a thread avoids Swing painting problems\r
129     treeCanvas.startPrinting();\r
130   }\r
131 \r
132   protected void fitToWindow_actionPerformed(ActionEvent e)\r
133   {\r
134     treeCanvas.fitToWindow = fitToWindow.isSelected();\r
135     repaint();\r
136   }\r
137 \r
138 \r
139   protected void fontSize_actionPerformed(ActionEvent e)\r
140   {\r
141     if( treeCanvas==null )\r
142      return;\r
143 \r
144    String size = fontSize.getText().substring( fontSize.getText().indexOf("-")+1);\r
145 \r
146    Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
147                                "Select font size",\r
148                                "Font size",\r
149                                JOptionPane.QUESTION_MESSAGE,\r
150                                null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
151                                ,"Font Size - "+size);\r
152    if(selection!=null)\r
153    {\r
154      fontSize.setText("Font Size - " + selection);\r
155 \r
156      int i = Integer.parseInt(selection.toString());\r
157      treeCanvas.setFontSize(i);\r
158    }\r
159     scrollPane.setViewportView(treeCanvas);\r
160 \r
161   }\r
162 \r
163   protected void distanceMenu_actionPerformed(ActionEvent e)\r
164   {\r
165     treeCanvas.setShowDistances(distanceMenu.isSelected());\r
166   }\r
167 \r
168   protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
169   {\r
170     treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
171   }\r
172 \r
173 \r
174   protected void epsTree_actionPerformed(ActionEvent e)\r
175   {\r
176     int width = treeCanvas.getWidth(), height=treeCanvas.getHeight();\r
177     try\r
178     {\r
179       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
180           "LAST_DIRECTORY"), new String[]{"eps"}, "Encapsulated Postscript");\r
181       chooser.setFileView(new jalview.io.JalviewFileView());\r
182       chooser.setDialogTitle("Create EPS file from tree");\r
183       chooser.setToolTipText("Save");\r
184 \r
185       int value = chooser.showSaveDialog(this);\r
186       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
187         return;\r
188 \r
189       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getPath());\r
190       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
191       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height);\r
192 \r
193 \r
194       treeCanvas.draw(pg, width, height);\r
195 \r
196         pg.flush();\r
197         pg.close();\r
198     }\r
199     catch (Exception ex)\r
200     {\r
201       ex.printStackTrace();\r
202     }\r
203   }\r
204 \r
205   protected void pngTree_actionPerformed(ActionEvent e)\r
206  {\r
207   int width = treeCanvas.getWidth(), height = treeCanvas.getHeight();\r
208     try\r
209     {\r
210       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
211           "LAST_DIRECTORY"), new String[]{"png"}, "Portable network graphics");\r
212       chooser.setFileView(new jalview.io.JalviewFileView());\r
213       chooser.setDialogTitle("Create PNG image from tree");\r
214       chooser.setToolTipText("Save");\r
215 \r
216       int value = chooser.showSaveDialog(this);\r
217       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
218         return;\r
219 \r
220       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getPath());\r
221       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
222 \r
223       BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\r
224       Graphics png = bi.getGraphics();\r
225 \r
226       treeCanvas.draw(png, width, height);\r
227 \r
228         ImageIO.write(bi, "png", out);\r
229         out.close();\r
230     }\r
231     catch (Exception ex)\r
232     {\r
233       ex.printStackTrace();\r
234     }\r
235   }\r
236 \r
237 }\r