diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index c9531f39c90..8df606bc0a9 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -149,7 +149,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService if (this.previewEditors !== newPreviewEditors && !newPreviewEditors) { this.stacks.groups.forEach(group => { if (group.previewEditor) { - this.pinEditor(this.stacks.positionOfGroup(group), group.previewEditor); + this.pinEditor(group, group.previewEditor); } }); } @@ -158,10 +158,9 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService } private onEditorDirty(identifier: EditorIdentifier): void { - const position = this.stacks.positionOfGroup(identifier.group); // we pin every editor that becomes dirty - this.pinEditor(position, identifier.editor); + this.pinEditor(identifier.group, identifier.editor); } private onEditorDisposed(identifier: EditorIdentifier): void { @@ -543,7 +542,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService // Focus next group if we have an active one left const currentActiveGroup = this.stacks.activeGroup; if (currentActiveGroup) { - this.focusGroup(this.stacks.positionOfGroup(currentActiveGroup)); + this.focusGroup(currentActiveGroup); // Explicitly trigger the focus changed handler because the side by side control will not trigger it unless // the user is actively changing focus with the mouse from left to right. @@ -704,44 +703,51 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService return this.visibleEditors ? this.visibleEditors.filter((editor) => !!editor) : []; } - public moveGroup(from: Position, to: Position): void { - const fromGroup = this.stacks.groupAt(from); - const toGroup = this.stacks.groupAt(to); + public moveGroup(from: EditorGroup, to: EditorGroup): void; + public moveGroup(from: Position, to: Position): void; + public moveGroup(arg1: any, arg2: any): void { + const fromGroup = (typeof arg1 === 'number') ? this.stacks.groupAt(arg1) : arg1; + const toGroup = (typeof arg2 === 'number') ? this.stacks.groupAt(arg2) : arg2; - if (!fromGroup || !toGroup || from === to) { + if (!fromGroup || !toGroup || fromGroup === toGroup) { return; // Ignore if we cannot move } + const fromPosition = this.stacks.positionOfGroup(fromGroup); + const toPosition = this.stacks.positionOfGroup(toGroup); + // Update stacks model - this.modifyGroups(() => this.stacks.moveGroup(fromGroup, to)); + this.modifyGroups(() => this.stacks.moveGroup(fromGroup, toPosition)); // Move widgets - this.sideBySideControl.move(from, to); + this.sideBySideControl.move(fromPosition, toPosition); // Move data structures - arrays.move(this.visibleEditors, from, to); - arrays.move(this.editorOpenToken, from, to); - arrays.move(this.mapEditorInstantiationPromiseToEditor, from, to); - arrays.move(this.instantiatedEditors, from, to); - arrays.move(this.mapEditorToEditorContainers, from, to); + arrays.move(this.visibleEditors, fromPosition, toPosition); + arrays.move(this.editorOpenToken, fromPosition, toPosition); + arrays.move(this.mapEditorInstantiationPromiseToEditor, fromPosition, toPosition); + arrays.move(this.instantiatedEditors, fromPosition, toPosition); + arrays.move(this.mapEditorToEditorContainers, fromPosition, toPosition); // Restore focus - this.focusGroup(this.stacks.positionOfGroup(fromGroup)); + this.focusGroup(fromGroup); // Events this._onEditorsMoved.fire(); } - public moveEditor(input: EditorInput, from: Position, to: Position, index?: number): void { - const fromGroup = this.stacks.groupAt(from); - const toGroup = this.stacks.groupAt(to); + public moveEditor(input: EditorInput, from: EditorGroup, to: EditorGroup, index?: number): void; + public moveEditor(input: EditorInput, from: Position, to: Position, index?: number): void; + public moveEditor(input: EditorInput, arg2: any, arg3: any, index?: number): void { + const fromGroup = (typeof arg2 === 'number') ? this.stacks.groupAt(arg2) : arg2; + const toGroup = (typeof arg3 === 'number') ? this.stacks.groupAt(arg3) : arg3; if (!fromGroup || !toGroup) { return; } // Move within group - if (from === to) { + if (fromGroup === toGroup) { this.doMoveEditorInsideGroups(input, fromGroup, index); } @@ -989,38 +995,44 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService }); } - public activateGroup(position: Position): void { - const group = this.stacks.groupAt(position); + public activateGroup(group: EditorGroup): void; + public activateGroup(position: Position): void; + public activateGroup(arg1: any): void { + const group = (typeof arg1 === 'number') ? this.stacks.groupAt(arg1) : arg1; if (group) { // Update stacks model this.stacks.setActive(group); // Update UI - const editor = this.visibleEditors[position]; + const editor = this.visibleEditors[this.stacks.positionOfGroup(group)]; if (editor) { this.sideBySideControl.setActive(editor); } } } - public focusGroup(position: Position): void { - const group = this.stacks.groupAt(position); + public focusGroup(group: EditorGroup): void; + public focusGroup(position: Position): void; + public focusGroup(arg1: any): void { + const group = (typeof arg1 === 'number') ? this.stacks.groupAt(arg1) : arg1; if (group) { // Make active - this.activateGroup(position); + this.activateGroup(group); // Focus Editor - const editor = this.visibleEditors[position]; + const editor = this.visibleEditors[this.stacks.positionOfGroup(group)]; if (editor) { editor.focus(); } } } - public pinEditor(position: Position, input: EditorInput): void { - const group = this.stacks.groupAt(position); + public pinEditor(group: EditorGroup, input: EditorInput): void; + public pinEditor(position: Position, input: EditorInput): void; + public pinEditor(arg1: any, input: EditorInput): void { + const group = (typeof arg1 === 'number') ? this.stacks.groupAt(arg1) : arg1; if (group) { if (group.isPinned(input)) { return; @@ -1031,12 +1043,14 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService } } - public unpinEditor(position: Position, input: EditorInput): void { + public unpinEditor(group: EditorGroup, input: EditorInput): void; + public unpinEditor(position: Position, input: EditorInput): void; + public unpinEditor(arg1: any, input: EditorInput): void { if (input.isDirty()) { return; // we do not allow to unpin dirty editors } - const group = this.stacks.groupAt(position); + const group = (typeof arg1 === 'number') ? this.stacks.groupAt(arg1) : arg1; if (group) { if (group.isPreview(input)) { return; diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index eb2cd4a2631..c3669c73b0e 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -85,9 +85,8 @@ export class NoTabsTitleControl extends TitleControl { } const group = this.context; - const position = this.stacks.positionOfGroup(group); - this.editorGroupService.pinEditor(position, group.activeEditor); + this.editorGroupService.pinEditor(group, group.activeEditor); } private onTitleClick(e: MouseEvent): void { @@ -105,7 +104,7 @@ export class NoTabsTitleControl extends TitleControl { // Focus editor group unless click on toolbar else if (this.stacks.groups.length === 1 && !DOM.isAncestor(e.target || e.srcElement, this.editorActionsToolbar.getContainer().getHTMLElement())) { - this.editorGroupService.focusGroup(position); + this.editorGroupService.focusGroup(group); } } diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index aecd0a70dfd..413a5c504a7 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -156,11 +156,9 @@ export class TabsTitleControl extends TitleControl { if (draggedEditor) { DOM.EventHelper.stop(e, true); - const sourcePosition = this.stacks.positionOfGroup(draggedEditor.group); - // Move editor to target position and index if (this.isMoveOperation(e, draggedEditor.group, group)) { - this.editorGroupService.moveEditor(draggedEditor.editor, sourcePosition, targetPosition, targetIndex); + this.editorGroupService.moveEditor(draggedEditor.editor, draggedEditor.group, group, targetIndex); } // Copy: just open editor at target index @@ -452,7 +450,7 @@ export class TabsTitleControl extends TitleControl { this.tabDisposeables.push(DOM.addDisposableListener(tab, DOM.EventType.DBLCLICK, (e: MouseEvent) => { DOM.EventHelper.stop(e); - this.editorGroupService.pinEditor(position, editor); + this.editorGroupService.pinEditor(group, editor); })); // Context menu @@ -499,11 +497,9 @@ export class TabsTitleControl extends TitleControl { if (draggedEditor) { DOM.EventHelper.stop(e, true); - const sourcePosition = this.stacks.positionOfGroup(draggedEditor.group); - // Move editor to target position and index if (this.isMoveOperation(e, draggedEditor.group, group)) { - this.editorGroupService.moveEditor(draggedEditor.editor, sourcePosition, targetPosition, targetIndex); + this.editorGroupService.moveEditor(draggedEditor.editor, draggedEditor.group, group, targetIndex); } // Copy: just open editor at target index diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts index a72aab76589..a231560a921 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts @@ -341,11 +341,11 @@ export class Controller extends treedefaults.DefaultController { this.telemetryService.publicLog('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'openEditors' }); const position = this.model.positionOfGroup(element.editorGroup); if (pinEditor) { - this.editorGroupService.pinEditor(position, element.editorInput); + this.editorGroupService.pinEditor(element.editorGroup, element.editorInput); } - this.editorGroupService.activateGroup(position); + this.editorGroupService.activateGroup(element.editorGroup); this.editorService.openEditor(element.editorInput, { preserveFocus: !pinEditor }, position) - .done(() => this.editorGroupService.activateGroup(position), errors.onUnexpectedError); + .done(() => this.editorGroupService.activateGroup(element.editorGroup), errors.onUnexpectedError); } } } diff --git a/src/vs/workbench/services/group/common/groupService.ts b/src/vs/workbench/services/group/common/groupService.ts index 63356990373..e44099e61ea 100644 --- a/src/vs/workbench/services/group/common/groupService.ts +++ b/src/vs/workbench/services/group/common/groupService.ts @@ -7,7 +7,7 @@ import {createDecorator, ServiceIdentifier} from 'vs/platform/instantiation/common/instantiation'; import {Position, IEditorInput} from 'vs/platform/editor/common/editor'; -import {IEditorStacksModel} from 'vs/workbench/common/editor'; +import {IEditorStacksModel, IEditorGroup} from 'vs/workbench/common/editor'; import Event from 'vs/base/common/event'; import {EditorInputEvent} from 'vs/workbench/common/editor'; @@ -48,16 +48,19 @@ export interface IEditorGroupService { /** * Keyboard focus the editor group at the provided position. */ + focusGroup(group: IEditorGroup): void; focusGroup(position: Position): void; /** * Activate the editor group at the provided position without moving focus. */ + activateGroup(group: IEditorGroup): void; activateGroup(position: Position): void; /** * Allows to move the editor group from one position to another. */ + moveGroup(from: IEditorGroup, to: IEditorGroup): void; moveGroup(from: Position, to: Position): void; /** @@ -68,16 +71,19 @@ export interface IEditorGroupService { /** * Adds the pinned state to an editor, removing it from being a preview editor. */ + pinEditor(group: IEditorGroup, input: IEditorInput): void; pinEditor(position: Position, input: IEditorInput): void; /** * Removes the pinned state of an editor making it a preview editor. */ + unpinEditor(group: IEditorGroup, input: IEditorInput): void; unpinEditor(position: Position, input: IEditorInput): void; /** * Moves an editor from one group to another. The index in the group is optional. */ + moveEditor(input: IEditorInput, from: IEditorGroup, to: IEditorGroup, index?: number): void; moveEditor(input: IEditorInput, from: Position, to: Position, index?: number): void; /** diff --git a/src/vs/workbench/test/common/servicesTestUtils.ts b/src/vs/workbench/test/common/servicesTestUtils.ts index e16f69bc933..62940428759 100644 --- a/src/vs/workbench/test/common/servicesTestUtils.ts +++ b/src/vs/workbench/test/common/servicesTestUtils.ts @@ -11,7 +11,7 @@ import Paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import {NullTelemetryService, ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import Storage = require('vs/workbench/common/storage'); -import {EditorInputEvent} from 'vs/workbench/common/editor'; +import {EditorInputEvent, IEditorGroup} from 'vs/workbench/common/editor'; import Event, {Emitter} from 'vs/base/common/event'; import Types = require('vs/base/common/types'); import Severity from 'vs/base/common/severity'; @@ -385,15 +385,21 @@ export class TestEditorGroupService implements IEditorGroupService { return this._onEditorsMoved.event; } - public focusGroup(position: Position): void { + public focusGroup(group: IEditorGroup): void; + public focusGroup(position: Position): void; + public focusGroup(arg1: any): void { } - public activateGroup(position: Position): void { + public activateGroup(group: IEditorGroup): void; + public activateGroup(position: Position): void; + public activateGroup(arg1: any): void { } - public moveGroup(from: Position, to: Position): void { + public moveGroup(from: IEditorGroup, to: IEditorGroup): void; + public moveGroup(from: Position, to: Position): void; + public moveGroup(arg1: any, arg2: any): void { } @@ -401,13 +407,19 @@ export class TestEditorGroupService implements IEditorGroupService { } - public pinEditor(position: Position, input: IEditorInput): void { + public pinEditor(group: IEditorGroup, input: IEditorInput): void; + public pinEditor(position: Position, input: IEditorInput): void; + public pinEditor(arg1: any, input: IEditorInput): void { } - public unpinEditor(position: Position, input: IEditorInput): void { + public unpinEditor(group: IEditorGroup, input: IEditorInput): void; + public unpinEditor(position: Position, input: IEditorInput): void; + public unpinEditor(arg1: any, input: IEditorInput): void { } - public moveEditor(input: IEditorInput, from: Position, to: Position, index?: number): void { + public moveEditor(input: IEditorInput, from: IEditorGroup, to: IEditorGroup, index?: number): void; + public moveEditor(input: IEditorInput, from: Position, to: Position, index?: number): void; + public moveEditor(input: IEditorInput, from: any, to: any, index?: number): void { } public getStacksModel(): EditorStacksModel {