提交 6b69213f 编写于 作者: M Matt Bierner

Dismiss custom editor on rename if the editor no longer matches the new resource name

上级 c2c96f3f
......@@ -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;
}
}
......@@ -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<string, CustomEditorInfo>();
......@@ -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<CustomEditorsAssociations>(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) {
......
......@@ -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;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册