1 /* 2 * TreesController.java 3 * 4 * Copyright (C) 2006-2014 Andrew Rambaut 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19 */ 20 21 package figtree.treeviewer; 22 23 import jebl.evolution.trees.SortedRootedTree; 24 import jebl.evolution.trees.TransformedRootedTree; 25 import jam.controlpalettes.AbstractController; 26 import jam.panels.OptionsPanel; 27 28 import javax.swing.*; 29 import javax.swing.event.ChangeEvent; 30 import javax.swing.event.ChangeListener; 31 import java.awt.event.ActionEvent; 32 import java.awt.event.ActionListener; 33 import java.awt.event.ItemEvent; 34 import java.awt.event.ItemListener; 35 import java.util.Map; 36 import java.util.prefs.Preferences; 37 38 /** 39 * @author Andrew Rambaut 40 * @version $Id$ 41 * 42 * $HeadURL$ 43 * 44 * $LastChangedBy$ 45 * $LastChangedDate$ 46 * $LastChangedRevision$ 47 */ 48 public class TreesController extends AbstractController { 49 private static final String CONTROLLER_TITLE = "Trees"; 50 51 private static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class); 52 53 private static final String CONTROLLER_KEY = "trees"; 54 55 private static final String TRANSFORM_KEY = "transform"; 56 private static final String TRANSFORM_TYPE_KEY = "transformType"; 57 private static final String ORDER_KEY = "order"; 58 private static final String ORDER_TYPE_KEY = "orderType"; 59 private static final String ROOTING_KEY = "rooting"; 60 private static final String ROOTING_TYPE_KEY = "rootingType"; 61 62 63 TreesController(final TreeViewer treeViewer)64 public TreesController(final TreeViewer treeViewer) { 65 this.treeViewer = treeViewer; 66 67 titleLabel = new JLabel(CONTROLLER_TITLE); 68 69 optionsPanel = new ControllerOptionsPanel(2, 6); 70 71 rootingCheck = new JCheckBox("Root tree"); 72 rootingCheck.setOpaque(false); 73 optionsPanel.addSpanningComponent(rootingCheck); 74 75 rootingCheck.setSelected(treeViewer.isRootingOn()); 76 77 rootingCombo = new JComboBox(TreePane.RootingType.values()); 78 rootingCombo.setOpaque(false); 79 rootingCombo.setSelectedItem(treeViewer.getRootingType()); 80 rootingCombo.addActionListener(new ActionListener() { 81 public void actionPerformed(ActionEvent actionEvent) { 82 treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); 83 } 84 }); 85 86 final JLabel label1 = optionsPanel.addComponentWithLabel("Rooting:", rootingCombo); 87 label1.setEnabled(rootingCheck.isSelected()); 88 rootingCombo.setEnabled(rootingCheck.isSelected()); 89 90 rootingCheck.addChangeListener(new ChangeListener() { 91 public void stateChanged(ChangeEvent changeEvent) { 92 label1.setEnabled(rootingCheck.isSelected()); 93 rootingCombo.setEnabled(rootingCheck.isSelected()); 94 95 treeViewer.setRootingOn(rootingCheck.isSelected()); 96 } 97 }); 98 99 optionsPanel.addSeparator(); 100 101 orderCheck = new JCheckBox("Order nodes"); 102 orderCheck.setOpaque(false); 103 optionsPanel.addSpanningComponent(orderCheck); 104 105 orderCheck.setSelected(treeViewer.isOrderBranchesOn()); 106 107 orderCombo = new JComboBox(SortedRootedTree.BranchOrdering.values()); 108 orderCombo.setOpaque(false); 109 orderCombo.setSelectedItem(treeViewer.getBranchOrdering()); 110 orderCombo.addActionListener(new ActionListener() { 111 public void actionPerformed(ActionEvent actionEvent) { 112 treeViewer.setBranchOrdering( 113 (SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); 114 } 115 }); 116 117 final JLabel label2 = optionsPanel.addComponentWithLabel("Ordering:", orderCombo); 118 label2.setEnabled(orderCheck.isSelected()); 119 orderCombo.setEnabled(orderCheck.isSelected()); 120 121 orderCheck.addChangeListener(new ChangeListener() { 122 public void stateChanged(ChangeEvent changeEvent) { 123 label2.setEnabled(orderCheck.isSelected()); 124 orderCombo.setEnabled(orderCheck.isSelected()); 125 126 treeViewer.setOrderBranchesOn(orderCheck.isSelected()); 127 } 128 }); 129 130 optionsPanel.addSeparator(); 131 132 transformCheck = new JCheckBox("Transform branches"); 133 transformCheck.setOpaque(false); 134 optionsPanel.addSpanningComponent(transformCheck); 135 136 transformCheck.setSelected(treeViewer.isTransformBranchesOn()); 137 138 transformCombo = new JComboBox(TransformedRootedTree.Transform.values()); 139 transformCombo.setOpaque(false); 140 transformCombo.setSelectedItem(treeViewer.getBranchTransform()); 141 transformCombo.addActionListener(new ActionListener() { 142 public void actionPerformed(ActionEvent event) { 143 treeViewer.setBranchTransform( 144 (TransformedRootedTree.Transform) transformCombo.getSelectedItem()); 145 146 } 147 }); 148 final JLabel label3 = optionsPanel.addComponentWithLabel("Transform:", transformCombo); 149 label3.setEnabled(transformCheck.isSelected()); 150 transformCombo.setEnabled(transformCheck.isSelected()); 151 152 transformCheck.addChangeListener(new ChangeListener() { 153 public void stateChanged(ChangeEvent changeEvent) { 154 final boolean selected = transformCheck.isSelected(); 155 label3.setEnabled(selected); 156 transformCombo.setEnabled(selected); 157 158 treeViewer.setTransformBranchesOn(selected); 159 } 160 }); 161 162 treeViewer.addTreeViewerListener(new TreeViewerListener() { 163 164 public void treeChanged() { 165 // ignore this one 166 } 167 168 // the settings may have changed programmatically - update the controls to match 169 public void treeSettingsChanged() { 170 rootingCheck.setSelected(treeViewer.isRootingOn()); 171 rootingCombo.setSelectedItem(treeViewer.getRootingType()); 172 173 transformCheck.setSelected(treeViewer.isTransformBranchesOn()); 174 transformCombo.setSelectedItem(treeViewer.getBranchTransform()); 175 176 orderCheck.setSelected(treeViewer.isOrderBranchesOn()); 177 orderCombo.setSelectedItem(treeViewer.getBranchOrdering()); 178 } 179 }); 180 181 } 182 getTitleComponent()183 public JComponent getTitleComponent() { 184 return titleLabel; 185 } 186 getPanel()187 public JPanel getPanel() { 188 return optionsPanel; 189 } 190 isInitiallyVisible()191 public boolean isInitiallyVisible() { 192 return false; 193 } 194 initialize()195 public void initialize() { 196 treeViewer.setRootingOn(rootingCheck.isSelected()); 197 treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); 198 treeViewer.setTransformBranchesOn(transformCheck.isSelected()); 199 treeViewer.setBranchTransform((TransformedRootedTree.Transform) transformCombo.getSelectedItem()); 200 treeViewer.setOrderBranchesOn(orderCheck.isSelected()); 201 treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); 202 } 203 toggleMidpointRoot()204 public void toggleMidpointRoot() { 205 if (!rootingCheck.isSelected() || rootingCombo.getSelectedItem() != TreePane.RootingType.MID_POINT) { 206 rootingCheck.setSelected(true); 207 rootingCombo.setSelectedItem(TreePane.RootingType.MID_POINT); 208 } else { 209 rootingCombo.setSelectedItem(TreePane.RootingType.USER_ROOTING); 210 } 211 treeViewer.setRootingType((TreePane.RootingType) rootingCombo.getSelectedItem()); 212 treeViewer.setRootingOn(rootingCheck.isSelected()); 213 } 214 toggleIncreasingNodeOrder()215 public void toggleIncreasingNodeOrder() { 216 if (!orderCheck.isSelected() || orderCombo.getSelectedItem() != SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY) { 217 orderCheck.setSelected(true); 218 orderCombo.setSelectedItem(SortedRootedTree.BranchOrdering.INCREASING_NODE_DENSITY); 219 } else { 220 orderCheck.setSelected(false); 221 } 222 treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); 223 treeViewer.setOrderBranchesOn(orderCheck.isSelected()); 224 } 225 toggleDecreasingNodeOrder()226 public void toggleDecreasingNodeOrder() { 227 if (!orderCheck.isSelected() || orderCombo.getSelectedItem() != SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY) { 228 orderCheck.setSelected(true); 229 orderCombo.setSelectedItem(SortedRootedTree.BranchOrdering.DECREASING_NODE_DENSITY); 230 } else { 231 orderCheck.setSelected(false); 232 } 233 treeViewer.setBranchOrdering((SortedRootedTree.BranchOrdering) orderCombo.getSelectedItem()); 234 treeViewer.setOrderBranchesOn(orderCheck.isSelected()); 235 } 236 setSettings(Map<String,Object> settings)237 public void setSettings(Map<String,Object> settings) { 238 transformCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + TRANSFORM_KEY)); 239 String transformName = (String)settings.get(CONTROLLER_KEY + "." + TRANSFORM_TYPE_KEY); 240 for (TransformedRootedTree.Transform transform : TransformedRootedTree.Transform.values()) { 241 if (transform.toString().equalsIgnoreCase(transformName)) { 242 transformCombo.setSelectedItem(transform); 243 } 244 } 245 246 orderCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + ORDER_KEY)); 247 String orderName = (String)settings.get(CONTROLLER_KEY + "." + ORDER_TYPE_KEY); 248 for (SortedRootedTree.BranchOrdering order : SortedRootedTree.BranchOrdering.values()) { 249 if (order.toString().equalsIgnoreCase(orderName)) { 250 orderCombo.setSelectedItem(order); 251 } 252 } 253 254 rootingCheck.setSelected((Boolean) settings.get(CONTROLLER_KEY + "." + ROOTING_KEY)); 255 String rootingName = (String)settings.get(CONTROLLER_KEY + "." + ROOTING_TYPE_KEY); 256 for (TreePane.RootingType rooting : TreePane.RootingType.values()) { 257 if (rooting.toString().equalsIgnoreCase(rootingName)) { 258 rootingCombo.setSelectedItem(rooting); 259 } 260 } 261 } 262 getSettings(Map<String, Object> settings)263 public void getSettings(Map<String, Object> settings) { 264 settings.put(CONTROLLER_KEY + "." + TRANSFORM_KEY, transformCheck.isSelected()); 265 settings.put(CONTROLLER_KEY + "." + TRANSFORM_TYPE_KEY, transformCombo.getSelectedItem().toString()); 266 settings.put(CONTROLLER_KEY + "." + ORDER_KEY, orderCheck.isSelected()); 267 settings.put(CONTROLLER_KEY + "." + ORDER_TYPE_KEY, orderCombo.getSelectedItem().toString()); 268 settings.put(CONTROLLER_KEY + "." + ROOTING_KEY, rootingCheck.isSelected()); 269 settings.put(CONTROLLER_KEY + "." + ROOTING_TYPE_KEY, rootingCombo.getSelectedItem().toString()); 270 } 271 272 273 private final JLabel titleLabel; 274 private final OptionsPanel optionsPanel; 275 276 private final JCheckBox transformCheck; 277 private final JComboBox transformCombo; 278 279 private final JCheckBox orderCheck; 280 private final JComboBox orderCombo; 281 282 private final JCheckBox rootingCheck; 283 private final JComboBox rootingCombo; 284 285 private final TreeViewer treeViewer; 286 } 287