【问题标题】:Eclipse 4.2(juno) did not call saveState method of ViewPart when workspace is closing工作区关闭时,Eclipse 4.2(juno) 未调用 ViewPart 的 saveState 方法
【发布时间】:2013-05-20 03:21:04
【问题描述】:

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

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

在 eclipse 4.2(juno) 中,视图的 saveState 方法没有被调用。我的数据丢失了。 在 eclipse 3.6(Helios) 中,视图的 saveState 方法已被调用。我的日期已被保留。

有人知道原因吗?如何确保在所有版本的 eclipse 上关闭工作区时都会调用 saveState?

【问题讨论】:

    标签: eclipse view eclipse-plugin perspective


    【解决方案1】:

    Eclipse e4 没有 ApplicationWorkbenchAdvisor 类,并且应用程序模型没有设置它的属性,与 Eclipse 3.x 完全不同。
    您可以通过wikivogella tutorial blog 获得更多信息。

    【讨论】:

      【解决方案2】:

      高兴的是,这个问题一直持续到 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() 时仍有多少资源可用。

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        相关资源
        最近更新 更多