diff --git a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts index b8a9965b357cf1eda1ea72814e01bd641ef0d0d4..0981ade923a5efdf325df0ecca17795326e08146 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts @@ -54,11 +54,11 @@ import { ISequence, ISplice } from 'vs/base/common/sequence'; import { ResourceTree, IBranchNode, isBranchNode, INode } from 'vs/base/common/resourceTree'; import { ObjectTree, ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; import { Iterator } from 'vs/base/common/iterator'; -import * as paths from 'vs/base/common/path'; -import { ICompressedTreeNode, ICompressedTreeElement, compress } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; +import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { URI } from 'vs/base/common/uri'; import { FileKind } from 'vs/platform/files/common/files'; import { compareFileNames } from 'vs/base/common/comparers'; +import { FuzzyScore, createMatches } from 'vs/base/common/filters'; export interface ISpliceEvent { index: number; @@ -378,7 +378,7 @@ interface ResourceGroupTemplate { dispose: () => void; } -class ResourceGroupRenderer implements ICompressibleTreeRenderer { +class ResourceGroupRenderer implements ICompressibleTreeRenderer { static TEMPLATE_ID = 'resource group'; get templateId(): string { return ResourceGroupRenderer.TEMPLATE_ID; } @@ -407,7 +407,7 @@ class ResourceGroupRenderer implements ICompressibleTreeRenderer, index: number, template: ResourceGroupTemplate): void { + renderElement(node: ITreeNode, index: number, template: ResourceGroupTemplate): void { template.elementDisposable.dispose(); const group = node.element; @@ -425,11 +425,11 @@ class ResourceGroupRenderer implements ICompressibleTreeRenderer, void>, index: number, templateData: ResourceGroupTemplate, height: number | undefined): void { + renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: ResourceGroupTemplate, height: number | undefined): void { throw new Error('Should never happen since node is incompressible'); } - disposeElement(group: ITreeNode, index: number, template: ResourceGroupTemplate): void { + disposeElement(group: ITreeNode, index: number, template: ResourceGroupTemplate): void { template.elementDisposable.dispose(); } @@ -470,7 +470,7 @@ class MultipleSelectionActionRunner extends ActionRunner { } } -class ResourceRenderer implements ICompressibleTreeRenderer, void, ResourceTemplate> { +class ResourceRenderer implements ICompressibleTreeRenderer, FuzzyScore, ResourceTemplate> { static TEMPLATE_ID = 'resource'; get templateId(): string { return ResourceRenderer.TEMPLATE_ID; } @@ -486,7 +486,7 @@ class ResourceRenderer implements ICompressibleTreeRenderer | ITreeNode>, index: number, template: ResourceTemplate): void { + renderElement(node: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { template.elementDisposable.dispose(); const resource = node.element; @@ -512,7 +512,12 @@ class ResourceRenderer implements ICompressibleTreeRenderer | ICompressedTreeNode>, void>, index: number, template: ResourceTemplate, height: number | undefined): void { + renderCompressedElements(node: ITreeNode | ICompressedTreeNode>, FuzzyScore>, index: number, template: ResourceTemplate, height: number | undefined): void { template.elementDisposable.dispose(); const compressed = node.element as ICompressedTreeNode>; @@ -548,7 +553,11 @@ class ResourceRenderer implements ICompressibleTreeRenderer e.name).join('/'); const uri = URI.file(resource.path); const fileKind = FileKind.FOLDER; - template.fileLabel.setResource({ resource: uri, name: label }, { fileDecorations: { colors: false, badges: true }, fileKind }); + template.fileLabel.setResource({ resource: uri, name: label }, { + fileDecorations: { colors: false, badges: true }, + fileKind, + matches: createMatches(node.filterData) + }); template.actionBar.clear(); template.actionBar.context = resource; @@ -562,7 +571,7 @@ class ResourceRenderer implements ICompressibleTreeRenderer | ITreeNode>, index: number, template: ResourceTemplate): void { + disposeElement(resource: ITreeNode | ITreeNode, FuzzyScore>, index: number, template: ResourceTemplate): void { template.elementDisposable.dispose(); } @@ -619,6 +628,21 @@ export class SCMTreeSorter implements ITreeSorter { } } +export class SCMTreeKeyboardNavigationLabelProvider implements IKeyboardNavigationLabelProvider { + + getKeyboardNavigationLabel(element: TreeElement): { toString(): string; } | undefined { + if (isSCMResourceGroup(element)) { + return element.label; + } + + if (isSCMResource(element)) { + return basename(element.sourceUri); + } + + return ''; + } +} + const scmResourceIdentityProvider = new class implements IIdentityProvider { getId(e: TreeElement): string { if (isBranchNode(e)) { @@ -634,18 +658,6 @@ const scmResourceIdentityProvider = new class implements IIdentityProvider { - getKeyboardNavigationLabel(e: TreeElement) { - if (isBranchNode(e)) { - return paths.posix.basename(e.path); - } else if (isSCMResource(e)) { - return basename(e.sourceUri); - } else { - return e.label; - } - } -}; - // function isGroupVisible(group: ISCMResourceGroup) { // return group.elements.length > 0 || !group.hideWhenEmpty; // } @@ -678,12 +690,13 @@ class ResourceGroupSplicer { constructor( groupSequence: ISequence, - private tree: ObjectTree + private tree: ObjectTree ) { groupSequence.onDidSplice(this.onDidSpliceGroups, this, this.disposables); this.onDidSpliceGroups({ start: 0, deleteCount: 0, toInsert: groupSequence.elements }); } + // TODO@joao: optimize private fullRefresh(): void { this.tree.setChildren(null, this.items.map(item => { return { @@ -820,7 +833,7 @@ export class RepositoryPanel extends ViewletPanel { private inputBoxContainer: HTMLElement; private inputBox: InputBox; private listContainer: HTMLElement; - private tree: ObjectTree; + private tree: ObjectTree; private listLabels: ResourceLabels; private menus: SCMMenus; private visibilityDisposables: IDisposable[] = []; @@ -957,6 +970,7 @@ export class RepositoryPanel extends ViewletPanel { const filter = new SCMTreeFilter(); const sorter = new SCMTreeSorter(); + const keyboardNavigationLabelProvider = new SCMTreeKeyboardNavigationLabelProvider(); this.tree = this.instantiationService.createInstance( WorkbenchCompressibleObjectTree, @@ -966,10 +980,10 @@ export class RepositoryPanel extends ViewletPanel { renderers, { identityProvider: scmResourceIdentityProvider, - keyboardNavigationLabelProvider: scmKeyboardNavigationLabelProvider, horizontalScrolling: false, filter, - sorter + sorter, + keyboardNavigationLabelProvider }); this._register(Event.chain(this.tree.onDidOpen)