diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 1bd1a933136..39a7a0a2cd1 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -14,12 +14,12 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; -export function createComposedTreeListOptions>(options?: IListOptions): O | undefined { +function asListOptions(options?: IAbstractTreeOptions): IListOptions> | undefined { if (!options) { return undefined; } - let identityProvider: IIdentityProvider | undefined = undefined; + let identityProvider: IIdentityProvider> | undefined = undefined; if (options.identityProvider) { const ip = options.identityProvider; @@ -30,7 +30,7 @@ export function createComposedTreeListOptions | undefined = undefined; + let multipleSelectionController: IMultipleSelectionController> | undefined = undefined; if (options.multipleSelectionController) { const msc = options.multipleSelectionController; @@ -44,7 +44,7 @@ export function createComposedTreeListOptions | undefined = undefined; + let accessibilityProvider: IAccessibilityProvider> | undefined = undefined; if (options.accessibilityProvider) { const ap = options.accessibilityProvider; @@ -60,7 +60,7 @@ export function createComposedTreeListOptions implements IListVirtualDelegate { @@ -232,7 +232,7 @@ export abstract class AbstractTree implements IDisposable const treeRenderers = renderers.map(r => new TreeRenderer(r, onDidChangeCollapseStateRelay.event)); this.disposables.push(...treeRenderers); - this.view = new List(container, treeDelegate, treeRenderers, createComposedTreeListOptions(options)); + this.view = new List(container, treeDelegate, treeRenderers, asListOptions(options)); this.model = this.createModel(this.view, options); onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index d93c5ce6c9f..63a01d1b0ac 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -3,15 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ComposedTreeDelegate, createComposedTreeListOptions, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; +import { ComposedTreeDelegate, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; import { ObjectTree, IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTree'; -import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { ITreeElement, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; +import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; +import { ITreeElement, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter } from 'vs/base/browser/ui/tree/tree'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Emitter, Event, mapEvent } from 'vs/base/common/event'; import { timeout, always } from 'vs/base/common/async'; import { ISequence } from 'vs/base/common/iterator'; -import { IListStyles } from 'vs/base/browser/ui/list/listWidget'; +import { IListStyles, IMultipleSelectionController, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { toggleClass } from 'vs/base/browser/dom'; export interface IDataSource> { @@ -125,6 +125,68 @@ export interface IChildrenResolutionEvent { export interface IAsyncDataTreeOptions extends IAbstractTreeOptions { } +function asObjectTreeOptions(options?: IAsyncDataTreeOptions): IObjectTreeOptions, TFilterData> | undefined { + if (!options) { + return undefined; + } + + let identityProvider: IIdentityProvider> | undefined = undefined; + + if (options.identityProvider) { + const ip = options.identityProvider; + identityProvider = { + getId(el) { + return ip.getId(el.element!); + } + }; + } + + let multipleSelectionController: IMultipleSelectionController> | undefined = undefined; + + if (options.multipleSelectionController) { + const msc = options.multipleSelectionController; + multipleSelectionController = { + isSelectionSingleChangeEvent(e) { + return msc.isSelectionSingleChangeEvent({ ...e, element: e.element } as any); + }, + isSelectionRangeChangeEvent(e) { + return msc.isSelectionRangeChangeEvent({ ...e, element: e.element } as any); + } + }; + } + + let accessibilityProvider: IAccessibilityProvider> | undefined = undefined; + + if (options.accessibilityProvider) { + const ap = options.accessibilityProvider; + accessibilityProvider = { + getAriaLabel(e) { + return ap.getAriaLabel(e.element!); + } + }; + } + + let filter: ITreeFilter, TFilterData> | undefined = undefined; + + if (options.filter) { + const f = options.filter; + filter = { + filter(element, parentVisibility) { + return f.filter(element.element!, parentVisibility); + } + }; + } + + return { + ...options, + identityProvider, + multipleSelectionController, + accessibilityProvider, + filter + }; +} + + export class AsyncDataTree, TFilterData = void> implements IDisposable { private tree: ObjectTree, TFilterData>; @@ -160,7 +222,7 @@ export class AsyncDataTree, TFilterData = void> imple ) { const objectTreeDelegate = new ComposedTreeDelegate>(delegate); const objectTreeRenderers = renderers.map(r => new DataTreeRenderer(r, this._onDidChangeNodeState.event)); - const objectTreeOptions = createComposedTreeListOptions, IObjectTreeOptions, TFilterData>>(options) || {}; + const objectTreeOptions = asObjectTreeOptions(options) || {}; objectTreeOptions.collapseByDefault = true; this.tree = new ObjectTree(container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions);