From 2e0a3985f2aa652ce16ac7b98b316116275d1966 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Fri, 2 Jun 2023 11:41:56 -0700 Subject: [PATCH] Allow share providers to return text --- src/vs/workbench/api/browser/mainThreadShare.ts | 3 ++- src/vs/workbench/api/common/extHost.protocol.ts | 2 +- src/vs/workbench/api/common/extHostShare.ts | 2 +- .../contrib/share/browser/share.contribution.ts | 13 +++++++------ src/vs/workbench/contrib/share/browser/share.css | 11 +++++++---- .../workbench/contrib/share/browser/shareService.ts | 2 +- src/vs/workbench/contrib/share/common/share.ts | 4 ++-- src/vscode-dts/vscode.proposed.shareProvider.d.ts | 5 +++-- 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadShare.ts b/src/vs/workbench/api/browser/mainThreadShare.ts index c1ab121b0079a..1974180b331d9 100644 --- a/src/vs/workbench/api/browser/mainThreadShare.ts +++ b/src/vs/workbench/api/browser/mainThreadShare.ts @@ -31,7 +31,8 @@ export class MainThreadShare implements MainThreadShareShape { selector, priority, provideShare: async (item: IShareableItem) => { - return URI.revive(await this.proxy.$provideShare(handle, item, new CancellationTokenSource().token)); + const result = await this.proxy.$provideShare(handle, item, new CancellationTokenSource().token); + return typeof result === 'string' ? result : URI.revive(result); } }; this.providers.set(handle, provider); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 64cddfd78f562..1588252278593 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2032,7 +2032,7 @@ export interface ExtHostQuickDiffShape { } export interface ExtHostShareShape { - $provideShare(handle: number, shareableItem: IShareableItemDto, token: CancellationToken): Promise; + $provideShare(handle: number, shareableItem: IShareableItemDto, token: CancellationToken): Promise; } export interface ExtHostTaskShape { diff --git a/src/vs/workbench/api/common/extHostShare.ts b/src/vs/workbench/api/common/extHostShare.ts index 0e0c2bc8f1b2a..56cd94f38dfb6 100644 --- a/src/vs/workbench/api/common/extHostShare.ts +++ b/src/vs/workbench/api/common/extHostShare.ts @@ -23,7 +23,7 @@ export class ExtHostShare implements ExtHostShareShape { this.proxy = mainContext.getProxy(MainContext.MainThreadShare); } - async $provideShare(handle: number, shareableItem: IShareableItemDto, token: CancellationToken): Promise { + async $provideShare(handle: number, shareableItem: IShareableItemDto, token: CancellationToken): Promise { const provider = this.providers.get(handle); const result = await provider?.provideShare({ selection: Range.to(shareableItem.selection), resourceUri: URI.revive(shareableItem.resourceUri) }, token); return result ?? undefined; diff --git a/src/vs/workbench/contrib/share/browser/share.contribution.ts b/src/vs/workbench/contrib/share/browser/share.contribution.ts index 0794c8673a33c..6d1886854ad01 100644 --- a/src/vs/workbench/contrib/share/browser/share.contribution.ts +++ b/src/vs/workbench/contrib/share/browser/share.contribution.ts @@ -86,28 +86,29 @@ class ShareWorkbenchContribution { const progressService = accessor.get(IProgressService); const selection = accessor.get(ICodeEditorService).getActiveCodeEditor()?.getSelection() ?? undefined; - const uri = await progressService.withProgress({ + const result = await progressService.withProgress({ location: ProgressLocation.Window, detail: localize('generating link', 'Generating link...') }, async () => shareService.provideShare({ resourceUri, selection }, new CancellationTokenSource().token)); - if (uri) { - const uriText = uri.toString(); + if (result) { + const uriText = result.toString(); + const isResultText = typeof result === 'string'; await clipboardService.writeText(uriText); dialogService.prompt( { type: Severity.Info, - message: localize('shareSuccess', 'Copied link to clipboard!'), + message: isResultText ? localize('shareTextSuccess', 'Copied text to clipboard!') : localize('shareSuccess', 'Copied link to clipboard!'), custom: { icon: Codicon.check, markdownDetails: [{ markdown: new MarkdownString(`
${uriText}
`, { supportHtml: true }), - classes: ['share-dialog-input'] + classes: [isResultText ? 'share-dialog-input-text' : 'share-dialog-input-link'] }] }, cancelButton: localize('close', 'Close'), - buttons: [{ label: localize('open link', 'Open Link'), run: () => { urlService.open(uri, { openExternal: true }); } }] + buttons: isResultText ? [] : [{ label: localize('open link', 'Open Link'), run: () => { urlService.open(result, { openExternal: true }); } }] } ); } diff --git a/src/vs/workbench/contrib/share/browser/share.css b/src/vs/workbench/contrib/share/browser/share.css index 5d9469d49c614..4eadba019fce8 100644 --- a/src/vs/workbench/contrib/share/browser/share.css +++ b/src/vs/workbench/contrib/share/browser/share.css @@ -3,16 +3,19 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -div.share-dialog-input { +div.share-dialog-input-text, +div.share-dialog-input-link { border: 1px solid var(--vscode-input-border, transparent); border-radius: 2px; color: var(--vscode-input-foreground); background-color: var(--vscode-input-background); - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; padding: 2px; user-select: all; line-height: 24px; } +div.share-dialog-input-link { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} diff --git a/src/vs/workbench/contrib/share/browser/shareService.ts b/src/vs/workbench/contrib/share/browser/shareService.ts index 7984c3f00e2b4..201c31bf844d9 100644 --- a/src/vs/workbench/contrib/share/browser/shareService.ts +++ b/src/vs/workbench/contrib/share/browser/shareService.ts @@ -48,7 +48,7 @@ export class ShareService implements IShareService { return []; } - async provideShare(item: IShareableItem, token: CancellationToken): Promise { + async provideShare(item: IShareableItem, token: CancellationToken): Promise { const language = this.codeEditorService.getActiveCodeEditor()?.getModel()?.getLanguageId() ?? ''; const providers = [...this._providers.values()] .filter((p) => score(p.selector, item.resourceUri, language, true, undefined, undefined) > 0) diff --git a/src/vs/workbench/contrib/share/common/share.ts b/src/vs/workbench/contrib/share/common/share.ts index f8df3305e6671..28f97630f604f 100644 --- a/src/vs/workbench/contrib/share/common/share.ts +++ b/src/vs/workbench/contrib/share/common/share.ts @@ -22,7 +22,7 @@ export interface IShareProvider { readonly priority: number; readonly selector: LanguageSelector; prepareShare?(item: IShareableItem, token: CancellationToken): Thenable; - provideShare(item: IShareableItem, token: CancellationToken): Thenable; + provideShare(item: IShareableItem, token: CancellationToken): Thenable; } export const IShareService = createDecorator('shareService'); @@ -31,5 +31,5 @@ export interface IShareService { registerShareProvider(provider: IShareProvider): IDisposable; getShareActions(): ISubmenuItem[]; - provideShare(item: IShareableItem, token: CancellationToken): Thenable; + provideShare(item: IShareableItem, token: CancellationToken): Thenable; } diff --git a/src/vscode-dts/vscode.proposed.shareProvider.d.ts b/src/vscode-dts/vscode.proposed.shareProvider.d.ts index 38a0d134f9782..8c432341a72a6 100644 --- a/src/vscode-dts/vscode.proposed.shareProvider.d.ts +++ b/src/vscode-dts/vscode.proposed.shareProvider.d.ts @@ -47,9 +47,10 @@ declare module 'vscode' { * * @param item Data about an item which can be shared. * @param token A cancellation token. - * @returns An {@link Uri} which will be copied to the user's clipboard and presented in a confirmation dialog. + * @returns A {@link Uri} representing an external link or sharing text. The provider result + * will be copied to the user's clipboard and presented in a confirmation dialog. */ - provideShare(item: ShareableItem, token: CancellationToken): ProviderResult; + provideShare(item: ShareableItem, token: CancellationToken): ProviderResult; } export namespace window {