Cut and paste changed
[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 \r
124       StringBuffer buffer = new StringBuffer();\r
125 \r
126       if(type.equals("AV"))\r
127         buffer.append("Average distance tree using ");\r
128       else\r
129         buffer.append("Neighbour joining tree using ");\r
130 \r
131       if(pwtype.equals("BL"))\r
132        buffer.append("BLOSUM62");\r
133       else\r
134         buffer.append("PID");\r
135 \r
136       Desktop.addInternalFrame(cap,buffer.toString(), 500, 100);\r
137       jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
138       cap.setText(  fout.print(false,true) );\r
139 \r
140     }\r
141 \r
142 \r
143     public void saveAsNewick_actionPerformed(ActionEvent e)\r
144     {\r
145 \r
146   JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.\r
147         getProperty("LAST_DIRECTORY"));\r
148     chooser.setFileView(new JalviewFileView());\r
149     chooser.setDialogTitle("Save tree as newick file");\r
150     chooser.setToolTipText("Save");\r
151     int value = chooser.showSaveDialog(null);\r
152     if (value == JalviewFileChooser.APPROVE_OPTION) {\r
153       String choice =  chooser.getSelectedFile().getPath();\r
154       jalview.bin.Cache.setProperty("LAST_DIRECTORY",  chooser.getSelectedFile().getParent());\r
155       try{\r
156         jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
157         String output = fout.print(false,true); // distances only\r
158         java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileWriter( choice )  );\r
159         out.println(output);\r
160         out.close();\r
161       }\r
162       catch (Exception ex) {\r
163         ex.printStackTrace();\r
164       }\r
165     }\r
166   }\r
167 \r
168   protected void printMenu_actionPerformed(ActionEvent e)\r
169   {\r
170 \r
171     //Putting in a thread avoids Swing painting problems\r
172     treeCanvas.startPrinting();\r
173   }\r
174 \r
175   protected void fitToWindow_actionPerformed(ActionEvent e)\r
176   {\r
177     treeCanvas.fitToWindow = fitToWindow.isSelected();\r
178     repaint();\r
179   }\r
180 \r
181 \r
182   protected void fontSize_actionPerformed(ActionEvent e)\r
183   {\r
184     if( treeCanvas==null )\r
185      return;\r
186 \r
187    String size = fontSize.getText().substring( fontSize.getText().indexOf("-")+1);\r
188 \r
189    Object selection = JOptionPane.showInternalInputDialog(Desktop.desktop,\r
190                                "Select font size",\r
191                                "Font size",\r
192                                JOptionPane.QUESTION_MESSAGE,\r
193                                null, new String[]{"1","2","4","6","8","10","12","14","16","18","20"}\r
194                                ,"Font Size - "+size);\r
195    if(selection!=null)\r
196    {\r
197      fontSize.setText("Font Size - " + selection);\r
198 \r
199      int i = Integer.parseInt(selection.toString());\r
200      treeCanvas.setFontSize(i);\r
201    }\r
202     scrollPane.setViewportView(treeCanvas);\r
203 \r
204   }\r
205 \r
206   protected void distanceMenu_actionPerformed(ActionEvent e)\r
207   {\r
208     treeCanvas.setShowDistances(distanceMenu.isSelected());\r
209   }\r
210 \r
211   protected void bootstrapMenu_actionPerformed(ActionEvent e)\r
212   {\r
213     treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());\r
214   }\r
215 \r
216   protected void placeholdersMenu_actionPerformed(ActionEvent e)\r
217     {\r
218       treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());\r
219   }\r
220 \r
221   protected void epsTree_actionPerformed(ActionEvent e)\r
222   {\r
223     int width = treeCanvas.getWidth(), height=treeCanvas.getHeight();\r
224     try\r
225     {\r
226       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(\r
227           "LAST_DIRECTORY"),\r
228               new String[]{"eps"},\r
229               new String[]{"Encapsulated Postscript"},\r
230               "Encapsulated Postscript");\r
231       chooser.setFileView(new jalview.io.JalviewFileView());\r
232       chooser.setDialogTitle("Create EPS file from tree");\r
233       chooser.setToolTipText("Save");\r
234 \r
235       int value = chooser.showSaveDialog(this);\r
236       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
237         return;\r
238 \r
239       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
240       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
241       EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width, height);\r
242 \r
243 \r
244       treeCanvas.draw(pg, width, height);\r
245 \r
246         pg.flush();\r
247         pg.close();\r
248     }\r
249     catch (Exception ex)\r
250     {\r
251       ex.printStackTrace();\r
252     }\r
253   }\r
254 \r
255   protected void pngTree_actionPerformed(ActionEvent e)\r
256  {\r
257   int width = treeCanvas.getWidth(), height = treeCanvas.getHeight();\r
258     try\r
259     {\r
260       jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(\r
261           jalview.bin.Cache.getProperty("LAST_DIRECTORY"),\r
262           new String[] {"png"},\r
263           new String[] {"Portable network graphics"},\r
264           "Portable network graphics");\r
265 \r
266       chooser.setFileView(new jalview.io.JalviewFileView());\r
267       chooser.setDialogTitle("Create PNG image from tree");\r
268       chooser.setToolTipText("Save");\r
269 \r
270       int value = chooser.showSaveDialog(this);\r
271       if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)\r
272         return;\r
273 \r
274       jalview.bin.Cache.setProperty("LAST_DIRECTORY",chooser.getSelectedFile().getParent());\r
275       FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());\r
276 \r
277       BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);\r
278       Graphics png = bi.getGraphics();\r
279 \r
280       treeCanvas.draw(png, width, height);\r
281 \r
282         ImageIO.write(bi, "png", out);\r
283         out.close();\r
284     }\r
285     catch (Exception ex)\r
286     {\r
287       ex.printStackTrace();\r
288     }\r
289   }\r
290 \r
291 }\r