我正在使用' SourceViewer'创建编辑器。以下是我的' @ PostConstruct'的代码片段。方法
// viewer is my SourceViewer instance
viewer = new SourceViewer(parent,verticalRuler, styles);
IUndoManager undoManager = new TextViewerUndoManager(25);
undoManager.connect(viewer);
viewer.setUndoManager(undoManager);
即使是默认的' TextViewerUndoManager'与SourceViewer'相关联。 Ctrl + Z和Ctrl + Y不起作用。
我尝试的另一种方法是覆盖' IUndoManager getUndoManager(ISourceViewer sourceViewer)' ' SourceViewerConfiguration'子类并返回一个' TextViewerUndoManager'。这种方法也没有给出理想的结果。
请告诉我上述方法中缺少的内容。
答案 0 :(得分:1)
通常SourceViewerConfiguration
提供撤消管理员,SourceViewer
期望这个并且将从中设置管理员。默认设置已设置TextViewerUndoManager
。
在e4应用程序中,您没有获得任何默认的键绑定,命令或处理程序,因此您必须设置所有这些以使用撤消管理器。
在您的应用程序模型中声明undo和redo的命令。
声明Ctrl + Z和Ctrl + Y的键绑定,指定命令。您可能希望将键绑定放在特定于文本编辑器的绑定表中。
声明undo和redo命令的处理程序,undo的代码可能如下所示:
public class UndoHandler
{
@Inject
private Adapter _adapter;
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) final MPart part)
{
final ITextOperationTarget opTarget = _adapter.adapt(part.getObject(), ITextOperationTarget.class);
opTarget.doOperation(ITextOperationTarget.UNDO);
}
@CanExecute
public boolean canExecute(@Named(IServiceConstants.ACTIVE_PART) final MPart part)
{
final ITextOperationTarget opTarget = _adapter.adapt(part.getObject(), ITextOperationTarget.class);
if (opTarget == null)
return false;
return opTarget.canDoOperation(ITextOperationTarget.UNDO);
}
}
重做类似但使用ITextOperationTarget.REDO
。
答案 1 :(得分:0)
做事/登记事情的顺序很重要。确保将撤消管理器AFTER设置文档后连接到SourceViewer实例,因为在connect()上,撤消管理器将从查看器中检索文档,如果找不到文档则不会注册任何内容并且可以撤消()将始终返回false。