当工作空间关闭时,Eclipse 4.2(juno)没有调用ViewPart的saveState方法

时间:2013-05-20 03:21:04

标签: eclipse view eclipse-plugin perspective

我有一个有两个视角的eclipse插件。有一个视图可以在两个视角之一中扩展ViewPart。在这个视图中,我重写了ViewPart的saveState方法来保存我的数据。

首先,我打开有这种观点的观点。然后我在视图中添加一些应该保存在saveState中的数据。 接下来,我导航到没有此视图的其他透视图。 最后,我关闭了eclipse的工作区。

在eclipse 4.2(juno)中,视图的saveState方法尚未被调用。我的数据丢失了。 在eclipse 3.6(Helios)中,已经调用了视图的saveState方法。我的约会一直存在。

有谁知道原因?我怎样才能确保在关闭所有eclipse版本的工作区时调用saveState?

2 个答案:

答案 0 :(得分:0)

Eclipse e4没有ApplicationWorkbenchAdvisor类,应用程序模型没有设置它的属性,与Eclipse 3.x完全不同。
您可以从wikivogella 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()时还有多少资源仍然可用。