diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts index 78cba9eadda0ab237004954822df5b16a43c0633..edf216c14d9ba0fcfcb07507f473060cebe62ee1 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts @@ -159,12 +159,16 @@ export class CustomFileEditorInput extends LazilyResolvedWebviewEditorInput { return this.fileDialogService.pickFileToSave({});//this.getSaveDialogOptions(defaultUri, availableFileSystems)); } - public handleMove(groupId: GroupIdentifier, uri: URI, options?: ITextEditorOptions): IEditorInput | undefined { - const webview = assertIsDefined(this.takeOwnershipOfWebview()); - return this.instantiationService.createInstance(CustomFileEditorInput, - uri, - this.viewType, - generateUuid(), - new Lazy(() => webview)); + public handleMove(_groupId: GroupIdentifier, uri: URI, options?: ITextEditorOptions): IEditorInput | undefined { + const editorInfo = this.customEditorService.getCustomEditor(this.viewType); + if (editorInfo?.matches(uri)) { + const webview = assertIsDefined(this.takeOwnershipOfWebview()); + return this.instantiationService.createInstance(CustomFileEditorInput, + uri, + this.viewType, + generateUuid(), + new Lazy(() => webview)); + } + return undefined; } } diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts index 9e87a796443c973651612949239f810cd4fcbbe6..ea3e9dcdaf15c32fa4bc3bc864a6115171f1845b 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { coalesce, distinct, find, mergeSort } from 'vs/base/common/arrays'; -import * as glob from 'vs/base/common/glob'; import { Lazy } from 'vs/base/common/lazy'; import { Disposable } from 'vs/base/common/lifecycle'; import { basename, isEqual } from 'vs/base/common/resources'; @@ -32,14 +31,14 @@ import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/wo import { CustomFileEditorInput } from './customEditorInput'; const defaultEditorId = 'default'; -const defaultEditorInfo: CustomEditorInfo = { +const defaultEditorInfo = new CustomEditorInfo({ id: defaultEditorId, displayName: nls.localize('promptOpenWith.defaultEditor', "VS Code's standard text editor"), selector: [ { filenamePattern: '*' } ], priority: CustomEditorPriority.default, -}; +}); export class CustomEditorInfoStore { private readonly contributedEditors = new Map(); @@ -64,7 +63,7 @@ export class CustomEditorInfoStore { public getContributedEditors(resource: URI): readonly CustomEditorInfo[] { return Array.from(this.contributedEditors.values()).filter(customEditor => - customEditor.selector.some(selector => matches(selector, resource))); + customEditor.matches(resource)); } } @@ -97,12 +96,12 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ for (const extension of extensions) { for (const webviewEditorContribution of extension.value) { - this._editorInfoStore.add({ + this._editorInfoStore.add(new CustomEditorInfo({ id: webviewEditorContribution.viewType, displayName: webviewEditorContribution.displayName, selector: webviewEditorContribution.selector || [], priority: webviewEditorContribution.priority || CustomEditorPriority.default, - }); + })); } } this.updateContexts(); @@ -127,6 +126,10 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ return { resource, viewType: activeInput.viewType }; } + public getCustomEditor(viewType: string): CustomEditorInfo | undefined { + return this._editorInfoStore.get(viewType); + } + public getContributedCustomEditors(resource: URI): readonly CustomEditorInfo[] { return this._editorInfoStore.getContributedEditors(resource); } @@ -134,7 +137,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ public getUserConfiguredCustomEditors(resource: URI): readonly CustomEditorInfo[] { const rawAssociations = this.configurationService.getValue(customEditorsAssociationsKey) || []; return coalesce(rawAssociations - .filter(association => matches(association, resource)) + .filter(association => CustomEditorInfo.selectorMatches(association, resource)) .map(association => this._editorInfoStore.get(association.viewType))); } @@ -405,16 +408,6 @@ function priorityToRank(priority: CustomEditorPriority): number { } } -function matches(selector: CustomEditorSelector, resource: URI): boolean { - if (selector.filenamePattern) { - if (glob.match(selector.filenamePattern.toLowerCase(), basename(resource).toLowerCase())) { - return true; - } - } - - return false; -} - registerThemingParticipant((theme, collector) => { const shadow = theme.getColor(colorRegistry.scrollbarShadow); if (shadow) { diff --git a/src/vs/workbench/contrib/customEditor/common/customEditor.ts b/src/vs/workbench/contrib/customEditor/common/customEditor.ts index 9162ab0e3d2e0efaa899e0a6f2b6d5160395a4bb..135ffc819b7eb5f2bc5d48635da546dae228b3db 100644 --- a/src/vs/workbench/contrib/customEditor/common/customEditor.ts +++ b/src/vs/workbench/contrib/customEditor/common/customEditor.ts @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; +import * as glob from 'vs/base/common/glob'; +import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { EditorInput, IEditor, ISaveOptions, IRevertOptions } from 'vs/workbench/common/editor'; +import { EditorInput, IEditor, IRevertOptions, ISaveOptions } from 'vs/workbench/common/editor'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IWorkingCopy } from 'vs/workbench/services/workingCopy/common/workingCopyService'; @@ -29,6 +31,7 @@ export interface ICustomEditorService { readonly activeCustomEditor: ICustomEditor | undefined; + getCustomEditor(viewType: string): CustomEditorInfo | undefined; getContributedCustomEditors(resource: URI): readonly CustomEditorInfo[]; getUserConfiguredCustomEditors(resource: URI): readonly CustomEditorInfo[]; @@ -87,9 +90,35 @@ export interface CustomEditorSelector { readonly filenamePattern?: string; } -export interface CustomEditorInfo { - readonly id: string; - readonly displayName: string; - readonly priority: CustomEditorPriority; - readonly selector: readonly CustomEditorSelector[]; +export class CustomEditorInfo { + + public readonly id: string; + public readonly displayName: string; + public readonly priority: CustomEditorPriority; + public readonly selector: readonly CustomEditorSelector[]; + + constructor(descriptor: { + readonly id: string; + readonly displayName: string; + readonly priority: CustomEditorPriority; + readonly selector: readonly CustomEditorSelector[]; + }) { + this.id = descriptor.id; + this.displayName = descriptor.displayName; + this.priority = descriptor.priority; + this.selector = descriptor.selector; + } + + matches(resource: URI): boolean { + return this.selector.some(selector => CustomEditorInfo.selectorMatches(selector, resource)); + } + + static selectorMatches(selector: CustomEditorSelector, resource: URI): boolean { + if (selector.filenamePattern) { + if (glob.match(selector.filenamePattern.toLowerCase(), basename(resource).toLowerCase())) { + return true; + } + } + return false; + } }