diff --git a/src/vs/workbench/browser/parts/editor/editor.ts b/src/vs/workbench/browser/parts/editor/editor.ts index 7434fe1b1cf..edeb87233fa 100644 --- a/src/vs/workbench/browser/parts/editor/editor.ts +++ b/src/vs/workbench/browser/parts/editor/editor.ts @@ -156,9 +156,4 @@ export interface EditorServiceImpl extends IEditorService { * Emitted when the list of most recently active editors change. */ readonly onDidMostRecentlyActiveEditorsChange: Event; - - /** - * Access to the list of most recently active editors. - */ - readonly mostRecentlyActiveEditors: ReadonlyArray; } diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index f0123947c0b..28cfc1b0ace 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Action } from 'vs/base/common/actions'; import { mixin } from 'vs/base/common/objects'; -import { IEditorInput, EditorInput, IEditorIdentifier, IEditorCommandsContext, CloseDirection, SaveReason } from 'vs/workbench/common/editor'; +import { IEditorInput, EditorInput, IEditorIdentifier, IEditorCommandsContext, CloseDirection, SaveReason, EditorsOrder } from 'vs/workbench/common/editor'; import { QuickOpenEntryGroup } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry, QuickOpenAction } from 'vs/workbench/browser/quickopen'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; @@ -16,7 +16,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { CLOSE_EDITOR_COMMAND_ID, NAVIGATE_ALL_EDITORS_BY_APPEARANCE_PREFIX, MOVE_ACTIVE_EDITOR_COMMAND_ID, NAVIGATE_IN_ACTIVE_GROUP_BY_MOST_RECENTLY_USED_PREFIX, ActiveEditorMoveArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, mergeAllGroups, NAVIGATE_ALL_EDITORS_BY_MOST_RECENTLY_USED_PREFIX } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { IEditorGroupsService, IEditorGroup, GroupsArrangement, EditorsOrder, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsArrangement, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { DisposableStore } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index df3eb524e89..edea4e3744d 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/editorgroupview'; import { EditorGroup, IEditorOpenOptions, EditorCloseEvent, ISerializedEditorGroup, isSerializedEditorGroup } from 'vs/workbench/common/editor/editorGroup'; -import { EditorInput, EditorOptions, GroupIdentifier, SideBySideEditorInput, CloseDirection, IEditorCloseEvent, EditorGroupActiveEditorDirtyContext, IEditor, EditorGroupEditorsCountContext, toResource, SideBySideEditor, SaveReason, SaveContext, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, GroupIdentifier, SideBySideEditorInput, CloseDirection, IEditorCloseEvent, EditorGroupActiveEditorDirtyContext, IEditor, EditorGroupEditorsCountContext, toResource, SideBySideEditor, SaveReason, SaveContext, IEditorPartOptionsChangeEvent, EditorsOrder } from 'vs/workbench/common/editor'; import { Event, Emitter, Relay } from 'vs/base/common/event'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { addClass, addClasses, Dimension, trackFocus, toggleClass, removeClass, addDisposableListener, EventType, EventHelper, findParentWithClass, clearNode, isAncestor } from 'vs/base/browser/dom'; @@ -17,7 +17,7 @@ import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, EDITOR_GROUP_HEADER_TABS_BORDER, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_EMPTY_BACKGROUND, EDITOR_GROUP_FOCUSED_EMPTY_BORDER } from 'vs/workbench/common/theme'; -import { IMoveEditorOptions, ICopyEditorOptions, ICloseEditorsFilter, IGroupChangeEvent, GroupChangeKind, EditorsOrder, GroupsOrder, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IMoveEditorOptions, ICopyEditorOptions, ICloseEditorsFilter, IGroupChangeEvent, GroupChangeKind, GroupsOrder, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; import { TabsTitleControl } from 'vs/workbench/browser/parts/editor/tabsTitleControl'; import { EditorControl } from 'vs/workbench/browser/parts/editor/editorControl'; import { IEditorProgressService } from 'vs/platform/progress/common/progress'; @@ -723,7 +723,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } get editors(): EditorInput[] { - return this._group.getEditors(); + return this._group.getEditors(EditorsOrder.SEQUENTIAL); } get count(): number { @@ -750,12 +750,8 @@ export class EditorGroupView extends Themable implements IEditorGroupView { return this._group.isActive(editor); } - getEditors(order?: EditorsOrder): EditorInput[] { - if (order === EditorsOrder.MOST_RECENTLY_ACTIVE) { - return this._group.getEditors(true); - } - - return this.editors; + getEditors(order: EditorsOrder): EditorInput[] { + return this._group.getEditors(order); } getEditorByIndex(index: number): EditorInput | undefined { @@ -1371,7 +1367,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const filter = editors; const hasDirection = typeof filter.direction === 'number'; - let editorsToClose = this._group.getEditors(!hasDirection /* in MRU order only if direction is not specified */); + let editorsToClose = this._group.getEditors(hasDirection ? EditorsOrder.SEQUENTIAL : EditorsOrder.MOST_RECENTLY_ACTIVE); // in MRU order only if direction is not specified // Filter: saved only if (filter.savedOnly) { @@ -1432,7 +1428,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } // Check for dirty and veto - const editors = this._group.getEditors(true); + const editors = this._group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); const veto = await this.handleDirtyClosing(editors.slice(0)); if (veto) { return; diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index 022e5258ed0..65fa73bcb34 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -13,12 +13,11 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/modelService'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup, EditorsOrder, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { toResource, SideBySideEditor, IEditorInput } from 'vs/workbench/common/editor'; +import { toResource, SideBySideEditor, IEditorInput, EditorsOrder } from 'vs/workbench/common/editor'; import { compareItemsByScore, scoreItem, ScorerCache, prepareQuery } from 'vs/base/parts/quickopen/common/quickOpenScorer'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; export class EditorPickerEntry extends QuickOpenEntryGroup { @@ -209,14 +208,13 @@ export abstract class BaseAllEditorsPicker extends BaseEditorPicker { constructor( @IInstantiationService instantiationService: IInstantiationService, @IEditorService editorService: IEditorService, - @IEditorGroupsService editorGroupService: IEditorGroupsService, - @IHistoryService protected historyService: IHistoryService + @IEditorGroupsService editorGroupService: IEditorGroupsService ) { super(instantiationService, editorService, editorGroupService); } protected count(): number { - return this.historyService.getMostRecentlyUsedOpenEditors().length; + return this.editorService.count; } getEmptyLabel(searchString: string): string { @@ -262,7 +260,7 @@ export class AllEditorsByMostRecentlyUsedPicker extends BaseAllEditorsPicker { protected getEditorEntries(): EditorPickerEntry[] { const entries: EditorPickerEntry[] = []; - for (const { editor, groupId } of this.historyService.getMostRecentlyUsedOpenEditors()) { + for (const { editor, groupId } of this.editorService.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)) { entries.push(this.instantiationService.createInstance(EditorPickerEntry, editor, this.editorGroupService.getGroup(groupId)!)); } diff --git a/src/vs/workbench/browser/parts/editor/editorsObserver.ts b/src/vs/workbench/browser/parts/editor/editorsObserver.ts index c15fa2c10bb..e888b274b2f 100644 --- a/src/vs/workbench/browser/parts/editor/editorsObserver.ts +++ b/src/vs/workbench/browser/parts/editor/editorsObserver.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEditorInput, IEditorInputFactoryRegistry, IEditorIdentifier, GroupIdentifier, Extensions, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditorInputFactoryRegistry, IEditorIdentifier, GroupIdentifier, Extensions, IEditorPartOptionsChangeEvent, EditorsOrder } from 'vs/workbench/common/editor'; import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; import { Event, Emitter } from 'vs/base/common/event'; -import { IEditorGroupsService, IEditorGroup, EditorsOrder, GroupChangeKind, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupChangeKind, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { coalesce } from 'vs/base/common/arrays'; import { LinkedMap, Touch } from 'vs/base/common/map'; import { equals } from 'vs/base/common/objects'; @@ -41,6 +41,10 @@ export class EditorsObserver extends Disposable { private readonly _onDidChange = this._register(new Emitter()); readonly onDidChange = this._onDidChange.event; + get count(): number { + return this.mostRecentEditorsMap.size; + } + get editors(): IEditorIdentifier[] { return this.mostRecentEditorsMap.values(); } diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index d1b3ef8d803..7f8dc048690 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -1327,3 +1327,16 @@ export async function pathsToEditors(paths: IPathData[] | undefined, fileService return coalesce(editors); } + +export const enum EditorsOrder { + + /** + * Editors sorted by most recent activity (most recent active first) + */ + MOST_RECENTLY_ACTIVE, + + /** + * Editors sorted by sequential order + */ + SEQUENTIAL +} diff --git a/src/vs/workbench/common/editor/editorGroup.ts b/src/vs/workbench/common/editor/editorGroup.ts index 6822bd68eda..0473aee2cbc 100644 --- a/src/vs/workbench/common/editor/editorGroup.ts +++ b/src/vs/workbench/common/editor/editorGroup.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { Extensions, IEditorInputFactoryRegistry, EditorInput, IEditorIdentifier, IEditorCloseEvent, GroupIdentifier, CloseDirection, SideBySideEditorInput, IEditorInput } from 'vs/workbench/common/editor'; +import { Extensions, IEditorInputFactoryRegistry, EditorInput, IEditorIdentifier, IEditorCloseEvent, GroupIdentifier, CloseDirection, SideBySideEditorInput, IEditorInput, EditorsOrder } from 'vs/workbench/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { dispose, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -130,8 +130,8 @@ export class EditorGroup extends Disposable { return this.editors.length; } - getEditors(mru?: boolean): EditorInput[] { - return mru ? this.mru.slice(0) : this.editors.slice(0); + getEditors(order: EditorsOrder): EditorInput[] { + return order === EditorsOrder.MOST_RECENTLY_ACTIVE ? this.mru.slice(0) : this.editors.slice(0); } getEditorByIndex(index: number): EditorInput | undefined { diff --git a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts index 19054f498f3..cc5d10a70a4 100644 --- a/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts +++ b/src/vs/workbench/contrib/backup/test/electron-browser/backupRestorer.test.ts @@ -122,7 +122,7 @@ suite('BackupModelRestorer', () => { // Verify backups restored and opened as dirty await restorer.doRestoreBackups(); - assert.equal(editorService.editors.length, 4); + assert.equal(editorService.count, 4); assert.ok(editorService.editors.every(editor => editor.isDirty())); let counter = 0; diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index b837f81fa5d..bb781656124 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { URI } from 'vs/base/common/uri'; -import { toResource, IEditorCommandsContext, SideBySideEditor, IEditorIdentifier, SaveReason, SideBySideEditorInput } from 'vs/workbench/common/editor'; +import { toResource, IEditorCommandsContext, SideBySideEditor, IEditorIdentifier, SaveReason, SideBySideEditorInput, EditorsOrder } from 'vs/workbench/common/editor'; import { IWindowOpenable, IOpenWindowOptions, isWorkspaceToOpen, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -30,7 +30,7 @@ import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IEditorService, SIDE_GROUP, ISaveEditorsOptions } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, GroupsOrder, EditorsOrder, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, GroupsOrder, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ILabelService } from 'vs/platform/label/common/label'; import { basename, joinPath, isEqual } from 'vs/base/common/resources'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index a50defb71e3..90dbcef6583 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -5,7 +5,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IResourceInput, ITextEditorOptions, IEditorOptions, EditorActivation } from 'vs/platform/editor/common/editor'; -import { IEditorInput, IEditor, GroupIdentifier, IFileEditorInput, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInputFactoryRegistry, Extensions as EditorExtensions, IFileInputFactory, EditorInput, SideBySideEditorInput, IEditorInputWithOptions, isEditorInputWithOptions, EditorOptions, TextEditorOptions, IEditorIdentifier, IEditorCloseEvent, ITextEditor, ITextDiffEditor, ITextSideBySideEditor, toResource, SideBySideEditor, IRevertOptions, SaveReason } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditor, GroupIdentifier, IFileEditorInput, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInputFactoryRegistry, Extensions as EditorExtensions, IFileInputFactory, EditorInput, SideBySideEditorInput, IEditorInputWithOptions, isEditorInputWithOptions, EditorOptions, TextEditorOptions, IEditorIdentifier, IEditorCloseEvent, ITextEditor, ITextDiffEditor, ITextSideBySideEditor, toResource, SideBySideEditor, IRevertOptions, SaveReason, EditorsOrder } from 'vs/workbench/common/editor'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { Registry } from 'vs/platform/registry/common/platform'; import { ResourceMap } from 'vs/base/common/map'; @@ -17,7 +17,7 @@ import { URI } from 'vs/base/common/uri'; import { basename, isEqual } from 'vs/base/common/resources'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { localize } from 'vs/nls'; -import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection, EditorsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IResourceEditor, SIDE_GROUP, IResourceEditorReplacement, IOpenEditorOverrideHandler, IVisibleEditor, IEditorService, SIDE_GROUP_TYPE, ACTIVE_GROUP_TYPE, ISaveEditorsOptions, ISaveAllEditorsOptions, IRevertAllEditorsOptions, IBaseSaveRevertAllEditorOptions } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Disposable, IDisposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -186,19 +186,28 @@ export class EditorService extends Disposable implements EditorServiceImpl { return undefined; } + get count(): number { + return this.editorsObserver.count; + } + get editors(): IEditorInput[] { - const editors: IEditorInput[] = []; - this.editorGroupService.groups.forEach(group => { - editors.push(...group.editors); + return this.getEditors(EditorsOrder.SEQUENTIAL).map(({ editor }) => editor); + } + + getEditors(order: EditorsOrder): ReadonlyArray { + if (order === EditorsOrder.MOST_RECENTLY_ACTIVE) { + return this.editorsObserver.editors; + } + + const editors: IEditorIdentifier[] = []; + + this.editorGroupService.getGroups(GroupsOrder.GRID_APPEARANCE).forEach(group => { + editors.push(...group.getEditors(EditorsOrder.SEQUENTIAL).map(editor => ({ editor, groupId: group.id }))); }); return editors; } - get mostRecentlyActiveEditors(): IEditorIdentifier[] { - return this.editorsObserver.editors; - } - get activeEditor(): IEditorInput | undefined { const activeGroup = this.editorGroupService.activeGroup; @@ -834,6 +843,9 @@ export class DelegatingEditorService implements IEditorService { get visibleControls(): ReadonlyArray { return this.editorService.visibleControls; } get visibleTextEditorWidgets(): ReadonlyArray { return this.editorService.visibleTextEditorWidgets; } get editors(): ReadonlyArray { return this.editorService.editors; } + get count(): number { return this.editorService.count; } + + getEditors(order: EditorsOrder): ReadonlyArray { return this.editorService.getEditors(order); } openEditors(editors: IEditorInputWithOptions[], group?: OpenInEditorGroup): Promise; openEditors(editors: IResourceEditor[], group?: OpenInEditorGroup): Promise; diff --git a/src/vs/workbench/services/editor/common/editorGroupsService.ts b/src/vs/workbench/services/editor/common/editorGroupsService.ts index a86ff3eca5a..ab64d9085c7 100644 --- a/src/vs/workbench/services/editor/common/editorGroupsService.ts +++ b/src/vs/workbench/services/editor/common/editorGroupsService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorInput, IEditor, GroupIdentifier, IEditorInputWithOptions, CloseDirection, IEditorPartOptions, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditor, GroupIdentifier, IEditorInputWithOptions, CloseDirection, IEditorPartOptions, IEditorPartOptionsChangeEvent, EditorsOrder } from 'vs/workbench/common/editor'; import { IEditorOptions, ITextEditorOptions, IResourceInput } from 'vs/platform/editor/common/editor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IVisibleEditor } from 'vs/workbench/services/editor/common/editorService'; @@ -134,19 +134,6 @@ export const enum GroupsOrder { GRID_APPEARANCE } -export const enum EditorsOrder { - - /** - * Editors sorted by most recent activity (most recent active first) - */ - MOST_RECENTLY_ACTIVE, - - /** - * Editors sorted by sequential order - */ - SEQUENTIAL -} - export interface IEditorGroupsService { _serviceBrand: undefined; @@ -224,11 +211,11 @@ export interface IEditorGroupsService { readonly willRestoreEditors: boolean; /** - * Get all groups that are currently visible in the editor area optionally - * sorted by being most recent active or grid order. Will sort by creation - * time by default (oldest group first). + * Get all groups that are currently visible in the editor area. + * + * @param order the order of the editors to use */ - getGroups(order?: GroupsOrder): ReadonlyArray; + getGroups(order: GroupsOrder): ReadonlyArray; /** * Allows to convert a group identifier to a group. @@ -433,16 +420,16 @@ export interface IEditorGroup { readonly count: number; /** - * All opened editors in the group. There can only be one editor active. + * All opened editors in the group in sequential order of their appearance. */ readonly editors: ReadonlyArray; /** - * Get all editors that are currently opened in the group optionally - * sorted by being most recent active. Will sort by sequential appearance - * by default (from left to right). + * Get all editors that are currently opened in the group. + * + * @param order the order of the editors to use */ - getEditors(order?: EditorsOrder): ReadonlyArray; + getEditors(order: EditorsOrder): ReadonlyArray; /** * Returns the editor at a specific index of the group. diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index 6eb6cd569cc..ecc324078b4 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -5,7 +5,7 @@ import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IResourceInput, IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEditorInput, IEditor, GroupIdentifier, IEditorInputWithOptions, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, ITextEditor, ITextDiffEditor, ITextSideBySideEditor, IEditorIdentifier, ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditor, GroupIdentifier, IEditorInputWithOptions, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, ITextEditor, ITextDiffEditor, ITextSideBySideEditor, IEditorIdentifier, ISaveOptions, IRevertOptions, EditorsOrder } from 'vs/workbench/common/editor'; import { Event } from 'vs/base/common/event'; import { IEditor as ICodeEditor, IDiffEditor } from 'vs/editor/common/editorCommon'; import { IEditorGroup, IEditorReplacement } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -123,11 +123,26 @@ export interface IEditorService { readonly visibleTextEditorWidgets: ReadonlyArray; /** - * All editors that are opened across all editor groups. This includes active as well as inactive - * editors in each editor group. + * All editors that are opened across all editor groups in sequential order + * of appearance. + * + * This includes active as well as inactive editors in each editor group. */ readonly editors: ReadonlyArray; + /** + * The total number of editors that are opened either inactive or active. + */ + readonly count: number; + + /** + * All editors that are opened across all editor groups with their group + * identifier. + * + * @param order the order of the editors to use + */ + getEditors(order: EditorsOrder): ReadonlyArray; + /** * Open an editor in an editor group. * diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index abf37eb4fd6..1d5cb41cc69 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -6,9 +6,9 @@ import * as assert from 'assert'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; -import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupChangeKind, EditorsOrder, GroupLocation } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupChangeKind, GroupLocation } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { EditorInput, IFileEditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorExtensions, EditorOptions, CloseDirection, IEditorPartOptions } from 'vs/workbench/common/editor'; +import { EditorInput, IFileEditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorExtensions, EditorOptions, CloseDirection, IEditorPartOptions, EditorsOrder } from 'vs/workbench/common/editor'; import { IEditorModel } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -468,7 +468,7 @@ suite('EditorGroupsService', () => { assert.equal(group.activeEditor, input); assert.ok(group.activeControl instanceof TestEditorControl); - assert.equal(group.editors.length, 2); + assert.equal(group.count, 2); const mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input); diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index 11aab22bc60..dccd154b670 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EditorActivation, IEditorModel } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { EditorInput, EditorOptions, IFileEditorInput, GroupIdentifier, ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, IFileEditorInput, GroupIdentifier, ISaveOptions, IRevertOptions, EditorsOrder } from 'vs/workbench/common/editor'; import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; @@ -156,6 +156,9 @@ suite('EditorService', () => { assert.ok(editor instanceof TestEditorControl); assert.equal(editor, service.activeControl); + assert.equal(1, service.count); + assert.equal(input, service.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].editor); + assert.equal(input, service.getEditors(EditorsOrder.SEQUENTIAL)[0].editor); assert.equal(input, service.activeEditor); assert.equal(service.visibleControls.length, 1); assert.equal(service.visibleControls[0], editor); @@ -169,6 +172,9 @@ suite('EditorService', () => { // Close input await editor!.group!.closeEditor(input); + assert.equal(0, service.count); + assert.equal(0, service.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length); + assert.equal(0, service.getEditors(EditorsOrder.SEQUENTIAL).length); assert.equal(didCloseEditorListenerCounter, 1); assert.equal(activeEditorChangeEventCounter, 2); assert.equal(visibleEditorChangeEventCounter, 2); @@ -178,6 +184,11 @@ suite('EditorService', () => { await service.openEditor(input, { pinned: true }); editor = await service.openEditor(otherInput, { pinned: true }); + assert.equal(2, service.count); + assert.equal(otherInput, service.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].editor); + assert.equal(input, service.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].editor); + assert.equal(input, service.getEditors(EditorsOrder.SEQUENTIAL)[0].editor); + assert.equal(otherInput, service.getEditors(EditorsOrder.SEQUENTIAL)[1].editor); assert.equal(service.visibleControls.length, 1); assert.equal(service.isOpen(input), true); assert.equal(service.isOpen(otherInput), true); diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index 9d38b5e6747..02ca4db033b 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -7,7 +7,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IEditor } from 'vs/editor/common/editorCommon'; import { ITextEditorOptions, IResourceInput, ITextEditorSelection } from 'vs/platform/editor/common/editor'; -import { IEditorInput, IEditor as IBaseEditor, Extensions as EditorExtensions, EditorInput, IEditorCloseEvent, IEditorInputFactoryRegistry, toResource, IEditorIdentifier, GroupIdentifier } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditor as IBaseEditor, Extensions as EditorExtensions, EditorInput, IEditorCloseEvent, IEditorInputFactoryRegistry, toResource, IEditorIdentifier, GroupIdentifier, EditorsOrder } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { FileChangesEvent, IFileService, FileChangeType, FILES_EXCLUDE_CONFIG } from 'vs/platform/files/common/files'; @@ -18,7 +18,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { Registry } from 'vs/platform/registry/common/platform'; import { Event } from 'vs/base/common/event'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IEditorGroupsService, EditorsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { getExcludes, ISearchConfiguration } from 'vs/workbench/services/search/common/search'; import { IExpression } from 'vs/base/common/glob'; @@ -1023,7 +1023,7 @@ export class HistoryService extends Disposable implements IHistoryService { // Across groups if (!group) { - editors = this.recentlyUsedEditorsStack || this.editorService.mostRecentlyActiveEditors; + editors = this.recentlyUsedEditorsStack || this.editorService.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); index = this.recentlyUsedEditorsStackIndex; } @@ -1068,10 +1068,6 @@ export class HistoryService extends Disposable implements IHistoryService { } } - getMostRecentlyUsedOpenEditors(): ReadonlyArray { - return this.editorService.mostRecentlyActiveEditors; - } - //#endregion } diff --git a/src/vs/workbench/services/history/common/history.ts b/src/vs/workbench/services/history/common/history.ts index efb224beb2f..598a446f9df 100644 --- a/src/vs/workbench/services/history/common/history.ts +++ b/src/vs/workbench/services/history/common/history.ts @@ -5,7 +5,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IResourceInput } from 'vs/platform/editor/common/editor'; -import { IEditorInput, IEditorIdentifier, GroupIdentifier } from 'vs/workbench/common/editor'; +import { IEditorInput, GroupIdentifier } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; export const IHistoryService = createDecorator('historyService'); @@ -87,9 +87,4 @@ export interface IHistoryService { * @param group optional indicator to scope to a specific group. */ openPreviouslyUsedEditor(group?: GroupIdentifier): void; - - /** - * Get a list of most recently used editors that are open. - */ - getMostRecentlyUsedOpenEditors(): ReadonlyArray; } diff --git a/src/vs/workbench/test/common/editor/editorGroups.test.ts b/src/vs/workbench/test/common/editor/editorGroups.test.ts index 990b1fadbe3..ae3dad36505 100644 --- a/src/vs/workbench/test/common/editor/editorGroups.test.ts +++ b/src/vs/workbench/test/common/editor/editorGroups.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { EditorGroup, ISerializedEditorGroup, EditorCloseEvent } from 'vs/workbench/common/editor/editorGroup'; -import { Extensions as EditorExtensions, IEditorInputFactoryRegistry, EditorInput, IFileEditorInput, IEditorInputFactory, CloseDirection } from 'vs/workbench/common/editor'; +import { Extensions as EditorExtensions, IEditorInputFactoryRegistry, EditorInput, IFileEditorInput, IEditorInputFactory, CloseDirection, EditorsOrder } from 'vs/workbench/common/editor'; import { URI } from 'vs/base/common/uri'; import { TestLifecycleService, TestContextService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -307,7 +307,7 @@ suite('Workbench editor groups', () => { const events = groupListener(group); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); // Active && Pinned const input1 = input(); @@ -315,7 +315,7 @@ suite('Workbench editor groups', () => { assert.equal(openedEditor, input1); assert.equal(group.count, 1); - assert.equal(group.getEditors(true).length, 1); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 1); assert.equal(group.activeEditor, input1); assert.equal(group.isActive(input1), true); assert.equal(group.isPreview(input1), false); @@ -328,7 +328,7 @@ suite('Workbench editor groups', () => { let editor = group.closeEditor(input1); assert.equal(editor, input1); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[0].editor, input1); assert.equal(events.closed[0].index, 0); @@ -339,7 +339,7 @@ suite('Workbench editor groups', () => { group.openEditor(input2, { active: true, pinned: false }); assert.equal(group.count, 1); - assert.equal(group.getEditors(true).length, 1); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 1); assert.equal(group.activeEditor, input2); assert.equal(group.isActive(input2), true); assert.equal(group.isPreview(input2), true); @@ -351,7 +351,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input2); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[1].editor, input2); assert.equal(events.closed[1].index, 0); @@ -360,7 +360,7 @@ suite('Workbench editor groups', () => { editor = group.closeEditor(input2); assert.ok(!editor); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[1].editor, input2); @@ -369,7 +369,7 @@ suite('Workbench editor groups', () => { group.openEditor(input3, { active: false, pinned: true }); assert.equal(group.count, 1); - assert.equal(group.getEditors(true).length, 1); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 1); assert.equal(group.activeEditor, input3); assert.equal(group.isActive(input3), true); assert.equal(group.isPreview(input3), false); @@ -381,7 +381,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input3); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[2].editor, input3); @@ -390,7 +390,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input3); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[2].editor, input3); @@ -399,7 +399,7 @@ suite('Workbench editor groups', () => { group.openEditor(input4); assert.equal(group.count, 1); - assert.equal(group.getEditors(true).length, 1); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 1); assert.equal(group.activeEditor, input4); assert.equal(group.isActive(input4), true); assert.equal(group.isPreview(input4), true); @@ -411,7 +411,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input4); assert.equal(group.count, 0); - assert.equal(group.getEditors(true).length, 0); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 0); assert.equal(group.activeEditor, undefined); assert.equal(events.closed[3].editor, input4); }); @@ -436,7 +436,7 @@ suite('Workbench editor groups', () => { group.openEditor(input3, { pinned: true, active: true }); assert.equal(group.count, 3); - assert.equal(group.getEditors(true).length, 3); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 3); assert.equal(group.activeEditor, input3); assert.equal(group.isActive(input1), false); assert.equal(group.isPinned(input1), true); @@ -456,7 +456,7 @@ suite('Workbench editor groups', () => { assert.equal(events.activated[1], input2); assert.equal(events.activated[2], input3); - const mru = group.getEditors(true); + const mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input3); assert.equal(mru[1], input2); assert.equal(mru[2], input1); @@ -496,12 +496,12 @@ suite('Workbench editor groups', () => { group.openEditor(input2, { pinned: true, active: true }); group.openEditor(input3, { pinned: true, active: true }); - assert.equal(input3, group.getEditors()[2]); + assert.equal(input3, group.getEditors(EditorsOrder.SEQUENTIAL)[2]); const input4 = input(); group.openEditor(input4, { pinned: false, active: true }); // this should cause the preview editor to move after input3 - assert.equal(input4, group.getEditors()[2]); + assert.equal(input4, group.getEditors(EditorsOrder.SEQUENTIAL)[2]); }); test('Multiple Editors - Pinned and Active (DEFAULT_OPEN_EDITOR_DIRECTION = Direction.LEFT)', function () { @@ -528,9 +528,9 @@ suite('Workbench editor groups', () => { group.openEditor(input2, { pinned: true, active: true }); group.openEditor(input3, { pinned: true, active: true }); - assert.equal(group.getEditors()[0], input3); - assert.equal(group.getEditors()[1], input2); - assert.equal(group.getEditors()[2], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input1); group.closeAllEditors(); @@ -551,7 +551,7 @@ suite('Workbench editor groups', () => { group.openEditor(input3, { pinned: true }); assert.equal(group.count, 3); - assert.equal(group.getEditors(true).length, 3); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 3); assert.equal(group.activeEditor, input1); assert.equal(group.isActive(input1), true); assert.equal(group.isPinned(input1), true); @@ -566,7 +566,7 @@ suite('Workbench editor groups', () => { assert.equal(group.isPinned(2), true); assert.equal(group.isPreview(input3), false); - const mru = group.getEditors(true); + const mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input1); assert.equal(mru[1], input3); assert.equal(mru[2], input2); @@ -586,7 +586,7 @@ suite('Workbench editor groups', () => { group.openEditor(input3); // overwrites preview assert.equal(group.count, 1); - assert.equal(group.getEditors(true).length, 1); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE).length, 1); assert.equal(group.activeEditor, input3); assert.equal(group.isActive(input3), true); assert.equal(group.isPinned(input3), false); @@ -600,7 +600,7 @@ suite('Workbench editor groups', () => { assert.equal(events.closed[0].replaced, true); assert.equal(events.closed[1].replaced, true); - const mru = group.getEditors(true); + const mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input3); assert.equal(mru.length, 1); }); @@ -619,7 +619,7 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor, input3); - let mru = group.getEditors(true); + let mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input3); assert.equal(mru[1], input2); assert.equal(mru[2], input1); @@ -634,7 +634,7 @@ suite('Workbench editor groups', () => { assert.equal(group.isActive(input2), false); assert.equal(group.isActive(input3), false); - mru = group.getEditors(true); + mru = group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE); assert.equal(mru[0], input1); assert.equal(mru[1], input3); assert.equal(mru[2], input2); @@ -677,8 +677,8 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor, input3); assert.equal(group.count, 2); // 2 previews got merged into one - assert.equal(group.getEditors()[0], input2); - assert.equal(group.getEditors()[1], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input3); assert.equal(events.closed[0].editor, input1); assert.equal(group.count, 2); @@ -686,7 +686,7 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor, input3); assert.equal(group.count, 1); // pinning replaced the preview - assert.equal(group.getEditors()[0], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input3); assert.equal(events.closed[1].editor, input2); assert.equal(group.count, 1); }); @@ -708,7 +708,7 @@ suite('Workbench editor groups', () => { group.openEditor(input5, { pinned: true, active: true }); assert.equal(group.activeEditor, input5); - assert.equal(group.getEditors(true)[0], input5); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0], input5); assert.equal(group.count, 5); group.closeEditor(input5); @@ -767,7 +767,7 @@ suite('Workbench editor groups', () => { group.openEditor(input5, { pinned: true, active: true }); assert.equal(group.activeEditor, input5); - assert.equal(group.getEditors(true)[0], input5); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0], input5); assert.equal(group.count, 5); group.closeEditor(input5); @@ -814,8 +814,8 @@ suite('Workbench editor groups', () => { group.moveEditor(input1, 1); assert.equal(events.moved[0], input1); - assert.equal(group.getEditors()[0], input2); - assert.equal(group.getEditors()[1], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input1); group.setActive(input1); group.openEditor(input3, { pinned: true, active: true }); @@ -825,20 +825,20 @@ suite('Workbench editor groups', () => { group.moveEditor(input4, 0); assert.equal(events.moved[1], input4); - assert.equal(group.getEditors()[0], input4); - assert.equal(group.getEditors()[1], input2); - assert.equal(group.getEditors()[2], input1); - assert.equal(group.getEditors()[3], input3); - assert.equal(group.getEditors()[4], input5); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input4); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[3], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[4], input5); group.moveEditor(input4, 3); group.moveEditor(input2, 1); - assert.equal(group.getEditors()[0], input1); - assert.equal(group.getEditors()[1], input2); - assert.equal(group.getEditors()[2], input3); - assert.equal(group.getEditors()[3], input4); - assert.equal(group.getEditors()[4], input5); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[3], input4); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[4], input5); }); test('Multiple Editors - move editor across groups', function () { @@ -858,9 +858,9 @@ suite('Workbench editor groups', () => { group1.openEditor(g2_input1, { active: true, pinned: true, index: 1 }); assert.equal(group1.count, 3); - assert.equal(group1.getEditors()[0], g1_input1); - assert.equal(group1.getEditors()[1], g2_input1); - assert.equal(group1.getEditors()[2], g1_input2); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[0], g1_input1); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[1], g2_input1); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[2], g1_input2); }); test('Multiple Editors - move editor across groups (input already exists in group 1)', function () { @@ -882,9 +882,9 @@ suite('Workbench editor groups', () => { group1.openEditor(g2_input1, { active: true, pinned: true, index: 0 }); assert.equal(group1.count, 3); - assert.equal(group1.getEditors()[0], g1_input2); - assert.equal(group1.getEditors()[1], g1_input1); - assert.equal(group1.getEditors()[2], g1_input3); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[0], g1_input2); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[1], g1_input1); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[2], g1_input3); }); test('Multiple Editors - Pinned & Non Active', function () { @@ -894,24 +894,24 @@ suite('Workbench editor groups', () => { group.openEditor(input1); assert.equal(group.activeEditor, input1); assert.equal(group.previewEditor, input1); - assert.equal(group.getEditors()[0], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input1); assert.equal(group.count, 1); const input2 = input(); group.openEditor(input2, { pinned: true, active: false }); assert.equal(group.activeEditor, input1); assert.equal(group.previewEditor, input1); - assert.equal(group.getEditors()[0], input1); - assert.equal(group.getEditors()[1], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input2); assert.equal(group.count, 2); const input3 = input(); group.openEditor(input3, { pinned: true, active: false }); assert.equal(group.activeEditor, input1); assert.equal(group.previewEditor, input1); - assert.equal(group.getEditors()[0], input1); - assert.equal(group.getEditors()[1], input3); - assert.equal(group.getEditors()[2], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input2); assert.equal(group.isPinned(input1), false); assert.equal(group.isPinned(input2), true); assert.equal(group.isPinned(input3), true); @@ -951,9 +951,9 @@ suite('Workbench editor groups', () => { group.closeEditors(group.activeEditor!, CloseDirection.LEFT); assert.equal(group.activeEditor, input3); assert.equal(group.count, 3); - assert.equal(group.getEditors()[0], input3); - assert.equal(group.getEditors()[1], input4); - assert.equal(group.getEditors()[2], input5); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input4); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input5); group.closeAllEditors(); group.openEditor(input1, { active: true, pinned: true }); @@ -968,9 +968,9 @@ suite('Workbench editor groups', () => { group.closeEditors(group.activeEditor!, CloseDirection.RIGHT); assert.equal(group.activeEditor, input3); assert.equal(group.count, 3); - assert.equal(group.getEditors()[0], input1); - assert.equal(group.getEditors()[1], input2); - assert.equal(group.getEditors()[2], input3); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], input1); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], input2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[2], input3); }); test('Multiple Editors - real user example', function () { @@ -982,7 +982,7 @@ suite('Workbench editor groups', () => { assert.equal(openedEditor, indexHtml); assert.equal(group.activeEditor, indexHtml); assert.equal(group.previewEditor, indexHtml); - assert.equal(group.getEditors()[0], indexHtml); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], indexHtml); assert.equal(group.count, 1); // /index.html/ -> /index.html/ @@ -991,7 +991,7 @@ suite('Workbench editor groups', () => { assert.equal(openedEditor, indexHtml); assert.equal(group.activeEditor, indexHtml); assert.equal(group.previewEditor, indexHtml); - assert.equal(group.getEditors()[0], indexHtml); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], indexHtml); assert.equal(group.count, 1); // /index.html/ -> /style.css/ @@ -1000,7 +1000,7 @@ suite('Workbench editor groups', () => { assert.equal(openedEditor, styleCss); assert.equal(group.activeEditor, styleCss); assert.equal(group.previewEditor, styleCss); - assert.equal(group.getEditors()[0], styleCss); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], styleCss); assert.equal(group.count, 1); // /style.css/ -> [/style.css/, test.js] @@ -1011,8 +1011,8 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor, testJs); assert.equal(group.isPreview(styleCss), true); assert.equal(group.isPinned(testJs), true); - assert.equal(group.getEditors()[0], styleCss); - assert.equal(group.getEditors()[1], testJs); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], styleCss); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], testJs); assert.equal(group.count, 2); // [/style.css/, test.js] -> [test.js, /index.html/] @@ -1022,8 +1022,8 @@ suite('Workbench editor groups', () => { assert.equal(group.previewEditor, indexHtml2); assert.equal(group.isPreview(indexHtml2), true); assert.equal(group.isPinned(testJs), true); - assert.equal(group.getEditors()[0], testJs); - assert.equal(group.getEditors()[1], indexHtml2); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[0], testJs); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], indexHtml2); assert.equal(group.count, 2); // make test.js active @@ -1060,9 +1060,9 @@ suite('Workbench editor groups', () => { group.openEditor(otherTs, { active: true }); assert.equal(group.count, 3); assert.equal(group.activeEditor, otherTs); - assert.ok(group.getEditors()[0].matches(testJs)); - assert.equal(group.getEditors()[1], otherTs); - assert.ok(group.getEditors()[2].matches(indexHtml)); + assert.ok(group.getEditors(EditorsOrder.SEQUENTIAL)[0].matches(testJs)); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], otherTs); + assert.ok(group.getEditors(EditorsOrder.SEQUENTIAL)[2].matches(indexHtml)); // make index.html active const indexHtml4 = input('index.html'); @@ -1073,20 +1073,20 @@ suite('Workbench editor groups', () => { group.closeEditor(indexHtml); assert.equal(group.count, 2); assert.equal(group.activeEditor, otherTs); - assert.ok(group.getEditors()[0].matches(testJs)); - assert.equal(group.getEditors()[1], otherTs); + assert.ok(group.getEditors(EditorsOrder.SEQUENTIAL)[0].matches(testJs)); + assert.equal(group.getEditors(EditorsOrder.SEQUENTIAL)[1], otherTs); // [test.js, /other.ts/] -> [test.js] group.closeEditor(otherTs); assert.equal(group.count, 1); assert.equal(group.activeEditor, testJs); - assert.ok(group.getEditors()[0].matches(testJs)); + assert.ok(group.getEditors(EditorsOrder.SEQUENTIAL)[0].matches(testJs)); // [test.js] -> /test.js/ group.unpin(testJs); assert.equal(group.count, 1); assert.equal(group.activeEditor, testJs); - assert.ok(group.getEditors()[0].matches(testJs)); + assert.ok(group.getEditors(EditorsOrder.SEQUENTIAL)[0].matches(testJs)); assert.equal(group.isPinned(testJs), false); assert.equal(group.isPreview(testJs), true); @@ -1173,13 +1173,13 @@ suite('Workbench editor groups', () => { assert.equal(group1.previewEditor!.matches(g1_input2), true); assert.equal(group2.previewEditor!.matches(g2_input2), true); - assert.equal(group1.getEditors(true)[0].matches(g1_input2), true); - assert.equal(group1.getEditors(true)[1].matches(g1_input3), true); - assert.equal(group1.getEditors(true)[2].matches(g1_input1), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(g1_input2), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(g1_input3), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[2].matches(g1_input1), true); - assert.equal(group2.getEditors(true)[0].matches(g2_input1), true); - assert.equal(group2.getEditors(true)[1].matches(g2_input3), true); - assert.equal(group2.getEditors(true)[2].matches(g2_input2), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(g2_input1), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(g2_input3), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[2].matches(g2_input2), true); // Create model again - should load from storage group1 = inst.createInstance(EditorGroup, group1.serialize()); @@ -1192,13 +1192,13 @@ suite('Workbench editor groups', () => { assert.equal(group1.previewEditor!.matches(g1_input2), true); assert.equal(group2.previewEditor!.matches(g2_input2), true); - assert.equal(group1.getEditors(true)[0].matches(g1_input2), true); - assert.equal(group1.getEditors(true)[1].matches(g1_input3), true); - assert.equal(group1.getEditors(true)[2].matches(g1_input1), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(g1_input2), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(g1_input3), true); + assert.equal(group1.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[2].matches(g1_input1), true); - assert.equal(group2.getEditors(true)[0].matches(g2_input1), true); - assert.equal(group2.getEditors(true)[1].matches(g2_input3), true); - assert.equal(group2.getEditors(true)[2].matches(g2_input2), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(g2_input1), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(g2_input3), true); + assert.equal(group2.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[2].matches(g2_input2), true); }); test('Single group, multiple editors - persist (some not persistable)', function () { @@ -1230,9 +1230,9 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor!.matches(nonSerializableInput2), true); assert.equal(group.previewEditor!.matches(nonSerializableInput2), true); - assert.equal(group.getEditors(true)[0].matches(nonSerializableInput2), true); - assert.equal(group.getEditors(true)[1].matches(serializableInput2), true); - assert.equal(group.getEditors(true)[2].matches(serializableInput1), true); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(nonSerializableInput2), true); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(serializableInput2), true); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[2].matches(serializableInput1), true); // Create model again - should load from storage group = inst.createInstance(EditorGroup, group.serialize()); @@ -1241,8 +1241,8 @@ suite('Workbench editor groups', () => { assert.equal(group.activeEditor!.matches(serializableInput2), true); assert.equal(group.previewEditor, null); - assert.equal(group.getEditors(true)[0].matches(serializableInput2), true); - assert.equal(group.getEditors(true)[1].matches(serializableInput1), true); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[0].matches(serializableInput2), true); + assert.equal(group.getEditors(EditorsOrder.MOST_RECENTLY_ACTIVE)[1].matches(serializableInput1), true); }); test('Multiple groups, multiple editors - persist (some not persistable, causes empty group)', function () { @@ -1277,8 +1277,8 @@ suite('Workbench editor groups', () => { group2 = inst.createInstance(EditorGroup, group2.serialize()); assert.equal(group1.count, 2); - assert.equal(group1.getEditors()[0].matches(serializableInput1), true); - assert.equal(group1.getEditors()[1].matches(serializableInput2), true); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[0].matches(serializableInput1), true); + assert.equal(group1.getEditors(EditorsOrder.SEQUENTIAL)[1].matches(serializableInput2), true); }); test('Multiple Editors - Editor Dispose', function () { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index bed812a691c..5863c631b1c 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -11,7 +11,7 @@ import * as resources from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import { IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, GroupIdentifier, EditorInput, EditorOptions } from 'vs/workbench/common/editor'; +import { IEditorInputWithOptions, CloseDirection, IEditorIdentifier, IUntitledTextResourceInput, IResourceDiffInput, IResourceSideBySideInput, IEditorInput, IEditor, IEditorCloseEvent, IEditorPartOptions, IRevertOptions, GroupIdentifier, EditorInput, EditorOptions, EditorsOrder } from 'vs/workbench/common/editor'; import { IEditorOpeningEvent, EditorServiceImpl, IEditorGroupView, IEditorGroupsAccessor } from 'vs/workbench/browser/parts/editor/editor'; import { Event, Emitter } from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; @@ -56,7 +56,7 @@ import { IExtensionService, NullExtensionService } from 'vs/workbench/services/e import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IDecorationsService, IResourceDecorationChangeEvent, IDecoration, IDecorationData, IDecorationsProvider } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { IEditorGroupsService, IEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement, IGroupChangeEvent, EditorsOrder, IFindGroupScope, EditorGroupLayout, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement, IGroupChangeEvent, IFindGroupScope, EditorGroupLayout, ICloseEditorOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, IOpenEditorOverrideHandler, IVisibleEditor, ISaveEditorsOptions, IRevertAllEditorsOptions, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; @@ -377,7 +377,6 @@ export class TestHistoryService implements IHistoryService { getHistory(): ReadonlyArray { return []; } openNextRecentlyUsedEditor(group?: GroupIdentifier): void { } openPreviouslyUsedEditor(group?: GroupIdentifier): void { } - getMostRecentlyUsedOpenEditors(): Array { return []; } getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined { return this.root; } getLastActiveFile(_schemeFilter: string): URI | undefined { return undefined; } openLastEditLocation(): void { } @@ -912,9 +911,12 @@ export class TestEditorService implements EditorServiceImpl { visibleControls: ReadonlyArray = []; visibleTextEditorWidgets = []; visibleEditors: ReadonlyArray = []; + count = this.editors.length; constructor(private editorGroupService?: IEditorGroupsService) { } + getEditors() { return []; } + overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable { return toDisposable(() => undefined); }