Skip to content

Commit dced70b

Browse files
authored
Create editor groups from ViewColumn as needed (refs #123270) (#157640)
* make `createTextEditor` async and create editor groups (refs #123270) * API docs update
1 parent 0eac052 commit dced70b

File tree

15 files changed

+79
-61
lines changed

15 files changed

+79
-61
lines changed

src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { IPathService } from 'vs/workbench/services/path/common/pathService';
3131
import { diffSets, diffMaps } from 'vs/base/common/collections';
3232
import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite';
3333
import { ViewContainerLocation } from 'vs/workbench/common/views';
34-
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
34+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3535

3636

3737
class TextEditorSnapshot {
@@ -296,14 +296,14 @@ export class MainThreadDocumentsAndEditors {
296296
@IUriIdentityService uriIdentityService: IUriIdentityService,
297297
@IClipboardService private readonly _clipboardService: IClipboardService,
298298
@IPathService pathService: IPathService,
299-
@IInstantiationService instantiationService: IInstantiationService
299+
@IConfigurationService configurationService: IConfigurationService
300300
) {
301301
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors);
302302

303303
this._mainThreadDocuments = this._toDispose.add(new MainThreadDocuments(extHostContext, this._modelService, this._textFileService, fileService, textModelResolverService, environmentService, uriIdentityService, workingCopyFileService, pathService));
304304
extHostContext.set(MainContext.MainThreadDocuments, this._mainThreadDocuments);
305305

306-
this._mainThreadEditors = this._toDispose.add(new MainThreadTextEditors(this, extHostContext, codeEditorService, this._editorService, this._editorGroupService));
306+
this._mainThreadEditors = this._toDispose.add(new MainThreadTextEditors(this, extHostContext, codeEditorService, this._editorService, this._editorGroupService, configurationService));
307307
extHostContext.set(MainContext.MainThreadTextEditors, this._mainThreadEditors);
308308

309309
// It is expected that the ctor of the state computer calls our `_onDelta`.

src/vs/workbench/api/browser/mainThreadEditorTabs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
548548
}
549549
//#region Messages received from Ext Host
550550
$moveTab(tabId: string, index: number, viewColumn: EditorGroupColumn, preserveFocus?: boolean): void {
551-
const groupId = columnToEditorGroup(this._editorGroupsService, viewColumn);
551+
const groupId = columnToEditorGroup(this._editorGroupsService, this._configurationService, viewColumn);
552552
const tabInfo = this._tabInfoLookup.get(tabId);
553553
const tab = tabInfo?.tab;
554554
if (!tab) {

src/vs/workbench/api/browser/mainThreadEditors.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { ISelection } from 'vs/editor/common/core/selection';
1313
import { IDecorationOptions, IDecorationRenderOptions } from 'vs/editor/common/editorCommon';
1414
import { ISingleEditOperation } from 'vs/editor/common/core/editOperation';
1515
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
16-
import { ITextEditorOptions, IResourceEditorInput, EditorActivation, EditorResolution } from 'vs/platform/editor/common/editor';
16+
import { ITextEditorOptions, IResourceEditorInput, EditorActivation } from 'vs/platform/editor/common/editor';
1717
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
1818
import { MainThreadTextEditor } from 'vs/workbench/api/browser/mainThreadEditor';
1919
import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, ITextDocumentShowOptions, ITextEditorConfigurationUpdate, ITextEditorPositionData, IUndoStopOptions, MainThreadTextEditorsShape, TextEditorRevealType } from 'vs/workbench/api/common/extHost.protocol';
@@ -25,8 +25,9 @@ import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/wo
2525
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
2626
import { ILineChange } from 'vs/editor/common/diff/smartLinesDiffComputer';
2727
import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
28-
import { IEditorControl } from 'vs/workbench/common/editor';
28+
import { DEFAULT_EDITOR_ASSOCIATION, IEditorControl } from 'vs/workbench/common/editor';
2929
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
30+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3031

3132
export interface IMainThreadEditorLocator {
3233
getEditor(id: string): MainThreadTextEditor | undefined;
@@ -51,6 +52,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape {
5152
@ICodeEditorService private readonly _codeEditorService: ICodeEditorService,
5253
@IEditorService private readonly _editorService: IEditorService,
5354
@IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService,
55+
@IConfigurationService private readonly _configurationService: IConfigurationService
5456
) {
5557
this._instanceId = String(++MainThreadTextEditors.INSTANCE_COUNT);
5658
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostEditors);
@@ -125,15 +127,15 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape {
125127
// preserve pre 1.38 behaviour to not make group active when preserveFocus: true
126128
// but make sure to restore the editor to fix https://github.com/microsoft/vscode/issues/79633
127129
activation: options.preserveFocus ? EditorActivation.RESTORE : undefined,
128-
override: EditorResolution.DISABLED
130+
override: DEFAULT_EDITOR_ASSOCIATION.id
129131
};
130132

131133
const input: IResourceEditorInput = {
132134
resource: uri,
133135
options: editorOptions
134136
};
135137

136-
const editor = await this._editorService.openEditor(input, columnToEditorGroup(this._editorGroupService, options.position));
138+
const editor = await this._editorService.openEditor(input, columnToEditorGroup(this._editorGroupService, this._configurationService, options.position));
137139
if (!editor) {
138140
return undefined;
139141
}
@@ -147,7 +149,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape {
147149
await this._editorService.openEditor({
148150
resource: model.uri,
149151
options: { preserveFocus: false }
150-
}, columnToEditorGroup(this._editorGroupService, position));
152+
}, columnToEditorGroup(this._editorGroupService, this._configurationService, position));
151153
return;
152154
}
153155
}

src/vs/workbench/api/browser/mainThreadNotebookEditors.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { columnToEditorGroup, editorGroupToColumn } from 'vs/workbench/services/
1717
import { equals } from 'vs/base/common/objects';
1818
import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto';
1919
import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
20+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2021

2122
class MainThreadNotebook {
2223

@@ -44,7 +45,8 @@ export class MainThreadNotebookEditors implements MainThreadNotebookEditorsShape
4445
@IEditorService private readonly _editorService: IEditorService,
4546
@ILogService private readonly _logService: ILogService,
4647
@INotebookEditorService private readonly _notebookEditorService: INotebookEditorService,
47-
@IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService
48+
@IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService,
49+
@IConfigurationService private readonly _configurationService: IConfigurationService
4850
) {
4951
this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostNotebookEditors);
5052

@@ -126,7 +128,7 @@ export class MainThreadNotebookEditors implements MainThreadNotebookEditorsShape
126128
override: viewType
127129
};
128130

129-
const editorPane = await this._editorService.openEditor({ resource: URI.revive(resource), options: editorOptions }, columnToEditorGroup(this._editorGroupService, options.position));
131+
const editorPane = await this._editorService.openEditor({ resource: URI.revive(resource), options: editorOptions }, columnToEditorGroup(this._editorGroupService, this._configurationService, options.position));
130132
const notebookEditor = getNotebookEditorFromEditorPane(editorPane);
131133

132134
if (notebookEditor) {

src/vs/workbench/api/test/browser/mainThreadDocumentsAndEditors.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import { LanguageService } from 'vs/editor/common/services/languageService';
3434
import { DisposableStore } from 'vs/base/common/lifecycle';
3535
import { LanguageFeatureDebounceService } from 'vs/editor/common/services/languageFeatureDebounce';
3636
import { LanguageFeaturesService } from 'vs/editor/common/services/languageFeaturesService';
37-
import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock';
3837

3938
suite('MainThreadDocumentsAndEditors', () => {
4039

@@ -121,7 +120,7 @@ suite('MainThreadDocumentsAndEditors', () => {
121120
}
122121
},
123122
new TestPathService(),
124-
new TestInstantiationService(),
123+
new TestConfigurationService(),
125124
);
126125
});
127126

src/vs/workbench/browser/parts/editor/editorCommands.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { localize } from 'vs/nls';
77
import { isObject, isString, isUndefined, isNumber, withNullAsUndefined } from 'vs/base/common/types';
88
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
99
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
10-
import { IEditorIdentifier, IEditorCommandsContext, CloseDirection, IVisibleEditorPane, EditorsOrder, EditorInputCapabilities, isEditorIdentifier, GroupIdentifier, isEditorInputWithOptionsAndGroup, IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor';
10+
import { IEditorIdentifier, IEditorCommandsContext, CloseDirection, IVisibleEditorPane, EditorsOrder, EditorInputCapabilities, isEditorIdentifier, isEditorInputWithOptionsAndGroup, IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor';
1111
import { TextCompareEditorVisibleContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, ActiveEditorStickyContext, ActiveEditorGroupLockedContext, ActiveEditorCanSplitInGroupContext, TextCompareEditorActiveContext, SideBySideEditorActiveContext } from 'vs/workbench/common/contextkeys';
1212
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
1313
import { EditorGroupColumn, columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn';
14-
import { ACTIVE_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService';
14+
import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
1515
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
1616
import { TextDiffEditor } from 'vs/workbench/browser/parts/editor/textDiffEditor';
1717
import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes';
@@ -499,6 +499,7 @@ function registerOpenEditorAPICommands(): void {
499499
const editorGroupService = accessor.get(IEditorGroupsService);
500500
const openerService = accessor.get(IOpenerService);
501501
const pathService = accessor.get(IPathService);
502+
const configurationService = accessor.get(IConfigurationService);
502503

503504
const resourceOrString = typeof resourceArg === 'string' ? resourceArg : URI.revive(resourceArg);
504505
const [columnArg, optionsArg] = columnAndOptions ?? [];
@@ -523,7 +524,7 @@ function registerOpenEditorAPICommands(): void {
523524
input = { resource, options, label };
524525
}
525526

526-
await editorService.openEditor(input, columnToEditorGroup(editorGroupService, column));
527+
await editorService.openEditor(input, columnToEditorGroup(editorGroupService, configurationService, column));
527528
}
528529

529530
// do not allow to execute commands from here
@@ -557,6 +558,7 @@ function registerOpenEditorAPICommands(): void {
557558
CommandsRegistry.registerCommand(API_OPEN_DIFF_EDITOR_COMMAND_ID, async function (accessor: ServicesAccessor, originalResource: UriComponents, modifiedResource: UriComponents, labelAndOrDescription?: string | { label: string; description: string }, columnAndOptions?: [EditorGroupColumn?, ITextEditorOptions?], context?: IOpenEvent<unknown>) {
558559
const editorService = accessor.get(IEditorService);
559560
const editorGroupService = accessor.get(IEditorGroupsService);
561+
const configurationService = accessor.get(IConfigurationService);
560562

561563
const [columnArg, optionsArg] = columnAndOptions ?? [];
562564
const [options, column] = mixinContext(context, optionsArg, columnArg);
@@ -576,7 +578,7 @@ function registerOpenEditorAPICommands(): void {
576578
label,
577579
description,
578580
options
579-
}, columnToEditorGroup(editorGroupService, column));
581+
}, columnToEditorGroup(editorGroupService, configurationService, column));
580582
});
581583

582584
CommandsRegistry.registerCommand(API_OPEN_WITH_EDITOR_COMMAND_ID, (accessor: ServicesAccessor, resource: UriComponents, id: string, columnAndOptions?: [EditorGroupColumn?, ITextEditorOptions?]) => {
@@ -585,21 +587,8 @@ function registerOpenEditorAPICommands(): void {
585587
const configurationService = accessor.get(IConfigurationService);
586588

587589
const [columnArg, optionsArg] = columnAndOptions ?? [];
588-
let group: IEditorGroup | GroupIdentifier | ACTIVE_GROUP_TYPE | SIDE_GROUP_TYPE | undefined = undefined;
589-
590-
if (columnArg === SIDE_GROUP) {
591-
const direction = preferredSideBySideGroupDirection(configurationService);
592-
593-
let neighbourGroup = editorGroupsService.findGroup({ direction });
594-
if (!neighbourGroup) {
595-
neighbourGroup = editorGroupsService.addGroup(editorGroupsService.activeGroup, direction);
596-
}
597-
group = neighbourGroup;
598-
} else {
599-
group = columnToEditorGroup(editorGroupsService, columnArg);
600-
}
601590

602-
return editorService.openEditor({ resource: URI.revive(resource), options: { ...optionsArg, pinned: true, override: id } }, group);
591+
return editorService.openEditor({ resource: URI.revive(resource), options: { ...optionsArg, pinned: true, override: id } }, columnToEditorGroup(editorGroupsService, configurationService, columnArg));
603592
});
604593
}
605594

src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ suite('Files - FileEditorInput', () => {
3737
override createTextEditor(input: IResourceEditorInput) {
3838
return createFileInput(input.resource);
3939
}
40+
41+
override async resolveTextEditor(input: IResourceEditorInput) {
42+
return createFileInput(input.resource);
43+
}
4044
}
4145

4246
setup(() => {

src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ suite('Files - TextFileEditorTracker', () => {
157157
test('dirty untitled text file model opens as editor', async function () {
158158
const accessor = await createTracker();
159159

160-
const untitledTextEditor = accessor.textEditorService.createTextEditor({ resource: undefined, forceUntitled: true }) as UntitledTextEditorInput;
160+
const untitledTextEditor = await accessor.textEditorService.resolveTextEditor({ resource: undefined, forceUntitled: true }) as UntitledTextEditorInput;
161161
const model = disposables.add(await untitledTextEditor.resolve());
162162

163163
assert.ok(!accessor.editorService.isOpened(untitledTextEditor));
@@ -177,7 +177,7 @@ suite('Files - TextFileEditorTracker', () => {
177177

178178
const resource = toResource.call(this, '/path/index.txt');
179179

180-
await accessor.editorService.openEditor(accessor.textEditorService.createTextEditor({ resource, options: { override: DEFAULT_EDITOR_ASSOCIATION.id } }));
180+
await accessor.editorService.openEditor(await accessor.textEditorService.resolveTextEditor({ resource, options: { override: DEFAULT_EDITOR_ASSOCIATION.id } }));
181181

182182
accessor.hostService.setFocus(false);
183183
accessor.hostService.setFocus(true);

src/vs/workbench/contrib/interactive/browser/interactive.contribution.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ registerAction2(class extends Action2 {
378378
const historyService = accessor.get(IInteractiveHistoryService);
379379
const kernelService = accessor.get(INotebookKernelService);
380380
const logService = accessor.get(ILogService);
381-
const group = columnToEditorGroup(editorGroupService, typeof showOptions === 'number' ? showOptions : showOptions?.viewColumn);
381+
const configurationService = accessor.get(IConfigurationService);
382+
const group = columnToEditorGroup(editorGroupService, configurationService, typeof showOptions === 'number' ? showOptions : showOptions?.viewColumn);
382383
const editorOptions = {
383384
activation: EditorActivation.PRESERVE,
384385
preserveFocus: typeof showOptions !== 'number' ? (showOptions?.preserveFocus ?? false) : false

src/vs/workbench/contrib/notebook/browser/diff/notebookDiffActions.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
1010
import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey';
1111
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
1212
import { ActiveEditorContext } from 'vs/workbench/common/contextkeys';
13-
import { columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn';
1413
import { DiffElementViewModelBase } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel';
1514
import { NOTEBOOK_DIFF_CELL_INPUT, NOTEBOOK_DIFF_CELL_PROPERTY, NOTEBOOK_DIFF_CELL_PROPERTY_EXPANDED } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser';
1615
import { NotebookTextDiffEditor } from 'vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor';
1716
import { NotebookDiffEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookDiffEditorInput';
1817
import { openAsTextIcon, renderOutputIcon, revertIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons';
19-
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
2018
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
2119
import { Registry } from 'vs/platform/registry/common/platform';
2220
import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry';
@@ -42,7 +40,6 @@ registerAction2(class extends Action2 {
4240

4341
async run(accessor: ServicesAccessor): Promise<void> {
4442
const editorService = accessor.get(IEditorService);
45-
const editorGroupService = accessor.get(IEditorGroupsService);
4643

4744
const activeEditor = editorService.activeEditorPane;
4845
if (activeEditor && activeEditor instanceof NotebookTextDiffEditor) {
@@ -57,7 +54,7 @@ registerAction2(class extends Action2 {
5754
preserveFocus: false,
5855
override: EditorResolution.DISABLED
5956
}
60-
}, columnToEditorGroup(editorGroupService, undefined));
57+
});
6158
}
6259
}
6360
});

src/vs/workbench/services/editor/browser/editorService.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
518518

519519
// Override is disabled or did not apply: fallback to default
520520
if (!typedEditor) {
521-
typedEditor = isEditorInput(editor) ? editor : this.textEditorService.createTextEditor(editor);
521+
typedEditor = isEditorInput(editor) ? editor : await this.textEditorService.resolveTextEditor(editor);
522522
}
523523

524524
// If group still isn't defined because of a disabled override we resolve it
@@ -577,7 +577,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
577577

578578
// Override is disabled or did not apply: fallback to default
579579
if (!typedEditor) {
580-
typedEditor = isEditorInputWithOptions(editor) ? editor : { editor: this.textEditorService.createTextEditor(editor), options: editor.options };
580+
typedEditor = isEditorInputWithOptions(editor) ? editor : { editor: await this.textEditorService.resolveTextEditor(editor), options: editor.options };
581581
}
582582

583583
// If group still isn't defined because of a disabled override we resolve it
@@ -885,7 +885,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
885885
if (!typedReplacement) {
886886
typedReplacement = {
887887
editor: replacement.editor,
888-
replacement: isEditorReplacement(replacement) ? replacement.replacement : this.textEditorService.createTextEditor(replacement.replacement),
888+
replacement: isEditorReplacement(replacement) ? replacement.replacement : await this.textEditorService.resolveTextEditor(replacement.replacement),
889889
options: isEditorReplacement(replacement) ? replacement.options : replacement.replacement.options,
890890
forceReplaceDirty: replacement.forceReplaceDirty
891891
};

0 commit comments

Comments
 (0)