我认为一个好的解决方案是创建一个自定义视角切换器,但是该路径被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' –