提交 9e80cb2d 编写于 作者: B Benjamin Pasero

Reuse one sort function for file related quick open results

上级 2924e2b1
......@@ -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 {
......
......@@ -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
......
......@@ -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");
}
......
......@@ -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");
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册