2016-03-02 26 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)); 
     } 
    } 
    ... 
}