/*
* Copyright 2006-2015 The MZmine 2 Development Team
*
* This file is part of MZmine 2.
*
* MZmine 2 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.
*
* MZmine 2 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 MZmine 2; if not,
* write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
package io.github.mzmine.util.jfreechart;
import java.net.URL;
import java.text.NumberFormat;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.XYPlot;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Window;
import javafx.util.converter.NumberStringConverter;
public class ManualZoomDialog extends Dialog<Void> {
private static final String DIALOG_FXML = "ManualZoomDialog.fxml";
private NumberAxis xAxis, yAxis;
@FXML
private Label xAxisLabel;
@FXML
private Label yAxisLabel;
@FXML
private TextField xAxisRangeMin;
@FXML
private TextField yAxisRangeMin;
@FXML
private TextField xAxisRangeMax;
@FXML
private TextField yAxisRangeMax;
@FXML
private TextField xAxisTickSize;
@FXML
private TextField yAxisTickSize;
@FXML
private CheckBox xAxisAutoRange;
@FXML
private CheckBox yAxisAutoRange;
@FXML
private CheckBox xAxisAutoTickSize;
@FXML
private CheckBox yAxisAutoTickSize;
/**
* Constructor
*/
public ManualZoomDialog(Window parent, XYPlot plot) {
initOwner(parent);
setTitle("Manual zoom");
setGraphic(new ImageView("file:icons/axesicon.png"));
getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
xAxis = (NumberAxis) plot.getDomainAxis();
yAxis = (NumberAxis) plot.getRangeAxis();
try {
URL layersDialogFXML = getClass().getResource(DIALOG_FXML);
FXMLLoader loader = new FXMLLoader(layersDialogFXML);
loader.setController(this);
GridPane grid = loader.load();
getDialogPane().setContent(grid);
} catch (Exception e) {
e.printStackTrace();
}
final Button btOk = (Button) getDialogPane().lookupButton(ButtonType.OK);
btOk.addEventFilter(ActionEvent.ACTION, event -> {
commitChanges(event);
});
}
@FXML
public void initialize() {
NumberFormat xAxisFormatter;
if (xAxis instanceof NumberAxis)
xAxisFormatter = ((NumberAxis) xAxis).getNumberFormatOverride();
else
xAxisFormatter = NumberFormat.getNumberInstance();
NumberFormat yAxisFormatter;
if (yAxis instanceof NumberAxis)
yAxisFormatter = ((NumberAxis) yAxis).getNumberFormatOverride();
else
yAxisFormatter = NumberFormat.getNumberInstance();
xAxisLabel.setText(xAxis.getLabel());
yAxisLabel.setText(yAxis.getLabel());
xAxisRangeMin.setTextFormatter(new TextFormatter<>(new NumberStringConverter(xAxisFormatter)));
xAxisRangeMin.disableProperty().bind(xAxisAutoRange.selectedProperty());
xAxisRangeMin.setText(String.valueOf(xAxis.getLowerBound()));
xAxisRangeMax.setTextFormatter(new TextFormatter<>(new NumberStringConverter(xAxisFormatter)));
xAxisRangeMax.disableProperty().bind(xAxisAutoRange.selectedProperty());
xAxisRangeMax.setText(String.valueOf(xAxis.getUpperBound()));
xAxisAutoRange.setSelected(xAxis.isAutoRange());
yAxisRangeMin.setTextFormatter(new TextFormatter<>(new NumberStringConverter(yAxisFormatter)));
yAxisRangeMin.setText(String.valueOf(yAxis.getLowerBound()));
yAxisRangeMin.disableProperty().bind(yAxisAutoRange.selectedProperty());
yAxisRangeMax.setTextFormatter(new TextFormatter<>(new NumberStringConverter(yAxisFormatter)));
yAxisRangeMax.setText(String.valueOf(yAxis.getUpperBound()));
yAxisRangeMax.disableProperty().bind(yAxisAutoRange.selectedProperty());
yAxisAutoRange.setSelected(yAxis.isAutoRange());
xAxisTickSize.disableProperty().bind(xAxisAutoTickSize.selectedProperty());
xAxisTickSize.setText(String.valueOf(xAxis.getTickUnit().getSize()));
xAxisAutoTickSize.setSelected(xAxis.isAutoTickUnitSelection());
yAxisTickSize.setTextFormatter(new TextFormatter<>(new NumberStringConverter(yAxisFormatter)));
yAxisTickSize.setText(String.valueOf(yAxis.getTickUnit().getSize()));
yAxisTickSize.disableProperty().bind(yAxisAutoTickSize.selectedProperty());
yAxisAutoTickSize.setSelected(yAxis.isAutoTickUnitSelection());
}
private void commitChanges(ActionEvent event) {
if (xAxisAutoRange.isSelected()) {
xAxis.setAutoRange(true);
} else {
double lower = Double.parseDouble(xAxisRangeMin.getText());
double upper = Double.parseDouble(xAxisRangeMax.getText());
if (lower > upper) {
Alert alert = new Alert(AlertType.ERROR, "Invalid " + xAxis.getLabel() + " range.");
alert.show();
event.consume();
return;
}
xAxis.setRange(lower, upper);
}
if (xAxisAutoTickSize.isSelected()) {
xAxis.setAutoTickUnitSelection(true);
} else {
double tickSize = Double.parseDouble(xAxisTickSize.getText());
xAxis.setTickUnit(new NumberTickUnit(tickSize));
}
if (yAxisAutoRange.isSelected()) {
yAxis.setAutoRange(true);
} else {
double lower = Double.parseDouble(yAxisRangeMin.getText());
double upper = Double.parseDouble(yAxisRangeMax.getText());
if (lower > upper) {
Alert alert = new Alert(AlertType.ERROR, "Invalid " + yAxis.getLabel() + " range.");
alert.show();
event.consume();
return;
}
yAxis.setRange(lower, upper);
}
if (yAxisAutoTickSize.isSelected()) {
yAxis.setAutoTickUnitSelection(true);
} else {
double tickSize = Double.parseDouble(yAxisTickSize.getText());
yAxis.setTickUnit(new NumberTickUnit(tickSize));
}
}
}