我正在编写一个简单的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
,但我认为这不是一个好主意。
有没有办法让选定对象的项目无法选择什么?我不想一个一个地添加它们。
答案 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)
无法将ICompilationUnit
,IPackage
或其他内容转换为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;
}
}