从任何SourceViewer重点关注Eclipse插件中进行Ctrl-C复制

时间:2012-12-23 05:51:41

标签: eclipse eclipse-plugin pydev

我用side-by-side display成功扩展了Eclipse中的PyDev编辑器,但是我无法复制我添加的额外SourceViewer的内容。我可以在显示中选择一些文本,但是当我按 Ctrl + C 时,它总是复制PyDev主编辑器的所选文本。

我在key bindings in Eclipse editors上发现了一篇文章,但那里的代码似乎不完整,有点过时了。如何配置复制命令以从任何SourceViewer具有焦点的位置进行复制?

我想这样做的原因是我为live coding in Python编写了一个工具,如果他们可以复制显示并将其粘贴到bug中,那么用户提交错误报告要容易得多描述

1 个答案:

答案 0 :(得分:0)

David Green's article是一个良好的开端,但需要花一些时间才能完成所有工作。我在GitHub上发布了一个完整的example project,我会在这里发布几个片段。

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()方法包含您要委派的所有命令的列表,并为每个命令注册一个新的处理程序。这是David的文章中的一个变化;他的ITextEditorActionDefinitionIds已弃用,已替换为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