开发者

How to get the project when right-click on a project/file/others in an eclipse-plugin

I'm write a simple eclipse plugin, but have a problem: When user right-click on a node(maybe a project, a file, a java compilation unit, or others), I want to get the project it belongs.

The sample code is:

public class MyAction implements IObjectActionDelegate {
    private IProject project;
    public void selectionChanged(IAction action, ISelection selection) {
         this.project = getSelectedProject(selection);
    }

    public static IProject getSelectedProject(Object obj) throws Exception {
        if (obj == null) {
            return null;
        }
        if (obj instanceof IResource) {
            return ((IResource) obj).getProject();
        } else if (obj instanceof IStructuredSelection) {
            return getSelectedProject(((IStructuredSelection) obj).getFirstElement());
        }
        return null;
    }
}

It works at most of time, but sometimes, for example, I right-clicked on a java file, the selection will be a ICompilationUnit. Although I can add one more if in the getSelectedProject, but I don't think it's a good idea.

Is there a way to get the project of selected objects nomatter what have been selected?开发者_如何学编程 I don't want to add them one by one.


ICompilationUnit extends IAdaptable (see http://publib.boulder.ibm.com/infocenter/rsmhelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/ICompilationUnit.html)

You can try and use the IAdaptable interface like that:

if (obj instanceof IAdaptable) {
    IResource res = (IResource)(((IAdaptable)obj).getAdapter(IResource.class));
    if (res != null) {
        return res.getProject();
    }
}


There are no way to convert an ICompilationUnit, IPackage, or whatever, to an IResource as there are most often no corresponding resource! E.g. for the .class elements in the navigator, the element corresponds to an entry in a JAR file or in a dependency plug-in from the target platform.


it up answer don't work, may it should be:

    if (obj instanceof IStructuredSelection) {
        IStructuredSelection selection1 = (IStructuredSelection)obj;
        Object element = selection1.getFirstElement();
        IProject project = null;
        if (element instanceof IProject) {
            project = (IProject) element;
        } else if (element instanceof IAdaptable) {
            project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
        }
        if (project != null) {
            return project;
        }
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜