package net.sourceforge.pmd.eclipse.ui.views.actions; import java.util.Collection; import java.util.List; import java.util.Set; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.builder.MarkerUtil; import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences; import net.sourceforge.pmd.eclipse.ui.PMDUiConstants; import net.sourceforge.pmd.eclipse.ui.nls.StringKeys; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.TableViewer; public class DisableRuleAction extends AbstractViolationSelectionAction { private final IPreferences preferences = PMDPlugin.getDefault().loadPreferences(); public DisableRuleAction(TableViewer viewer) { super(viewer); } public static void disableRulesFor(Collection<Rule> rules, IPreferences preferences) { for (Rule rule : rules) { preferences.isActive(rule.getName(), false); } preferences.sync(); } public static void removeViolationsOf(Collection<Rule> rules, Set<IProject> projects) { int deletions = 0; for (IProject project : projects) { for (Rule rule : rules) { deletions += MarkerUtil.deleteViolationsOf(rule.getName(), project); } } System.out.println("Violations deleted: " + deletions); } protected String textId() { return StringKeys.VIEW_ACTION_DISABLE_RULE; } protected String imageId() { return PMDUiConstants.ICON_BUTTON_DISABLE; } protected String tooltipMsgId() { return StringKeys.VIEW_TOOLTIP_DISABLE; } public boolean hasActiveRules() { final IMarker[] markers = getSelectedViolations(); if (markers == null) return false; List<Rule> rules = MarkerUtil.rulesFor(markers); for (Rule rule : rules) { if (preferences.isActive(rule.getName())) return true; } return false; } /** * @see org.eclipse.jface.action.IAction#run() */ public void run() { final IMarker[] markers = getSelectedViolations(); if (markers == null) return; runWith(markers, preferences, true); } public static void runWith(final IMarker[] markers, final IPreferences preferences, final boolean removeViolations) { try { IWorkspace workspace = ResourcesPlugin.getWorkspace(); workspace.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { Collection<Rule> rules = MarkerUtil.rulesFor(markers); disableRulesFor(rules, preferences); if (removeViolations) removeViolationsOf(rules, MarkerUtil.commonProjectsOf(markers) ); } }, null); } catch (CoreException ce) { logErrorByKey(StringKeys.ERROR_CORE_EXCEPTION, ce); } } }