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