diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index f363d51e8fde2bc2795a029d339d9d6294c4ae93..86d1f89b0e90715c07cf4e09446b51f6fbf6ab73 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -119,7 +119,6 @@ export class PreferencesEditor extends BaseEditor { constructor( @IPreferencesService private preferencesService: IPreferencesService, - @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, @ITelemetryService telemetryService: ITelemetryService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IContextKeyService private contextKeyService: IContextKeyService, @@ -155,7 +154,7 @@ export class PreferencesEditor extends BaseEditor { this._register(this.sideBySidePreferencesWidget.onFocus(() => this.lastFocusedWidget = this.sideBySidePreferencesWidget)); this._register(this.sideBySidePreferencesWidget.onDidSettingsTargetChange(target => this.switchSettings(target))); - this.preferencesRenderers = this._register(new PreferencesRenderersController(this.preferencesSearchService, this.telemetryService)); + this.preferencesRenderers = this._register(this.instantiationService.createInstance(PreferencesRenderersController)); this._register(this.preferencesRenderers.onDidFilterResultsCountChange(count => this.showSearchResultsMessage(count))); } @@ -286,17 +285,20 @@ export class PreferencesEditor extends BaseEditor { }); } - private showSearchResultsMessage(count: number): void { - if (this.searchWidget.getValue()) { - if (count === 0) { - this.searchWidget.showMessage(nls.localize('noSettingsFound', "No Results"), count); - } else if (count === 1) { - this.searchWidget.showMessage(nls.localize('oneSettingFound', "1 Setting Found"), count); + private showSearchResultsMessage(count: IPreferencesCount): void { + const countValue = count.count; + if (count.target) { + this.sideBySidePreferencesWidget.setResultCount(count.target, count.count); + } else if (this.searchWidget.getValue()) { + if (countValue === 0) { + this.searchWidget.showMessage(nls.localize('noSettingsFound', "No Results"), countValue); + } else if (countValue === 1) { + this.searchWidget.showMessage(nls.localize('oneSettingFound', "1 Setting Found"), countValue); } else { - this.searchWidget.showMessage(nls.localize('settingsFound', "{0} Settings Found", count), count); + this.searchWidget.showMessage(nls.localize('settingsFound', "{0} Settings Found", countValue), countValue); } } else { - this.searchWidget.showMessage(nls.localize('totalSettingsMessage', "Total {0} Settings", count), count); + this.searchWidget.showMessage(nls.localize('totalSettingsMessage', "Total {0} Settings", countValue), countValue); } } @@ -365,6 +367,11 @@ interface IFilterOrSearchResult { metadata: IStringDictionary; } +interface IPreferencesCount { + target?: SettingsTarget; + count: number; +} + class PreferencesRenderersController extends Disposable { private _defaultPreferencesRenderer: IPreferencesRenderer; @@ -375,18 +382,20 @@ class PreferencesRenderersController extends Disposable { private _settingsNavigator: SettingsNavigator; private _remoteFilterInProgress: TPromise; + private _prefsModelsForSearch = new Map(); private _currentLocalSearchProvider: ISearchProvider; private _currentRemoteSearchProvider: ISearchProvider; private _lastQuery: string; private _lastFilterResult: IFilterOrSearchResult; - private _onDidFilterResultsCountChange: Emitter = this._register(new Emitter()); - public onDidFilterResultsCountChange: Event = this._onDidFilterResultsCountChange.event; + private _onDidFilterResultsCountChange: Emitter = this._register(new Emitter()); + public onDidFilterResultsCountChange: Event = this._onDidFilterResultsCountChange.event; constructor( - private preferencesSearchService: IPreferencesSearchService, - private telemetryService: ITelemetryService + @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, + @ITelemetryService private telemetryService: ITelemetryService, + @IPreferencesService private preferencesService: IPreferencesService, ) { super(); } @@ -468,6 +477,13 @@ class PreferencesRenderersController extends Disposable { } 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); return TPromise.join(filterPs).then(results => { const [defaultFilterResult, editableFilterResult] = results; @@ -482,6 +498,34 @@ class PreferencesRenderersController extends Disposable { }); } + 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); + }).then(result => { + const count = result ? this._flatten(result.filteredGroups).length : 0; + this._onDidFilterResultsCountChange.fire({ target, count }); + }, err => { + if (!isPromiseCanceledError(err)) { + return TPromise.wrapError(err); + } + + return null; + }); + } + + private async getPreferencesEditorModel(target: SettingsTarget): TPromise { + const resource = target === ConfigurationTarget.USER ? this.preferencesService.userSettingsResource : + target === ConfigurationTarget.WORKSPACE ? this.preferencesService.workspaceSettingsResource : + target; + + if (!this._prefsModelsForSearch.has(target)) { + const model = await this.preferencesService.createPreferencesEditorModel(resource); + this._prefsModelsForSearch.set(target, model); + } + + return this._prefsModelsForSearch.get(target); + } + focusNextPreference(forward: boolean = true) { if (!this._settingsNavigator) { return; @@ -507,48 +551,53 @@ 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; - const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null); - return searchP - .then(null, err => { - if (isPromiseCanceledError(err)) { - return TPromise.wrapError(err); - } else { - /* __GDPR__ - "defaultSettings.searchError" : { - "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - const message = getErrorMessage(err).trim(); - if (message) { - // Empty message = any generic network error - this.telemetryService.publicLog('defaultSettings.searchError', { message }); - } - - return null; - } - }) - .then(searchResult => { - const filterResult = searchResult ? - model.updateResultGroup(groupId, { - id: groupId, - label: groupLabel, - result: searchResult, - order: groupOrder - }) : - model.updateResultGroup(groupId, null); - - if (filterResult) { - filterResult.query = filter; - } - - preferencesRenderer.filterPreferences(filterResult); - return filterResult; - }); + return this._filterOrSearchPreferencesModel(filter, model, provider, groupId, groupLabel, groupOrder).then(filterResult => { + preferencesRenderer.filterPreferences(filterResult); + return filterResult; + }); } return TPromise.wrap(null); } + private _filterOrSearchPreferencesModel(filter: string, model: ISettingsEditorModel, provider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise { + const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null); + return searchP + .then(null, err => { + if (isPromiseCanceledError(err)) { + return TPromise.wrapError(err); + } else { + /* __GDPR__ + "defaultSettings.searchError" : { + "message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + const message = getErrorMessage(err).trim(); + if (message) { + // Empty message = any generic network error + this.telemetryService.publicLog('defaultSettings.searchError', { message }); + } + return null; + } + }) + .then(searchResult => { + const filterResult = searchResult ? + model.updateResultGroup(groupId, { + id: groupId, + label: groupLabel, + result: searchResult, + order: groupOrder + }) : + model.updateResultGroup(groupId, null); + + if (filterResult) { + filterResult.query = filter; + } + + return filterResult; + }); + } + private consolidateAndUpdate(defaultFilterResult: IFilterResult, editableFilterResult: IFilterResult): void { const defaultPreferencesFilteredGroups = defaultFilterResult ? defaultFilterResult.filteredGroups : this._getAllPreferences(this._defaultPreferencesRenderer); const editablePreferencesFilteredGroups = editableFilterResult ? editableFilterResult.filteredGroups : this._getAllPreferences(this._editablePreferencesRenderer); @@ -556,7 +605,7 @@ class PreferencesRenderersController extends Disposable { this._settingsNavigator = new SettingsNavigator(this._lastQuery ? consolidatedSettings : []); const totalCount = consolidatedSettings.length; - this._onDidFilterResultsCountChange.fire(totalCount); + this._onDidFilterResultsCountChange.fire({ count: totalCount }); } private _getAllPreferences(preferencesRenderer: IPreferencesRenderer): ISettingsGroup[] { @@ -705,6 +754,10 @@ class SideBySidePreferencesWidget extends Widget { }); } + public setResultCount(settingsTarget: SettingsTarget, count: number): void { + this.settingsTargetsWidget.setResultCount(settingsTarget, count); + } + public layout(dimension: Dimension): void { this.dimension = dimension; this.sash.setDimenesion(this.dimension); diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 78cba03e94db28a70daed1bdfca0b09d47f77617..67b87c60e1b6ccf9a54bd4d309acf104dd5d2a68 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -492,6 +492,24 @@ export class SettingsTargetsWidget extends Widget { } } + public setResultCount(settingsTarget: SettingsTarget, count: number): void { + if (settingsTarget === ConfigurationTarget.WORKSPACE) { + let label = localize('workspaceSettings', "Workspace Settings"); + if (count) { + label += ` (${count})`; + } + + this.workspaceSettings.label = label; + } else if (settingsTarget === ConfigurationTarget.USER) { + let label = localize('userSettings', "User Settings"); + if (count) { + label += ` (${count})`; + } + + this.userSettings.label = label; + } + } + private onWorkbenchStateChanged(): void { this.folderSettings.folder = null; this.update();