【问题标题】:Get project in Eclipse plugin without having an open editor无需打开编辑器即可在 Eclipse 插件中获取项目
【发布时间】:2015-04-12 08:28:42
【问题描述】:

在 Eclipse 插件中,如果打开了编辑器,很容易获取当前项目(IProject),你只需要使用这个 sn-p:

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

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

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

【问题讨论】:

    标签: eclipse-plugin eclipse-rcp


    【解决方案1】:

    对于使用“命令”和“处理程序”的菜单项等,您可以在处理程序中使用代码,如下所示:

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

    【讨论】:

    • 对于特定情况,这是一个非常好的选择,我想我可以使用它,但我正在寻找一种更通用的解决方案,一种可以在任何地方使用而无需担心编辑器或扩展其他类的解决方案.
    • 我认为没有通用的解决方案,只是针对个别情况有很多具体的解决方案。
    • 我很害怕,反正你提供的 sn-p 工作正常
    【解决方案2】:

    “当前项目”是什么意思?获得一个特定的项目总是需要某种方式来唯一地标识那个特定的项目。

    如果 current 项目是指该项目是打开的,那么这不是唯一性的良好标准(在一般情况下),因为可以同时打开多个项目。

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

    如果您有项目名称,则可以使用IWorkspaceRoot#getProject(String),但我认为不是这样。不过,为了完整起见:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      相关资源
      最近更新 更多