" +
"
FigTree
" +
diff -Nru figtree-1.4.2+dfsg/src/figtree/application/FigTreeFrame.java figtree-1.4.3+dfsg/src/figtree/application/FigTreeFrame.java
--- figtree-1.4.2+dfsg/src/figtree/application/FigTreeFrame.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/application/FigTreeFrame.java 2016-10-04 14:24:27.000000000 +0000
@@ -29,6 +29,7 @@
import figtree.treeviewer.decorators.DiscreteColourDecorator;
import figtree.treeviewer.decorators.HSBDiscreteColourDecorator;
import figtree.treeviewer.painters.StatesPainter;
+import jebl.evolution.align.Output;
import jebl.evolution.alignments.Alignment;
import jebl.evolution.alignments.BasicAlignment;
import jebl.evolution.graphs.Node;
@@ -52,6 +53,7 @@
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.svggen.SVGGraphics2DIOException;
import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Element;
import javax.imageio.ImageIO;
import javax.swing.*;
@@ -288,7 +290,7 @@
public void actionPerformed(ActionEvent e){
if (treeViewer.isRootingOn() && treeViewer.getRootingType() == TreePane.RootingType.USER_ROOTING) {
JOptionPane.showMessageDialog(FigTreeFrame.this, "Cannot switch trees when user rooting option is on.\n" +
- "Turn this option off to switch trees",
+ "Turn this option off to switch trees",
"Unable to switch trees",
JOptionPane.ERROR_MESSAGE);
@@ -308,7 +310,7 @@
public void actionPerformed(ActionEvent e){
if (treeViewer.isRootingOn() && treeViewer.getRootingType() == TreePane.RootingType.USER_ROOTING) {
JOptionPane.showMessageDialog(FigTreeFrame.this, "Cannot switch trees when user rooting option is on.\n" +
- "Turn this option off to switch trees",
+ "Turn this option off to switch trees",
"Unable to switch trees",
JOptionPane.ERROR_MESSAGE);
@@ -1216,27 +1218,16 @@
File file = new File(dialog.getDirectory(), dialog.getFile());
try {
- JComponent comp = treeViewer.getContentPane();
- switch (format) {
+ OutputStream stream = new FileOutputStream(file);
- case PNG:
- case GIF:
- case BMP:
- case JPEG:
- exportGraphicsFile(format, comp, file);
- break;
- case EPS:
- throw new UnsupportedOperationException("EPS not handled");
- case SVG:
- exportSVGFile(comp, file);
- break;
- case PDF:
- exportPDFFile(comp, file);
- break;
- default:
- throw new UnsupportedOperationException("Format not handled: " + format);
+ exportGraphics(format, treeViewer.getContentPane(), stream);
- }
+ stream.flush();
+ stream.close();
+ } catch(DocumentException de) {
+ JOptionPane.showMessageDialog(this, "Error writing PDF file: " + de,
+ "Export PDF Error",
+ JOptionPane.ERROR_MESSAGE);
} catch (IOException ioe) {
JOptionPane.showMessageDialog(this, "Error writing tree file: " + ioe.getMessage(),
"Export Error",
@@ -1247,7 +1238,30 @@
}
- private final void exportGraphicsFile(GraphicFormat format, JComponent component, File file) throws IOException {
+ public final static void exportGraphics(GraphicFormat format, JComponent comp, OutputStream stream) throws IOException, DocumentException {
+ switch (format) {
+
+ case PNG:
+ case GIF:
+ case BMP:
+ case JPEG:
+ exportGraphicsFile(format, comp, stream);
+ break;
+ case EPS:
+ throw new UnsupportedOperationException("EPS not handled");
+ case SVG:
+ exportSVGFile(comp, stream);
+ break;
+ case PDF:
+ exportPDFFile(comp, stream);
+ break;
+ default:
+ throw new UnsupportedOperationException("Format not handled: " + format);
+
+ }
+
+ }
+ private final static void exportGraphicsFile(GraphicFormat format, JComponent component, OutputStream stream) throws IOException {
int imageType = BufferedImage.TYPE_INT_RGB;
if (format == GraphicFormat.PNG) {
@@ -1263,10 +1277,10 @@
}
component.paint(g);
g.dispose();
- ImageIO.write(bi, format.getName(), file);
+ ImageIO.write(bi, format.getName(), stream);
}
- private final void exportSVGFile(JComponent component, File file) throws IOException {
+ private final static void exportSVGFile(JComponent component, OutputStream stream) throws IOException {
// Get a DOMImplementation and create an XML document
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
org.w3c.dom.Document document = domImpl.createDocument(null, "svg", null);
@@ -1275,50 +1289,46 @@
SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
component.paint(svgGenerator);
+ Element svgRoot = svgGenerator.getRoot();
+ Rectangle2D bounds = component.getBounds();
+ String viewBox = "0 0 " + bounds.getWidth() + " " + bounds.getHeight();
+ svgRoot.setAttributeNS(null, svgGenerator.SVG_VIEW_BOX_ATTRIBUTE, viewBox);
+ svgRoot.setAttributeNS(null, svgGenerator.SVG_WIDTH_ATTRIBUTE, Double.toString(bounds.getWidth()));
+ svgRoot.setAttributeNS(null, svgGenerator.SVG_HEIGHT_ATTRIBUTE, Double.toString(bounds.getHeight()));
// Write svg file
- OutputStream outputStream = new FileOutputStream(file);
- Writer out = new OutputStreamWriter(outputStream, "UTF-8");
- svgGenerator.stream(out, true /* use css */);
- outputStream.flush();
- outputStream.close();
+ Writer out = new OutputStreamWriter(stream, "UTF-8");
+ svgGenerator.stream(svgRoot, out, true /* use css */, false /* escaped */);
}
- public final void exportPDFFile(JComponent component, File file) {
- Rectangle2D bounds = treeViewer.getContentPane().getBounds();
+ public final static void exportPDFFile(JComponent component, OutputStream stream) throws DocumentException {
+ Rectangle2D bounds = component.getBounds();
Document document = new Document(new com.itextpdf
.text.Rectangle((float)bounds.getWidth(), (float)bounds.getHeight()));
- try {
- // step 2
- PdfWriter writer;
- writer = PdfWriter.getInstance(document, new FileOutputStream(file));
- // step 3
- document.open();
- // step 4
- PdfContentByte cb = writer.getDirectContent();
- PdfTemplate tp = cb.createTemplate((float)bounds.getWidth(), (float)bounds.getHeight());
- Graphics2D g2d = tp.createGraphics((float)bounds.getWidth(), (float)bounds.getHeight(), new DefaultFontMapper());
- component.print(g2d);
- g2d.dispose();
- cb.addTemplate(tp, 0, 0);
- }
- catch(DocumentException de) {
- JOptionPane.showMessageDialog(this, "Error writing PDF file: " + de,
- "Export PDF Error",
- JOptionPane.ERROR_MESSAGE);
- }
- catch (FileNotFoundException e) {
- JOptionPane.showMessageDialog(this, "Error writing PDF file: " + e,
- "Export PDF Error",
- JOptionPane.ERROR_MESSAGE);
- }
+ // step 2
+ PdfWriter writer;
+ writer = PdfWriter.getInstance(document, stream);
+ // step 3
+ document.open();
+ // step 4
+ PdfContentByte cb = writer.getDirectContent();
+ PdfTemplate tp = cb.createTemplate((float)bounds.getWidth(), (float)bounds.getHeight());
+ Graphics2D g2d = tp.createGraphics((float)bounds.getWidth(), (float)bounds.getHeight(), new DefaultFontMapper());
+ component.print(g2d);
+ g2d.dispose();
+ cb.addTemplate(tp, 0, 0);
+
document.close();
}
public void doCopy() {
StringWriter writer = new StringWriter();
try {
- writeTreeFile(writer, ExportTreeDialog.Format.NEXUS, true, false, false, true, true);
+ if (treeViewer.getSelectionMode() == TreePaneSelector.SelectionMode.TAXA) {
+ writeTaxa(writer);
+ } else {
+ writeTreeFile(writer, ExportTreeDialog.Format.NEXUS, true, false, false, true, true);
+ }
} catch (IOException e) {
e.printStackTrace();
}
@@ -1382,6 +1392,14 @@
treeViewer.selectAll();
}
+ protected void writeTaxa(Writer writer) throws IOException {
+ PrintWriter printWriter = new PrintWriter(writer);
+ for (Taxon taxon : treeViewer.getSelectedTaxa()) {
+ printWriter.println(taxon.getName());
+ }
+ writer.close();
+ }
+
protected void writeTreeFile(Writer writer, ExportTreeDialog.Format format,
boolean writeAllTrees,
boolean writeAsDisplayed,
@@ -1852,4 +1870,4 @@
private AnnotationDialog annotationDialog = null;
private AnnotationDialog copyAnnotationDialog = null;
private SelectAnnotationDialog selectAnnotationDialog = null;
-}
\ No newline at end of file
+}
diff -Nru figtree-1.4.2+dfsg/src/figtree/application/FigTreePanel.java figtree-1.4.3+dfsg/src/figtree/application/FigTreePanel.java
--- figtree-1.4.2+dfsg/src/figtree/application/FigTreePanel.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/application/FigTreePanel.java 2016-10-04 14:24:27.000000000 +0000
@@ -48,6 +48,8 @@
public final static int CONTROL_PALETTE_WIDTH = 200;
+ private final static boolean SEPARATE_NODE_SHAPE_PANELS = true;
+
public FigTreePanel(JFrame frame, final ExtendedTreeViewer treeViewer, ControlPalette controlPalette) {
this.treeViewer = treeViewer;
@@ -80,12 +82,30 @@
controlPalette.addController(new LabelPainterController("Tip Labels", "tipLabels", tipLabelPainter, frame, attributeColourController, treeViewer));
treeViewer.setTipLabelPainter(tipLabelPainter);
+ // Create a node shape painter and its controller
+ if (SEPARATE_NODE_SHAPE_PANELS) {
+ final NodeShapePainter tipNodeShapePainter = new NodeShapePainter();
+ tipNodeShapePainter.setVisible(false);
+ controlPalette.addController(new NodeShapeController("Tip Shapes", NodeShapeController.NodeType.EXTERNAL, tipNodeShapePainter, attributeColourController, treeViewer));
+ treeViewer.setTipShapePainter(tipNodeShapePainter);
+ }
// Create a node label painter and its controller
final BasicLabelPainter nodeLabelPainter = new BasicLabelPainter(BasicLabelPainter.PainterIntent.NODE);
nodeLabelPainter.setVisible(false);
controlPalette.addController(new LabelPainterController("Node Labels", "nodeLabels", nodeLabelPainter, frame, attributeColourController, treeViewer));
treeViewer.setNodeLabelPainter(nodeLabelPainter);
+ // Create a node shape painter and its controller
+ final NodeShapePainter nodeShapePainter = new NodeShapePainter();
+ nodeShapePainter.setVisible(false);
+ controlPalette.addController(new NodeShapeController("Node Shapes",
+ (SEPARATE_NODE_SHAPE_PANELS ? NodeShapeController.NodeType.INTERNAL : NodeShapeController.NodeType.BOTH),
+ nodeShapePainter, attributeColourController, treeViewer));
+ if (!SEPARATE_NODE_SHAPE_PANELS) {
+ treeViewer.setTipShapePainter(nodeShapePainter);
+ }
+ treeViewer.setNodeShapePainter(nodeShapePainter);
+
// Create a node bar painter and its controller
final NodeBarPainter nodeBarPainter = new NodeBarPainter();
nodeBarPainter.setForeground(new Color(24, 32, 228, 128));
@@ -93,12 +113,6 @@
controlPalette.addController(new NodeBarController("Node Bars", nodeBarPainter, treeViewer));
treeViewer.setNodeBarPainter(nodeBarPainter);
- // Create a node shape painter and its controller
- final NodeShapePainter nodeShapePainter = new NodeShapePainter();
- nodeShapePainter.setVisible(false);
- controlPalette.addController(new NodeShapeController("Node Shapes", nodeShapePainter, attributeColourController, treeViewer));
- treeViewer.setNodeShapePainter(nodeShapePainter);
-
// Create a branch label painter and its controller
final BasicLabelPainter branchLabelPainter = new BasicLabelPainter(BasicLabelPainter.PainterIntent.BRANCH);
branchLabelPainter.setVisible(false);
@@ -193,17 +207,17 @@
if (utilityPanel == null) {
return;
}
- slideOpenPanel.showUtilityPanel(utilityPanel);
+ slideOpenPanel.showUtilityPanel(utilityPanel);
}
- public void hideUtilityPanel() {
- slideOpenPanel.hideUtilityPanel();
- }
+ public void hideUtilityPanel() {
+ slideOpenPanel.hideUtilityPanel();
+ }
- public JPanel getUtilityPanel() {
- return slideOpenPanel.getUtilityPanel();
- }
+ public JPanel getUtilityPanel() {
+ return slideOpenPanel.getUtilityPanel();
+ }
public void toggleMidpointRoot() {
treesController.toggleMidpointRoot();
diff -Nru figtree-1.4.2+dfsg/src/figtree/application/FigTreePDF.java figtree-1.4.3+dfsg/src/figtree/application/FigTreePDF.java
--- figtree-1.4.2+dfsg/src/figtree/application/FigTreePDF.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/application/FigTreePDF.java 1970-01-01 00:00:00.000000000 +0000
@@ -1,205 +0,0 @@
-/*
- * FigTreePDF.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.
- */
-
-/**
- * TracerApp.java
- *
- * Title: Tracer
- * Description: An application for analysing MCMC trace files.
- * @author Andrew Rambaut
- * @author Alexei Drummond
- * @version $Id: FigTreeApplication.java,v 1.15 2007/09/10 14:52:02 rambaut Exp $
- */
-
-package figtree.application;
-
-import com.itextpdf.text.Document;
-import com.itextpdf.text.pdf.PdfContentByte;
-import com.itextpdf.text.pdf.PdfTemplate;
-import com.itextpdf.text.pdf.PdfWriter;
-import figtree.treeviewer.ExtendedTreeViewer;
-import jam.controlpalettes.BasicControlPalette;
-import jam.controlpalettes.ControlPalette;
-
-import java.io.*;
-import java.util.*;
-import java.util.List;
-import java.awt.*;
-
-import jebl.evolution.io.ImportException;
-import jebl.evolution.io.NewickImporter;
-import jebl.evolution.trees.Tree;
-
-/**
- * Commandline main() to generate PDF graphics from FigTree trees.
- *
- * @author Andrew Rambaut
- * @version $Id$
- *
- * $HeadURL$
- *
- * $LastChangedBy$
- * $LastChangedDate$
- * $LastChangedRevision$
- */
-public class FigTreePDF {
-
- public static final String VERSION = "1.4.1";
- public static final String DATES = "2006-2014";
-
- static public void createGraphic(int width, int height, String treeFileName, String graphicFileName) {
-
- try {
- BufferedReader bufferedReader = new BufferedReader(new FileReader(treeFileName));
- String line = bufferedReader.readLine();
- while (line != null && line.length() == 0) {
- line = bufferedReader.readLine();
- }
-
- bufferedReader.close();
-
- boolean isNexus = (line != null && line.toUpperCase().contains("#NEXUS"));
-
- Reader reader = new FileReader(treeFileName);
-
- Map
settings = new HashMap();
-
- ExtendedTreeViewer treeViewer = new ExtendedTreeViewer();
- ControlPalette controlPalette = new BasicControlPalette(200, BasicControlPalette.DisplayMode.ONLY_ONE_OPEN);
- FigTreePanel figTreePanel = new FigTreePanel(null, treeViewer, controlPalette);
-
- // First of all, fully populate the settings map so that
- // all the settings have defaults
- controlPalette.getSettings(settings);
-
- List trees = new ArrayList();
-
- if (isNexus) {
- FigTreeNexusImporter importer = new FigTreeNexusImporter(reader);
- trees.add(importer.importNextTree());
-
- // Try to find a figtree block and if found, parse the settings
- while (true) {
- try {
- importer.findNextBlock();
- if (importer.getNextBlockName().equalsIgnoreCase("FIGTREE")) {
- importer.parseFigTreeBlock(settings);
- }
- } catch (EOFException ex) {
- break;
- }
- }
- } else {
- NewickImporter importer = new NewickImporter(reader, true);
- trees.add(importer.importNextTree());
- }
-
- if (trees.size() == 0) {
- throw new ImportException("This file contained no trees.");
- }
-
- treeViewer.setTrees(trees);
-
- controlPalette.setSettings(settings);
-
- treeViewer.getContentPane().setSize(width, height);
-
- OutputStream stream;
- if (graphicFileName != null) {
- stream = new FileOutputStream(graphicFileName);
- } else {
- stream = System.out;
- }
-
- Document document = new Document();
- document.setPageSize(new com.itextpdf.text.Rectangle(width, height));
- try {
- PdfWriter writer = PdfWriter.getInstance(document, stream);
- document.open();
- PdfContentByte cb = writer.getDirectContent();
- PdfTemplate tp = cb.createTemplate(width, height);
- Graphics2D g2 = tp.createGraphics(width, height);
- tp.setWidth(width);
- tp.setHeight(height);
- treeViewer.getContentPane().print(g2);
- g2.dispose();
- tp.sanityCheck(); // all the g2 content is written to tp, not cb
- cb.addTemplate(tp, 0, 0);
- cb.sanityCheck();
- } catch (Exception e) {
- System.err.println(e.getMessage());
- }
- document.close();
-
- } catch(ImportException ie) {
- throw new RuntimeException("Error writing graphic file: " + ie);
- } catch(IOException ioe) {
- throw new RuntimeException("Error writing graphic file: " + ioe);
- }
-
- }
-
- // Main entry point
- static public void main(String[] args) {
-
- Arguments arguments = new Arguments(
- new Arguments.Option[] {
- new Arguments.IntegerOption("width", "the width of the graphic in pixels"),
- new Arguments.IntegerOption("height", "the height of the graphic in pixels")
- });
-
- try {
- arguments.parseArguments(args);
- } catch (Arguments.ArgumentException ae) {
- System.out.println();
- System.out.println(ae.getMessage());
- System.out.println();
- System.exit(1);
- }
-
-
- int width = 800;
- int height = 600;
-
- if (arguments.hasOption("width")) {
- width = arguments.getIntegerOption("width");
- }
-
- if (arguments.hasOption("height")) {
- height = arguments.getIntegerOption("height");
- }
-
- // command line version...
- String[] args2 = arguments.getLeftoverArguments();
-
- if (args2.length == 0) {
- // no tree file specified
- System.exit(0);
- } else if (args2.length == 1) {
- // no graphic file specified - write to stdout
- createGraphic(width, height, args2[0], (args2.length > 1 ? args2[1] : null));
- System.exit(0);
- } else {
- createGraphic(width, height, args2[0], (args2.length > 1 ? args2[1] : null));
- System.exit(0);
- }
- }
-}
-
diff -Nru figtree-1.4.2+dfsg/src/figtree/application/JSONTreeExporter.java figtree-1.4.3+dfsg/src/figtree/application/JSONTreeExporter.java
--- figtree-1.4.2+dfsg/src/figtree/application/JSONTreeExporter.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/application/JSONTreeExporter.java 2016-10-04 14:24:27.000000000 +0000
@@ -56,7 +56,8 @@
public class JSONTreeExporter implements TreeExporter {
public static final String treeNameAttributeKey = "name";
- public final static Set ATTRIBUTE_NAMES = new TreeSet(Arrays.asList(new String[] { "location", "host", "Hx", "Nx", "posterior" }));
+ public final static Set ATTRIBUTE_NAMES = new TreeSet(Arrays.asList(new String[] {
+ "location", "host", "Hx", "Nx", "posterior", "country", "region" }));
public final static String ORIGIN = "2013.34520547945";
public JSONTreeExporter(Writer writer) {
diff -Nru figtree-1.4.2+dfsg/src/figtree/panel/FigTreePanel.java figtree-1.4.3+dfsg/src/figtree/panel/FigTreePanel.java
--- figtree-1.4.2+dfsg/src/figtree/panel/FigTreePanel.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/panel/FigTreePanel.java 2016-10-04 14:24:27.000000000 +0000
@@ -121,7 +121,8 @@
treeViewer,
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
- "branchLabels", branchLabelPainter));
+ "branchLabels", branchLabelPainter,
+ true, true));
controlPalette1.addController(new LabelPainterController(
"tipLabels", tipLabelPainter,
@@ -139,7 +140,7 @@
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
- true));
+ true, false));
controlPalette1.addController(new LabelPainterController(
"tipLabels", tipLabelPainter,
@@ -160,7 +161,7 @@
"tipLabels", tipLabelPainter,
"nodeLabels", nodeLabelPainter,
"branchLabels", branchLabelPainter,
- true));
+ true, false));
controlPalette2.addController(new TreeColouringController(treeViewer, "Clustering:"));
add(controlPalette2.getPanel(), BorderLayout.NORTH);
diff -Nru figtree-1.4.2+dfsg/src/figtree/panel/LabelPainterController.java figtree-1.4.3+dfsg/src/figtree/panel/LabelPainterController.java
--- figtree-1.4.2+dfsg/src/figtree/panel/LabelPainterController.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/panel/LabelPainterController.java 2016-10-04 14:24:27.000000000 +0000
@@ -22,6 +22,7 @@
import figtree.treeviewer.TreeViewer;
import figtree.treeviewer.painters.AttributeComboHelper;
+import figtree.treeviewer.painters.AttributeComboHelperListener;
import jam.controlpalettes.AbstractController;
import jam.panels.OptionsPanel;
@@ -31,7 +32,6 @@
import java.util.Map;
import figtree.treeviewer.painters.LabelPainter;
-import sun.jvm.hotspot.tools.FinalizerInfo;
/**
* @author Andrew Rambaut
@@ -48,11 +48,11 @@
private static final String DISPLAY_ATTRIBUTE_KEY = "displayAttribute";
public LabelPainterController(String tipKey,
- final LabelPainter tipLabelPainter,
+ final SimpleLabelPainter tipLabelPainter,
String nodeKey,
- final LabelPainter nodeLabelPainter,
+ final SimpleLabelPainter nodeLabelPainter,
String branchKey,
- final LabelPainter branchLabelPainter,
+ final SimpleLabelPainter branchLabelPainter,
final TreeViewer treeViewer) {
this.tipKey = tipKey;
@@ -68,17 +68,20 @@
}
- private JComboBox setupComboBox(String title, final LabelPainter labelPainter, final TreeViewer treeViewer) {
+ private JComboBox setupComboBox(String title, final SimpleLabelPainter labelPainter, final TreeViewer treeViewer) {
// String[] attributes = labelPainter.getAttributes();
final JComboBox displayAttributeCombo = new JComboBox();
displayAttributeCombo.addItem("None");
- new AttributeComboHelper(displayAttributeCombo, treeViewer, "None");
+ for (String attribute : labelPainter.getAttributes()) {
+ displayAttributeCombo.addItem(attribute);
+ }
+ new AttributeComboHelper(displayAttributeCombo, treeViewer, "None", labelPainter.getIntent());
optionsPanel.addComponentWithLabel(title, displayAttributeCombo);
displayAttributeCombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
String attribute = (String)displayAttributeCombo.getSelectedItem();
- if (attribute.equals("none")) {
+ if (attribute == null || attribute.equalsIgnoreCase("none")) {
labelPainter.setVisible(false);
} else {
labelPainter.setDisplayAttribute(attribute);
diff -Nru figtree-1.4.2+dfsg/src/figtree/panel/SimpleLabelPainter.java figtree-1.4.3+dfsg/src/figtree/panel/SimpleLabelPainter.java
--- figtree-1.4.2+dfsg/src/figtree/panel/SimpleLabelPainter.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/panel/SimpleLabelPainter.java 2016-10-04 14:24:27.000000000 +0000
@@ -50,298 +50,296 @@
*/
public class SimpleLabelPainter extends LabelPainter {
- public static final String TAXON_NAMES = "Taxon names";
- public static final String NODE_AGES = "Node ages";
- public static final String BRANCH_LENGTHS = "Branch lengths";
+ public static final String NAMES = "Names";
+ public static final String NODE_AGES = "Node ages";
+ public static final String BRANCH_LENGTHS = "Branch lengths";
- public SimpleLabelPainter(PainterIntent intent) {
+ public SimpleLabelPainter(PainterIntent intent) {
super(intent);
- setupAttributes(null);
+ setupAttributes(null);
- if (this.displayAttribute == null) {
- this.displayAttribute = attributes[0];
- } else {
- this.displayAttribute = "";
- }
-
- }
-
- public void setupAttributes(Collection extends Tree> trees) {
-
- List attributeNames = new ArrayList();
- switch( intent ) {
- case TIP: {
- attributeNames.add(TAXON_NAMES);
- attributeNames.add(NODE_AGES);
- attributeNames.add(BRANCH_LENGTHS);
- break;
- }
- case NODE: {
- attributeNames.add(NODE_AGES);
- attributeNames.add(BRANCH_LENGTHS);
- break;
- }
- case BRANCH: {
- attributeNames.add(BRANCH_LENGTHS);
- attributeNames.add(NODE_AGES);
- break;
- }
- }
-
- if (trees != null) {
- for (Tree tree : trees) {
- Set nodeAttributes = new TreeSet();
- if (intent == PainterIntent.TIP) {
- for (Node node : tree.getExternalNodes()) {
- nodeAttributes.addAll(node.getAttributeNames());
- }
- } else if (intent == PainterIntent.NODE) {
- for (Node node : tree.getInternalNodes()) {
- nodeAttributes.addAll(node.getAttributeNames());
- }
- } else {
- for (Node node : tree.getNodes()) {
- nodeAttributes.addAll(node.getAttributeNames());
- }
- }
- for (String attributeName : nodeAttributes) {
- if (!attributeName.startsWith("!")) {
- attributeNames.add(attributeName);
- }
- }
- }
- }
-
- this.attributes = new String[attributeNames.size()];
- attributeNames.toArray(this.attributes);
-
- firePainterSettingsChanged();
- }
-
- public void setTreePane(TreePane treePane) {
- this.treePane = treePane;
- }
-
- public Decorator getBorderDecorator() {
- return borderDecorator;
- }
-
- public void setBorderDecorator(Decorator borderDecorator) {
- this.borderDecorator = borderDecorator;
- }
-
- public Decorator getTextDecorator() {
- return textDecorator;
- }
-
- public void setTextDecorator(Decorator textDecorator) {
- this.textDecorator = textDecorator;
- }
+ if (this.displayAttribute == null) {
+ this.displayAttribute = attributes[0];
+ } else {
+ this.displayAttribute = "";
+ }
+
+ }
+
+ public void setupAttributes(Collection extends Tree> trees) {
+
+ List attributeNames = new ArrayList();
+ switch (getIntent()) {
+ case TIP: {
+ attributeNames.add(NAMES);
+ attributeNames.add(NODE_AGES);
+ attributeNames.add(BRANCH_LENGTHS);
+ break;
+ }
+ case NODE: {
+ attributeNames.add(NODE_AGES);
+ attributeNames.add(BRANCH_LENGTHS);
+ break;
+ }
+ case BRANCH: {
+ attributeNames.add(BRANCH_LENGTHS);
+ attributeNames.add(NODE_AGES);
+ break;
+ }
+ }
+
+ if (trees != null) {
+ for (Tree tree : trees) {
+ Set nodeAttributes = new TreeSet();
+ if (getIntent() == PainterIntent.TIP) {
+ for (Node node : tree.getExternalNodes()) {
+ nodeAttributes.addAll(node.getAttributeNames());
+ }
+ } else if (getIntent() == PainterIntent.NODE) {
+ for (Node node : tree.getInternalNodes()) {
+ nodeAttributes.addAll(node.getAttributeNames());
+ }
+ } else {
+ for (Node node : tree.getNodes()) {
+ nodeAttributes.addAll(node.getAttributeNames());
+ }
+ }
+ for (String attributeName : nodeAttributes) {
+ if (!attributeName.startsWith("!")) {
+ attributeNames.add(attributeName);
+ }
+ }
+ }
+ }
+
+ this.attributes = new String[attributeNames.size()];
+ attributeNames.toArray(this.attributes);
+
+ firePainterSettingsChanged();
+ }
+
+ public void setTreePane(TreePane treePane) {
+ this.treePane = treePane;
+ }
+
+ public Decorator getBorderDecorator() {
+ return borderDecorator;
+ }
+
+ public void setBorderDecorator(Decorator borderDecorator) {
+ this.borderDecorator = borderDecorator;
+ }
+
+ public Decorator getTextDecorator() {
+ return textDecorator;
+ }
+
+ public void setTextDecorator(Decorator textDecorator) {
+ this.textDecorator = textDecorator;
+ }
public Set getAttributableItems() {
return null;
}
public Tree getTree() {
- return treePane.getTree();
- }
+ return treePane.getTree();
+ }
+
+ protected String getLabel(Tree tree, Node node) {
+ if (displayAttribute.equalsIgnoreCase(NAMES)) {
+ Taxon taxon = tree.getTaxon(node);
+ if (taxon != null) {
+ if (textDecorator != null) {
+ textDecorator.setItem(taxon);
+ }
+ return taxon.getName();
+ } else {
+ String name = (String)node.getAttribute("name");
+ if (name != null) {
+ return name;
+ }
+ return "unlabelled";
+ }
+ }
+
+ if ( tree instanceof RootedTree) {
+ final RootedTree rtree = (RootedTree) tree;
+
+ if (textDecorator != null) {
+ textDecorator.setItem(node);
+ }
+
+ if (displayAttribute.equalsIgnoreCase(NODE_AGES) ) {
+ return getNumberFormat().format(rtree.getHeight(node));
+ } else if (displayAttribute.equalsIgnoreCase(BRANCH_LENGTHS) ) {
+ return getNumberFormat().format(rtree.getLength(node));
+ }
+ }
+
+ return formatValue(node.getAttribute(displayAttribute));
+ }
+
+ private String formatValue(Object value) {
+ if (value != null) {
+ if (value instanceof Double) {
+ return getNumberFormat().format(value);
+ } else if (value instanceof Object[]) {
+ Object[] values = (Object[])value;
+
+ if (values.length == 0) return null;
+ if (values.length == 1) return formatValue(values[0]);
+
+ StringBuilder builder = new StringBuilder("[");
+ builder.append(formatValue(values[0]));
+ for (int i = 1; i < values.length; i++) {
+ builder.append(",");
+ builder.append(formatValue(values[i]));
+ }
+ builder.append("]");
+ return builder.toString();
+ }
+ return value.toString();
+ }
+ return null;
+ }
- protected String getLabel(Tree tree, Node node) {
- if (displayAttribute.equalsIgnoreCase(TAXON_NAMES)) {
- Taxon taxon = tree.getTaxon(node);
- if (taxon != null) {
- if (textDecorator != null) {
- textDecorator.setItem(taxon);
- }
- return taxon.getName();
- } else {
- String name = (String)node.getAttribute("name");
- if (name != null) {
- return name;
- }
- return "unlabelled";
- }
- }
-
- if ( tree instanceof RootedTree) {
- final RootedTree rtree = (RootedTree) tree;
-
- if (textDecorator != null) {
- textDecorator.setItem(node);
- }
-
- if (displayAttribute.equalsIgnoreCase(NODE_AGES) ) {
- return getNumberFormat().format(rtree.getHeight(node));
- } else if (displayAttribute.equalsIgnoreCase(BRANCH_LENGTHS) ) {
- return getNumberFormat().format(rtree.getLength(node));
- }
- }
-
- return formatValue(node.getAttribute(displayAttribute));
- }
-
- private String formatValue(Object value) {
- if (value != null) {
- if (value instanceof Double) {
- return getNumberFormat().format(value);
- } else if (value instanceof Object[]) {
- Object[] values = (Object[])value;
-
- if (values.length == 0) return null;
- if (values.length == 1) return formatValue(values[0]);
-
- StringBuilder builder = new StringBuilder("[");
- builder.append(formatValue(values[0]));
- for (int i = 1; i < values.length; i++) {
- builder.append(",");
- builder.append(formatValue(values[i]));
- }
- builder.append("]");
- return builder.toString();
- }
- return value.toString();
- }
- return null;
- }
-
- public Rectangle2D calibrate(Graphics2D g2, Node item) {
- Tree tree = treePane.getTree();
-
- String label = getLabel(tree, item);
-
- final Font oldFont = g2.getFont();
- if (textDecorator != null) {
- g2.setFont(textDecorator.getFont(getFont()));
- } else {
- g2.setFont(getFont());
- }
-
- FontMetrics fm = g2.getFontMetrics();
- preferredHeight = fm.getHeight();
- preferredWidth = 0;
-
- if (label != null) {
- Rectangle2D rect = fm.getStringBounds(label, g2);
- preferredWidth = rect.getWidth();
- }
-
- yOffset = (float)fm.getAscent();
-
- g2.setFont(oldFont);
-
- return new Rectangle2D.Double(0.0, 0.0, preferredWidth, preferredHeight);
- }
-
- public double getPreferredWidth() {
- return preferredWidth;
- }
-
- public double getPreferredHeight() {
- return preferredHeight;
- }
-
- public double getHeightBound() {
- return preferredHeight + yOffset;
- }
-
- public void paint(Graphics2D g2, Node item, Justification justification, Rectangle2D bounds) {
- Tree tree = treePane.getTree();
-
- if (TreePane.DEBUG_OUTLINE) {
- g2.setPaint(Color.red);
- g2.draw(bounds);
- }
-
- String label = getLabel(tree, item);
-
- Font oldFont = g2.getFont();
-
- Paint backgroundPaint = getBackground();
- Paint borderPaint = getBorderPaint();
- Stroke borderStroke = getBorderStroke();
-
- if (borderDecorator != null) {
- backgroundPaint = borderDecorator.getPaint(backgroundPaint);
- borderPaint = borderDecorator.getPaint(borderPaint);
- borderStroke = borderDecorator.getStroke(borderStroke);
- }
-
- if (backgroundPaint != null) {
- g2.setPaint(backgroundPaint);
- g2.fill(bounds);
- }
-
- if (borderPaint != null && borderStroke != null) {
- g2.setPaint(borderPaint);
- g2.setStroke(borderStroke);
- g2.draw(bounds);
- }
-
- if (textDecorator != null) {
- g2.setPaint(textDecorator.getPaint(getForeground()));
- g2.setFont(textDecorator.getFont(getFont()));
- } else {
- g2.setPaint(getForeground());
- g2.setFont(getFont());
- }
-
- if (label != null) {
-
- Rectangle2D rect = null;
- if (justification == Justification.CENTER || justification == Justification.RIGHT)
- rect = g2.getFontMetrics().getStringBounds(label, g2);
-
- float xOffset;
- float y = yOffset + (float) bounds.getY();
- switch (justification) {
- case CENTER:
- xOffset = (float)(-rect.getWidth()/2.0);
- y = yOffset + (float) rect.getY();
+ public Rectangle2D calibrate(Graphics2D g2, Node item) {
+ Tree tree = treePane.getTree();
+
+ String label = getLabel(tree, item);
+
+ final Font oldFont = g2.getFont();
+ if (textDecorator != null) {
+ g2.setFont(textDecorator.getFont(getFont()));
+ } else {
+ g2.setFont(getFont());
+ }
+
+ FontMetrics fm = g2.getFontMetrics();
+ preferredHeight = fm.getHeight();
+ preferredWidth = 0;
+
+ if (label != null) {
+ Rectangle2D rect = fm.getStringBounds(label, g2);
+ preferredWidth = rect.getWidth();
+ }
+
+ yOffset = (float)fm.getAscent();
+
+ g2.setFont(oldFont);
+
+ return new Rectangle2D.Double(0.0, 0.0, preferredWidth, preferredHeight);
+ }
+
+ public double getPreferredWidth() {
+ return preferredWidth;
+ }
+
+ public double getPreferredHeight() {
+ return preferredHeight;
+ }
+
+ public double getHeightBound() {
+ return preferredHeight + yOffset;
+ }
+
+ public void paint(Graphics2D g2, Node item, Justification justification, Rectangle2D bounds) {
+ Tree tree = treePane.getTree();
+
+ if (TreePane.DEBUG_OUTLINE) {
+ g2.setPaint(Color.red);
+ g2.draw(bounds);
+ }
+
+ String label = getLabel(tree, item);
+
+ Font oldFont = g2.getFont();
+
+ Paint backgroundPaint = getBackground();
+ Paint borderPaint = getBorderPaint();
+ Stroke borderStroke = getBorderStroke();
+
+ if (borderDecorator != null) {
+ backgroundPaint = borderDecorator.getPaint(backgroundPaint);
+ borderPaint = borderDecorator.getPaint(borderPaint);
+ borderStroke = borderDecorator.getStroke(borderStroke);
+ }
+
+ if (backgroundPaint != null) {
+ g2.setPaint(backgroundPaint);
+ g2.fill(bounds);
+ }
+
+ if (borderPaint != null && borderStroke != null) {
+ g2.setPaint(borderPaint);
+ g2.setStroke(borderStroke);
+ g2.draw(bounds);
+ }
+
+ if (textDecorator != null) {
+ g2.setPaint(textDecorator.getPaint(getForeground()));
+ g2.setFont(textDecorator.getFont(getFont()));
+ } else {
+ g2.setPaint(getForeground());
+ g2.setFont(getFont());
+ }
+
+ if (label != null) {
+
+ Rectangle2D rect = null;
+ if (justification == Justification.CENTER || justification == Justification.RIGHT)
+ rect = g2.getFontMetrics().getStringBounds(label, g2);
+
+ float xOffset;
+ float y = yOffset + (float) bounds.getY();
+ switch (justification) {
+ case CENTER:
+ xOffset = (float)(-rect.getWidth()/2.0);
+ y = yOffset + (float) rect.getY();
//xOffset = (float) (bounds.getX() + (bounds.getWidth() - rect.getWidth()) / 2.0);
- break;
- case FLUSH:
- case LEFT:
- xOffset = (float) bounds.getX();
- break;
- case RIGHT:
- xOffset = (float) (bounds.getX() + bounds.getWidth() - rect.getWidth());
- break;
- default:
- throw new IllegalArgumentException("Unrecognized alignment enum option");
- }
-
- g2.drawString(label, xOffset, y);
- }
-
- g2.setFont(oldFont);
- }
-
- public String[] getAttributes() {
- return attributes;
- }
+ break;
+ case FLUSH:
+ case LEFT:
+ xOffset = (float) bounds.getX();
+ break;
+ case RIGHT:
+ xOffset = (float) (bounds.getX() + bounds.getWidth() - rect.getWidth());
+ break;
+ default:
+ throw new IllegalArgumentException("Unrecognized alignment enum option");
+ }
+
+ g2.drawString(label, xOffset, y);
+ }
+
+ g2.setFont(oldFont);
+ }
+
+ public String[] getAttributes() {
+ return attributes;
+ }
public String getDisplayAttribute() {
return displayAttribute;
}
public void setDisplayAttribute(String displayAttribute) {
- this.displayAttribute = displayAttribute;
- firePainterChanged();
- }
-
- private PainterIntent intent;
+ this.displayAttribute = displayAttribute;
+ firePainterChanged();
+ }
- private double preferredWidth;
- private double preferredHeight;
- private float yOffset;
+ private double preferredWidth;
+ private double preferredHeight;
+ private float yOffset;
- protected String displayAttribute;
- protected String[] attributes;
+ protected String displayAttribute;
+ protected String[] attributes;
- protected TreePane treePane;
+ protected TreePane treePane;
- private Decorator textDecorator = null;
- private Decorator borderDecorator = null;
+ private Decorator textDecorator = null;
+ private Decorator borderDecorator = null;
}
\ No newline at end of file
diff -Nru figtree-1.4.2+dfsg/src/figtree/panel/TreeAppearanceController.java figtree-1.4.3+dfsg/src/figtree/panel/TreeAppearanceController.java
--- figtree-1.4.2+dfsg/src/figtree/panel/TreeAppearanceController.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/panel/TreeAppearanceController.java 2016-10-04 14:24:27.000000000 +0000
@@ -20,6 +20,7 @@
package figtree.panel;
+import jebl.evolution.trees.SortedRootedTree;
import jebl.evolution.trees.Tree;
import jebl.evolution.graphs.Node;
import figtree.treeviewer.TreeViewer;
@@ -94,7 +95,7 @@
final LabelPainter nodeLabelPainter,
String branchKey,
final LabelPainter branchLabelPainter) {
- this(treeViewer, tipKey, tipLabelPainter, nodeKey, nodeLabelPainter, branchKey, branchLabelPainter, true);
+ this(treeViewer, tipKey, tipLabelPainter, nodeKey, nodeLabelPainter, branchKey, branchLabelPainter, true, false);
}
public TreeAppearanceController(final TreeViewer treeViewer,
@@ -104,7 +105,8 @@
final LabelPainter nodeLabelPainter,
String branchKey,
final LabelPainter branchLabelPainter,
- boolean hideColouring) {
+ boolean hideColouring,
+ boolean ordering) {
this.treeViewer = treeViewer;
this.hideColouring = hideColouring;
@@ -247,7 +249,30 @@
}
});
}
- }
+
+ if (ordering) {
+ orderCombo = new JComboBox(new String[]{"Off",
+ SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY.toString(),
+ SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY.toString()});
+ orderCombo.setOpaque(false);
+ orderCombo.setSelectedItem(treeViewer.isOrderBranchesOn() ?
+ treeViewer.getBranchOrdering().ordinal() + 1 : 0);
+ orderCombo.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent itemEvent) {
+ if (orderCombo.getSelectedIndex() == 0) {
+ treeViewer.setOrderBranchesOn(false);
+ } else {
+ treeViewer.setOrderBranchesOn(true);
+ treeViewer.setBranchOrdering(SortedRootedTree.BranchOrdering.values()[orderCombo.getSelectedIndex() - 1]);
+ }
+ }
+ });
+
+ optionsPanel.addComponentWithLabel("Order:", orderCombo);
+ } else {
+ orderCombo = null;
+ }
+ }
private void setupAttributes(Collection extends Tree> trees) {
Object selected = branchColourAttributeCombo.getSelectedItem();
@@ -361,7 +386,9 @@
private final JSpinner fontSizeSpinner;
private final JSpinner digitsSpinner;
- private final TreeViewer treeViewer;
+ private final JComboBox orderCombo;
+
+ private final TreeViewer treeViewer;
private final String tipKey;
private final String nodeKey;
diff -Nru figtree-1.4.2+dfsg/src/figtree/panel/TreesController.java figtree-1.4.3+dfsg/src/figtree/panel/TreesController.java
--- figtree-1.4.2+dfsg/src/figtree/panel/TreesController.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/panel/TreesController.java 2016-10-04 14:24:27.000000000 +0000
@@ -60,69 +60,87 @@
public TreesController(final TreeViewer treeViewer) {
+ this(treeViewer, true, true, true);
+ }
+ public TreesController(final TreeViewer treeViewer,
+ final boolean rooting,
+ final boolean ordering,
+ final boolean transforming) {
this.treeViewer = treeViewer;
titleLabel = new JLabel(CONTROLLER_TITLE);
optionsPanel = new OptionsPanel();
- rootingCheck = new JCheckBox("Midpoint root");
- rootingCheck.setOpaque(false);
- optionsPanel.addComponent(rootingCheck);
-
- rootingCheck.setSelected(treeViewer.isRootingOn());
-
- rootingCheck.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent actionEvent) {
- if (rootingCheck.isSelected()) {
- treeViewer.setRootingOn(true);
- treeViewer.setRootingType(TreePane.RootingType.MID_POINT);
- } else {
- treeViewer.setRootingOn(false);
- treeViewer.setRootingType(TreePane.RootingType.USER_ROOTING);
- }
-
- }
- });
+ if (rooting) {
+ rootingCheck = new JCheckBox("Midpoint root");
+ rootingCheck.setOpaque(false);
+ optionsPanel.addComponent(rootingCheck);
+
+ rootingCheck.setSelected(treeViewer.isRootingOn());
+
+ rootingCheck.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent actionEvent) {
+ if (rootingCheck.isSelected()) {
+ treeViewer.setRootingOn(true);
+ treeViewer.setRootingType(TreePane.RootingType.MID_POINT);
+ } else {
+ treeViewer.setRootingOn(false);
+ treeViewer.setRootingType(TreePane.RootingType.USER_ROOTING);
+ }
- orderCombo = new JComboBox(new String[] {"Off",
- SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY.toString(),
- SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY.toString()});
- orderCombo.setOpaque(false);
- orderCombo.setSelectedItem(treeViewer.isOrderBranchesOn() ?
- treeViewer.getBranchOrdering().ordinal() + 1 : 0);
- orderCombo.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent itemEvent) {
- if (orderCombo.getSelectedIndex() == 0) {
- treeViewer.setOrderBranchesOn(false);
- } else {
- treeViewer.setOrderBranchesOn(true);
- treeViewer.setBranchOrdering(SortedRootedTree.BranchOrdering.values()[orderCombo.getSelectedIndex() - 1]);
}
- }
- });
-
- optionsPanel.addComponentWithLabel("Order:", orderCombo);
+ });
+ } else {
+ rootingCheck = null;
+ }
+
+ if (ordering) {
+ orderCombo = new JComboBox(new String[]{"Off",
+ SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY.toString(),
+ SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY.toString()});
+ orderCombo.setOpaque(false);
+ orderCombo.setSelectedItem(treeViewer.isOrderBranchesOn() ?
+ treeViewer.getBranchOrdering().ordinal() + 1 : 0);
+ orderCombo.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent itemEvent) {
+ if (orderCombo.getSelectedIndex() == 0) {
+ treeViewer.setOrderBranchesOn(false);
+ } else {
+ treeViewer.setOrderBranchesOn(true);
+ treeViewer.setBranchOrdering(SortedRootedTree.BranchOrdering.values()[orderCombo.getSelectedIndex() - 1]);
+ }
+ }
+ });
- transformCombo = new JComboBox(new String[] {"Off",
- TransformedRootedTree.Transform.CLADOGRAM.toString(),
- TransformedRootedTree.Transform.PROPORTIONAL.toString(),
- TransformedRootedTree.Transform.EQUAL_LENGTHS.toString()});
- transformCombo.setOpaque(false);
- transformCombo.setSelectedItem(treeViewer.isOrderBranchesOn() ?
- treeViewer.getBranchTransform().ordinal() + 1 : 0);
- transformCombo.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent itemEvent) {
- if (transformCombo.getSelectedIndex() == 0) {
- treeViewer.setTransformBranchesOn(false);
- } else {
- treeViewer.setTransformBranchesOn(true);
- treeViewer.setBranchTransform(TransformedRootedTree.Transform.values()[transformCombo.getSelectedIndex() - 1]);
+ optionsPanel.addComponentWithLabel("Order:", orderCombo);
+ } else {
+ orderCombo = null;
+ }
+
+ if (transforming) {
+ transformCombo = new JComboBox(new String[]{"Off",
+ TransformedRootedTree.Transform.CLADOGRAM.toString(),
+ TransformedRootedTree.Transform.PROPORTIONAL.toString(),
+ TransformedRootedTree.Transform.EQUAL_LENGTHS.toString()});
+ transformCombo.setOpaque(false);
+ transformCombo.setSelectedItem(treeViewer.isOrderBranchesOn() ?
+ treeViewer.getBranchTransform().ordinal() + 1 : 0);
+ transformCombo.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent itemEvent) {
+ if (transformCombo.getSelectedIndex() == 0) {
+ treeViewer.setTransformBranchesOn(false);
+ } else {
+ treeViewer.setTransformBranchesOn(true);
+ treeViewer.setBranchTransform(TransformedRootedTree.Transform.values()[transformCombo.getSelectedIndex() - 1]);
+ }
}
- }
- });
- optionsPanel.addComponentWithLabel("Transform:", transformCombo);
+ });
+ optionsPanel.addComponentWithLabel("Transform:", transformCombo);
+ } else {
+ transformCombo = null;
+ }
}
public JComponent getTitleComponent() {
diff -Nru figtree-1.4.2+dfsg/src/figtree/treeviewer/decorators/ContinuousScale.java figtree-1.4.3+dfsg/src/figtree/treeviewer/decorators/ContinuousScale.java
--- figtree-1.4.2+dfsg/src/figtree/treeviewer/decorators/ContinuousScale.java 2014-10-15 14:22:10.000000000 +0000
+++ figtree-1.4.3+dfsg/src/figtree/treeviewer/decorators/ContinuousScale.java 2016-10-04 14:24:27.000000000 +0000
@@ -43,7 +43,7 @@
*/
public ContinuousScale(String settings) {
if (settings.startsWith("{")) {
- settings = settings.substring(1, settings.length());
+ settings = settings.substring(1, settings.length());
}
if (settings.endsWith("}")) {
settings = settings.substring(0, settings.length() - 1);
@@ -88,47 +88,46 @@
// First collect the set of all attribute values
Set