diff --git a/extensions/vscode-api-tests/src/window.test.ts b/extensions/vscode-api-tests/src/window.test.ts index b54aa7a085c..c9e8df260ab 100644 --- a/extensions/vscode-api-tests/src/window.test.ts +++ b/extensions/vscode-api-tests/src/window.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import {workspace, window, ViewColumn} from 'vscode'; +import {workspace, window, ViewColumn, TextEditor} from 'vscode'; import {join} from 'path'; import {cleanUp, pathEquals} from './utils'; @@ -39,4 +39,23 @@ suite("window namespace tests", () => { return Promise.all([p1, p2, p3]); }); }); + + test('editor, onDidChangeTextEditorViewColumn', () => { + + let actualTextEditor: TextEditor; + let actualViewColumn: ViewColumn; + + let registration = window.onDidChangeTextEditorViewColumn(event => { + actualTextEditor = event.textEditor; + actualViewColumn = event.viewColumn; + }); + + return workspace.openTextDocument(join(workspace.rootPath, './far.js')).then(doc => { + return window.showTextDocument(doc, ViewColumn.One).then(editor => { + assert.ok(actualTextEditor === editor); + assert.ok(actualViewColumn === editor.viewColumn); + registration.dispose(); + }); + }); + }); }); \ No newline at end of file diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 39c572b26fe..d7548243b34 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -509,6 +509,20 @@ declare namespace vscode { options: TextEditorOptions; } + /** + * Represents an event describing the change of a [text editor's view column](#TextEditor.viewColumn). + */ + export interface TextEditorViewColumnChangeEvent { + /** + * The [text editor](#TextEditor) for which the options have changed. + */ + textEditor: TextEditor; + /** + * The new value for the [text editor's view column](#TextEditor.viewColumn). + */ + viewColumn: ViewColumn; + } + /** * Represents a [text editor](#TextEditor)'s [options](#TextEditor.options). */ @@ -2771,6 +2785,11 @@ declare namespace vscode { */ export const onDidChangeTextEditorOptions: Event; + /** + * An [event](#Event) which fires when the view column of an editor das changed. + */ + export const onDidChangeTextEditorViewColumn: Event + /** * Show the given document in a text editor. A [column](#ViewColumn) can be provided * to control where the editor is being shown. Might change the [active editor](#window.activeTextEditor). diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 2b10f6a4add..b4be91bac63 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -191,6 +191,9 @@ export class ExtHostAPIImplementation { onDidChangeTextEditorOptions: (listener: (e: vscode.TextEditorOptionsChangeEvent) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => { return pluginHostEditors.onDidChangeTextEditorOptions(listener, thisArgs, disposables); }, + onDidChangeTextEditorViewColumn(listener, thisArg?, disposables?) { + return pluginHostEditors.onDidChangeTextEditorViewColumn(listener, thisArg, disposables); + }, showInformationMessage: (message, ...items) => { return pluginHostMessageService.showMessage(Severity.Info, message, items); }, diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index a8a21d7355d..56b623de3c4 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -18,7 +18,7 @@ import {Position as EditorPosition} from 'vs/platform/editor/common/editor'; import {IModelService} from 'vs/editor/common/services/modelService'; import {MainThreadEditorsTracker, TextEditorRevealType, MainThreadTextEditor, ITextEditorConfiguration} from 'vs/workbench/api/node/mainThreadEditors'; import * as TypeConverters from './extHostTypeConverters'; -import {TextDocument, TextEditorSelectionChangeEvent, TextEditorOptionsChangeEvent, TextEditorOptions, ViewColumn} from 'vscode'; +import {TextDocument, TextEditorSelectionChangeEvent, TextEditorOptionsChangeEvent, TextEditorOptions, TextEditorViewColumnChangeEvent, ViewColumn} from 'vscode'; import {EventType} from 'vs/workbench/common/events'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IEventService} from 'vs/platform/event/common/event'; @@ -46,6 +46,9 @@ export class ExtHostEditors { public onDidChangeTextEditorOptions: Event; private _onDidChangeTextEditorOptions: Emitter; + public onDidChangeTextEditorViewColumn: Event; + private _onDidChangeTextEditorViewColumn: Emitter; + private _editors: { [id: string]: ExtHostTextEditor }; private _proxy: MainThreadEditors; private _onDidChangeActiveTextEditor: Emitter; @@ -62,6 +65,9 @@ export class ExtHostEditors { this._onDidChangeTextEditorOptions = new Emitter(); this.onDidChangeTextEditorOptions = this._onDidChangeTextEditorOptions.event; + this._onDidChangeTextEditorViewColumn = new Emitter(); + this.onDidChangeTextEditorViewColumn = this._onDidChangeTextEditorViewColumn.event; + this._modelService = threadService.getRemotable(ExtHostModelService); this._proxy = threadService.getRemotable(MainThreadEditors); this._onDidChangeActiveTextEditor = new Emitter(); @@ -137,10 +143,11 @@ export class ExtHostEditors { _acceptEditorPositionData(data: ITextEditorPositionData): void { for (let id in data) { - let editor = this._editors[id]; - let value = TypeConverters.toViewColumn(data[id]); - if (editor.viewColumn !== value) { - editor._acceptViewColumn(value); + let textEditor = this._editors[id]; + let viewColumn = TypeConverters.toViewColumn(data[id]); + if (textEditor.viewColumn !== viewColumn) { + textEditor._acceptViewColumn(viewColumn); + this._onDidChangeTextEditorViewColumn.fire({ textEditor, viewColumn }); } } }