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