4

我有一个使用扩展视图的 Eclipse 插件ViewPartViewPart有一个saveState需要IMemento.

我将我的代码添加到saveState相应的init方法中,它可以工作。不幸的是,saveState仅在整个工作区关闭时才调用。我的观点并不是那么重要,以至于我可以期望它一直被打开。saveState因此,如果在视图关闭时调用它会很酷。

我发现一个视图部分侦听器意味着对视图关闭做出反应,但我没有得到的是IMemento来自哪里。我在哪里可以获得用于工作区关闭的纪念品对象?init或者如果视图被(重新)打开,我必须在哪里存储我自己的纪念品对象以使视图部分在方法中使用它?

@Override
public void saveState(IMemento memento) {
    super.saveState(memento);
    memento = memento.createChild(MEMENTO_GUI_STATE);
    memento.putBoolean(MEMENTO_IS_FLAT, !isHierarchicalModeActive());
    memento.putBoolean(MEMENTO_IS_CATEGORY_MODE_ACTIVE, comboViewer.isVisible());
}

这是我的saveState- 我可以告诉我的视图以某种方式告诉每次视图关闭时调用它吗?

4

3 回答 3

4

看看Eclipse FAQ 中的这个问题:

存储视图状态以两种常见的方式完成,具体取决于您是要在工作台会话之间还是跨视图调用存储设置。这些设施中的第一个可以直接在 IViewPart 上找到。当工作台关闭时,会在所有打开的视图上调用 saveState 方法。

保持视图状态的另一种机制是 JFace IDialogSettings 工具。对话框设置优于视图保存/初始化机制的优点是您可以控制设置何时保留。仅当您的视图在工作台关闭时打开时才会调用 saveState 方法,因此当用户关闭视图时存储视图状态没有用处。另一方面,可以随时更改和保留对话框设置。

转到其他问题Eclipse 文档本身以了解设置机制。

于 2012-04-23T11:13:33.547 回答
2

好吧,这可能“有点”难看,但我没有想到其他任何事情:将 memento 变量存储为字段变量,在您的init(IViewSite site, IMemento memento)方法中对其进行初始化,覆盖dispose()saveState(IMemento memento)显式调用。

于 2012-02-27T22:49:56.443 回答
0

您可以随时从自己的 XMLMemento 中读取和编写自己的 XMLMemento org.eclipse.core.runtime.Plugin.getStateLocation()。正如@BelaViser 提到的,您可以在IViewPart#dispose()方法中编写文件并在视图构造函数中读取它。

于 2012-03-05T21:39:14.890 回答