Added new option to the rule context/popup menu that allows users to move rules between rulesets. I don't believe the underlying PMD system supports this at the moment though I believe we can do this - see my suggestion at https://sourceforge.net/forum/forum.php?thread_id=2824589&forum_id=188194

git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@6780 51baf565-9d33-0410-a72c-fc3788e3496d
This commit is contained in:
Brian Remedios committed 2009-01-10 23:39:56 +00:00
1 parent a33f3a1fdc
commit 20ddc87817
5 files changed
+175 -24

No files matched your search

@@ -5,6 +5,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -19,13 +20,16 @@ import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.runtime.writer.IRuleSetWriter;
import net.sourceforge.pmd.eclipse.runtime.writer.WriterException;
import net.sourceforge.pmd.eclipse.ui.PMDUiConstants;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.eclipse.ui.preferences.RuleDialog;
import net.sourceforge.pmd.eclipse.ui.preferences.RuleSetSelectionDialog;
import net.sourceforge.pmd.eclipse.util.ResourceManager;
import net.sourceforge.pmd.eclipse.util.Util;
import net.sourceforge.pmd.lang.rule.XPathRule;
import net.sourceforge.pmd.util.CollectionUtil;
import net.sourceforge.pmd.util.FileUtil;
import net.sourceforge.pmd.util.StringUtil;
import net.sourceforge.pmd.util.designer.Designer;
import org.eclipse.core.resources.IncrementalProjectBuilder;
@@ -49,6 +53,7 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
@@ -143,9 +148,10 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
private Map<Integer, List<Listener>> paintListeners = new HashMap<Integer, List<Listener>>();
private RuleSelection ruleSelection; // may hold rules and/or group nodes
private RuleSelection ruleSelection; // may hold rules and/or group nodes
private Map<RulePriority, MenuItem> priorityMenusByPriority;
private Map<String, MenuItem> rulesetMenusByName;
private boolean modified = false;
private static PMDPlugin plugin = PMDPlugin.getDefault();
@@ -299,11 +305,15 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
public static String ruleSetNameFrom(Rule rule) {
String name = rule.getRuleSetName();
int pos = name.toUpperCase().indexOf("RULES");
return pos < 0 ? name : name.substring(0, pos-1);
return ruleSetNameFrom( rule.getRuleSetName() );
}
public static String ruleSetNameFrom(String rulesetName) {
int pos = rulesetName.toUpperCase().indexOf("RULES");
return pos < 0 ? rulesetName : rulesetName.substring(0, pos-1);
}
private void redrawTable() {
groupBy(groupingColumn);
}
@@ -534,20 +544,26 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
return ruleTree;
}
public static Image imageFor(RulePriority priority) {
String codePath = PMDUiConstants.buttonCodePathFor(priority);
return ResourceManager.imageFor(codePath);
}
private Menu createMenuFor(Control control) {
Menu menu = new Menu(control);
MenuItem item2 = new MenuItem (menu, SWT.CASCADE);
item2.setText(stringFor(StringKeys.MSGKEY_PREF_RULESET_COLUMN_PRIORITY));
Menu subMenu = new Menu (menu);
item2.setMenu (subMenu);
MenuItem priorityMenu = new MenuItem (menu, SWT.CASCADE);
priorityMenu.setText(stringFor(StringKeys.MSGKEY_PREF_RULESET_COLUMN_PRIORITY));
Menu subMenu = new Menu(menu);
priorityMenu.setMenu (subMenu);
priorityMenusByPriority = new HashMap<RulePriority, MenuItem>();
for (RulePriority priority : RulePriority.values()) {
MenuItem priorityItem = new MenuItem (subMenu, SWT.RADIO);
priorityMenusByPriority.put(priority, priorityItem);
priorityItem.setText(priority.getName()); // TODO need to internationalize?
// priorityItem.setImage(imageFor(priority)); not visible with radiobuttons
final RulePriority pri = priority;
priorityItem.addSelectionListener( new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
@@ -586,8 +602,63 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
return menu;
}
private void addRulesetMenuOptions(Menu menu) {
MenuItem rulesetMenu = new MenuItem (menu, SWT.CASCADE);
rulesetMenu.setText("Ruleset");
Menu rulesetSubMenu = new Menu(menu);
rulesetMenu.setMenu(rulesetSubMenu);
rulesetMenusByName = new HashMap<String, MenuItem>();
MenuItem demoItem = new MenuItem(rulesetSubMenu, SWT.PUSH);
demoItem.setText("---demo only---");
for (String rulesetName : rulesetNames()) {
MenuItem rulesetItem = new MenuItem(rulesetSubMenu, SWT.RADIO);
rulesetMenusByName.put(rulesetName, rulesetItem);
rulesetItem.setText(rulesetName);
final String rulesetStr = rulesetName;
rulesetItem.addSelectionListener( new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
setRuleset(rulesetStr);
}
public void widgetDefaultSelected(SelectionEvent e) { }}
);
}
}
private void popupRuleSelectionMenu(Event event) {
// have to do it here or else the ruleset var is null in the menu setup - timing issue
if (rulesetMenusByName == null) {
addRulesetMenuOptions(ruleListMenu);
}
adjustMenuPrioritySettings();
adjustMenuRulesetSettings();
ruleListMenu.setLocation(event.x, event.y);
ruleListMenu.setVisible(true);
}
private void adjustMenuRulesetSettings() {
String rulesetName = ruleSetNameFrom(ruleSelection.commonRuleset());
Iterator<Map.Entry<String, MenuItem>> iter = rulesetMenusByName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, MenuItem> entry = iter.next();
MenuItem item = entry.getValue();
if (StringUtil.areSemanticEquals(entry.getKey(), rulesetName)) {
item.setSelection(true);
item.setEnabled(false);
} else {
item.setSelection(false);
item.setEnabled(true);
}
}
}
private void adjustMenuPrioritySettings() {
RulePriority priority = ruleSelection.commonPriority();
Iterator<Map.Entry<RulePriority, MenuItem>> iter = priorityMenusByPriority.entrySet().iterator();
@@ -602,9 +673,7 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
item.setEnabled(true);
}
}
ruleListMenu.setLocation(event.x, event.y);
ruleListMenu.setVisible(true);
}
}
private boolean hasPriorityGrouping() {
return
@@ -622,6 +691,19 @@ public class PMDPreferencePage extends PreferencePage implements IWorkbenchPrefe
ruleTreeViewer.update(ruleSelection.allRules().toArray(), null);
}
}
private String[] rulesetNames() {
Set<String> names = new HashSet<String>();
for (Rule rule : ruleSet.getRules()) {
names.add(ruleSetNameFrom(rule)); // if we strip out the 'Rules' portions then we don't get matches...need to rename rulesets
}
return names.toArray(new String[names.size()]);
}
private void setRuleset(String rulesetName) {
// TODO
}
/**
* @param item Object[]
@@ -6,10 +6,11 @@ import java.util.Map;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.eclipse.util.ResourceManager;
import net.sourceforge.pmd.eclipse.util.Util;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
@@ -22,7 +23,7 @@ import org.eclipse.swt.widgets.TreeColumn;
public class RuleColumnDescriptor {
private String label;
private ImageDescriptor imageDesc;
private String imagePath;
private int alignment;
private int width;
private RuleFieldAccessor accessor;
@@ -82,7 +83,7 @@ public class RuleColumnDescriptor {
*/
public RuleColumnDescriptor(String labelKey, String theImagePath, int theAlignment, int theWidth, RuleFieldAccessor theAccessor, boolean resizableFlag, CellPainterBuilder thePainterBuilder) {
label = stringFor(labelKey);
imageDesc = theImagePath != null ? PMDPlugin.getImageDescriptor(theImagePath) : null;
imagePath = theImagePath;
alignment = theAlignment;
width = theWidth;
accessor = theAccessor;
@@ -99,8 +100,8 @@ public class RuleColumnDescriptor {
tc.setText(label);
tc.setWidth(width);
tc.setResizable(isResizeable);
if (imageDesc != null) {
tc.setImage(imageDesc.createImage());
if (imagePath != null) {
tc.setImage(ResourceManager.imageFor(imagePath));
}
tc.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
@@ -124,4 +125,8 @@ public class RuleColumnDescriptor {
* @return RuleFieldAccessor
*/
public RuleFieldAccessor accessor() { return accessor; }
public Image imageFor(Object value) {
return null; // TODO
}
}
@@ -5,6 +5,8 @@ import java.util.List;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RulePriority;
import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.util.StringUtil;
/**
* Holds a collection of rules as assembled by the tree widget manager.
@@ -89,22 +91,39 @@ public class RuleGroup implements Comparable<RuleGroup> {
}
/**
* Returns the priority level common to all rules held
* by the receiver, returns null if they differ.
* Returns the name of the ruleset common to all rules
* held by the receiver, returns null if they differ.
*
* @return RulePriority
* @return String
*/
public RulePriority commonPriority() {
public String commonRuleset() {
if (rules.isEmpty()) return null;
RulePriority priority = rules.get(0).getPriority();
String rulesetName = rules.get(0).getRuleSetName();
for (int i=1; i<rules.size(); i++) {
if (rules.get(i).getPriority() != priority) return null;
if (!StringUtil.areSemanticEquals(rules.get(i).getRuleSetName(), rulesetName)) return null;
}
return priority;
return rulesetName;
}
/**
* Returns the priority level common to all rules held
* by the receiver, returns null if they differ.
*
* @return RulePriority
*/
public RulePriority commonPriority() {
if (rules.isEmpty()) return null;
RulePriority priority = rules.get(0).getPriority();
for (int i=1; i<rules.size(); i++) {
if (rules.get(i).getPriority() != priority) return null;
}
return priority;
}
/**
* @return boolean
*/
@@ -1,5 +1,7 @@
package net.sourceforge.pmd.eclipse.ui.preferences.br;
import org.eclipse.swt.graphics.Image;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.ui.preferences.AbstractTableLabelProvider;
@@ -42,6 +44,24 @@ public class RuleLabelProvider extends AbstractTableLabelProvider {
return "??";
}
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(Object, int)
*/
public Image getColumnImage(Object element, int columnIndex) {
if (element instanceof RuleGroup) {
return null;
}
if (element instanceof Rule) {
Rule rule = (Rule) element;
Object value = columnDescriptors[columnIndex].accessor().valueFor(rule);
return value == null ? null : columnDescriptors[columnIndex].imageFor(value);
}
return null;
}
/**
* @param rawLabel String
* @param count int
@@ -7,6 +7,7 @@ import java.util.List;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RulePriority;
import net.sourceforge.pmd.RuleSet;
import net.sourceforge.pmd.util.StringUtil;
/**
*
@@ -52,6 +53,13 @@ public class RuleSelection {
((RuleGroup)item).commonPriority();
}
private String commonRulesetFor(Object item) {
return item instanceof Rule ?
((Rule)item).getRuleSetName() :
((RuleGroup)item).commonRuleset();
}
public void setPriority(RulePriority priority) {
if (ruleItems == null) return;
@@ -116,4 +124,21 @@ public class RuleSelection {
return priority;
}
/**
* Iterates through the currently selected rules and returns
* their common ruleset name or null if they differ.
*/
public String commonRuleset() {
if (ruleItems == null || ruleItems.length == 0) return null;
String rulesetName = commonRulesetFor(ruleItems[0]);
if (StringUtil.isEmpty(rulesetName)) return null;
for (int i=1; i<ruleItems.length; i++) {
if (StringUtil.areSemanticEquals(rulesetName, commonRulesetFor(ruleItems[i]))) return null;
}
return rulesetName;
}
}