/*
* ChartSetupDialog.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.gui.chart;
import dr.app.gui.components.RealNumberField;
import jam.panels.OptionsPanel;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.border.EmptyBorder;
public class ChartSetupDialog {
private final JFrame frame;
private final JCheckBox logXAxis;
private final JCheckBox logYAxis;
private final JCheckBox manualXAxis;
private final JCheckBox manualYAxis;
private final RealNumberField minXValue;
private final RealNumberField maxXValue;
private final RealNumberField minYValue;
private final RealNumberField maxYValue;
private final boolean canLogXAxis;
private final boolean canLogYAxis;
private final int defaultMinXAxisFlag;
private final int defaultMaxXAxisFlag;
private final int defaultMinYAxisFlag;
private final int defaultMaxYAxisFlag;
private OptionsPanel optionPanel;
public ChartSetupDialog(final JFrame frame, boolean canLogXAxis, boolean canLogYAxis,
int defaultMinXAxisFlag, int defaultMaxXAxisFlag,
int defaultMinYAxisFlag, int defaultMaxYAxisFlag) {
this.frame = frame;
this.canLogXAxis = canLogXAxis;
this.canLogYAxis = canLogYAxis;
this.defaultMinXAxisFlag = defaultMinXAxisFlag;
this.defaultMaxXAxisFlag = defaultMaxXAxisFlag;
this.defaultMinYAxisFlag = defaultMinYAxisFlag;
this.defaultMaxYAxisFlag = defaultMaxYAxisFlag;
logXAxis = new JCheckBox("Log axis");
manualXAxis = new JCheckBox("Manual range");
minXValue = new RealNumberField();
minXValue.setColumns(12);
maxXValue = new RealNumberField();
maxXValue.setColumns(12);
logYAxis = new JCheckBox("Log axis");
manualYAxis = new JCheckBox("Manual range");
minYValue = new RealNumberField();
minYValue.setColumns(12);
maxYValue = new RealNumberField();
maxYValue.setColumns(12);
optionPanel = new OptionsPanel(12, 12);
optionPanel.addSpanningComponent(new JLabel("X Axis"));
if (canLogXAxis) {
optionPanel.addComponent(logXAxis);
}
optionPanel.addComponent(manualXAxis);
final JLabel minXLabel = new JLabel("Minimum Value:");
optionPanel.addComponents(minXLabel, minXValue);
final JLabel maxXLabel = new JLabel("Maximum Value:");
optionPanel.addComponents(maxXLabel, maxXValue);
manualXAxis.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final boolean xaSelected = manualXAxis.isSelected();
minXLabel.setEnabled(xaSelected);
minXValue.setEnabled(xaSelected);
maxXLabel.setEnabled(xaSelected);
maxXValue.setEnabled(xaSelected);
}
});
manualXAxis.setSelected(true);
manualXAxis.setSelected(false);
optionPanel.addSeparator();
optionPanel.addSpanningComponent(new JLabel("Y Axis"));
if (canLogYAxis) {
optionPanel.addComponent(logYAxis);
}
optionPanel.addComponent(manualYAxis);
final JLabel minYLabel = new JLabel("Minimum Value:");
optionPanel.addComponents(minYLabel, minYValue);
final JLabel maxYLabel = new JLabel("Maximum Value:");
optionPanel.addComponents(maxYLabel, maxYValue);
manualYAxis.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
final boolean yaSelected = manualYAxis.isSelected();
minYLabel.setEnabled(yaSelected);
minYValue.setEnabled(yaSelected);
maxYLabel.setEnabled(yaSelected);
maxYValue.setEnabled(yaSelected);
}
});
manualYAxis.setSelected(true);
manualYAxis.setSelected(false);
}
public int showDialog(JChart chart) {
JOptionPane optionPane = new JOptionPane(optionPanel,
JOptionPane.QUESTION_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null,
null,
null);
optionPane.setBorder(new EmptyBorder(12, 12, 12, 12));
Axis xAxis = chart.getXAxis();
Axis yAxis = chart.getYAxis();
if (canLogXAxis) {
logXAxis.setSelected(xAxis instanceof LogAxis);
}
if (canLogYAxis) {
logYAxis.setSelected(yAxis instanceof LogAxis);
}
if (!manualXAxis.isSelected()) {
minXValue.setValue(xAxis.getMinAxis());
maxXValue.setValue(xAxis.getMaxAxis());
}
if (!manualYAxis.isSelected()) {
minYValue.setValue(yAxis.getMinAxis());
maxYValue.setValue(yAxis.getMaxAxis());
}
final JDialog dialog = optionPane.createDialog(frame, "Setup Chart");
dialog.pack();
dialog.setVisible(true);
final Integer value = (Integer)optionPane.getValue();
final int result = (value != null && value != -1) ? value : JOptionPane.CANCEL_OPTION;
if (result == JOptionPane.OK_OPTION) {
applySettings(chart);
}
return result;
}
public void applySettings(JChart chart) {
Axis xAxis = chart.getXAxis();
Axis yAxis = chart.getYAxis();
if (canLogXAxis) {
if (logXAxis.isSelected()) {
xAxis = new LogAxis();
} else {
xAxis = new LinearAxis();
}
chart.setXAxis(xAxis);
}
if (manualXAxis.isSelected()) {
xAxis.setManualRange(minXValue.getValue(), maxXValue.getValue());
xAxis.setAxisFlags(Axis.AT_VALUE, Axis.AT_VALUE);
} else {
xAxis.setAxisFlags(defaultMinXAxisFlag, defaultMaxXAxisFlag);
}
if (canLogYAxis) {
if (logYAxis.isSelected()) {
yAxis = new LogAxis();
} else {
yAxis = new LinearAxis();
}
chart.setYAxis(yAxis);
}
if (manualYAxis.isSelected()) {
yAxis.setManualRange(minYValue.getValue(), maxYValue.getValue());
yAxis.setAxisFlags(Axis.AT_VALUE, Axis.AT_VALUE);
} else {
yAxis.setAxisFlags(defaultMinYAxisFlag, defaultMaxYAxisFlag);
}
}
}