diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 3b2cc65e932e053c73c036a01125665a77a23a54..51e1c093f14fd2c8a6771e95838db0f09a7c6ce7 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -56,8 +56,8 @@ export class MarkdownPreview { this.dispose(); }, null, this.disposables); - this.webview.onDidChangeViewColumn(() => { - this._onDidChangeViewColumnEmitter.fire(); + this.webview.onDidChangeViewState(e => { + this._onDidChangeViewStateEmitter.fire(e); }, null, this.disposables); this.webview.onDidReceiveMessage(e => { @@ -107,8 +107,8 @@ export class MarkdownPreview { private readonly _onDisposeEmitter = new vscode.EventEmitter(); public readonly onDispose = this._onDisposeEmitter.event; - private readonly _onDidChangeViewColumnEmitter = new vscode.EventEmitter(); - public readonly onDidChangeViewColumn = this._onDidChangeViewColumnEmitter.event; + private readonly _onDidChangeViewStateEmitter = new vscode.EventEmitter(); + public readonly onDidChangeViewState = this._onDidChangeViewStateEmitter.event; public get resource(): vscode.Uri { return this._resource; @@ -118,7 +118,7 @@ export class MarkdownPreview { this._onDisposeEmitter.fire(); this._onDisposeEmitter.dispose(); - this._onDidChangeViewColumnEmitter.dispose(); + this._onDidChangeViewStateEmitter.dispose(); this.webview.dispose(); disposeAll(this.disposables); diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index 08f5e0277b2e0dfa5c2b3ec9b09c1ca1a768317a..650711f4bcaed1b3676b2d701e2d87b9cabf2aef 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -28,15 +28,8 @@ export class MarkdownPreviewManager { private readonly logger: Logger, private readonly contributions: MarkdownContributions ) { - vscode.window.onDidChangeActiveEditor(editor => { - vscode.commands.executeCommand('setContext', MarkdownPreviewManager.markdownPreviewActiveContextKey, - editor && editor.editorType === 'webview' && editor.uri.scheme === MarkdownPreview.previewScheme); - - this.activePreview = editor && editor.editorType === 'webview' - ? this.previews.find(preview => editor.uri.toString() === preview.uri.toString()) - : undefined; - - if (editor && editor.editorType === 'texteditor') { + vscode.window.onDidChangeActiveTextEditor(editor => { + if (editor) { if (isMarkdownFile(editor.document)) { for (const preview of this.previews.filter(preview => !preview.locked)) { preview.update(editor.document.uri); @@ -44,6 +37,7 @@ export class MarkdownPreviewManager { } } }, null, this.disposables); + } public dispose(): void { @@ -134,8 +128,13 @@ export class MarkdownPreviewManager { } }); - preview.onDidChangeViewColumn(() => { + preview.onDidChangeViewState(({ active }) => { disposeAll(this.previews.filter(otherPreview => preview !== otherPreview && preview!.matches(otherPreview))); + + vscode.commands.executeCommand('setContext', MarkdownPreviewManager.markdownPreviewActiveContextKey, + active); + + this.activePreview = active ? preview : undefined; }); return preview; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 4d855f1463997dc79d6e3158c32b412556cd6210..cfa11aad835d8f565b2b5a0a5bb5c5f14e5c360f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -571,15 +571,15 @@ declare module 'vscode' { readonly localResourceRoots?: Uri[]; } + export interface WebViewOnDidChangeViewStateEvent { + readonly viewColumn: ViewColumn; + readonly active: boolean; + } + /** * A webview is an editor with html content, like an iframe. */ export interface Webview { - /** - * Type identifying the editor as a webview editor. - */ - readonly editorType: 'webview'; - /** * Unique identifer of the webview. */ @@ -618,9 +618,9 @@ declare module 'vscode' { readonly onDidDispose: Event; /** - * Fired when the webview's view column changes. + * Fired when the webview's view state changes. */ - readonly onDidChangeViewColumn: Event; + readonly onDidChangeViewState: Event; /** * Post a message to the webview content. @@ -649,13 +649,6 @@ declare module 'vscode' { dispose(): any; } - export interface TextEditor { - /** - * Type identifying the editor as a text editor. - */ - readonly editorType: 'texteditor'; - } - namespace window { /** * Create and show a new webview. @@ -666,11 +659,6 @@ declare module 'vscode' { * @param options Content settings for the webview. */ export function createWebview(uri: Uri, title: string, column: ViewColumn, options: WebviewOptions): Webview; - - /** - * Event fired when the active editor changes. - */ - export const onDidChangeActiveEditor: Event; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index bea7d79834ab76e2e4510760dd195464d887bdb0..5cb2acadb878795b3fe7d956c577e818737eb8d8 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -98,7 +98,7 @@ export function createApiFactory( const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService()); const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol)); const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol)); - const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol, extHostWebviews)); + const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol)); const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors)); const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService)); const extHostDocumentSaveParticipant = rpcProtocol.set(ExtHostContext.ExtHostDocumentSaveParticipant, new ExtHostDocumentSaveParticipant(extHostLogService, extHostDocuments, rpcProtocol.getProxy(MainContext.MainThreadTextEditors))); @@ -415,9 +415,6 @@ export function createApiFactory( }), createWebview: proposedApiFunction(extension, (uri: vscode.Uri, title: string, column: vscode.ViewColumn, options: vscode.WebviewOptions) => { return extHostWebviews.createWebview(uri, title, column, options, extension.extensionFolderPath); - }), - onDidChangeActiveEditor: proposedApiFunction(extension, (listener, thisArg?, disposables?) => { - return extHostDocumentsAndEditors.onDidChangeActiveEditor(listener, thisArg, disposables); }) }; diff --git a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts index 3086c94def577ab5929714772050d66fc2392403..e88d80607b56fb2560dd8af11fcd5509067771d9 100644 --- a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts +++ b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts @@ -12,7 +12,6 @@ import { ExtHostTextEditor } from './extHostTextEditor'; import * as assert from 'assert'; import * as typeConverters from './extHostTypeConverters'; import URI from 'vs/base/common/uri'; -import { ExtHostWebview, ExtHostWebviews } from './extHostWebview'; import { Disposable } from './extHostTypes'; export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsShape { @@ -20,7 +19,6 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha private _disposables: Disposable[] = []; private _activeEditorId: string; - private _activeWebview: ExtHostWebview; private readonly _editors = new Map(); private readonly _documents = new Map(); @@ -29,31 +27,15 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha private readonly _onDidRemoveDocuments = new Emitter(); private readonly _onDidChangeVisibleTextEditors = new Emitter(); private readonly _onDidChangeActiveTextEditor = new Emitter(); - private readonly _onDidChangeActiveEditor = new Emitter(); readonly onDidAddDocuments: Event = this._onDidAddDocuments.event; readonly onDidRemoveDocuments: Event = this._onDidRemoveDocuments.event; readonly onDidChangeVisibleTextEditors: Event = this._onDidChangeVisibleTextEditors.event; readonly onDidChangeActiveTextEditor: Event = this._onDidChangeActiveTextEditor.event; - readonly onDidChangeActiveEditor: Event = this._onDidChangeActiveEditor.event; constructor( private readonly _mainContext: IMainContext, - _extHostWebviews?: ExtHostWebviews - ) { - if (_extHostWebviews) { - _extHostWebviews.onDidChangeActiveWebview(webview => { - if (webview) { - if (webview !== this._activeWebview) { - this._onDidChangeActiveEditor.fire(webview); - this._activeWebview = webview; - } - } else { - this._activeWebview = webview; - } - }, this, this._disposables); - } - } + ) { } dispose() { this._disposables = dispose(this._disposables); @@ -143,9 +125,6 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha } if (delta.newActiveEditor !== undefined) { this._onDidChangeActiveTextEditor.fire(this.activeEditor()); - - const activeEditor = this.activeEditor(); - this._onDidChangeActiveEditor.fire(activeEditor || this._activeWebview); } } diff --git a/src/vs/workbench/api/node/extHostTextEditor.ts b/src/vs/workbench/api/node/extHostTextEditor.ts index 7ee3f7bcc9304bd0b069ced0c5a9b39fbcea3f5a..f41e633c11c464cf8ac774203698407317a54894 100644 --- a/src/vs/workbench/api/node/extHostTextEditor.ts +++ b/src/vs/workbench/api/node/extHostTextEditor.ts @@ -313,8 +313,6 @@ export class ExtHostTextEditorOptions implements vscode.TextEditorOptions { export class ExtHostTextEditor implements vscode.TextEditor { - public readonly editorType = 'texteditor'; - private readonly _proxy: MainThreadTextEditorsShape; private readonly _id: string; private readonly _documentData: ExtHostDocumentData; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 608a120f5f27b9dccf640de4ea9597935a29150f..c2c06f972a3f73487fa5d2f51a05a53151ea574b 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -11,13 +11,13 @@ import { Position } from 'vs/platform/editor/common/editor'; import { TPromise } from 'vs/base/common/winjs.base'; export class ExtHostWebview implements vscode.Webview { - public readonly editorType = 'webview'; private _title: string; private _html: string; private _options: vscode.WebviewOptions; private _isDisposed: boolean = false; private _viewColumn: vscode.ViewColumn; + private _active: boolean; public readonly onMessageEmitter = new Emitter(); public readonly onDidReceiveMessage: Event = this.onMessageEmitter.event; @@ -25,8 +25,8 @@ export class ExtHostWebview implements vscode.Webview { public readonly onDisposeEmitter = new Emitter(); public readonly onDidDispose: Event = this.onDisposeEmitter.event; - public readonly onDidChangeViewColumnEmitter = new Emitter(); - public readonly onDidChangeViewColumn: Event = this.onDidChangeViewColumnEmitter.event; + public readonly onDidChangeViewStateEmitter = new Emitter(); + public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; constructor( private readonly _handle: WebviewHandle, @@ -49,7 +49,7 @@ export class ExtHostWebview implements vscode.Webview { this.onDisposeEmitter.dispose(); this.onMessageEmitter.dispose(); - this.onDidChangeViewColumnEmitter.dispose(); + this.onDidChangeViewStateEmitter.dispose(); } get uri(): vscode.Uri { @@ -93,11 +93,21 @@ export class ExtHostWebview implements vscode.Webview { return this._viewColumn; } + get active(): boolean { + this.assertNotDisposed(); + return this._active; + } + set viewColumn(value: vscode.ViewColumn) { this.assertNotDisposed(); this._viewColumn = value; } + set active(value: boolean) { + this.assertNotDisposed(); + this._active = value; + } + public postMessage(message: any): Thenable { this.assertNotDisposed(); return this._proxy.$sendMessage(this._handle, message); @@ -116,12 +126,14 @@ export class ExtHostWebview implements vscode.Webview { } export class ExtHostWebviews implements ExtHostWebviewsShape { - private static handlePool = 0; + private static handlePool = 1; private readonly _proxy: MainThreadWebviewsShape; private readonly _webviews = new Map(); + private _activeWebview: ExtHostWebview | undefined; + constructor( mainContext: IMainContext ) { @@ -151,7 +163,22 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { } $onDidChangeActiveWeview(handle: WebviewHandle | undefined): void { - this._onDidChangeActiveWebview.fire(this.getWebview(handle)); + if (handle) { + const webview = this.getWebview(handle); + if (webview) { + if (webview !== this._activeWebview) { + this._activeWebview = webview; + webview.active = true; + webview.onDidChangeViewStateEmitter.fire({ viewColumn: webview.viewColumn, active: true }); + } + } + } else { + if (this._activeWebview) { + this._activeWebview.active = false; + this._activeWebview.onDidChangeViewStateEmitter.fire({ viewColumn: this._activeWebview.viewColumn, active: false }); + this._activeWebview = undefined; + } + } } $onDidDisposeWeview(handle: WebviewHandle): Thenable { @@ -159,6 +186,9 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { if (webview) { webview.onDisposeEmitter.fire(); this._webviews.delete(handle); + if (this._activeWebview === webview) { + this._activeWebview = undefined; + } } return TPromise.as(void 0); } @@ -169,7 +199,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { const newViewColumn = typeConverters.toViewColumn(newPosition); if (webview.viewColumn !== newViewColumn) { webview.viewColumn = newViewColumn; - webview.onDidChangeViewColumnEmitter.fire(newViewColumn); + webview.onDidChangeViewStateEmitter.fire({ viewColumn: newViewColumn, active: webview.active }); } } }