78bef801cda4eab910621a740031829d16d70773
[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 javax.swing.*;\r
11 import java.awt.*;\r
12 import java.awt.image.*;\r
13 import org.jibble.epsgraphics.*;\r
14 import javax.imageio.*;\r
15 \r
16 \r
17 \r
18 public class TreePanel extends GTreePanel\r
19 {\r
20   SequenceI[] seq;\r
21   String type;\r
22   String pwtype;\r
23   AlignViewport av;\r
24   int start;\r
25   int end;\r
26   TreeCanvas treeCanvas;\r
27   NJTree tree;\r
28 \r
29   public NJTree getTree()\r
30   {\r
31     return tree;\r
32   }\r
33 \r
34   public TreePanel(AlignViewport av, Vector seqVector, String type, String pwtype, int s, int e)\r
35   {\r
36     super();\r
37 \r
38     this.type = type;\r
39     this.pwtype = pwtype;\r
40 \r
41     start = s;\r
42     end = e;\r
43 \r
44     String longestName = "";\r
45     seq = new Sequence [seqVector.size()];\r
46     for (int i=0;i < seqVector.size();i++)\r
47     {\r
48       seq[i] = (Sequence) seqVector.elementAt(i);\r
49       if(seq[i].getName().length()>longestName.length())\r
50         longestName = seq[i].getName();\r
51     }\r
52 \r
53     tree = new NJTree(seq, type, pwtype, start, end);\r
54 \r
55     treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
56     treeCanvas.setShowDistances(true); // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default\r
57     setViewStateFromTreeCanvas(treeCanvas);\r
58     tree.reCount(tree.getTopNode());\r
59     tree.findHeight(tree.getTopNode());\r
60     scrollPane.setViewportView(treeCanvas);\r
61 \r
62   }\r
63   private void setViewStateFromTreeCanvas(TreeCanvas tree) {\r
64     // update view menu state from treeCanvas render state\r
65     distanceMenu.setSelected(tree.showDistances);\r
66     bootstrapMenu.setSelected(tree.showBootstrap);\r
67     placeholdersMenu.setSelected(tree.markPlaceholders);\r
68   }\r
69 \r
70   private void setTreeCanvasFromViewState(TreeCanvas tree) {\r
71       // update view menu state from treeCanvas render state\r
72       tree.showDistances = distanceMenu.isSelected();\r
73       tree.showBootstrap = bootstrapMenu.isSelected();\r
74       tree.markPlaceholders = placeholdersMenu.isSelected();\r
75     }\r
76 \r
77 \r
78   public TreePanel(AlignViewport av, Vector seqVector, NewickFile newtree,\r
79                    String type, String pwtype)\r
80     {\r
81       super();\r
82       // These are probably only  arbitrary strings reflecting source of tree\r
83       this.type = type;\r
84       this.pwtype = pwtype;\r
85 \r
86       start = 0;\r
87       end = seqVector.size();\r
88 \r
89       String longestName = "";\r
90       seq = new Sequence [seqVector.size()];\r
91       for (int i=0;i < seqVector.size();i++)\r
92       {\r
93         seq[i] = (Sequence) seqVector.elementAt(i);\r
94       }\r
95       // This constructor matches sequence names to treenodes and sets up the tree layouts.\r
96       tree = new NJTree(seq, newtree);\r
97       // Now have to calculate longest name based on the leaves\r
98       Vector leaves = tree.findLeaves(tree.getTopNode(),new Vector());\r
99       boolean has_placeholders = false;\r
100       for (int i=0;i < leaves.size();i++) {\r
101         SequenceNode lf = (SequenceNode) leaves.elementAt(i);\r
102         if (lf.isPlaceholder())\r
103           has_placeholders = true;\r
104         if (longestName.length()<((Sequence) lf.element()).getName().length())\r
105           longestName = TreeCanvas.PLACEHOLDER+((Sequence) lf.element()).getName();\r
106       }\r
107       tree.reCount(tree.getTopNode());\r
108       tree.findHeight(tree.getTopNode());\r
109 \r
110       treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
111       treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
112       treeCanvas.setShowDistances(newtree.HasDistances());\r
113       scrollPane.setViewportView(treeCanvas);\r
114       treeCanvas.setMarkPlaceholders(has_placeholders);\r
115       setViewStateFromTreeCanvas(treeCanvas);\r
116       // JBPNote TODO: preference for always marking placeholders in new associated tree\r
117     }\r
118 \r
119 \r
120     public void textbox_actionPerformed(ActionEvent e)\r
121     {\r
122       CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
123       JInternalFrame frame = new JInternalFrame();\r
124       frame.setContentPane(cap);\r
125 \r
126       StringBuffer buffer = new StringBuffer();\r
127 \r
128       if(type.equals("AV"))\r
129         buffer.append("Average distance tree using ");\r
130       else\r
131         buffer.append("Neighbour joining tree using ");\r
132 \r
133       if(pwtype.equals("BL"))\r
134        buffer.append("BLOSUM62");\r
135       else\r
136         buffer.append("PID");\r
137 \r
138       Desktop.addInternalFrame(frame,buffer.toString(), 500, 100);\r
139       jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
140       cap.setText(  fout.print(false,true) );\r
141 \r
142     }\r
143 \r
144 \r
145     public void saveAsNewick_actionPerformed(ActionEvent e)\r
146     {\r
147 \r
148   JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
149         getProperty("LAST_DIRECTORY"));\r
150     chooser.setFileView(new JalviewFileView());\r
151     chooser.setDialogTitle("Save tree as newick file");\r
152     chooser.setToolTipText("Save");\r
153     int value = chooser.showSaveDialog(null);\r
154     if (value == JalviewFileChooser.APPROVE_OPTION) {\r
155       String choice =  chooser.getSelectedFile().getPath();\r
156       jalview.bin.Cache.setProperty("LAST_DIRECTORY",  chooser.getSelectedFile().getParent());\r
157       try{\r
158         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
159         String output = fout.print(false,true); // distances only\r
160         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
161         out.println(output);\r
162         out.close();\r
163       }\r
164       catch (Exception ex) {\r
165         ex.printStackTrace();\r
166       }\r
167     }\r
168   }\r
169 \r
170   protected void printMenu_actionPerformed(ActionEvent e)\r
171   {\r
172 \r
173     //Putting in a thread avoids Swing painting problems\r
174     treeCanvas.startPrinting();\r
175   }\r
176 \r
177   protected void fitToWindow_actionPerformed(ActionEvent e)\r
178   {\r
179     treeCanvas.fitToWindow = fitToWindow.isSelected();\r
180     repaint();\r
181   }\r
182 \r
183 \r
184   protected void fontSize_actionPerformed(ActionEvent e)\r
185   {\r
186     if( treeCanvas==null )\r
187      return;\r
188 \r
189    String size = fontSize.getText().substring( fontSize.getText().indexOf("-")+1);\r
190 \r
191    Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
192                                "Select font size",\r
193                                "Font size",\r
194                                JOptionPane.QUESTION_MESSAGE,\r
195                                null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
196                                ,"Font Size - "+size);\r
197    if(selection!=null)\r
198    {\r
199      fontSize.setText("Font Size - " + selection);\r
200 \r
201      int i = Integer.parseInt(selection.toString());\r
202      treeCanvas.setFontSize(i);\r
203    }\r
204     scrollPane.setViewportView(treeCanvas);\r
205 \r
206   }\r
207 \r
208   protected void distanceMenu_actionPerformed(ActionEvent e)\r
209   {\r
210     treeCanvas.setShowDistances(distanceMenu.isSelected());\r
211   }\r
212 \r
213   protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
214   {\r
215     treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
216   }\r
217 \r
218   protected void placeholdersMenu_actionPerformed(ActionEvent e)\r
219     {\r
220       treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
221   }\r
222 \r
223   protected void epsTree_actionPerformed(ActionEvent e)\r
224   {\r
225     int width = treeCanvas.getWidth(), height=treeCanvas.getHeight();\r
226     try\r
227     {\r
228       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
229           "LAST_DIRECTORY"),\r
230               new String[]{"eps"},\r
231               new String[]{"Encapsulated Postscript"},\r
232               "Encapsulated Postscript");\r
233       chooser.setFileView(new jalview.io.JalviewFileView());\r
234       chooser.setDialogTitle("Create EPS file from tree");\r
235       chooser.setToolTipText("Save");\r
236 \r
237       int value = chooser.showSaveDialog(this);\r
238       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
239         return;\r
240 \r
241       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
242       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
243       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height);\r
244 \r
245 \r
246       treeCanvas.draw(pg, width, height);\r
247 \r
248         pg.flush();\r
249         pg.close();\r
250     }\r
251     catch (Exception ex)\r
252     {\r
253       ex.printStackTrace();\r
254     }\r
255   }\r
256 \r
257   protected void pngTree_actionPerformed(ActionEvent e)\r
258  {\r
259   int width = treeCanvas.getWidth(), height = treeCanvas.getHeight();\r
260     try\r
261     {\r
262       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
263           jalview.bin.Cache.getProperty("LAST_DIRECTORY"),\r
264           new String[] {"png"},\r
265           new String[] {"Portable network graphics"},\r
266           "Portable network graphics");\r
267 \r
268       chooser.setFileView(new jalview.io.JalviewFileView());\r
269       chooser.setDialogTitle("Create PNG image from tree");\r
270       chooser.setToolTipText("Save");\r
271 \r
272       int value = chooser.showSaveDialog(this);\r
273       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
274         return;\r
275 \r
276       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
277       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
278 \r
279       BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\r
280       Graphics png = bi.getGraphics();\r
281 \r
282       treeCanvas.draw(png, width, height);\r
283 \r
284         ImageIO.write(bi, "png", out);\r
285         out.close();\r
286     }\r
287     catch (Exception ex)\r
288     {\r
289       ex.printStackTrace();\r
290     }\r
291   }\r
292 \r
293 }\r