From 3342e5350821a42e8d7dc30ac0940fb92ba0689e Mon Sep 17 00:00:00 2001 From: Jan-Niklas Spangenberg Date: Fri, 19 Jun 2020 12:18:28 +0200 Subject: [PATCH] 'Copy all' for context menu in output view This adds another option to the context menu of the output view, which copies everything in the selected channel into the clipboard, using the clipboardService Closes #7912 Signed-off-by: Jan-Niklas Spangenberg --- .../output/src/browser/output-contribution.ts | 22 ++++++++++++++++++- packages/output/src/browser/output-widget.tsx | 11 ++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/output/src/browser/output-contribution.ts b/packages/output/src/browser/output-contribution.ts index 0041d6acf246b..415554cbab286 100644 --- a/packages/output/src/browser/output-contribution.ts +++ b/packages/output/src/browser/output-contribution.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { injectable } from 'inversify'; +import { injectable, inject } from 'inversify'; import URI from '@theia/core/lib/common/uri'; import { Widget } from '@theia/core/lib/browser/widgets/widget'; import { MaybePromise } from '@theia/core/lib/common/types'; @@ -24,6 +24,7 @@ import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-con import { OutputWidget } from './output-widget'; import { OutputContextMenu } from './output-context-menu'; import { OutputUri } from '../common/output-uri'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; export namespace OutputCommands { @@ -100,11 +101,19 @@ export namespace OutputCommands { category: OUTPUT_CATEGORY }; + export const COPY_ALL: Command = { + id: 'output:copy-all', + label: 'Copy All', + category: OUTPUT_CATEGORY, + }; } @injectable() export class OutputContribution extends AbstractViewContribution implements OpenHandler { + @inject(ClipboardService) + protected readonly clipboardService: ClipboardService; + readonly id: string = `${OutputWidget.ID}-opener`; constructor() { @@ -136,6 +145,14 @@ export class OutputContribution extends AbstractViewContribution i isVisible: widget => this.withWidget(widget, output => output.isLocked), execute: () => this.widget.then(widget => widget.unlock()) }); + registry.registerCommand(OutputCommands.COPY_ALL, { + execute: () => this.widget.then(widget => { + this.withWidget(widget, output => { + this.clipboardService.writeText(output.getText()); + return true; + }); + }) + }); } registerMenus(registry: MenuModelRegistry): void { @@ -143,6 +160,9 @@ export class OutputContribution extends AbstractViewContribution i registry.registerMenuAction(OutputContextMenu.TEXT_EDIT_GROUP, { commandId: CommonCommands.COPY.id }); + registry.registerMenuAction(OutputContextMenu.TEXT_EDIT_GROUP, { + commandId: OutputCommands.COPY_ALL.id + }); registry.registerMenuAction(OutputContextMenu.COMMAND_GROUP, { commandId: quickCommand.id, label: 'Find Command...' diff --git a/packages/output/src/browser/output-widget.tsx b/packages/output/src/browser/output-widget.tsx index 0d137c3bd3dcd..021af088f0d4e 100644 --- a/packages/output/src/browser/output-widget.tsx +++ b/packages/output/src/browser/output-widget.tsx @@ -220,6 +220,17 @@ export class OutputWidget extends BaseWidget implements StatefulWidget { return undefined; } + getText(): string { + const editor = this.editor; + if (editor) { + const model = editor.getControl().getModel(); + if (model) { + return model.getValue(); + } + } + return ''; + } + } export namespace OutputWidget {