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