elementAt instead of get for 1.1 compatibility
[jalview.git] / src / jalview / appletgui / TreePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 package jalview.appletgui;\r
21 \r
22 import java.util.*;\r
23 \r
24 import java.awt.event.*;\r
25 import java.awt.*;\r
26 \r
27 import jalview.analysis.*;\r
28 import jalview.datamodel.*;\r
29 import jalview.io.*;\r
30 \r
31 public class TreePanel extends Frame implements ActionListener, ItemListener\r
32 {\r
33   SequenceI[] seq;\r
34   String type;\r
35   String pwtype;\r
36   int start;\r
37   int end;\r
38   TreeCanvas treeCanvas;\r
39   NJTree tree;\r
40   AlignViewport av;\r
41 \r
42   public NJTree getTree()\r
43   {\r
44     return tree;\r
45   }\r
46 \r
47   /**\r
48    * Creates a new TreePanel object.\r
49    *\r
50    * @param av DOCUMENT ME!\r
51    * @param seqVector DOCUMENT ME!\r
52    * @param type DOCUMENT ME!\r
53    * @param pwtype DOCUMENT ME!\r
54    * @param s DOCUMENT ME!\r
55    * @param e DOCUMENT ME!\r
56    */\r
57   public TreePanel(AlignViewport av, String type, String pwtype)\r
58   {\r
59     try\r
60     {\r
61       jbInit();\r
62       this.setMenuBar(jMenuBar1);\r
63     }\r
64     catch (Exception ex)\r
65     {\r
66       ex.printStackTrace();\r
67     }\r
68 \r
69     initTreePanel(av, type, pwtype, null);\r
70   }\r
71 \r
72   /**\r
73    * Creates a new TreePanel object.\r
74    *\r
75    * @param av DOCUMENT ME!\r
76    * @param seqVector DOCUMENT ME!\r
77    * @param newtree DOCUMENT ME!\r
78    * @param type DOCUMENT ME!\r
79    * @param pwtype DOCUMENT ME!\r
80    */\r
81   public TreePanel(AlignViewport av,\r
82                    String type,\r
83                    String pwtype,\r
84                    NewickFile newtree)\r
85   {\r
86     try\r
87     {\r
88       jbInit();\r
89       this.setMenuBar(jMenuBar1);\r
90     }\r
91     catch (Exception e)\r
92     {\r
93       e.printStackTrace();\r
94     }\r
95 \r
96     initTreePanel(av, type, pwtype, newtree);\r
97   }\r
98 \r
99 \r
100   void initTreePanel(AlignViewport av,\r
101                      String type,\r
102                      String pwtype,\r
103                      NewickFile newTree)\r
104   {\r
105 \r
106     this.av = av;\r
107     this.type = type;\r
108     this.pwtype = pwtype;\r
109 \r
110     treeCanvas = new TreeCanvas(av, scrollPane);\r
111     scrollPane.add(treeCanvas);\r
112 \r
113 \r
114     TreeLoader tl = new TreeLoader(newTree);\r
115     tl.start();\r
116 \r
117   }\r
118 \r
119   void showOriginalData()\r
120   {\r
121     // decide if av alignment is sufficiently different to original data to warrant a new window to be created\r
122     // create new alignmnt window with hidden regions (unhiding hidden regions yields unaligned seqs)\r
123     // or create a selection box around columns in alignment view\r
124     // test Alignment(SeqCigar[])\r
125     if(tree.seqData!=null)\r
126     {\r
127       Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(av.\r
128           getGapCharacter());\r
129 \r
130       if (alAndColsel != null && alAndColsel[0] != null)\r
131       {\r
132         Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);\r
133         AlignFrame af = new AlignFrame(al,\r
134                                        av.applet,\r
135                                        "Original Data for Tree",\r
136                                        false);\r
137 \r
138         af.viewport.setHiddenColumns( (ColumnSelection) alAndColsel[1]);\r
139       }\r
140     }\r
141     else\r
142       System.out.println("Original Tree Data not available");\r
143   }\r
144 \r
145   class TreeLoader extends Thread\r
146   {\r
147     NewickFile newtree;\r
148     jalview.datamodel.AlignmentView odata=null;\r
149 \r
150     public TreeLoader(NewickFile newtree)\r
151     {\r
152       this.newtree = newtree;\r
153     }\r
154 \r
155     public void run()\r
156     {\r
157       if(newtree!=null)\r
158       {\r
159         if (odata == null)\r
160           tree = new NJTree(av.alignment.getSequencesArray(),\r
161                             newtree);\r
162         else\r
163           tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);\r
164 \r
165         }\r
166         else\r
167         {\r
168           int start, end;\r
169           SequenceI [] seqs;\r
170           AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup()!=null);\r
171           if(av.getSelectionGroup()==null)\r
172           {\r
173             start = 0;\r
174             end = av.alignment.getWidth();\r
175             seqs = av.alignment.getSequencesArray();\r
176           }\r
177           else\r
178           {\r
179             start = av.getSelectionGroup().getStartRes();\r
180             end = av.getSelectionGroup().getEndRes()+1;\r
181             seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);\r
182           }\r
183 \r
184           tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);\r
185         }\r
186 \r
187       tree.reCount(tree.getTopNode());\r
188       tree.findHeight(tree.getTopNode());\r
189       treeCanvas.setTree(tree);\r
190       if(newtree!=null)\r
191       {\r
192         distanceMenu.setState(newtree.HasDistances());\r
193         bootstrapMenu.setState(newtree.HasBootstrap());\r
194         treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
195         treeCanvas.setShowDistances(newtree.HasDistances());\r
196       }\r
197 \r
198 \r
199       treeCanvas.repaint();\r
200 \r
201       av.setCurrentTree(tree);\r
202 \r
203     }\r
204   }\r
205 \r
206   public void actionPerformed(ActionEvent evt)\r
207   {\r
208     if(evt.getSource()==newickOutput)\r
209       newickOutput_actionPerformed();\r
210     else if(evt.getSource()==fontSize)\r
211       fontSize_actionPerformed();\r
212     else if(evt.getSource()==inputData)\r
213       showOriginalData();\r
214   }\r
215 \r
216   public void itemStateChanged(ItemEvent evt)\r
217   {\r
218     if(evt.getSource()==fitToWindow)\r
219       treeCanvas.fitToWindow = fitToWindow.getState();\r
220 \r
221     else if(evt.getSource()==distanceMenu)\r
222       treeCanvas.setShowDistances(distanceMenu.getState());\r
223 \r
224     else if(evt.getSource()==bootstrapMenu)\r
225       treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
226 \r
227     else if(evt.getSource()==placeholdersMenu)\r
228       treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
229 \r
230     treeCanvas.repaint();\r
231   }\r
232 \r
233 \r
234   public void newickOutput_actionPerformed()\r
235   {\r
236     jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
237     String output = fout.print(false, true);\r
238     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
239     cap.setText(output);\r
240     java.awt.Frame frame = new java.awt.Frame();\r
241     frame.add(cap);\r
242     jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
243   }\r
244 \r
245   public java.awt.Font getTreeFont()\r
246   {\r
247     return treeCanvas.font;\r
248   }\r
249 \r
250   public void setTreeFont(java.awt.Font font)\r
251   {\r
252     treeCanvas.font = font;\r
253     treeCanvas.repaint();\r
254   }\r
255 \r
256   protected void fontSize_actionPerformed()\r
257   {\r
258      if( treeCanvas==null )\r
259         return;\r
260 \r
261     new FontChooser(this);\r
262   }\r
263 \r
264 \r
265 \r
266 \r
267   BorderLayout borderLayout1 = new BorderLayout();\r
268   protected ScrollPane scrollPane = new ScrollPane();\r
269   MenuBar jMenuBar1 = new MenuBar();\r
270   Menu jMenu2 = new Menu();\r
271   protected MenuItem fontSize = new MenuItem();\r
272   protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
273   protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
274   protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();\r
275   protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
276   Menu fileMenu = new Menu();\r
277   MenuItem newickOutput = new MenuItem();\r
278   MenuItem inputData = new MenuItem();\r
279 \r
280   private void jbInit() throws Exception {\r
281       setLayout(borderLayout1);\r
282       this.setBackground(Color.white);\r
283       this.setFont(new java.awt.Font("Verdana", 0, 12));\r
284       jMenu2.setLabel("View");\r
285       fontSize.setLabel("Font...");\r
286       fontSize.addActionListener(this);\r
287       bootstrapMenu.setLabel("Show Bootstrap Values");\r
288       bootstrapMenu.addItemListener(this);\r
289       distanceMenu.setLabel("Show Distances");\r
290       distanceMenu.addItemListener(this);\r
291       placeholdersMenu.setLabel("Mark Unassociated Leaves");\r
292       placeholdersMenu.addItemListener(this);\r
293       fitToWindow.setState(true);\r
294       fitToWindow.setLabel("Fit To Window");\r
295       fitToWindow.addItemListener(this);\r
296       fileMenu.setLabel("File");\r
297       newickOutput.setLabel("Newick Format");\r
298       newickOutput.addActionListener(this);\r
299     inputData.setLabel("Input Data...");\r
300 \r
301     add(scrollPane, BorderLayout.CENTER);\r
302       jMenuBar1.add(fileMenu);\r
303       jMenuBar1.add(jMenu2);\r
304       jMenu2.add(fitToWindow);\r
305       jMenu2.add(fontSize);\r
306       jMenu2.add(distanceMenu);\r
307       jMenu2.add(bootstrapMenu);\r
308       jMenu2.add(placeholdersMenu);\r
309     fileMenu.add(newickOutput);\r
310     fileMenu.add(inputData);\r
311     inputData.addActionListener(this);\r
312   }\r
313 \r
314 }\r