1
package figtree.treeviewer.painters;
3
import jam.controlpalettes.AbstractController;
4
import jam.panels.OptionsPanel;
7
import javax.swing.event.ChangeEvent;
8
import javax.swing.event.ChangeListener;
10
import java.text.NumberFormat;
11
import java.text.DecimalFormat;
13
import java.util.prefs.Preferences;
15
import figtree.treeviewer.ControllerOptionsPanel;
16
import figtree.treeviewer.TreeViewer;
17
import figtree.ui.components.RealNumberField;
20
* @author Andrew Rambaut
21
* @version $Id: ScaleBarPainterController.java 760 2007-08-21 00:05:45Z rambaut $
23
public class ScaleBarPainterController extends AbstractController {
25
public static Preferences PREFS = Preferences.userNodeForPackage(TreeViewer.class);
27
public static final String CONTROLLER_KEY = "scaleBar";
29
public static final String FONT_NAME_KEY = "fontName";
30
public static final String FONT_SIZE_KEY = "fontSize";
31
public static final String FONT_STYLE_KEY = "fontStyle";
33
public static final String NUMBER_FORMATTING_KEY = "numberFormatting";
36
public static final String AUTOMATIC_SCALE_KEY = "automaticScale";
37
public static final String SCALE_RANGE_KEY = "scaleRange";
38
public static final String LINE_WIDTH_KEY = "lineWidth";
40
public static final String SIGNIFICANT_DIGITS_KEY = "significantDigits";
42
// The defaults if there is nothing in the preferences
43
public static String DEFAULT_FONT_NAME = "sansserif";
44
public static int DEFAULT_FONT_SIZE = 10;
45
public static int DEFAULT_FONT_STYLE = Font.PLAIN;
47
public static String DEFAULT_NUMBER_FORMATTING = "#.####";
48
public static float DEFAULT_LINE_WIDTH = 1.0f;
50
public ScaleBarPainterController(final ScaleBarPainter scaleBarPainter) {
51
this.scaleBarPainter = scaleBarPainter;
53
final String defaultFontName = PREFS.get(CONTROLLER_KEY + "." + FONT_NAME_KEY, DEFAULT_FONT_NAME);
54
final int defaultFontStyle = PREFS.getInt(CONTROLLER_KEY + "." + FONT_STYLE_KEY, DEFAULT_FONT_STYLE);
55
final int defaultFontSize = PREFS.getInt(CONTROLLER_KEY + "." + FONT_SIZE_KEY, DEFAULT_FONT_SIZE);
56
final String defaultNumberFormatting = PREFS.get(CONTROLLER_KEY + "." + NUMBER_FORMATTING_KEY, DEFAULT_NUMBER_FORMATTING);
58
float lineWidth = PREFS.getFloat(LINE_WIDTH_KEY, DEFAULT_LINE_WIDTH);
60
scaleBarPainter.setFont(new Font(defaultFontName, defaultFontStyle, defaultFontSize));
61
scaleBarPainter.setNumberFormat(new DecimalFormat(defaultNumberFormatting));
62
scaleBarPainter.setScaleBarStroke(new BasicStroke(lineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
64
optionsPanel = new ControllerOptionsPanel(2, 2);
66
titleCheckBox = new JCheckBox(getTitle());
68
titleCheckBox.setSelected(scaleBarPainter.isVisible());
70
autoScaleCheck = new JCheckBox("Automatic scale");
71
autoScaleCheck.setSelected(true);
72
optionsPanel.addSpanningComponent(autoScaleCheck);
74
scaleRangeText = new RealNumberField(0.0, Double.MAX_VALUE);
75
scaleRangeText.setValue(0.0);
77
final JLabel label1 = optionsPanel.addComponentWithLabel("Scale Range:", scaleRangeText, true);
78
label1.setEnabled(false);
79
scaleRangeText.setEnabled(false);
81
Font font = scaleBarPainter.getFont();
82
fontSizeSpinner = new JSpinner(new SpinnerNumberModel(font.getSize(), 0.01, 48, 1));
84
final JLabel label2 = optionsPanel.addComponentWithLabel("Font Size:", fontSizeSpinner);
86
fontSizeSpinner.addChangeListener(new ChangeListener() {
87
public void stateChanged(ChangeEvent changeEvent) {
88
final float size = ((Double) fontSizeSpinner.getValue()).floatValue();
89
Font font = scaleBarPainter.getFont().deriveFont(size);
90
scaleBarPainter.setFont(font);
94
NumberFormat format = this.scaleBarPainter.getNumberFormat();
95
int digits = format.getMaximumFractionDigits();
96
digitsSpinner = new JSpinner(new SpinnerNumberModel(digits, 2, 14, 1));
97
final JLabel label3 = optionsPanel.addComponentWithLabel("Sig. Digits:", digitsSpinner);
99
digitsSpinner.addChangeListener(new ChangeListener() {
100
public void stateChanged(ChangeEvent changeEvent) {
101
final int digits = (Integer)digitsSpinner.getValue();
102
NumberFormat format = scaleBarPainter.getNumberFormat();
103
format.setMaximumFractionDigits(digits);
104
scaleBarPainter.setNumberFormat(format);
108
lineWeightSpinner = new JSpinner(new SpinnerNumberModel(1.0, 0.01, 48.0, 1.0));
110
lineWeightSpinner.addChangeListener(new ChangeListener() {
111
public void stateChanged(ChangeEvent changeEvent) {
112
float weight = ((Double) lineWeightSpinner.getValue()).floatValue();
113
scaleBarPainter.setScaleBarStroke(new BasicStroke(weight, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
116
final JLabel label4 = optionsPanel.addComponentWithLabel("Line Weight:", lineWeightSpinner);
118
final boolean isSelected1 = titleCheckBox.isSelected();
119
final boolean isSelected2 = autoScaleCheck.isSelected();
120
label1.setEnabled(isSelected1 && !isSelected2);
121
scaleRangeText.setEnabled(isSelected1 && !isSelected2);
122
label2.setEnabled(isSelected1);
123
fontSizeSpinner.setEnabled(isSelected1);
124
label3.setEnabled(isSelected1);
125
digitsSpinner.setEnabled(isSelected1);
126
label4.setEnabled(isSelected1);
127
lineWeightSpinner.setEnabled(isSelected1);
129
titleCheckBox.addChangeListener(new ChangeListener() {
130
public void stateChanged(ChangeEvent changeEvent) {
131
final boolean isSelected1 = titleCheckBox.isSelected();
132
final boolean isSelected2 = autoScaleCheck.isSelected();
134
autoScaleCheck.setEnabled(isSelected1);
135
label1.setEnabled(isSelected1 && !isSelected2);
136
scaleRangeText.setEnabled(isSelected1 && !isSelected2);
137
label2.setEnabled(isSelected1);
138
fontSizeSpinner.setEnabled(isSelected1);
139
label3.setEnabled(isSelected1);
140
digitsSpinner.setEnabled(isSelected1);
141
label4.setEnabled(isSelected1);
142
lineWeightSpinner.setEnabled(isSelected1);
144
scaleBarPainter.setVisible(isSelected1);
148
autoScaleCheck.addChangeListener(new ChangeListener() {
149
public void stateChanged(ChangeEvent changeEvent) {
150
if (autoScaleCheck.isSelected()) {
151
scaleBarPainter.setAutomaticScale(true);
152
double range = scaleBarPainter.getScaleRange();
153
scaleRangeText.setValue(range);
154
label1.setEnabled(false);
155
scaleRangeText.setEnabled(false);
157
label1.setEnabled(true);
158
scaleRangeText.setEnabled(true);
159
scaleBarPainter.setAutomaticScale(false);
164
scaleRangeText.addChangeListener(new ChangeListener() {
165
public void stateChanged(ChangeEvent changeEvent) {
166
Double value = scaleRangeText.getValue();
168
scaleBarPainter.setScaleRange(value);
174
public JComponent getTitleComponent() {
175
return titleCheckBox;
178
public JPanel getPanel() {
182
public boolean isInitiallyVisible() {
186
public void initialize() {
187
// force a toggle of the checkbox
188
autoScaleCheck.setSelected(false);
189
autoScaleCheck.setSelected(true);
192
public void setSettings(Map<String,Object> settings) {
193
titleCheckBox.setSelected((Boolean)settings.get(CONTROLLER_KEY + "." + IS_SHOWN));
194
autoScaleCheck.setSelected((Boolean)settings.get(CONTROLLER_KEY + "." + AUTOMATIC_SCALE_KEY));
195
scaleRangeText.setValue((Double)settings.get(CONTROLLER_KEY + "." + SCALE_RANGE_KEY));
196
fontSizeSpinner.setValue((Double)settings.get(CONTROLLER_KEY + "." + FONT_SIZE_KEY));
197
digitsSpinner.setValue((Integer)settings.get(CONTROLLER_KEY + "." + SIGNIFICANT_DIGITS_KEY));
198
lineWeightSpinner.setValue((Double)settings.get(CONTROLLER_KEY + "." + LINE_WIDTH_KEY));
201
public void getSettings(Map<String, Object> settings) {
202
settings.put(CONTROLLER_KEY + "." + IS_SHOWN, titleCheckBox.isSelected());
203
settings.put(CONTROLLER_KEY + "." + AUTOMATIC_SCALE_KEY, autoScaleCheck.isSelected());
204
settings.put(CONTROLLER_KEY + "." + SCALE_RANGE_KEY, scaleRangeText.getValue());
205
settings.put(CONTROLLER_KEY + "." + FONT_SIZE_KEY, fontSizeSpinner.getValue());
206
settings.put(CONTROLLER_KEY + "." + SIGNIFICANT_DIGITS_KEY, digitsSpinner.getValue());
207
settings.put(CONTROLLER_KEY + "." + LINE_WIDTH_KEY, lineWeightSpinner.getValue());
210
private final JCheckBox titleCheckBox;
211
private final OptionsPanel optionsPanel;
213
private final JCheckBox autoScaleCheck;
214
private final RealNumberField scaleRangeText;
215
private final JSpinner fontSizeSpinner;
216
private final JSpinner digitsSpinner;
217
private final JSpinner lineWeightSpinner;
219
public String getTitle() {
223
private final ScaleBarPainter scaleBarPainter;