/*
* TimeScaleController.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 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;
import figtree.ui.components.RealNumberField;
/**
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class TimeScaleController extends AbstractController {
private static final String CONTROLLER_TITLE = "Time Scale";
private static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class);
private static final String CONTROLLER_KEY = "scale";
private static final String SCALE_ROOT_KEY = "scaleRoot";
private static final String ROOT_AGE_KEY = "rootAge";
private static final String OFFSET_AGE_KEY = "offsetAge";
private static final String SCALE_FACTOR_KEY = "scaleFactor";
// The defaults if there is nothing in the preferences
private static boolean DEFAULT_SCALE_ROOT = false;
private static double DEFAULT_ROOT_AGE = 1.0;
private static double DEFAULT_OFFSET_AGE = 0.0;
private static double DEFAULT_SCALE_FACTOR = 1.0;
public TimeScaleController(final TreeViewer treeViewer) {
this.treeViewer = treeViewer;
titleLabel = new JLabel(CONTROLLER_TITLE);
final boolean scaleRoot = PREFS.getBoolean(CONTROLLER_KEY + "." + SCALE_ROOT_KEY, DEFAULT_SCALE_ROOT);
final double offsetAge = PREFS.getDouble(CONTROLLER_KEY + "." + OFFSET_AGE_KEY, DEFAULT_OFFSET_AGE);
final double scaleFactor = PREFS.getDouble(CONTROLLER_KEY + "." + SCALE_FACTOR_KEY, DEFAULT_SCALE_FACTOR);
final double rootAge = PREFS.getDouble(CONTROLLER_KEY + "." + ROOT_AGE_KEY, DEFAULT_ROOT_AGE);
optionsPanel = new ControllerOptionsPanel(2, 2);
scaleFactorRadio = new JRadioButton("Scale by factor:");
scaleFactorRadio.setSelected(!scaleRoot);
optionsPanel.addSpanningComponent(scaleFactorRadio);
offsetAgeText = new RealNumberField(-Double.MAX_VALUE, Double.MAX_VALUE);
offsetAgeText.setValue(offsetAge);
final JLabel label1 = optionsPanel.addComponentWithLabel("Offset by:", offsetAgeText, true);
scaleFactorText = new RealNumberField(-Double.MAX_VALUE, Double.MAX_VALUE);
scaleFactorText.setValue(scaleFactor);
final JLabel label2 = optionsPanel.addComponentWithLabel("Scale factor:", scaleFactorText, true);
scaleRootRadio = new JRadioButton("Scale root to:");
scaleRootRadio.setSelected(scaleRoot);
optionsPanel.addSpanningComponent(scaleRootRadio);
rootAgeText = new RealNumberField(0.0, Double.MAX_VALUE);
rootAgeText.setValue(rootAge);
final JLabel label3 = optionsPanel.addComponentWithLabel("Root age:", rootAgeText, true);
ButtonGroup group = new ButtonGroup();
group.add(scaleFactorRadio);
group.add(scaleRootRadio);
scaleFactorRadio.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
boolean selected = scaleFactorRadio.isSelected();
label1.setEnabled(selected);
offsetAgeText.setEnabled(selected);
label2.setEnabled(selected);
scaleFactorText.setEnabled(selected);
label3.setEnabled(!selected);
rootAgeText.setEnabled(!selected);
setTimeScale();
}
});
ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
setTimeScale();
}
};
offsetAgeText.addChangeListener(listener);
scaleFactorText.addChangeListener(listener);
rootAgeText.addChangeListener(listener);
}
private void setTimeScale() {
TimeScale timeScale;
if (scaleFactorRadio.isSelected()) {
double offset = getValue(offsetAgeText, 0.0);
double scaleFactor = getValue(scaleFactorText, 1.0);
timeScale = new TimeScale(scaleFactor, offset);
} else {
double rootAge = getValue(rootAgeText, 0.0);
timeScale = new TimeScale(rootAge);
}
treeViewer.setTimeScale(timeScale);
}
private double getValue(RealNumberField field, double defaultValue) {
Double value = field.getValue();
return (value != null ? value : defaultValue);
}
public JComponent getTitleComponent() {
return titleLabel;
}
public JPanel getPanel() {
return optionsPanel;
}
public boolean isInitiallyVisible() {
return false;
}
public void initialize() {
// nothing to do
}
public void setSettings(Map<String,Object> settings) {
scaleFactorRadio.setSelected(!((Boolean)settings.get(CONTROLLER_KEY + "." + SCALE_ROOT_KEY)));
scaleRootRadio.setSelected(((Boolean)settings.get(CONTROLLER_KEY + "." + SCALE_ROOT_KEY)));
offsetAgeText.setValue((Double)settings.get(CONTROLLER_KEY + "." + OFFSET_AGE_KEY));
scaleFactorText.setValue((Double)settings.get(CONTROLLER_KEY + "." + SCALE_FACTOR_KEY));
rootAgeText.setValue((Double)settings.get(CONTROLLER_KEY + "." + ROOT_AGE_KEY));
}
public void getSettings(Map<String, Object> settings) {
settings.put(CONTROLLER_KEY + "." + SCALE_ROOT_KEY, new Boolean(scaleRootRadio.isSelected()));
settings.put(CONTROLLER_KEY + "." + OFFSET_AGE_KEY, offsetAgeText.getValue());
settings.put(CONTROLLER_KEY + "." + SCALE_FACTOR_KEY, scaleFactorText.getValue());
settings.put(CONTROLLER_KEY + "." + ROOT_AGE_KEY, rootAgeText.getValue());
}
private JRadioButton scaleFactorRadio;
private final RealNumberField offsetAgeText;
private final RealNumberField scaleFactorText;
private JRadioButton scaleRootRadio;
private final RealNumberField rootAgeText;
private final JLabel titleLabel;
private final OptionsPanel optionsPanel;
private final TreeViewer treeViewer;
}