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.BooleanProperty;
import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* @author Brian Remedios
*/
public class BooleanEditorFactory extends AbstractEditorFactory {
public static final BooleanEditorFactory instance = new BooleanEditorFactory();
private BooleanEditorFactory() { }
public PropertyDescriptor<?> createDescriptor(String name, String description, Control[] otherData) {
return new BooleanProperty(
name,
description,
otherData == null ? Boolean.FALSE : valueFrom(otherData[1]),
0
);
}
private static BooleanProperty booleanPropertyFrom(PropertyDescriptor<?> desc) {
if (desc instanceof PropertyDescriptorWrapper<?>) {
return (BooleanProperty) ((PropertyDescriptorWrapper<?>)desc).getPropertyDescriptor();
} else {
return (BooleanProperty)desc;
}
}
protected Boolean valueFrom(Control valueControl) {
return ((Button)valueControl).getSelection() ? Boolean.TRUE : Boolean.FALSE;
}
public Control newEditorOn(Composite parent, final PropertyDescriptor<?> desc, final PropertySource source, final ValueChangeListener listener, SizeChangeListener sizeListener) {
final Button butt = new Button(parent, SWT.CHECK);
butt.setText("");
final BooleanProperty bp = booleanPropertyFrom(desc); // TODO - do I really have to do this?
boolean set = ((Boolean)valueFor(source, desc)).booleanValue();
butt.setSelection(set);
SelectionAdapter sa = new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
boolean selected = butt.getSelection();
if (selected == (((Boolean)valueFor(source, bp))).booleanValue()) return;
source.setProperty(bp, Boolean.valueOf(selected));
listener.changed(source, desc, Boolean.valueOf(selected));
adjustRendering(source, desc, butt);
}
};
butt.addSelectionListener(sa);
return butt;
}
}