diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/messages.properties b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/messages.properties index 3b1c88683e..56037a0d35 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/messages.properties +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/messages.properties @@ -109,6 +109,9 @@ preference.ruleedit.tab.examples = Examples preference.ruleedit.label.exclusion_regex = Exclusion regular expression preference.ruleedit.label.xpath_exclusion = XPath exclusion expression preference.ruleedit.label.colour_code = Color code +preference.ruleedit.label.min = Min +preference.ruleedit.label.max = Max +preference.ruleedit.label.default = Default preference.ruleedit.label.ruleset_name = RuleSet name : preference.ruleedit.label.since = Since : diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/nls/StringKeys.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/nls/StringKeys.java index 54723eb6ed..bf48ce915f 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/nls/StringKeys.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/nls/StringKeys.java @@ -240,6 +240,9 @@ public class StringKeys { public static final String MSGKEY_DIALOG_PREFS_ADD_NEW_PROPERTY = "dialog.preferences.add_new_property"; + public static final String MSGKEY_RULEEDIT_LABEL_MIN = "preference.ruleedit.label.min"; + public static final String MSGKEY_RULEEDIT_LABEL_MAX = "preference.ruleedit.label.max"; + public static final String MSGKEY_RULEEDIT_LABEL_DEFAULT = "preference.ruleedit.label.default"; public static final String MSGKEY_DIALOG_CPD_TITLE = "dialog.cpd.title"; public static final String MSGKEY_DIALOG_CPD_MIN_TILESIZE_LABEL = "dialog.cpd.min_tilesize.label"; diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/br/TODO items b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/br/TODO items index 1e8232bd02..7878875f1c 100755 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/br/TODO items +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/br/TODO items @@ -1,4 +1,4 @@ -ToDo items: Jan 2nd 2010 +ToDo items: Jan 6th 2010 Finish remaining editors and the Add Property dialog @@ -10,10 +10,10 @@ Remember settings for: sort column & order rule table screen fraction - Items needing support in PMD itself: Enable non-intrinsic property field removal Enable/disable rules w/out removing from ruleset Enable rule reassignment to different rulesets Add support for creating new rulesets & descriptions for same +For multi-value properties, decide whether to allow unique or duplicate values (default to Set behaviour) diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractMultiValueEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractMultiValueEditorFactory.java index 6a7cd9ee86..5b3e0f0282 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractMultiValueEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractMultiValueEditorFactory.java @@ -19,6 +19,7 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; /** @@ -164,8 +165,27 @@ public abstract class AbstractMultiValueEditorFactory extends AbstractEditorFact return newControls; } + /** + * Override in subclasses as necessary + * @param desc + * @param rule + * @return + */ + protected boolean canAddNewRowFor(final PropertyDescriptor desc, final Rule rule) { + return true; + } + + protected void setupDefaultActionFor(Control widget, Listener listener) { + + // if (widget instanceof Text || widget instanceof Spinner) { + widget.addListener(SWT.DefaultSelection, listener); + // } + } + private void addNewValueRow(final Composite parent, final PropertyDescriptor desc, final Rule rule, final Text parentWidget, final ValueChangeListener changeListener, final SizeChangeListener sizeListener, final List newControls, int i) { + if (!canAddNewRowFor(desc, rule)) return; + final Label number = new Label(parent, SWT.NONE); number.setText(Integer.toString(i+1)); newControls.add(number); @@ -175,7 +195,7 @@ public abstract class AbstractMultiValueEditorFactory extends AbstractEditorFact final Button butt = new Button(parent, SWT.BORDER); butt.setText("+"); // TODO use icon for consistent width newControls.add(butt); - butt.addListener(SWT.Selection, new Listener() { + Listener addListener = new Listener() { public void handleEvent(Event event) { // add new value handler // add the new value to the property set // set the value in the widget to the cleaned up one, disable it @@ -197,7 +217,9 @@ public abstract class AbstractMultiValueEditorFactory extends AbstractEditorFact changeListener.changed(rule, desc, newValue); parent.getParent().layout(); } - } ); + }; + butt.addListener(SWT.Selection, addListener); + setupDefaultActionFor(widget, addListener); // allow for CR on entry widgets themselves, no need to click the '+' button } private void convertToDelete(final Button button, final Object toDeleteValue, final Composite parent, final List newControls, final PropertyDescriptor desc, final Rule rule, final Text parentWidget, final Label number, final Control widget, final ValueChangeListener changeListener, final SizeChangeListener sizeListener) { diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractNumericEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractNumericEditorFactory.java index f66c653b96..06fc6c7003 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractNumericEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/AbstractNumericEditorFactory.java @@ -2,6 +2,7 @@ package net.sourceforge.pmd.eclipse.ui.preferences.editors; import net.sourceforge.pmd.PropertyDescriptor; import net.sourceforge.pmd.Rule; +import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import net.sourceforge.pmd.eclipse.ui.preferences.br.SizeChangeListener; import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; @@ -38,12 +39,12 @@ public abstract class AbstractNumericEditorFactory extends AbstractEditorFactory public Control[] createOtherControlsOn(Composite parent, PropertyDescriptor desc, Rule rule, ValueChangeListener listener, SizeChangeListener sizeListener) { - Label defaultLabel = newLabel(parent, "Default"); + Label defaultLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.MSGKEY_RULEEDIT_LABEL_DEFAULT)); Control valueControl = newEditorOn(parent, desc, rule, listener, sizeListener); - Label minLabel = newLabel(parent, "Min"); // TODO i18l + Label minLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.MSGKEY_RULEEDIT_LABEL_MIN)); Spinner minWidget = newSpinnerFor(parent, digitPrecision()); - Label maxLabel = newLabel(parent, "Max"); // TODO i18l + Label maxLabel = newLabel(parent, SWTUtil.stringFor(StringKeys.MSGKEY_RULEEDIT_LABEL_MAX)); Spinner maxWidget = newSpinnerFor(parent, digitPrecision()); linkup(minWidget, (Spinner)valueControl, maxWidget); diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java index 1e9485ef7f..39aaaebf25 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/DoubleEditorFactory.java @@ -7,13 +7,10 @@ import net.sourceforge.pmd.eclipse.ui.preferences.br.ValueChangeListener; import net.sourceforge.pmd.lang.rule.properties.DoubleProperty; import net.sourceforge.pmd.lang.rule.properties.PropertyDescriptorWrapper; -import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Spinner; /** diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java index 2a015d0500..91a7b8de99 100755 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiEnumerationEditorFactory.java @@ -54,16 +54,29 @@ public class MultiEnumerationEditorFactory extends AbstractMultiValueEditorFacto String[] newValues = CollectionUtil.addWithoutDuplicates(currentValues, newValue); if (currentValues.length == newValues.length) return null; - rule.setProperty((StringMultiProperty)desc, newValues); + rule.setProperty((EnumeratedMultiProperty)desc, newValues); return newValue; } + /** + * Only add a new widget row if there are any remaining choices to make + */ + @Override + protected boolean canAddNewRowFor(PropertyDescriptor desc, Rule rule) { + + Object[] choices = desc.choices(); + Object[] values = (Object[])rule.getProperty(desc); + + return choices.length > values.length; + } + @Override protected Control addWidget(Composite parent, Object value, PropertyDescriptor desc, Rule rule) { final Combo combo = new Combo(parent, SWT.READ_ONLY); final EnumeratedMultiProperty ep = enumerationPropertyFrom(desc); + // TODO remove all choices already chosen by previous widgets combo.setItems(SWTUtil.labelsIn(ep.choices(), 0)); int selectionIdx = EnumerationEditorFactory.indexOf(value, ep.choices()); @@ -72,12 +85,6 @@ public class MultiEnumerationEditorFactory extends AbstractMultiValueEditorFacto return combo; } - @Override - protected void configure(Text text, PropertyDescriptor desc, Rule rule, ValueChangeListener listener) { - // TODO Auto-generated method stub - - } - @Override protected void setValue(Control widget, Object value) { // not necessary, set in addWidget method? @@ -89,14 +96,17 @@ public class MultiEnumerationEditorFactory extends AbstractMultiValueEditorFacto } @Override - protected Object valueFrom(Control valueControl) { - // unreferenced method? + protected Object valueFrom(Control valueControl) { // unreferenced method? return null; } public PropertyDescriptor createDescriptor(String name, String description, Control[] otherData) { - // TODO Auto-generated method stub return null; } + @Override + protected void configure(Text text, PropertyDescriptor desc, Rule rule, ValueChangeListener listener) { + text.setEditable(false); + } + } diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiMethodEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiMethodEditorFactory.java index aa6bcd0fda..5431f932bc 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiMethodEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiMethodEditorFactory.java @@ -40,12 +40,7 @@ public class MultiMethodEditorFactory extends AbstractMultiValueEditorFactory { } return typeNames; } - - protected Object valueFrom(Control valueControl) { - - return null; // TODO - } - + private static String asString(Map> methodGroups) { if (methodGroups.isEmpty()) return ""; @@ -127,4 +122,8 @@ public class MultiMethodEditorFactory extends AbstractMultiValueEditorFactory { rule.setProperty((MethodMultiProperty)desc, newValues); return newValue; } + + protected Object valueFrom(Control valueControl) { // not necessary for this type + return null; + } } diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiStringEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiStringEditorFactory.java index ffea794c02..50434fc43a 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiStringEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiStringEditorFactory.java @@ -39,11 +39,6 @@ public class MultiStringEditorFactory extends AbstractMultiValueEditorFactory { return (StringMultiProperty)desc; } } - - protected Object valueFrom(Control valueControl) { - - return null; // TODO - } protected Control addWidget(Composite parent, Object value, PropertyDescriptor desc, Rule rule) { Text textWidget = new Text(parent, SWT.SINGLE | SWT.BORDER); @@ -59,7 +54,7 @@ public class MultiStringEditorFactory extends AbstractMultiValueEditorFactory { final StringMultiProperty smp = multiStringPropertyFrom(desc); - textWidget.addListener(SWT.FocusOut, new Listener() { + Listener widgetListener = new Listener() { public void handleEvent(Event event) { String[] newValues = textWidgetValues(textWidget); String[] existingValues = (String[])valueFor(rule, smp); @@ -68,8 +63,11 @@ public class MultiStringEditorFactory extends AbstractMultiValueEditorFactory { rule.setProperty(smp, newValues); fillWidget(textWidget, desc, rule); // reload with latest scrubbed values listener.changed(rule, desc, newValues); - } - }); + } + }; + + textWidget.addListener(SWT.FocusOut, widgetListener); +// textWidget.addListener(SWT.DefaultSelection, widgetListener); } @Override @@ -90,4 +88,8 @@ public class MultiStringEditorFactory extends AbstractMultiValueEditorFactory { rule.setProperty((StringMultiProperty)desc, newValues); return newValue; } + + protected Object valueFrom(Control valueControl) { // not necessary for this type + return null; + } } diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiTypeEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiTypeEditorFactory.java index a4bdd2a1aa..5001f3f963 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiTypeEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/MultiTypeEditorFactory.java @@ -42,11 +42,6 @@ public class MultiTypeEditorFactory extends AbstractMultiValueEditorFactory { return typeNames; } - protected Object valueFrom(Control valueControl) { - - return null; // TODO - } - protected void fillWidget(Text textWidget, PropertyDescriptor desc, Rule rule) { Class[] values = (Class[])valueFor(rule, desc); @@ -135,4 +130,8 @@ public class MultiTypeEditorFactory extends AbstractMultiValueEditorFactory { rule.setProperty((TypeMultiProperty)desc, newValues); return enteredValue; } + + protected Object valueFrom(Control valueControl) { // not necessary for this type + return null; + } } diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/TypeEditorFactory.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/TypeEditorFactory.java index a64e6045e7..6581cadacf 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/TypeEditorFactory.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/preferences/editors/TypeEditorFactory.java @@ -77,21 +77,23 @@ public class TypeEditorFactory extends AbstractEditorFactory { final TypeProperty tp = typePropertyFrom(desc); - typeText.addListener(SWT.FocusOut, new Listener() { + Listener wereDoneListener = new Listener() { public void handleEvent(Event event) { - Class newValue = typeText.getType(true); - if (newValue == null) return; - - Class existingValue = (Class)valueFor(rule, tp); - if (existingValue == newValue) return; - - rule.setProperty(tp, newValue); - listener.changed(rule, desc, newValue); - - adjustRendering(rule, desc, typeText); - } - }); + Class newValue = typeText.getType(true); + if (newValue == null) return; + + Class existingValue = (Class)valueFor(rule, tp); + if (existingValue == newValue) return; + + rule.setProperty(tp, newValue); + listener.changed(rule, desc, newValue); + adjustRendering(rule, desc, typeText); + } + }; + + typeText.addListener(SWT.FocusOut, wereDoneListener); + typeText.addListener(SWT.DefaultSelection, wereDoneListener); return typeText; }