/* ===========================================================
* JFreeChart : a free chart library for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2000-2011, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jfreechart/index.html
*
* This library 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.1 of the License, or
* (at your option) any later version.
*
* This library 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 this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.]
*
* ------------------------
* SWTNumberAxisEditor.java
* ------------------------
* (C) Copyright 2006, 2007, by Henry Proudhon and Contributors.
*
* Original Author: Henry Proudhon (henry.proudhon AT ensmp.fr);
* Contributor(s): David Gilbert (for Object Refinery Limited);
*
* Changes
* -------
* 01-Aug-2006 : New class (HP);
*
*/
package org.jfree.experimental.chart.swt.editor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.jfree.chart.axis.Axis;
import org.jfree.chart.axis.NumberAxis;
/**
* An editor for {@link NumberAxis} properties.
*/
class SWTNumberAxisEditor extends SWTAxisEditor implements FocusListener {
/** A flag that indicates whether or not the axis range is determined
* automatically.
*/
private boolean autoRange;
/** The lowest value in the axis range. */
private double minimumValue;
/** The highest value in the axis range. */
private double maximumValue;
/** A checkbox that indicates whether or not the axis range is determined
* automatically.
*/
private Button autoRangeCheckBox;
/** A text field for entering the minimum value in the axis range. */
private Text minimumRangeValue;
/** A text field for entering the maximum value in the axis range. */
private Text maximumRangeValue;
/**
* Creates a new editor.
*
* @param parent the parent.
* @param style the style.
* @param axis the axis.
*/
public SWTNumberAxisEditor(Composite parent, int style, NumberAxis axis) {
super(parent, style, axis);
this.autoRange = axis.isAutoRange();
this.minimumValue = axis.getLowerBound();
this.maximumValue = axis.getUpperBound();
TabItem item2 = new TabItem(getOtherTabs(), SWT.NONE);
item2.setText(" " + localizationResources.getString("Range") + " ");
Composite range = new Composite(getOtherTabs(), SWT.NONE);
range.setLayout(new GridLayout(2, true));
item2.setControl(range);
this.autoRangeCheckBox = new Button(range, SWT.CHECK);
this.autoRangeCheckBox.setText(localizationResources.getString(
"Auto-adjust_range"));
this.autoRangeCheckBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
true, false, 2, 1));
this.autoRangeCheckBox.setSelection(this.autoRange);
this.autoRangeCheckBox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
toggleAutoRange();
}
});
new Label(range, SWT.NONE).setText(localizationResources.getString(
"Minimum_range_value"));
this.minimumRangeValue = new Text(range, SWT.BORDER);
this.minimumRangeValue.setText(String.valueOf(this.minimumValue));
this.minimumRangeValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
true, false));
this.minimumRangeValue.setEnabled(!this.autoRange);
//this.minimumRangeValue.addModifyListener(this);
//this.minimumRangeValue.addVerifyListener(this);
this.minimumRangeValue.addFocusListener(this);
new Label(range, SWT.NONE).setText(localizationResources.getString(
"Maximum_range_value"));
this.maximumRangeValue = new Text(range, SWT.BORDER);
this.maximumRangeValue.setText(String.valueOf(this.maximumValue));
this.maximumRangeValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
true, false));
this.maximumRangeValue.setEnabled(!this.autoRange);
//this.maximumRangeValue.addModifyListener(this);
//this.maximumRangeValue.addVerifyListener(this);
this.maximumRangeValue.addFocusListener(this);
}
/**
* Toggle the auto range setting.
*/
public void toggleAutoRange() {
this.autoRange = this.autoRangeCheckBox.getSelection();
if (this.autoRange) {
this.minimumRangeValue.setText(Double.toString(this.minimumValue));
this.minimumRangeValue.setEnabled(false);
this.maximumRangeValue.setText(Double.toString(this.maximumValue));
this.maximumRangeValue.setEnabled(false);
}
else {
this.minimumRangeValue.setEnabled(true);
this.maximumRangeValue.setEnabled(true);
}
}
/**
* Revalidate the range minimum:
* it should be less than the current maximum.
*
* @param candidate the minimum value
*
* @return A boolean.
*/
public boolean validateMinimum(String candidate)
{
boolean valid = true;
try {
if (Double.parseDouble(candidate) >= this.maximumValue) {
valid = false;
}
}
catch (NumberFormatException e) {
valid = false;
}
return valid;
}
/**
* Revalidate the range maximum:
* it should be greater than the current minimum
*
* @param candidate the maximum value
*
* @return A boolean.
*/
public boolean validateMaximum(String candidate)
{
boolean valid = true;
try {
if (Double.parseDouble(candidate) <= this.minimumValue) {
valid = false;
}
}
catch (NumberFormatException e) {
valid = false;
}
return valid;
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.FocusListener#focusGained(
* org.eclipse.swt.events.FocusEvent)
*/
public void focusGained(FocusEvent e) {
// don't need to do anything
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.FocusListener#focusLost(
* org.eclipse.swt.events.FocusEvent)
*/
public void focusLost(FocusEvent e) {
if (e.getSource() == this.minimumRangeValue) {
// verify min value
if (!validateMinimum(this.minimumRangeValue.getText()))
this.minimumRangeValue.setText(String.valueOf(
this.minimumValue));
else
this.minimumValue = Double.parseDouble(
this.minimumRangeValue.getText());
}
else if (e.getSource() == this.maximumRangeValue) {
// verify max value
if (!validateMaximum(this.maximumRangeValue.getText()))
this.maximumRangeValue.setText(String.valueOf(
this.maximumValue));
else
this.maximumValue = Double.parseDouble(
this.maximumRangeValue.getText());
}
}
/**
* Sets the properties of the specified axis to match
* the properties defined on this panel.
*
* @param axis the axis.
*/
public void setAxisProperties(Axis axis) {
super.setAxisProperties(axis);
NumberAxis numberAxis = (NumberAxis) axis;
numberAxis.setAutoRange(this.autoRange);
if (!this.autoRange) {
numberAxis.setRange(this.minimumValue, this.maximumValue);
}
}
}