047c1d4cc749ca1bd2fafe27f12c3a4f0e599d30
[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 \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       }\r
79       // This constructor matches sequence names to treenodes and sets up the tree layouts.\r
80       tree = new NJTree(seq, newtree);\r
81       // Now have to calculate longest name based on the leaves\r
82       Vector leaves = tree.findLeaves(tree.getTopNode(),new Vector());\r
83 \r
84       for (int i=0;i < leaves.size();i++)\r
85         if (longestName.length()<((Sequence) ((SequenceNode) leaves.elementAt(i)).element()).getName().length())\r
86           longestName = TreeCanvas.PLACEHOLDER+((Sequence) ((SequenceNode) leaves.elementAt(i)).element()).getName();\r
87 \r
88       tree.reCount(tree.getTopNode());\r
89       tree.findHeight(tree.getTopNode());\r
90 \r
91       treeCanvas = new TreeCanvas(av, tree, scrollPane, longestName);\r
92       treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
93       treeCanvas.setShowDistances(newtree.HasDistances());\r
94       scrollPane.setViewportView(treeCanvas);\r
95       distanceMenu.setSelected(newtree.HasDistances());\r
96       bootstrapMenu.setSelected(newtree.HasBootstrap());\r
97       if (true) // JBPNote TODO: preference for always marking placeholders in new associated tree\r
98         placeholdersMenu.setSelected(treeCanvas.markPlaceholders);\r
99 \r
100     }\r
101 \r
102 \r
103     public void textbox_actionPerformed(ActionEvent e)\r
104     {\r
105       CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
106       JInternalFrame frame = new JInternalFrame();\r
107       frame.setContentPane(cap);\r
108 \r
109       StringBuffer buffer = new StringBuffer();\r
110 \r
111       if(type.equals("AV"))\r
112         buffer.append("Average distance tree using ");\r
113       else\r
114         buffer.append("Neighbour joining tree using ");\r
115 \r
116       if(pwtype.equals("BL"))\r
117        buffer.append("BLOSUM62");\r
118       else\r
119         buffer.append("PID");\r
120 \r
121       Desktop.addInternalFrame(frame,buffer.toString(), 500, 100);\r
122       jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
123       cap.setText(  fout.print(false,true) );\r
124 \r
125     }\r
126 \r
127 \r
128     public void saveAsNewick_actionPerformed(ActionEvent e)\r
129     {\r
130 \r
131   JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
132         getProperty("LAST_DIRECTORY"));\r
133     chooser.setFileView(new JalviewFileView());\r
134     chooser.setDialogTitle("Save tree as newick file");\r
135     chooser.setToolTipText("Save");\r
136     int value = chooser.showSaveDialog(null);\r
137     if (value == JalviewFileChooser.APPROVE_OPTION) {\r
138       String choice =  chooser.getSelectedFile().getPath();\r
139       jalview.bin.Cache.setProperty("LAST_DIRECTORY",  chooser.getSelectedFile().getParent());\r
140       try{\r
141         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
142         String output = fout.print(false,true); // distances only\r
143         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
144         out.println(output);\r
145         out.close();\r
146       }\r
147       catch (Exception ex) {\r
148         ex.printStackTrace();\r
149       }\r
150     }\r
151   }\r
152 \r
153   protected void printMenu_actionPerformed(ActionEvent e)\r
154   {\r
155 \r
156     //Putting in a thread avoids Swing painting problems\r
157     treeCanvas.startPrinting();\r
158   }\r
159 \r
160   protected void fitToWindow_actionPerformed(ActionEvent e)\r
161   {\r
162     treeCanvas.fitToWindow = fitToWindow.isSelected();\r
163     repaint();\r
164   }\r
165 \r
166 \r
167   protected void fontSize_actionPerformed(ActionEvent e)\r
168   {\r
169     if( treeCanvas==null )\r
170      return;\r
171 \r
172    String size = fontSize.getText().substring( fontSize.getText().indexOf("-")+1);\r
173 \r
174    Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
175                                "Select font size",\r
176                                "Font size",\r
177                                JOptionPane.QUESTION_MESSAGE,\r
178                                null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
179                                ,"Font Size - "+size);\r
180    if(selection!=null)\r
181    {\r
182      fontSize.setText("Font Size - " + selection);\r
183 \r
184      int i = Integer.parseInt(selection.toString());\r
185      treeCanvas.setFontSize(i);\r
186    }\r
187     scrollPane.setViewportView(treeCanvas);\r
188 \r
189   }\r
190 \r
191   protected void distanceMenu_actionPerformed(ActionEvent e)\r
192   {\r
193     treeCanvas.setShowDistances(distanceMenu.isSelected());\r
194   }\r
195 \r
196   protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
197   {\r
198     treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
199   }\r
200 \r
201   protected void placeholdersMenu_actionPerformed(ActionEvent e)\r
202     {\r
203       treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
204   }\r
205 \r
206   protected void epsTree_actionPerformed(ActionEvent e)\r
207   {\r
208     int width = treeCanvas.getWidth(), height=treeCanvas.getHeight();\r
209     try\r
210     {\r
211       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
212           "LAST_DIRECTORY"),\r
213               new String[]{"eps"},\r
214               new String[]{"Encapsulated Postscript"},\r
215               "Encapsulated Postscript");\r
216       chooser.setFileView(new jalview.io.JalviewFileView());\r
217       chooser.setDialogTitle("Create EPS file from tree");\r
218       chooser.setToolTipText("Save");\r
219 \r
220       int value = chooser.showSaveDialog(this);\r
221       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
222         return;\r
223 \r
224       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
225       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
226       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height);\r
227 \r
228 \r
229       treeCanvas.draw(pg, width, height);\r
230 \r
231         pg.flush();\r
232         pg.close();\r
233     }\r
234     catch (Exception ex)\r
235     {\r
236       ex.printStackTrace();\r
237     }\r
238   }\r
239 \r
240   protected void pngTree_actionPerformed(ActionEvent e)\r
241  {\r
242   int width = treeCanvas.getWidth(), height = treeCanvas.getHeight();\r
243     try\r
244     {\r
245       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
246           jalview.bin.Cache.getProperty("LAST_DIRECTORY"),\r
247           new String[] {"png"},\r
248           new String[] {"Portable network graphics"},\r
249           "Portable network graphics");\r
250 \r
251       chooser.setFileView(new jalview.io.JalviewFileView());\r
252       chooser.setDialogTitle("Create PNG image from tree");\r
253       chooser.setToolTipText("Save");\r
254 \r
255       int value = chooser.showSaveDialog(this);\r
256       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
257         return;\r
258 \r
259       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
260       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
261 \r
262       BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\r
263       Graphics png = bi.getGraphics();\r
264 \r
265       treeCanvas.draw(png, width, height);\r
266 \r
267         ImageIO.write(bi, "png", out);\r
268         out.close();\r
269     }\r
270     catch (Exception ex)\r
271     {\r
272       ex.printStackTrace();\r
273     }\r
274   }\r
275 \r
276 }\r