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.expressions
和org.eclipse.ui.texteditor
.