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.CharacterProperty; import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper; import net.sourceforge.pmd.util.StringUtil; 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.Listener; import org.eclipse.swt.widgets.Text; /** * * @author Brian Remedios */ public class CharacterEditorFactory extends AbstractEditorFactory { public static final CharacterEditorFactory instance = new CharacterEditorFactory(); private CharacterEditorFactory() { } public PropertyDescriptor<?> createDescriptor(String name, String description, Control[] otherData) { return new CharacterProperty( name, description, 'a', 0); } protected Object valueFrom(Control valueControl) { String value = ((Text)valueControl).getText().trim(); return (StringUtil.isEmpty(value) || value.length() > 1) ? null : Character.valueOf(value.charAt(0)); } /** * Method fillWidget. * @param textWidget Text * @param desc PropertyDescriptor<?> * @param rule Rule */ protected void fillWidget(Text textWidget, PropertyDescriptor<?> desc, PropertySource source) { Character val = (Character)valueFor(source, desc); textWidget.setText(val == null ? "" : val.toString()); } private static Character charValueIn(Text textControl) { String newValue = textControl.getText().trim(); if (newValue.length() == 0) return null; return Character.valueOf(newValue.charAt(0)); } private static CharacterProperty characterPropertyFrom(PropertyDescriptor<?> desc) { if (desc instanceof PropertyDescriptorWrapper<?>) { return (CharacterProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor(); } else { return (CharacterProperty)desc; } } public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) { final Text text = new Text(parent, SWT.SINGLE | SWT.BORDER); fillWidget(text, desc, source); final CharacterProperty cp = characterPropertyFrom(desc); // TODO - really necessary? text.addListener(SWT.FocusOut, new Listener() { public void handleEvent(Event event) { Character newValue = charValueIn(text); Character existingValue = (Character)valueFor(source, cp); if (existingValue.equals(newValue)) return; source.setProperty(cp, newValue); listener.changed(source, cp, newValue); adjustRendering(source, desc, text); } }); return text; } }