2 * Jalview - A Sequence Alignment Editor and Viewer
3 * Copyright (C) 2006 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
21 import jalview.analysis.*;
23 import jalview.datamodel.*;
27 import jalview.jbgui.*;
29 import org.jibble.epsgraphics.*;
32 import java.awt.event.*;
33 import java.awt.image.*;
39 import javax.imageio.*;
41 import java.beans.PropertyChangeEvent;
50 public class TreePanel extends GTreePanel
54 TreeCanvas treeCanvas;
59 * Creates a new TreePanel object.
61 * @param av DOCUMENT ME!
62 * @param seqVector DOCUMENT ME!
63 * @param type DOCUMENT ME!
64 * @param pwtype DOCUMENT ME!
65 * @param s DOCUMENT ME!
66 * @param e DOCUMENT ME!
68 public TreePanel(AlignmentPanel ap, String type, String pwtype)
71 initTreePanel(ap, type, pwtype, null, null);
73 // We know this tree has distances. JBPNote TODO: prolly should add this as a userdefined default
74 // showDistances(true);
78 * Creates a new TreePanel object.
80 * @param av DOCUMENT ME!
81 * @param seqVector DOCUMENT ME!
82 * @param newtree DOCUMENT ME!
83 * @param type DOCUMENT ME!
84 * @param pwtype DOCUMENT ME!
86 public TreePanel(AlignmentPanel ap,
92 initTreePanel(ap, type, pwtype, newtree, null);
95 public TreePanel(AlignmentPanel av,
98 NewickFile newtree, AlignmentView inputData) {
100 initTreePanel(av,type,pwtype,newtree,inputData);
103 public AlignmentI getAlignment()
105 return treeCanvas.av.getAlignment();
107 public AlignViewport getViewPort() {
108 return treeCanvas.av;
111 void initTreePanel(AlignmentPanel ap, String type, String pwtype,
112 NewickFile newTree, AlignmentView inputData)
117 this.pwtype = pwtype;
119 treeCanvas = new TreeCanvas(ap, scrollPane);
120 scrollPane.setViewportView(treeCanvas);
122 av.addPropertyChangeListener(new java.beans.PropertyChangeListener()
124 public void propertyChange(PropertyChangeEvent evt)
126 if (evt.getPropertyName().equals("alignment"))
129 System.out.println("tree is null");
130 if(evt.getNewValue()==null)
131 System.out.println("new alignment sequences vector value is null");
133 tree.UpdatePlaceHolders( (Vector) evt.getNewValue());
134 treeCanvas.nameHash.clear(); // reset the mapping between canvas rectangles and leafnodes
140 TreeLoader tl = new TreeLoader(newTree);
141 if (inputData!=null) {
148 class TreeLoader extends Thread
151 jalview.datamodel.AlignmentView odata=null;
152 public TreeLoader(NewickFile newtree)
154 this.newtree = newtree;
157 // Must be outside run(), as Jalview2XML tries to
158 // update distance/bootstrap visibility at the same time
159 showBootstrap(newtree.HasBootstrap());
160 showDistances(newtree.HasDistances());
170 tree = new NJTree(av.alignment.getSequencesArray(),
173 tree = new NJTree(av.alignment.getSequencesArray(), odata, newtree);
175 if (!tree.hasOriginalSequenceData())
176 allowOriginalSeqData(false);
182 AlignmentView seqStrings = av.getAlignmentView(av.getSelectionGroup()!=null);
183 if(av.getSelectionGroup()==null)
186 end = av.alignment.getWidth();
187 seqs = av.alignment.getSequencesArray();
191 start = av.getSelectionGroup().getStartRes();
192 end = av.getSelectionGroup().getEndRes()+1;
193 seqs = av.getSelectionGroup().getSequencesInOrder(av.alignment);
196 tree = new NJTree(seqs, seqStrings, type, pwtype, start, end);
201 tree.reCount(tree.getTopNode());
202 tree.findHeight(tree.getTopNode());
203 treeCanvas.setTree(tree);
204 treeCanvas.repaint();
205 av.setCurrentTree(tree);
210 public void showDistances(boolean b)
212 treeCanvas.setShowDistances(b);
213 distanceMenu.setSelected(b);
216 public void showBootstrap(boolean b)
218 treeCanvas.setShowBootstrap(b);
219 bootstrapMenu.setSelected(b);
222 public void showPlaceholders(boolean b)
224 placeholdersMenu.setState(b);
225 treeCanvas.setMarkPlaceholders(b);
228 private void allowOriginalSeqData(boolean b) {
229 originalSeqData.setVisible(b);
237 * @return DOCUMENT ME!
239 public NJTree getTree()
248 * @param e DOCUMENT ME!
250 public void textbox_actionPerformed(ActionEvent e)
252 CutAndPasteTransfer cap = new CutAndPasteTransfer();
254 StringBuffer buffer = new StringBuffer();
256 if (type.equals("AV"))
258 buffer.append("Average distance tree using ");
262 buffer.append("Neighbour joining tree using ");
265 if (pwtype.equals("BL"))
267 buffer.append("BLOSUM62");
271 buffer.append("PID");
274 Desktop.addInternalFrame(cap, buffer.toString(), 500, 100);
276 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());
277 cap.setText(fout.print(tree.isHasBootstrap(), tree.isHasDistances(), tree.isHasRootDistance()));
283 * @param e DOCUMENT ME!
285 public void saveAsNewick_actionPerformed(ActionEvent e)
287 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
289 chooser.setFileView(new JalviewFileView());
290 chooser.setDialogTitle("Save tree as newick file");
291 chooser.setToolTipText("Save");
293 int value = chooser.showSaveDialog(null);
295 if (value == JalviewFileChooser.APPROVE_OPTION)
297 String choice = chooser.getSelectedFile().getPath();
298 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
299 chooser.getSelectedFile().getParent());
303 jalview.io.NewickFile fout = new jalview.io.NewickFile(tree.getTopNode());
304 String output = fout.print(tree.isHasBootstrap(), tree.isHasDistances(), tree.isHasRootDistance());
305 java.io.PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
312 ex.printStackTrace();
320 * @param e DOCUMENT ME!
322 public void printMenu_actionPerformed(ActionEvent e)
324 //Putting in a thread avoids Swing painting problems
325 treeCanvas.startPrinting();
329 public void originalSeqData_actionPerformed(ActionEvent e)
331 if (!tree.hasOriginalSequenceData())
333 jalview.bin.Cache.log.info("Unexpected call to originalSeqData_actionPerformed - should have hidden this menu action.");
336 // decide if av alignment is sufficiently different to original data to warrant a new window to be created
337 // create new alignmnt window with hidden regions (unhiding hidden regions yields unaligned seqs)
338 // or create a selection box around columns in alignment view
339 // test Alignment(SeqCigar[])
340 Object[] alAndColsel = tree.seqData.getAlignmentAndColumnSelection(av.
344 if (alAndColsel != null && alAndColsel[0]!=null)
346 // AlignmentOrder origorder = new AlignmentOrder(alAndColsel[0]);
348 Alignment al = new Alignment((SequenceI[]) alAndColsel[0]);
349 Alignment dataset = av.getAlignment().getDataset();
352 al.setDataset(dataset);
358 AlignFrame af = new AlignFrame(al, (ColumnSelection) alAndColsel[1],
359 AlignFrame.DEFAULT_WIDTH,
360 AlignFrame.DEFAULT_HEIGHT
363 //>>>This is a fix for the moment, until a better solution is found!!<<<
364 // af.getFeatureRenderer().transferSettings(alignFrame.getFeatureRenderer());
366 // af.addSortByOrderMenuItem(ServiceName + " Ordering",
369 Desktop.addInternalFrame(af, "Original Data for " + this.title,
370 AlignFrame.DEFAULT_WIDTH,
371 AlignFrame.DEFAULT_HEIGHT);
380 * @param e DOCUMENT ME!
382 public void fitToWindow_actionPerformed(ActionEvent e)
384 treeCanvas.fitToWindow = fitToWindow.isSelected();
391 * @param e DOCUMENT ME!
393 public void font_actionPerformed(ActionEvent e)
395 if (treeCanvas == null)
400 new FontChooser(this);
403 public Font getTreeFont()
405 return treeCanvas.font;
408 public void setTreeFont(Font font)
411 treeCanvas.setFont(font);
417 * @param e DOCUMENT ME!
419 public void distanceMenu_actionPerformed(ActionEvent e)
421 treeCanvas.setShowDistances(distanceMenu.isSelected());
427 * @param e DOCUMENT ME!
429 public void bootstrapMenu_actionPerformed(ActionEvent e)
431 treeCanvas.setShowBootstrap(bootstrapMenu.isSelected());
437 * @param e DOCUMENT ME!
439 public void placeholdersMenu_actionPerformed(ActionEvent e)
441 treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected());
447 * @param e DOCUMENT ME!
449 public void epsTree_actionPerformed(ActionEvent e)
451 boolean accurateText = true;
453 String renderStyle = jalview.bin.Cache.getDefault("EPS_RENDERING",
456 // If we need to prompt, and if the GUI is visible then
457 // Prompt for EPS rendering style
458 if (renderStyle.equalsIgnoreCase("Prompt each time")
460 (System.getProperty("java.awt.headless") != null
461 && System.getProperty("java.awt.headless").equals("true")))
463 EPSOptions eps = new EPSOptions();
464 renderStyle = eps.getValue();
466 if (renderStyle==null || eps.cancelled)
472 if (renderStyle.equalsIgnoreCase("text"))
474 accurateText = false;
477 int width = treeCanvas.getWidth();
478 int height = treeCanvas.getHeight();
482 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(
483 "LAST_DIRECTORY"), new String[] { "eps" },
484 new String[] { "Encapsulated Postscript" },
485 "Encapsulated Postscript");
486 chooser.setFileView(new jalview.io.JalviewFileView());
487 chooser.setDialogTitle("Create EPS file from tree");
488 chooser.setToolTipText("Save");
490 int value = chooser.showSaveDialog(this);
492 if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)
497 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
498 chooser.getSelectedFile().getParent());
500 FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());
501 EpsGraphics2D pg = new EpsGraphics2D("Tree", out, 0, 0, width,
504 pg.setAccurateTextMode(accurateText);
506 treeCanvas.draw(pg, width, height);
513 ex.printStackTrace();
520 * @param e DOCUMENT ME!
522 public void pngTree_actionPerformed(ActionEvent e)
524 int width = treeCanvas.getWidth();
525 int height = treeCanvas.getHeight();
529 jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser(jalview.bin.Cache.getProperty(
530 "LAST_DIRECTORY"), new String[] { "png" },
531 new String[] { "Portable network graphics" },
532 "Portable network graphics");
534 chooser.setFileView(new jalview.io.JalviewFileView());
535 chooser.setDialogTitle("Create PNG image from tree");
536 chooser.setToolTipText("Save");
538 int value = chooser.showSaveDialog(this);
540 if (value != jalview.io.JalviewFileChooser.APPROVE_OPTION)
545 jalview.bin.Cache.setProperty("LAST_DIRECTORY",
546 chooser.getSelectedFile().getParent());
548 FileOutputStream out = new FileOutputStream(chooser.getSelectedFile());
550 BufferedImage bi = new BufferedImage(width, height,
551 BufferedImage.TYPE_INT_RGB);
552 Graphics png = bi.getGraphics();
554 treeCanvas.draw(png, width, height);
556 ImageIO.write(bi, "png", out);
561 ex.printStackTrace();