diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index fb63ef3b79dd3399a25e8b1117004446c2beb0da..4351939a1282da1831d4167a90259f35b905aa1d 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -211,7 +211,7 @@ background: url('edit_inverse.svg') center center no-repeat; } -.monaco-editor .invalidSetting { +.monaco-editor .dim-configuration { color: #b1b1b1; } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index 0f3cbc08421d159be26bf493c2f60ea5cea3e3aa..2f4243b504b3a26e4ad116fdbb6c8a14ccd6f2f6 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -31,6 +31,7 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { IWorkspaceContextService } from "vs/platform/workspace/common/workspace"; export interface IPreferencesRenderer extends IDisposable { preferencesModel: IPreferencesEditorModel; @@ -171,6 +172,7 @@ export class UserSettingsRenderer extends Disposable implements IPreferencesRend export class WorkspaceSettingsRenderer extends UserSettingsRenderer implements IPreferencesRenderer { private untrustedSettingRenderer: UnsupportedWorkspaceSettingsRenderer; + private workspaceConfigurationRenderer: WorkspaceConfigurationRenderer; constructor(editor: ICodeEditor, preferencesModel: SettingsEditorModel, associatedPreferencesModel: IPreferencesEditorModel, @IPreferencesService preferencesService: IPreferencesService, @@ -182,6 +184,7 @@ export class WorkspaceSettingsRenderer extends UserSettingsRenderer implements I ) { super(editor, preferencesModel, associatedPreferencesModel, preferencesService, telemetryService, textFileService, configurationEditingService, messageService, instantiationService); this.untrustedSettingRenderer = this._register(instantiationService.createInstance(UnsupportedWorkspaceSettingsRenderer, editor, preferencesModel)); + this.workspaceConfigurationRenderer = this._register(instantiationService.createInstance(WorkspaceConfigurationRenderer, editor, preferencesModel)); } protected createHeader(): void { @@ -191,6 +194,7 @@ export class WorkspaceSettingsRenderer extends UserSettingsRenderer implements I public render(): void { super.render(); this.untrustedSettingRenderer.render(); + this.workspaceConfigurationRenderer.render(); } } @@ -975,7 +979,6 @@ class UnsupportedWorkbenchSettingsRenderer extends Disposable { constructor(private editor: editorCommon.ICommonCodeEditor, private workspaceSettingsEditorModel: SettingsEditorModel, @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService, - @IMarkerService private markerService: IMarkerService ) { super(); this._register(this.configurationService.onDidUpdateConfiguration(() => this.render())); @@ -1006,7 +1009,7 @@ class UnsupportedWorkbenchSettingsRenderer extends Disposable { private static _INVALID_SETTING_ = ModelDecorationOptions.register({ stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: 'invalidSetting', + inlineClassName: 'dim-configuration', hoverMessage: nls.localize('unsupportedWorkbenchSetting', "Setting is dimmed because it cannot be configured for folder resources.") }); @@ -1017,6 +1020,63 @@ class UnsupportedWorkbenchSettingsRenderer extends Disposable { }; } + public dispose(): void { + if (this.decorationIds) { + this.decorationIds = this.editor.changeDecorations(changeAccessor => { + return changeAccessor.deltaDecorations(this.decorationIds, []); + }); + } + super.dispose(); + } +} + +class WorkspaceConfigurationRenderer extends Disposable { + + private decorationIds: string[] = []; + private renderingDelayer: Delayer = new Delayer(200); + + constructor(private editor: editorCommon.ICommonCodeEditor, private workspaceSettingsEditorModel: SettingsEditorModel, + @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService + ) { + super(); + this._register(this.editor.getModel().onDidChangeContent(() => this.renderingDelayer.trigger(() => this.render()))); + } + + public render(): void { + if (this.workspaceContextService.hasMultiFolderWorkspace()) { + this.editor.changeDecorations(changeAccessor => this.decorationIds = changeAccessor.deltaDecorations(this.decorationIds, [])); + + const ranges: IRange[] = []; + for (const settingsGroup of this.workspaceSettingsEditorModel.settingsGroups) { + for (const section of settingsGroup.sections) { + for (const setting of section.settings) { + if (setting.key !== 'settings') { + ranges.push({ + startLineNumber: setting.keyRange.startLineNumber, + startColumn: setting.keyRange.startColumn - 1, + endLineNumber: setting.valueRange.endLineNumber, + endColumn: setting.valueRange.endColumn + }); + } + } + } + } + this.editor.changeDecorations(changeAccessor => this.decorationIds = changeAccessor.deltaDecorations(this.decorationIds, ranges.map(range => this.createDecoration(range, this.editor.getModel())))); + } + } + + private static _DIM_CONFIGURATION_ = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'dim-configuration' + }); + + private createDecoration(range: IRange, model: editorCommon.IModel): editorCommon.IModelDeltaDecoration { + return { + range, + options: WorkspaceConfigurationRenderer._DIM_CONFIGURATION_ + }; + } + public dispose(): void { if (this.decorationIds) { this.decorationIds = this.editor.changeDecorations(changeAccessor => {