2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
3 * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
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.
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.
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
24 import javax.imageio.*;
27 import java.awt.event.*;
28 import java.awt.image.*;
31 import org.jibble.epsgraphics.*;
32 import jalview.analysis.*;
33 import jalview.datamodel.*;
35 import jalview.jbgui.*;
43 public class TreePanel
48 TreeCanvas treeCanvas;
53 * Creates a new TreePanel object.
55 * @param av DOCUMENT ME!
56 * @param seqVector DOCUMENT ME!
57 * @param type DOCUMENT ME!
58 * @param pwtype DOCUMENT ME!
59 * @param s DOCUMENT ME!
60 * @param e DOCUMENT ME!
62 public TreePanel(AlignmentPanel ap, String type, String pwtype)
65 initTreePanel(ap, type, pwtype, null, null);
67 // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default
68 // showDistances(true);
72 * Creates a new TreePanel object.
74 * @param av DOCUMENT ME!
75 * @param seqVector DOCUMENT ME!
76 * @param newtree DOCUMENT ME!
77 * @param type DOCUMENT ME!
78 * @param pwtype DOCUMENT ME!
80 public TreePanel(AlignmentPanel ap,
86 initTreePanel(ap, type, pwtype, newtree, null);
89 public TreePanel(AlignmentPanel av,
92 NewickFile newtree, AlignmentView inputData)
95 initTreePanel(av, type, pwtype, newtree, inputData);
98 public AlignmentI getAlignment()
100 return treeCanvas.av.getAlignment();
103 public AlignViewport getViewPort()
105 return treeCanvas.av;
108 void initTreePanel(AlignmentPanel ap, String type, String pwtype,
109 NewickFile newTree, AlignmentView inputData)
114 this.pwtype = pwtype;
116 treeCanvas = new TreeCanvas(this, ap, scrollPane);
117 scrollPane.setViewportView(treeCanvas);
119 PaintRefresher.Register(this, ap.av.getSequenceSetId());
121 buildAssociatedViewMenu();
123 av.addPropertyChangeListener(new java.beans.PropertyChangeListener()
125 public void propertyChange(PropertyChangeEvent evt)
127 if (evt.getPropertyName().equals("alignment"))
131 System.out.println("tree is null");
133 if (evt.getNewValue() == null)
135 System.out.println("new alignment sequences vector value is null");
138 tree.UpdatePlaceHolders( (Vector) evt.getNewValue());
139 treeCanvas.nameHash.clear(); // reset the mapping between canvas rectangles and leafnodes
145 TreeLoader tl = new TreeLoader(newTree);
146 if (inputData != null)
148 tl.odata = inputData;
154 public void viewMenu_menuSelected()
156 buildAssociatedViewMenu();
159 void buildAssociatedViewMenu()
161 AlignmentPanel[] aps = PaintRefresher.getAssociatedPanels(av.
163 if (aps.length == 1 && treeCanvas.ap == aps[0])
165 associateLeavesMenu.setVisible(false);
169 associateLeavesMenu.setVisible(true);
171 if ( (viewMenu.getItem(viewMenu.getItemCount() - 2) instanceof JMenuItem))
173 viewMenu.insertSeparator(viewMenu.getItemCount() - 1);
176 associateLeavesMenu.removeAll();
178 JRadioButtonMenuItem item;
179 ButtonGroup buttonGroup = new ButtonGroup();
180 int i, iSize = aps.length;
181 final TreePanel thisTreePanel = this;
182 for (i = 0; i < iSize; i++)
184 final AlignmentPanel ap = aps[i];
185 item = new JRadioButtonMenuItem(ap.av.viewName, ap == treeCanvas.ap);
186 buttonGroup.add(item);
187 item.addActionListener(new ActionListener()
189 public void actionPerformed(ActionEvent evt)
191 treeCanvas.applyToAllViews = false;
193 treeCanvas.av = ap.av;
194 PaintRefresher.Register(thisTreePanel, ap.av.getSequenceSetId());
198 associateLeavesMenu.add(item);
201 final JRadioButtonMenuItem itemf = new JRadioButtonMenuItem("All Views");
202 buttonGroup.add(itemf);
203 itemf.setSelected(treeCanvas.applyToAllViews);
204 itemf.addActionListener(new ActionListener()
206 public void actionPerformed(ActionEvent evt)
208 treeCanvas.applyToAllViews = itemf.isSelected();
211 associateLeavesMenu.add(itemf);
219 jalview.datamodel.AlignmentView odata = null;
220 public TreeLoader(NewickFile newtree)
222 this.newtree = newtree;
225 // Must be outside run(), as Jalview2XML tries to
226 // update distance/bootstrap visibility at the same time
227 showBootstrap(newtree.HasBootstrap());
228 showDistances(newtree.HasDistances());
239 tree = new NJTree(av.alignment.getSequencesArray(),
244 tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);
246 if (!tree.hasOriginalSequenceData())
248 allowOriginalSeqData(false);
255 AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup() != null);
256 if (av.getSelectionGroup() == null)
259 end = av.alignment.getWidth();
260 seqs = av.alignment.getSequencesArray();
264 start = av.getSelectionGroup().getStartRes();
265 end = av.getSelectionGroup().getEndRes() + 1;
266 seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
269 tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
273 tree.reCount(tree.getTopNode());
274 tree.findHeight(tree.getTopNode());
275 treeCanvas.setTree(tree);
276 treeCanvas.repaint();
277 av.setCurrentTree(tree);
282 public void showDistances(boolean b)
284 treeCanvas.setShowDistances(b);
285 distanceMenu.setSelected(b);
288 public void showBootstrap(boolean b)
290 treeCanvas.setShowBootstrap(b);
291 bootstrapMenu.setSelected(b);
294 public void showPlaceholders(boolean b)
296 placeholdersMenu.setState(b);
297 treeCanvas.setMarkPlaceholders(b);
300 private void allowOriginalSeqData(boolean b)
302 originalSeqData.setVisible(b);
308 * @return DOCUMENT ME!
310 public NJTree getTree()
318 * @param e DOCUMENT ME!
320 public void textbox_actionPerformed(ActionEvent e)
322 CutAndPasteTransfer cap = new CutAndPasteTransfer();
324 StringBuffer buffer = new StringBuffer();
326 if (type.equals("AV"))
328 buffer.append("Average distance tree using ");
332 buffer.append("Neighbour joining tree using ");
335 if (pwtype.equals("BL"))
337 buffer.append("BLOSUM62");
341 buffer.append("PID");
344 Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);
346 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());
347 cap.setText(fout.print(tree.isHasBootstrap(), tree.isHasDistances(),
348 tree.isHasRootDistance()));
354 * @param e DOCUMENT ME!
356 public void saveAsNewick_actionPerformed(ActionEvent e)
358 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.
361 chooser.setFileView(new JalviewFileView());
362 chooser.setDialogTitle("Save tree as newick file");
363 chooser.setToolTipText("Save");
365 int value = chooser.showSaveDialog(null);
367 if (value == JalviewFileChooser.APPROVE_OPTION)
369 String choice = chooser.getSelectedFile().getPath();
370 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
371 chooser.getSelectedFile().getParent());
375 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());
376 String output = fout.print(tree.isHasBootstrap(), tree.isHasDistances(),
377 tree.isHasRootDistance());
378 java.io.PrintWriter out = new java.io.PrintWriter(new java.io.
386 ex.printStackTrace();
394 * @param e DOCUMENT ME!
396 public void printMenu_actionPerformed(ActionEvent e)
398 //Putting in a thread avoids Swing painting problems
399 treeCanvas.startPrinting();
402 public void originalSeqData_actionPerformed(ActionEvent e)
404 if (!tree.hasOriginalSequenceData())
406 jalview.bin.Cache.log.info("Unexpected call to originalSeqData_actionPerformed - should have hidden this menu action.");
409 // decide if av alignment is sufficiently different to original data to warrant a new window to be created
410 // create new alignmnt window with hidden regions (unhiding hidden regions yields unaligned seqs)
411 // or create a selection box around columns in alignment view
412 // test Alignment(SeqCigar[])
415 // we try to get the associated view's gap character
416 // but this may fail if the view was closed...
420 } catch (Exception ex) {};
421 Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(gc);
423 if (alAndColsel != null && alAndColsel[0] != null)
425 // AlignmentOrder origorder = new AlignmentOrder(alAndColsel[0]);
427 Alignment al = new Alignment( (SequenceI[]) alAndColsel[0]);
428 Alignment dataset = (av!=null && av.getAlignment()!=null) ? av.getAlignment().getDataset() : null;
431 al.setDataset(dataset);
437 AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1],
438 AlignFrame.DEFAULT_WIDTH,
439 AlignFrame.DEFAULT_HEIGHT
442 //>>>This is a fix for the moment, until a better solution is found!!<<<
443 // af.getFeatureRenderer().transferSettings(alignFrame.getFeatureRenderer());
445 // af.addSortByOrderMenuItem(ServiceName + " Ordering",
448 Desktop.addInternalFrame(af, "Original Data for " + this.title,
449 AlignFrame.DEFAULT_WIDTH,
450 AlignFrame.DEFAULT_HEIGHT);
458 * @param e DOCUMENT ME!
460 public void fitToWindow_actionPerformed(ActionEvent e)
462 treeCanvas.fitToWindow = fitToWindow.isSelected();
469 * @param e DOCUMENT ME!
471 public void font_actionPerformed(ActionEvent e)
473 if (treeCanvas == null)
478 new FontChooser(this);
481 public Font getTreeFont()
483 return treeCanvas.font;
486 public void setTreeFont(Font font)
488 if (treeCanvas != null)
490 treeCanvas.setFont(font);
497 * @param e DOCUMENT ME!
499 public void distanceMenu_actionPerformed(ActionEvent e)
501 treeCanvas.setShowDistances(distanceMenu.isSelected());
507 * @param e DOCUMENT ME!
509 public void bootstrapMenu_actionPerformed(ActionEvent e)
511 treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());
517 * @param e DOCUMENT ME!
519 public void placeholdersMenu_actionPerformed(ActionEvent e)
521 treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());
527 * @param e DOCUMENT ME!
529 public void epsTree_actionPerformed(ActionEvent e)
531 boolean accurateText = true;
533 String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
536 // If we need to prompt, and if the GUI is visible then
537 // Prompt for EPS rendering style
538 if (renderStyle.equalsIgnoreCase("Prompt each time")
540 (System.getProperty("java.awt.headless") != null
541 && System.getProperty("java.awt.headless").equals("true")))
543 EPSOptions eps = new EPSOptions();
544 renderStyle = eps.getValue();
546 if (renderStyle == null || eps.cancelled)
553 if (renderStyle.equalsIgnoreCase("text"))
555 accurateText = false;
558 int width = treeCanvas.getWidth();
559 int height = treeCanvas.getHeight();
563 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
564 jalview.bin.Cache.getProperty(
565 "LAST_DIRECTORY"), new String[]
568 {"Encapsulated Postscript"},
569 "Encapsulated Postscript");
570 chooser.setFileView(new jalview.io.JalviewFileView());
571 chooser.setDialogTitle("Create EPS file from tree");
572 chooser.setToolTipText("Save");
574 int value = chooser.showSaveDialog(this);
576 if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)
581 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
582 chooser.getSelectedFile().getParent());
584 FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());
585 EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
588 pg.setAccurateTextMode(accurateText);
590 treeCanvas.draw(pg, width, height);
597 ex.printStackTrace();
604 * @param e DOCUMENT ME!
606 public void pngTree_actionPerformed(ActionEvent e)
608 int width = treeCanvas.getWidth();
609 int height = treeCanvas.getHeight();
613 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(
614 jalview.bin.Cache.getProperty(
615 "LAST_DIRECTORY"), new String[]
618 {"Portable network graphics"},
619 "Portable network graphics");
621 chooser.setFileView(new jalview.io.JalviewFileView());
622 chooser.setDialogTitle("Create PNG image from tree");
623 chooser.setToolTipText("Save");
625 int value = chooser.showSaveDialog(this);
627 if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)
632 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
633 chooser.getSelectedFile().getParent());
635 FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());
637 BufferedImage bi = new BufferedImage(width, height,
638 BufferedImage.TYPE_INT_RGB);
639 Graphics png = bi.getGraphics();
641 treeCanvas.draw(png, width, height);
643 ImageIO.write(bi, "png", out);
648 ex.printStackTrace();