如何使用我自己的IUndoContext在我的RCP应用程序中实现IUndoableOperation

时间:2013-08-07 15:31:12

标签: eclipse eclipse-plugin eclipse-rcp

我已经实现了我的操作类,它扩展了org.eclipse.core.commands.operations.AbstractOperation,因此它具有方法execute(),redo()和undo()的实现。起初,我只能调用execute()方法,但我永远看不到我的Eclipse undo redo按钮上的undo或redo命令可用。

然后我在我的RCP应用程序(org.eclipse.ui.examples.undo)中安装了一个示例插件,魔术开始发生。

使用示例插件附带的“撤消历史记录视图”视图,我可以看到我的自定义撤消和重做项目被添加到要撤消和重做的事物堆栈中。此外,当“撤消历史记录视图”处于活动状态时,我的自定义撤消重做操作将显示在Eclipse撤消重做按钮中。所以,它有效,但有一个问题。

当我选择我的视图部分时,项目将从Eclipse撤消重做按钮中消失。我的假设是我没有正确使用IUndoContext。

就执行操作而言,这就是我所拥有的。我的InventoryLabelOperation类扩展了org.eclipse.core.commands.operations.AbstractOperation。而且,activePart字段是我想要使用IUndoContext正确播放的View Part的一个实例,但事实并非如此。

InventoryLabelOperation operation = new InventoryLabelOperation(message + name);
IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
IWorkbench workbench = activePart.getSite().getWorkbenchWindow().getWorkbench();
IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
operation.addContext(undoContext);
operationHistory.execute(operation, new NullProgressMonitor(), null);

有人看到我在这里缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

事实证明,我在操作创建方面正确地做了一切。事实证明,我正在开发的视图部分扩展了扩展ViewPart的CommonNavigator类(因为我的视图正在利用Common Navigator Framework)。我没有意识到CommonNavigator正在设置自己的上下文,因此导致我正在使用工作台上下文的撤消操作未正确显示。

完成操作后,请使用此调用返回的上下文...

undoContext = 
    (IUndoContext) ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);

事情开始出现在用户界面中。