/* * TreesController.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.treeviewer; import jebl.evolution.trees.SortedRootedTree; import jebl.evolution.trees.TransformedRootedTree; import jam.controlpalettes.AbstractController; import jam.panels.OptionsPanel; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Map; import java.util.prefs.Preferences; /** * @author Andrew Rambaut * @version $Id$ * * $HeadURL$ * * $LastChangedBy$ * $LastChangedDate$ * $LastChangedRevision$ */ public class TreesController extends AbstractController { private static final String CONTROLLER_TITLE = "Trees"; private static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class); private static final String CONTROLLER_KEY = "trees"; private static final String TRANSFORM_KEY = "transform"; private static final String TRANSFORM_TYPE_KEY = "transformType"; private static final String ORDER_KEY = "order"; private static final String ORDER_TYPE_KEY = "orderType"; private static final String ROOTING_KEY = "rooting"; private static final String ROOTING_TYPE_KEY = "rootingType"; public TreesController(final TreeViewer treeViewer) { this.treeViewer = treeViewer; titleLabel = new JLabel(CONTROLLER_TITLE); optionsPanel = new ControllerOptionsPanel(2, 6); rootingCheck = new JCheckBox("Root tree"); rootingCheck.setOpaque(false); optionsPanel.addSpanningComponent(rootingCheck); rootingCheck.setSelected(treeViewer.isRootingOn()); rootingCombo = new JComboBox(TreePane.RootingType.values()); rootingCombo.setOpaque(false); rootingCombo.setSelectedItem(treeViewer.getRootingType()); rootingCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); } }); final JLabel label1 = optionsPanel.addComponentWithLabel("Rooting:", rootingCombo); label1.setEnabled(rootingCheck.isSelected()); rootingCombo.setEnabled(rootingCheck.isSelected()); rootingCheck.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { label1.setEnabled(rootingCheck.isSelected()); rootingCombo.setEnabled(rootingCheck.isSelected()); treeViewer.setRootingOn(rootingCheck.isSelected()); } }); optionsPanel.addSeparator(); orderCheck = new JCheckBox("Order nodes"); orderCheck.setOpaque(false); optionsPanel.addSpanningComponent(orderCheck); orderCheck.setSelected(treeViewer.isOrderBranchesOn()); orderCombo = new JComboBox(SortedRootedTree.BranchOrdering.values()); orderCombo.setOpaque(false); orderCombo.setSelectedItem(treeViewer.getBranchOrdering()); orderCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { treeViewer.setBranchOrdering( (SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); } }); final JLabel label2 = optionsPanel.addComponentWithLabel("Ordering:", orderCombo); label2.setEnabled(orderCheck.isSelected()); orderCombo.setEnabled(orderCheck.isSelected()); orderCheck.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { label2.setEnabled(orderCheck.isSelected()); orderCombo.setEnabled(orderCheck.isSelected()); treeViewer.setOrderBranchesOn(orderCheck.isSelected()); } }); optionsPanel.addSeparator(); transformCheck = new JCheckBox("Transform branches"); transformCheck.setOpaque(false); optionsPanel.addSpanningComponent(transformCheck); transformCheck.setSelected(treeViewer.isTransformBranchesOn()); transformCombo = new JComboBox(TransformedRootedTree.Transform.values()); transformCombo.setOpaque(false); transformCombo.setSelectedItem(treeViewer.getBranchTransform()); transformCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { treeViewer.setBranchTransform( (TransformedRootedTree.Transform) transformCombo.getSelectedItem()); } }); final JLabel label3 = optionsPanel.addComponentWithLabel("Transform:", transformCombo); label3.setEnabled(transformCheck.isSelected()); transformCombo.setEnabled(transformCheck.isSelected()); transformCheck.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent changeEvent) { final boolean selected = transformCheck.isSelected(); label3.setEnabled(selected); transformCombo.setEnabled(selected); treeViewer.setTransformBranchesOn(selected); } }); treeViewer.addTreeViewerListener(new TreeViewerListener() { public void treeChanged() { // ignore this one } // the settings may have changed programmatically - update the controls to match public void treeSettingsChanged() { rootingCheck.setSelected(treeViewer.isRootingOn()); rootingCombo.setSelectedItem(treeViewer.getRootingType()); transformCheck.setSelected(treeViewer.isTransformBranchesOn()); transformCombo.setSelectedItem(treeViewer.getBranchTransform()); orderCheck.setSelected(treeViewer.isOrderBranchesOn()); orderCombo.setSelectedItem(treeViewer.getBranchOrdering()); } }); } public JComponent getTitleComponent() { return titleLabel; } public JPanel getPanel() { return optionsPanel; } public boolean isInitiallyVisible() { return false; } public void initialize() { treeViewer.setRootingOn(rootingCheck.isSelected()); treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); treeViewer.setTransformBranchesOn(transformCheck.isSelected()); treeViewer.setBranchTransform((TransformedRootedTree.Transform) transformCombo.getSelectedItem()); treeViewer.setOrderBranchesOn(orderCheck.isSelected()); treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); } public void toggleMidpointRoot() { if (!rootingCheck.isSelected() || rootingCombo.getSelectedItem() != TreePane.RootingType.MID_POINT) { rootingCheck.setSelected(true); rootingCombo.setSelectedItem(TreePane.RootingType.MID_POINT); } else { rootingCombo.setSelectedItem(TreePane.RootingType.USER_ROOTING); } treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); treeViewer.setRootingOn(rootingCheck.isSelected()); } public void toggleIncreasingNodeOrder() { if (!orderCheck.isSelected() || orderCombo.getSelectedItem() != SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY) { orderCheck.setSelected(true); orderCombo.setSelectedItem(SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY); } else { orderCheck.setSelected(false); } treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); treeViewer.setOrderBranchesOn(orderCheck.isSelected()); } public void toggleDecreasingNodeOrder() { if (!orderCheck.isSelected() || orderCombo.getSelectedItem() != SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY) { orderCheck.setSelected(true); orderCombo.setSelectedItem(SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY); } else { orderCheck.setSelected(false); } treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); treeViewer.setOrderBranchesOn(orderCheck.isSelected()); } public void setSettings(Map<String,Object> settings) { transformCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + TRANSFORM_KEY)); String transformName = (String)settings.get(CONTROLLER_KEY + "." + TRANSFORM_TYPE_KEY); for (TransformedRootedTree.Transform transform : TransformedRootedTree.Transform.values()) { if (transform.toString().equalsIgnoreCase(transformName)) { transformCombo.setSelectedItem(transform); } } orderCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + ORDER_KEY)); String orderName = (String)settings.get(CONTROLLER_KEY + "." + ORDER_TYPE_KEY); for (SortedRootedTree.BranchOrdering order : SortedRootedTree.BranchOrdering.values()) { if (order.toString().equalsIgnoreCase(orderName)) { orderCombo.setSelectedItem(order); } } rootingCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + ROOTING_KEY)); String rootingName = (String)settings.get(CONTROLLER_KEY + "." + ROOTING_TYPE_KEY); for (TreePane.RootingType rooting : TreePane.RootingType.values()) { if (rooting.toString().equalsIgnoreCase(rootingName)) { rootingCombo.setSelectedItem(rooting); } } } public void getSettings(Map<String, Object> settings) { settings.put(CONTROLLER_KEY + "." + TRANSFORM_KEY, transformCheck.isSelected()); settings.put(CONTROLLER_KEY + "." + TRANSFORM_TYPE_KEY, transformCombo.getSelectedItem().toString()); settings.put(CONTROLLER_KEY + "." + ORDER_KEY, orderCheck.isSelected()); settings.put(CONTROLLER_KEY + "." + ORDER_TYPE_KEY, orderCombo.getSelectedItem().toString()); settings.put(CONTROLLER_KEY + "." + ROOTING_KEY, rootingCheck.isSelected()); settings.put(CONTROLLER_KEY + "." + ROOTING_TYPE_KEY, rootingCombo.getSelectedItem().toString()); } private final JLabel titleLabel; private final OptionsPanel optionsPanel; private final JCheckBox transformCheck; private final JComboBox transformCombo; private final JCheckBox orderCheck; private final JComboBox orderCombo; private final JCheckBox rootingCheck; private final JComboBox rootingCombo; private final TreeViewer treeViewer; }