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.PropertyDescriptorWrapper;
import net.sourceforge.pmd.lang.rule.properties.TypeProperty;
import net.sourceforge.pmd.util.ClassUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
*
* @author Brian Remedios
*/
public class TypeEditorFactory extends AbstractEditorFactory {
public static final TypeEditorFactory instance = new TypeEditorFactory();
private TypeEditorFactory() { }
public PropertyDescriptor<?> createDescriptor(String name, String description, Control[] otherData) {
return new TypeProperty(
name,
description,
String.class,
new String[] { "java.lang" },
0.0f
);
}
public static Class<?> typeFor(String typeName) {
Class<?> newType = ClassUtil.getTypeFor(typeName); // try for well-known types first
if (newType != null) return newType;
try {
return Class.forName(typeName);
} catch (ClassNotFoundException e) {
return null;
}
}
protected Object valueFrom(Control valueControl) {
return ((TypeText)valueControl).getType(false);
}
protected void fillWidget(TypeText textWidget, PropertyDescriptor<?> desc, PropertySource source) {
Class<?> type = (Class<?>)valueFor(source, desc);
textWidget.setType(type);
}
private static TypeProperty typePropertyFrom(PropertyDescriptor<?> desc) {
if (desc instanceof PropertyDescriptorWrapper<?>) {
return (TypeProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor();
} else {
return (TypeProperty)desc;
}
}
public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) {
final TypeText typeText = new TypeText(parent, SWT.SINGLE | SWT.BORDER, true, "Enter a type name"); // TODO i18l
typeText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fillWidget(typeText, desc, source);
final TypeProperty tp = typePropertyFrom(desc);
Listener wereDoneListener = new Listener() {
public void handleEvent(Event event) {
Class<?> newValue = typeText.getType(true);
if (newValue == null) return;
Class<?> existingValue = (Class<?>)valueFor(source, tp);
if (existingValue == newValue) return;
source.setProperty(tp, newValue);
listener.changed(source, desc, newValue);
adjustRendering(source, desc, typeText);
}
};
typeText.addListener(SWT.FocusOut, wereDoneListener);
typeText.addListener(SWT.DefaultSelection, wereDoneListener);
return typeText;
}
}