blob: 8dac3caba9b94406aee0b5d2d8d1621402f06dc6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.preference;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Scale;
/**
* A field editor for an integer type preference. This class may be used as is,
* or subclassed as required.
*
* @since 3.0
*/
public class ScaleFieldEditor extends FieldEditor {
/**
* Value that will feed Scale.setIncrement(int).
*/
private int incrementValue;
/**
* Value that will feed Scale.setMaximum(int).
*/
private int maxValue;
/**
* Value that will feed Scale.setMinimum(int).
*/
private int minValue;
/**
* Old integer value.
*/
private int oldValue;
/**
* Value that will feed Scale.setPageIncrement(int).
*/
private int pageIncrementValue;
/**
* The scale, or <code>null</code> if none.
*/
protected Scale scale;
/**
* Creates a scale field editor.
*
* @param name
* the name of the preference this field editor works on
* @param labelText
* the label text of the field editor
* @param parent
* the parent of the field editor's control
*/
public ScaleFieldEditor(String name, String labelText, Composite parent) {
super(name, labelText, parent);
setDefaultValues();
}
/**
* Creates a scale field editor with particular scale values.
*
* @param name
* the name of the preference this field editor works on
* @param labelText
* the label text of the field editor
* @param parent
* the parent of the field editor's control
* @param min
* the value used for Scale.setMinimum(int).
* @param max
* the value used for Scale.setMaximum(int).
* @param increment
* the value used for Scale.setIncrement(int).
* @param pageIncrement
* the value used for Scale.setPageIncrement(int).
*/
public ScaleFieldEditor(String name, String labelText, Composite parent,
int min, int max, int increment, int pageIncrement) {
super(name, labelText, parent);
setValues(min, max, increment, pageIncrement);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
*/
protected void adjustForNumColumns(int numColumns) {
((GridData) scale.getLayoutData()).horizontalSpan = numColumns - 1;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite,
* int)
*/
protected void doFillIntoGrid(Composite parent, int numColumns) {
Control control = getLabelControl(parent);
GridData gd = new GridData();
control.setLayoutData(gd);
scale = getScaleControl(parent);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.FILL;
gd.horizontalSpan = numColumns - 1;
gd.grabExcessHorizontalSpace = true;
scale.setLayoutData(gd);
updateScale();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doLoad()
*/
protected void doLoad() {
if (scale != null) {
int value = getPreferenceStore().getInt(getPreferenceName());
scale.setSelection(value);
oldValue = value;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
*/
protected void doLoadDefault() {
if (scale != null) {
int value = getPreferenceStore().getDefaultInt(getPreferenceName());
scale.setSelection(value);
}
valueChanged();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#doStore()
*/
protected void doStore() {
getPreferenceStore()
.setValue(getPreferenceName(), scale.getSelection());
}
/**
* Returns the value that will be used for Scale.setIncrement(int).
*
* @return the value.
* @see org.eclipse.swt.widgets.Scale#setIncrement(int)
*/
public int getIncrement() {
return incrementValue;
}
/**
* Returns the value that will be used for Scale.setMaximum(int).
*
* @return the value.
* @see org.eclipse.swt.widgets.Scale#setMaximum(int)
*/
public int getMaximum() {
return maxValue;
}
/**
* Returns the value that will be used for Scale.setMinimum(int).
*
* @return the value.
* @see org.eclipse.swt.widgets.Scale#setMinimum(int)
*/
public int getMinimum() {
return minValue;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
*/
public int getNumberOfControls() {
return 2;
}
/**
* Returns the value that will be used for Scale.setPageIncrement(int).
*
* @return the value.
* @see org.eclipse.swt.widgets.Scale#setPageIncrement(int)
*/
public int getPageIncrement() {
return pageIncrementValue;
}
/**
* Returns this field editor's scale control.
*
* @return the scale control, or <code>null</code> if no scale field is
* created yet
*/
public Scale getScaleControl() {
return scale;
}
/**
* Returns this field editor's scale control. The control is created if it
* does not yet exist.
*
* @param parent
* the parent
* @return the scale control
*/
private Scale getScaleControl(Composite parent) {
if (scale == null) {
scale = new Scale(parent, SWT.HORIZONTAL);
scale.setFont(parent.getFont());
scale.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
valueChanged();
}
});
scale.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
scale = null;
}
});
} else {
checkParent(scale, parent);
}
return scale;
}
/**
* Set default values for the various scale fields. These defaults are:<br>
* <ul>
* <li>Minimum = 0
* <li>Maximim = 10
* <li>Increment = 1
* <li>Page Increment = 1
* </ul>
*/
private void setDefaultValues() {
setValues(0, 10, 1, 1);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.FieldEditor#setFocus()
*/
public void setFocus() {
if (scale != null && !scale.isDisposed()) {
scale.setFocus();
}
}
/**
* Set the value to be used for Scale.setIncrement(int) and update the
* scale.
*
* @param increment
* a value greater than 0.
* @see org.eclipse.swt.widgets.Scale#setIncrement(int)
*/
public void setIncrement(int increment) {
this.incrementValue = increment;
updateScale();
}
/**
* Set the value to be used for Scale.setMaximum(int) and update the
* scale.
*
* @param max
* a value greater than 0.
* @see org.eclipse.swt.widgets.Scale#setMaximum(int)
*/
public void setMaximum(int max) {
this.maxValue = max;
updateScale();
}
/**
* Set the value to be used for Scale.setMinumum(int) and update the
* scale.
*
* @param min
* a value greater than 0.
* @see org.eclipse.swt.widgets.Scale#setMinimum(int)
*/
public void setMinimum(int min) {
this.minValue = min;
updateScale();
}
/**
* Set the value to be used for Scale.setPageIncrement(int) and update the
* scale.
*
* @param pageIncrement
* a value greater than 0.
* @see org.eclipse.swt.widgets.Scale#setPageIncrement(int)
*/
public void setPageIncrement(int pageIncrement) {
this.pageIncrementValue = pageIncrement;
updateScale();
}
/**
* Set all Scale values.
*
* @param min
* the value used for Scale.setMinimum(int).
* @param max
* the value used for Scale.setMaximum(int).
* @param increment
* the value used for Scale.setIncrement(int).
* @param pageIncrement
* the value used for Scale.setPageIncrement(int).
*/
private void setValues(int min, int max, int increment, int pageIncrement) {
this.incrementValue = increment;
this.maxValue = max;
this.minValue = min;
this.pageIncrementValue = pageIncrement;
updateScale();
}
/**
* Update the scale particulars with set values.
*/
private void updateScale() {
if (scale != null && !scale.isDisposed()) {
scale.setMinimum(getMinimum());
scale.setMaximum(getMaximum());
scale.setIncrement(getIncrement());
scale.setPageIncrement(getPageIncrement());
}
}
/**
* Informs this field editor's listener, if it has one, about a change to
* the value (<code>VALUE</code> property) provided that the old and new
* values are different.
* <p>
* This hook is <em>not</em> called when the scale is initialized (or
* reset to the default value) from the preference store.
* </p>
*/
protected void valueChanged() {
setPresentsDefaultValue(false);
int newValue = scale.getSelection();
if (newValue != oldValue) {
fireStateChanged(IS_VALID, false, true);
fireValueChanged(VALUE, new Integer(oldValue),
new Integer(newValue));
oldValue = newValue;
}
}
}