提交 0d438de5 编写于 作者: S Sandeep Somavarapu

Fix #38329

上级 2393d4e3
......@@ -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<void>;
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<void>(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<void> {
return super.setInput(input, options)
.then(() => this.input.resolve()
.then(editorModel => editorModel.load())
.then(editorModel => this.getControl().setModel((<ResourceEditorModel>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 = <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';
......
......@@ -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,
......
......@@ -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<void> = new Emitter<void>();
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<IModel> {
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;
}
......
......@@ -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<IConfigurationRegistry>(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<string, ISetting>;
private _mostRelevantLineOffset: number;
private _settingsGroups: ISettingsGroup[];
private _onDidChangeGroups: Emitter<void> = this._register(new Emitter<void>());
readonly onDidChangeGroups: Event<void> = this._onDidChangeGroups.event;
constructor(
private _uri: URI,
reference: IReference<ITextEditorModel>,
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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册