Skip to content

Commit

Permalink
'Copy all' for context menu in output view
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
salkin-naj committed Jun 25, 2020
1 parent 95a44a5 commit dbf7cb4
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 52 deletions.
61 changes: 11 additions & 50 deletions packages/output/src/browser/output-contribution.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,17 @@
* 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';
import { CommonCommands, quickCommand, OpenHandler, OpenerOptions, isFirefox, KeybindingRegistry } from '@theia/core/lib/browser';
import { CommonCommands, quickCommand, OpenHandler, OpenerOptions } from '@theia/core/lib/browser';
import { Command, CommandRegistry, MenuModelRegistry } from '@theia/core/lib/common';
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
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 {

Expand Down Expand Up @@ -102,16 +103,18 @@ export namespace OutputCommands {

export const COPY_ALL: Command = {
id: 'output:copy-all',
label: 'Copy all',
label: 'Copy All',
category: OUTPUT_CATEGORY,
};
}

@injectable()
export class OutputContribution extends AbstractViewContribution<OutputWidget> implements OpenHandler {

@inject(ClipboardService)
protected readonly clipboardService: ClipboardService;

readonly id: string = `${OutputWidget.ID}-opener`;
private textToCopy: string;

constructor() {
super({
Expand Down Expand Up @@ -144,21 +147,14 @@ export class OutputContribution extends AbstractViewContribution<OutputWidget> i
});
registry.registerCommand(OutputCommands.COPY_ALL, {
execute: () => {
this.widget.then(widget => {
const textToCopy = widget.getText();
this.copy(textToCopy);
});
const textToCopy = this.tryGetWidget()?.getText();
if (textToCopy) {
this.clipboardService.writeText(textToCopy);
}
}
});
}

registerKeybindings(registry: KeybindingRegistry): void {
registry.registerKeybinding({
command: OutputCommands.COPY_ALL.id,
keybinding: 'ctrlcmd+shift+c'
});
}

registerMenus(registry: MenuModelRegistry): void {
super.registerMenus(registry);
registry.registerMenuAction(OutputContextMenu.TEXT_EDIT_GROUP, {
Expand Down Expand Up @@ -197,39 +193,4 @@ export class OutputContribution extends AbstractViewContribution<OutputWidget> i

return widget instanceof OutputWidget ? predicate(widget) : false;
}
private async clipBoardCopyIsGranted(): Promise<boolean> {
// Unfortunately Firefox doesn't support permission check `clipboard-write`, so let try to copy anyway,
if (isFirefox) {
return true;
}
try {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const permissions = (navigator as any).permissions;
const { state } = await permissions.query({ name: 'clipboard-write' });
if (state === 'granted') {
return true;
}
} catch (e) { }

return false;
}

private async writeToClipBoard(): Promise<void> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const clipboard = (navigator as any).clipboard;

try {
await clipboard.writeText(this.textToCopy);
} catch (e) {}
}

async copy(text: string): Promise<void> {
this.textToCopy = text;

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const permissions = (navigator as any).permissions;
if (permissions && permissions.query && await this.clipBoardCopyIsGranted()) {
await this.writeToClipBoard();
}
}
}
4 changes: 2 additions & 2 deletions packages/output/src/browser/output-widget.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -220,15 +220,15 @@ export class OutputWidget extends BaseWidget implements StatefulWidget {
return undefined;
}

getText(): string {
getText(): string | undefined {
const editor = this.editor;
if (editor) {
const model = editor.getControl().getModel();
if (model) {
return model.getValue();
}
}
return '';
return undefined;
}

}
Expand Down

0 comments on commit dbf7cb4

Please sign in to comment.