diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index c3397ffc99f..fe70d9e9e02 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1100,7 +1100,7 @@ declare module 'vscode' { /** * The column in which this editor shows. Will be `undefined` in case this - * isn't one of the three main editors, e.g an embedded editor. + * isn't one of the main editors, e.g an embedded editor. */ viewColumn?: ViewColumn; @@ -4019,15 +4019,15 @@ declare module 'vscode' { */ Active = -1, /** - * The left most editor column. + * The first editor column. */ One = 1, /** - * The center editor column. + * The second editor column. */ Two = 2, /** - * The right most editor column. + * The third editor column. */ Three = 3 } @@ -5200,7 +5200,7 @@ declare module 'vscode' { /** * Editor position of the panel. This property is only set if the webview is in - * one of the three editor view columns. + * one of the editor view columns. * * @deprecated */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index 0c64fbaab5f..001fb618818 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -12,7 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IModelAddedData, ITextEditorAddData, IDocumentsAndEditorsDelta, IExtHostContext, MainContext } from '../node/extHost.protocol'; import { MainThreadTextEditor } from './mainThreadEditor'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { INextEditorGroupsService } from 'vs/workbench/services/group/common/nextEditorGroupsService'; import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; import { IEditor } from 'vs/workbench/common/editor'; import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; @@ -22,8 +22,8 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IFileService } from 'vs/platform/files/common/files'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { isCodeEditor, isDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { INextEditorService } from 'vs/workbench/services/editor/common/nextEditorService'; +import { isDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import URI from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; @@ -161,7 +161,7 @@ class MainThreadDocumentAndEditorStateComputer { private readonly _onDidChangeState: (delta: DocumentAndEditorStateDelta) => void, @IModelService private readonly _modelService: IModelService, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, - @IWorkbenchEditorService private readonly _workbenchEditorService: IWorkbenchEditorService + @INextEditorService private readonly _editorService: INextEditorService ) { this._modelService.onModelAdded(this._updateStateOnModelAdd, this, this._toDispose); this._modelService.onModelRemoved(this._updateState, this, this._toDispose); @@ -252,25 +252,19 @@ class MainThreadDocumentAndEditorStateComputer { } // active editor: if none of the previous editors had focus we try - // to match the action workbench editor with one of editor we have + // to match the active workbench editor with one of editor we have // just computed if (!activeEditor) { - const workbenchEditor = this._workbenchEditorService.getActiveEditor(); - if (workbenchEditor) { - const workbenchEditorControl = workbenchEditor.getControl(); - let candidate: ICodeEditor; - if (isCodeEditor(workbenchEditorControl)) { - candidate = workbenchEditorControl; - } else if (isDiffEditor(workbenchEditorControl)) { - candidate = workbenchEditorControl.getModifiedEditor(); - } - if (candidate) { - editors.forEach(snapshot => { - if (candidate === snapshot.editor) { - activeEditor = snapshot.id; - } - }); - } + let candidate = this._editorService.activeTextEditorWidget; + if (isDiffEditor(candidate)) { + candidate = candidate.getModifiedEditor(); + } + if (candidate) { + editors.forEach(snapshot => { + if (candidate === snapshot.editor) { + activeEditor = snapshot.id; + } + }); } } @@ -306,14 +300,14 @@ export class MainThreadDocumentsAndEditors { extHostContext: IExtHostContext, @IModelService private readonly _modelService: IModelService, @ITextFileService private readonly _textFileService: ITextFileService, - @IWorkbenchEditorService private readonly _workbenchEditorService: IWorkbenchEditorService, + @INextEditorService private readonly _editorService: INextEditorService, @ICodeEditorService codeEditorService: ICodeEditorService, @IModeService modeService: IModeService, @IFileService fileService: IFileService, @ITextModelService textModelResolverService: ITextModelService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, - @IBulkEditService bulkEditService: IBulkEditService, + @INextEditorGroupsService private readonly _editorGroupService: INextEditorGroupsService, + @IBulkEditService bulkEditService: IBulkEditService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors); @@ -321,11 +315,11 @@ export class MainThreadDocumentsAndEditors { const mainThreadDocuments = new MainThreadDocuments(this, extHostContext, this._modelService, modeService, this._textFileService, fileService, textModelResolverService, untitledEditorService); extHostContext.set(MainContext.MainThreadDocuments, mainThreadDocuments); - const mainThreadTextEditors = new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._workbenchEditorService, editorGroupService); + const mainThreadTextEditors = new MainThreadTextEditors(this, extHostContext, codeEditorService, bulkEditService, this._editorService, this._editorGroupService); extHostContext.set(MainContext.MainThreadTextEditors, mainThreadTextEditors); // It is expected that the ctor of the state computer calls our `_onDelta`. - this._stateComputer = new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, _workbenchEditorService); + this._stateComputer = new MainThreadDocumentAndEditorStateComputer(delta => this._onDelta(delta), _modelService, codeEditorService, this._editorService); this._toDispose = [ mainThreadDocuments, @@ -423,19 +417,23 @@ export class MainThreadDocumentsAndEditors { options: props.options, selections: props.selections, visibleRanges: props.visibleRanges, - editorPosition: this._findEditorPosition(textEditor) // TODO@grid [EXTENSIONS] adopt in extension host + editorPosition: this._findEditorPosition(textEditor) }; } private _findEditorPosition(editor: MainThreadTextEditor): EditorPosition { - for (let workbenchEditor of this._workbenchEditorService.getVisibleEditors()) { + for (let workbenchEditor of this._editorService.visibleControls) { if (editor.matches(workbenchEditor)) { - return workbenchEditor.group.id; + return this.findEditorPosition(workbenchEditor); } } return undefined; } + findEditorPosition(workbenchEditor: IEditor): number { + return this._editorGroupService.groups.indexOf(workbenchEditor.group); + } + findTextEditorIdFor(editor: IEditor): string { for (let id in this._textEditors) { if (this._textEditors[id].matches(editor)) { diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts index e8ac17545c1..24c228c1ed0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -17,8 +17,9 @@ import { IDecorationOptions, IDecorationRenderOptions, ILineChange } from 'vs/ed import { ISingleEditOperation } from 'vs/editor/common/model'; import { ITextEditorOptions, Position as EditorPosition } from 'vs/platform/editor/common/editor'; import { IApplyEditsOptions, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType, WorkspaceEditDto, reviveWorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { INextEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/nextEditorService'; +import { INextEditorGroupsService } from 'vs/workbench/services/group/common/nextEditorGroupsService'; +import { GroupIdentifier } from 'vs/workbench/common/editor'; import { ExtHostContext, ExtHostEditorsShape, IExtHostContext, ITextDocumentShowOptions, ITextEditorPositionData, MainThreadTextEditorsShape } from '../node/extHost.protocol'; import { MainThreadDocumentsAndEditors } from './mainThreadDocumentsAndEditors'; import { MainThreadTextEditor } from './mainThreadEditor'; @@ -27,7 +28,6 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { private _proxy: ExtHostEditorsShape; private _documentsAndEditors: MainThreadDocumentsAndEditors; - private _workbenchEditorService: IWorkbenchEditorService; private _toDispose: IDisposable[]; private _textEditorsListenersMap: { [editorId: string]: IDisposable[]; }; private _editorPositionData: ITextEditorPositionData; @@ -38,12 +38,11 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { extHostContext: IExtHostContext, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, @IBulkEditService private readonly _bulkEditService: IBulkEditService, - @IWorkbenchEditorService workbenchEditorService: IWorkbenchEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, + @INextEditorService private readonly _editorService: INextEditorService, + @INextEditorGroupsService private readonly _editorGroupService: INextEditorGroupsService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostEditors); this._documentsAndEditors = documentsAndEditors; - this._workbenchEditorService = workbenchEditorService; this._toDispose = []; this._textEditorsListenersMap = Object.create(null); this._editorPositionData = null; @@ -51,8 +50,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { this._toDispose.push(documentsAndEditors.onTextEditorAdd(editors => editors.forEach(this._onTextEditorAdd, this))); this._toDispose.push(documentsAndEditors.onTextEditorRemove(editors => editors.forEach(this._onTextEditorRemove, this))); - this._toDispose.push(editorGroupService.onEditorsChanged(() => this._updateActiveAndVisibleTextEditors())); - this._toDispose.push(editorGroupService.onEditorGroupMoved(() => this._updateActiveAndVisibleTextEditors())); + this._toDispose.push(this._editorService.onDidVisibleEditorsChange(() => this._updateActiveAndVisibleTextEditors())); this._registeredDecorationTypes = Object.create(null); } @@ -96,10 +94,10 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { private _getTextEditorPositionData(): ITextEditorPositionData { let result: ITextEditorPositionData = Object.create(null); - for (let workbenchEditor of this._workbenchEditorService.getVisibleEditors()) { + for (let workbenchEditor of this._editorService.visibleControls) { const id = this._documentsAndEditors.findTextEditorIdFor(workbenchEditor); if (id) { - result[id] = workbenchEditor.group.id; // TODO@grid [EXTENSIONS] adopt in extension host + result[id] = this._documentsAndEditors.findEditorPosition(workbenchEditor); } } return result; @@ -121,7 +119,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { options: editorOptions }; - return this._workbenchEditorService.openEditor(input, options.position).then(editor => { + return this._editorService.openEditor(input, this._findEditorGroup(options.position)).then(editor => { if (!editor) { return undefined; } @@ -133,18 +131,38 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { let mainThreadEditor = this._documentsAndEditors.getEditor(id); if (mainThreadEditor) { let model = mainThreadEditor.getModel(); - return this._workbenchEditorService.openEditor({ + return this._editorService.openEditor({ resource: model.uri, options: { preserveFocus: false } - }, position).then(() => { return; }); + }, this._findEditorGroup(position)).then(() => { return; }); } return undefined; } + private _findEditorGroup(position?: EditorPosition): GroupIdentifier { + if (typeof position !== 'number') { + return ACTIVE_GROUP; // prefer active group when position is undefined + } + + const groups = this._editorGroupService.groups; + + let candidate = groups[position]; + if (candidate) { + return candidate.id; // found direct match + } + + let firstGroup = groups[0]; + if (groups.length === 1 && firstGroup.count === 0) { + return firstGroup.id; // first editor should always open in first group + } + + return SIDE_GROUP; // open to the side if group not found + } + $tryHideEditor(id: string): TPromise { let mainThreadEditor = this._documentsAndEditors.getEditor(id); if (mainThreadEditor) { - let editors = this._workbenchEditorService.getVisibleEditors(); + let editors = this._editorService.visibleControls; for (let editor of editors) { if (mainThreadEditor.matches(editor)) { return editor.group.closeEditor(editor.input).then(() => { return; }); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 42aab7d795c..b17ff44454c 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -12,11 +12,10 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol'; import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices'; import { Event } from 'vs/base/common/event'; import { ITextModel } from 'vs/editor/common/model'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -27,7 +26,6 @@ suite('MainThreadDocumentsAndEditors', () => { let modelService: ModelServiceImpl; let codeEditorService: TestCodeEditorService; let textFileService: ITextFileService; - let workbenchEditorService: IWorkbenchEditorService; let deltas: IDocumentsAndEditorsDelta[] = []; const hugeModelString = new Array(2 + (50 * 1024 * 1024)).join('-'); @@ -54,14 +52,8 @@ suite('MainThreadDocumentsAndEditors', () => { onModelDirty: Event.None, }; }; - workbenchEditorService = { - getVisibleEditors() { return []; }, - getActiveEditor() { return undefined; } - }; - const editorGroupService = new class extends mock() { - onEditorsChanged = Event.None; - onEditorGroupMoved = Event.None; - }; + const workbenchEditorService = new TestEditorService(); + const editorGroupService = new TestEditorGroupsService(); /* tslint:disable */ new MainThreadDocumentsAndEditors( diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index 2d71fde6f1c..2057af0b39a 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -12,10 +12,8 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ExtHostDocumentsAndEditorsShape, ExtHostContext, ExtHostDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { Event } from 'vs/base/common/event'; import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors'; import URI from 'vs/base/common/uri'; @@ -23,7 +21,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Position } from 'vs/editor/common/core/position'; import { IModelService } from 'vs/editor/common/services/modelService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { TestFileService, TestEditorService } from 'vs/workbench/test/workbenchTestServices'; +import { TestFileService, TestEditorService, TestEditorGroupsService } from 'vs/workbench/test/workbenchTestServices'; import { TPromise } from 'vs/base/common/winjs.base'; import { IFileStat } from 'vs/platform/files/common/files'; import { ResourceTextEdit } from 'vs/editor/common/modes'; @@ -72,14 +70,8 @@ suite('MainThreadEditors', () => { onModelDirty: Event.None, }; }; - const workbenchEditorService = { - getVisibleEditors() { return []; }, - getActiveEditor() { return undefined; } - }; - const editorGroupService = new class extends mock() { - onEditorsChanged = Event.None; - onEditorGroupMoved = Event.None; - }; + const workbenchEditorService = new TestEditorService(); + const editorGroupService = new TestEditorGroupsService(); const bulkEditService = new BulkEditService(modelService, new TestEditorService(), null, fileService);