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 checkedItems(Table table) { + + Set checkedItems = new HashSet(); + + for (TableItem ti : table.getItems()) { + if (ti.getChecked()) checkedItems.add( ti.getData() ); + } + return checkedItems; + } + + private void checked(Object item) { + + boolean matches = currentCheckedRenderers().equals(preferences.activeReportRenderers()); + + setModified(!matches); + } + + private void setName(String newName) { + + if (StringUtil.isEmpty(newName)) return; + + for (Renderer ren : selectedRenderers()) { + //ren.label = newName; + } + tableViewer.refresh(); + } + + private Renderer[] selectedRenderers() { + + Object[] items = ((IStructuredSelection)tableViewer.getSelection()).toArray(); + Renderer[] renderers = new Renderer[items.length]; + for (int i=0; i items, Label nameField, Label descField, Button suppressed) { + + if (items.size() != 1 ) { + nameField.setText(""); + return; + } + + Renderer renderer = items.get(0); + + nameField.setText( renderer.getName()); + descField.setText( renderer.getDescription()); + suppressed.setSelection(renderer.isShowSuppressedViolations()); + } + + /** + * Build a label + */ + private Label buildLabel(Composite parent, String msgKey) { + Label label = new Label(parent, SWT.NONE); + label.setText(msgKey == null ? "" : getMessage(msgKey)); + return label; + } + + /** + * Build the check box for showing the PMD perspective + * @param viewGroup the parent composite + * + */ + private Button buildCheckCodeOnSaveButton(Composite viewGroup) { + Button button = new Button(viewGroup, SWT.CHECK); + button.setText("Check code after saving"); + button.setSelection(preferences.isCheckAfterSaveEnabled()); + button.setEnabled(false); // FIXME - make it real + return button; + } + + /** + * Build the check box for showing the PMD perspective + * @param viewGroup the parent composite + * + */ + private Button buildShowPerspectiveBoxButton(Composite viewGroup) { + Button button = new Button(viewGroup, SWT.CHECK); + button.setText(getMessage(StringKeys.PREF_GENERAL_LABEL_SHOW_PERSPECTIVE)); + button.setSelection(preferences.isPmdPerspectiveEnabled()); + return button; + } + + /** + * Build the check box for enabling using Project Build Path + * @param viewGroup the parent composite + */ + private Button buildUseProjectBuildPathButton(Composite viewGroup) { + Button button = new Button(viewGroup, SWT.CHECK); + button.setText(getMessage(StringKeys.PREF_GENERAL_LABEL_USE_PROJECT_BUILD_PATH)); + button.setSelection(preferences.isProjectBuildPathEnabled()); + return button; + } + + /** + * Build the text for maximum violations per file per rule + * + * @param parent + * @return + */ + private Spinner buildMaxViolationsPerFilePerRuleText(Composite parent) { + + Composite comp = new Composite(parent, 0); + comp.setLayout(new GridLayout(2, false)); + + Label label = buildLabel(comp, StringKeys.PREF_GENERAL_LABEL_MAX_VIOLATIONS_PFPR); + label.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_CENTER, false, false, 1, 1)); + + final Spinner spinner = new Spinner(comp, SWT.BORDER); + spinner.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.VERTICAL_ALIGN_CENTER, true, false, 1, 1)); + spinner.setMinimum(preferences.getMaxViolationsPerFilePerRule()); + spinner.setToolTipText(getMessage(StringKeys.PREF_GENERAL_TOOLTIP_MAX_VIOLATIONS_PFPR)); + return spinner; + } + + public static void setSelection(Button button, boolean flag) { + if (button == null || button.isDisposed()) return; + button.setSelection(flag); + } + + public static void setText(Text field, String txt) { + if (field == null || field.isDisposed()) return; + field.setText(txt); + } + + /** + * @see org.eclipse.jface.preference.PreferencePage#performDefaults() + */ + protected void performDefaults() { + + setText(additionalCommentText, IPreferences.REVIEW_ADDITIONAL_COMMENT_DEFAULT); + + setSelection(showPerspectiveBox, IPreferences.PMD_PERSPECTIVE_ENABLED_DEFAULT); + setSelection(checkCodeOnSave , IPreferences.PMD_CHECK_AFTER_SAVE_DEFAULT); + setSelection(useProjectBuildPath, IPreferences.PROJECT_BUILD_PATH_ENABLED_DEFAULT); + setSelection(reviewPmdStyleBox, IPreferences.REVIEW_PMD_STYLE_ENABLED_DEFAULT); + + if (maxViolationsPerFilePerRule != null) { + maxViolationsPerFilePerRule.setMinimum(IPreferences.MAX_VIOLATIONS_PFPR_DEFAULT); + } + + } + + /** + * Update the sample label when the additional comment text is modified + */ + protected void updateSampleLabel() { + String pattern = additionalCommentText.getText(); + try { + String commentText = MessageFormat.format(pattern, new Object[] { System.getProperty("user.name", ""), new Date() }); + + sampleLabel.setText(commentText); + setMessage(getMessage(StringKeys.PREF_GENERAL_HEADER), NONE); + setValid(true); + + } catch (IllegalArgumentException e) { + setMessage(getMessage(StringKeys.PREF_GENERAL_MESSAGE_INCORRECT_FORMAT), ERROR); + setValid(false); + } + } + + public boolean performCancel() { + // clear out any changes for next possible usage + selectCheckedRenderers(); + return true; + } + + /** + * @see org.eclipse.jface.preference.IPreferencePage#performOk() + */ + public boolean performOk() { + + if (additionalCommentText != null) { + preferences.setReviewAdditionalComment(additionalCommentText.getText()); + } + + if (showPerspectiveBox != null) { + preferences.setPmdPerspectiveEnabled(showPerspectiveBox.getSelection()); + } + + if (checkCodeOnSave != null) { + preferences.isCheckAfterSaveEnabled(checkCodeOnSave.getSelection()); + } + + if (useProjectBuildPath != null) { + preferences.setProjectBuildPathEnabled(useProjectBuildPath.getSelection()); + } + + if (maxViolationsPerFilePerRule != null) { + preferences.setMaxViolationsPerFilePerRule(Integer.valueOf(maxViolationsPerFilePerRule.getText()).intValue()); + } + + if (reviewPmdStyleBox != null) { + preferences.setReviewPmdStyleEnabled(reviewPmdStyleBox.getSelection()); + } + + preferences.activeReportRenderers( currentCheckedRenderers() ); + + preferences.sync(); + PMDPlugin.getDefault().applyLogPreferences(preferences); + + return true; + } + + @Override + protected String descriptionId() { + return "???"; // TODO + } + + public void addedRows(int newRowCount) { + // TODO Auto-generated method stub + + } + + public void changed(RuleSelection rule, PropertyDescriptor desc, + Object newValue) { + // TODO Auto-generated method stub + + } + + public void changed(PropertySource source, PropertyDescriptor desc, + Object newValue) { + // TODO Auto-generated method stub + + } + +}