Applet has hidden regions
[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     Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(av.\r
126         getGapCharacter());\r
127 \r
128     if (alAndColsel != null && alAndColsel[0]!=null)\r
129      {\r
130        Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);\r
131        AlignFrame af = new AlignFrame(al,\r
132              av.applet,\r
133              "Original Data for Tree",\r
134              false);\r
135 \r
136       af.viewport.setHiddenColumns( (ColumnSelection) alAndColsel[1] );\r
137      }\r
138   }\r
139 \r
140   class TreeLoader extends Thread\r
141   {\r
142     NewickFile newtree;\r
143     jalview.datamodel.AlignmentView odata=null;\r
144 \r
145     public TreeLoader(NewickFile newtree)\r
146     {\r
147       this.newtree = newtree;\r
148     }\r
149 \r
150     public void run()\r
151     {\r
152       if(newtree!=null)\r
153       {\r
154         if (odata == null)\r
155           tree = new NJTree(av.alignment.getSequencesArray(),\r
156                             newtree);\r
157         else\r
158           tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);\r
159 \r
160         }\r
161         else\r
162         {\r
163           int start, end;\r
164           SequenceI [] seqs;\r
165           AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup()!=null);\r
166           if(av.getSelectionGroup()==null)\r
167           {\r
168             start = 0;\r
169             end = av.alignment.getWidth();\r
170             seqs = av.alignment.getSequencesArray();\r
171           }\r
172           else\r
173           {\r
174             start = av.getSelectionGroup().getStartRes();\r
175             end = av.getSelectionGroup().getEndRes()+1;\r
176             seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);\r
177           }\r
178 \r
179           tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);\r
180         }\r
181 \r
182       tree.reCount(tree.getTopNode());\r
183       tree.findHeight(tree.getTopNode());\r
184       treeCanvas.setTree(tree);\r
185       if(newtree!=null)\r
186       {\r
187         distanceMenu.setState(newtree.HasDistances());\r
188         bootstrapMenu.setState(newtree.HasBootstrap());\r
189         treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
190         treeCanvas.setShowDistances(newtree.HasDistances());\r
191       }\r
192 \r
193 \r
194       treeCanvas.repaint();\r
195 \r
196       av.setCurrentTree(tree);\r
197 \r
198     }\r
199   }\r
200 \r
201   public void actionPerformed(ActionEvent evt)\r
202   {\r
203     if(evt.getSource()==newickOutput)\r
204       newickOutput_actionPerformed();\r
205     else if(evt.getSource()==fontSize)\r
206       fontSize_actionPerformed();\r
207     else if(evt.getSource()==inputData)\r
208       showOriginalData();\r
209   }\r
210 \r
211   public void itemStateChanged(ItemEvent evt)\r
212   {\r
213     if(evt.getSource()==fitToWindow)\r
214       treeCanvas.fitToWindow = fitToWindow.getState();\r
215 \r
216     else if(evt.getSource()==distanceMenu)\r
217       treeCanvas.setShowDistances(distanceMenu.getState());\r
218 \r
219     else if(evt.getSource()==bootstrapMenu)\r
220       treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
221 \r
222     else if(evt.getSource()==placeholdersMenu)\r
223       treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
224 \r
225     treeCanvas.repaint();\r
226   }\r
227 \r
228 \r
229   public void newickOutput_actionPerformed()\r
230   {\r
231     jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
232     String output = fout.print(false, true);\r
233     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
234     cap.setText(output);\r
235     java.awt.Frame frame = new java.awt.Frame();\r
236     frame.add(cap);\r
237     jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
238   }\r
239 \r
240   public java.awt.Font getTreeFont()\r
241   {\r
242     return treeCanvas.font;\r
243   }\r
244 \r
245   public void setTreeFont(java.awt.Font font)\r
246   {\r
247     treeCanvas.font = font;\r
248     treeCanvas.repaint();\r
249   }\r
250 \r
251   protected void fontSize_actionPerformed()\r
252   {\r
253      if( treeCanvas==null )\r
254         return;\r
255 \r
256     new FontChooser(this);\r
257   }\r
258 \r
259 \r
260 \r
261 \r
262   BorderLayout borderLayout1 = new BorderLayout();\r
263   protected ScrollPane scrollPane = new ScrollPane();\r
264   MenuBar jMenuBar1 = new MenuBar();\r
265   Menu jMenu2 = new Menu();\r
266   protected MenuItem fontSize = new MenuItem();\r
267   protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
268   protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
269   protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();\r
270   protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
271   Menu fileMenu = new Menu();\r
272   MenuItem newickOutput = new MenuItem();\r
273   MenuItem inputData = new MenuItem();\r
274 \r
275   private void jbInit() throws Exception {\r
276       setLayout(borderLayout1);\r
277       this.setBackground(Color.white);\r
278       this.setFont(new java.awt.Font("Verdana", 0, 12));\r
279       jMenu2.setLabel("View");\r
280       fontSize.setLabel("Font...");\r
281       fontSize.addActionListener(this);\r
282       bootstrapMenu.setLabel("Show Bootstrap Values");\r
283       bootstrapMenu.addItemListener(this);\r
284       distanceMenu.setLabel("Show Distances");\r
285       distanceMenu.addItemListener(this);\r
286       placeholdersMenu.setLabel("Mark Unassociated Leaves");\r
287       placeholdersMenu.addItemListener(this);\r
288       fitToWindow.setState(true);\r
289       fitToWindow.setLabel("Fit To Window");\r
290       fitToWindow.addItemListener(this);\r
291       fileMenu.setLabel("File");\r
292       newickOutput.setLabel("Newick Format");\r
293       newickOutput.addActionListener(this);\r
294     inputData.setLabel("Input Data...");\r
295 \r
296     add(scrollPane, BorderLayout.CENTER);\r
297       jMenuBar1.add(fileMenu);\r
298       jMenuBar1.add(jMenu2);\r
299       jMenu2.add(fitToWindow);\r
300       jMenu2.add(fontSize);\r
301       jMenu2.add(distanceMenu);\r
302       jMenu2.add(bootstrapMenu);\r
303       jMenu2.add(placeholdersMenu);\r
304     fileMenu.add(newickOutput);\r
305     fileMenu.add(inputData);\r
306     inputData.addActionListener(this);\r
307   }\r
308 \r
309 }\r