@codingame/monaco-vscode-views-service-override 1.82.6 → 1.83.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/assets/index-no-csp.html +2 -1
  2. package/assets/index.html +3 -2
  3. package/package.json +4 -4
  4. package/views.js +1 -1
  5. package/vscode/src/vs/base/browser/ui/grid/gridview.js +31 -12
  6. package/vscode/src/vs/base/common/codicons.d.ts +1 -1
  7. package/vscode/src/vs/platform/actions/browser/toolbar.d.ts +7 -2
  8. package/vscode/src/vs/workbench/api/browser/viewsExtensionPoint.js +2 -1
  9. package/vscode/src/vs/workbench/browser/parts/activitybar/activitybarActions.js +26 -28
  10. package/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart.d.ts +4 -2
  11. package/vscode/src/vs/workbench/browser/parts/activitybar/activitybarPart.js +19 -8
  12. package/vscode/src/vs/workbench/browser/parts/activitybar/media/activityaction.css.js +1 -1
  13. package/vscode/src/vs/workbench/browser/parts/editor/breadcrumbsControl.js +44 -1
  14. package/vscode/src/vs/workbench/browser/parts/editor/editorDropTarget.js +18 -18
  15. package/vscode/src/vs/workbench/browser/parts/editor/editorGroupView.js +82 -91
  16. package/vscode/src/vs/workbench/browser/parts/editor/editorPart.js +15 -13
  17. package/vscode/src/vs/workbench/browser/parts/editor/{titleControl.js → editorTabsControl.js} +69 -87
  18. package/vscode/src/vs/workbench/browser/parts/editor/editorTitleControl.js +152 -0
  19. package/vscode/src/vs/workbench/browser/parts/editor/media/{titlecontrol.css.js → editortabscontrol.css.js} +1 -1
  20. package/vscode/src/vs/workbench/browser/parts/editor/media/editortitlecontrol.css.js +6 -0
  21. package/vscode/src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css.js +6 -0
  22. package/vscode/src/vs/workbench/browser/parts/editor/media/singleeditortabscontrol.css.js +6 -0
  23. package/vscode/src/vs/workbench/browser/parts/editor/{tabsTitleControl.js → multiEditorTabsControl.js} +265 -252
  24. package/vscode/src/vs/workbench/browser/parts/editor/multiRowEditorTabsControl.js +152 -0
  25. package/vscode/src/vs/workbench/browser/parts/editor/{noTabsTitleControl.js → singleEditorTabsControl.js} +39 -31
  26. package/vscode/src/vs/workbench/browser/parts/views/checkbox.js +1 -0
  27. package/vscode/src/vs/workbench/browser/parts/views/treeView.js +10 -13
  28. package/vscode/src/vs/workbench/common/editor/filteredEditorGroupModel.js +109 -0
  29. package/vscode/src/vs/workbench/contrib/customEditor/common/customEditorModelManager.js +2 -2
  30. package/vscode/src/vs/workbench/contrib/files/browser/editors/fileEditorInput.js +1 -1
  31. package/vscode/src/vs/workbench/contrib/remote/browser/tunnelView.js +3 -3
  32. package/vscode/src/vs/workbench/contrib/webview/browser/themeing.js +2 -2
  33. package/vscode/src/vs/workbench/contrib/webview/browser/webviewElement.js +1 -1
  34. package/vscode/src/vs/workbench/services/history/browser/historyService.js +11 -0
  35. package/vscode/src/vs/workbench/services/userDataProfile/common/userDataProfileIcons.js +7 -0
  36. package/vscode/src/vs/workbench/services/views/browser/viewDescriptorService.js +15 -8
  37. package/vscode/src/vs/workbench/services/views/common/viewContainerModel.js +9 -14
  38. package/vscode/src/vs/workbench/browser/parts/editor/media/notabstitlecontrol.css.js +0 -6
  39. package/vscode/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css.js +0 -6
@@ -1,5 +1,5 @@
1
1
  import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
- import './media/tabstitlecontrol.css.js';
2
+ import './media/multieditortabscontrol.css.js';
3
3
  import { isWindows, isMacintosh } from 'monaco-editor/esm/vs/base/common/platform.js';
4
4
  import { shorten } from 'monaco-editor/esm/vs/base/common/labels.js';
5
5
  import { DEFAULT_EDITOR_ASSOCIATION, preventEditorClose, EditorCloseMethod, EditorResourceAccessor, SideBySideEditor } from 'vscode/vscode/vs/workbench/common/editor';
@@ -13,7 +13,7 @@ import { IInstantiationService } from 'monaco-editor/esm/vs/platform/instantiati
13
13
  import { IKeybindingService } from 'monaco-editor/esm/vs/platform/keybinding/common/keybinding.js';
14
14
  import { IContextKeyService } from 'monaco-editor/esm/vs/platform/contextkey/common/contextkey.js';
15
15
  import { MenuId, IMenuService } from 'monaco-editor/esm/vs/platform/actions/common/actions.js';
16
- import { TitleControl, EditorCommandsContextActionRunner } from './titleControl.js';
16
+ import { EditorTabsControl, EditorCommandsContextActionRunner } from './editorTabsControl.js';
17
17
  import { IQuickInputService } from 'monaco-editor/esm/vs/platform/quickinput/common/quickInput.js';
18
18
  import { MutableDisposable, DisposableStore, dispose, combinedDisposable, toDisposable } from 'monaco-editor/esm/vs/base/common/lifecycle.js';
19
19
  import { ScrollableElement } from 'monaco-editor/esm/vs/base/browser/ui/scrollbar/scrollableElement.js';
@@ -27,9 +27,6 @@ import { IEditorGroupsService } from 'vscode/vscode/vs/workbench/services/editor
27
27
  import { Dimension, addDisposableListener, EventType, EventHelper, DragAndDropObserver, clearNode, scheduleAtNextAnimationFrame, findParentWithClass } from 'monaco-editor/esm/vs/base/browser/dom.js';
28
28
  import { localize } from 'monaco-editor/esm/vs/nls.js';
29
29
  import { CloseOneEditorAction, UnpinEditorAction } from 'vscode/vscode/vs/workbench/browser/parts/editor/editorActions';
30
- import { IConfigurationService } from 'monaco-editor/esm/vs/platform/configuration/common/configuration.js';
31
- import { BreadcrumbsControl } from './breadcrumbsControl.js';
32
- import { IFileService } from 'monaco-editor/esm/vs/platform/files/common/files.js';
33
30
  import { assertAllDefined, assertIsDefined } from 'monaco-editor/esm/vs/base/common/types.js';
34
31
  import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
35
32
  import { basenameOrAuthority } from 'monaco-editor/esm/vs/base/common/resources.js';
@@ -46,10 +43,11 @@ import { StandardMouseEvent } from 'monaco-editor/esm/vs/base/browser/mouseEvent
46
43
  import { ITreeViewsDnDService } from 'monaco-editor/esm/vs/editor/common/services/treeViewsDndService.js';
47
44
  import { DraggedTreeItemsIdentifier } from 'monaco-editor/esm/vs/editor/common/services/treeViewsDnd.js';
48
45
  import { IEditorResolverService } from 'vscode/vscode/vs/workbench/services/editor/common/editorResolverService';
46
+ import { UnstickyEditorGroupModel, StickyEditorGroupModel } from '../../../common/editor/filteredEditorGroupModel.js';
49
47
 
50
- var TabsTitleControl_1;
51
- let TabsTitleControl = class TabsTitleControl extends TitleControl {
52
- static { TabsTitleControl_1 = this; }
48
+ var MultiEditorTabsControl_1;
49
+ let MultiEditorTabsControl = class MultiEditorTabsControl extends EditorTabsControl {
50
+ static { MultiEditorTabsControl_1 = this; }
53
51
  static { this.SCROLLBAR_SIZES = {
54
52
  default: 3,
55
53
  large: 10
@@ -59,12 +57,11 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
59
57
  shrink: 80,
60
58
  fit: 120
61
59
  }; }
62
- static { this.TAB_HEIGHT = 35; }
63
60
  static { this.DRAG_OVER_OPEN_TAB_THRESHOLD = 1500; }
64
61
  static { this.MOUSE_WHEEL_EVENT_THRESHOLD = 150; }
65
62
  static { this.MOUSE_WHEEL_DISTANCE_THRESHOLD = 1.5; }
66
- constructor(parent, accessor, group, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, configurationService, fileService, editorService, pathService, editorGroupService, treeViewsDragAndDropService, editorResolverService) {
67
- super(parent, accessor, group, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, configurationService, fileService, editorResolverService);
63
+ constructor(parent, groupsView, groupView, tabsModel, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, editorService, pathService, editorGroupService, treeViewsDragAndDropService, editorResolverService) {
64
+ super(parent, groupsView, groupView, tabsModel, contextMenuService, instantiationService, contextKeyService, keybindingService, notificationService, menuService, quickInputService, themeService, editorResolverService);
68
65
  this.editorService = editorService;
69
66
  this.pathService = pathService;
70
67
  this.editorGroupService = editorGroupService;
@@ -88,6 +85,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
88
85
  this._register(this.tabResourceLabels.onDidChangeDecorations(() => this.doHandleDecorationsChange()));
89
86
  }
90
87
  create(parent) {
88
+ super.create(parent);
91
89
  this.titleContainer = parent;
92
90
  this.tabsAndActionsContainer = document.createElement('div');
93
91
  this.tabsAndActionsContainer.classList.add('tabs-and-actions-container');
@@ -106,10 +104,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
106
104
  this.editorToolbarContainer.classList.add('editor-actions');
107
105
  this.tabsAndActionsContainer.appendChild(this.editorToolbarContainer);
108
106
  this.createEditorActionsToolBar(this.editorToolbarContainer);
109
- const breadcrumbsContainer = document.createElement('div');
110
- breadcrumbsContainer.classList.add('tabs-breadcrumbs');
111
- this.titleContainer.appendChild(breadcrumbsContainer);
112
- this.createBreadcrumbsControl(breadcrumbsContainer, { showFileIcons: true, showSymbolIcons: true, showDecorationColors: false, showPlaceholder: true });
107
+ this.updateTabsControlVisibility();
113
108
  }
114
109
  createTabsScrollbar(scrollable) {
115
110
  const tabsScrollbar = this._register(( new ScrollableElement(scrollable, {
@@ -134,7 +129,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
134
129
  updateTabSizing(fromEvent) {
135
130
  const [tabsContainer, tabSizingFixedDisposables] = assertAllDefined(this.tabsContainer, this.tabSizingFixedDisposables);
136
131
  tabSizingFixedDisposables.clear();
137
- const options = this.accessor.partOptions;
132
+ const options = this.groupsView.partOptions;
138
133
  if (options.tabSizing === 'fixed') {
139
134
  tabsContainer.style.setProperty('--tab-sizing-fixed-min-width', `${options.tabSizingFixedMinWidth}px`);
140
135
  tabsContainer.style.setProperty('--tab-sizing-fixed-max-width', `${options.tabSizingFixedMaxWidth}px`);
@@ -153,7 +148,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
153
148
  }
154
149
  }
155
150
  updateTabsFixedWidth(fixed) {
156
- this.forEachTab((editor, index, tabContainer) => {
151
+ this.forEachTab((editor, tabIndex, tabContainer) => {
157
152
  if (fixed) {
158
153
  const { width } = tabContainer.getBoundingClientRect();
159
154
  tabContainer.style.setProperty('--tab-sizing-current-width', `${width}px`);
@@ -164,10 +159,10 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
164
159
  });
165
160
  }
166
161
  getTabsScrollbarSizing() {
167
- if (this.accessor.partOptions.titleScrollbarSizing !== 'large') {
168
- return TabsTitleControl_1.SCROLLBAR_SIZES.default;
162
+ if (this.groupsView.partOptions.titleScrollbarSizing !== 'large') {
163
+ return MultiEditorTabsControl_1.SCROLLBAR_SIZES.default;
169
164
  }
170
- return TabsTitleControl_1.SCROLLBAR_SIZES.large;
165
+ return MultiEditorTabsControl_1.SCROLLBAR_SIZES.large;
171
166
  }
172
167
  registerTabsContainerListeners(tabsContainer, tabsScrollbar) {
173
168
  this.enableGroupDragging(tabsContainer);
@@ -198,10 +193,10 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
198
193
  resource: undefined,
199
194
  options: {
200
195
  pinned: true,
201
- index: this.group.count,
196
+ index: this.groupView.count,
202
197
  override: DEFAULT_EDITOR_ASSOCIATION.id
203
198
  }
204
- }, this.group.id);
199
+ }, this.groupView.id);
205
200
  }));
206
201
  }
207
202
  this._register(addDisposableListener(tabsContainer, EventType.MOUSE_DOWN, e => {
@@ -228,7 +223,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
228
223
  const data = this.editorTransfer.getData(DraggedEditorIdentifier.prototype);
229
224
  if (Array.isArray(data)) {
230
225
  const localDraggedEditor = data[0].identifier;
231
- if (this.group.id === localDraggedEditor.groupId && this.group.getIndexOfEditor(localDraggedEditor.editor) === this.group.count - 1) {
226
+ if (this.groupView.id === localDraggedEditor.groupId && this.tabsModel.isLast(localDraggedEditor.editor)) {
232
227
  if (e.dataTransfer) {
233
228
  e.dataTransfer.dropEffect = 'none';
234
229
  }
@@ -255,16 +250,17 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
255
250
  this.updateDropFeedback(tabsContainer, false);
256
251
  tabsContainer.classList.remove('scroll');
257
252
  if (e.target === tabsContainer) {
258
- this.onDrop(e, this.group.count, tabsContainer);
253
+ const isGroupTransfer = this.groupTransfer.hasData(DraggedEditorGroupIdentifier.prototype);
254
+ this.onDrop(e, isGroupTransfer ? this.groupView.count : this.tabsModel.count, tabsContainer);
259
255
  }
260
256
  }
261
257
  })));
262
258
  this._register(addDisposableListener(tabsContainer, EventType.MOUSE_WHEEL, (e) => {
263
- const activeEditor = this.group.activeEditor;
264
- if (!activeEditor || this.group.count < 2) {
259
+ const activeEditor = this.groupView.activeEditor;
260
+ if (!activeEditor || this.groupView.count < 2) {
265
261
  return;
266
262
  }
267
- if (this.accessor.partOptions.scrollToSwitchTabs === true) {
263
+ if (this.groupsView.partOptions.scrollToSwitchTabs === true) {
268
264
  if (e.shiftKey) {
269
265
  return;
270
266
  }
@@ -275,25 +271,25 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
275
271
  }
276
272
  }
277
273
  const now = Date.now();
278
- if (now - this.lastMouseWheelEventTime < TabsTitleControl_1.MOUSE_WHEEL_EVENT_THRESHOLD - 2 * (Math.abs(e.deltaX) + Math.abs(e.deltaY))) {
274
+ if (now - this.lastMouseWheelEventTime < MultiEditorTabsControl_1.MOUSE_WHEEL_EVENT_THRESHOLD - 2 * (Math.abs(e.deltaX) + Math.abs(e.deltaY))) {
279
275
  return;
280
276
  }
281
277
  this.lastMouseWheelEventTime = now;
282
278
  let tabSwitchDirection;
283
- if (e.deltaX + e.deltaY < -TabsTitleControl_1.MOUSE_WHEEL_DISTANCE_THRESHOLD) {
279
+ if (e.deltaX + e.deltaY < -MultiEditorTabsControl_1.MOUSE_WHEEL_DISTANCE_THRESHOLD) {
284
280
  tabSwitchDirection = -1;
285
281
  }
286
- else if (e.deltaX + e.deltaY > TabsTitleControl_1.MOUSE_WHEEL_DISTANCE_THRESHOLD) {
282
+ else if (e.deltaX + e.deltaY > MultiEditorTabsControl_1.MOUSE_WHEEL_DISTANCE_THRESHOLD) {
287
283
  tabSwitchDirection = 1;
288
284
  }
289
285
  else {
290
286
  return;
291
287
  }
292
- const nextEditor = this.group.getEditorByIndex(this.group.getIndexOfEditor(activeEditor) + tabSwitchDirection);
288
+ const nextEditor = this.groupView.getEditorByIndex(this.groupView.getIndexOfEditor(activeEditor) + tabSwitchDirection);
293
289
  if (!nextEditor) {
294
290
  return;
295
291
  }
296
- this.group.openEditor(nextEditor);
292
+ this.groupView.openEditor(nextEditor);
297
293
  EventHelper.stop(e, true);
298
294
  }));
299
295
  const showContextMenu = (e) => {
@@ -307,9 +303,9 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
307
303
  menuId: MenuId.EditorTabsBarContext,
308
304
  contextKeyService: this.contextKeyService,
309
305
  menuActionOptions: { shouldForwardArgs: true },
310
- getActionsContext: () => ({ groupId: this.group.id }),
306
+ getActionsContext: () => ({ groupId: this.groupView.id }),
311
307
  getKeyBinding: action => this.getKeybinding(action),
312
- onHide: () => this.group.focus()
308
+ onHide: () => this.groupView.focus()
313
309
  });
314
310
  };
315
311
  this._register(addDisposableListener(tabsContainer, EventType$1.Contextmenu, e => showContextMenu(e)));
@@ -322,37 +318,43 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
322
318
  super.updateEditorActionsToolbar();
323
319
  this.layout(this.dimensions);
324
320
  }
325
- openEditor(editor) {
326
- this.handleOpenedEditors();
321
+ openEditor(editor, options) {
322
+ const changed = this.handleOpenedEditors();
323
+ if (options?.focusTabControl) {
324
+ this.withTab(editor, (editor, tabIndex, tabContainer) => tabContainer.focus());
325
+ }
326
+ return changed;
327
327
  }
328
328
  openEditors(editors) {
329
- this.handleOpenedEditors();
329
+ return this.handleOpenedEditors();
330
330
  }
331
331
  handleOpenedEditors() {
332
+ this.updateTabsControlVisibility();
332
333
  const [tabsContainer, tabsScrollbar] = assertAllDefined(this.tabsContainer, this.tabsScrollbar);
333
- for (let i = tabsContainer.children.length; i < this.group.count; i++) {
334
+ for (let i = tabsContainer.children.length; i < this.tabsModel.count; i++) {
334
335
  tabsContainer.appendChild(this.createTab(i, tabsContainer, tabsScrollbar));
335
336
  }
336
337
  const activeEditorChanged = this.didActiveEditorChange();
337
338
  const oldActiveTabLabel = this.activeTabLabel;
338
339
  const oldTabLabelsLength = this.tabLabels.length;
339
340
  this.computeTabLabels();
341
+ let didChange = false;
340
342
  if (activeEditorChanged ||
341
343
  oldTabLabelsLength !== this.tabLabels.length ||
342
344
  !this.equalsEditorInputLabel(oldActiveTabLabel, this.activeTabLabel)
343
345
  ) {
344
346
  this.redraw({ forceRevealActiveTab: true });
345
- this.breadcrumbsControl?.update();
347
+ didChange = true;
346
348
  }
347
349
  else {
348
350
  this.layout(this.dimensions, { forceRevealActiveTab: true });
349
- this.breadcrumbsControl?.revealLast();
350
351
  }
352
+ return didChange;
351
353
  }
352
354
  didActiveEditorChange() {
353
- if (!this.activeTabLabel?.editor && this.group.activeEditor ||
354
- this.activeTabLabel?.editor && !this.group.activeEditor ||
355
- (!this.activeTabLabel?.editor || !this.group.isActive(this.activeTabLabel.editor))
355
+ if (!this.activeTabLabel?.editor && this.tabsModel.activeEditor ||
356
+ this.activeTabLabel?.editor && !this.tabsModel.activeEditor ||
357
+ (!this.activeTabLabel?.editor || !this.tabsModel.isActive(this.activeTabLabel.editor))
356
358
  ) {
357
359
  return true;
358
360
  }
@@ -372,8 +374,8 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
372
374
  labelA.ariaLabel === labelB.ariaLabel;
373
375
  }
374
376
  beforeCloseEditor(editor) {
375
- if (this.isMouseOverTabs && this.accessor.partOptions.tabSizing === 'fixed') {
376
- const closingLastTab = this.group.isLast(editor);
377
+ if (this.isMouseOverTabs && this.groupsView.partOptions.tabSizing === 'fixed') {
378
+ const closingLastTab = this.tabsModel.isLast(editor);
377
379
  this.updateTabsFixedWidth(!closingLastTab);
378
380
  }
379
381
  }
@@ -384,9 +386,9 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
384
386
  this.handleClosedEditors();
385
387
  }
386
388
  handleClosedEditors() {
387
- if (this.group.activeEditor) {
389
+ if (this.tabsModel.count) {
388
390
  const tabsContainer = assertIsDefined(this.tabsContainer);
389
- while (tabsContainer.children.length > this.group.count) {
391
+ while (tabsContainer.children.length > this.tabsModel.count) {
390
392
  tabsContainer.lastChild?.remove();
391
393
  dispose(this.tabDisposables.pop());
392
394
  }
@@ -403,22 +405,22 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
403
405
  this.activeTabLabel = undefined;
404
406
  this.tabActionBars = [];
405
407
  this.clearEditorActionsToolbar();
406
- this.breadcrumbsControl?.update();
408
+ this.updateTabsControlVisibility();
407
409
  }
408
410
  }
409
- moveEditor(editor, fromIndex, targetIndex) {
410
- const editorLabel = this.tabLabels[fromIndex];
411
- this.tabLabels.splice(fromIndex, 1);
412
- this.tabLabels.splice(targetIndex, 0, editorLabel);
413
- this.forEachTab((editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
414
- this.redrawTab(editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar);
415
- }, Math.min(fromIndex, targetIndex),
416
- Math.max(fromIndex, targetIndex)
411
+ moveEditor(editor, fromTabIndex, targeTabIndex) {
412
+ const editorLabel = this.tabLabels[fromTabIndex];
413
+ this.tabLabels.splice(fromTabIndex, 1);
414
+ this.tabLabels.splice(targeTabIndex, 0, editorLabel);
415
+ this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
416
+ this.redrawTab(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar);
417
+ }, Math.min(fromTabIndex, targeTabIndex),
418
+ Math.max(fromTabIndex, targeTabIndex)
417
419
  );
418
420
  this.layout(this.dimensions, { forceRevealActiveTab: true });
419
421
  }
420
422
  pinEditor(editor) {
421
- this.withTab(editor, (editor, index, tabContainer, tabLabelWidget, tabLabel) => this.redrawTabLabel(editor, index, tabContainer, tabLabelWidget, tabLabel));
423
+ this.withTab(editor, (editor, tabIndex, tabContainer, tabLabelWidget, tabLabel) => this.redrawTabLabel(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel));
422
424
  }
423
425
  stickEditor(editor) {
424
426
  this.doHandleStickyEditorChange(editor);
@@ -427,14 +429,14 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
427
429
  this.doHandleStickyEditorChange(editor);
428
430
  }
429
431
  doHandleStickyEditorChange(editor) {
430
- this.withTab(editor, (editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => this.redrawTab(editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar));
431
- this.forEachTab((editor, index, tabContainer, tabLabelWidget, tabLabel) => {
432
- this.redrawTabBorders(index, tabContainer);
432
+ this.withTab(editor, (editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => this.redrawTab(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar));
433
+ this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel) => {
434
+ this.redrawTabBorders(tabIndex, tabContainer);
433
435
  });
434
436
  this.layout(this.dimensions, { forceRevealActiveTab: true });
435
437
  }
436
438
  setActive(isGroupActive) {
437
- this.forEachTab((editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
439
+ this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
438
440
  this.redrawTabActiveAndDirty(isGroupActive, editor, tabContainer, tabActionBar);
439
441
  });
440
442
  this.updateEditorActionsToolbar();
@@ -445,15 +447,16 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
445
447
  }
446
448
  doUpdateEditorLabels() {
447
449
  this.computeTabLabels();
448
- this.forEachTab((editor, index, tabContainer, tabLabelWidget, tabLabel) => {
449
- this.redrawTabLabel(editor, index, tabContainer, tabLabelWidget, tabLabel);
450
+ this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel) => {
451
+ this.redrawTabLabel(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel);
450
452
  });
451
453
  this.layout(this.dimensions);
452
454
  }
453
455
  updateEditorDirty(editor) {
454
- this.withTab(editor, (editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => this.redrawTabActiveAndDirty(this.accessor.activeGroup === this.group, editor, tabContainer, tabActionBar));
456
+ this.withTab(editor, (editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => this.redrawTabActiveAndDirty(this.groupsView.activeGroup === this.groupView, editor, tabContainer, tabActionBar));
455
457
  }
456
458
  updateOptions(oldOptions, newOptions) {
459
+ super.updateOptions(oldOptions, newOptions);
457
460
  if (oldOptions.labelFormat !== newOptions.labelFormat) {
458
461
  this.computeTabLabels();
459
462
  }
@@ -480,31 +483,31 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
480
483
  updateStyles() {
481
484
  this.redraw();
482
485
  }
483
- forEachTab(fn, fromIndex, toIndex) {
484
- this.group.editors.forEach((editor, index) => {
485
- if (typeof fromIndex === 'number' && fromIndex > index) {
486
+ forEachTab(fn, fromTabIndex, toTabIndex) {
487
+ this.tabsModel.getEditors(1 ).forEach((editor, tabIndex) => {
488
+ if (typeof fromTabIndex === 'number' && fromTabIndex > tabIndex) {
486
489
  return;
487
490
  }
488
- if (typeof toIndex === 'number' && toIndex < index) {
491
+ if (typeof toTabIndex === 'number' && toTabIndex < tabIndex) {
489
492
  return;
490
493
  }
491
- this.doWithTab(index, editor, fn);
494
+ this.doWithTab(tabIndex, editor, fn);
492
495
  });
493
496
  }
494
497
  withTab(editor, fn) {
495
- this.doWithTab(this.group.getIndexOfEditor(editor), editor, fn);
498
+ this.doWithTab(this.tabsModel.indexOf(editor), editor, fn);
496
499
  }
497
- doWithTab(index, editor, fn) {
500
+ doWithTab(tabIndex, editor, fn) {
498
501
  const tabsContainer = assertIsDefined(this.tabsContainer);
499
- const tabContainer = tabsContainer.children[index];
500
- const tabResourceLabel = this.tabResourceLabels.get(index);
501
- const tabLabel = this.tabLabels[index];
502
- const tabActionBar = this.tabActionBars[index];
502
+ const tabContainer = tabsContainer.children[tabIndex];
503
+ const tabResourceLabel = this.tabResourceLabels.get(tabIndex);
504
+ const tabLabel = this.tabLabels[tabIndex];
505
+ const tabActionBar = this.tabActionBars[tabIndex];
503
506
  if (tabContainer && tabResourceLabel && tabLabel) {
504
- fn(editor, index, tabContainer, tabResourceLabel, tabLabel, tabActionBar);
507
+ fn(editor, tabIndex, tabContainer, tabResourceLabel, tabLabel, tabActionBar);
505
508
  }
506
509
  }
507
- createTab(index, tabsContainer, tabsScrollbar) {
510
+ createTab(tabIndex, tabsContainer, tabsScrollbar) {
508
511
  const tabContainer = document.createElement('div');
509
512
  tabContainer.draggable = true;
510
513
  tabContainer.setAttribute('role', 'tab');
@@ -517,22 +520,30 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
517
520
  const tabActionsContainer = document.createElement('div');
518
521
  tabActionsContainer.classList.add('tab-actions');
519
522
  tabContainer.appendChild(tabActionsContainer);
520
- const tabActionRunner = ( new EditorCommandsContextActionRunner({ groupId: this.group.id, editorIndex: index }));
523
+ const that = this;
524
+ const tabActionRunner = ( new EditorCommandsContextActionRunner({
525
+ groupId: this.groupView.id,
526
+ get editorIndex() { return that.toEditorIndex(tabIndex); }
527
+ }));
521
528
  const tabActionBar = ( new ActionBar(tabActionsContainer, { ariaLabel: ( localize('ariaLabelTabActions', "Tab actions")), actionRunner: tabActionRunner }));
522
- tabActionBar.onWillRun(e => {
529
+ const tabActionListener = tabActionBar.onWillRun(e => {
523
530
  if (e.action.id === this.closeEditorAction.id) {
524
531
  this.blockRevealActiveTabOnce();
525
532
  }
526
533
  });
527
- const tabActionBarDisposable = combinedDisposable(tabActionBar, toDisposable(insert(this.tabActionBars, tabActionBar)));
534
+ const tabActionBarDisposable = combinedDisposable(tabActionBar, tabActionListener, toDisposable(insert(this.tabActionBars, tabActionBar)));
528
535
  const tabBorderBottomContainer = document.createElement('div');
529
536
  tabBorderBottomContainer.classList.add('tab-border-bottom-container');
530
537
  tabContainer.appendChild(tabBorderBottomContainer);
531
- const eventsDisposable = this.registerTabListeners(tabContainer, index, tabsContainer, tabsScrollbar);
538
+ const eventsDisposable = this.registerTabListeners(tabContainer, tabIndex, tabsContainer, tabsScrollbar);
532
539
  this.tabDisposables.push(combinedDisposable(eventsDisposable, tabActionBarDisposable, tabActionRunner, editorLabel));
533
540
  return tabContainer;
534
541
  }
535
- registerTabListeners(tab, index, tabsContainer, tabsScrollbar) {
542
+ toEditorIndex(tabIndex) {
543
+ const editor = assertIsDefined(this.tabsModel.getEditorByIndex(tabIndex));
544
+ return this.groupView.getIndexOfEditor(editor);
545
+ }
546
+ registerTabListeners(tab, tabIndex, tabsContainer, tabsScrollbar) {
536
547
  const disposables = ( new DisposableStore());
537
548
  const handleClickOrTouch = (e, preserveFocus) => {
538
549
  tab.blur();
@@ -545,17 +556,17 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
545
556
  if (this.originatesFromTabActionBar(e)) {
546
557
  return;
547
558
  }
548
- const editor = this.group.getEditorByIndex(index);
559
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
549
560
  if (editor) {
550
- this.group.openEditor(editor, { preserveFocus, activation: EditorActivation.ACTIVATE });
561
+ this.groupView.openEditor(editor, { preserveFocus, activation: EditorActivation.ACTIVATE });
551
562
  }
552
563
  return undefined;
553
564
  };
554
565
  const showContextMenu = (e) => {
555
566
  EventHelper.stop(e);
556
- const editor = this.group.getEditorByIndex(index);
567
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
557
568
  if (editor) {
558
- this.onContextMenu(editor, e, tab);
569
+ this.onTabContextMenu(editor, e, tab);
559
570
  }
560
571
  };
561
572
  disposables.add(addDisposableListener(tab, EventType.MOUSE_DOWN, e => handleClickOrTouch(e, false)));
@@ -570,12 +581,14 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
570
581
  disposables.add(addDisposableListener(tab, EventType.AUXCLICK, e => {
571
582
  if (e.button === 1 ) {
572
583
  EventHelper.stop(e, true );
573
- const editor = this.group.getEditorByIndex(index);
574
- if (editor && preventEditorClose(this.group, editor, EditorCloseMethod.MOUSE, this.accessor.partOptions)) {
575
- return;
584
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
585
+ if (editor) {
586
+ if (preventEditorClose(this.tabsModel, editor, EditorCloseMethod.MOUSE, this.groupsView.partOptions)) {
587
+ return;
588
+ }
589
+ this.blockRevealActiveTabOnce();
590
+ this.closeEditorAction.run({ groupId: this.groupView.id, editorIndex: this.groupView.getIndexOfEditor(editor) });
576
591
  }
577
- this.blockRevealActiveTabOnce();
578
- this.closeEditorAction.run({ groupId: this.group.id, editorIndex: index });
579
592
  }
580
593
  }));
581
594
  disposables.add(addDisposableListener(tab, EventType.KEY_DOWN, e => {
@@ -592,30 +605,29 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
592
605
  let handled = false;
593
606
  if (event.equals(3 ) || event.equals(10 )) {
594
607
  handled = true;
595
- const editor = this.group.getEditorByIndex(index);
608
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
596
609
  if (editor) {
597
- this.group.openEditor(editor);
610
+ this.groupView.openEditor(editor);
598
611
  }
599
612
  }
600
613
  else if (( [15 , 17 , 16 , 18 , 14 , 13 ].some(kb => event.equals(kb)))) {
601
- let targetIndex;
614
+ let editorIndex = this.toEditorIndex(tabIndex);
602
615
  if (event.equals(15 ) || event.equals(16 )) {
603
- targetIndex = index - 1;
616
+ editorIndex = editorIndex - 1;
604
617
  }
605
618
  else if (event.equals(17 ) || event.equals(18 )) {
606
- targetIndex = index + 1;
619
+ editorIndex = editorIndex + 1;
607
620
  }
608
621
  else if (event.equals(14 )) {
609
- targetIndex = 0;
622
+ editorIndex = 0;
610
623
  }
611
624
  else {
612
- targetIndex = this.group.count - 1;
625
+ editorIndex = this.groupView.count - 1;
613
626
  }
614
- const target = this.group.getEditorByIndex(targetIndex);
627
+ const target = this.groupView.getEditorByIndex(editorIndex);
615
628
  if (target) {
616
629
  handled = true;
617
- this.group.openEditor(target, { preserveFocus: true });
618
- tabsContainer.childNodes[targetIndex].focus();
630
+ this.groupView.openEditor(target, { preserveFocus: true }, { focusTabControl: true });
619
631
  }
620
632
  }
621
633
  if (handled) {
@@ -633,30 +645,30 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
633
645
  else if (e.tapCount !== 2) {
634
646
  return;
635
647
  }
636
- const editor = this.group.getEditorByIndex(index);
637
- if (editor && this.group.isPinned(editor)) {
638
- if (this.accessor.partOptions.doubleClickTabToToggleEditorGroupSizes) {
639
- this.accessor.arrangeGroups(2 , this.group);
648
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
649
+ if (editor && this.tabsModel.isPinned(editor)) {
650
+ if (this.groupsView.partOptions.doubleClickTabToToggleEditorGroupSizes) {
651
+ this.groupsView.arrangeGroups(2 , this.groupView);
640
652
  }
641
653
  }
642
654
  else {
643
- this.group.pinEditor(editor);
655
+ this.groupView.pinEditor(editor);
644
656
  }
645
657
  }));
646
658
  }
647
659
  disposables.add(addDisposableListener(tab, EventType.CONTEXT_MENU, e => {
648
660
  EventHelper.stop(e, true);
649
- const editor = this.group.getEditorByIndex(index);
661
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
650
662
  if (editor) {
651
- this.onContextMenu(editor, e, tab);
663
+ this.onTabContextMenu(editor, e, tab);
652
664
  }
653
665
  }, true ));
654
666
  disposables.add(addDisposableListener(tab, EventType.DRAG_START, e => {
655
- const editor = this.group.getEditorByIndex(index);
667
+ const editor = this.tabsModel.getEditorByIndex(tabIndex);
656
668
  if (!editor) {
657
669
  return;
658
670
  }
659
- this.editorTransfer.setData([( new DraggedEditorIdentifier({ editor, groupId: this.group.id }))], DraggedEditorIdentifier.prototype);
671
+ this.editorTransfer.setData([( new DraggedEditorIdentifier({ editor, groupId: this.groupView.id }))], DraggedEditorIdentifier.prototype);
660
672
  if (e.dataTransfer) {
661
673
  e.dataTransfer.effectAllowed = 'copyMove';
662
674
  }
@@ -679,7 +691,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
679
691
  const data = this.editorTransfer.getData(DraggedEditorIdentifier.prototype);
680
692
  if (Array.isArray(data)) {
681
693
  const localDraggedEditor = data[0].identifier;
682
- if (localDraggedEditor.editor === this.group.getEditorByIndex(index) && localDraggedEditor.groupId === this.group.id) {
694
+ if (localDraggedEditor.editor === this.tabsModel.getEditorByIndex(tabIndex) && localDraggedEditor.groupId === this.groupView.id) {
683
695
  if (e.dataTransfer) {
684
696
  e.dataTransfer.dropEffect = 'none';
685
697
  }
@@ -692,29 +704,29 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
692
704
  e.dataTransfer.dropEffect = 'copy';
693
705
  }
694
706
  }
695
- this.updateDropFeedback(tab, true, index);
707
+ this.updateDropFeedback(tab, true, tabIndex);
696
708
  },
697
709
  onDragOver: (_, dragDuration) => {
698
- if (dragDuration >= TabsTitleControl_1.DRAG_OVER_OPEN_TAB_THRESHOLD) {
699
- const draggedOverTab = this.group.getEditorByIndex(index);
700
- if (draggedOverTab && this.group.activeEditor !== draggedOverTab) {
701
- this.group.openEditor(draggedOverTab, { preserveFocus: true });
710
+ if (dragDuration >= MultiEditorTabsControl_1.DRAG_OVER_OPEN_TAB_THRESHOLD) {
711
+ const draggedOverTab = this.tabsModel.getEditorByIndex(tabIndex);
712
+ if (draggedOverTab && this.tabsModel.activeEditor !== draggedOverTab) {
713
+ this.groupView.openEditor(draggedOverTab, { preserveFocus: true });
702
714
  }
703
715
  }
704
716
  },
705
717
  onDragLeave: () => {
706
718
  tab.classList.remove('dragged-over');
707
- this.updateDropFeedback(tab, false, index);
719
+ this.updateDropFeedback(tab, false, tabIndex);
708
720
  },
709
721
  onDragEnd: () => {
710
722
  tab.classList.remove('dragged-over');
711
- this.updateDropFeedback(tab, false, index);
723
+ this.updateDropFeedback(tab, false, tabIndex);
712
724
  this.editorTransfer.clearData(DraggedEditorIdentifier.prototype);
713
725
  },
714
726
  onDrop: e => {
715
727
  tab.classList.remove('dragged-over');
716
- this.updateDropFeedback(tab, false, index);
717
- this.onDrop(e, index, tabsContainer);
728
+ this.updateDropFeedback(tab, false, tabIndex);
729
+ this.onDrop(e, tabIndex, tabsContainer);
718
730
  }
719
731
  })));
720
732
  return disposables;
@@ -724,7 +736,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
724
736
  const data = this.groupTransfer.getData(DraggedEditorGroupIdentifier.prototype);
725
737
  if (Array.isArray(data)) {
726
738
  const group = data[0];
727
- if (group.identifier === this.group.id) {
739
+ if (group.identifier === this.groupView.id) {
728
740
  return false;
729
741
  }
730
742
  }
@@ -738,10 +750,10 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
738
750
  }
739
751
  return false;
740
752
  }
741
- updateDropFeedback(element, isDND, index) {
742
- const isTab = (typeof index === 'number');
743
- const editor = typeof index === 'number' ? this.group.getEditorByIndex(index) : undefined;
744
- const isActiveTab = isTab && !!editor && this.group.isActive(editor);
753
+ updateDropFeedback(element, isDND, tabIndex) {
754
+ const isTab = (typeof tabIndex === 'number');
755
+ const editor = typeof tabIndex === 'number' ? this.tabsModel.getEditorByIndex(tabIndex) : undefined;
756
+ const isActiveTab = isTab && !!editor && this.tabsModel.isActive(editor);
745
757
  const noDNDBackgroundColor = isTab ? this.getColor(isActiveTab ? TAB_ACTIVE_BACKGROUND : TAB_INACTIVE_BACKGROUND) : '';
746
758
  element.style.backgroundColor = (isDND ? this.getColor(EDITOR_DRAG_AND_DROP_BACKGROUND) : noDNDBackgroundColor) || '';
747
759
  const activeContrastBorderColor = this.getColor(activeContrastBorder);
@@ -759,29 +771,28 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
759
771
  }
760
772
  }
761
773
  computeTabLabels() {
762
- const { labelFormat } = this.accessor.partOptions;
774
+ const { labelFormat } = this.groupsView.partOptions;
763
775
  const { verbosity, shortenDuplicates } = this.getLabelConfigFlags(labelFormat);
764
776
  const labels = [];
765
- let activeEditorIndex = -1;
766
- for (let i = 0; i < this.group.editors.length; i++) {
767
- const editor = this.group.editors[i];
777
+ let activeEditorTabIndex = -1;
778
+ this.tabsModel.getEditors(1 ).forEach((editor, tabIndex) => {
768
779
  labels.push({
769
780
  editor,
770
781
  name: editor.getName(),
771
782
  description: editor.getDescription(verbosity),
772
783
  forceDescription: editor.hasCapability(64 ),
773
784
  title: editor.getTitle(2 ),
774
- ariaLabel: computeEditorAriaLabel(editor, i, this.group, this.editorGroupService.count)
785
+ ariaLabel: computeEditorAriaLabel(editor, tabIndex, this.groupView, this.editorGroupService.count)
775
786
  });
776
- if (editor === this.group.activeEditor) {
777
- activeEditorIndex = i;
787
+ if (editor === this.tabsModel.activeEditor) {
788
+ activeEditorTabIndex = tabIndex;
778
789
  }
779
- }
790
+ });
780
791
  if (shortenDuplicates) {
781
792
  this.shortenTabLabels(labels);
782
793
  }
783
794
  this.tabLabels = labels;
784
- this.activeTabLabel = labels[activeEditorIndex];
795
+ this.activeTabLabel = labels[activeEditorTabIndex];
785
796
  }
786
797
  shortenTabLabels(labels) {
787
798
  const mapNameToDuplicates = ( new Map());
@@ -829,9 +840,9 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
829
840
  continue;
830
841
  }
831
842
  const shortenedDescriptions = shorten(descriptions, this.path.sep);
832
- descriptions.forEach((description, index) => {
843
+ descriptions.forEach((description, tabIndex) => {
833
844
  for (const label of mapDescriptionToDuplicates.get(description) || []) {
834
- label.description = shortenedDescriptions[index];
845
+ label.description = shortenedDescriptions[tabIndex];
835
846
  }
836
847
  });
837
848
  }
@@ -863,16 +874,16 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
863
874
  this.tabsAndActionsContainer.style.removeProperty('--tabs-border-bottom-color');
864
875
  }
865
876
  }
866
- this.forEachTab((editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
867
- this.redrawTab(editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar);
877
+ this.forEachTab((editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) => {
878
+ this.redrawTab(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar);
868
879
  });
869
880
  this.updateEditorActionsToolbar();
870
881
  this.layout(this.dimensions, options);
871
882
  }
872
- redrawTab(editor, index, tabContainer, tabLabelWidget, tabLabel, tabActionBar) {
873
- const isTabSticky = this.group.isSticky(index);
874
- const options = this.accessor.partOptions;
875
- this.redrawTabLabel(editor, index, tabContainer, tabLabelWidget, tabLabel);
883
+ redrawTab(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel, tabActionBar) {
884
+ const isTabSticky = this.tabsModel.isSticky(tabIndex);
885
+ const options = this.groupsView.partOptions;
886
+ this.redrawTabLabel(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel);
876
887
  const tabAction = isTabSticky ? this.unpinEditorAction : this.closeEditorAction;
877
888
  if (!tabActionBar.hasAction(tabAction)) {
878
889
  if (!tabActionBar.isEmpty()) {
@@ -897,27 +908,27 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
897
908
  let stickyTabWidth = 0;
898
909
  switch (options.pinnedTabSizing) {
899
910
  case 'compact':
900
- stickyTabWidth = TabsTitleControl_1.TAB_WIDTH.compact;
911
+ stickyTabWidth = MultiEditorTabsControl_1.TAB_WIDTH.compact;
901
912
  break;
902
913
  case 'shrink':
903
- stickyTabWidth = TabsTitleControl_1.TAB_WIDTH.shrink;
914
+ stickyTabWidth = MultiEditorTabsControl_1.TAB_WIDTH.shrink;
904
915
  break;
905
916
  }
906
- tabContainer.style.left = `${index * stickyTabWidth}px`;
917
+ tabContainer.style.left = `${tabIndex * stickyTabWidth}px`;
907
918
  }
908
919
  else {
909
920
  tabContainer.style.left = 'auto';
910
921
  }
911
- this.redrawTabBorders(index, tabContainer);
912
- this.redrawTabActiveAndDirty(this.accessor.activeGroup === this.group, editor, tabContainer, tabActionBar);
922
+ this.redrawTabBorders(tabIndex, tabContainer);
923
+ this.redrawTabActiveAndDirty(this.groupsView.activeGroup === this.groupView, editor, tabContainer, tabActionBar);
913
924
  }
914
- redrawTabLabel(editor, index, tabContainer, tabLabelWidget, tabLabel) {
915
- const options = this.accessor.partOptions;
925
+ redrawTabLabel(editor, tabIndex, tabContainer, tabLabelWidget, tabLabel) {
926
+ const options = this.groupsView.partOptions;
916
927
  let name;
917
928
  let forceLabel = false;
918
929
  let fileDecorationBadges = Boolean(options.decorations?.badges);
919
930
  let description;
920
- if (options.pinnedTabSizing === 'compact' && this.group.isSticky(index)) {
931
+ if (options.pinnedTabSizing === 'compact' && this.tabsModel.isSticky(tabIndex)) {
921
932
  const isShowingIcons = options.showIcons && options.hasIcons;
922
933
  name = isShowingIcons ? '' : tabLabel.name?.charAt(0).toUpperCase();
923
934
  description = '';
@@ -937,7 +948,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
937
948
  tabLabelWidget.setResource({ name, description, resource: EditorResourceAccessor.getOriginalUri(editor, { supportSideBySide: SideBySideEditor.BOTH }) }, {
938
949
  title,
939
950
  extraClasses: coalesce(['tab-label', fileDecorationBadges ? 'tab-label-has-badge' : undefined].concat(editor.getLabelExtraClasses())),
940
- italic: !this.group.isPinned(editor),
951
+ italic: !this.tabsModel.isPinned(editor),
941
952
  forceLabel,
942
953
  fileDecorations: {
943
954
  colors: Boolean(options.decorations?.colors),
@@ -953,12 +964,12 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
953
964
  }
954
965
  }
955
966
  redrawTabActiveAndDirty(isGroupActive, editor, tabContainer, tabActionBar) {
956
- const isTabActive = this.group.isActive(editor);
967
+ const isTabActive = this.tabsModel.isActive(editor);
957
968
  const hasModifiedBorderTop = this.doRedrawTabDirty(isGroupActive, isTabActive, editor, tabContainer);
958
969
  this.doRedrawTabActive(isGroupActive, !hasModifiedBorderTop, editor, tabContainer, tabActionBar);
959
970
  }
960
971
  doRedrawTabActive(isGroupActive, allowBorderTop, editor, tabContainer, tabActionBar) {
961
- if (this.group.isActive(editor)) {
972
+ if (this.tabsModel.isActive(editor)) {
962
973
  tabContainer.classList.add('active');
963
974
  tabContainer.setAttribute('aria-selected', 'true');
964
975
  tabContainer.tabIndex = 0;
@@ -998,7 +1009,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
998
1009
  let hasModifiedBorderColor = false;
999
1010
  if (editor.isDirty() && !editor.isSaving()) {
1000
1011
  tabContainer.classList.add('dirty');
1001
- if (this.accessor.partOptions.highlightModifiedTabs) {
1012
+ if (this.groupsView.partOptions.highlightModifiedTabs) {
1002
1013
  let modifiedBorderColor;
1003
1014
  if (isGroupActive && isTabActive) {
1004
1015
  modifiedBorderColor = this.getColor(TAB_ACTIVE_MODIFIED_BORDER);
@@ -1029,15 +1040,16 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1029
1040
  }
1030
1041
  return hasModifiedBorderColor;
1031
1042
  }
1032
- redrawTabBorders(index, tabContainer) {
1033
- const isTabSticky = this.group.isSticky(index);
1034
- const isTabLastSticky = isTabSticky && this.group.stickyCount === index + 1;
1035
- const borderRightColor = ((isTabLastSticky ? this.getColor(TAB_LAST_PINNED_BORDER) : undefined) || this.getColor(TAB_BORDER) || this.getColor(contrastBorder));
1043
+ redrawTabBorders(tabIndex, tabContainer) {
1044
+ const isTabSticky = this.tabsModel.isSticky(tabIndex);
1045
+ const isTabLastSticky = isTabSticky && this.tabsModel.stickyCount === tabIndex + 1;
1046
+ const showLastStickyTabBorderColor = this.tabsModel.stickyCount !== this.tabsModel.count;
1047
+ const borderRightColor = ((isTabLastSticky && showLastStickyTabBorderColor ? this.getColor(TAB_LAST_PINNED_BORDER) : undefined) || this.getColor(TAB_BORDER) || this.getColor(contrastBorder));
1036
1048
  tabContainer.style.borderRight = borderRightColor ? `1px solid ${borderRightColor}` : '';
1037
1049
  tabContainer.style.outlineColor = this.getColor(activeContrastBorder) || '';
1038
1050
  }
1039
1051
  prepareEditorActions(editorActions) {
1040
- const isGroupActive = this.accessor.activeGroup === this.group;
1052
+ const isGroupActive = this.groupsView.activeGroup === this.groupView;
1041
1053
  if (isGroupActive) {
1042
1054
  return editorActions;
1043
1055
  }
@@ -1049,76 +1061,62 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1049
1061
  }
1050
1062
  }
1051
1063
  getHeight() {
1052
- const showsBreadcrumbs = this.breadcrumbsControl && !this.breadcrumbsControl.isHidden();
1053
1064
  if (this.dimensions.used) {
1054
- return {
1055
- total: this.dimensions.used.height,
1056
- offset: showsBreadcrumbs ? this.dimensions.used.height - BreadcrumbsControl.HEIGHT : this.dimensions.used.height
1057
- };
1065
+ return this.dimensions.used.height;
1058
1066
  }
1059
1067
  else {
1060
1068
  return this.computeHeight();
1061
1069
  }
1062
1070
  }
1063
1071
  computeHeight() {
1064
- let total;
1065
- if (this.accessor.partOptions.wrapTabs && this.tabsAndActionsContainer?.classList.contains('wrapping')) {
1066
- total = this.tabsAndActionsContainer.offsetHeight;
1072
+ let height;
1073
+ if (!this.visible) {
1074
+ height = 0;
1067
1075
  }
1068
- else {
1069
- total = TabsTitleControl_1.TAB_HEIGHT;
1076
+ else if (this.groupsView.partOptions.wrapTabs && this.tabsAndActionsContainer?.classList.contains('wrapping')) {
1077
+ height = this.tabsAndActionsContainer.offsetHeight;
1070
1078
  }
1071
- const offset = total;
1072
- if (this.breadcrumbsControl && !this.breadcrumbsControl.isHidden()) {
1073
- total += BreadcrumbsControl.HEIGHT;
1079
+ else {
1080
+ height = this.tabHeight;
1074
1081
  }
1075
- return { total, offset };
1082
+ return height;
1076
1083
  }
1077
1084
  layout(dimensions, options) {
1078
1085
  Object.assign(this.dimensions, dimensions);
1079
- if (!this.layoutScheduler.value) {
1080
- const scheduledLayout = scheduleAtNextAnimationFrame(() => {
1081
- this.doLayout(this.dimensions, this.layoutScheduler.value?.options );
1082
- this.layoutScheduler.clear();
1083
- });
1084
- this.layoutScheduler.value = { options, dispose: () => scheduledLayout.dispose() };
1085
- }
1086
- if (options?.forceRevealActiveTab) {
1087
- this.layoutScheduler.value.options = {
1088
- ...this.layoutScheduler.value.options,
1089
- forceRevealActiveTab: true
1090
- };
1086
+ if (this.visible) {
1087
+ if (!this.layoutScheduler.value) {
1088
+ const scheduledLayout = scheduleAtNextAnimationFrame(() => {
1089
+ this.doLayout(this.dimensions, this.layoutScheduler.value?.options );
1090
+ this.layoutScheduler.clear();
1091
+ });
1092
+ this.layoutScheduler.value = { options, dispose: () => scheduledLayout.dispose() };
1093
+ }
1094
+ if (options?.forceRevealActiveTab) {
1095
+ this.layoutScheduler.value.options = {
1096
+ ...this.layoutScheduler.value.options,
1097
+ forceRevealActiveTab: true
1098
+ };
1099
+ }
1091
1100
  }
1092
1101
  if (!this.dimensions.used) {
1093
- this.dimensions.used = ( new Dimension(dimensions.container.width, this.computeHeight().total));
1102
+ this.dimensions.used = ( new Dimension(dimensions.container.width, this.computeHeight()));
1094
1103
  }
1095
1104
  return this.dimensions.used;
1096
1105
  }
1097
1106
  doLayout(dimensions, options) {
1098
- const activeTabAndIndex = this.group.activeEditor ? this.getTabAndIndex(this.group.activeEditor) : undefined;
1099
- if (activeTabAndIndex && dimensions.container !== Dimension.None && dimensions.available !== Dimension.None) {
1100
- this.doLayoutBreadcrumbs(dimensions);
1101
- const [activeTab, activeIndex] = activeTabAndIndex;
1102
- this.doLayoutTabs(activeTab, activeIndex, dimensions, options);
1107
+ if (dimensions.container !== Dimension.None && dimensions.available !== Dimension.None) {
1108
+ this.doLayoutTabs(dimensions, options);
1103
1109
  }
1104
1110
  const oldDimension = this.dimensions.used;
1105
- const newDimension = this.dimensions.used = ( new Dimension(dimensions.container.width, this.computeHeight().total));
1111
+ const newDimension = this.dimensions.used = ( new Dimension(dimensions.container.width, this.computeHeight()));
1106
1112
  if (oldDimension && oldDimension.height !== newDimension.height) {
1107
- this.group.relayout();
1113
+ this.groupView.relayout();
1108
1114
  }
1109
1115
  }
1110
- handleBreadcrumbsEnablementChange() {
1111
- this.group.relayout();
1112
- }
1113
- doLayoutBreadcrumbs(dimensions) {
1114
- if (this.breadcrumbsControl && !this.breadcrumbsControl.isHidden()) {
1115
- this.breadcrumbsControl.layout(( new Dimension(dimensions.container.width, BreadcrumbsControl.HEIGHT)));
1116
- }
1117
- }
1118
- doLayoutTabs(activeTab, activeIndex, dimensions, options) {
1116
+ doLayoutTabs(dimensions, options) {
1119
1117
  const tabsWrapMultiLine = this.doLayoutTabsWrapping(dimensions);
1120
1118
  if (!tabsWrapMultiLine) {
1121
- this.doLayoutTabsNonWrapping(activeTab, activeIndex, options);
1119
+ this.doLayoutTabsNonWrapping(options);
1122
1120
  }
1123
1121
  }
1124
1122
  doLayoutTabsWrapping(dimensions) {
@@ -1130,7 +1128,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1130
1128
  tabsAndActionsContainer.classList.toggle('wrapping', tabsWrapMultiLine);
1131
1129
  tabsContainer.style.setProperty('--last-tab-margin-right', tabsWrapMultiLine ? `${editorToolbarContainer.offsetWidth}px` : '0');
1132
1130
  }
1133
- if (this.accessor.partOptions.wrapTabs) {
1131
+ if (this.groupsView.partOptions.wrapTabs) {
1134
1132
  const visibleTabsWidth = tabsContainer.offsetWidth;
1135
1133
  const allTabsWidth = tabsContainer.scrollWidth;
1136
1134
  const lastTabFitsWrapped = () => {
@@ -1149,7 +1147,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1149
1147
  }
1150
1148
  if (tabsWrapMultiLine) {
1151
1149
  if ((tabsContainer.offsetHeight > dimensions.available.height) ||
1152
- (allTabsWidth === visibleTabsWidth && tabsContainer.offsetHeight === TabsTitleControl_1.TAB_HEIGHT) ||
1150
+ (allTabsWidth === visibleTabsWidth && tabsContainer.offsetHeight === this.tabHeight) ||
1153
1151
  (!lastTabFitsWrapped())
1154
1152
  ) {
1155
1153
  updateTabsWrapping(false);
@@ -1191,26 +1189,28 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1191
1189
  }
1192
1190
  return tabsWrapMultiLine;
1193
1191
  }
1194
- doLayoutTabsNonWrapping(activeTab, activeIndex, options) {
1192
+ doLayoutTabsNonWrapping(options) {
1195
1193
  const [tabsContainer, tabsScrollbar] = assertAllDefined(this.tabsContainer, this.tabsScrollbar);
1196
1194
  const visibleTabsWidth = tabsContainer.offsetWidth;
1197
1195
  const allTabsWidth = tabsContainer.scrollWidth;
1198
1196
  let stickyTabsWidth = 0;
1199
- if (this.group.stickyCount > 0) {
1197
+ if (this.tabsModel.stickyCount > 0) {
1200
1198
  let stickyTabWidth = 0;
1201
- switch (this.accessor.partOptions.pinnedTabSizing) {
1199
+ switch (this.groupsView.partOptions.pinnedTabSizing) {
1202
1200
  case 'compact':
1203
- stickyTabWidth = TabsTitleControl_1.TAB_WIDTH.compact;
1201
+ stickyTabWidth = MultiEditorTabsControl_1.TAB_WIDTH.compact;
1204
1202
  break;
1205
1203
  case 'shrink':
1206
- stickyTabWidth = TabsTitleControl_1.TAB_WIDTH.shrink;
1204
+ stickyTabWidth = MultiEditorTabsControl_1.TAB_WIDTH.shrink;
1207
1205
  break;
1208
1206
  }
1209
- stickyTabsWidth = this.group.stickyCount * stickyTabWidth;
1207
+ stickyTabsWidth = this.tabsModel.stickyCount * stickyTabWidth;
1210
1208
  }
1211
- let activeTabPositionStatic = this.accessor.partOptions.pinnedTabSizing !== 'normal' && this.group.isSticky(activeIndex);
1209
+ const activeTabAndIndex = this.tabsModel.activeEditor ? this.getTabAndIndex(this.tabsModel.activeEditor) : undefined;
1210
+ const [activeTab, activeTabIndex] = activeTabAndIndex ?? [undefined, undefined];
1211
+ let activeTabPositionStatic = this.groupsView.partOptions.pinnedTabSizing !== 'normal' && typeof activeTabIndex === 'number' && this.tabsModel.isSticky(activeTabIndex);
1212
1212
  let availableTabsContainerWidth = visibleTabsWidth - stickyTabsWidth;
1213
- if (this.group.stickyCount > 0 && availableTabsContainerWidth < TabsTitleControl_1.TAB_WIDTH.fit) {
1213
+ if (this.tabsModel.stickyCount > 0 && availableTabsContainerWidth < MultiEditorTabsControl_1.TAB_WIDTH.fit) {
1214
1214
  tabsContainer.classList.add('disable-sticky-tabs');
1215
1215
  availableTabsContainerWidth = visibleTabsWidth;
1216
1216
  stickyTabsWidth = 0;
@@ -1221,7 +1221,7 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1221
1221
  }
1222
1222
  let activeTabPosX;
1223
1223
  let activeTabWidth;
1224
- if (!this.blockRevealActiveTab) {
1224
+ if (!this.blockRevealActiveTab && activeTab) {
1225
1225
  activeTabPosX = activeTab.offsetLeft;
1226
1226
  activeTabWidth = activeTab.offsetWidth;
1227
1227
  }
@@ -1254,23 +1254,33 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1254
1254
  });
1255
1255
  }
1256
1256
  }
1257
+ updateTabsControlVisibility() {
1258
+ const tabsAndActionsContainer = assertIsDefined(this.tabsAndActionsContainer);
1259
+ tabsAndActionsContainer.classList.toggle('empty', !this.visible);
1260
+ if (!this.visible && this.dimensions) {
1261
+ this.dimensions.used = undefined;
1262
+ }
1263
+ }
1264
+ get visible() {
1265
+ return this.tabsModel.count > 0;
1266
+ }
1257
1267
  getTabAndIndex(editor) {
1258
- const editorIndex = this.group.getIndexOfEditor(editor);
1259
- const tab = this.getTabAtIndex(editorIndex);
1268
+ const tabIndex = this.tabsModel.indexOf(editor);
1269
+ const tab = this.getTabAtIndex(tabIndex);
1260
1270
  if (tab) {
1261
- return [tab, editorIndex];
1271
+ return [tab, tabIndex];
1262
1272
  }
1263
1273
  return undefined;
1264
1274
  }
1265
- getTabAtIndex(editorIndex) {
1266
- if (editorIndex >= 0) {
1275
+ getTabAtIndex(tabIndex) {
1276
+ if (tabIndex >= 0) {
1267
1277
  const tabsContainer = assertIsDefined(this.tabsContainer);
1268
- return tabsContainer.children[editorIndex];
1278
+ return tabsContainer.children[tabIndex];
1269
1279
  }
1270
1280
  return undefined;
1271
1281
  }
1272
1282
  getLastTab() {
1273
- return this.getTabAtIndex(this.group.count - 1);
1283
+ return this.getTabAtIndex(this.tabsModel.count - 1);
1274
1284
  }
1275
1285
  blockRevealActiveTabOnce() {
1276
1286
  this.blockRevealActiveTab = true;
@@ -1285,22 +1295,27 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1285
1295
  }
1286
1296
  return !!findParentWithClass(element, 'action-item', 'tab');
1287
1297
  }
1288
- async onDrop(e, targetIndex, tabsContainer) {
1298
+ async onDrop(e, targetTabIndex, tabsContainer) {
1289
1299
  EventHelper.stop(e, true);
1290
1300
  this.updateDropFeedback(tabsContainer, false);
1291
1301
  tabsContainer.classList.remove('scroll');
1302
+ const targetEditorIndex = this.tabsModel instanceof UnstickyEditorGroupModel ? targetTabIndex + this.groupView.stickyCount : targetTabIndex;
1303
+ const options = {
1304
+ sticky: this.tabsModel instanceof StickyEditorGroupModel && this.tabsModel.stickyCount === targetEditorIndex,
1305
+ index: targetEditorIndex
1306
+ };
1292
1307
  if (this.groupTransfer.hasData(DraggedEditorGroupIdentifier.prototype)) {
1293
1308
  const data = this.groupTransfer.getData(DraggedEditorGroupIdentifier.prototype);
1294
1309
  if (Array.isArray(data)) {
1295
- const sourceGroup = this.accessor.getGroup(data[0].identifier);
1310
+ const sourceGroup = this.groupsView.getGroup(data[0].identifier);
1296
1311
  if (sourceGroup) {
1297
- const mergeGroupOptions = { index: targetIndex };
1312
+ const mergeGroupOptions = { index: targetEditorIndex };
1298
1313
  if (!this.isMoveOperation(e, sourceGroup.id)) {
1299
1314
  mergeGroupOptions.mode = 0 ;
1300
1315
  }
1301
- this.accessor.mergeGroup(sourceGroup, this.group, mergeGroupOptions);
1316
+ this.groupsView.mergeGroup(sourceGroup, this.groupView, mergeGroupOptions);
1302
1317
  }
1303
- this.group.focus();
1318
+ this.groupView.focus();
1304
1319
  this.groupTransfer.clearData(DraggedEditorGroupIdentifier.prototype);
1305
1320
  }
1306
1321
  }
@@ -1308,16 +1323,16 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1308
1323
  const data = this.editorTransfer.getData(DraggedEditorIdentifier.prototype);
1309
1324
  if (Array.isArray(data)) {
1310
1325
  const draggedEditor = data[0].identifier;
1311
- const sourceGroup = this.accessor.getGroup(draggedEditor.groupId);
1326
+ const sourceGroup = this.groupsView.getGroup(draggedEditor.groupId);
1312
1327
  if (sourceGroup) {
1313
1328
  if (this.isMoveOperation(e, draggedEditor.groupId, draggedEditor.editor)) {
1314
- sourceGroup.moveEditor(draggedEditor.editor, this.group, { index: targetIndex });
1329
+ sourceGroup.moveEditor(draggedEditor.editor, this.groupView, options);
1315
1330
  }
1316
1331
  else {
1317
- sourceGroup.copyEditor(draggedEditor.editor, this.group, { index: targetIndex });
1332
+ sourceGroup.copyEditor(draggedEditor.editor, this.groupView, options);
1318
1333
  }
1319
1334
  }
1320
- this.group.focus();
1335
+ this.groupView.focus();
1321
1336
  this.editorTransfer.clearData(DraggedEditorIdentifier.prototype);
1322
1337
  }
1323
1338
  }
@@ -1330,17 +1345,17 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1330
1345
  if (dataTransferItem) {
1331
1346
  const treeDropData = await extractTreeDropData(dataTransferItem);
1332
1347
  editors.push(...( treeDropData.map(
1333
- editor => ({ ...editor, options: { ...editor.options, pinned: true, index: targetIndex } })
1348
+ editor => ({ ...editor, options: { ...editor.options, pinned: true, index: targetEditorIndex } })
1334
1349
  )));
1335
1350
  }
1336
1351
  }
1337
- this.editorService.openEditors(editors, this.group, { validateTrust: true });
1352
+ this.editorService.openEditors(editors, this.groupView, { validateTrust: true });
1338
1353
  }
1339
1354
  this.treeItemsTransfer.clearData(DraggedTreeItemsIdentifier.prototype);
1340
1355
  }
1341
1356
  else {
1342
1357
  const dropHandler = this.instantiationService.createInstance(ResourcesDropHandler, { allowWorkspaceOpen: false });
1343
- dropHandler.handleDrop(e, () => this.group, () => this.group.focus(), targetIndex);
1358
+ dropHandler.handleDrop(e, () => this.groupView, () => this.groupView.focus(), options);
1344
1359
  }
1345
1360
  }
1346
1361
  isMoveOperation(e, sourceGroup, sourceEditor) {
@@ -1348,30 +1363,28 @@ let TabsTitleControl = class TabsTitleControl extends TitleControl {
1348
1363
  return true;
1349
1364
  }
1350
1365
  const isCopy = (e.ctrlKey && !isMacintosh) || (e.altKey && isMacintosh);
1351
- return !isCopy || sourceGroup === this.group.id;
1366
+ return (!isCopy || sourceGroup === this.groupView.id);
1352
1367
  }
1353
1368
  dispose() {
1354
1369
  super.dispose();
1355
1370
  this.tabDisposables = dispose(this.tabDisposables);
1356
1371
  }
1357
1372
  };
1358
- TabsTitleControl = TabsTitleControl_1 = ( __decorate([
1359
- ( __param(3, IContextMenuService)),
1360
- ( __param(4, IInstantiationService)),
1361
- ( __param(5, IContextKeyService)),
1362
- ( __param(6, IKeybindingService)),
1363
- ( __param(7, INotificationService)),
1364
- ( __param(8, IMenuService)),
1365
- ( __param(9, IQuickInputService)),
1366
- ( __param(10, IThemeService)),
1367
- ( __param(11, IConfigurationService)),
1368
- ( __param(12, IFileService)),
1369
- ( __param(13, IEditorService)),
1370
- ( __param(14, IPathService)),
1371
- ( __param(15, IEditorGroupsService)),
1372
- ( __param(16, ITreeViewsDnDService)),
1373
- ( __param(17, IEditorResolverService))
1374
- ], TabsTitleControl));
1373
+ MultiEditorTabsControl = MultiEditorTabsControl_1 = ( __decorate([
1374
+ ( __param(4, IContextMenuService)),
1375
+ ( __param(5, IInstantiationService)),
1376
+ ( __param(6, IContextKeyService)),
1377
+ ( __param(7, IKeybindingService)),
1378
+ ( __param(8, INotificationService)),
1379
+ ( __param(9, IMenuService)),
1380
+ ( __param(10, IQuickInputService)),
1381
+ ( __param(11, IThemeService)),
1382
+ ( __param(12, IEditorService)),
1383
+ ( __param(13, IPathService)),
1384
+ ( __param(14, IEditorGroupsService)),
1385
+ ( __param(15, ITreeViewsDnDService)),
1386
+ ( __param(16, IEditorResolverService))
1387
+ ], MultiEditorTabsControl));
1375
1388
  registerThemingParticipant((theme, collector) => {
1376
1389
  const borderColor = theme.getColor(TAB_BORDER);
1377
1390
  if (borderColor) {
@@ -1568,4 +1581,4 @@ registerThemingParticipant((theme, collector) => {
1568
1581
  }
1569
1582
  });
1570
1583
 
1571
- export { TabsTitleControl };
1584
+ export { MultiEditorTabsControl };