我正在关注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();
}
我能够添加撤消操作,但我注意到撤消操作会添加到我的自定义编辑器打开的所有文件中。当我对文件进行更改时,所有其他打开的文件都会将撤消操作添加到编辑菜单中。如何使其仅适用于当前活动的文件?
答案 0 :(得分:1)
我认为问题在于这一行:
myUndoContext= workbench.getOperationSupport().getUndoContext();
这为您提供了一个用于整个工作台的撤消上下文。我认为您需要一个特定于您的编辑器的撤消上下文。 org.eclipse.core.commands.operations.ObjectUndoContext
看起来合适。这可能就足够了
myUndoContext = new ObjectUndoContext(this);
尽管Eclipse编辑器中的许多用法都使用和记录或撤消管理器作为对象。
答案 1 :(得分:0)
我刚刚解决了类似的问题。我的问题是:所有已打开的编辑器都出现了UndoRedo操作。原因是,为每个编辑器创建并添加了UndoActionHandler
和RedoActionHandler
,如下所示:
if (undoCmdHandler == null || !contains(undoCmdHandler)) {
undoCmdHandler = new UndoActionHandler(site, undoContext);
actionBars.getToolBarManager().add(undoCmdHandler);
}
#contains()方法总是返回false(因为它是错误的),因此总是创建处理程序。所以,我删除了它:)
在您的示例中,您还始终为每个编辑器创建UndoRedoActionGroup
并使用它填充操作栏。我建议您不要使用操作组,而是自己创建UndoActionHandler
和RedoActionHandler
,如上所示。
我可以控制您的处理程序,然后解决方案是只创建一个UndoActionHandler
和RedoActionHandler
的实例,用它填充操作栏,但是当您的上下文更改时(当用户在编辑器之间导航时) (你应该听这个事件))只需更新你的处理程序上下文,如下所示:
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;
}