package net.sourceforge.pmd.eclipse.ui.preferences.editors;
import java.lang.reflect.Method;
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.MethodProperty;
import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper;
import net.sourceforge.pmd.util.ClassUtil;
import org.eclipse.swt.SWT;
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;
/**
*
* @author Brian Remedios
*/
public class MethodEditorFactory extends AbstractEditorFactory {
public static final MethodEditorFactory instance = new MethodEditorFactory();
public static final String[] UnwantedPrefixes = new String[] {
"java.lang.reflect.",
"java.lang.",
"java.util."
};
public static final Method stringLength = ClassUtil.methodFor(String.class, "length", ClassUtil.EMPTY_CLASS_ARRAY);
private MethodEditorFactory() { }
public PropertyDescriptor<?> createDescriptor(String name, String optionalDescription, Control[] otherData) {
return new MethodProperty(name, "Method value " + name, stringLength, new String[] { "java.lang" }, 0.0f);
}
protected Object valueFrom(Control valueControl) {
return ((MethodPicker)valueControl).getMethod();
}
protected void fillWidget(MethodPicker widget, PropertyDescriptor<?> desc, PropertySource source) {
Method method = (Method)valueFor(source, desc);
widget.setMethod(method);
adjustRendering(source, desc, widget);
}
private static MethodProperty methodPropertyFrom(PropertyDescriptor<?> desc) {
if (desc instanceof PropertyDescriptorWrapper<?>) {
return (MethodProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor();
} else {
return (MethodProperty)desc;
}
}
public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) {
final MethodPicker picker = new MethodPicker(parent, SWT.SINGLE | SWT.BORDER, UnwantedPrefixes);
picker.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fillWidget(picker, desc, source);
final MethodProperty mp = methodPropertyFrom(desc);
picker.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Method newValue = picker.getMethod();
if (newValue == null) return;
Method existingValue = (Method)valueFor(source, mp);
if (existingValue == newValue) return;
source.setProperty(mp, newValue);
fillWidget(picker, desc, source); // redraw
listener.changed(source, desc, newValue);
}
});
return picker;
}
}