/*
* FigTreePanel.java
*
* Copyright (C) 2006-2014 Andrew Rambaut
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package figtree.panel;
import jam.controlpalettes.ControlPalette;
import javax.swing.*;
import java.awt.*;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
import figtree.treeviewer.painters.ScaleBarPainter;
import figtree.treeviewer.decorators.*;
import figtree.treeviewer.TreeViewer;
import jebl.evolution.graphs.Node;
import jebl.evolution.trees.Tree;
/**
* This is a panel that has a TreeViewer and a BasicControlPalette with
* the default Controllers and Painters.
*
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class FigTreePanel extends JPanel {
public enum Style {
DEFAULT,
SIMPLE,
MINIMAL,
ICARUS,
ICARUS_SMALL
}
public FigTreePanel(Style style) {
this(new SimpleTreeViewer(), new SimpleControlPalette(), null, style);
}
public FigTreePanel(final TreeViewer treeViewer,
ControlPalette controlPalette1,
ControlPalette controlPalette2,
Style style) {
this.treeViewer = treeViewer;
if (controlPalette1 != null) {
controlPalette1.getPanel().setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GRAY));
controlPalette1.getPanel().setBackground(new Color(231, 237, 246));
controlPalette1.getPanel().setOpaque(true);
}
if (controlPalette2 != null) {
controlPalette2.getPanel().setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY));
controlPalette2.getPanel().setBackground(new Color(231, 237, 246));
controlPalette2.getPanel().setOpaque(true);
}
// Create a tip label painter and its controller
final SimpleLabelPainter tipLabelPainter = new SimpleLabelPainter(SimpleLabelPainter.PainterIntent.TIP);
// Create a node label painter and its controller
final SimpleLabelPainter nodeLabelPainter = new SimpleLabelPainter(SimpleLabelPainter.PainterIntent.NODE);
nodeLabelPainter.setVisible(false);
final SimpleLabelPainter branchLabelPainter = new SimpleLabelPainter(SimpleLabelPainter.PainterIntent.BRANCH);
branchLabelPainter.setVisible(false);
setLayout(new BorderLayout());
switch (style) {
case DEFAULT:
if (controlPalette1 == null) {
throw new IllegalArgumentException("DEFAULT style requires a controlPalette");
}
controlPalette1.addController(new TreeViewerController(treeViewer));
controlPalette1.addController(new TreeAppearanceController(
treeViewer,
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter));
controlPalette1.addController(new TreesController(treeViewer));
controlPalette1.addController(new LabelPainterController(
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
treeViewer));
break;
case SIMPLE:
if (controlPalette1 == null) {
throw new IllegalArgumentException("SIMPLE style requires a controlPalette");
}
controlPalette1.addController(new TreeViewerController(treeViewer));
controlPalette1.addController(new TreeAppearanceController(
treeViewer,
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
true, true));
controlPalette1.addController(new LabelPainterController(
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
treeViewer));
break;
case MINIMAL:
break;
case ICARUS:
controlPalette1.addController(new TreeViewerController(treeViewer, true));
controlPalette1.addController(new TreeAppearanceController(
treeViewer,
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
true, false));
controlPalette1.addController(new LabelPainterController(
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
treeViewer));
controlPalette1.addController(new TreesController(treeViewer));
controlPalette2.addController(new TreeColouringController(treeViewer, "Clustering:"));
add(controlPalette2.getPanel(), BorderLayout.NORTH);
break;
case ICARUS_SMALL:
controlPalette1.addController(new TreeViewerController(treeViewer, true));
controlPalette1.addController(new TreeAppearanceController(
treeViewer,
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
true, false));
controlPalette2.addController(new TreeColouringController(treeViewer, "Clustering:"));
add(controlPalette2.getPanel(), BorderLayout.NORTH);
break;
}
treeViewer.setTipLabelPainter(tipLabelPainter);
treeViewer.setNodeLabelPainter(nodeLabelPainter);
treeViewer.setBranchLabelPainter(branchLabelPainter);
AttributableDecorator tipDecorator = new AttributableDecorator();
tipDecorator.setPaintAttributeName("!color");
tipDecorator.setFontAttributeName("!font");
tipLabelPainter.setTextDecorator(tipDecorator);
// Create a scale bar painter and its controller
final ScaleBarPainter scaleBarPainter = new ScaleBarPainter();
// controlPalette.addController(new ScaleBarPainterController(scaleBarPainter));
treeViewer.addScalePainter(scaleBarPainter);
add(treeViewer, BorderLayout.CENTER);
if (controlPalette1 != null) {
add(controlPalette1.getPanel(), BorderLayout.SOUTH);
}
}
public void setColourBy(String attribute) {
if (attribute == null) {
treeViewer.setBranchColouringDecorator(null, null);
treeViewer.setBranchDecorator(null, false);
} else {
Set<Node> nodes = new HashSet<Node>();
for (Tree tree : treeViewer.getTrees()) {
for (Node node : tree.getNodes()) {
nodes.add(node);
}
}
if (attribute != null && attribute.length() > 0) {
if (attribute.endsWith("*")) {
Decorator decorator = new DiscreteColourDecorator();
treeViewer.setBranchColouringDecorator(attribute.substring(0, attribute.length() - 2), decorator);
treeViewer.setBranchDecorator(null, false);
} else if (DiscreteColourDecorator.isDiscrete(attribute, nodes)) {
Decorator decorator = new HSBDiscreteColourDecorator(attribute, nodes);
treeViewer.setBranchColouringDecorator(null, null);
treeViewer.setBranchDecorator(decorator, false);
} else {
Decorator decorator = new InterpolatingColourDecorator(
new ContinuousScale(attribute, nodes),
new Color(192, 16, 0), new Color(0, 0, 0), new Color(0, 16, 192));
treeViewer.setBranchColouringDecorator(null, null);
treeViewer.setBranchDecorator(decorator, false);
}
}
}
}
public TreeViewer getTreeViewer() {
return treeViewer;
}
public void setTree(Tree tree) {
java.util.List<Tree> trees = new ArrayList<Tree>();
if (tree != null) {
trees.add(tree);
}
treeViewer.setTrees(trees);
}
private final TreeViewer treeViewer;
}