如何在eclipse-plugin中右键单击项目/文件/其他项目时获取项目

时间:2011-07-11 10:57:04

标签: eclipse-plugin

我正在编写一个简单的eclipse插件,但有一个问题:当用户右键单击某个节点(可能是项目,文件,java编译单元或其他)时,我想让它所属的项目

示例代码为:

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;
    }
}

它在大多数时候都有效,但有时,例如,我右键单击一个java文件,选择将是ICompilationUnit。虽然我可以在if中添加一个getSelectedProject,但我认为这不是一个好主意。

有没有办法让选定对象的项目无法选择什么?我不想一个一个地添加它们。

3 个答案:

答案 0 :(得分:2)

ICompilationUnit扩展了IAdaptable(参见http://publib.boulder.ibm.com/infocenter/rsmhelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/ICompilationUnit.html

您可以尝试使用IAdaptable界面:

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

答案 1 :(得分:0)

无法将ICompilationUnitIPackage或其他内容转换为IResource,因为通常没有对应的资源!例如。对于导航器中的.class元素,该元素对应于JAR文件中的条目或来自目标平台的依赖项插件。

答案 2 :(得分:0)

它的回答不起作用,可能应该是:

    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;
        }
    }