2

我按照http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/guide/wrkAdv_undo.htm中描述的示例进行操作

init()我的方法中EditorPart

    /**
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite,
     * org.eclipse.ui.IEditorInput)
     */
    @Override
    public void init(IEditorSite site,IEditorInput input)
    throws PartInitException {
        ...
        IWorkbench workbench = getSite().getWorkbenchWindow().getWorkbench();
        myUndoContext= workbench.getOperationSupport().getUndoContext();


        UndoRedoActionGroup historyActionGroup = new UndoRedoActionGroup(site, myUndoContext, true);
        historyActionGroup.fillActionBars(site.getActionBars());
        }

...我在我的方法中添加了以下内容EditorPart

        IUndoableOperation operation = new MyOperation("My Action");
        operation.addContext(myUndoContext);
        try {
            IStatus status = OperationHistoryFactory.getOperationHistory().execute(operation, null, null);
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

我能够添加撤消操作,但我注意到撤消操作被添加到我的自定义编辑器打开的所有文件中。当我对文件进行更改时,所有其他打开的文件都会将撤消操作添加到编辑菜单中。如何使其仅适用于当前活动的文件?

4

2 回答 2

1

我认为问题在于这一行:

  myUndoContext= workbench.getOperationSupport().getUndoContext();

这为您提供了适用于整个工作台的撤消上下文。我认为您需要一个特定于您的编辑器的撤消上下文。org.eclipse.core.commands.operations.ObjectUndoContext看起来很合适。这可能就足够了

  myUndoContext = new ObjectUndoContext(this);

尽管 Eclipse 编辑器中的许多用途都使用和文档或撤消管理器作为对象。

于 2013-09-13T09:34:04.067 回答
0

我在一分钟前解决了类似的问题。我的问题如下:所有打开的编辑器都出现了 UndoRedo 操作。原因是,它是为每个编辑器创建和添加的,如下所示UndoActionHandlerRedoActionHandler

if (undoCmdHandler == null || !contains(undoCmdHandler)) {
    undoCmdHandler = new UndoActionHandler(site, undoContext);
    actionBars.getToolBarManager().add(undoCmdHandler);
}

#contains()方法总是返回 false(因为它有问题),所以总是创建处理程序。所以,我删除了它:)

在您的示例中,您还始终UndoRedoActionGroup为每个编辑器创建并用它填充操作栏。我建议您不要使用操作组,而是自己创建UndoActionHandler和创建RedoActionHandler,如上所示。

我你可以控制你的处理程序,那么解决方案是只创建一个 and 的实例,UndoActionHandlerRedoActionHandler它填充操作栏,但是当你的上下文发生变化时(当用户在编辑器之间导航时(你应该听这个事件))只需更新上下文你的处理程序,像这样:

redoCmdHandler.setContext(undoContext);

所以,最后你会得到类似的东西:

public static RedoActionHandler getRedoActionHandler(IWorkbenchPartSite site, IActionBars actionBars, IUndoContext undoContext) {
        if (redoCmdHandler == null) {
            redoCmdHandler = new RedoActionHandler(site, undoContext);
            actionBars.getToolBarManager().add(redoCmdHandler);
        } else {
            redoCmdHandler.setContext(undoContext);
        }
        return redoCmdHandler;
    }
于 2013-09-16T11:13:39.823 回答