0

我成功地在 Eclipse 中扩展了 PyDev 编辑器,带有并排显示,但我无法复制我添加的额外 SourceViewer 的内容。我可以在显示中选择一些文本,但是当我按下Ctrl+时C,它总是复制主 PyDev 编辑器的选定文本。

我在 Eclipse 编辑器中找到了一篇关于键绑定的文章,但那里的代码似乎不完整且有点过时。如何将复制命令配置为从具有焦点的 SourceViewer 复制?

我想这样做的原因是我已经编写了一个用于在 Python 中进行实时编码的工具,如果用户可以复制显示并将其粘贴到错误描述中,那么用户提交错误报告会容易得多。

4

1 回答 1

0

David Green 的文章是一个良好的开端,但需要进行一些挖掘才能使其全部发挥作用。我在 GitHub 上发布了一个完整的示例项目,我将在这里发布几个片段。

该类TextViewerSupport为您要委托给额外文本查看器的每个命令连接一个新的操作处理程序。如果您有多个文本查看器,只需TextViewerSupport为每个查看器实例化一个对象。它将其构造函数中的所有内容连接起来。

public TextViewerSupport(TextViewer textViewer) {
    this.textViewer = textViewer;
    StyledText textWidget = textViewer.getTextWidget();
    textWidget.addFocusListener(this);
    textWidget.addDisposeListener(this);

    IWorkbenchWindow window = PlatformUI.getWorkbench()
            .getActiveWorkbenchWindow();
    handlerService = (IHandlerService) window
            .getService(IHandlerService.class);

    if (textViewer.getTextWidget().isFocusControl()) {
        activateContext();
    }
}

activateContext()方法有一个您要委托的所有命令的列表,并为每个命令注册一个新的处理程序。这是大卫文章的变化之一;hisITextEditorActionDefinitionIds已被弃用并替换为IWorkbenchCommandConstants.

protected void activateContext() {
    if (handlerActivations.isEmpty()) {
        activateHandler(ITextOperationTarget.COPY,
                IWorkbenchCommandConstants.EDIT_COPY);
    }
}

// Add a single handler.
protected void activateHandler(int operation, String actionDefinitionId) {
    StyledText textWidget = textViewer.getTextWidget();
    IHandler actionHandler = createActionHandler(operation,
            actionDefinitionId);
    IHandlerActivation handlerActivation = handlerService.activateHandler(
            actionDefinitionId, actionHandler,
            new ActiveFocusControlExpression(textWidget));

    handlerActivations.add(handlerActivation);
}

// Create a handler that delegates to the text viewer.
private IHandler createActionHandler(final int operation,
        String actionDefinitionId) {
    Action action = new Action() {
        @Override
        public void run() {
            if (textViewer.canDoOperation(operation)) {
                textViewer.doOperation(operation);
            }
        }
    };
    action.setActionDefinitionId(actionDefinitionId);
    return new ActionHandler(action);
}

ActiveFocusControlExpression新处理程序提供了足够高的优先级,它将取代标准处理程序,并且几乎与 David 的版本相同。但是,为了编译它,我必须在我的插件清单中添加额外的依赖项:我导入了包org.eclipse.core.expressionsorg.eclipse.ui.texteditor.

于 2012-12-23T05:51:40.630 回答