无需打开编辑器即可在Eclipse插件中获取项目

时间:2015-04-08 19:29:28

标签: eclipse-plugin eclipse-rcp

在Eclipse插件中,如果打开一个编辑器,很容易获得当前项目(IProject),您只需要使用这个片段:

IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();

IFileEditorInput input = (IFileEditorInput)editor.getEditorInput();
IFile file = input.getFile();
IProject project = file.getProject();

但是,如果我没有在编辑器中打开任何类型的文件,有没有办法获得项目?,即:想象你有一个插件,当你右键单击一个项目时添加一个选项,如果单击此选项将启动一个对话框窗口,如何在此对话框中打印项目名称?

2 个答案:

答案 0 :(得分:2)

对于使用'命令'的菜单项等。与一个'处理程序'您可以在处理程序中使用代码,如:

public class CommandHandler extends AbstractHandler
{
  @Override
  public Object execute(ExecutionEvent event) throws ExecutionException
  {
    ISelection sel = HandlerUtil.getCurrentSelection(event);

    if (sel instanceof IStructuredSelection)
     {
       Object selected = ((IStructuredSelection)sel).getFirstElement();

       IResource resource = (IResource)Platform.getAdapterManager().getAdapter(selected, IResource.class);

       if (resource != null)
        {
          IProject project = resource.getProject();
          ...
        }
     }
    return null;
  }
}

答案 1 :(得分:1)

你是什么意思"目前的项目"?获取特定项目总是需要某种方式来唯一识别特定的项目。

如果当前项目意味着项目是开放的,那么这不是唯一性的良好标准(在一般情况下),因为多个项目可以同时打开时间。

唯一定义项目的保证是通过获取对该项目所包含的资源的引用。例如,这可以通过编辑器输入完成,如您所述,或通过选择,greg pointed out

如果您有项目的名称,那么您可以使用IWorkspaceRoot#getProject(String),但我认为情况并非如此。不过,为了完整性:

ResourcesPlugin.getWorkspace().getRoot().getProject("MyProject");

您还可以获取所有项目的列表,并迭代该列表以检查您知道项目具有的属性(或项目具有)。请参阅下面的示例。当然,这在一般情况下也不能保证唯一性,因为可以有多个项目满足标准。这就是我在示例中使用Lists的原因。

IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> openProjects = new ArrayList<>();
List<IProject> myNatureProjects = new ArrayList<>();
for(IProject project : projects)
{
    if(project.isOpen())
        openProjects.add(project);
    if(project.hasNature("MyNatureId")
        myNatureProjects.add(project);
}