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:
1 parent
a33f3a1fdc
commit
20ddc87817
5 files changed
+175
-24
No files matched your search
+94
-12
@@ -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[]
|
||||
|
||||
+10
-5
@@ -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
|
||||
}
|
||||
}
|
||||
+26
-7
@@ -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
|
||||
*/
|
||||
|
||||
+20
@@ -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
|
||||
|
||||
+25
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user