我有一个有两个视角的eclipse插件。有一个视图可以在两个视角之一中扩展ViewPart。在这个视图中,我重写了ViewPart的saveState方法来保存我的数据。
首先,我打开有这种观点的观点。然后我在视图中添加一些应该保存在saveState中的数据。 接下来,我导航到没有此视图的其他透视图。 最后,我关闭了eclipse的工作区。
在eclipse 4.2(juno)中,视图的saveState方法尚未被调用。我的数据丢失了。 在eclipse 3.6(Helios)中,已经调用了视图的saveState方法。我的约会一直存在。
有谁知道原因?我怎样才能确保在关闭所有eclipse版本的工作区时调用saveState?
答案 0 :(得分:0)
Eclipse e4没有ApplicationWorkbenchAdvisor类,应用程序模型没有设置它的属性,与Eclipse 3.x完全不同。
您可以从wiki和vogella tutorial blog获得更多信息。
答案 1 :(得分:0)
很高兴,这个问题仍然存在于4.4.2中。
在它的基础上,问题是兼容性层WorkbenchPart.getViewReferences()仅搜索当前活动的透视图。此行为与3.x不同。 4.4.2 Eclipse WorkbenchPart中的相关代码在这里(注意对getCurrentPerspective()的调用。)
public IViewReference[] getViewReferences() {
MPerspective perspective = getCurrentPerspective();
if (perspective != null) {
List<MPlaceholder> placeholders = modelService.findElements(window, null,
MPlaceholder.class, null, EModelService.PRESENTATION);
List<IViewReference> visibleReferences = new ArrayList<IViewReference>();
for (ViewReference reference : viewReferences) {
for (MPlaceholder placeholder : placeholders) {
if (reference.getModel() == placeholder.getRef()
&& placeholder.isToBeRendered()) {
// only rendered placeholders are valid view references
visibleReferences.add(reference);
}
}
}
return visibleReferences.toArray(new IViewReference[visibleReferences.size()]);
}
return new IViewReference[0];
}
因此,如果一个视图打开然后更改为未显示该视图的透视图,则不会调用saveState()方法。
我们为UIEvents.UILifeCycle.appShutdownStarted添加了一个OSGI事件监听器,并调用了saveState()。但是,有必要手动获取IMemento,因为它不存在。示例代码位于org.eclipse.ui.internal.ViewReference(http://grepcode.com/file/repository.grepcode.com/java/eclipse.org/4.2.2/org.eclipse.ui/workbench/3.104.0/org/eclipse/ui/internal/ViewReference.java#ViewReference)中。
如果用户关闭视图而不是关闭应用程序,也可以使用IPartListener类添加部件关闭侦听器以潜在地保留设置。
我们还没有找到关闭部件的OSGI事件,但可能有一个。
这个讨论(Eclipse call ViewPart saveState on View close)建议使用IDialogSettings而不是IMemento。这个讨论还提出可能在dispose()方法中添加一些东西,但是不清楚在调用dispose()时还有多少资源仍然可用。