2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
\r
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
\r
5 * This file is part of Jalview.
\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
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
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
21 package jalview.appletgui;
\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
35 import java.awt.BorderLayout;
\r
36 import javax.swing.JCheckBoxMenuItem;
\r
37 import java.awt.Color;
\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
49 public class TreePanel extends EmbmenuFrame implements ActionListener,
\r
62 TreeCanvas treeCanvas;
\r
70 public NJTree getTree()
\r
75 public void finalize() throws Throwable
\r
83 * Creates a new TreePanel object.
\r
98 public TreePanel(AlignmentPanel ap, String type, String pwtype)
\r
103 this.setJMenuBar(jMenuBar1);
\r
104 } catch (Exception ex)
\r
106 ex.printStackTrace();
\r
109 initTreePanel(ap, type, pwtype, null);
\r
113 * Creates a new TreePanel object.
\r
126 public TreePanel(AlignmentPanel ap, String type, String pwtype,
\r
127 NewickFile newtree)
\r
132 this.setJMenuBar(jMenuBar1);
\r
133 } catch (Exception e)
\r
135 e.printStackTrace();
\r
138 initTreePanel(ap, type, pwtype, newtree);
\r
141 void initTreePanel(AlignmentPanel ap, String type, String pwtype,
\r
142 NewickFile newTree)
\r
148 this.pwtype = pwtype;
\r
150 treeCanvas = new TreeCanvas(ap, scrollPane);
\r
151 TreeLoader tl = new TreeLoader(newTree);
\r
153 embedMenuIfNeeded(treeCanvas);
\r
154 scrollPane.add(treeCanvas, BorderLayout.CENTER);
\r
157 void showOriginalData()
\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
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
177 Object[] alAndColsel = tree.seqData
\r
178 .getAlignmentAndColumnSelection(gc);
\r
180 if (alAndColsel != null && alAndColsel[0] != null)
\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
186 af.viewport.setHiddenColumns((ColumnSelection) alAndColsel[1]);
\r
191 System.out.println("Original Tree Data not available");
\r
195 class TreeLoader extends Thread
\r
197 NewickFile newtree;
\r
199 AlignmentView odata = null;
\r
201 public TreeLoader(NewickFile newtree)
\r
203 this.newtree = newtree;
\r
208 if (newtree != null)
\r
212 tree = new NJTree(av.getAlignment().getSequencesArray(), newtree);
\r
216 tree = new NJTree(av.getAlignment().getSequencesArray(), odata,
\r
225 boolean selview = av.getSelectionGroup() != null
\r
226 && av.getSelectionGroup().getSize() > 1;
\r
227 AlignmentView seqStrings = av.getAlignmentView(selview);
\r
231 end = av.getAlignment().getWidth();
\r
232 seqs = av.getAlignment().getSequencesArray();
\r
236 start = av.getSelectionGroup().getStartRes();
\r
237 end = av.getSelectionGroup().getEndRes() + 1;
\r
238 seqs = av.getSelectionGroup().getSequencesInOrder(
\r
239 av.getAlignment());
\r
241 ScoreModelI sm = ResidueProperties.getScoreModel(pwtype);
\r
242 if (sm instanceof ViewBasedAnalysisI)
\r
246 sm = sm.getClass().newInstance();
\r
247 ((ViewBasedAnalysisI) sm)
\r
248 .configureFromAlignmentView(treeCanvas.ap);
\r
249 } catch (Exception q)
\r
251 System.err.println("Couldn't create a scoremodel instance for "
\r
253 q.printStackTrace();
\r
255 tree = new NJTree(seqs, seqStrings, type, pwtype, sm, start, end);
\r
259 tree = new NJTree(seqs, seqStrings, type, pwtype, null, start,
\r
264 tree.reCount(tree.getTopNode());
\r
265 tree.findHeight(tree.getTopNode());
\r
266 treeCanvas.setTree(tree);
\r
267 if (newtree != null)
\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
285 treeCanvas.repaint();
\r
287 av.setCurrentTree(tree);
\r
292 public void actionPerformed(ActionEvent evt)
\r
294 if (evt.getSource() == newickOutput)
\r
296 newickOutput_actionPerformed();
\r
298 else if (evt.getSource() == fontSize)
\r
300 fontSize_actionPerformed();
\r
302 else if (evt.getSource() == inputData)
\r
304 showOriginalData();
\r
308 public void itemStateChanged(ItemEvent evt)
\r
310 if (evt.getSource() == fitToWindow)
\r
312 treeCanvas.fitToWindow = fitToWindow.getState();
\r
315 else if (evt.getSource() == distanceMenu)
\r
317 treeCanvas.setShowDistances(distanceMenu.getState());
\r
320 else if (evt.getSource() == bootstrapMenu)
\r
322 treeCanvas.setShowBootstrap(bootstrapMenu.getState());
\r
325 else if (evt.getSource() == placeholdersMenu)
\r
327 treeCanvas.setMarkPlaceholders(placeholdersMenu.getState());
\r
330 treeCanvas.repaint();
\r
333 public void newickOutput_actionPerformed()
\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
341 JalviewLite.addFrame(frame, type + " " + pwtype, 500, 100);
\r
344 public java.awt.Font getTreeFont()
\r
346 return treeCanvas.font;
\r
349 public void setTreeFont(java.awt.Font font)
\r
351 treeCanvas.font = font;
\r
352 treeCanvas.repaint();
\r
355 protected void fontSize_actionPerformed()
\r
357 if (treeCanvas == null)
\r
362 new FontChooser(this);
\r
365 BorderLayout borderLayout1 = new BorderLayout();
\r
367 protected JScrollPane scrollPane = new JScrollPane();
\r
369 JMenuBar jMenuBar1 = new JMenuBar();
\r
371 JMenu jMenu2 = new JMenu();
\r
373 protected JMenuItem fontSize = new JMenuItem();
\r
375 protected JCheckBoxMenuItem bootstrapMenu = new JCheckBoxMenuItem();
\r
377 protected JCheckBoxMenuItem distanceMenu = new JCheckBoxMenuItem();
\r
379 protected JCheckBoxMenuItem placeholdersMenu = new JCheckBoxMenuItem();
\r
381 protected JCheckBoxMenuItem fitToWindow = new JCheckBoxMenuItem();
\r
383 JMenu fileMenu = new JMenu();
\r
385 JMenuItem newickOutput = new JMenuItem();
\r
387 JMenuItem inputData = new JMenuItem();
\r
389 private void jbInit() throws Exception
\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
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