2016-03-02 56 views
1

我正在开发一个RCP,它有两个产品版本,一个核心应用程序和一个扩展。如果用户在同一个工作区中打开扩展应用程序后打开核心应用程序,eclipse会检测仅用于扩展应用程序的透视图并将其作为本地副本,因此它会在透视工具栏中显示为孤立扩展。Eclipse RCP:我可以从视角栏中移除孤立视角吗?

我创建了一个活动,以在运行核心应用程序时隐藏扩展应用程序透视图。它从透视菜单和透视快捷菜单中隐藏了它,但它并未从透视工具栏中将其删除。我还试图从活动工作台窗口的活动页面中检测孤立的透视图(通过在标签中查找尖括号)并用PlatformUI.getWorkbench().getPerspectiveRegistry().deletePerspective(perspective)删除它们,但这不会影响透视工具栏。我正在删除的视角不在核心应用中。

有没有办法以编程方式访问透视图工具栏,以便我可以删除任何孤立的透视图?或者任何其他方法可行?

+0

对于Eclipse 4,透视切换器是一个e4类,它只是查看应用程序模型中的'MPerspectiveStack'的内容。对于Eclipse 3,代码完全不同。 –

+0

我的目标是eclipse 4.5,但我的应用程序使用兼容层具有Eclipse 3视图。这是否意味着MPerspectiveStack被用来填充工具栏?我找不到Open Type的课程。 – MidnightJava

+0

所有Eclipse 4代码均使用e4透视切换器。您的意见是在核心e4之上使用3.x兼容模式。 MPerspectiveStack是Eclipse的一部分,因此要获得Open Type以找到它,您需要在首选项>插件开发'首选项页面中检查'在Java搜索中包含来自目标的所有插件'选项。透视切换器本身是'org.eclipse.e4.ui.workbench.addons.perspectiveswitcher.PerspectiveSwitcher' –

回答

0

我认为一个好的解决方案是创建一个自定义视角切换器,但是该路径被eclipse bug阻止。有一个suggested workaround,但它不适合我。我创建了一个自定义透视切换工具栏,但当透视图被打开或激活时,我无法找到更新它的方法。我的尝试记录在here

我在工作区关闭挂钩中删除了孤立视角,但由于某种原因,当我在启动切换器时选择了已打开但尚未选中的切换器中的E4工作台(LazyStackRenderer第238行)时抛出了NPE应用程序。

我通过关闭所有打开的关闭视图后,将它们的ID存储在首选项值中,然后在WorkbenchWindowAdvisor中启动应用程序时再次打开这些视图,从而按要求工作。这有点破解,但这是我能够避免使用E4工作台NPE的唯一方法,它也可以防止从工具栏设置视角,直到从Window菜单关闭并重新打开。

这是我的代码。

... 

IWorkbench workbench = ... 
static final String PERPSECTIVE_ID_1 = ... 
static fnal String PERSPECTIVE_ID_2 = ... 
static final String PREFERENCE_KEY = ... 

workbench.addWorkbenchListener(new IWorkbenchListener() { 
     public boolean preShutdown(IWorkbench workbench, boolean forced) { 

      IPerspectiveDescriptor[] openPerspectives = page.getOpenPerspectives(); 
      page.closeAllPerspectives(false, false); 
      StringBuilder sb = new StringBuilder(); 
      String delim = ""; 
      for (IPerspectiveDescriptor persp : openPerspectives) { 
       if (!persp.getId().equals(PERSPECTIVE_ID_1) && !persp.getId().equals(PERSPECTIVE_ID_2) { 
        sb.append(delim + persp.getId()); 
        delim = ";"; 
       } 
      } 
      getPreferenceStore().setValue(PREF_KEY, sb.toString()); 

      return true; 
     } 

     public void postShutdown(IWorkbench workbench) { 

     } 
}); 

class MyWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { 

    static final String PRODUCT_ID_1 = ... 
    static final String PRODUCT_ID_2 = ... 
    static final String PREFERENCE_KEY = ... 

    ... 

    @Override 
    public void postWindowOpen() { 

     IWorkbenchPage page = getWindowConfigurer().getWindow().getActivePage(); 
     String savedOpenPerspectiveStr = getPreferenceStore().getString(PREFERENCE_KEY); 
     if (!"".equals(savedOpenPerspectiveStr)) { 
      List<IPerspectiveDescriptor> openPerspectives = new ArrayList<IPerspectiveDescriptor>(); 
      String[] perspectiveIds = savedOpenPerspectiveStr.split(";"); 
      if (perspectiveIds.length == 0) { 
       openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(savedOpenPerspectiveStr)); 
      } else { 
       for (String id : perspectiveIds) { 
        openPerspectives.add(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(id)); 
       } 
      } 
      //successively setting perspectives causes them to appear in the perspective switcher toolbar 
      for (IPerspectiveDescriptor persp : openPerspectives) { 
       page.setPerspective(persp); 
      } 
     } 

     //now we set the appropriate perspective 
     if (Platform.getProduct().getId().equals(PRODUCT_ID_1)) { 
      page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_1)); 
     } else if (Platform.getProduct().getId().equals(PRODUCT_ID_2)) { 
      page.setPerspective(PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(PERSPECTIVE_ID_2)); 
     } 
    } 
    ... 
}