From 9e80cb2db70e607241d4511c7f0150e7bc2bcea2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 5 Dec 2015 11:40:59 +0100 Subject: [PATCH] Reuse one sort function for file related quick open results --- .../parts/quickopen/browser/quickOpenModel.ts | 36 ++++++++++++++++++- .../parts/quickopen/editorHistoryModel.ts | 25 +------------ .../search/browser/openAnythingHandler.ts | 34 ++---------------- .../parts/search/browser/openFileHandler.ts | 30 +++------------- 4 files changed, 43 insertions(+), 82 deletions(-) diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index b645e70eb70..b27db82f5a6 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -8,9 +8,10 @@ import WinJS = require('vs/base/common/winjs.base'); import Types = require('vs/base/common/types'); import URI from 'vs/base/common/uri'; import Tree = require('vs/base/parts/tree/common/tree'); -import { IQuickNavigateConfiguration, IModel, IDataSource, IFilter, IRenderer, IRunner, Mode } from './quickOpen'; +import {IQuickNavigateConfiguration, IModel, IDataSource, IFilter, IRenderer, IRunner, Mode} from './quickOpen'; import ActionsRenderer = require('vs/base/parts/tree/browser/actionsRenderer'); import Actions = require('vs/base/common/actions'); +import {compareAnything} from 'vs/base/common/comparers'; import ActionBar = require('vs/base/browser/ui/actionbar/actionbar'); import TreeDefaults = require('vs/base/parts/tree/browser/treeDefaults'); import HighlightedLabel = require('vs/base/browser/ui/highlightedlabel/highlightedLabel'); @@ -121,6 +122,39 @@ export class QuickOpenEntry { public run(mode: Mode, context: IContext): boolean { return false; } + + /** + * A good default sort implementation for quick open entries + */ + public static compare(elementA: QuickOpenEntry, elementB: QuickOpenEntry, lookFor: string): number { + + // Give matches with label highlights higher priority over + // those with only description highlights + const labelHighlightsA = elementA.getHighlights()[0] || []; + const labelHighlightsB = elementB.getHighlights()[0] || []; + + if (labelHighlightsA.length && !labelHighlightsB.length) { + return -1; + } else if (!labelHighlightsA.length && labelHighlightsB.length) { + return 1; + } + + // Sort by name/path + let nameA = elementA.getLabel(); + let nameB = elementB.getLabel(); + + if (nameA === nameB) { + let resourceA = elementA.getResource(); + let resourceB = elementB.getResource(); + + if (resourceA && resourceB) { + nameA = elementA.getResource().fsPath; + nameB = elementB.getResource().fsPath; + } + } + + return compareAnything(nameA, nameB, lookFor); + } } export class QuickOpenEntryItem extends QuickOpenEntry { diff --git a/src/vs/workbench/browser/parts/quickopen/editorHistoryModel.ts b/src/vs/workbench/browser/parts/quickopen/editorHistoryModel.ts index 84d3fb75ff1..3d9f780ca3b 100644 --- a/src/vs/workbench/browser/parts/quickopen/editorHistoryModel.ts +++ b/src/vs/workbench/browser/parts/quickopen/editorHistoryModel.ts @@ -245,30 +245,7 @@ export class EditorHistoryModel extends QuickOpenModel { if (searchValue) { let normalizedSearchValue = strings.stripWildcards(searchValue.toLowerCase()); - return results.sort((elementA: EditorHistoryEntry, elementB: EditorHistoryEntry) => { - - // Give matches with label highlights higher priority over - // those with only description highlights - const labelHighlightsA = elementA.getHighlights()[0] || []; - const labelHighlightsB = elementB.getHighlights()[0] || []; - - if (labelHighlightsA.length && !labelHighlightsB.length) { - return -1; - } else if (!labelHighlightsA.length && labelHighlightsB.length) { - return 1; - } - - // Sort by name/path - let nameA = elementA.getInput().getName(); - let nameB = elementB.getInput().getName(); - - if (nameA === nameB) { - nameA = elementA.getResource().fsPath; - nameB = elementB.getResource().fsPath; - } - - return comparers.compareAnything(nameA, nameB, normalizedSearchValue); - }); + return results.sort((elementA: EditorHistoryEntry, elementB: EditorHistoryEntry) => QuickOpenEntry.compare(elementA, elementB, normalizedSearchValue)); } // Leave default "most recently used" order if user is not actually searching diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index 40c5df2402d..0e85c3056e1 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -141,7 +141,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Sort let normalizedSearchValue = strings.stripWildcards(searchValue.toLowerCase()); - result.sort((elementA, elementB) => this.compareResults(elementA, elementB, normalizedSearchValue)); + result.sort((elementA, elementB) => QuickOpenEntry.compare(elementA, elementB, normalizedSearchValue)); // Apply Range result.forEach((element) => { @@ -248,7 +248,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Sort let normalizedSearchValue = strings.stripWildcards(searchValue.toLowerCase()); - results.sort((elementA, elementB) => this.compareResults(elementA, elementB, normalizedSearchValue)); + results.sort((elementA, elementB) => QuickOpenEntry.compare(elementA, elementB, normalizedSearchValue)); // Apply Range results.forEach((element) => { @@ -260,36 +260,6 @@ export class OpenAnythingHandler extends QuickOpenHandler { return results; } - private compareResults(elementA:QuickOpenEntry, elementB:QuickOpenEntry, searchValue: string): number { - - // Give matches with label highlights higher priority over - // those with only description highlights - const labelHighlightsA = elementA.getHighlights()[0] || []; - const labelHighlightsB = elementB.getHighlights()[0] || []; - - if (labelHighlightsA.length && !labelHighlightsB.length) { - return -1; - } else if (!labelHighlightsA.length && labelHighlightsB.length) { - return 1; - } - - // Sort by name/path - let nameA = elementA.getLabel(); - let nameB = elementB.getLabel(); - - if (nameA === nameB) { - let resourceA = elementA.getResource(); - let resourceB = elementB.getResource(); - - if (resourceA && resourceB) { - nameA = elementA.getResource().fsPath; - nameB = elementB.getResource().fsPath; - } - } - - return compareAnything(nameA, nameB, searchValue); - } - public getGroupLabel(): string { return nls.localize('fileAndTypeResults', "file and symbol results"); } diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/parts/search/browser/openFileHandler.ts index 167ed3dd41f..a33aae6113c 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/parts/search/browser/openFileHandler.ts @@ -144,11 +144,7 @@ export class OpenFileHandler extends QuickOpenHandler { let searchResult = this.instantiationService.createInstance(SearchResult, null); searchResult.append(complete.results); - // Sort (standalone only) let matches = searchResult.matches(); - if (this.isStandalone) { - matches = matches.sort((elementA, elementB) => this.sort(elementA, elementB, searchValue.toLowerCase())); - } // Highlight let results: QuickOpenEntry[] = []; @@ -178,31 +174,15 @@ export class OpenFileHandler extends QuickOpenHandler { results.push(this.instantiationService.createInstance(FileEntry, fileMatch.name(), description, fileMatch.resource(), labelHighlights, descriptionHighlights)); } + // Sort (standalone only) + if (this.isStandalone) { + results = results.sort((elementA, elementB) => QuickOpenEntry.compare(elementA, elementB, searchValue.toLowerCase())); + } + return results; }); } - private sort(elementA: FileMatch, elementB: FileMatch, searchValue: string): number { - let elementAName = elementA.name().toLowerCase(); - let elementBName = elementB.name().toLowerCase(); - - // Sort matches that have search value in beginning to the top - let elementAPrefixMatch = elementAName.indexOf(searchValue) === 0; - let elementBPrefixMatch = elementBName.indexOf(searchValue) === 0; - if (elementAPrefixMatch !== elementBPrefixMatch) { - return elementAPrefixMatch ? -1 : 1; - } - - // Compare by name - let r = comparers.compareFileNames(elementAName, elementBName); - if (r !== 0) { - return r; - } - - // Otherwise do full compare with path info - return strings.localeCompare(elementA.resource().fsPath, elementB.resource().fsPath); - } - public getGroupLabel(): string { return nls.localize('searchResults', "search results"); } -- GitLab