From 0d438de58d22d7ac7883f712bcefba3c97d93bcb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 14 Nov 2017 16:54:16 +0100 Subject: [PATCH] Fix #38329 --- .../preferences/browser/preferencesEditor.ts | 72 ------------------- .../browser/preferencesRenderers.ts | 22 +++--- .../preferences/browser/preferencesService.ts | 49 ++++++++----- .../preferences/common/preferencesModels.ts | 25 +++++-- 4 files changed, 63 insertions(+), 105 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 1176a5404f4..1a3c4c20126 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -44,7 +44,6 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { IPreferencesRenderer, DefaultSettingsRenderer, UserSettingsRenderer, WorkspaceSettingsRenderer, FolderSettingsRenderer } from 'vs/workbench/parts/preferences/browser/preferencesRenderers'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { getCodeEditor } from 'vs/editor/browser/services/codeEditorService'; import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { FoldingController } from 'vs/editor/contrib/folding/folding'; import { FindController } from 'vs/editor/contrib/find/findController'; @@ -697,77 +696,6 @@ class SideBySidePreferencesWidget extends Widget { } } -export class EditableSettingsEditor extends BaseTextEditor { - - public static ID: string = 'workbench.editor.settingsEditor'; - - private modelDisposables: IDisposable[] = []; - private saveDelayer: Delayer; - - constructor( - @ITelemetryService telemetryService: ITelemetryService, - @IInstantiationService instantiationService: IInstantiationService, - @IStorageService storageService: IStorageService, - @ITextResourceConfigurationService configurationService: ITextResourceConfigurationService, - @IThemeService themeService: IThemeService, - @IPreferencesService private preferencesService: IPreferencesService, - @ITextFileService textFileService: ITextFileService, - @IEditorGroupService editorGroupService: IEditorGroupService - ) { - super(EditableSettingsEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, textFileService, editorGroupService); - this._register({ dispose: () => dispose(this.modelDisposables) }); - this.saveDelayer = new Delayer(1000); - } - - protected createEditor(parent: Builder): void { - super.createEditor(parent); - - const codeEditor = getCodeEditor(this); - if (codeEditor) { - this._register(codeEditor.onDidChangeModel(() => this.onDidModelChange())); - } - } - - protected getAriaLabel(): string { - const input = this.input; - const inputName = input && input.getName(); - - let ariaLabel: string; - if (inputName) { - ariaLabel = nls.localize('fileEditorWithInputAriaLabel', "{0}. Text file editor.", inputName); - } else { - ariaLabel = nls.localize('fileEditorAriaLabel', "Text file editor."); - } - - return ariaLabel; - } - - setInput(input: EditorInput, options: EditorOptions): TPromise { - return super.setInput(input, options) - .then(() => this.input.resolve() - .then(editorModel => editorModel.load()) - .then(editorModel => this.getControl().setModel((editorModel).textEditorModel))); - } - - clearInput(): void { - this.modelDisposables = dispose(this.modelDisposables); - super.clearInput(); - } - - private onDidModelChange(): void { - this.modelDisposables = dispose(this.modelDisposables); - const model = getCodeEditor(this).getModel(); - if (model) { - this.preferencesService.createPreferencesEditorModel(model.uri) - .then(preferencesEditorModel => { - const settingsEditorModel = preferencesEditorModel; - this.modelDisposables.push(settingsEditorModel); - this.modelDisposables.push(model.onDidChangeContent(() => this.saveDelayer.trigger(() => settingsEditorModel.save()))); - }); - } - } -} - export class DefaultPreferencesEditor extends BaseTextEditor { public static ID: string = 'workbench.editor.defaultPreferences'; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index 8d3cf121ea1..d488a6b6a69 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -270,14 +270,12 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR this.filteredMatchesRenderer = this._register(instantiationService.createInstance(FilteredMatchesRenderer, editor)); this.editSettingActionRenderer = this._register(instantiationService.createInstance(EditSettingRenderer, editor, preferencesModel, this.settingHighlighter)); this.feedbackWidgetRenderer = this._register(instantiationService.createInstance(FeedbackWidgetRenderer, editor)); + const parenthesisHidingRenderer = this._register(instantiationService.createInstance(StaticContentHidingRenderer, editor, preferencesModel)); + this.hiddenAreasRenderer = this._register(instantiationService.createInstance(HiddenAreasRenderer, editor, [this.settingsGroupTitleRenderer, this.filteredMatchesRenderer, parenthesisHidingRenderer])); this._register(this.editSettingActionRenderer.onUpdateSetting(e => this._onUpdatePreference.fire(e))); - const parenthesisHidingRenderer = this._register(instantiationService.createInstance(StaticContentHidingRenderer, editor, preferencesModel.settingsGroups)); - - const hiddenAreasProviders = [this.settingsGroupTitleRenderer, this.filteredMatchesRenderer, parenthesisHidingRenderer]; - this.hiddenAreasRenderer = this._register(instantiationService.createInstance(HiddenAreasRenderer, editor, hiddenAreasProviders)); - this._register(this.settingsGroupTitleRenderer.onHiddenAreasChanged(() => this.hiddenAreasRenderer.render())); + this._register(preferencesModel.onDidChangeGroups(() => this.render())); this.onTriggeredFuzzy = this.settingsHeaderRenderer.onClick; } @@ -295,7 +293,6 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR this.settingsGroupTitleRenderer.render(this.preferencesModel.settingsGroups); this.editSettingActionRenderer.render(this.preferencesModel.settingsGroups, this._associatedPreferencesModel); this.feedbackWidgetRenderer.render(null); - this.hiddenAreasRenderer.render(); this.settingHighlighter.clear(true); this.settingsGroupTitleRenderer.showGroup(0); this.hiddenAreasRenderer.render(); @@ -379,7 +376,7 @@ export interface HiddenAreasProvider { export class StaticContentHidingRenderer extends Disposable implements HiddenAreasProvider { - constructor(private editor: ICodeEditor, private settingsGroups: ISettingsGroup[] + constructor(private editor: ICodeEditor, private settingsEditorModel: ISettingsEditorModel ) { super(); } @@ -388,7 +385,8 @@ export class StaticContentHidingRenderer extends Disposable implements HiddenAre const model = this.editor.getModel(); // Hide extra chars for "search results" and "commonly used" groups - const lastGroup = tail(this.settingsGroups); + const settingsGroups = this.settingsEditorModel.settingsGroups; + const lastGroup = tail(settingsGroups); return [ { startLineNumber: 1, @@ -397,10 +395,10 @@ export class StaticContentHidingRenderer extends Disposable implements HiddenAre endColumn: model.getLineMaxColumn(2) }, { - startLineNumber: this.settingsGroups[0].range.endLineNumber + 1, - startColumn: model.getLineMinColumn(this.settingsGroups[0].range.endLineNumber + 1), - endLineNumber: this.settingsGroups[0].range.endLineNumber + 4, - endColumn: model.getLineMaxColumn(this.settingsGroups[0].range.endLineNumber + 4) + startLineNumber: settingsGroups[0].range.endLineNumber + 1, + startColumn: model.getLineMinColumn(settingsGroups[0].range.endLineNumber + 1), + endLineNumber: settingsGroups[0].range.endLineNumber + 4, + endColumn: model.getLineMaxColumn(settingsGroups[0].range.endLineNumber + 4) }, { startLineNumber: lastGroup.range.endLineNumber + 1, diff --git a/src/vs/workbench/parts/preferences/browser/preferencesService.ts b/src/vs/workbench/parts/preferences/browser/preferencesService.ts index 65da66956c4..19bb214dc23 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesService.ts @@ -21,11 +21,10 @@ import { IModel } from 'vs/editor/common/editorCommon'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IPreferencesService, IPreferencesEditorModel, ISetting, getSettingsTargetName, FOLDER_SETTINGS_PATH, DEFAULT_SETTINGS_EDITOR_SETTING } from 'vs/workbench/parts/preferences/common/preferences'; -import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, DefaultSettingsModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels'; +import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, DefaultSettings, WorkspaceConfigurationEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { DefaultPreferencesEditorInput, PreferencesEditorInput } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; import { KeybindingsEditorInput } from 'vs/workbench/parts/preferences/browser/keybindingsEditor'; @@ -53,9 +52,9 @@ export class PreferencesService extends Disposable implements IPreferencesServic private _onDispose: Emitter = new Emitter(); private _defaultSettingsUriCounter = 0; - private _defaultSettingsContentModel: DefaultSettingsModel; + private _defaultSettingsContentModel: DefaultSettings; private _defaultResourceSettingsUriCounter = 0; - private _defaultResourceSettingsContentModel: DefaultSettingsModel; + private _defaultResourceSettingsContentModel: DefaultSettings; constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @@ -68,7 +67,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic @IEnvironmentService private environmentService: IEnvironmentService, @ITelemetryService private telemetryService: ITelemetryService, @ITextModelService private textModelResolverService: ITextModelService, - @IExtensionService private extensionService: IExtensionService, @IKeybindingService keybindingService: IKeybindingService, @IModelService private modelService: IModelService, @IJSONEditingService private jsonEditingService: IJSONEditingService, @@ -110,14 +108,31 @@ export class PreferencesService extends Disposable implements IPreferencesServic resolveModel(uri: URI): TPromise { if (this.isDefaultSettingsResource(uri) || this.isDefaultResourceSettingsResource(uri)) { - return this.extensionService.onReady() - .then(() => { - const scope = this.isDefaultSettingsResource(uri) ? ConfigurationScope.WINDOW : ConfigurationScope.RESOURCE; - const settingsModel = this.getDefaultSettingsModel(scope); - const mode = this.modeService.getOrCreateMode('json'); - const model = this._register(this.modelService.createModel(settingsModel.content, mode, uri)); - return model; - }); + + const scope = this.isDefaultSettingsResource(uri) ? ConfigurationScope.WINDOW : ConfigurationScope.RESOURCE; + const mode = this.modeService.getOrCreateMode('json'); + const model = this._register(this.modelService.createModel('', mode, uri)); + + let defaultSettings: DefaultSettings; + this.configurationService.onDidChangeConfiguration(e => { + if (e.source === ConfigurationTarget.DEFAULT) { + const model = this.modelService.getModel(uri); + if (!model) { + // model has not been given out => nothing to do + return; + } + defaultSettings = this.getDefaultSettings(scope); + this.modelService.updateModel(model, defaultSettings.parse()); + } + }); + + // Check if Default settings is already created and updated in above promise + if (!defaultSettings) { + defaultSettings = this.getDefaultSettings(scope); + this.modelService.updateModel(model, defaultSettings.parse()); + } + + return TPromise.as(model); } if (this.defaultKeybindingsResource.toString() === uri.toString()) { @@ -288,20 +303,20 @@ export class PreferencesService extends Disposable implements IPreferencesServic return this.textModelResolverService.createModelReference(defaultSettingsUri) .then(reference => { const scope = this.isDefaultSettingsResource(defaultSettingsUri) ? ConfigurationScope.WINDOW : ConfigurationScope.RESOURCE; - return this.instantiationService.createInstance(DefaultSettingsEditorModel, defaultSettingsUri, reference, scope, this.getDefaultSettingsModel(scope).settingsGroups); + return this.instantiationService.createInstance(DefaultSettingsEditorModel, defaultSettingsUri, reference, scope, this.getDefaultSettings(scope)); }); } - private getDefaultSettingsModel(scope: ConfigurationScope): DefaultSettingsModel { + private getDefaultSettings(scope: ConfigurationScope): DefaultSettings { switch (scope) { case ConfigurationScope.WINDOW: if (!this._defaultSettingsContentModel) { - this._defaultSettingsContentModel = new DefaultSettingsModel(this.getMostCommonlyUsedSettings(), scope); + this._defaultSettingsContentModel = new DefaultSettings(this.getMostCommonlyUsedSettings(), scope); } return this._defaultSettingsContentModel; case ConfigurationScope.RESOURCE: if (!this._defaultResourceSettingsContentModel) { - this._defaultResourceSettingsContentModel = new DefaultSettingsModel(this.getMostCommonlyUsedSettings(), scope); + this._defaultResourceSettingsContentModel = new DefaultSettings(this.getMostCommonlyUsedSettings(), scope); } return this._defaultResourceSettingsContentModel; } diff --git a/src/vs/workbench/parts/preferences/common/preferencesModels.ts b/src/vs/workbench/parts/preferences/common/preferencesModels.ts index 203dbf98d39..55712af7626 100644 --- a/src/vs/workbench/parts/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/parts/preferences/common/preferencesModels.ts @@ -8,7 +8,7 @@ import { assign } from 'vs/base/common/objects'; import { tail } from 'vs/base/common/arrays'; import URI from 'vs/base/common/uri'; import { IReference } from 'vs/base/common/lifecycle'; -import Event from 'vs/base/common/event'; +import Event, { Emitter } from 'vs/base/common/event'; import { Registry } from 'vs/platform/registry/common/platform'; import { visit, JSONVisitor } from 'vs/base/common/json'; import { IModel } from 'vs/editor/common/editorCommon'; @@ -499,7 +499,8 @@ export class WorkspaceConfigModel extends SettingsEditorModel implements ISettin } } -export class DefaultSettingsModel { +export class DefaultSettings { + private _allSettingsGroups: ISettingsGroup[]; private _content: string; @@ -525,13 +526,14 @@ export class DefaultSettingsModel { return this._allSettingsGroups; } - private parse() { + parse(): string { const configurations = Registry.as(Extensions.Configuration).getConfigurations().slice(); const settingsGroups = this.removeEmptySettingsGroups(configurations.sort(this.compareConfigurationNodes).reduce((result, config, index, array) => this.parseConfig(config, result, array), [])); this.initAllSettingsMap(settingsGroups); const mostCommonlyUsed = this.getMostCommonlyUsedSettings(settingsGroups); this._allSettingsGroups = [mostCommonlyUsed, ...settingsGroups]; this._content = this.toContent(mostCommonlyUsed, settingsGroups); + return this._content; } private initAllSettingsMap(allSettingsGroups: ISettingsGroup[]): void { @@ -678,15 +680,26 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements private _settingsByName: Map; private _mostRelevantLineOffset: number; + private _settingsGroups: ISettingsGroup[]; + + private _onDidChangeGroups: Emitter = this._register(new Emitter()); + readonly onDidChangeGroups: Event = this._onDidChangeGroups.event; + constructor( private _uri: URI, reference: IReference, readonly configurationScope: ConfigurationScope, - readonly settingsGroups: ISettingsGroup[] + defaultSettings: DefaultSettings ) { super(); + this._settingsGroups = defaultSettings.settingsGroups; + this._model = reference.object.textEditorModel; this._register(this.onDispose(() => reference.dispose())); + this._register(this._model.onDidChangeContent(() => { + this._settingsGroups = defaultSettings.settingsGroups; + this._onDidChangeGroups.fire(); + })); this.initAllSettingsMap(); this._mostRelevantLineOffset = tail(this.settingsGroups).range.endLineNumber + 2; @@ -696,6 +709,10 @@ export class DefaultSettingsEditorModel extends AbstractSettingsModel implements return this._uri; } + public get settingsGroups(): ISettingsGroup[] { + return this._settingsGroups; + } + public filterSettings(filter: string, groupFilter: IGroupFilter, settingFilter: ISettingFilter, mostRelevantSettings?: string[]): IFilterResult { if (mostRelevantSettings) { const mostRelevantGroup = this.renderMostRelevantSettings(mostRelevantSettings); -- GitLab