From 0593e5b600cca44c09f193769b2420f260691a85 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 29 Apr 2020 17:12:55 -0700 Subject: [PATCH] Make getEditorOverrides take a uri instead of a editor input Better fix for #96591 to also work correctly with notebooks In the explorer->open with command, we need to call `getEditorOverrides` but do not have a real editor input. Rather than creating a fake editor input, we should just take uri for `getEditorOverrides` --- src/vs/workbench/browser/contextkeys.ts | 2 +- .../contrib/customEditor/browser/customEditors.ts | 11 +++-------- src/vs/workbench/contrib/files/browser/fileActions.ts | 6 +++--- .../contrib/files/browser/views/explorerView.ts | 3 +-- src/vs/workbench/contrib/files/common/openWith.ts | 5 ++--- .../contrib/notebook/browser/notebook.contribution.ts | 9 +++------ .../services/editor/browser/editorService.ts | 8 ++++---- .../workbench/services/editor/common/editorService.ts | 5 +++-- .../workbench/test/browser/workbenchTestServices.ts | 2 +- 9 files changed, 21 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/browser/contextkeys.ts b/src/vs/workbench/browser/contextkeys.ts index 78755ab325eba..118699c1986c7 100644 --- a/src/vs/workbench/browser/contextkeys.ts +++ b/src/vs/workbench/browser/contextkeys.ts @@ -210,7 +210,7 @@ export class WorkbenchContextKeysHandler extends Disposable { this.activeEditorContext.set(activeEditorPane.getId()); this.activeEditorIsReadonly.set(activeEditorPane.input.isReadonly()); - const editors = this.editorService.getEditorOverrides(activeEditorPane.input, undefined, activeGroup); + const editors = activeEditorPane.input.resource ? this.editorService.getEditorOverrides(activeEditorPane.input.resource, undefined, activeGroup) : []; this.activeEditorAvailableEditorIds.set(editors.map(([_, entry]) => entry.id).join(',')); } else { this.activeEditorContext.reset(); diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts index 18fdf40a65ffc..a060d5d596918 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts @@ -426,19 +426,14 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo open: (editor, options, group, id) => { return this.onEditorOpening(editor, options, group, id); }, - getEditorOverrides: (editor: IEditorInput, _options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => { - const resource = editor.resource; - if (!resource) { - return []; - } - - const matchedEditor = group?.editors.find(editor => isEqual(editor.resource, resource)); + getEditorOverrides: (resource: URI, _options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => { + const currentEditor = group?.editors.find(editor => isEqual(editor.resource, resource)); const customEditors = this.customEditorService.getAllCustomEditors(resource); return customEditors.allEditors.map(entry => { return { id: entry.id, - active: matchedEditor instanceof CustomEditorInput && matchedEditor.viewType === entry.id, + active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id, label: entry.displayName, detail: entry.providerDisplayName, }; diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 84ed5a66d0d3b..cf5f62d2ad557 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -16,7 +16,7 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { VIEWLET_ID, IExplorerService, IFilesConfiguration, VIEW_ID } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService } from 'vs/platform/files/common/files'; -import { toResource, SideBySideEditor, IEditorInput } from 'vs/workbench/common/editor'; +import { toResource, SideBySideEditor } from 'vs/workbench/common/editor'; import { ExplorerViewPaneContainer } from 'vs/workbench/contrib/files/browser/explorerViewlet'; import { IQuickInputService, ItemActivation } from 'vs/platform/quickinput/common/quickInput'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; @@ -476,7 +476,7 @@ export class GlobalCompareResourcesAction extends Action { // Compare with next editor that opens const toDispose = this.editorService.overrideOpenEditor({ - getEditorOverrides: (editor: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { + getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { return []; }, open: editor => { @@ -570,7 +570,7 @@ export class ToggleEditorTypeCommand extends Action { const options = activeEditorPane.options; const group = activeEditorPane.group; - const overrides = getAllAvailableEditors(input, input.resource, options, group, this.editorService); + const overrides = getAllAvailableEditors(input.resource, options, group, this.editorService); const firstNonActiveOverride = overrides.find(([_, entry]) => !entry.active); if (!firstNonActiveOverride) { return; diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index a6fb47a046f85..415ed743c71f8 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -471,8 +471,7 @@ export class ExplorerView extends ViewPane { this.rootContext.set(!stat || (stat && stat.isRoot)); if (resource) { - const fileEditorInput = this.editorService.createEditorInput({ resource, forceFile: true }); - const overrides = this.editorService.getEditorOverrides(fileEditorInput, undefined, undefined); + const overrides = resource ? this.editorService.getEditorOverrides(resource, undefined, undefined) : []; this.availableEditorIdsContext.set(overrides.map(([, entry]) => entry.id).join(',')); } else { this.availableEditorIdsContext.reset(); diff --git a/src/vs/workbench/contrib/files/common/openWith.ts b/src/vs/workbench/contrib/files/common/openWith.ts index 081121ce4a33c..82d2c44a4f912 100644 --- a/src/vs/workbench/contrib/files/common/openWith.ts +++ b/src/vs/workbench/contrib/files/common/openWith.ts @@ -38,7 +38,7 @@ export async function openEditorWith( return; } - const allEditorOverrides = getAllAvailableEditors(input, resource, options, group, editorService); + const allEditorOverrides = getAllAvailableEditors(resource, options, group, editorService); if (!allEditorOverrides.length) { return; } @@ -115,13 +115,12 @@ export async function openEditorWith( * Get a list of all available editors, including the default text editor. */ export function getAllAvailableEditors( - input: IEditorInput, resource: URI, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, editorService: IEditorService, ): Array<[IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]> { - const overrides = editorService.getEditorOverrides(input, options, group); + const overrides = editorService.getEditorOverrides(resource, options, group); if (!overrides.some(([_, entry]) => entry.id === DEFAULT_EDITOR_ID)) { overrides.unshift([ { diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index 0a413ca9a1363..9e8f0d4c18580 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -107,11 +107,8 @@ export class NotebookContribution implements IWorkbenchContribution { ) { this.editorService.overrideOpenEditor({ - getEditorOverrides: (editor: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { - let resource = editor.resource; - if (!resource) { - return []; - } + getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { + const currentEditorForResource = group?.editors.find(editor => isEqual(editor.resource, resource)); const associatedEditors = distinct([ ...this.getUserAssociatedNotebookEditors(resource), @@ -122,7 +119,7 @@ export class NotebookContribution implements IWorkbenchContribution { return { label: info.displayName, id: info.id, - active: editor instanceof NotebookEditorInput && editor.viewType === info.id, + active: currentEditorForResource instanceof NotebookEditorInput && currentEditorForResource.viewType === info.id, detail: info.providerDisplayName }; }); diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 02376c6f3bc53..04b5286083455 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -480,10 +480,10 @@ export class EditorService extends Disposable implements EditorServiceImpl { return toDisposable(() => remove()); } - getEditorOverrides(editorInput: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] { + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] { const ret = []; for (const handler of this.openEditorHandlers) { - const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(editorInput, options, group).map(val => { return [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]; }) : []; + const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(resource, options, group).map(val => { return [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]; }) : []; ret.push(...handlers); } @@ -1165,8 +1165,8 @@ export class DelegatingEditorService implements IEditorService { @IEditorService private editorService: EditorService ) { } - getEditorOverrides(editorInput: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { - return this.editorService.getEditorOverrides(editorInput, options, group); + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { + return this.editorService.getEditorOverrides(resource, options, group); } openEditor(editor: IEditorInput, options?: IEditorOptions | ITextEditorOptions, group?: OpenInEditorGroup): Promise; diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index 76d51e27b4a31..a053a04cb041b 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -10,6 +10,7 @@ import { Event } from 'vs/base/common/event'; import { IEditor, IDiffEditor } from 'vs/editor/common/editorCommon'; import { IEditorGroup, IEditorReplacement } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; export const IEditorService = createDecorator('editorService'); @@ -35,7 +36,7 @@ export interface IOpenEditorOverrideEntry { export interface IOpenEditorOverrideHandler { open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, id?: string): IOpenEditorOverride | undefined; - getEditorOverrides?(editor: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[]; + getEditorOverrides?(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[]; } export interface IOpenEditorOverride { @@ -224,7 +225,7 @@ export interface IEditorService { /** * Get all available editor overrides for the editor input. */ - getEditorOverrides(editorInput: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][]; + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][]; /** * Allows to override the opening of editors by installing a handler that will diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index cc33cb1e6858b..874065977b834 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -632,7 +632,7 @@ export class TestEditorService implements EditorServiceImpl { constructor(private editorGroupService?: IEditorGroupsService) { } getEditors() { return []; } - getEditorOverrides(editorInput: IEditorInput, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] { return []; } + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] { return []; } overrideOpenEditor(_handler: IOpenEditorOverrideHandler): IDisposable { return toDisposable(() => undefined); } registerCustomEditorViewTypesHandler(source: string, handler: ICustomEditorViewTypesHandler): IDisposable { throw new Error('Method not implemented.');