package net.sourceforge.pmd.eclipse.ui.preferences.editors;
import net.sourceforge.pmd.PropertyDescriptor;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Spinner;
/**
*
* @author Brian Remedios
*/
public abstract class AbstractNumericEditorFactory extends AbstractEditorFactory {
public static final int defaultMinimum = 0;
public static final int defaultMaximum = 1000;
protected AbstractNumericEditorFactory() {
}
protected static Spinner newSpinnerFor(Composite parent, int digits) {
Spinner spinner = new Spinner(parent, SWT.BORDER);
spinner.setDigits(digits);
return spinner;
}
protected int digitPrecision() {
return 0;
}
public Control[] createOtherControlsOn(Composite parent, PropertyDescriptor<?> desc, Rule rule, ValueChangeListener listener, SizeChangeListener sizeListener) {
Label defaultLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.RULEEDIT_LABEL_DEFAULT));
Control valueControl = newEditorOn(parent, desc, rule, listener, sizeListener);
Label minLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.RULEEDIT_LABEL_MIN));
Spinner minWidget = newSpinnerFor(parent, digitPrecision());
Label maxLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.RULEEDIT_LABEL_MAX));
Spinner maxWidget = newSpinnerFor(parent, digitPrecision());
linkup(minWidget, (Spinner)valueControl, maxWidget);
return new Control[] {
defaultLabel, valueControl,
minLabel, minWidget,
maxLabel, maxWidget
};
}
private void linkup(final Spinner minWidget, final Spinner valueWidget, final Spinner maxWidget) {
minWidget.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
adjustForMin(minWidget, valueWidget, maxWidget);
}
});
valueWidget.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
adjustForValue(minWidget, valueWidget, maxWidget);
}
});
maxWidget.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
adjustForMax(minWidget, valueWidget, maxWidget);
}
});
}
private void adjustForMin(Spinner minWidget, Spinner valueWidget, Spinner maxWidget) {
int min = minWidget.getSelection();
if (valueWidget.getSelection() < min) valueWidget.setSelection(min);
if (maxWidget.getSelection() < min) maxWidget.setSelection(min);
}
private void adjustForValue(Spinner minWidget, Spinner valueWidget, Spinner maxWidget) {
int value = valueWidget.getSelection();
if (minWidget.getSelection() > value) minWidget.setSelection(value);
if (maxWidget.getSelection() < value) maxWidget.setSelection(value);
}
private void adjustForMax(Spinner minWidget, Spinner valueWidget, Spinner maxWidget) {
int max = maxWidget.getSelection();
if (valueWidget.getSelection() > max) valueWidget.setSelection(max);
if (minWidget.getSelection() > max) minWidget.setSelection(max);
}
protected Number defaultIn(Control[] controls) {
return controls == null ?
Integer.valueOf(defaultMinimum) :
(Number)valueFrom(controls[1]);
}
protected Number minimumIn(Control[] controls) {
return controls == null ?
Integer.valueOf(0) :
(Number)valueFrom(controls[3]);
}
protected Number maximumIn(Control[] controls) {
return controls == null ?
Integer.valueOf(defaultMaximum) :
(Number)valueFrom(controls[5]);
}
}