diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/CHANGELOG.txt b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/CHANGELOG.txt
index 4ee12e3008..9a1c6e6d53 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/CHANGELOG.txt
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/CHANGELOG.txt
@@ -1,20 +1,22 @@
Change log for the PMD Eclipse plugin
-v4.0.0 - xxx 2010?
+v4.0.0 - xxx 2011?
. New integrated AST View and XPath test area
. New rule creation wizard
+. New report setup panel
. User-definable rule violation markers
Highest priority markers also decorate folders & projects (selectable)
. Colour syntax highlighting in code viewers/editors
. Overhauled rule preferences screen
-. Allows users to group/edit rules by multiple criteria
-. New ability to enable/disable rules without removing them
+. allows users to group/edit rules by multiple criteria
+. new ability to enable/disable rules without removing them from rulesets
. larger editors for the various fields
. support for non-Java languages
. group editing of filter exclusion rules
. highlighting of non-default property values
-. Color-tagged expressions in shown in rule table
+. colour-tagged expressions in shown in rule table
. new property editors are fully type-aware
+. misconfigured rules are highlighted
. Huge code cleanup
. Several usability fixes for the Dataflow view
. Updated to use latest SWT widgets wherever possible
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/build.properties b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/build.properties
index 87f3ea1111..e80d19fbe7 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/build.properties
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/build.properties
@@ -19,12 +19,6 @@ bin.includes = META-INF/,\
plugin_ru.properties,\
plugin_tr.properties,\
schema/,\
- CHANGELOG.txt,\
- CREDITS.txt,\
- LICENSE.txt,\
- PATTERNS LIBRARY LICENSE.txt,\
- RELNOTES.txt,\
- TODO.txt,\
about.ini,\
toc.xml,\
welcome.xml,\
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.properties b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.properties
index d5a0fe77c8..5fc55aa8df 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.properties
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.properties
@@ -13,18 +13,19 @@ plugin.name = PMD Plug-in
plugin.provider = PMD Project
preferences.pmd = PMD
-preferences.rulesets = Rules Configuration
+preferences.rulesets = Rule Configuration
preferences.cpd = CPD Preferences
+preferences.report = Reports
properties.pmd = PMD
menu.pmd = PMD
action.checkcpd = Find Suspect Cut And Paste...
-action.checkpmd = Check Code With PMD
-action.clearpmd = Clear PMD Violations
+action.checkpmd = Check Code
+action.clearpmd = Clear Violations
action.clearall = Clear All PMD Violations
action.ast = Generate Abstract Syntax Tree
-action.clearreviews = Clear violations reviews
-action.generatereport = Generate reports
+action.clearreviews = Clear Violation Reviews
+action.generatereport = Generate Reports
action.showdataflow = Show Method Dataflow
view.category = PMD
@@ -33,5 +34,4 @@ view.violation = PMD Violations
view.outline = Violations Outline
view.overview = Violations Overview
view.dataflowview = Dataflow View
-view.cpd = CPD View
-view.cpd2 = CPD View2
\ No newline at end of file
+view.cpd = CPD View
\ No newline at end of file
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.xml b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.xml
index 0672414c43..cfcb201ba3 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.xml
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/plugin.xml
@@ -190,6 +190,14 @@
class="net.sourceforge.pmd.eclipse.ui.preferences.CPDPreferencePage"
id="net.sourceforge.pmd.eclipse.ui.preferences.cpdPreferencePage">
+
+
+
+
getActiveRuleNames();
void setActiveRuleNames(Set ruleNames);
@@ -192,6 +195,16 @@ public interface IPreferences {
// later...
+ /**
+ *
+ */
+ Set activeReportRenderers();
+
+ /**
+ *
+ * @param names
+ */
+ void activeReportRenderers(Set names);
/**
* Synchronize the preferences with the preferences store
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesImpl.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesImpl.java
index abbb39f3d5..eadb5a6646 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesImpl.java
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesImpl.java
@@ -71,6 +71,7 @@ class PreferencesImpl implements IPreferences {
private String logFileName;
private Level logLevel;
private Set activeRuleNames = new HashSet();
+ private Set activeRendererNames = new HashSet();
private Map uiDescriptorsByPriority = new HashMap(5);
@@ -230,6 +231,10 @@ class PreferencesImpl implements IPreferences {
return activeRuleNames.contains(ruleName);
}
+ public boolean isActiveRenderer(String rendererName) {
+ return activeRendererNames.contains(rendererName);
+ }
+
public void isActive(String ruleName, boolean flag) {
if (flag) {
activeRuleNames.add(ruleName);
@@ -262,4 +267,12 @@ class PreferencesImpl implements IPreferences {
useCustomPriorityNames = flag;
}
+ public Set activeReportRenderers() {
+ return activeRendererNames;
+ }
+
+ public void activeReportRenderers(Set names) {
+ activeRendererNames = names;
+ }
+
}
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesManagerImpl.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesManagerImpl.java
index 48df3dccc0..ec0fe95019 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesManagerImpl.java
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/preferences/impl/PreferencesManagerImpl.java
@@ -107,6 +107,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
private static final String LOG_FILENAME = PMDPlugin.PLUGIN_ID + ".log_filename";
private static final String LOG_LEVEL = PMDPlugin.PLUGIN_ID + ".log_level";
private static final String ACTIVE_RULES = PMDPlugin.PLUGIN_ID + ".active_rules";
+ private static final String ACTIVE_RENDERERS = PMDPlugin.PLUGIN_ID + ".active_renderers";
private static final String OLD_PREFERENCE_PREFIX = "net.sourceforge.pmd.runtime";
private static final String OLD_PREFERENCE_LOCATION = "/.metadata/.plugins/org.eclipse.core.runtime/.settings/net.sourceforge.pmd.runtime.prefs";
@@ -166,6 +167,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
loadLogFileName();
loadLogLevel();
loadActiveRules();
+ loadActiveReportRenderers();
loadRulePriorityDescriptors();
return preferences;
@@ -226,6 +228,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
storeLogFileName();
storeLogLevel();
storeActiveRules();
+ storeActiveReportRenderers();
storePriorityDescriptors();
}
@@ -304,6 +307,11 @@ class PreferencesManagerImpl implements IPreferencesManager {
preferences.setActiveRuleNames(asStringSet(loadPreferencesStore.getString(ACTIVE_RULES), ","));
}
+ private void loadActiveReportRenderers() {
+ loadPreferencesStore.setDefault(ACTIVE_RENDERERS, IPreferences.ACTIVE_RENDERERS);
+ preferences.activeReportRenderers(asStringSet(loadPreferencesStore.getString(ACTIVE_RENDERERS), ","));
+ }
+
private void loadRulePriorityDescriptors() {
for (Map.Entry entry : StoreKeysByPriority.entrySet()) {
@@ -344,6 +352,10 @@ class PreferencesManagerImpl implements IPreferencesManager {
storePreferencesStore.setValue(ACTIVE_RULES, asDelimitedString(preferences.getActiveRuleNames(), ","));
}
+ private void storeActiveReportRenderers() {
+ storePreferencesStore.setValue(ACTIVE_RENDERERS, asDelimitedString(preferences.activeReportRenderers(), ","));
+ }
+
private void storeProjectBuildPathEnabled() {
storePreferencesStore.setValue(PROJECT_BUILD_PATH_ENABLED, preferences.isProjectBuildPathEnabled());
}
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/actions/GenerateReportAction.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/actions/GenerateReportAction.java
index 146162efe1..b279eb1c6a 100644
--- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/actions/GenerateReportAction.java
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/actions/GenerateReportAction.java
@@ -1,16 +1,10 @@
package net.sourceforge.pmd.eclipse.ui.actions;
-import java.util.Properties;
-
import name.herlin.command.CommandException;
import net.sourceforge.pmd.eclipse.runtime.cmd.RenderReportsCmd;
-import net.sourceforge.pmd.eclipse.ui.PMDUiConstants;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
-import net.sourceforge.pmd.renderers.CSVRenderer;
-import net.sourceforge.pmd.renderers.HTMLRenderer;
-import net.sourceforge.pmd.renderers.TextRenderer;
-import net.sourceforge.pmd.renderers.VBHTMLRenderer;
-import net.sourceforge.pmd.renderers.XMLRenderer;
+import net.sourceforge.pmd.eclipse.ui.reports.ReportManager;
+import net.sourceforge.pmd.renderers.Renderer;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
@@ -25,12 +19,21 @@ import org.eclipse.jface.viewers.IStructuredSelection;
* Generate a HTML report on the current project.
*
* @author Philippe Herlin
- *
+ * @author Brian Remedios
*/
public class GenerateReportAction extends AbstractUIAction {
private static final Logger log = Logger.getLogger(GenerateReportAction.class);
+ private static final String DefaultReportName = "pmd-report";
+
+ private void registerRenderers(RenderReportsCmd cmd) {
+
+ for (Renderer renderer : ReportManager.instance.activeRenderers()) {
+ cmd.registerRenderer(renderer, DefaultReportName + "." + renderer.defaultFileExtension());
+ }
+ }
+
/**
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
@@ -44,15 +47,7 @@ public class GenerateReportAction extends AbstractUIAction {
final RenderReportsCmd cmd = new RenderReportsCmd();
cmd.setProject(project);
cmd.setUserInitiated(true);
-
- // FIXME PMD 5.0
- Properties props = new Properties();
- cmd.registerRenderer(new HTMLRenderer(props), PMDUiConstants.HTML_REPORT_NAME);
- cmd.registerRenderer(new CSVRenderer(props), PMDUiConstants.CSV_REPORT_NAME);
- cmd.registerRenderer(new XMLRenderer(props), PMDUiConstants.XML_REPORT_NAME);
- cmd.registerRenderer(new TextRenderer(props), PMDUiConstants.TXT_REPORT_NAME);
- cmd.registerRenderer(new VBHTMLRenderer(props), PMDUiConstants.VBHTML_REPORT_NAME);
-
+ registerRenderers(cmd);
cmd.performExecute();
}
} catch (CommandException e) {
@@ -73,7 +68,7 @@ public class GenerateReportAction extends AbstractUIAction {
* @param selection
* @return
*/
- private IProject getProject(final IStructuredSelection selection) {
+ private static IProject getProject(final IStructuredSelection selection) {
IProject project = null;
final Object object = selection.getFirstElement();
if (object != null && object instanceof IAdaptable) {
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportColumnUI.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportColumnUI.java
new file mode 100644
index 0000000000..8f0820a630
--- /dev/null
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportColumnUI.java
@@ -0,0 +1,38 @@
+package net.sourceforge.pmd.eclipse.ui.reports;
+
+import net.sourceforge.pmd.eclipse.ui.ItemColumnDescriptor;
+import net.sourceforge.pmd.eclipse.ui.ItemFieldAccessor;
+import net.sourceforge.pmd.eclipse.ui.ItemFieldAccessorAdapter;
+import net.sourceforge.pmd.renderers.Renderer;
+
+import org.eclipse.swt.SWT;
+
+/**
+ *
+ * @author Brian Remedios
+ */
+public interface ReportColumnUI {
+
+ ItemFieldAccessor nameAcc = new ItemFieldAccessorAdapter(null) {
+ public String valueFor(Renderer renderer) { return renderer.getName(); }
+ };
+
+ ItemFieldAccessor descriptionAcc = new ItemFieldAccessorAdapter(null) {
+ public String valueFor(Renderer renderer) { return renderer.getDescription(); }
+ };
+
+ ItemFieldAccessor showSuppressedAcc = new ItemFieldAccessorAdapter(null) {
+ public Boolean valueFor(Renderer renderer) { return renderer.isShowSuppressedViolations(); }
+ };
+
+ ItemFieldAccessor propertiesAcc = new ItemFieldAccessorAdapter(null) {
+ public String valueFor(Renderer renderer) { return ReportManager.asString(renderer.getPropertyDefinitions()); }
+ };
+
+ ItemColumnDescriptor name = new ItemColumnDescriptor("", "Name", SWT.LEFT, 55, true, nameAcc);
+ ItemColumnDescriptor description = new ItemColumnDescriptor("", "Format", SWT.LEFT, 99, true, descriptionAcc);
+ ItemColumnDescriptor suppressed = new ItemColumnDescriptor("", "Show suppressed", SWT.LEFT, 40, true, showSuppressedAcc);
+ ItemColumnDescriptor properties = new ItemColumnDescriptor("", "Properties", SWT.LEFT, 99, true, propertiesAcc);
+
+ ItemColumnDescriptor[] VisibleColumns = new ItemColumnDescriptor[] { name, suppressed, properties };
+}
diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java
new file mode 100644
index 0000000000..8f37c00394
--- /dev/null
+++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/ui/reports/ReportManager.java
@@ -0,0 +1,87 @@
+package net.sourceforge.pmd.eclipse.ui.reports;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
+import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
+import net.sourceforge.pmd.renderers.CSVRenderer;
+import net.sourceforge.pmd.renderers.HTMLRenderer;
+import net.sourceforge.pmd.renderers.Renderer;
+import net.sourceforge.pmd.renderers.TextRenderer;
+import net.sourceforge.pmd.renderers.VBHTMLRenderer;
+import net.sourceforge.pmd.renderers.XMLRenderer;
+
+/**
+ *
+ * @author Brian Remedios
+ */
+public class ReportManager {
+
+ private final Renderer[] allRenderers;
+
+ public static final ReportManager instance = new ReportManager();
+
+ private ReportManager() {
+ allRenderers = knownRenderers();
+ }
+
+ public Renderer[] allRenderers() { return allRenderers; }
+
+ private Renderer[] knownRenderers() {
+
+ Properties props = new Properties();
+
+ return new Renderer[] {
+ new HTMLRenderer(props),
+ new CSVRenderer(props),
+ new XMLRenderer(props),
+ new TextRenderer(props),
+ new VBHTMLRenderer(props)
+ };
+ }
+
+// public Renderer[] availableRenderers2() {
+//
+// List renderers = new ArrayList();
+//
+// for (String reportName : RendererFactory.REPORT_FORMAT_TO_RENDERER.keySet()) {
+// renderers.add(
+// RendererFactory.createRenderer(reportName, new Properties())
+// );
+// }
+//
+// return renderers.toArray(new Renderer[renderers.size()]);
+// }
+
+ public List activeRenderers() {
+
+ List actives = new ArrayList();
+ IPreferences prefs = PMDPlugin.getDefault().loadPreferences();
+
+ for (Renderer renderer : allRenderers) {
+ if (prefs.isActiveRenderer(renderer.getName())) actives.add(renderer);
+ }
+
+ return actives;
+ }
+
+ public static String asString(Map propertyDefinitions) {
+
+ if (propertyDefinitions.isEmpty()) return "";
+
+ StringBuilder sb = new StringBuilder();
+ String[] keys = propertyDefinitions.keySet().toArray(new String[propertyDefinitions.size()]);
+
+ sb.append(keys[0]).append(": ").append(propertyDefinitions.get(keys[0]));
+
+ for (int i=1; i activeNames = preferences.activeReportRenderers();
+
+ for (TableItem item : tableViewer.getTable().getItems()) {
+ Renderer ren = (Renderer)item.getData();
+ item.setChecked(
+ activeNames.contains( ren.getName())
+ );
+ }
+ }
+
+ private Set currentCheckedRenderers() {
+
+ Set names = new HashSet();
+ for (Object renderer : checkedItems(tableViewer.getTable())) {
+ names.add(((Renderer)renderer).getName());
+ }
+ return names;
+ }
+
+ private static Set