/*
* ScaleAxisPainterController.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.painters;
import figtree.treeviewer.TreeViewerListener;
import jam.controlpalettes.AbstractController;
import jam.panels.OptionsPanel;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Map;
import java.util.prefs.Preferences;
import figtree.treeviewer.ControllerOptionsPanel;
import figtree.treeviewer.TreeViewer;
import figtree.ui.components.RealNumberField;
/**
* @author Andrew Rambaut
* @version $Id$
*
* $HeadURL$
*
* $LastChangedBy$
* $LastChangedDate$
* $LastChangedRevision$
*/
public class ScaleAxisPainterController extends AbstractController {
private static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class);
private static final String SCALE_AXIS_KEY = "scaleAxis";
private static final String FONT_NAME_KEY = "fontName";
private static final String FONT_SIZE_KEY = "fontSize";
private static final String FONT_STYLE_KEY = "fontStyle";
private static final String NUMBER_FORMATTING_KEY = "numberFormatting";
private static final String REVERSE_AXIS_KEY = "reverseAxis";
private static final String SHOW_GRID_KEY = "showGrid";
private static final String AUTOMATIC_SCALE_KEY = "automaticScale";
private static final String MINOR_TICKS_KEY = "minorTicks";
private static final String MAJOR_TICKS_KEY = "majorTicks";
private static final String ORIGIN_KEY = "origin";
private static final String LINE_WIDTH_KEY = "lineWidth";
// private static final String SIGNIFICANT_DIGITS_KEY = "significantDigits";
// The defaults if there is nothing in the preferences
private static String DEFAULT_FONT_NAME = "sansserif";
private static int DEFAULT_FONT_SIZE = 8;
private static int DEFAULT_FONT_STYLE = Font.PLAIN;
private static String DEFAULT_NUMBER_FORMATTING = "#.####";
private static float DEFAULT_LINE_WIDTH = 1.0f;
public ScaleAxisPainterController(final ScaleAxisPainter scaleAxisPainter, final ScaleGridPainter scaleGridPainter, final TreeViewer treeViewer) {
this.scaleAxisPainter = scaleAxisPainter;
this.scaleGridPainter = scaleGridPainter;
final String defaultFontName = PREFS.get(FONT_NAME_KEY, DEFAULT_FONT_NAME);
final int defaultFontStyle = PREFS.getInt(FONT_SIZE_KEY, DEFAULT_FONT_STYLE);
final int defaultFontSize = PREFS.getInt(FONT_STYLE_KEY, DEFAULT_FONT_SIZE);
final String defaultNumberFormatting = PREFS.get(NUMBER_FORMATTING_KEY, DEFAULT_NUMBER_FORMATTING);
float lineWidth = PREFS.getFloat(LINE_WIDTH_KEY, DEFAULT_LINE_WIDTH);
scaleAxisPainter.setFont(new Font(defaultFontName, defaultFontStyle, defaultFontSize));
scaleAxisPainter.setNumberFormat(new DecimalFormat(defaultNumberFormatting));
scaleAxisPainter.setScaleBarStroke(new BasicStroke(lineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
optionsPanel = new ControllerOptionsPanel(2, 2);
titleCheckBox = new JCheckBox(getTitle());
titleCheckBox.setSelected(scaleAxisPainter.isVisible());
reverseAxisCheck = new JCheckBox("Reverse axis");
reverseAxisCheck.setSelected(false);
showGridCheck = new JCheckBox("Show grid");
showGridCheck.setSelected(true);
optionsPanel.addSpanningComponent(showGridCheck);
autoScaleCheck = new JCheckBox("Automatic scale");
autoScaleCheck.setSelected(true);
majorTicksText = new RealNumberField();
majorTicksText.setValue(1.0);
minorTicksText = new RealNumberField();
minorTicksText.setValue(0.5);
originText = new RealNumberField();
originText.setValue(0.0);
Font font = scaleAxisPainter.getFont();
fontSizeSpinner = new JSpinner(new SpinnerNumberModel(font.getSize(), 0.01, 48, 1));
fontSizeSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final float size = ((Double) fontSizeSpinner.getValue()).floatValue();
Font font = scaleAxisPainter.getFont().deriveFont(size);
scaleAxisPainter.setFont(font);
}
});
// NumberFormat format = this.scaleAxisPainter.getNumberFormat();
// int digits = format.getMaximumFractionDigits();
// digitsSpinner = new JSpinner(new SpinnerNumberModel(digits, 2, 14, 1));
// final JLabel label5 = optionsPanel.addComponentWithLabel("Sig. Digits:", digitsSpinner);
//
// digitsSpinner.addChangeListener(new ChangeListener() {
// public void stateChanged(ChangeEvent changeEvent) {
// final int digits = (Integer)digitsSpinner.getValue();
// NumberFormat format = scaleAxisPainter.getNumberFormat();
// format.setMaximumFractionDigits(digits);
// scaleAxisPainter.setNumberFormat(format);
// }
// });
lineWeightSpinner = new JSpinner(new SpinnerNumberModel(1.0, 0.01, 48.0, 1.0));
lineWeightSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
float weight = ((Double) lineWeightSpinner.getValue()).floatValue();
scaleAxisPainter.setScaleBarStroke(new BasicStroke(weight, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
}
});
final JLabel label6 = optionsPanel.addComponentWithLabel("Line Weight:", lineWeightSpinner);
optionsPanel.addSpanningComponent(reverseAxisCheck);
optionsPanel.addSpanningComponent(autoScaleCheck);
final JLabel label1 = optionsPanel.addComponentWithLabel("Label spacing:", majorTicksText, true);
final JLabel label2 = optionsPanel.addComponentWithLabel("Tick spacing:", minorTicksText, true);
final JLabel label3 = optionsPanel.addComponentWithLabel("Origin value:", originText, true);
final JLabel label4 = optionsPanel.addComponentWithLabel("Font Size:", fontSizeSpinner);
final boolean isSelected1 = titleCheckBox.isSelected();
final boolean isSelected2 = autoScaleCheck.isSelected();
showGridCheck.setEnabled(isSelected1);
reverseAxisCheck.setEnabled(isSelected1);
autoScaleCheck.setEnabled(isSelected1);
label1.setEnabled(isSelected1 && !isSelected2);
majorTicksText.setEnabled(isSelected1 && !isSelected2);
label2.setEnabled(isSelected1 && !isSelected2);
minorTicksText.setEnabled(isSelected1 && !isSelected2);
label3.setEnabled(isSelected1 && !isSelected2);
originText.setEnabled(isSelected1 && !isSelected2);
label4.setEnabled(isSelected1);
fontSizeSpinner.setEnabled(isSelected1);
// label5.setEnabled(isSelected1);
// digitsSpinner.setEnabled(isSelected1);
label6.setEnabled(isSelected1);
lineWeightSpinner.setEnabled(isSelected1);
titleCheckBox.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final boolean isSelected1 = titleCheckBox.isSelected();
final boolean isSelected2 = autoScaleCheck.isSelected();
showGridCheck.setEnabled(isSelected1);
reverseAxisCheck.setEnabled(isSelected1);
autoScaleCheck.setEnabled(isSelected1);
label1.setEnabled(isSelected1 && !isSelected2);
majorTicksText.setEnabled(isSelected1 && !isSelected2);
label2.setEnabled(isSelected1 && !isSelected2);
minorTicksText.setEnabled(isSelected1 && !isSelected2);
label3.setEnabled(isSelected1 && !isSelected2);
originText.setEnabled(isSelected1 && !isSelected2);
label4.setEnabled(isSelected1);
fontSizeSpinner.setEnabled(isSelected1);
// label5.setEnabled(isSelected1);
// digitsSpinner.setEnabled(isSelected1);
label6.setEnabled(isSelected1);
lineWeightSpinner.setEnabled(isSelected1);
scaleAxisPainter.setVisible(isSelected1);
scaleGridPainter.setVisible(isSelected1);
}
});
reverseAxisCheck.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
scaleAxisPainter.setAxisReversed(reverseAxisCheck.isSelected());
}
});
showGridCheck.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
scaleGridPainter.setVisible(showGridCheck.isSelected());
}
});
autoScaleCheck.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
if (autoScaleCheck.isSelected()) {
scaleAxisPainter.setAutomatic(true);
majorTicksText.setValue(scaleAxisPainter.getMajorTickSpacing());
minorTicksText.setValue(scaleAxisPainter.getMinorTickSpacing());
originText.setValue(scaleAxisPainter.getAxisOrigin());
label1.setEnabled(false);
majorTicksText.setEnabled(false);
label2.setEnabled(false);
minorTicksText.setEnabled(false);
label3.setEnabled(false);
originText.setEnabled(false);
} else {
label1.setEnabled(true);
minorTicksText.setEnabled(true);
label2.setEnabled(true);
majorTicksText.setEnabled(true);
label3.setEnabled(true);
originText.setEnabled(true);
double majorTickSpacing = getValue(majorTicksText, 1.0);
double minorTickSpacing = getValue(minorTicksText, 0.5);
double originValue = getValue(originText, 0.0);
scaleAxisPainter.setAutomatic(false);
scaleAxisPainter.setAxisSpacing(majorTickSpacing, minorTickSpacing);
scaleAxisPainter.setAxisOrigin(originValue);
}
}
});
ChangeListener listener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent changeEvent) {
if (!autoScaleCheck.isSelected()) {
double majorTickSpacing = getValue(majorTicksText, 1.0);
double minorTickSpacing = getValue(minorTicksText, 0.5);
scaleAxisPainter.setAxisSpacing(majorTickSpacing, minorTickSpacing);
}
}
};
minorTicksText.addChangeListener(listener);
majorTicksText.addChangeListener(listener);
originText.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
if (!autoScaleCheck.isSelected()) {
double originValue = getValue(originText, 0.0);
scaleAxisPainter.setAxisOrigin(originValue);
}
}
});
treeViewer.addTreeViewerListener(new TreeViewerListener() {
public void treeChanged() {
scaleAxisPainter.firePainterChanged();
}
public void treeSettingsChanged() {
// nothing to do
}
});
}
private double getValue(RealNumberField field, double defaultValue) {
Double value = field.getValue();
return (value != null ? value : defaultValue);
}
public JComponent getTitleComponent() {
return titleCheckBox;
}
public JPanel getPanel() {
return optionsPanel;
}
public boolean isInitiallyVisible() {
return false;
}
public void initialize() {
// force a toggle of the checkbox
autoScaleCheck.setSelected(false);
autoScaleCheck.setSelected(true);
}
public void setSettings(Map<String,Object> settings) {
titleCheckBox.setSelected((Boolean)settings.get(SCALE_AXIS_KEY + "." + IS_SHOWN));
reverseAxisCheck.setSelected((Boolean)settings.get(SCALE_AXIS_KEY + "." + REVERSE_AXIS_KEY));
showGridCheck.setSelected((Boolean)settings.get(SCALE_AXIS_KEY + "." + SHOW_GRID_KEY));
minorTicksText.setValue((Double)settings.get(SCALE_AXIS_KEY + "." + MINOR_TICKS_KEY));
majorTicksText.setValue((Double)settings.get(SCALE_AXIS_KEY + "." + MAJOR_TICKS_KEY));
originText.setValue((Double)settings.get(SCALE_AXIS_KEY + "." + ORIGIN_KEY));
autoScaleCheck.setSelected((Boolean)settings.get(SCALE_AXIS_KEY + "." + AUTOMATIC_SCALE_KEY));
// scaleAxisPainter.setAutomaticScale(autoScaleCheck.isSelected());
fontSizeSpinner.setValue((Double)settings.get(SCALE_AXIS_KEY + "." + FONT_SIZE_KEY));
// digitsSpinner.setValue((Integer)settings.get(SCALE_AXIS_KEY + "." + SIGNIFICANT_DIGITS_KEY));
lineWeightSpinner.setValue((Double)settings.get(SCALE_AXIS_KEY + "." + LINE_WIDTH_KEY));
}
public void getSettings(Map<String, Object> settings) {
settings.put(SCALE_AXIS_KEY + "." + IS_SHOWN, titleCheckBox.isSelected());
settings.put(SCALE_AXIS_KEY + "." + REVERSE_AXIS_KEY, reverseAxisCheck.isSelected());
settings.put(SCALE_AXIS_KEY + "." + SHOW_GRID_KEY, showGridCheck.isSelected());
settings.put(SCALE_AXIS_KEY + "." + AUTOMATIC_SCALE_KEY, autoScaleCheck.isSelected());
settings.put(SCALE_AXIS_KEY + "." + MINOR_TICKS_KEY, minorTicksText.getValue());
settings.put(SCALE_AXIS_KEY + "." + MAJOR_TICKS_KEY, majorTicksText.getValue());
settings.put(SCALE_AXIS_KEY + "." + ORIGIN_KEY, originText.getValue());
settings.put(SCALE_AXIS_KEY + "." + FONT_SIZE_KEY, fontSizeSpinner.getValue());
// settings.put(SCALE_AXIS_KEY + "." + SIGNIFICANT_DIGITS_KEY, digitsSpinner.getValue());
settings.put(SCALE_AXIS_KEY + "." + LINE_WIDTH_KEY, lineWeightSpinner.getValue());
}
private final JCheckBox titleCheckBox;
private final OptionsPanel optionsPanel;
private final JCheckBox reverseAxisCheck;
private final JCheckBox showGridCheck;
private final JCheckBox autoScaleCheck;
private final RealNumberField minorTicksText;
private final RealNumberField majorTicksText;
private final RealNumberField originText;
private final JSpinner fontSizeSpinner;
// private final JSpinner digitsSpinner;
private final JSpinner lineWeightSpinner;
public String getTitle() {
return "Scale Axis";
}
private final ScaleAxisPainter scaleAxisPainter;
private final ScaleGridPainter scaleGridPainter;
}