package net.sourceforge.pmd.eclipse.ui.preferences.editors;
import net.sourceforge.pmd.PropertyDescriptor;
import net.sourceforge.pmd.PropertySource;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.ui.preferences.br.EditorFactory;
import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener;
import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener;
import net.sourceforge.pmd.eclipse.util.ColourManager;
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.Label;
/**
*
* @author Brian Remedios
*/
public abstract class AbstractEditorFactory implements EditorFactory {
protected static ColourManager colourManager;
// protected static Color overriddenColour;
protected AbstractEditorFactory() { }
// private static ColourManager colourManager() {
//
// if (colourManager != null) return colourManager;
// colourManager = ColourManager.managerFor(Display.getCurrent());
// return colourManager;
// }
// private Color overriddenColour() {
//
// if (overriddenColour != null) return overriddenColour;
//
// overriddenColour = colourManager().colourFor(AbstractRulePanelManager.overridenColourValues);
// return overriddenColour;
// }
protected Label newLabel(Composite parent, String text) {
Label label = new Label(parent, SWT.None);
label.setText(text);
return label;
}
/**
* Generic control that provides a label/widget pair for the default value. Subclasses can override this to provide additional
* labels & widgets as necessary but must be able to extract the values held by them when the property is created.
*/
public Control[] createOtherControlsOn(Composite parent, PropertyDescriptor<?> desc, PropertySource source, ValueChangeListener listener, SizeChangeListener sizeListener) {
return new Control[] {
newLabel(parent,"Default"),
newEditorOn(parent, desc, source, listener, sizeListener)
};
}
protected abstract Object valueFrom(Control valueControl);
protected Object valueFor(PropertySource source, PropertyDescriptor<?> desc) {
return source.hasDescriptor(desc) ?
source.getProperty(desc) :
desc.defaultValue();
}
/**
* Method addLabel.
* @param parent Composite
* @param desc PropertyDescriptor
* @return Label
*/
public Label addLabel(Composite parent, PropertyDescriptor<?> desc) {
Label label = new Label(parent, SWT.NONE);
label.setText(desc.description());
GridData data = new GridData();
data.horizontalAlignment = SWT.LEFT;
data.verticalAlignment = SWT.CENTER; // CENTER is preferred only when showing a single row value widget...hmm
label.setLayoutData(data);
return label;
}
/**
* Return the value as a string that can be easily recognized and parsed
* when we see it again.
*
* @param value Object
* @return String
*/
protected static String asString(Object value) {
return value == null ? "" : value.toString();
}
/**
* Adjust the display of the control to denote whether it holds
* onto the default value or not.
*
* @param control
* @param hasDefaultValue
*/
// protected void adjustRendering(Control control, boolean hasDefaultValue) {
//
// Display display = control.getDisplay();
//
// control.setBackground(
// display.getSystemColor(hasDefaultValue ? SWT.COLOR_WHITE : SWT.COLOR_CYAN)
// );
// }
protected void adjustRendering(PropertySource source, PropertyDescriptor<?> desc, Control control) {
return; // don't do it...kinda irritating
// if (!(rule instanceof RuleReference)) return;
//
// boolean isOverridden = ((RuleReference)rule).hasOverriddenProperty(desc);
// Display display = control.getDisplay();
// Color clr = isOverridden ? overriddenColour() : display.getSystemColor(SWT.COLOR_WHITE);
//
// control.setBackground(clr);
}
/**
* Return the specified values as a single string using the delimiter.
* @param values Object
* @param delimiter char
* @return String
* @see net.sourceforge.pmd.PropertyDescriptor#asDelimitedString(Object)
*/
public static String asDelimitedString(Object values, char delimiter) {
if (values == null) {
return "";
}
if (values instanceof Object[]) {
Object[] valueSet = (Object[])values;
if (valueSet.length == 0) {
return "";
}
if (valueSet.length == 1) {
return asString(valueSet[0]);
}
StringBuilder sb = new StringBuilder(asString(valueSet[0]));
for (int i=1; i<valueSet.length; i++) {
sb.append(delimiter).append(asString(valueSet[i]));
}
return sb.toString();
}
return asString(values);
}
}