package net.sourceforge.pmd.eclipse.ui.actions; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import name.herlin.command.CommandException; import net.sourceforge.pmd.eclipse.plugin.PMDPlugin; import net.sourceforge.pmd.eclipse.runtime.cmd.ReviewCodeCmd; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.editors.text.ILocationProvider; /** * * @author Brian Remedios */ public class ReviewCodeHandler extends AbstractHandler { private IWorkbenchWindow fWindow; private IResource[] fResources; private IPath fLocation; public ReviewCodeHandler() { } protected final ISelection getSelection() { IWorkbenchWindow window= getWorkbenchWindow(); return window != null ? window.getSelectionService().getSelection() : null; } protected final IWorkbenchWindow getWorkbenchWindow() { if (fWindow == null) { fWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); } return fWindow; } // /** // * Collects the files out of the given resources. // * // * @param resources the resources from which to get the files // * @return an array of files // */ // protected static IFile[] collectFiles(IResource[] resources) { // // Set<IFile> files= new HashSet<IFile>(); // for (int i= 0; i < resources.length; i++) { // IResource resource= resources[i]; // if ((IResource.FILE & resource.getType()) > 0) // files.add((IFile)resource); // } // return (IFile[]) files.toArray(new IFile[files.size()]); // } public Object execute(ExecutionEvent event) throws ExecutionException { computeSelectedResources(); try { if (fResources != null && fResources.length > 0) { ReviewCodeCmd cmd = new ReviewCodeCmd(); // separate one for each thread cmd.reset(); for (IResource rsc : fResources) cmd.addResource(rsc); try { cmd.performExecute(); } catch (CommandException e) { PMDPlugin.getDefault().log(IStatus.ERROR, "Error processing user-initiated code review", e); } } return null; // Standard return value. DO NOT CHANGE. } finally { fResources = null; fLocation = null; } } /** * Computes the selected resources. */ protected final void computeSelectedResources() { if (fResources != null || fLocation != null) return; ISelection selection= getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection= (IStructuredSelection) selection; List resources = new ArrayList(structuredSelection.size()); Iterator<?> e= structuredSelection.iterator(); while (e.hasNext()) { Object element= e.next(); if (element instanceof IResource) resources.add(element); else if (element instanceof IAdaptable) { IAdaptable adaptable= (IAdaptable) element; Object adapter= adaptable.getAdapter(IResource.class); if (adapter instanceof IResource) resources.add(adapter); } } if (!resources.isEmpty()) fResources= (IResource[]) resources.toArray(new IResource[resources.size()]); } else if (selection instanceof ITextSelection) { IWorkbenchWindow window= getWorkbenchWindow(); if (window != null) { IWorkbenchPart workbenchPart= window.getPartService().getActivePart(); if (workbenchPart instanceof IEditorPart) { IEditorPart editorPart= (IEditorPart) workbenchPart; IEditorInput input= editorPart.getEditorInput(); Object adapter= input.getAdapter(IResource.class); if (adapter instanceof IResource) fResources= new IResource[] { (IResource) adapter }; else { adapter= input.getAdapter(ILocationProvider.class); if (adapter instanceof ILocationProvider) { ILocationProvider provider= (ILocationProvider) adapter; fLocation= provider.getPath(input); } } } } } } }