/*
* JTreeDisplay.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.gui.tree;
import dr.evolution.tree.MutableTree;
import dr.evolution.tree.MutableTreeListener;
import dr.evolution.tree.Tree;
import dr.evolution.util.MutableTaxonList;
import dr.evolution.util.MutableTaxonListListener;
import dr.evolution.util.Taxon;
import dr.evolution.util.TaxonList;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
public class JTreeDisplay extends JComponent implements Printable,
MutableTreeListener,
MutableTaxonListListener {
/**
*
*/
private static final long serialVersionUID = 4845325190293249506L;
/** the tree */
protected Tree tree = null;
/** the tree painter */
private TreePainter treePainter = null;
public JTreeDisplay(TreePainter treePainter) {
this.treePainter = treePainter;
init();
}
/**
* @param tree the tree
*/
public JTreeDisplay(TreePainter treePainter, Tree tree) {
this.treePainter = treePainter;
init();
setTree(tree);
}
/**
* Called by all constructors.
*/
void init() {
// setBorder(BorderFactory.createLineBorder(Color.black, 1));
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
// adds a mouse listener
addMouseListener(new MListener());
// addMouseMotionListener(new MMListener());
}
/**
* Set the tree.
*/
public void setTree(Tree tree) {
this.tree = tree;
if (tree != null) {
if (tree instanceof MutableTree) {
((MutableTree)tree).addMutableTreeListener(this);
}
if (tree instanceof MutableTaxonList) {
((MutableTaxonList)tree).addMutableTaxonListListener(this);
}
}
repaint();
}
/**
* Set line style
*/
public void setLineStyle(Stroke lineStroke, Paint linePaint) {
treePainter.setLineStyle(lineStroke, linePaint);
repaint();
}
/**
* Set hilight style
*/
public void setHilightStyle(Stroke hilightStroke, Paint hilightPaint) {
treePainter.setHilightStyle(hilightStroke, hilightPaint);
repaint();
}
/**
* Set label style.
*/
public void setLabelStyle(Font labelFont, Paint labelPaint) {
treePainter.setLabelStyle(labelFont, labelPaint);
repaint();
}
/**
* Set hilight label style.
*/
public void setHilightLabelStyle(Font hilightLabelFont, Paint hilightLabelPaint) {
treePainter.setHilightLabelStyle(hilightLabelFont, hilightLabelPaint);
repaint();
}
public void paintComponent(Graphics g) {
if (tree == null) return;
Dimension size = getSize();
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
treePainter.paintTree(g2d, size, tree);
}
//********************************************************************
// Printable interface
//********************************************************************
public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return(NO_SUCH_PAGE);
} else {
Graphics2D g2d = (Graphics2D)g;
double x0 = pageFormat.getImageableX();
double y0 = pageFormat.getImageableY();
double w0 = pageFormat.getImageableWidth();
double h0 = pageFormat.getImageableHeight();
double w1 = getWidth();
double h1 = getHeight();
double scale;
if (w0 / w1 < h0 / h1) {
scale = w0 / w1;
} else {
scale = h0 /h1;
}
g2d.translate(x0, y0);
g2d.scale(scale, scale);
// Turn off double buffering
paint(g2d);
// Turn double buffering back on
return(PAGE_EXISTS);
}
}
//********************************************************************
// MutableTreeListener interface
//********************************************************************
public void treeChanged(Tree tree) { repaint(); }
//********************************************************************
// MutableTaxonListListener interface
//********************************************************************
public void taxonAdded(TaxonList taxonList, Taxon taxon) { repaint(); }
public void taxonRemoved(TaxonList taxonList, Taxon taxon) { repaint(); }
public void taxaChanged(TaxonList taxonList) { repaint(); }
/**
* Add a plot listener
*/
public void addListener(Listener listener) {
listeners.add(listener);
}
/**
* Tells tree listeners that a node has been clicked.
*/
protected void fireNodeClickedEvent(int node) {
for (int i=0; i < listeners.size(); i++) {
Listener listener = listeners.elementAt(i);
listener.nodeClicked(node);
}
}
// Listeners
private final java.util.Vector<Listener> listeners = new java.util.Vector<Listener>();
public interface Listener {
public void nodeClicked(int node);
}
public class Adaptor implements Listener {
public void nodeClicked(int node) { }
}
public class MListener extends MouseAdapter {
public void mouseClicked(MouseEvent me) {
int node = treePainter.findNodeAtPoint(me.getPoint());
fireNodeClickedEvent(node);
}
}
}