package net.sourceforge.pmd.eclipse.ui.views.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants;
import net.sourceforge.pmd.eclipse.runtime.builder.MarkerUtil;
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
import net.sourceforge.pmd.util.StringUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
public class MarkerMenuFiller extends ContributionItem {
private final ITextEditor editor;
private final IVerticalRulerInfo rulerInfo;
private final List<IMarker> markers;
public MarkerMenuFiller(ITextEditor thEditor) {
editor = thEditor;
rulerInfo = getRulerInfo();
markers = getMarkers();
}
private IVerticalRulerInfo getRulerInfo() {
return (IVerticalRulerInfo) editor.getAdapter(IVerticalRulerInfo.class);
}
private List<IMarker> getMarkers() {
List<IMarker> clickedOnMarkers = new ArrayList<IMarker>();
for (IMarker marker : getAllMarkers()){
if (markerHasBeenClicked(marker)){
clickedOnMarkers.add(marker);
}
}
return clickedOnMarkers;
}
//Determine whether the marker has been clicked using the ruler's mouse listener
private boolean markerHasBeenClicked(IMarker marker) {
return marker.getAttribute(IMarker.LINE_NUMBER, 0) == (rulerInfo.getLineOfLastMouseButtonActivity() + 1);
}
//Get all My Markers for this source file
private IMarker[] getAllMarkers() {
IFile sourceFile = ((FileEditorInput) editor.getEditorInput()).getFile();
try {
return sourceFile.findMarkers(
null, //"defined.in.plugin.xml.mymarker",
true,
IResource.DEPTH_ZERO
);
} catch (CoreException ce) {
return MarkerUtil.EMPTY_MARKERS;
}
}
@Override
public void fill(Menu menu, int index) {
// MenuItem separator = new MenuItem(menu, SWT.SEPARATOR, index);
for (final IMarker marker : markers) {
String ruleName = marker.getAttribute(PMDRuntimeConstants.KEY_MARKERATT_RULENAME, "");
if (StringUtil.isEmpty(ruleName)) continue;
MenuItem menuItem = new MenuItem(menu, SWT.PUSH, index);
menuItem.setText("Disable rule: " + ruleName);
menuItem.addSelectionListener(createDynamicSelectionListener(marker));
}
}
private static SelectionAdapter createDynamicSelectionListener(final IMarker marker) {
return new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
disableRules(marker, true);
}
};
}
private static void disableRules(IMarker marker, boolean removeViolations) {
DisableRuleAction.runWith(
new IMarker[] {marker},
PMDPlugin.getDefault().loadPreferences(),
removeViolations
);
}
}