editors - introduce a AbstractTextResourceEditorInput for some label sharing

This commit is contained in:
Benjamin Pasero
2021-05-07 08:34:28 +02:00
parent 590bbc440e
commit a2ddfc3aef
27 changed files with 397 additions and 387 deletions
@@ -12,7 +12,7 @@ import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResour
import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor';
import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput';
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { TextDiffEditor } from 'vs/workbench/browser/parts/editor/textDiffEditor';
import { UntitledHintContribution } from 'vs/workbench/browser/parts/editor/untitledHint';
@@ -64,7 +64,7 @@ import { FileAccess } from 'vs/base/common/network';
import { Codicon } from 'vs/base/common/codicons';
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
// Register String Editor
// Register Resource Text Editor
Registry.as<IEditorRegistry>(EditorExtensions.Editors).registerEditor(
EditorDescriptor.create(
TextResourceEditor,
@@ -73,7 +73,7 @@ Registry.as<IEditorRegistry>(EditorExtensions.Editors).registerEditor(
),
[
new SyncDescriptor(UntitledTextEditorInput),
new SyncDescriptor(ResourceEditorInput)
new SyncDescriptor(TextResourceEditorInput)
]
);
@@ -7,7 +7,7 @@ import { localize } from 'vs/nls';
import { assertIsDefined, isFunction, withNullAsUndefined } from 'vs/base/common/types';
import { ICodeEditor, getCodeEditor, IPasteEvent } from 'vs/editor/browser/editorBrowser';
import { TextEditorOptions, EditorInput, EditorOptions, IEditorOpenContext } from 'vs/workbench/common/editor';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel';
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor';
@@ -98,7 +98,7 @@ export class AbstractTextResourceEditor extends BaseTextEditor {
}
private restoreTextResourceEditorViewState(editor: EditorInput, control: IEditor) {
if (editor instanceof UntitledTextEditorInput || editor instanceof ResourceEditorInput) {
if (editor instanceof UntitledTextEditorInput || editor instanceof TextResourceEditorInput) {
const viewState = this.loadTextEditorViewState(editor.resource);
if (viewState) {
control.restoreViewState(viewState);
@@ -144,7 +144,7 @@ export class AbstractTextResourceEditor extends BaseTextEditor {
}
private saveTextResourceEditorViewState(input: EditorInput | undefined): void {
if (!(input instanceof UntitledTextEditorInput) && !(input instanceof ResourceEditorInput)) {
if (!(input instanceof UntitledTextEditorInput) && !(input instanceof TextResourceEditorInput)) {
return; // only enabled for untitled and resource inputs
}
-16
View File
@@ -748,22 +748,6 @@ export interface IFileEditorInput extends IEditorInput, IEncodingSupport, IModeS
isResolved(): boolean;
}
export function decorateFileEditorLabel(label: string, state: { orphaned: boolean, readonly: boolean }): string {
if (state.orphaned && state.readonly) {
return localize('orphanedReadonlyFile', "{0} (deleted, read-only)", label);
}
if (state.orphaned) {
return localize('orphanedFile', "{0} (deleted)", label);
}
if (state.readonly) {
return localize('readonlyFile', "{0} (read-only)", label);
}
return label;
}
/**
* Side by side editor inputs that have a primary and secondary side.
*/
@@ -58,7 +58,7 @@ export class DiffEditorInput extends SideBySideEditorInput {
return this.name;
}
override getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | undefined {
override getDescription(verbosity = Verbosity.MEDIUM): string | undefined {
if (typeof this.description !== 'string') {
// Pass the description of the modified side in case both original
@@ -3,132 +3,194 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { localize } from 'vs/nls';
import { EditorInput, Verbosity, IEditorInputWithPreferredResource } from 'vs/workbench/common/editor';
import { URI } from 'vs/base/common/uri';
import { IReference } from 'vs/base/common/lifecycle';
import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel';
import { IModeSupport, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IFileService } from 'vs/platform/files/common/files';
import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files';
import { ILabelService } from 'vs/platform/label/common/label';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { isEqual } from 'vs/base/common/resources';
import { dirname, isEqual } from 'vs/base/common/resources';
/**
* A read-only text editor input whos contents are made of the provided resource that points to an existing
* code editor model.
* The base class for all editor inputs that open resources.
*/
export class ResourceEditorInput extends AbstractTextResourceEditorInput implements IModeSupport {
export abstract class AbstractResourceEditorInput extends EditorInput implements IEditorInputWithPreferredResource {
static readonly ID: string = 'workbench.editors.resourceEditorInput';
override get typeId(): string {
return ResourceEditorInput.ID;
}
private cachedModel: ResourceEditorModel | undefined = undefined;
private modelReference: Promise<IReference<ITextEditorModel>> | undefined = undefined;
private _preferredResource: URI;
get preferredResource(): URI { return this._preferredResource; }
constructor(
resource: URI,
private name: string | undefined,
private description: string | undefined,
private preferredMode: string | undefined,
@ITextModelService private readonly textModelResolverService: ITextModelService,
@ITextFileService textFileService: ITextFileService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService,
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
public readonly resource: URI,
preferredResource: URI | undefined,
@ILabelService protected readonly labelService: ILabelService,
@IFileService protected readonly fileService: IFileService
) {
super(resource, undefined, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService);
super();
this._preferredResource = preferredResource || resource;
this.registerListeners();
}
override getName(): string {
return this.name || super.getName();
private registerListeners(): void {
// Clear label memoizer on certain events that have impact
this._register(this.labelService.onDidChangeFormatters(e => this.onLabelEvent(e.scheme)));
this._register(this.fileService.onDidChangeFileSystemProviderRegistrations(e => this.onLabelEvent(e.scheme)));
this._register(this.fileService.onDidChangeFileSystemProviderCapabilities(e => this.onLabelEvent(e.scheme)));
}
setName(name: string): void {
if (this.name !== name) {
this.name = name;
this._onDidChangeLabel.fire();
private onLabelEvent(scheme: string): void {
if (scheme === this._preferredResource.scheme) {
this.updateLabel();
}
}
override getDescription(): string | undefined {
return this.description;
private updateLabel(): void {
// Clear any cached labels from before
this._name = undefined;
this._shortDescription = undefined;
this._mediumDescription = undefined;
this._longDescription = undefined;
this._shortTitle = undefined;
this._mediumTitle = undefined;
this._longTitle = undefined;
// Trigger recompute of label
this._onDidChangeLabel.fire();
}
setDescription(description: string): void {
if (this.description !== description) {
this.description = description;
setPreferredResource(preferredResource: URI): void {
if (!isEqual(preferredResource, this._preferredResource)) {
this._preferredResource = preferredResource;
this._onDidChangeLabel.fire();
this.updateLabel();
}
}
setMode(mode: string): void {
this.setPreferredMode(mode);
private _name: string | undefined = undefined;
override getName(skipDecorate?: boolean): string {
if (typeof this._name !== 'string') {
this._name = this.labelService.getUriBasenameLabel(this._preferredResource);
}
if (this.cachedModel) {
this.cachedModel.setMode(mode);
return skipDecorate ? this._name : this.decorateLabel(this._name);
}
override getDescription(verbosity = Verbosity.MEDIUM): string | undefined {
switch (verbosity) {
case Verbosity.SHORT:
return this.shortDescription;
case Verbosity.LONG:
return this.longDescription;
case Verbosity.MEDIUM:
default:
return this.mediumDescription;
}
}
setPreferredMode(mode: string): void {
this.preferredMode = mode;
private _shortDescription: string | undefined = undefined;
private get shortDescription(): string {
if (typeof this._shortDescription !== 'string') {
this._shortDescription = this.labelService.getUriBasenameLabel(dirname(this._preferredResource));
}
return this._shortDescription;
}
override async resolve(): Promise<ITextEditorModel> {
if (!this.modelReference) {
this.modelReference = this.textModelResolverService.createModelReference(this.resource);
private _mediumDescription: string | undefined = undefined;
private get mediumDescription(): string {
if (typeof this._mediumDescription !== 'string') {
this._mediumDescription = this.labelService.getUriLabel(dirname(this._preferredResource), { relative: true });
}
const ref = await this.modelReference;
// Ensure the resolved model is of expected type
const model = ref.object;
if (!(model instanceof ResourceEditorModel)) {
ref.dispose();
this.modelReference = undefined;
throw new Error(`Unexpected model for ResourceEditorInput: ${this.resource}`);
}
this.cachedModel = model;
// Set mode if we have a preferred mode configured
if (this.preferredMode) {
model.setMode(this.preferredMode);
}
return model;
return this._mediumDescription;
}
override matches(otherInput: unknown): boolean {
if (otherInput === this) {
return true;
private _longDescription: string | undefined = undefined;
private get longDescription(): string {
if (typeof this._longDescription !== 'string') {
this._longDescription = this.labelService.getUriLabel(dirname(this._preferredResource));
}
if (otherInput instanceof ResourceEditorInput) {
return isEqual(otherInput.resource, this.resource);
return this._longDescription;
}
private _shortTitle: string | undefined = undefined;
private get shortTitle(): string {
if (typeof this._shortTitle !== 'string') {
this._shortTitle = this.getName(true /* skip decorations */);
}
return this._shortTitle;
}
private _mediumTitle: string | undefined = undefined;
private get mediumTitle(): string {
if (typeof this._mediumTitle !== 'string') {
this._mediumTitle = this.labelService.getUriLabel(this._preferredResource, { relative: true });
}
return this._mediumTitle;
}
private _longTitle: string | undefined = undefined;
private get longTitle(): string {
if (typeof this._longTitle !== 'string') {
this._longTitle = this.labelService.getUriLabel(this._preferredResource);
}
return this._longTitle;
}
override getTitle(verbosity?: Verbosity): string {
switch (verbosity) {
case Verbosity.SHORT:
return this.decorateLabel(this.shortTitle);
case Verbosity.LONG:
return this.decorateLabel(this.longTitle);
default:
case Verbosity.MEDIUM:
return this.decorateLabel(this.mediumTitle);
}
}
private decorateLabel(label: string): string {
const readonly = this.isReadonly();
const orphaned = this.isOrphaned();
return decorateFileEditorLabel(label, { orphaned, readonly });
}
override isUntitled(): boolean {
return !this.fileService.canHandleResource(this.resource);
}
override isReadonly(): boolean {
if (this.isUntitled()) {
return false; // untitled is never readonly
}
return this.fileService.hasCapability(this.resource, FileSystemProviderCapabilities.Readonly);
}
isOrphaned(): boolean {
return false;
}
override dispose(): void {
if (this.modelReference) {
this.modelReference.then(ref => ref.dispose());
this.modelReference = undefined;
}
this.cachedModel = undefined;
super.dispose();
}
}
export function decorateFileEditorLabel(label: string, state: { orphaned: boolean, readonly: boolean }): string {
if (state.orphaned && state.readonly) {
return localize('orphanedReadonlyFile', "{0} (deleted, read-only)", label);
}
if (state.orphaned) {
return localize('orphanedFile', "{0} (deleted)", label);
}
if (state.readonly) {
return localize('readonlyFile', "{0} (read-only)", label);
}
return label;
}
@@ -3,179 +3,33 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { EditorInput, Verbosity, GroupIdentifier, IEditorInput, IRevertOptions, IEditorInputWithPreferredResource } from 'vs/workbench/common/editor';
import { GroupIdentifier, IEditorInput, IRevertOptions } from 'vs/workbench/common/editor';
import { AbstractResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { URI } from 'vs/base/common/uri';
import { ITextFileService, ITextFileSaveOptions } from 'vs/workbench/services/textfile/common/textfiles';
import { ITextFileService, ITextFileSaveOptions, IModeSupport } from 'vs/workbench/services/textfile/common/textfiles';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files';
import { IFileService } from 'vs/platform/files/common/files';
import { ILabelService } from 'vs/platform/label/common/label';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { Schemas } from 'vs/base/common/network';
import { dirname, isEqual } from 'vs/base/common/resources';
import { isEqual } from 'vs/base/common/resources';
import { ITextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel';
import { IReference } from 'vs/base/common/lifecycle';
/**
* The base class for all editor inputs that open in text editors.
*/
export abstract class AbstractTextResourceEditorInput extends EditorInput implements IEditorInputWithPreferredResource {
private _preferredResource: URI;
get preferredResource(): URI { return this._preferredResource; }
export abstract class AbstractTextResourceEditorInput extends AbstractResourceEditorInput {
constructor(
public readonly resource: URI,
resource: URI,
preferredResource: URI | undefined,
@IEditorService protected readonly editorService: IEditorService,
@IEditorGroupsService protected readonly editorGroupService: IEditorGroupsService,
@ITextFileService protected readonly textFileService: ITextFileService,
@ILabelService protected readonly labelService: ILabelService,
@IFileService protected readonly fileService: IFileService,
@IFilesConfigurationService protected readonly filesConfigurationService: IFilesConfigurationService
@ILabelService labelService: ILabelService,
@IFileService fileService: IFileService
) {
super();
this._preferredResource = preferredResource || resource;
this.registerListeners();
}
protected registerListeners(): void {
// Clear label memoizer on certain events that have impact
this._register(this.labelService.onDidChangeFormatters(e => this.onLabelEvent(e.scheme)));
this._register(this.fileService.onDidChangeFileSystemProviderRegistrations(e => this.onLabelEvent(e.scheme)));
this._register(this.fileService.onDidChangeFileSystemProviderCapabilities(e => this.onLabelEvent(e.scheme)));
}
private onLabelEvent(scheme: string): void {
if (scheme === this._preferredResource.scheme) {
this.updateLabel();
}
}
private updateLabel(): void {
// Clear any cached labels from before
this._name = undefined;
this._shortDescription = undefined;
this._mediumDescription = undefined;
this._longDescription = undefined;
this._shortTitle = undefined;
this._mediumTitle = undefined;
this._longTitle = undefined;
// Trigger recompute of label
this._onDidChangeLabel.fire();
}
setPreferredResource(preferredResource: URI): void {
if (!isEqual(preferredResource, this._preferredResource)) {
this._preferredResource = preferredResource;
this.updateLabel();
}
}
private _name: string | undefined = undefined;
override getName(): string {
if (typeof this._name !== 'string') {
this._name = this.labelService.getUriBasenameLabel(this._preferredResource);
}
return this._name;
}
override getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | undefined {
switch (verbosity) {
case Verbosity.SHORT:
return this.shortDescription;
case Verbosity.LONG:
return this.longDescription;
case Verbosity.MEDIUM:
default:
return this.mediumDescription;
}
}
private _shortDescription: string | undefined = undefined;
private get shortDescription(): string {
if (typeof this._shortDescription !== 'string') {
this._shortDescription = this.labelService.getUriBasenameLabel(dirname(this._preferredResource));
}
return this._shortDescription;
}
private _mediumDescription: string | undefined = undefined;
private get mediumDescription(): string {
if (typeof this._mediumDescription !== 'string') {
this._mediumDescription = this.labelService.getUriLabel(dirname(this._preferredResource), { relative: true });
}
return this._mediumDescription;
}
private _longDescription: string | undefined = undefined;
private get longDescription(): string {
if (typeof this._longDescription !== 'string') {
this._longDescription = this.labelService.getUriLabel(dirname(this._preferredResource));
}
return this._longDescription;
}
private _shortTitle: string | undefined = undefined;
private get shortTitle(): string {
if (typeof this._shortTitle !== 'string') {
this._shortTitle = this.getName();
}
return this._shortTitle;
}
private _mediumTitle: string | undefined = undefined;
private get mediumTitle(): string {
if (typeof this._mediumTitle !== 'string') {
this._mediumTitle = this.labelService.getUriLabel(this._preferredResource, { relative: true });
}
return this._mediumTitle;
}
private _longTitle: string | undefined = undefined;
private get longTitle(): string {
if (typeof this._longTitle !== 'string') {
this._longTitle = this.labelService.getUriLabel(this._preferredResource);
}
return this._longTitle;
}
override getTitle(verbosity: Verbosity): string {
switch (verbosity) {
case Verbosity.SHORT:
return this.shortTitle;
case Verbosity.LONG:
return this.longTitle;
default:
case Verbosity.MEDIUM:
return this.mediumTitle;
}
}
override isUntitled(): boolean {
// any file: is never untitled as it can be saved
// untitled: is untitled by definition
// any other: is untitled because it cannot be saved, as such we expect a "Save As" dialog
return !this.fileService.canHandleResource(this.resource);
}
override isReadonly(): boolean {
if (this.isUntitled()) {
return false; // untitled is never readonly
}
return this.fileService.hasCapability(this.resource, FileSystemProviderCapabilities.Readonly);
super(resource, preferredResource, labelService, fileService);
}
override save(group: GroupIdentifier, options?: ITextFileSaveOptions): Promise<IEditorInput | undefined> {
@@ -225,3 +79,118 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput implem
await this.textFileService.revert(this.resource, options);
}
}
/**
* A read-only text editor input whos contents are made of the provided resource that points to an existing
* code editor model.
*/
export class TextResourceEditorInput extends AbstractTextResourceEditorInput implements IModeSupport {
static readonly ID: string = 'workbench.editors.resourceEditorInput';
override get typeId(): string {
return TextResourceEditorInput.ID;
}
private cachedModel: TextResourceEditorModel | undefined = undefined;
private modelReference: Promise<IReference<ITextEditorModel>> | undefined = undefined;
constructor(
resource: URI,
private name: string | undefined,
private description: string | undefined,
private preferredMode: string | undefined,
@ITextModelService private readonly textModelResolverService: ITextModelService,
@ITextFileService textFileService: ITextFileService,
@IEditorService editorService: IEditorService,
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService
) {
super(resource, undefined, editorService, textFileService, labelService, fileService);
}
override getName(): string {
return this.name || super.getName();
}
setName(name: string): void {
if (this.name !== name) {
this.name = name;
this._onDidChangeLabel.fire();
}
}
override getDescription(): string | undefined {
return this.description;
}
setDescription(description: string): void {
if (this.description !== description) {
this.description = description;
this._onDidChangeLabel.fire();
}
}
setMode(mode: string): void {
this.setPreferredMode(mode);
if (this.cachedModel) {
this.cachedModel.setMode(mode);
}
}
setPreferredMode(mode: string): void {
this.preferredMode = mode;
}
override async resolve(): Promise<ITextEditorModel> {
if (!this.modelReference) {
this.modelReference = this.textModelResolverService.createModelReference(this.resource);
}
const ref = await this.modelReference;
// Ensure the resolved model is of expected type
const model = ref.object;
if (!(model instanceof TextResourceEditorModel)) {
ref.dispose();
this.modelReference = undefined;
throw new Error(`Unexpected model for TextResourceEditorInput: ${this.resource}`);
}
this.cachedModel = model;
// Set mode if we have a preferred mode configured
if (this.preferredMode) {
model.setMode(this.preferredMode);
}
return model;
}
override matches(otherInput: unknown): boolean {
if (otherInput === this) {
return true;
}
if (otherInput instanceof TextResourceEditorInput) {
return isEqual(otherInput.resource, this.resource);
}
return false;
}
override dispose(): void {
if (this.modelReference) {
this.modelReference.then(ref => ref.dispose());
this.modelReference = undefined;
}
this.cachedModel = undefined;
super.dispose();
}
}
@@ -9,9 +9,10 @@ import { IModeService } from 'vs/editor/common/services/modeService';
import { IModelService } from 'vs/editor/common/services/modelService';
/**
* An editor model for in-memory, readonly content that is backed by an existing editor model.
* An editor model for in-memory, readonly text content that
* is backed by an existing editor model.
*/
export class ResourceEditorModel extends BaseTextEditorModel {
export class TextResourceEditorModel extends BaseTextEditorModel {
constructor(
resource: URI,
@@ -16,7 +16,8 @@ import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ILabelService } from 'vs/platform/label/common/label';
import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo';
import { decorateFileEditorLabel, GroupIdentifier, IEditorInput, IRevertOptions, ISaveOptions, Verbosity } from 'vs/workbench/common/editor';
import { GroupIdentifier, IEditorInput, IRevertOptions, ISaveOptions, Verbosity } from 'vs/workbench/common/editor';
import { decorateFileEditorLabel } from 'vs/workbench/common/editor/resourceEditorInput';
import { defaultCustomEditor } from 'vs/workbench/contrib/customEditor/common/contributedCustomEditors';
import { ICustomEditorModel, ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor';
import { IWebviewService, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview';
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import { URI } from 'vs/base/common/uri';
import { IFileEditorInput, Verbosity, GroupIdentifier, IMoveResult, isTextEditorPane, decorateFileEditorLabel } from 'vs/workbench/common/editor';
import { IFileEditorInput, Verbosity, GroupIdentifier, IMoveResult, isTextEditorPane } from 'vs/workbench/common/editor';
import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel';
import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
@@ -16,7 +16,6 @@ import { FILE_EDITOR_INPUT_ID, TEXT_FILE_EDITOR_ID, BINARY_FILE_EDITOR_ID } from
import { ILabelService } from 'vs/platform/label/common/label';
import { AutoSaveMode, IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { isEqual } from 'vs/base/common/resources';
import { Event } from 'vs/base/common/event';
import { IEditorViewState } from 'vs/editor/common/editorCommon';
@@ -61,11 +60,10 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements
@ITextModelService private readonly textModelResolverService: ITextModelService,
@ILabelService labelService: ILabelService,
@IFileService fileService: IFileService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService,
@IEditorService editorService: IEditorService
) {
super(resource, preferredResource, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService);
super(resource, preferredResource, editorService, textFileService, labelService, fileService);
this.model = this.textFileService.files.get(resource);
@@ -85,19 +83,15 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements
this.setPreferredMode(preferredMode);
}
// Attach to model that matches our resource once created
this._register(this.textFileService.files.onDidCreate(model => this.onDidCreateTextFileModel(model)));
// If a file model already exists, make sure to wire it in
if (this.model) {
this.registerModelListeners(this.model);
}
}
protected override registerListeners(): void {
super.registerListeners();
// Attach to model that matches our resource once created
this._register(this.textFileService.files.onDidCreate(model => this.onDidCreateTextFileModel(model)));
}
private onDidCreateTextFileModel(model: ITextFileEditorModel): void {
// Once the text file model is created, we keep it inside
@@ -131,7 +125,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements
}
override getName(): string {
return this.preferredName || this.decorateLabel(super.getName());
return this.preferredName || super.getName();
}
setPreferredName(name: string): void {
@@ -174,23 +168,6 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements
return this.preferredDescription;
}
override getTitle(verbosity: Verbosity): string {
switch (verbosity) {
case Verbosity.SHORT:
return this.decorateLabel(super.getName());
case Verbosity.MEDIUM:
case Verbosity.LONG:
return this.decorateLabel(super.getTitle(verbosity));
}
}
private decorateLabel(label: string): string {
const orphaned = this.model?.hasState(TextFileEditorModelState.ORPHAN);
const readonly = this.isReadonly();
return decorateFileEditorLabel(label, { orphaned: !!orphaned, readonly });
}
getEncoding(): string | undefined {
if (this.model) {
return this.model.getEncoding();
@@ -253,6 +230,14 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements
return super.isReadonly();
}
override isOrphaned(): boolean {
if (this.model) {
return this.model.hasState(TextFileEditorModelState.ORPHAN);
}
return super.isOrphaned();
}
override isSaving(): boolean {
if (this.model?.hasState(TextFileEditorModelState.SAVED) || this.model?.hasState(TextFileEditorModelState.CONFLICT) || this.model?.hasState(TextFileEditorModelState.ERROR)) {
return false; // require the model to be dirty and not in conflict or error state
@@ -687,12 +687,14 @@ export interface IResolvedNotebookEditorModel extends INotebookEditorModel {
export interface INotebookEditorModel extends IEditorModel {
readonly onDidChangeDirty: Event<void>;
readonly onDidSave: Event<void>;
readonly onDidChangeOrphaned: Event<void>;
readonly resource: URI;
readonly viewType: string;
readonly notebook: NotebookTextModel | undefined;
isResolved(): this is IResolvedNotebookEditorModel;
isDirty(): boolean;
isReadonly(): boolean;
isOrphaned(): boolean;
load(options?: INotebookLoadOptions): Promise<IResolvedNotebookEditorModel>;
save(options?: ISaveOptions): Promise<boolean>;
saveAs(target: URI): Promise<IEditorInput | undefined>;
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as glob from 'vs/base/common/glob';
import { EditorInput, IEditorInput, GroupIdentifier, ISaveOptions, IMoveResult, IRevertOptions } from 'vs/workbench/common/editor';
import { IEditorInput, GroupIdentifier, ISaveOptions, IMoveResult, IRevertOptions } from 'vs/workbench/common/editor';
import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
import { URI } from 'vs/base/common/uri';
import { isEqual, joinPath } from 'vs/base/common/resources';
@@ -16,12 +16,14 @@ import { IResolvedNotebookEditorModel } from 'vs/workbench/contrib/notebook/comm
import { ILabelService } from 'vs/platform/label/common/label';
import { Schemas } from 'vs/base/common/network';
import { mark } from 'vs/workbench/contrib/notebook/common/notebookPerformance';
import { IFileService } from 'vs/platform/files/common/files';
import { AbstractResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
interface NotebookEditorInputOptions {
startDirty?: boolean;
}
export class NotebookEditorInput extends EditorInput {
export class NotebookEditorInput extends AbstractResourceEditorInput {
static create(instantiationService: IInstantiationService, resource: URI, viewType: string, options: NotebookEditorInputOptions = {}) {
return instantiationService.createInstance(NotebookEditorInput, resource, viewType, options);
@@ -29,13 +31,11 @@ export class NotebookEditorInput extends EditorInput {
static readonly ID: string = 'workbench.input.notebook';
private readonly _name: string;
private _editorModelReference: IReference<IResolvedNotebookEditorModel> | null = null;
private _defaultDirtyState: boolean = false;
constructor(
public readonly resource: URI,
resource: URI,
public readonly viewType: string,
public readonly options: NotebookEditorInputOptions,
@INotebookService private readonly _notebookService: INotebookService,
@@ -43,10 +43,10 @@ export class NotebookEditorInput extends EditorInput {
@IFileDialogService private readonly _fileDialogService: IFileDialogService,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@ILabelService labelService: ILabelService,
@IFileService fileService: IFileService
) {
super();
super(resource, undefined, labelService, fileService);
this._defaultDirtyState = !!options.startDirty;
this._name = labelService.getUriBasenameLabel(resource);
}
override dispose() {
@@ -59,10 +59,6 @@ export class NotebookEditorInput extends EditorInput {
return NotebookEditorInput.ID;
}
override getName(): string {
return this._name;
}
override isDirty() {
if (!this._editorModelReference) {
return this._defaultDirtyState;
@@ -82,6 +78,14 @@ export class NotebookEditorInput extends EditorInput {
return this._editorModelReference.object.isReadonly();
}
override isOrphaned() {
if (!this._editorModelReference) {
return super.isOrphaned();
}
return this._editorModelReference.object.isOrphaned();
}
override async save(group: GroupIdentifier, options?: ISaveOptions): Promise<IEditorInput | undefined> {
if (this._editorModelReference) {
@@ -108,7 +112,7 @@ export class NotebookEditorInput extends EditorInput {
return undefined;
}
const dialogPath = this.isUntitled() ? await this._suggestName(this._name) : this._editorModelReference.object.resource;
const dialogPath = this.isUntitled() ? await this._suggestName(this.labelService.getUriBasenameLabel(this.resource)) : this._editorModelReference.object.resource;
const target = await this._fileDialogService.pickFileToSave(dialogPath, options?.availableFileSystems);
if (!target) {
@@ -175,6 +179,7 @@ export class NotebookEditorInput extends EditorInput {
return null;
}
this._register(this._editorModelReference.object.onDidChangeDirty(() => this._onDidChangeDirty.fire()));
this._register(this._editorModelReference.object.onDidChangeOrphaned(() => this._onDidChangeLabel.fire()));
if (this._editorModelReference.object.isDirty()) {
this._onDidChangeDirty.fire();
}
@@ -23,7 +23,7 @@ import { TaskSequentializer } from 'vs/base/common/async';
import { bufferToStream, streamToBuffer, VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer';
import { assertType } from 'vs/base/common/types';
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
import { IFileWorkingCopyModel, IFileWorkingCopyModelContentChangedEvent, IFileWorkingCopyModelFactory, IResolvedFileWorkingCopy } from 'vs/workbench/services/workingCopy/common/fileWorkingCopy';
import { FileWorkingCopyState, IFileWorkingCopyModel, IFileWorkingCopyModelContentChangedEvent, IFileWorkingCopyModelFactory, IResolvedFileWorkingCopy } from 'vs/workbench/services/workingCopy/common/fileWorkingCopy';
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
import { canceled } from 'vs/base/common/errors';
import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput';
@@ -41,6 +41,7 @@ export class ComplexNotebookEditorModel extends EditorModel implements INotebook
readonly onDidSave = this._onDidSave.event;
readonly onDidChangeDirty = this._onDidChangeDirty.event;
readonly onDidChangeOrphaned = Event.None;
private _lastResolvedFileStat?: IFileStatWithMetadata;
@@ -126,6 +127,10 @@ export class ComplexNotebookEditorModel extends EditorModel implements INotebook
return false;
}
isOrphaned(): boolean {
return false;
}
private _isUntitled(): boolean {
return this.resource.scheme === Schemas.untitled;
}
@@ -411,9 +416,11 @@ export class SimpleNotebookEditorModel extends EditorModel implements INotebookE
private readonly _onDidChangeDirty = new Emitter<void>();
private readonly _onDidSave = new Emitter<void>();
private readonly _onDidChangeOrphaned = new Emitter<void>();
readonly onDidChangeDirty: Event<void> = this._onDidChangeDirty.event;
readonly onDidSave: Event<void> = this._onDidSave.event;
readonly onDidChangeOrphaned: Event<void> = this._onDidChangeOrphaned.event;
private _workingCopy?: IResolvedFileWorkingCopy<NotebookFileWorkingCopyModel>;
private readonly _workingCopyListeners = new DisposableStore();
@@ -423,7 +430,7 @@ export class SimpleNotebookEditorModel extends EditorModel implements INotebookE
readonly viewType: string,
private readonly _workingCopyManager: IFileWorkingCopyManager<NotebookFileWorkingCopyModel>,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@IFileService private readonly fileService: IFileService
@IFileService private readonly _fileService: IFileService
) {
super();
}
@@ -433,6 +440,7 @@ export class SimpleNotebookEditorModel extends EditorModel implements INotebookE
this._workingCopy?.dispose();
this._onDidChangeDirty.dispose();
this._onDidSave.dispose();
this._onDidChangeOrphaned.dispose();
super.dispose();
}
@@ -448,8 +456,12 @@ export class SimpleNotebookEditorModel extends EditorModel implements INotebookE
return this._workingCopy?.isDirty() ?? false;
}
isOrphaned(): boolean {
return this._workingCopy?.hasState(FileWorkingCopyState.ORPHAN) ?? false;
}
isReadonly(): boolean {
return this.fileService.hasCapability(this.resource, FileSystemProviderCapabilities.Readonly);
return this._fileService.hasCapability(this.resource, FileSystemProviderCapabilities.Readonly);
}
revert(options?: IRevertOptions): Promise<void> {
@@ -468,6 +480,7 @@ export class SimpleNotebookEditorModel extends EditorModel implements INotebookE
this._workingCopy = <IResolvedFileWorkingCopy<NotebookFileWorkingCopyModel>>workingCopy;
this._workingCopy.onDidChangeDirty(() => this._onDidChangeDirty.fire(), this._workingCopyListeners);
this._workingCopy.onDidSave(() => this._onDidSave.fire(), this._workingCopyListeners);
this._workingCopy.onDidChangeOrphaned(() => this._onDidChangeOrphaned.fire(), this._workingCopyListeners);
}
assertType(this.isResolved());
return this;
@@ -66,6 +66,8 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi
protected readonly _onDidChangeDirty = this._register(new Emitter<void>());
readonly onDidChangeDirty = this._onDidChangeDirty.event;
readonly onDidChangeOrphaned = Event.None;
private readonly _onDidChangeContent = this._register(new Emitter<void>());
readonly onDidChangeContent: Event<void> = this._onDidChangeContent.event;
@@ -95,10 +97,15 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi
}));
}
}
isReadonly(): boolean {
return false;
}
isOrphaned(): boolean {
return false;
}
isDirty() {
return this._dirty;
}
@@ -12,7 +12,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/tex
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { AbstractTextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { URI } from 'vs/base/common/uri';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { LOG_SCHEME } from 'vs/workbench/contrib/output/common/output';
@@ -22,9 +22,8 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IFileService } from 'vs/platform/files/common/files';
import { ILabelService } from 'vs/platform/label/common/label';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
export class LogViewerInput extends ResourceEditorInput {
export class LogViewerInput extends TextResourceEditorInput {
static override readonly ID = 'workbench.editorinputs.output';
@@ -37,10 +36,8 @@ export class LogViewerInput extends ResourceEditorInput {
@ITextModelService textModelResolverService: ITextModelService,
@ITextFileService textFileService: ITextFileService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService,
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
@ILabelService labelService: ILabelService
) {
super(
URI.from({ scheme: LOG_SCHEME, path: outputChannelDescriptor.id }),
@@ -50,10 +47,8 @@ export class LogViewerInput extends ResourceEditorInput {
textModelResolverService,
textFileService,
editorService,
editorGroupService,
fileService,
labelService,
filesConfigurationService
labelService
);
}
}
@@ -25,7 +25,7 @@ import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/vie
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { IViewDescriptorService } from 'vs/workbench/common/views';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { IOutputChannelDescriptor, IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output';
import { Registry } from 'vs/platform/registry/common/platform';
@@ -156,8 +156,8 @@ export class OutputViewPane extends ViewPane {
this.editorPromise = null;
}
private createInput(channel: IOutputChannel): ResourceEditorInput {
return this.instantiationService.createInstance(ResourceEditorInput, channel.uri, nls.localize('output model title', "{0} - Output", channel.label), nls.localize('channel', "Output channel for '{0}'", channel.label), undefined);
private createInput(channel: IOutputChannel): TextResourceEditorInput {
return this.instantiationService.createInstance(TextResourceEditorInput, channel.uri, nls.localize('output model title', "{0} - Output", channel.label), nls.localize('channel', "Output channel for '{0}'", channel.label), undefined);
}
}
@@ -5,7 +5,7 @@
import { localize } from 'vs/nls';
import { URI } from 'vs/base/common/uri';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService';
import { ITextModel } from 'vs/editor/common/model';
import { ILifecycleService, LifecyclePhase, StartupKindToString } from 'vs/workbench/services/lifecycle/common/lifecycle';
@@ -21,10 +21,8 @@ import { LoaderStats } from 'vs/base/common/amd';
import { IProductService } from 'vs/platform/product/common/productService';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { ByteSize, IFileService } from 'vs/platform/files/common/files';
import { ILabelService } from 'vs/platform/label/common/label';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { isWeb } from 'vs/base/common/platform';
export class PerfviewContrib {
@@ -43,7 +41,7 @@ export class PerfviewContrib {
}
}
export class PerfviewInput extends ResourceEditorInput {
export class PerfviewInput extends TextResourceEditorInput {
static readonly Id = 'PerfviewInput';
static readonly Uri = URI.from({ scheme: 'perf', path: 'Startup Performance' });
@@ -56,10 +54,8 @@ export class PerfviewInput extends ResourceEditorInput {
@ITextModelService textModelResolverService: ITextModelService,
@ITextFileService textFileService: ITextFileService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService,
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
@ILabelService labelService: ILabelService
) {
super(
PerfviewInput.Uri,
@@ -69,10 +65,8 @@ export class PerfviewInput extends ResourceEditorInput {
textModelResolverService,
textFileService,
editorService,
editorGroupService,
fileService,
labelService,
filesConfigurationService
labelService
);
}
}
@@ -42,7 +42,7 @@ import { IEditorRegistry } from 'vs/workbench/browser/editor';
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor';
import { EditorExtensions, EditorInput, EditorOptions, IEditorControl, IEditorOpenContext } from 'vs/workbench/common/editor';
import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel';
import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel';
import { DefaultSettingsRenderer, FolderSettingsRenderer, IPreferencesRenderer, UserSettingsRenderer, WorkspaceSettingsRenderer } from 'vs/workbench/contrib/preferences/browser/preferencesRenderers';
import { SearchWidget, SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets';
import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, IPreferencesSearchService, ISearchProvider } from 'vs/workbench/contrib/preferences/common/preferences';
@@ -1035,7 +1035,7 @@ export class DefaultPreferencesEditor extends BaseTextEditor {
return;
}
const editor = assertIsDefined(this.getControl());
editor.setModel((<ResourceEditorModel>editorModel).textEditorModel);
editor.setModel((<TextResourceEditorModel>editorModel).textEditorModel);
}
override clearInput(): void {
@@ -6,7 +6,7 @@
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IResourceEditorInput, ITextEditorOptions, IEditorOptions, EditorActivation, EditorOverride, IResourceEditorInputIdentifier } from 'vs/platform/editor/common/editor';
import { SideBySideEditor, IEditorInput, IEditorPane, GroupIdentifier, IFileEditorInput, IUntitledTextResourceEditorInput, IResourceDiffEditorInput, IEditorInputFactoryRegistry, EditorExtensions, EditorInput, SideBySideEditorInput, IEditorInputWithOptions, isEditorInputWithOptions, EditorOptions, TextEditorOptions, IEditorIdentifier, IEditorCloseEvent, ITextEditorPane, ITextDiffEditorPane, IRevertOptions, SaveReason, EditorsOrder, isTextEditorPane, IWorkbenchEditorConfiguration, EditorResourceAccessor, IVisibleEditorPane, IEditorInputWithOptionsAndGroup } from 'vs/workbench/common/editor';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { Registry } from 'vs/platform/registry/common/platform';
import { ResourceMap } from 'vs/base/common/map';
import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService';
@@ -38,7 +38,7 @@ import { ILogService } from 'vs/platform/log/common/log';
import { ContributedEditorPriority, DEFAULT_EDITOR_ASSOCIATION, IEditorOverrideService } from 'vs/workbench/services/editor/common/editorOverrideService';
import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService';
type CachedEditorInput = ResourceEditorInput | IFileEditorInput | UntitledTextEditorInput;
type CachedEditorInput = TextResourceEditorInput | IFileEditorInput | UntitledTextEditorInput;
type OpenInEditorGroup = IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE;
export class EditorService extends Disposable implements EditorServiceImpl {
@@ -1071,7 +1071,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
}
// Resource
return this.instantiationService.createInstance(ResourceEditorInput, canonicalResource, resourceEditorInput.label, resourceEditorInput.description, resourceEditorInput.mode);
return this.instantiationService.createInstance(TextResourceEditorInput, canonicalResource, resourceEditorInput.label, resourceEditorInput.description, resourceEditorInput.mode);
}, cachedInput => {
// Untitled
@@ -1080,7 +1080,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
}
// Files
else if (!(cachedInput instanceof ResourceEditorInput)) {
else if (!(cachedInput instanceof TextResourceEditorInput)) {
cachedInput.setPreferredResource(preferredResource);
if (resourceEditorInput.label) {
@@ -10,7 +10,7 @@ import { Event } from 'vs/base/common/event';
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
import { EditorInput, EditorsOrder, SideBySideEditorInput } from 'vs/workbench/common/editor';
import { workbenchInstantiationService, TestServiceAccessor, registerTestEditor, TestFileEditorInput, ITestInstantiationService, registerTestResourceEditor, registerTestSideBySideEditor, createEditorPart } from 'vs/workbench/test/browser/workbenchTestServices';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
import { EditorService, DelegatingEditorService } from 'vs/workbench/services/editor/browser/editorService';
import { IEditorGroup, IEditorGroupsService, GroupDirection, GroupsArrangement } from 'vs/workbench/services/editor/common/editorGroupsService';
@@ -362,7 +362,7 @@ suite('EditorService', () => {
// Untyped Input (resource)
input = service.createEditorInput({ resource: URI.parse('custom:resource') });
assert(input instanceof ResourceEditorInput);
assert(input instanceof TextResourceEditorInput);
// Untyped Input (diff)
input = service.createEditorInput({
@@ -392,7 +392,7 @@ suite('EditorService', () => {
const ed = instantiationService.createInstance(MyEditor, 'my.editor');
const inp = instantiationService.createInstance(ResourceEditorInput, URI.parse('my://resource-delegate'), 'name', 'description', undefined);
const inp = instantiationService.createInstance(TextResourceEditorInput, URI.parse('my://resource-delegate'), 'name', 'description', undefined);
const delegate = instantiationService.createInstance(DelegatingEditorService, async (group, delegate) => {
assert.ok(group);
@@ -9,16 +9,14 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService';
import * as nls from 'vs/nls';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { EditorInput, SideBySideEditorInput, Verbosity } from 'vs/workbench/common/editor';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { KeybindingsEditorModel } from 'vs/workbench/services/preferences/browser/keybindingsEditorModel';
import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences';
import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IFileService } from 'vs/platform/files/common/files';
import { ILabelService } from 'vs/platform/label/common/label';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { Schemas } from 'vs/base/common/network';
export class PreferencesEditorInput extends SideBySideEditorInput {
@@ -33,19 +31,17 @@ export class PreferencesEditorInput extends SideBySideEditorInput {
}
}
export class DefaultPreferencesEditorInput extends ResourceEditorInput {
export class DefaultPreferencesEditorInput extends TextResourceEditorInput {
static override readonly ID = 'workbench.editorinputs.defaultpreferences';
constructor(
defaultSettingsResource: URI,
@ITextModelService textModelResolverService: ITextModelService,
@ITextFileService textFileService: ITextFileService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService,
@IFileService fileService: IFileService,
@ILabelService labelService: ILabelService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
@ILabelService labelService: ILabelService
) {
super(defaultSettingsResource, nls.localize('settingsEditorName', "Default Settings"), '', undefined, textModelResolverService, textFileService, editorService, editorGroupService, fileService, labelService, filesConfigurationService);
super(defaultSettingsResource, nls.localize('settingsEditorName', "Default Settings"), '', undefined, textModelResolverService, textFileService, editorService, fileService, labelService);
}
override get typeId(): string {
@@ -8,7 +8,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
import { ITextModel } from 'vs/editor/common/model';
import { IDisposable, toDisposable, IReference, ReferenceCollection, Disposable } from 'vs/base/common/lifecycle';
import { IModelService } from 'vs/editor/common/services/modelService';
import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel';
import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel';
import { ITextFileService, TextFileResolveReason } from 'vs/workbench/services/textfile/common/textfiles';
import { Schemas } from 'vs/base/common/network';
import { ITextModelService, ITextModelContentProvider, ITextEditorModel, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService';
@@ -50,7 +50,7 @@ class ResourceModelCollection extends ReferenceCollection<Promise<ITextEditorMod
throw new Error(`Unable to resolve inMemory resource ${key}`);
}
return this.instantiationService.createInstance(ResourceEditorModel, resource);
return this.instantiationService.createInstance(TextResourceEditorModel, resource);
}
// Untitled Schema: go through untitled text service
@@ -67,7 +67,7 @@ class ResourceModelCollection extends ReferenceCollection<Promise<ITextEditorMod
if (this.providers.has(resource.scheme)) {
await this.resolveTextModelContent(key);
return this.instantiationService.createInstance(ResourceEditorModel, resource);
return this.instantiationService.createInstance(TextResourceEditorModel, resource);
}
// Either unknown schema, or not yet registered, try to activate
@@ -6,8 +6,8 @@
import * as assert from 'assert';
import { ITextModel } from 'vs/editor/common/model';
import { URI } from 'vs/base/common/uri';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices';
import { toResource } from 'vs/base/test/common/utils';
@@ -50,11 +50,11 @@ suite('Workbench - TextModelResolverService', () => {
});
let resource = URI.from({ scheme: 'test', authority: null!, path: 'thePath' });
let input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', undefined);
let input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined);
const model = await input.resolve();
assert.ok(model);
assert.strictEqual(snapshotToString(((model as ResourceEditorModel).createSnapshot()!)), 'Hello Test');
assert.strictEqual(snapshotToString(((model as TextResourceEditorModel).createSnapshot()!)), 'Hello Test');
let disposed = false;
let disposedPromise = new Promise<void>(resolve => {
Event.once(model.onWillDispose)(() => {
@@ -9,9 +9,7 @@ import { IUntitledTextEditorModel } from 'vs/workbench/services/untitled/common/
import { EncodingMode, IEncodingSupport, IModeSupport, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { ILabelService } from 'vs/platform/label/common/label';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { IFileService } from 'vs/platform/files/common/files';
import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService';
import { isEqual } from 'vs/base/common/resources';
/**
@@ -32,11 +30,9 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp
@ITextFileService textFileService: ITextFileService,
@ILabelService labelService: ILabelService,
@IEditorService editorService: IEditorService,
@IEditorGroupsService editorGroupService: IEditorGroupsService,
@IFileService fileService: IFileService,
@IFilesConfigurationService filesConfigurationService: IFilesConfigurationService
@IFileService fileService: IFileService
) {
super(model.resource, undefined, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService);
super(model.resource, undefined, editorService, textFileService, labelService, fileService);
this.registerModelListeners(model);
}
@@ -55,7 +51,7 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp
return this.model.name;
}
override getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | undefined {
override getDescription(verbosity = Verbosity.MEDIUM): string | undefined {
// Without associated path: only use if name and description differ
if (!this.model.hasAssociatedFilePath) {
@@ -6,7 +6,7 @@
import * as assert from 'assert';
import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorModel';
import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { URI } from 'vs/base/common/uri';
import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices';
import { ITextModel } from 'vs/editor/common/model';
@@ -36,8 +36,8 @@ suite('Workbench editor model', () => {
}
});
let input = instantiationService.createInstance(ResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name', 'description', undefined);
let otherInput = instantiationService.createInstance(ResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name2', 'description', undefined);
let input = instantiationService.createInstance(TextResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name', 'description', undefined);
let otherInput = instantiationService.createInstance(TextResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name2', 'description', undefined);
let diffInput = instantiationService.createInstance(DiffEditorInput, 'name', 'description', input, otherInput, undefined);
let model = await diffInput.resolve() as TextDiffEditorModel;
@@ -12,7 +12,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
import { workbenchInstantiationService, TestEditorGroupView, TestEditorGroupsService, registerTestResourceEditor, TestEditorInput } from 'vs/workbench/test/browser/workbenchTestServices';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
import { URI } from 'vs/base/common/uri';
import { IEditorRegistry, EditorDescriptor } from 'vs/workbench/browser/editor';
@@ -94,7 +94,7 @@ class OtherTestInput extends EditorInput {
return null;
}
}
class TestResourceEditorInput extends ResourceEditorInput { }
class TestResourceEditorInput extends TextResourceEditorInput { }
suite('Workbench EditorPane', () => {
@@ -165,7 +165,7 @@ suite('Workbench EditorPane', () => {
const editor = EditorRegistry.getEditor(inst.createInstance(TestResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst);
assert.strictEqual(editor.getId(), 'testEditor');
const otherEditor = EditorRegistry.getEditor(inst.createInstance(ResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst);
const otherEditor = EditorRegistry.getEditor(inst.createInstance(TextResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst);
assert.strictEqual(otherEditor.getId(), 'workbench.editors.textResourceEditor');
disposables.dispose();
@@ -5,8 +5,8 @@
import * as assert from 'assert';
import { URI } from 'vs/base/common/uri';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { TextResourceEditorModel } from 'vs/workbench/common/editor/textResourceEditorModel';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices';
import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles';
@@ -26,12 +26,12 @@ suite('Resource text editors', () => {
const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' });
accessor.modelService.createModel('function test() {}', accessor.modeService.create('text'), resource);
const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', undefined);
const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined);
const model = await input.resolve();
assert.ok(model);
assert.strictEqual(snapshotToString(((model as ResourceEditorModel).createSnapshot()!)), 'function test() {}');
assert.strictEqual(snapshotToString(((model as TextResourceEditorModel).createSnapshot()!)), 'function test() {}');
});
test('custom mode', async () => {
@@ -42,7 +42,7 @@ suite('Resource text editors', () => {
const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' });
accessor.modelService.createModel('function test() {}', accessor.modeService.create('text'), resource);
const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', 'resource-input-test');
const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', 'resource-input-test');
const model = await input.resolve();
assert.ok(model);
@@ -119,7 +119,7 @@ import { FileService } from 'vs/platform/files/common/fileService';
import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor';
import { TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor';
import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput';
import { TextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor';
import { IEnterWorkspaceResult, IRecent, IRecentlyOpened, IWorkspaceFolderCreationData, IWorkspaceIdentifier, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces';
@@ -1366,7 +1366,7 @@ export function registerTestResourceEditor(): IDisposable {
),
[
new SyncDescriptor<EditorInput>(UntitledTextEditorInput),
new SyncDescriptor<EditorInput>(ResourceEditorInput)
new SyncDescriptor<EditorInput>(TextResourceEditorInput)
]
));