我認爲一個好的解決方案是創建一個自定義視角切換器,但是該路徑被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));
}
}
...
}
對於Eclipse 4,透視切換器是一個e4類,它只是查看應用程序模型中的'MPerspectiveStack'的內容。對於Eclipse 3,代碼完全不同。 –
我的目標是eclipse 4.5,但我的應用程序使用兼容層具有Eclipse 3視圖。這是否意味着MPerspectiveStack被用來填充工具欄?我找不到Open Type的課程。 – MidnightJava
所有Eclipse 4代碼均使用e4透視切換器。您的意見是在覈心e4之上使用3.x兼容模式。 MPerspectiveStack是Eclipse的一部分,因此要獲得Open Type以找到它,您需要在首選項>插件開發'首選項頁面中檢查'在Java搜索中包含來自目標的所有插件'選項。透視切換器本身是'org.eclipse.e4.ui.workbench.addons.perspectiveswitcher.PerspectiveSwitcher' –