Reduced jar size by 20%
[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 \r
41   public NJTree getTree()\r
42   {\r
43     return tree;\r
44   }\r
45 \r
46   /**\r
47    * Creates a new TreePanel object.\r
48    *\r
49    * @param av DOCUMENT ME!\r
50    * @param seqVector DOCUMENT ME!\r
51    * @param type DOCUMENT ME!\r
52    * @param pwtype DOCUMENT ME!\r
53    * @param s DOCUMENT ME!\r
54    * @param e DOCUMENT ME!\r
55    */\r
56   public TreePanel(AlignViewport av, Vector seqVector, String type,\r
57                    String pwtype, int s, int e)\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, seqVector, type, pwtype, s, e, 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, Vector seqVector, NewickFile newtree,\r
82                    String type, String pwtype)\r
83   {\r
84     try\r
85     {\r
86       jbInit();\r
87       this.setMenuBar(jMenuBar1);\r
88     }\r
89     catch (Exception e)\r
90     {\r
91       e.printStackTrace();\r
92     }\r
93 \r
94     initTreePanel(av, seqVector, type, pwtype, 0, seqVector.size(), newtree);\r
95   }\r
96 \r
97 \r
98   void initTreePanel(AlignViewport av, Vector seqVector, String type,\r
99                      String pwtype, int s, int e, NewickFile newTree)\r
100   {\r
101 \r
102     this.type = type;\r
103     this.pwtype = pwtype;\r
104 \r
105     start = s;\r
106     end = e;\r
107 \r
108     seq = new Sequence[seqVector.size()];\r
109     for(int i=0; i<seqVector.size(); i++)\r
110       seq[i] = (SequenceI)seqVector.elementAt(i);\r
111 \r
112 \r
113     treeCanvas = new TreeCanvas(av, scrollPane);\r
114     scrollPane.add(treeCanvas);\r
115 \r
116 \r
117     TreeLoader tl = new TreeLoader(newTree);\r
118     tl.start();\r
119 \r
120   }\r
121 \r
122   class TreeLoader extends Thread\r
123   {\r
124     NewickFile newtree;\r
125 \r
126     public TreeLoader(NewickFile newtree)\r
127     {\r
128       this.newtree = newtree;\r
129     }\r
130 \r
131     public void run()\r
132     {\r
133       if(newtree!=null)\r
134         tree = new NJTree(seq, newtree);\r
135       else\r
136         tree = new NJTree(seq, type, pwtype, start, end);\r
137 \r
138       tree.reCount(tree.getTopNode());\r
139       tree.findHeight(tree.getTopNode());\r
140       treeCanvas.setTree(tree);\r
141       if(newtree!=null)\r
142       {\r
143         distanceMenu.setState(newtree.HasDistances());\r
144         bootstrapMenu.setState(newtree.HasBootstrap());\r
145         treeCanvas.setShowBootstrap(newtree.HasBootstrap());\r
146         treeCanvas.setShowDistances(newtree.HasDistances());\r
147       }\r
148 \r
149 \r
150       treeCanvas.repaint();\r
151 \r
152     }\r
153   }\r
154 \r
155   public void actionPerformed(ActionEvent evt)\r
156   {\r
157     if(evt.getSource()==newickOutput)\r
158       newickOutput_actionPerformed();\r
159     else if(evt.getSource()==fontSize)\r
160       fontSize_actionPerformed();\r
161   }\r
162 \r
163   public void itemStateChanged(ItemEvent evt)\r
164   {\r
165     if(evt.getSource()==fitToWindow)\r
166       treeCanvas.fitToWindow = fitToWindow.getState();\r
167 \r
168     else if(evt.getSource()==distanceMenu)\r
169       treeCanvas.setShowDistances(distanceMenu.getState());\r
170 \r
171     else if(evt.getSource()==bootstrapMenu)\r
172       treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
173 \r
174     else if(evt.getSource()==placeholdersMenu)\r
175       treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
176 \r
177     treeCanvas.repaint();\r
178   }\r
179 \r
180 \r
181   public void newickOutput_actionPerformed()\r
182   {\r
183     jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());\r
184     String output = fout.print(false, true);\r
185     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
186     cap.setText(output);\r
187     java.awt.Frame frame = new java.awt.Frame();\r
188     frame.add(cap);\r
189     jalview.bin.JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
190   }\r
191 \r
192   public java.awt.Font getTreeFont()\r
193   {\r
194     return treeCanvas.font;\r
195   }\r
196 \r
197   public void setTreeFont(java.awt.Font font)\r
198   {\r
199     treeCanvas.font = font;\r
200     treeCanvas.repaint();\r
201   }\r
202 \r
203   protected void fontSize_actionPerformed()\r
204   {\r
205      if( treeCanvas==null )\r
206         return;\r
207 \r
208     new FontChooser(this);\r
209   }\r
210 \r
211 \r
212   BorderLayout borderLayout1 = new BorderLayout();\r
213   protected ScrollPane scrollPane = new ScrollPane();\r
214   MenuBar jMenuBar1 = new MenuBar();\r
215   Menu jMenu2 = new Menu();\r
216   protected MenuItem fontSize = new MenuItem();\r
217   protected CheckboxMenuItem bootstrapMenu = new CheckboxMenuItem();\r
218   protected CheckboxMenuItem distanceMenu = new CheckboxMenuItem();\r
219   protected CheckboxMenuItem placeholdersMenu = new CheckboxMenuItem();\r
220   protected CheckboxMenuItem fitToWindow = new CheckboxMenuItem();\r
221   Menu fileMenu = new Menu();\r
222   MenuItem newickOutput = new MenuItem();\r
223 \r
224   private void jbInit() throws Exception {\r
225       setLayout(borderLayout1);\r
226       this.setBackground(Color.white);\r
227       this.setFont(new java.awt.Font("Verdana", 0, 12));\r
228       jMenu2.setLabel("View");\r
229       fontSize.setLabel("Font...");\r
230       fontSize.addActionListener(this);\r
231       bootstrapMenu.setLabel("Show Bootstrap Values");\r
232       bootstrapMenu.addItemListener(this);\r
233       distanceMenu.setLabel("Show Distances");\r
234       distanceMenu.addItemListener(this);\r
235       placeholdersMenu.setLabel("Mark Unassociated Leaves");\r
236       placeholdersMenu.addItemListener(this);\r
237       fitToWindow.setState(true);\r
238       fitToWindow.setLabel("Fit To Window");\r
239       fitToWindow.addItemListener(this);\r
240       fileMenu.setLabel("File");\r
241       newickOutput.setLabel("Newick Format");\r
242       newickOutput.addActionListener(this);\r
243 \r
244     add(scrollPane, BorderLayout.CENTER);\r
245       jMenuBar1.add(fileMenu);\r
246       jMenuBar1.add(jMenu2);\r
247       jMenu2.add(fitToWindow);\r
248       jMenu2.add(fontSize);\r
249       jMenu2.add(distanceMenu);\r
250       jMenu2.add(bootstrapMenu);\r
251       jMenu2.add(placeholdersMenu);\r
252     fileMenu.add(newickOutput);\r
253   }\r
254 \r
255 }\r