JAL-1807 still testing
[jalviewjs.git] / unused / appletgui / TreePanel.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
4  * \r
5  * This file is part of Jalview.\r
6  * \r
7  * Jalview is free software: you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License \r
9  * as published by the Free Software Foundation, either version 3\r
10  * of the License, or (at your option) any later version.\r
11  *  \r
12  * Jalview is distributed in the hope that it will be useful, but \r
13  * WITHOUT ANY WARRANTY; without even the implied warranty \r
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
15  * PURPOSE.  See the GNU General Public License for more details.\r
16  * \r
17  * You should have received a copy of the GNU General Public License\r
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
19  * The Jalview Authors are detailed in the 'AUTHORS' file.\r
20  */\r
21 package jalview.appletgui;\r
22 \r
23 import jalview.analysis.NJTree;\r
24 import jalview.api.analysis.ScoreModelI;\r
25 import jalview.api.analysis.ViewBasedAnalysisI;\r
26 import jalview.bin.JalviewLite;\r
27 import jalview.datamodel.Alignment;\r
28 import jalview.datamodel.AlignmentView;\r
29 import jalview.datamodel.ColumnSelection;\r
30 import jalview.datamodel.SequenceI;\r
31 import jalview.io.NewickFile;\r
32 import jalview.schemes.ResidueProperties;\r
33 import jalview.util.MessageManager;\r
34 \r
35 import java.awt.BorderLayout;\r
36 import javax.swing.JCheckBoxMenuItem;\r
37 import java.awt.Color;\r
38 \r
39 import javax.swing.JFrame;\r
40 import javax.swing.JMenu;\r
41 import javax.swing.JMenuBar;\r
42 import javax.swing.JMenuItem;\r
43 import javax.swing.JScrollPane;\r
44 import java.awt.event.ActionEvent;\r
45 import java.awt.event.ActionListener;\r
46 import java.awt.event.ItemEvent;\r
47 import java.awt.event.ItemListener;\r
48 \r
49 public class TreePanel extends EmbmenuFrame implements ActionListener,\r
50         ItemListener\r
51 {\r
52   SequenceI[] seq;\r
53 \r
54   String type;\r
55 \r
56   String pwtype;\r
57 \r
58   int start;\r
59 \r
60   int end;\r
61 \r
62   TreeCanvas treeCanvas;\r
63 \r
64   NJTree tree;\r
65 \r
66   AlignmentPanel ap;\r
67 \r
68   AlignViewport av;\r
69 \r
70   public NJTree getTree()\r
71   {\r
72     return tree;\r
73   }\r
74 \r
75   public void finalize() throws Throwable\r
76   {\r
77     ap = null;\r
78     av = null;\r
79     super.finalize();\r
80   }\r
81 \r
82   /**\r
83    * Creates a new TreePanel object.\r
84    * \r
85    * @param av\r
86    *          DOCUMENT ME!\r
87    * @param seqVector\r
88    *          DOCUMENT ME!\r
89    * @param type\r
90    *          DOCUMENT ME!\r
91    * @param pwtype\r
92    *          DOCUMENT ME!\r
93    * @param s\r
94    *          DOCUMENT ME!\r
95    * @param e\r
96    *          DOCUMENT ME!\r
97    */\r
98   public TreePanel(AlignmentPanel ap, String type, String pwtype)\r
99   {\r
100     try\r
101     {\r
102       jbInit();\r
103       this.setJMenuBar(jMenuBar1);\r
104     } catch (Exception ex)\r
105     {\r
106       ex.printStackTrace();\r
107     }\r
108 \r
109     initTreePanel(ap, type, pwtype, null);\r
110   }\r
111 \r
112   /**\r
113    * Creates a new TreePanel object.\r
114    * \r
115    * @param av\r
116    *          DOCUMENT ME!\r
117    * @param seqVector\r
118    *          DOCUMENT ME!\r
119    * @param newtree\r
120    *          DOCUMENT ME!\r
121    * @param type\r
122    *          DOCUMENT ME!\r
123    * @param pwtype\r
124    *          DOCUMENT ME!\r
125    */\r
126   public TreePanel(AlignmentPanel ap, String type, String pwtype,\r
127           NewickFile newtree)\r
128   {\r
129     try\r
130     {\r
131       jbInit();\r
132       this.setJMenuBar(jMenuBar1);\r
133     } catch (Exception e)\r
134     {\r
135       e.printStackTrace();\r
136     }\r
137 \r
138     initTreePanel(ap, type, pwtype, newtree);\r
139   }\r
140 \r
141   void initTreePanel(AlignmentPanel ap, String type, String pwtype,\r
142           NewickFile newTree)\r
143   {\r
144 \r
145     this.ap = ap;\r
146     this.av = ap.av;\r
147     this.type = type;\r
148     this.pwtype = pwtype;\r
149 \r
150     treeCanvas = new TreeCanvas(ap, scrollPane);\r
151     TreeLoader tl = new TreeLoader(newTree);\r
152     tl.start();\r
153     embedMenuIfNeeded(treeCanvas);\r
154     scrollPane.add(treeCanvas, BorderLayout.CENTER);\r
155   }\r
156 \r
157   void showOriginalData()\r
158   {\r
159     // decide if av alignment is sufficiently different to original data to\r
160     // warrant a new window to be created\r
161     // create new alignmnt window with hidden regions (unhiding hidden regions\r
162     // yields unaligned seqs)\r
163     // or create a selection box around columns in alignment view\r
164     // test Alignment(SeqCigar[])\r
165     if (tree.seqData != null)\r
166     {\r
167       char gc = '-';\r
168       try\r
169       {\r
170         // we try to get the associated view's gap character\r
171         // but this may fail if the view was closed...\r
172         gc = av.getGapCharacter();\r
173       } catch (Exception ex)\r
174       {\r
175       }\r
176       ;\r
177       Object[] alAndColsel = tree.seqData\r
178               .getAlignmentAndColumnSelection(gc);\r
179 \r
180       if (alAndColsel != null && alAndColsel[0] != null)\r
181       {\r
182         Alignment al = new Alignment((SequenceI[]) alAndColsel[0]);\r
183         AlignFrame af = new AlignFrame(al, av.applet,\r
184                 "Original Data for Tree", false);\r
185 \r
186         af.viewport.setHiddenColumns((ColumnSelection) alAndColsel[1]);\r
187       }\r
188     }\r
189     else\r
190     {\r
191       System.out.println("Original Tree Data not available");\r
192     }\r
193   }\r
194 \r
195   class TreeLoader extends Thread\r
196   {\r
197     NewickFile newtree;\r
198 \r
199     AlignmentView odata = null;\r
200 \r
201     public TreeLoader(NewickFile newtree)\r
202     {\r
203       this.newtree = newtree;\r
204     }\r
205 \r
206     public void run()\r
207     {\r
208       if (newtree != null)\r
209       {\r
210         if (odata == null)\r
211         {\r
212           tree = new NJTree(av.getAlignment().getSequencesArray(), newtree);\r
213         }\r
214         else\r
215         {\r
216           tree = new NJTree(av.getAlignment().getSequencesArray(), odata,\r
217                   newtree);\r
218         }\r
219 \r
220       }\r
221       else\r
222       {\r
223         int start, end;\r
224         SequenceI[] seqs;\r
225         boolean selview = av.getSelectionGroup() != null\r
226                 && av.getSelectionGroup().getSize() > 1;\r
227         AlignmentView seqStrings = av.getAlignmentView(selview);\r
228         if (!selview)\r
229         {\r
230           start = 0;\r
231           end = av.getAlignment().getWidth();\r
232           seqs = av.getAlignment().getSequencesArray();\r
233         }\r
234         else\r
235         {\r
236           start = av.getSelectionGroup().getStartRes();\r
237           end = av.getSelectionGroup().getEndRes() + 1;\r
238           seqs = av.getSelectionGroup().getSequencesInOrder(\r
239                   av.getAlignment());\r
240         }\r
241         ScoreModelI sm = ResidueProperties.getScoreModel(pwtype);\r
242         if (sm instanceof ViewBasedAnalysisI)\r
243         {\r
244           try\r
245           {\r
246             sm = sm.getClass().newInstance();\r
247             ((ViewBasedAnalysisI) sm)\r
248                     .configureFromAlignmentView(treeCanvas.ap);\r
249           } catch (Exception q)\r
250           {\r
251             System.err.println("Couldn't create a scoremodel instance for "\r
252                     + sm.getName());\r
253             q.printStackTrace();\r
254           }\r
255           tree = new NJTree(seqs, seqStrings, type, pwtype, sm, start, end);\r
256         }\r
257         else\r
258         {\r
259           tree = new NJTree(seqs, seqStrings, type, pwtype, null, start,\r
260                   end);\r
261         }\r
262       }\r
263 \r
264       tree.reCount(tree.getTopNode());\r
265       tree.findHeight(tree.getTopNode());\r
266       treeCanvas.setTree(tree);\r
267       if (newtree != null)\r
268       {\r
269         // Set default view, paying lip service to any overriding tree view\r
270         // parameter settings\r
271         boolean showDist = newtree.HasDistances()\r
272                 && av.applet.getDefaultParameter("showTreeDistances",\r
273                         newtree.HasDistances());\r
274         boolean showBoots = newtree.HasBootstrap()\r
275                 && av.applet.getDefaultParameter("showTreeBootstraps",\r
276                         newtree.HasBootstrap());\r
277         distanceMenu.setSelected(showDist);\r
278         bootstrapMenu.setSelected(showBoots);\r
279         treeCanvas.setShowBootstrap(showBoots);\r
280         treeCanvas.setShowDistances(showDist);\r
281         treeCanvas.setMarkPlaceholders(av.applet.getDefaultParameter(\r
282                 "showUnlinkedTreeNodes", false));\r
283       }\r
284 \r
285       treeCanvas.repaint();\r
286 \r
287       av.setCurrentTree(tree);\r
288 \r
289     }\r
290   }\r
291 \r
292   public void actionPerformed(ActionEvent evt)\r
293   {\r
294     if (evt.getSource() == newickOutput)\r
295     {\r
296       newickOutput_actionPerformed();\r
297     }\r
298     else if (evt.getSource() == fontSize)\r
299     {\r
300       fontSize_actionPerformed();\r
301     }\r
302     else if (evt.getSource() == inputData)\r
303     {\r
304       showOriginalData();\r
305     }\r
306   }\r
307 \r
308   public void itemStateChanged(ItemEvent evt)\r
309   {\r
310     if (evt.getSource() == fitToWindow)\r
311     {\r
312       treeCanvas.fitToWindow = fitToWindow.getState();\r
313     }\r
314 \r
315     else if (evt.getSource() == distanceMenu)\r
316     {\r
317       treeCanvas.setShowDistances(distanceMenu.getState());\r
318     }\r
319 \r
320     else if (evt.getSource() == bootstrapMenu)\r
321     {\r
322       treeCanvas.setShowBootstrap(bootstrapMenu.getState());\r
323     }\r
324 \r
325     else if (evt.getSource() == placeholdersMenu)\r
326     {\r
327       treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());\r
328     }\r
329 \r
330     treeCanvas.repaint();\r
331   }\r
332 \r
333   public void newickOutput_actionPerformed()\r
334   {\r
335     NewickFile fout = new NewickFile(tree.getTopNode());\r
336     String output = fout.print(false, true);\r
337     CutAndPasteTransfer cap = new CutAndPasteTransfer(false, null);\r
338     cap.setText(output);\r
339     JFrame frame = new JFrame();\r
340     frame.add(cap);\r
341     JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);\r
342   }\r
343 \r
344   public java.awt.Font getTreeFont()\r
345   {\r
346     return treeCanvas.font;\r
347   }\r
348 \r
349   public void setTreeFont(java.awt.Font font)\r
350   {\r
351     treeCanvas.font = font;\r
352     treeCanvas.repaint();\r
353   }\r
354 \r
355   protected void fontSize_actionPerformed()\r
356   {\r
357     if (treeCanvas == null)\r
358     {\r
359       return;\r
360     }\r
361 \r
362     new FontChooser(this);\r
363   }\r
364 \r
365   BorderLayout borderLayout1 = new BorderLayout();\r
366 \r
367   protected JScrollPane scrollPane = new JScrollPane();\r
368 \r
369   JMenuBar jMenuBar1 = new JMenuBar();\r
370 \r
371   JMenu jMenu2 = new JMenu();\r
372 \r
373   protected JMenuItem fontSize = new JMenuItem();\r
374 \r
375   protected JCheckBoxMenuItem bootstrapMenu = new JCheckBoxMenuItem();\r
376 \r
377   protected JCheckBoxMenuItem distanceMenu = new JCheckBoxMenuItem();\r
378 \r
379   protected JCheckBoxMenuItem placeholdersMenu = new JCheckBoxMenuItem();\r
380 \r
381   protected JCheckBoxMenuItem fitToWindow = new JCheckBoxMenuItem();\r
382 \r
383   JMenu fileMenu = new JMenu();\r
384 \r
385   JMenuItem newickOutput = new JMenuItem();\r
386 \r
387   JMenuItem inputData = new JMenuItem();\r
388 \r
389   private void jbInit() throws Exception\r
390   {\r
391     setLayout(borderLayout1);\r
392     this.setBackground(Color.white);\r
393     this.setFont(new java.awt.Font("Verdana", 0, 12));\r
394     jMenu2.setLabel(MessageManager.getString("action.view"));\r
395     fontSize.setLabel(MessageManager.getString("action.font"));\r
396     fontSize.addActionListener(this);\r
397     bootstrapMenu.setLabel(MessageManager\r
398             .getString("label.show_bootstrap_values"));\r
399     bootstrapMenu.addItemListener(this);\r
400     distanceMenu.setLabel(MessageManager.getString("label.show_distances"));\r
401     distanceMenu.addItemListener(this);\r
402     placeholdersMenu.setLabel(MessageManager\r
403             .getString("label.mark_unassociated_leaves"));\r
404     placeholdersMenu.addItemListener(this);\r
405     fitToWindow.setState(true);\r
406     fitToWindow.setLabel(MessageManager.getString("label.fit_to_window"));\r
407     fitToWindow.addItemListener(this);\r
408     fileMenu.setLabel(MessageManager.getString("action.file"));\r
409     newickOutput.setLabel(MessageManager.getString("label.newick_format"));\r
410     newickOutput.addActionListener(this);\r
411     inputData.setLabel(MessageManager.getString("label.input_data"));\r
412 \r
413     add(scrollPane, BorderLayout.CENTER);\r
414     jMenuBar1.add(fileMenu);\r
415     jMenuBar1.add(jMenu2);\r
416     jMenu2.add(fitToWindow);\r
417     jMenu2.add(fontSize);\r
418     jMenu2.add(distanceMenu);\r
419     jMenu2.add(bootstrapMenu);\r
420     jMenu2.add(placeholdersMenu);\r
421     fileMenu.add(newickOutput);\r
422     fileMenu.add(inputData);\r
423     inputData.addActionListener(this);\r
424   }\r
425 \r
426 }\r