package net.sourceforge.pmd.eclipse.ui.views.actions;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.eclipse.runtime.builder.MarkerUtil;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
/**
* Base Class for Actions that need to know,
* which Markers are selected
*
* @author SebastianRaffel ( 21.05.2005 )
* @author Brian Remedios ( 4.03.2010 )
*/
public abstract class AbstractViolationSelectionAction extends AbstractPMDAction {
private TableViewer tableViewer;
/**
* Constructor
*
* @param viewer
*/
protected AbstractViolationSelectionAction(TableViewer viewer) {
tableViewer = viewer;
setEnabled(canExecute());
}
protected abstract String textId();
protected boolean canExecute() {
return hasSelections();
}
protected void setupWidget() {
super.setupWidget();
String textId = textId();
if (textId != null) setText(getString(textId));
}
protected boolean hasSelections() {
return !tableViewer.getSelection().isEmpty();
}
protected List<Rule> getSelectedViolationRules() {
if (!hasSelections()) return Collections.emptyList();
IMarker[] markers = getSelectedViolations();
return MarkerUtil.rulesFor(markers);
}
/**
* Return the selected Violations (Markers)
*
* @return the Marker(s) currently selected
*/
public IMarker[] getSelectedViolations() {
ISelection selection = tableViewer.getSelection();
if (selection != null && selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
IMarker[] markers = new IMarker[structuredSelection.size()];
Iterator<IMarker> i = structuredSelection.iterator();
int index = 0;
while (i.hasNext()) {
markers[index++] = i.next();
}
return markers;
}
return MarkerUtil.EMPTY_MARKERS;
}
}