diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 4587d77e626..445c3b71909 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -25,7 +25,6 @@ import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { Event, Emitter } from 'vs/base/common/event'; import { createStyleSheet, addStandardDisposableListener } from 'vs/base/browser/dom'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; -import { FuzzyScore } from 'vs/base/common/filters'; import { InputBox, IInputOptions } from 'vs/base/browser/ui/inputbox/inputBox'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -559,7 +558,10 @@ export class TreeResourceNavigator extends Disposable { export interface IHighlightingRenderer extends ITreeRenderer { - updateHighlights(tree: ITree, element: any, pattern: string): FuzzyScore; + /** + * Update hightlights and return the best matching element + */ + updateHighlights(tree: ITree, pattern: string): any; } export interface IHighlightingTreeConfiguration extends ITreeConfiguration { @@ -671,27 +673,29 @@ export class HighlightingWorkbenchTree extends WorkbenchTree { super.layout(isNaN(height) ? height : height - this.input.height, width); } + private lastSelection: any[]; + private updateHighlights(pattern: string): void { - let nav = this.getNavigator(undefined, false); - let topScore: FuzzyScore; - let topElement: any; - while (nav.next()) { - let element = nav.current(); - let score = this.renderer.updateHighlights(this, element, pattern); - if (!topScore || score && topScore[0] < score[0]) { - topScore = score; - topElement = element; - } - this.refresh(element).then(undefined, onUnexpectedError); + + // remember old selection + let defaultSelection: any[]; + if (!this.lastSelection && pattern) { + this.lastSelection = this.getSelection(); + defaultSelection = []; + } else if (this.lastSelection && !pattern) { + defaultSelection = this.lastSelection; + this.lastSelection = []; } - if (topElement) { + + let topElement = this.renderer.updateHighlights(this, pattern); + if (topElement && pattern) { this.reveal(topElement).then(_ => { - this.setFocus(topElement); this.setSelection([topElement], this); + return this.refresh(); }, onUnexpectedError); } else { - this.setSelection([], this); - this.setFocus(undefined); + this.setSelection(defaultSelection, this); + this.refresh().then(undefined, onUnexpectedError); } } } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts index ac7520596fa..75e9ccd8694 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts @@ -136,7 +136,7 @@ export class FileDataSource implements IDataSource { export class FileRenderer implements IRenderer, IHighlightingRenderer { - private readonly _scores = new WeakMap(); + private readonly _scores = new Map(); constructor( @IInstantiationService private readonly _instantiationService: IInstantiationService @@ -159,7 +159,7 @@ export class FileRenderer implements IRenderer, IHighlightingRenderer { hidePath: true, fileKind: element.isDirectory ? FileKind.FOLDER : FileKind.FILE, fileDecorations: { colors: true, badges: true }, - matches: createMatches((this._scores.get(element) || [, []])[1]) + matches: createMatches((this._scores.get(element.resource.toString()) || [, []])[1]) }); } @@ -167,10 +167,20 @@ export class FileRenderer implements IRenderer, IHighlightingRenderer { templateData.dispose(); } - updateHighlights(tree: ITree, element: any, pattern: string): FuzzyScore { - let score = fuzzyScore(pattern, (element as IFileStat).name, undefined, true); - this._scores.set(element, score); - return score; + updateHighlights(tree: ITree, pattern: string): any { + let nav = tree.getNavigator(undefined, false); + let topScore: FuzzyScore; + let topElement: any; + while (nav.next()) { + let element = nav.current() as IFileStat; + let score = fuzzyScore(pattern, element.name, undefined, true); + this._scores.set(element.resource.toString(), score); + if (!topScore || score && topScore[0] < score[0]) { + topScore = score; + topElement = element; + } + } + return topElement; } } @@ -227,13 +237,10 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { class HighlightingOutlineRenderer extends OutlineRenderer implements IHighlightingRenderer { - updateHighlights(tree: ITree, element: any, pattern: string): FuzzyScore { - if (element instanceof OutlineElement) { - return element.score = fuzzyScore(pattern, element.symbol.name, undefined, true) || [-1, []]; - } - return undefined; + updateHighlights(tree: ITree, pattern: string): any { + let model = OutlineModel.get(tree.getInput()); + return model.updateMatches(pattern); } - } export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker {