使用SourceViewer的Eclipse 4 RCP编辑器撤消和重做操作不起作用

时间:2014-04-22 03:09:02

标签: java eclipse text-editor rcp e4

我正在使用' 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'。这种方法也没有给出理想的结果。

请告诉我上述方法中缺少的内容。

2 个答案:

答案 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。