package net.sourceforge.pmd.eclipse.ui.preferences.editors; import java.io.File; 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.FileProperty; import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper; 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 FileEditorFactory extends AbstractEditorFactory { public static final FileEditorFactory instance = new FileEditorFactory(); protected FileEditorFactory() { } public PropertyDescriptor<?> createDescriptor(String name, String description, Control[] otherData) { return new FileProperty( name, description, new File(""), 0.0f ); } private static FileProperty filePropertyFrom(PropertyDescriptor<?> desc) { if (desc instanceof PropertyDescriptorWrapper<?>) { return (FileProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor(); } else { return (FileProperty)desc; } } private void setValue(PropertySource source, FileProperty desc, File value) { if (!source.hasDescriptor(desc)) return; source.setProperty(desc, value); } public static boolean areSemanticEquals(File fileA, File fileB) { if (fileA == fileB) return true; if (fileA == null && fileB != null) return false; if (fileA != null && fileB == null) return false; return fileA.equals(fileB); } protected void fillWidget(FilePicker fileWidget, PropertyDescriptor<?> desc, PropertySource source) { File val = (File)valueFor(source, desc); fileWidget.setFile(val == null ? null : val); adjustRendering(source, desc, fileWidget); } public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) { final FilePicker picker = new FilePicker(parent, SWT.SINGLE | SWT.BORDER, "Open", null); picker.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fillWidget(picker, desc, source); final FileProperty fp = filePropertyFrom(desc); // TODO - really necessary? picker.addFocusOutListener(new Listener() { public void handleEvent(Event event) { File newValue = picker.getFile(); File existingValue = (File)valueFor(source, fp); if (areSemanticEquals(existingValue, newValue)) return; setValue(source, fp, newValue); fillWidget(picker, desc, source); // redraw listener.changed(source, desc, newValue); } }); return picker; } @Override protected Object valueFrom(Control valueControl) { return ((FilePicker)valueControl).getFile(); } }