From 156f3c598775d629e4d894510014403be5b01449 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 May 2016 16:55:36 +0200 Subject: [PATCH] add api to move an editor --- .../common/editor/editorStacksModel.ts | 44 +++++++++++------ .../common/editor/editorStacksModel.test.ts | 49 ++++++++++++++++++- 2 files changed, 77 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/common/editor/editorStacksModel.ts b/src/vs/workbench/common/editor/editorStacksModel.ts index 6b2cbb173f6..6ae674d94cf 100644 --- a/src/vs/workbench/common/editor/editorStacksModel.ts +++ b/src/vs/workbench/common/editor/editorStacksModel.ts @@ -14,8 +14,6 @@ import {dispose, IDisposable} from 'vs/base/common/lifecycle'; import {IEditorRegistry, Extensions} from 'vs/workbench/browser/parts/editor/baseEditor'; import {Registry} from 'vs/platform/platform'; -/// --- API-Start ---- - export interface IEditorGroup { label: string; @@ -26,11 +24,13 @@ export interface IEditorGroup { onEditorActivated: Event; onEditorOpened: Event; onEditorClosed: Event; + onEditorMoved: Event; onEditorPinned: Event; onEditorUnpinned: Event; getEditors(mru?: boolean): EditorInput[]; openEditor(editor: EditorInput, options?: IEditorOpenOptions): void; + moveEditor(editor: EditorInput, toIndex: number): void; closeEditor(editor: EditorInput): void; closeEditors(except: EditorInput, direction?: Direction): void; closeAllEditors(): void; @@ -68,10 +68,6 @@ export interface IEditorOpenOptions { active?: boolean; } -/// --- API-End ---- - -// Move Editor - export enum Direction { LEFT, RIGHT @@ -103,9 +99,12 @@ export class EditorGroup implements IEditorGroup { private preview: EditorInput; // editor in preview state private active: EditorInput; // editor in active state + private toDispose: IDisposable[]; + private _onEditorActivated: Emitter; private _onEditorOpened: Emitter; private _onEditorClosed: Emitter; + private _onEditorMoved: Emitter; private _onEditorPinned: Emitter; private _onEditorUnpinned: Emitter; @@ -115,6 +114,7 @@ export class EditorGroup implements IEditorGroup { ) { this.editors = []; this.mru = []; + this.toDispose = []; if (typeof arg1 === 'object') { this.deserialize(arg1); @@ -125,8 +125,11 @@ export class EditorGroup implements IEditorGroup { this._onEditorActivated = new Emitter(); this._onEditorOpened = new Emitter(); this._onEditorClosed = new Emitter(); + this._onEditorMoved = new Emitter(); this._onEditorPinned = new Emitter(); this._onEditorUnpinned = new Emitter(); + + this.toDispose.push(this._onEditorActivated, this._onEditorOpened, this._onEditorClosed, this._onEditorMoved, this._onEditorPinned, this._onEditorUnpinned); } public get label(): string { @@ -149,6 +152,10 @@ export class EditorGroup implements IEditorGroup { return this._onEditorClosed.event; } + public get onEditorMoved(): Event { + return this._onEditorMoved.event; + } + public get onEditorPinned(): Event { return this._onEditorPinned.event; } @@ -307,6 +314,20 @@ export class EditorGroup implements IEditorGroup { this.closeEditor(this.active); } + public moveEditor(editor: EditorInput, toIndex: number): void { + const index = this.indexOf(editor); + if (index < 0) { + return; + } + + // Move + this.editors.splice(index, 1); + this.editors.splice(toIndex, 0, editor); + + // Event + this._onEditorMoved.fire(editor); + } + public setActive(editor: EditorInput): void { const index = this.indexOf(editor); if (index === -1) { @@ -472,11 +493,7 @@ export class EditorGroup implements IEditorGroup { } public dispose(): void { - this._onEditorActivated.dispose(); - this._onEditorClosed.dispose(); - this._onEditorOpened.dispose(); - this._onEditorPinned.dispose(); - this._onEditorUnpinned.dispose(); + dispose(this.toDispose); } } @@ -513,10 +530,7 @@ export class EditorStacksModel implements IEditorStacksModel { this._onGroupActivated = new Emitter(); this._onGroupMoved = new Emitter(); - this.toDispose.push(this._onGroupOpened); - this.toDispose.push(this._onGroupClosed); - this.toDispose.push(this._onGroupActivated); - this.toDispose.push(this._onGroupMoved); + this.toDispose.push(this._onGroupOpened, this._onGroupClosed, this._onGroupActivated, this._onGroupMoved); this.load(); this.registerListeners(); diff --git a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts index 237c9b757e2..04cc9f75564 100644 --- a/src/vs/workbench/test/common/editor/editorStacksModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorStacksModel.test.ts @@ -40,6 +40,7 @@ interface GroupEvents { closed: EditorInput[]; pinned: EditorInput[]; unpinned: EditorInput[]; + moved: EditorInput[]; } function modelListener(model: IEditorStacksModel): ModelEvents { @@ -64,7 +65,8 @@ function groupListener(group: IEditorGroup): GroupEvents { closed: [], activated: [], pinned: [], - unpinned: [] + unpinned: [], + moved: [] }; group.onEditorOpened(e => groupEvents.opened.push(e)); @@ -72,6 +74,7 @@ function groupListener(group: IEditorGroup): GroupEvents { group.onEditorActivated(e => groupEvents.activated.push(e)); group.onEditorPinned(e => groupEvents.pinned.push(e)); group.onEditorUnpinned(e => groupEvents.unpinned.push(e)); + group.onEditorMoved(e => groupEvents.moved.push(e)); return groupEvents; } @@ -595,6 +598,50 @@ suite('Editor Stacks Model', () => { assert.equal(group.count, 0); }); + test('Stack - Multiple Editors - move editor', function () { + const model = create(); + const group = model.openGroup('group'); + const events = groupListener(group); + + const input1 = input(); + const input2 = input(); + const input3 = input(); + const input4 = input(); + const input5 = input(); + + group.openEditor(input1, { pinned: true, active: true }); + group.openEditor(input2, { pinned: true, active: true }); + + group.moveEditor(input1, 1); + + assert.equal(events.moved[0], input1); + assert.equal(group.getEditors()[0], input2); + assert.equal(group.getEditors()[1], input1); + + group.setActive(input1); + group.openEditor(input3, { pinned: true, active: true }); + group.openEditor(input4, { pinned: true, active: true }); + group.openEditor(input5, { pinned: true, active: true }); + + group.moveEditor(input4, 0); + + assert.equal(events.moved[1], input4); + assert.equal(group.getEditors()[0], input4); + assert.equal(group.getEditors()[1], input2); + assert.equal(group.getEditors()[2], input1); + assert.equal(group.getEditors()[3], input3); + assert.equal(group.getEditors()[4], input5); + + group.moveEditor(input4, 3); + group.moveEditor(input2, 1); + + assert.equal(group.getEditors()[0], input1); + assert.equal(group.getEditors()[1], input2); + assert.equal(group.getEditors()[2], input3); + assert.equal(group.getEditors()[3], input4); + assert.equal(group.getEditors()[4], input5); + }); + test('Stack - Multiple Editors - Pinned & Non Active', function () { const model = create(); const group = model.openGroup('group'); -- GitLab