diff --git a/extensions/markdown-language-features/src/commands/showPreview.ts b/extensions/markdown-language-features/src/commands/showPreview.ts index bd59d575bbb..fde3bd7192d 100644 --- a/extensions/markdown-language-features/src/commands/showPreview.ts +++ b/extensions/markdown-language-features/src/commands/showPreview.ts @@ -6,9 +6,8 @@ import * as vscode from 'vscode'; import { Command } from '../commandManager'; -import { MarkdownPreviewManager } from '../features/previewManager'; +import { MarkdownPreviewManager, DynamicPreviewSettings } from '../features/previewManager'; import { TelemetryReporter } from '../telemetryReporter'; -import { PreviewSettings } from '../features/preview'; interface ShowPreviewSettings { readonly sideBySide?: boolean; @@ -39,7 +38,7 @@ async function showPreview( } const resourceColumn = (vscode.window.activeTextEditor && vscode.window.activeTextEditor.viewColumn) || vscode.ViewColumn.One; - webviewManager.preview(resource, { + webviewManager.openDynamicPreview(resource, { resourceColumn: resourceColumn, previewColumn: previewSettings.sideBySide ? resourceColumn + 1 : resourceColumn, locked: !!previewSettings.locked @@ -59,7 +58,7 @@ export class ShowPreviewCommand implements Command { private readonly telemetryReporter: TelemetryReporter ) { } - public execute(mainUri?: vscode.Uri, allUris?: vscode.Uri[], previewSettings?: PreviewSettings) { + public execute(mainUri?: vscode.Uri, allUris?: vscode.Uri[], previewSettings?: DynamicPreviewSettings) { for (const uri of Array.isArray(allUris) ? allUris : [mainUri]) { showPreview(this.webviewManager, this.telemetryReporter, uri, { sideBySide: false, @@ -77,7 +76,7 @@ export class ShowPreviewToSideCommand implements Command { private readonly telemetryReporter: TelemetryReporter ) { } - public execute(uri?: vscode.Uri, previewSettings?: PreviewSettings) { + public execute(uri?: vscode.Uri, previewSettings?: DynamicPreviewSettings) { showPreview(this.webviewManager, this.telemetryReporter, uri, { sideBySide: true, locked: previewSettings && previewSettings.locked diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 16636dd1585..60aa4ebb534 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -72,7 +72,7 @@ export class PreviewDocumentVersion { } } -export class MarkdownPreview extends Disposable { +export class DynamicMarkdownPreview extends Disposable { public static readonly viewType = 'markdown.preview'; @@ -98,13 +98,15 @@ export class MarkdownPreview extends Disposable { logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor, contributionProvider: MarkdownContributionProvider, - ): Promise { + ): Promise { const resource = vscode.Uri.parse(state.resource); const locked = state.locked; const line = state.line; const resourceColumn = state.resourceColumn; - const preview = new MarkdownPreview( + webview.webview.options = DynamicMarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions); + + const preview = new DynamicMarkdownPreview( webview, resource, locked, @@ -115,8 +117,6 @@ export class MarkdownPreview extends Disposable { topmostLineMonitor, contributionProvider); - preview.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions); - if (!isNaN(line)) { preview.line = line; } @@ -134,16 +134,16 @@ export class MarkdownPreview extends Disposable { logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor, contributionProvider: MarkdownContributionProvider - ): MarkdownPreview { + ): DynamicMarkdownPreview { const webview = vscode.window.createWebviewPanel( - MarkdownPreview.viewType, - MarkdownPreview.getPreviewTitle(resource, locked), + DynamicMarkdownPreview.viewType, + DynamicMarkdownPreview.getPreviewTitle(resource, locked), previewColumn, { enableFindWidget: true, - ...MarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions) + ...DynamicMarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions) }); - return new MarkdownPreview( + return new DynamicMarkdownPreview( webview, resource, locked, @@ -350,7 +350,7 @@ export class MarkdownPreview extends Disposable { } } - public matches(otherPreview: MarkdownPreview): boolean { + public matches(otherPreview: DynamicMarkdownPreview): boolean { return this.matchesResource(otherPreview._resource, otherPreview.position, otherPreview._locked); } @@ -360,7 +360,7 @@ export class MarkdownPreview extends Disposable { public toggleLock() { this._locked = !this._locked; - this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); + this.editor.title = DynamicMarkdownPreview.getPreviewTitle(this._resource, this._locked); } private get iconPath() { @@ -463,7 +463,7 @@ export class MarkdownPreview extends Disposable { ): vscode.WebviewOptions { return { enableScripts: true, - localResourceRoots: MarkdownPreview.getLocalResourceRoots(resource, contributions) + localResourceRoots: DynamicMarkdownPreview.getLocalResourceRoots(resource, contributions) }; } @@ -529,9 +529,9 @@ export class MarkdownPreview extends Disposable { } private setContent(html: string): void { - this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); + this.editor.title = DynamicMarkdownPreview.getPreviewTitle(this._resource, this._locked); this.editor.iconPath = this.iconPath; - this.editor.webview.options = MarkdownPreview.getWebviewOptions(this._resource, this._contributionProvider.contributions); + this.editor.webview.options = DynamicMarkdownPreview.getWebviewOptions(this._resource, this._contributionProvider.contributions); this.editor.webview.html = html; } @@ -564,9 +564,3 @@ export class MarkdownPreview extends Disposable { this.imageInfo = imageInfo; } } - -export interface PreviewSettings { - readonly resourceColumn: vscode.ViewColumn; - readonly previewColumn: vscode.ViewColumn; - readonly locked: boolean; -} diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index 3fc8106908b..1026eca75d4 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -8,18 +8,24 @@ import { Logger } from '../logger'; import { MarkdownContributionProvider } from '../markdownExtensions'; import { disposeAll, Disposable } from '../util/dispose'; import { MarkdownFileTopmostLineMonitor } from '../util/topmostLineMonitor'; -import { MarkdownPreview, PreviewSettings } from './preview'; +import { DynamicMarkdownPreview } from './preview'; import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { MarkdownContentProvider } from './previewContentProvider'; +export interface DynamicPreviewSettings { + readonly resourceColumn: vscode.ViewColumn; + readonly previewColumn: vscode.ViewColumn; + readonly locked: boolean; +} -export class MarkdownPreviewManager extends Disposable implements vscode.WebviewPanelSerializer { +export class MarkdownPreviewManager extends Disposable implements vscode.WebviewPanelSerializer, vscode.WebviewEditorProvider { private static readonly markdownPreviewActiveContextKey = 'markdownPreviewFocus'; private readonly _topmostLineMonitor = new MarkdownFileTopmostLineMonitor(); private readonly _previewConfigurations = new MarkdownPreviewConfigurationManager(); - private readonly _previews: MarkdownPreview[] = []; - private _activePreview: MarkdownPreview | undefined = undefined; + + private readonly _previews: DynamicMarkdownPreview[] = []; + private _activePreview: DynamicMarkdownPreview | undefined = undefined; public constructor( private readonly _contentProvider: MarkdownContentProvider, @@ -27,7 +33,7 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview private readonly _contributions: MarkdownContributionProvider ) { super(); - this._register(vscode.window.registerWebviewPanelSerializer(MarkdownPreview.viewType, this)); + this._register(vscode.window.registerWebviewPanelSerializer(DynamicMarkdownPreview.viewType, this)); } public dispose(): void { @@ -47,15 +53,15 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview } } - public preview( + public openDynamicPreview( resource: vscode.Uri, - previewSettings: PreviewSettings + settings: DynamicPreviewSettings ): void { - let preview = this.getExistingPreview(resource, previewSettings); + let preview = this.getExistingPreview(resource, settings); if (preview) { - preview.reveal(previewSettings.previewColumn); + preview.reveal(settings.previewColumn); } else { - preview = this.createNewPreview(resource, previewSettings); + preview = this.createNewPreview(resource, settings); } preview.update(resource); @@ -87,7 +93,7 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview webview: vscode.WebviewPanel, state: any ): Promise { - const preview = await MarkdownPreview.revive( + const preview = await DynamicMarkdownPreview.revive( webview, state, this._contentProvider, @@ -99,19 +105,34 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview this.registerPreview(preview); } + public async resolveWebviewEditor( + input: { readonly resource: vscode.Uri; }, + webview: vscode.WebviewPanel + ): Promise { + await DynamicMarkdownPreview.revive( + webview, + { resource: input.resource.toString() }, + this._contentProvider, + this._previewConfigurations, + this._logger, + this._topmostLineMonitor, + this._contributions); + return {}; + } + private getExistingPreview( resource: vscode.Uri, - previewSettings: PreviewSettings - ): MarkdownPreview | undefined { + previewSettings: DynamicPreviewSettings + ): DynamicMarkdownPreview | undefined { return this._previews.find(preview => preview.matchesResource(resource, previewSettings.previewColumn, previewSettings.locked)); } private createNewPreview( resource: vscode.Uri, - previewSettings: PreviewSettings - ): MarkdownPreview { - const preview = MarkdownPreview.create( + previewSettings: DynamicPreviewSettings + ): DynamicMarkdownPreview { + const preview = DynamicMarkdownPreview.create( resource, previewSettings.previewColumn, previewSettings.resourceColumn, @@ -128,8 +149,8 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview } private registerPreview( - preview: MarkdownPreview - ): MarkdownPreview { + preview: DynamicMarkdownPreview + ): DynamicMarkdownPreview { this._previews.push(preview); preview.onDispose(() => {