package org.checkerframework.eclipse.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
public abstract class CheckerHandler extends AbstractHandler {
protected IJavaElement element(final ISelection selection) {
throw new UnsupportedOperationException("This is only used by unused code at the moment!");
}
/**
* Takes the current selection. Determines the target project using the first element in the
* selection. Return each element in the selection (top-level or nested) that is part of the
* target project
*
* @param selection Current user selection
* @return A list of JavaElements that are in the same project and in the given selection
*/
protected /*@Nullable*/ List<IJavaElement> selectionToJavaElements(final ISelection selection) {
// ITreeSelection
final List<IJavaElement> elements;
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
elements = toSingleProjectElements(structuredSelection.toArray());
} else {
elements = new ArrayList<IJavaElement>();
}
return elements;
}
protected List<IJavaElement> toSingleProjectElements(final Object[] elements) {
final List<IJavaElement> javaElements = new ArrayList<IJavaElement>();
IJavaProject project = null;
for (final Object element : elements) {
if (element instanceof IJavaProject) {
// If the project is in the selection return only it
if (project == null || element.equals(project)) {
javaElements.clear();
javaElements.add((IJavaProject) element);
break;
}
} else if (element instanceof IJavaElement) {
final IJavaElement jEl = (IJavaElement) element;
if (project == null) {
project = jEl.getJavaProject();
javaElements.add(jEl);
// Only add those elements that are in project
} else if (!projectsEqual(jEl.getJavaProject(), project)) {
javaElements.add(jEl);
}
}
}
return javaElements;
}
//TODO: There must be a better way to do this
protected boolean projectsEqual(final IJavaProject project1, final IJavaProject project2) {
return project1.getPath().equals(project2);
}
/**
* Retrieve the selection from the menu or otherwise when called from elsewhere
*
* @param event
* @return the current selection
*/
protected ISelection getSelection(ExecutionEvent event) {
ISelection selection = HandlerUtil.getActiveMenuSelection(event);
/* use the current selection when not called from popup menu */
if (selection == null) selection = HandlerUtil.getCurrentSelection(event);
return selection;
}
}