package net.sourceforge.pmd.eclipse.ui.preferences.editors; import net.sourceforge.pmd.PropertyDescriptor; import net.sourceforge.pmd.PropertySource; import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; import net.sourceforge.pmd.lang.rule.properties.DoubleProperty; import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Spinner; /** * * @author Brian Remedios */ public class DoubleEditorFactory extends AbstractRealNumberEditor { public static final DoubleEditorFactory instance = new DoubleEditorFactory(); private DoubleEditorFactory() { } public PropertyDescriptor<?> createDescriptor(String name, String description, Control[] otherData) { return new DoubleProperty( name, description, defaultIn(otherData).doubleValue(), minimumIn(otherData).doubleValue(), maximumIn(otherData).doubleValue(), 0.0f ); } private static DoubleProperty doublePropertyFrom(PropertyDescriptor<?> desc) { if (desc instanceof PropertyDescriptorWrapper<?>) { return (DoubleProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor(); } else { return (DoubleProperty)desc; } } protected Object valueFrom(Control valueControl) { return Double.valueOf(((Spinner)valueControl).getSelection() / scale); } public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) { final DoubleProperty dp = doublePropertyFrom(desc); final Spinner spinner = newSpinnerFor(parent, source, dp); spinner.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent event) { Double newValue = Double.valueOf(spinner.getSelection() / scale); if (newValue.equals(valueFor(source, dp))) return; source.setProperty(dp, newValue); listener.changed(source, dp, newValue); adjustRendering(source, desc, spinner); } }); return spinner; } }