package edu.ucsd.arcum.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
// Apply an action to the a set of selected projects. Code copied and adapted
// the AJDT source files RemoveAJNatureAction.java and AJDTUtils.java.
public abstract class ProjectAction implements IObjectActionDelegate
{
private ArrayList<IProject> selectedProjects = new ArrayList<IProject>();
private boolean actionOnlyForOpenProjects;
protected ProjectAction(boolean actionOnlyForOpenProjects) {
this.actionOnlyForOpenProjects = actionOnlyForOpenProjects;
}
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
}
public void run(IAction action) {
for (final IProject project : selectedProjects) {
if (actionOnlyForOpenProjects && !project.isOpen()) {
continue;
}
try {
// wrap up the operation so that an autobuild is not triggered
// in the middle of the conversion
new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor)
throws CoreException {
doAction(project);
}
}.run(null);
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
abstract protected void doAction(IProject project) throws CoreException;
public void selectionChanged(IAction action, ISelection sel) {
selectedProjects.clear();
boolean enable = true;
if (sel instanceof IStructuredSelection) {
IStructuredSelection selection = (IStructuredSelection)sel;
for (Iterator iter = selection.iterator(); iter.hasNext();) {
Object object = iter.next();
if (object instanceof IAdaptable) {
IProject project = (IProject)((IAdaptable)object)
.getAdapter(IProject.class);
if (project != null) {
selectedProjects.add(project);
}
else {
enable = false;
break;
}
}
else {
enable = false;
break;
}
}
action.setEnabled(enable);
}
}
}