diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 86d1f89b0e90715c07cf4e09446b51f6fbf6ab73..67062ea9e4948c9cc2f41dfa74c22332325a7de5 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -382,7 +382,7 @@ class PreferencesRenderersController extends Disposable { private _settingsNavigator: SettingsNavigator; private _remoteFilterInProgress: TPromise; - private _prefsModelsForSearch = new Map(); + private _prefsModelsForSearch = new Map(); private _currentLocalSearchProvider: ISearchProvider; private _currentRemoteSearchProvider: ISearchProvider; @@ -396,6 +396,7 @@ class PreferencesRenderersController extends Disposable { @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, @ITelemetryService private telemetryService: ITelemetryService, @IPreferencesService private preferencesService: IPreferencesService, + @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService ) { super(); } @@ -473,17 +474,12 @@ class PreferencesRenderersController extends Disposable { const filterPs = []; if (!editableContentOnly) { - filterPs.push(this._filterOrSearchPreferences(query, this.defaultPreferencesRenderer, searchProvider, groupId, groupLabel, groupOrder)); + filterPs.push( + this._filterOrSearchPreferences(query, this.defaultPreferencesRenderer, searchProvider, groupId, groupLabel, groupOrder)); } - filterPs.push(this._filterOrSearchPreferences(query, this.editablePreferencesRenderer, searchProvider, groupId, groupLabel, groupOrder)); - const something = [ - this.searchSettingsTarget(searchProvider, ConfigurationTarget.WORKSPACE, groupId, groupLabel, groupOrder), - this.searchSettingsTarget(searchProvider, ConfigurationTarget.USER, groupId, groupLabel, groupOrder) - ]; - - // for (const folder of this.workspaceContextService.getWorkspace().folders) { - // const folderSettingsResource = this.preferencesService.getFolderSettingsResource(folder.uri); + filterPs.push(this._filterOrSearchPreferences(query, this.editablePreferencesRenderer, searchProvider, groupId, groupLabel, groupOrder), + this.updateSettingsTargetCounts(query, searchProvider, groupId, groupLabel, groupOrder)); return TPromise.join(filterPs).then(results => { const [defaultFilterResult, editableFilterResult] = results; @@ -498,6 +494,21 @@ class PreferencesRenderersController extends Disposable { }); } + private updateSettingsTargetCounts(query: string, searchProvider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise { + const searchPs = [ + this.searchSettingsTarget(searchProvider, ConfigurationTarget.WORKSPACE, groupId, groupLabel, groupOrder), + this.searchSettingsTarget(searchProvider, ConfigurationTarget.USER, groupId, groupLabel, groupOrder) + ]; + + for (const folder of this.workspaceContextService.getWorkspace().folders) { + const folderSettingsResource = this.preferencesService.getFolderSettingsResource(folder.uri); + searchPs.push(this.searchSettingsTarget(searchProvider, folderSettingsResource, groupId, groupLabel, groupOrder)); + } + + + return TPromise.join(searchPs).then(() => { }); + } + private searchSettingsTarget(provider: ISearchProvider, target: SettingsTarget, groupId: string, groupLabel: string, groupOrder: number): TPromise { return this.getPreferencesEditorModel(target).then(model => { return this._filterOrSearchPreferencesModel('', model, provider, groupId, groupLabel, groupOrder); @@ -518,12 +529,13 @@ class PreferencesRenderersController extends Disposable { target === ConfigurationTarget.WORKSPACE ? this.preferencesService.workspaceSettingsResource : target; - if (!this._prefsModelsForSearch.has(target)) { - const model = await this.preferencesService.createPreferencesEditorModel(resource); - this._prefsModelsForSearch.set(target, model); + const targetKey = resource.toString(); + if (!this._prefsModelsForSearch.has(targetKey)) { + const model = this._register(await this.preferencesService.createPreferencesEditorModel(resource)); + this._prefsModelsForSearch.set(targetKey, model); } - return this._prefsModelsForSearch.get(target); + return this._prefsModelsForSearch.get(targetKey); } focusNextPreference(forward: boolean = true) { @@ -549,15 +561,15 @@ class PreferencesRenderersController extends Disposable { } private _filterOrSearchPreferences(filter: string, preferencesRenderer: IPreferencesRenderer, provider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise { - if (preferencesRenderer) { - const model = preferencesRenderer.preferencesModel; - return this._filterOrSearchPreferencesModel(filter, model, provider, groupId, groupLabel, groupOrder).then(filterResult => { - preferencesRenderer.filterPreferences(filterResult); - return filterResult; - }); + if (!preferencesRenderer) { + return TPromise.wrap(null); } - return TPromise.wrap(null); + const model = preferencesRenderer.preferencesModel; + return this._filterOrSearchPreferencesModel(filter, model, provider, groupId, groupLabel, groupOrder).then(filterResult => { + preferencesRenderer.filterPreferences(filterResult); + return filterResult; + }); } private _filterOrSearchPreferencesModel(filter: string, model: ISettingsEditorModel, provider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 67b87c60e1b6ccf9a54bd4d309acf104dd5d2a68..54e0f675b06089535ee904416e5106a33f5f24ad 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -281,6 +281,7 @@ export class SettingsGroupTitleWidget extends Widget implements IViewZone { export class FolderSettingsActionItem extends BaseActionItem { private _folder: IWorkspaceFolder; + private _count: number; private container: HTMLElement; private anchorElement: HTMLElement; @@ -310,6 +311,11 @@ export class FolderSettingsActionItem extends BaseActionItem { this.update(); } + public setCount(value: number): void { + this._count = value; + this.update(); + } + public render(container: HTMLElement): void { this.builder = $(container); @@ -381,10 +387,18 @@ export class FolderSettingsActionItem extends BaseActionItem { if (this._folder) { this.labelElement.textContent = this._folder.name; this.anchorElement.title = this._folder.name; - this.detailsElement.textContent = this._action.label; + let detailsText = this._action.label; + if (this._count) { + detailsText += ` (${this._count})`; + } + this.detailsElement.textContent = detailsText; DOM.toggleClass(this.dropDownElement, 'hide', workspace.folders.length === 1 || !this._action.checked); } else { - this.labelElement.textContent = this._action.label; + let labelText = this._action.label; + if (this._count) { + labelText += ` (${this._count})`; + } + this.labelElement.textContent = labelText; this.detailsElement.textContent = ''; this.anchorElement.title = this._action.label; DOM.removeClass(this.dropDownElement, 'hide'); @@ -436,6 +450,7 @@ export class SettingsTargetsWidget extends Widget { private userSettings: Action; private workspaceSettings: Action; private folderSettings: FolderSettingsActionItem; + private folderSettingCounts = new Map(); private _settingsTarget: SettingsTarget; @@ -507,6 +522,12 @@ export class SettingsTargetsWidget extends Widget { } this.userSettings.label = label; + } else if (settingsTarget instanceof URI) { + this.folderSettingCounts.set(settingsTarget.toString(), count); + + let total = 0; + this.folderSettingCounts.forEach(count => total += count); + this.folderSettings.setCount(total); } }