Merge branch 'master' into update_electron

This commit is contained in:
Robo 2019-08-30 08:42:48 -07:00 committed by GitHub
commit a3832879a4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 291 additions and 236 deletions

View file

@ -105,3 +105,10 @@ export interface IListDragAndDrop<T> {
onDragOver(data: IDragAndDropData, targetElement: T | undefined, targetIndex: number | undefined, originalEvent: DragEvent): boolean | IListDragOverReaction;
drop(data: IDragAndDropData, targetElement: T | undefined, targetIndex: number | undefined, originalEvent: DragEvent): void;
}
export class ListError extends Error {
constructor(user: string, message: string) {
super(`ListError [${user}] ${message}`);
}
}

View file

@ -76,13 +76,14 @@ export class PagedList<T> implements IDisposable {
private _model!: IPagedModel<T>;
constructor(
user: string,
container: HTMLElement,
virtualDelegate: IListVirtualDelegate<number>,
renderers: IPagedRenderer<T, any>[],
options: IListOptions<any> = {}
) {
const pagedRenderers = renderers.map(r => new PagedRenderer<T, ITemplateData<T>>(r, () => this.model));
this.list = new List(container, virtualDelegate, pagedRenderers, options);
this.list = new List(user, container, virtualDelegate, pagedRenderers, options);
}
getHTMLElement(): HTMLElement {

View file

@ -16,7 +16,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { Event, Emitter, EventBufferer } from 'vs/base/common/event';
import { domEvent } from 'vs/base/browser/event';
import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider, IKeyboardNavigationLabelProvider, IListDragAndDrop, IListDragOverReaction, ListAriaRootRole } from './list';
import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent, IListTouchEvent, IListGestureEvent, IIdentityProvider, IKeyboardNavigationLabelProvider, IListDragAndDrop, IListDragOverReaction, ListAriaRootRole, ListError } from './list';
import { ListView, IListViewOptions, IListViewDragAndDrop, IAriaProvider } from './listView';
import { Color } from 'vs/base/common/color';
import { mixin } from 'vs/base/common/objects';
@ -1170,6 +1170,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
readonly onDidDispose: Event<void> = this._onDidDispose.event;
constructor(
private user: string,
container: HTMLElement,
virtualDelegate: IListVirtualDelegate<T>,
renderers: IListRenderer<any /* TODO@joao */, any>[],
@ -1261,11 +1262,11 @@ export class List<T> implements ISpliceable<T>, IDisposable {
splice(start: number, deleteCount: number, elements: T[] = []): void {
if (start < 0 || start > this.view.length) {
throw new Error(`Invalid start index: ${start}`);
throw new ListError(this.user, `Invalid start index: ${start}`);
}
if (deleteCount < 0) {
throw new Error(`Invalid delete count: ${deleteCount}`);
throw new ListError(this.user, `Invalid delete count: ${deleteCount}`);
}
if (deleteCount === 0 && elements.length === 0) {
@ -1348,7 +1349,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
setSelection(indexes: number[], browserEvent?: UIEvent): void {
for (const index of indexes) {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
}
@ -1366,7 +1367,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
setFocus(indexes: number[], browserEvent?: UIEvent): void {
for (const index of indexes) {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
}
@ -1518,7 +1519,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
reveal(index: number, relativeTop?: number): void {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
const scrollTop = this.view.getScrollTop();
@ -1547,7 +1548,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
*/
getRelativeTop(index: number): number | null {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
const scrollTop = this.view.getScrollTop();
@ -1574,7 +1575,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
open(indexes: number[], browserEvent?: UIEvent): void {
for (const index of indexes) {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
}
@ -1584,7 +1585,7 @@ export class List<T> implements ISpliceable<T>, IDisposable {
pin(indexes: number[]): void {
for (const index of indexes) {
if (index < 0 || index >= this.length) {
throw new Error(`Invalid index ${index}`);
throw new ListError(this.user, `Invalid index ${index}`);
}
}

View file

@ -721,7 +721,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi
this.listRenderer = new SelectListRenderer();
this.selectList = new List(this.selectDropDownListContainer, this, [this.listRenderer], {
this.selectList = new List('SelectBoxCustom', this.selectDropDownListContainer, this, [this.listRenderer], {
ariaLabel: this.selectBoxOptions.ariaLabel,
useShadows: false,
verticalScrollMode: ScrollbarVisibility.Visible,

View file

@ -1087,6 +1087,7 @@ interface ITreeNodeListOptions<T, TFilterData, TRef> extends IListOptions<ITreeN
class TreeNodeList<T, TFilterData, TRef> extends List<ITreeNode<T, TFilterData>> {
constructor(
user: string,
container: HTMLElement,
virtualDelegate: IListVirtualDelegate<ITreeNode<T, TFilterData>>,
renderers: IListRenderer<any /* TODO@joao */, any>[],
@ -1094,7 +1095,7 @@ class TreeNodeList<T, TFilterData, TRef> extends List<ITreeNode<T, TFilterData>>
private selectionTrait: Trait<T>,
options: ITreeNodeListOptions<T, TFilterData, TRef>
) {
super(container, virtualDelegate, renderers, options);
super(user, container, virtualDelegate, renderers, options);
}
protected createMouseController(options: ITreeNodeListOptions<T, TFilterData, TRef>): MouseController<ITreeNode<T, TFilterData>> {
@ -1195,6 +1196,7 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
get onDidDispose(): Event<void> { return this.view.onDidDispose; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
@ -1220,9 +1222,9 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
this.focus = new Trait(_options.identityProvider);
this.selection = new Trait(_options.identityProvider);
this.view = new TreeNodeList(container, treeDelegate, this.renderers, this.focus, this.selection, { ...asListOptions(() => this.model, _options), tree: this });
this.view = new TreeNodeList(user, container, treeDelegate, this.renderers, this.focus, this.selection, { ...asListOptions(() => this.model, _options), tree: this });
this.model = this.createModel(this.view, _options);
this.model = this.createModel(user, this.view, _options);
onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState;
this.model.onDidSplice(e => {
@ -1586,7 +1588,7 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
this.model.setCollapsed(location, undefined, recursive);
}
protected abstract createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IAbstractTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, TRef>;
protected abstract createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IAbstractTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, TRef>;
navigate(start?: TRef): ITreeNavigator<T> {
return new TreeNavigator(this.view, this.model, start);

View file

@ -6,7 +6,7 @@
import { ComposedTreeDelegate, IAbstractTreeOptions, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree';
import { ObjectTree, IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTree';
import { IListVirtualDelegate, IIdentityProvider, IListDragAndDrop, IListDragOverReaction } from 'vs/base/browser/ui/list/list';
import { ITreeElement, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeSorter, ICollapseStateChangeEvent, IAsyncDataSource, ITreeDragAndDrop } from 'vs/base/browser/ui/tree/tree';
import { ITreeElement, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeSorter, ICollapseStateChangeEvent, IAsyncDataSource, ITreeDragAndDrop, TreeError } from 'vs/base/browser/ui/tree/tree';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Emitter, Event } from 'vs/base/common/event';
import { timeout, CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
@ -339,6 +339,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
get onDidDispose(): Event<void> { return this.tree.onDidDispose; }
constructor(
private user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
@ -354,7 +355,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
const objectTreeRenderers = renderers.map(r => new DataTreeRenderer(r, this._onDidChangeNodeSlowState.event));
const objectTreeOptions = asObjectTreeOptions<TInput, T, TFilterData>(options) || {};
this.tree = new ObjectTree(container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions);
this.tree = new ObjectTree(user, container, objectTreeDelegate, objectTreeRenderers, objectTreeOptions);
this.root = createAsyncDataTreeNode({
element: undefined!,
@ -464,7 +465,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
async updateChildren(element: TInput | T = this.root.element, recursive = true, viewStateContext?: IAsyncDataTreeViewStateContext<TInput, T>): Promise<void> {
if (typeof this.root.element === 'undefined') {
throw new Error('Tree input not set');
throw new TreeError(this.user, 'Tree input not set');
}
if (this.root.loading) {
@ -515,7 +516,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
async expand(element: T, recursive: boolean = false): Promise<boolean> {
if (typeof this.root.element === 'undefined') {
throw new Error('Tree input not set');
throw new TreeError(this.user, 'Tree input not set');
}
if (this.root.loading) {
@ -643,7 +644,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
const node: IAsyncDataTreeNode<TInput, T> | undefined = this.nodes.get((element === this.root.element ? null : element) as T);
if (!node) {
throw new Error(`Data tree node not found: ${element}`);
throw new TreeError(this.user, `Data tree node not found: ${element}`);
}
return node;
@ -875,7 +876,7 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
getViewState(): IAsyncDataTreeViewState {
if (!this.identityProvider) {
throw new Error('Can\'t get tree view state without an identity provider');
throw new TreeError(this.user, 'Can\'t get tree view state without an identity provider');
}
const getId = (element: T) => this.identityProvider!.getId(element).toString();

View file

@ -22,12 +22,13 @@ export class CompressedObjectTree<T extends NonNullable<any>, TFilterData = void
get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<ICompressedTreeNode<T> | null, TFilterData>> { return this.model.onDidChangeCollapseState; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<ICompressedTreeNode<T>>,
renderers: ITreeRenderer<ICompressedTreeNode<T>, TFilterData, any>[],
options: IObjectTreeOptions<ICompressedTreeNode<T>, TFilterData> = {}
) {
super(container, delegate, renderers, options);
super(user, container, delegate, renderers, options);
}
setChildren(
@ -50,7 +51,7 @@ export class CompressedObjectTree<T extends NonNullable<any>, TFilterData = void
this.model.resort(element, recursive);
}
protected createModel(view: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>, options: IObjectTreeOptions<ICompressedTreeNode<T>, TFilterData>): ITreeModel<ICompressedTreeNode<T> | null, TFilterData, T | null> {
return new CompressedTreeModel(view, options);
protected createModel(user: string, view: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>, options: IObjectTreeOptions<ICompressedTreeNode<T>, TFilterData>): ITreeModel<ICompressedTreeNode<T> | null, TFilterData, T | null> {
return new CompressedTreeModel(user, view, options);
}
}

View file

@ -6,7 +6,7 @@
import { ISpliceable } from 'vs/base/common/sequence';
import { Iterator, ISequence } from 'vs/base/common/iterator';
import { Event } from 'vs/base/common/event';
import { ITreeModel, ITreeNode, ITreeElement, ICollapseStateChangeEvent, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree';
import { ITreeModel, ITreeNode, ITreeElement, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree';
import { IObjectTreeModelOptions, ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel';
export interface ICompressedTreeElement<T> extends ITreeElement<T> {
@ -95,8 +95,12 @@ export class CompressedTreeModel<T extends NonNullable<any>, TFilterData extends
get size(): number { return this.nodes.size; }
constructor(list: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>, options: ICompressedTreeModelOptions<T, TFilterData> = {}) {
this.model = new ObjectTreeModel(list, options);
constructor(
private user: string,
list: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>,
options: ICompressedTreeModelOptions<T, TFilterData> = {}
) {
this.model = new ObjectTreeModel(user, list, options);
}
setChildren(
@ -264,7 +268,7 @@ export class CompressedTreeModel<T extends NonNullable<any>, TFilterData extends
const node = this.nodes.get(element);
if (!node) {
throw new Error(`Tree element not found: ${element}`);
throw new TreeError(this.user, `Tree element not found: ${element}`);
}
return node;
@ -320,12 +324,13 @@ export class CompressedObjectTreeModel<T extends NonNullable<any>, TFilterData e
private model: CompressedTreeModel<T, TFilterData>;
constructor(
user: string,
list: ISpliceable<ITreeNode<ICompressedTreeNode<T>, TFilterData>>,
options: ICompressedObjectTreeModelOptions<T, TFilterData> = {}
) {
this.mapElement = options.elementMapper || DefaultElementMapper;
this.mapNode = createNodeMapper(this.mapElement);
this.model = new CompressedTreeModel(list, options);
this.model = new CompressedTreeModel(user, list, options);
}
setChildren(
@ -415,4 +420,4 @@ export class CompressedObjectTreeModel<T extends NonNullable<any>, TFilterData e
resort(element: T | null = null, recursive = true): void {
return this.model.resort(element, recursive);
}
}
}

View file

@ -5,7 +5,7 @@
import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree';
import { ISpliceable } from 'vs/base/common/sequence';
import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, IDataSource } from 'vs/base/browser/ui/tree/tree';
import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, IDataSource, TreeError } from 'vs/base/browser/ui/tree/tree';
import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel';
import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list';
import { Iterator } from 'vs/base/common/iterator';
@ -30,13 +30,14 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
private nodesByIdentity = new Map<string, ITreeNode<T, TFilterData>>();
constructor(
private user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
private dataSource: IDataSource<TInput, T>,
options: IDataTreeOptions<T, TFilterData> = {}
) {
super(container, delegate, renderers, options);
super(user, container, delegate, renderers, options);
this.identityProvider = options.identityProvider;
}
@ -48,7 +49,7 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
setInput(input: TInput, viewState?: IDataTreeViewState): void {
if (viewState && !this.identityProvider) {
throw new Error('Can\'t restore tree view state without an identity provider');
throw new TreeError(this.user, 'Can\'t restore tree view state without an identity provider');
}
this.input = input;
@ -89,7 +90,7 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
updateChildren(element: TInput | T = this.input!): void {
if (typeof this.input === 'undefined') {
throw new Error('Tree input not set');
throw new TreeError(this.user, 'Tree input not set');
}
let isCollapsed: ((el: T) => boolean | undefined) | undefined;
@ -169,15 +170,15 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
return { elements, size: children.length };
}
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IDataTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
return new ObjectTreeModel(view, options);
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IDataTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
return new ObjectTreeModel(user, view, options);
}
// view state
getViewState(): IDataTreeViewState {
if (!this.identityProvider) {
throw new Error('Can\'t get tree view state without an identity provider');
throw new TreeError(this.user, 'Can\'t get tree view state without an identity provider');
}
const getId = (element: T) => this.identityProvider!.getId(element).toString();

View file

@ -18,13 +18,14 @@ export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterDat
protected model!: IndexTreeModel<T, TFilterData>;
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
private rootElement: T,
options: IIndexTreeOptions<T, TFilterData> = {}
) {
super(container, delegate, renderers, options);
super(user, container, delegate, renderers, options);
}
splice(location: number[], deleteCount: number, toInsert: ISequence<ITreeElement<T>> = Iterator.empty()): Iterator<ITreeElement<T>> {
@ -40,7 +41,7 @@ export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterDat
this.model.rerender(location);
}
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IIndexTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, number[]> {
return new IndexTreeModel(view, this.rootElement, options);
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IIndexTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, number[]> {
return new IndexTreeModel(user, view, this.rootElement, options);
}
}

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ICollapseStateChangeEvent, ITreeElement, ITreeFilter, ITreeFilterDataResult, ITreeModel, ITreeNode, TreeVisibility, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree';
import { ICollapseStateChangeEvent, ITreeElement, ITreeFilter, ITreeFilterDataResult, ITreeModel, ITreeNode, TreeVisibility, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree';
import { tail2 } from 'vs/base/common/arrays';
import { Emitter, Event, EventBufferer } from 'vs/base/common/event';
import { ISequence, Iterator } from 'vs/base/common/iterator';
@ -66,7 +66,12 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
private _onDidSplice = new Emitter<ITreeModelSpliceEvent<T, TFilterData>>();
readonly onDidSplice = this._onDidSplice.event;
constructor(private list: ISpliceable<ITreeNode<T, TFilterData>>, rootElement: T, options: IIndexTreeModelOptions<T, TFilterData> = {}) {
constructor(
private user: string,
private list: ISpliceable<ITreeNode<T, TFilterData>>,
rootElement: T,
options: IIndexTreeModelOptions<T, TFilterData> = {}
) {
this.collapseByDefault = typeof options.collapseByDefault === 'undefined' ? false : options.collapseByDefault;
this.filter = options.filter;
this.autoExpandSingleChildren = typeof options.autoExpandSingleChildren === 'undefined' ? false : options.autoExpandSingleChildren;
@ -94,7 +99,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
onDidDeleteNode?: (node: ITreeNode<T, TFilterData>) => void
): Iterator<ITreeElement<T>> {
if (location.length === 0) {
throw new Error('Invalid tree location');
throw new TreeError(this.user, 'Invalid tree location');
}
const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location);
@ -177,7 +182,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
rerender(location: number[]): void {
if (location.length === 0) {
throw new Error('Invalid tree location');
throw new TreeError(this.user, 'Invalid tree location');
}
const { node, listIndex, revealed } = this.getTreeNodeWithListIndex(location);
@ -492,7 +497,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
const [index, ...rest] = location;
if (index < 0 || index > node.children.length) {
throw new Error('Invalid tree location');
throw new TreeError(this.user, 'Invalid tree location');
}
return this.getTreeNode(rest, node.children[index]);
@ -508,7 +513,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
const index = location[location.length - 1];
if (index < 0 || index > parentNode.children.length) {
throw new Error('Invalid tree location');
throw new TreeError(this.user, 'Invalid tree location');
}
const node = parentNode.children[index];
@ -520,7 +525,7 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
const [index, ...rest] = location;
if (index < 0 || index > node.children.length) {
throw new Error('Invalid tree location');
throw new TreeError(this.user, 'Invalid tree location');
}
// TODO@joao perf!

View file

@ -22,12 +22,13 @@ export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends
get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
options: IObjectTreeOptions<T, TFilterData> = {}
) {
super(container, delegate, renderers, options);
super(user, container, delegate, renderers, options);
}
setChildren(
@ -50,7 +51,7 @@ export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends
this.model.resort(element, recursive);
}
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
return new ObjectTreeModel(view, options);
protected createModel(user: string, view: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
return new ObjectTreeModel(user, view, options);
}
}

View file

@ -7,7 +7,7 @@ import { ISpliceable } from 'vs/base/common/sequence';
import { Iterator, ISequence, getSequenceIterator } from 'vs/base/common/iterator';
import { IndexTreeModel, IIndexTreeModelOptions } from 'vs/base/browser/ui/tree/indexTreeModel';
import { Event } from 'vs/base/common/event';
import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree';
import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree';
import { IIdentityProvider } from 'vs/base/browser/ui/list/list';
export type ITreeNodeCallback<T, TFilterData> = (node: ITreeNode<T, TFilterData>) => void;
@ -38,8 +38,12 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
get size(): number { return this.nodes.size; }
constructor(list: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeModelOptions<T, TFilterData> = {}) {
this.model = new IndexTreeModel(list, null, options);
constructor(
private user: string,
list: ISpliceable<ITreeNode<T, TFilterData>>,
options: IObjectTreeModelOptions<T, TFilterData> = {}
) {
this.model = new IndexTreeModel(user, list, null, options);
this.onDidSplice = this.model.onDidSplice;
this.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ICollapseStateChangeEvent<T, TFilterData>>;
this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;
@ -239,7 +243,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
const node = this.nodes.get(element);
if (!node) {
throw new Error(`Tree element not found: ${element}`);
throw new TreeError(this.user, `Tree element not found: ${element}`);
}
return node;
@ -251,13 +255,13 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
getParentNodeLocation(element: T | null): T | null {
if (element === null) {
throw new Error(`Invalid getParentNodeLocation call`);
throw new TreeError(this.user, `Invalid getParentNodeLocation call`);
}
const node = this.nodes.get(element);
if (!node) {
throw new Error(`Tree element not found: ${element}`);
throw new TreeError(this.user, `Tree element not found: ${element}`);
}
return node.parent!.element;
@ -271,7 +275,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
const node = this.nodes.get(element);
if (!node) {
throw new Error(`Tree element not found: ${element}`);
throw new TreeError(this.user, `Tree element not found: ${element}`);
}
return this.model.getNodeLocation(node);

View file

@ -194,3 +194,10 @@ export const TreeDragOverReactions = {
export interface ITreeDragAndDrop<T> extends IListDragAndDrop<T> {
onDragOver(data: IDragAndDropData, targetElement: T | undefined, targetIndex: number | undefined, originalEvent: DragEvent): boolean | ITreeDragOverReaction;
}
export class TreeError extends Error {
constructor(user: string, message: string) {
super(`TreeError [${user}] ${message}`);
}
}

View file

@ -864,7 +864,7 @@ export class TreeModel {
private context: _.ITreeContext;
private lock!: Lock;
private input: Item | null;
private registry!: ItemRegistry;
private registry: ItemRegistry = new ItemRegistry();
private registryDisposable!: IDisposable;
private traitsToItems: ITraitMap;

View file

@ -75,7 +75,7 @@ suite('AsyncDataTree', function () {
const _: (id: string) => Element = find.bind(null, root.children);
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, { identityProvider });
const tree = new AsyncDataTree<Element, Element>('test', container, delegate, [renderer], dataSource, { identityProvider });
tree.layout(200);
assert.equal(container.querySelectorAll('.monaco-list-row').length, 0);
@ -151,7 +151,7 @@ suite('AsyncDataTree', function () {
const _: (id: string) => Element = find.bind(null, root.children);
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, { identityProvider });
const tree = new AsyncDataTree<Element, Element>('test', container, delegate, [renderer], dataSource, { identityProvider });
tree.layout(200);
await tree.setInput(root);
@ -239,7 +239,7 @@ suite('AsyncDataTree', function () {
const _: (id: string) => Element = find.bind(null, root.children);
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, { identityProvider });
const tree = new AsyncDataTree<Element, Element>('test', container, delegate, [renderer], dataSource, { identityProvider });
tree.layout(200);
await tree.setInput(root);
@ -306,7 +306,7 @@ suite('AsyncDataTree', function () {
const _: (id: string) => Element = find.bind(null, root.children);
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, { identityProvider });
const tree = new AsyncDataTree<Element, Element>('test', container, delegate, [renderer], dataSource, { identityProvider });
tree.layout(200);
await tree.setInput(root);
@ -370,7 +370,7 @@ suite('AsyncDataTree', function () {
const _: (id: string) => Element = find.bind(null, root.children);
const tree = new AsyncDataTree<Element, Element>(container, delegate, [renderer], dataSource, {
const tree = new AsyncDataTree<Element, Element>('test', container, delegate, [renderer], dataSource, {
collapseByDefault: el => el.id !== 'a'
});
tree.layout(200);
@ -379,4 +379,4 @@ suite('AsyncDataTree', function () {
assert(!tree.getNode(_('a')).collapsed);
assert.deepStrictEqual(getChildrenCalls, ['root', 'a']);
});
});
});

View file

@ -305,7 +305,7 @@ suite('CompressedObjectTree', function () {
test('ctor', () => {
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
const model = new CompressedTreeModel<number>(toSpliceable(list));
const model = new CompressedTreeModel<number>('test', toSpliceable(list));
assert(model);
assert.equal(list.length, 0);
assert.equal(model.size, 0);
@ -313,7 +313,7 @@ suite('CompressedObjectTree', function () {
test('flat', () => {
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
const model = new CompressedTreeModel<number>(toSpliceable(list));
const model = new CompressedTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{ element: 0 },
@ -340,7 +340,7 @@ suite('CompressedObjectTree', function () {
test('nested', () => {
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
const model = new CompressedTreeModel<number>(toSpliceable(list));
const model = new CompressedTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{
@ -376,7 +376,7 @@ suite('CompressedObjectTree', function () {
test('compressed', () => {
const list: ITreeNode<ICompressedTreeNode<number>>[] = [];
const model = new CompressedTreeModel<number>(toSpliceable(list));
const model = new CompressedTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{
@ -427,4 +427,4 @@ suite('CompressedObjectTree', function () {
assert.equal(model.size, 8);
});
});
});
});

View file

@ -63,7 +63,7 @@ suite('DataTree', function () {
}
};
tree = new DataTree<E, E>(container, delegate, [renderer], dataSource, {
tree = new DataTree<E, E>('test', container, delegate, [renderer], dataSource, {
identityProvider
});
tree.layout(200);
@ -145,4 +145,4 @@ suite('DataTree', function () {
assert.deepEqual(tree.getSelection(), [root.children![1]]);
assert.deepEqual(tree.getFocus(), [root.children![2]]);
});
});
});

View file

@ -25,14 +25,14 @@ suite('IndexTreeModel', function () {
test('ctor', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
assert(model);
assert.equal(list.length, 0);
});
test('insert', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{ element: 0 },
@ -54,7 +54,7 @@ suite('IndexTreeModel', function () {
test('deep insert', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -91,7 +91,7 @@ suite('IndexTreeModel', function () {
test('deep insert collapsed', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -119,7 +119,7 @@ suite('IndexTreeModel', function () {
test('delete', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{ element: 0 },
@ -144,7 +144,7 @@ suite('IndexTreeModel', function () {
test('nested delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -178,7 +178,7 @@ suite('IndexTreeModel', function () {
test('deep delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -206,7 +206,7 @@ suite('IndexTreeModel', function () {
test('hidden delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -231,7 +231,7 @@ suite('IndexTreeModel', function () {
test('collapse', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -262,7 +262,7 @@ suite('IndexTreeModel', function () {
test('expand', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -302,7 +302,7 @@ suite('IndexTreeModel', function () {
test('collapse should recursively adjust visible count', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -341,7 +341,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -375,7 +375,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -398,7 +398,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -437,7 +437,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
const model = new IndexTreeModel<string>('test', toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -483,7 +483,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
const model = new IndexTreeModel<string>('test', toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -529,7 +529,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
const model = new IndexTreeModel<string>('test', toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -577,7 +577,7 @@ suite('IndexTreeModel', function () {
test('simple', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
@ -607,7 +607,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
const model = new IndexTreeModel<number>('test', toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
@ -629,4 +629,4 @@ suite('IndexTreeModel', function () {
assert.deepEqual(model.getNodeLocation(list[3]), [0, 5]);
});
});
});
});

View file

@ -35,7 +35,7 @@ suite('ObjectTree', function () {
disposeTemplate(): void { }
};
tree = new ObjectTree<number>(container, delegate, [renderer], { filter: { filter: (el) => filter(el) } });
tree = new ObjectTree<number>('test', container, delegate, [renderer], { filter: { filter: (el) => filter(el) } });
tree.layout(200);
});
@ -214,7 +214,7 @@ suite('ObjectTree', function () {
}
};
const tree = new ObjectTree<number>(container, delegate, [renderer], { identityProvider });
const tree = new ObjectTree<number>('test', container, delegate, [renderer], { identityProvider });
tree.layout(200);
tree.setChildren(null, [{ element: 0 }, { element: 1 }, { element: 2 }, { element: 3 }]);
@ -224,4 +224,4 @@ suite('ObjectTree', function () {
tree.setChildren(null, [{ element: 100 }, { element: 101 }, { element: 102 }, { element: 103 }]);
assert.deepStrictEqual(tree.getFocus(), [101]);
});
});
});

View file

@ -25,7 +25,7 @@ suite('ObjectTreeModel', function () {
test('ctor', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
const model = new ObjectTreeModel<number>('test', toSpliceable(list));
assert(model);
assert.equal(list.length, 0);
assert.equal(model.size, 0);
@ -33,7 +33,7 @@ suite('ObjectTreeModel', function () {
test('flat', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
const model = new ObjectTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{ element: 0 },
@ -60,7 +60,7 @@ suite('ObjectTreeModel', function () {
test('nested', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
const model = new ObjectTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{
@ -96,7 +96,7 @@ suite('ObjectTreeModel', function () {
test('setChildren on collapsed node', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
const model = new ObjectTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, Iterator.fromArray([
{ element: 0, collapsed: true }
@ -117,7 +117,7 @@ suite('ObjectTreeModel', function () {
test('setChildren on expanded, unrevealed node', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list));
const model = new ObjectTreeModel<number>('test', toSpliceable(list));
model.setChildren(null, [
{
@ -143,7 +143,7 @@ suite('ObjectTreeModel', function () {
test('collapse state is preserved with strict identity', () => {
const list: ITreeNode<string>[] = [];
const model = new ObjectTreeModel<string>(toSpliceable(list), { collapseByDefault: true });
const model = new ObjectTreeModel<string>('test', toSpliceable(list), { collapseByDefault: true });
const data = [{ element: 'father', children: [{ element: 'child' }] }];
model.setChildren(null, data);
@ -173,7 +173,7 @@ suite('ObjectTreeModel', function () {
let compare: (a: string, b: string) => number = (a, b) => a < b ? -1 : 1;
const list: ITreeNode<string>[] = [];
const model = new ObjectTreeModel<string>(toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } });
const model = new ObjectTreeModel<string>('test', toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } });
const data = [
{ element: 'cars', children: [{ element: 'sedan' }, { element: 'convertible' }, { element: 'compact' }] },
{ element: 'airplanes', children: [{ element: 'passenger' }, { element: 'jet' }] },
@ -188,7 +188,7 @@ suite('ObjectTreeModel', function () {
let compare: (a: string, b: string) => number = () => 0;
const list: ITreeNode<string>[] = [];
const model = new ObjectTreeModel<string>(toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } });
const model = new ObjectTreeModel<string>('test', toSpliceable(list), { sorter: { compare(a, b) { return compare(a, b); } } });
const data = [
{ element: 'cars', children: [{ element: 'sedan' }, { element: 'convertible' }, { element: 'compact' }] },
{ element: 'airplanes', children: [{ element: 'passenger' }, { element: 'jet' }] },
@ -223,7 +223,7 @@ suite('ObjectTreeModel', function () {
test('expandTo', () => {
const list: ITreeNode<number>[] = [];
const model = new ObjectTreeModel<number>(toSpliceable(list), { collapseByDefault: true });
const model = new ObjectTreeModel<number>('test', toSpliceable(list), { collapseByDefault: true });
model.setChildren(null, [
{
@ -241,4 +241,4 @@ suite('ObjectTreeModel', function () {
model.expandTo(1000);
assert.deepEqual(toArray(list), [0, 10, 100, 1000, 11, 12, 1, 2]);
});
});
});

View file

@ -311,8 +311,9 @@ export class ReferenceWidget extends PeekViewWidget {
keyboardNavigationLabelProvider: this._instantiationService.createInstance(StringRepresentationProvider),
identityProvider: new IdentityProvider()
};
this._tree = this._instantiationService.createInstance<HTMLElement, IListVirtualDelegate<TreeElement>, ITreeRenderer<any, FuzzyScore, any>[], IAsyncDataSource<ReferencesModel | FileReferences, TreeElement>, IAsyncDataTreeOptions<TreeElement, FuzzyScore>, WorkbenchAsyncDataTree<ReferencesModel | FileReferences, TreeElement, FuzzyScore>>(
this._tree = this._instantiationService.createInstance<string, HTMLElement, IListVirtualDelegate<TreeElement>, ITreeRenderer<any, FuzzyScore, any>[], IAsyncDataSource<ReferencesModel | FileReferences, TreeElement>, IAsyncDataTreeOptions<TreeElement, FuzzyScore>, WorkbenchAsyncDataTree<ReferencesModel | FileReferences, TreeElement, FuzzyScore>>(
WorkbenchAsyncDataTree,
'ReferencesWidget',
this._treeContainer,
new Delegate(),
[

View file

@ -505,7 +505,7 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate<Compl
let renderer = instantiationService.createInstance(Renderer, this, this.editor, triggerKeybindingLabel);
this.list = new List(this.listElement, this, [renderer], {
this.list = new List('SuggestWidget', this.listElement, this, [renderer], {
useShadows: false,
openController: { shouldOpen: () => false },
mouseSupport: false

View file

@ -245,6 +245,7 @@ export class WorkbenchList<T> extends List<T> {
private _useAltAsMultipleSelectionModifier: boolean;
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: IListRenderer<T, any>[],
@ -258,7 +259,7 @@ export class WorkbenchList<T> extends List<T> {
const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : getHorizontalScrollingSetting(configurationService);
const [workbenchListOptions, workbenchListOptionsDisposable] = toWorkbenchListOptions(options, configurationService, keybindingService);
super(container, delegate, renderers,
super(user, container, delegate, renderers,
{
keyboardSupport: false,
styleController: new DefaultStyleController(getSharedListStyleSheet()),
@ -326,6 +327,7 @@ export class WorkbenchPagedList<T> extends PagedList<T> {
private _useAltAsMultipleSelectionModifier: boolean;
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<number>,
renderers: IPagedRenderer<T, any>[],
@ -338,7 +340,7 @@ export class WorkbenchPagedList<T> extends PagedList<T> {
) {
const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : getHorizontalScrollingSetting(configurationService);
const [workbenchListOptions, workbenchListOptionsDisposable] = toWorkbenchListOptions(options, configurationService, keybindingService);
super(container, delegate, renderers,
super(user, container, delegate, renderers,
{
keyboardSupport: false,
styleController: new DefaultStyleController(getSharedListStyleSheet()),
@ -785,6 +787,7 @@ export class WorkbenchObjectTree<T extends NonNullable<any>, TFilterData = void>
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
@ -797,7 +800,7 @@ export class WorkbenchObjectTree<T extends NonNullable<any>, TFilterData = void>
@IAccessibilityService accessibilityService: IAccessibilityService
) {
const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble(container, options, contextKeyService, themeService, configurationService, keybindingService, accessibilityService);
super(container, delegate, renderers, treeOptions);
super(user, container, delegate, renderers, treeOptions);
this.disposables.push(disposable);
this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, contextKeyService, listService, themeService, configurationService, accessibilityService);
this.disposables.push(this.internals);
@ -811,6 +814,7 @@ export class WorkbenchDataTree<TInput, T, TFilterData = void> extends DataTree<T
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
@ -824,7 +828,7 @@ export class WorkbenchDataTree<TInput, T, TFilterData = void> extends DataTree<T
@IAccessibilityService accessibilityService: IAccessibilityService
) {
const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble(container, options, contextKeyService, themeService, configurationService, keybindingService, accessibilityService);
super(container, delegate, renderers, dataSource, treeOptions);
super(user, container, delegate, renderers, dataSource, treeOptions);
this.disposables.push(disposable);
this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, contextKeyService, listService, themeService, configurationService, accessibilityService);
this.disposables.push(this.internals);
@ -838,6 +842,7 @@ export class WorkbenchAsyncDataTree<TInput, T, TFilterData = void> extends Async
get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; }
constructor(
user: string,
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<T, TFilterData, any>[],
@ -851,7 +856,7 @@ export class WorkbenchAsyncDataTree<TInput, T, TFilterData = void> extends Async
@IAccessibilityService accessibilityService: IAccessibilityService
) {
const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble(container, options, contextKeyService, themeService, configurationService, keybindingService, accessibilityService);
super(container, delegate, renderers, dataSource, treeOptions);
super(user, container, delegate, renderers, dataSource, treeOptions);
this.disposables.push(disposable);
this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, contextKeyService, listService, themeService, configurationService, accessibilityService);
this.disposables.push(this.internals);

View file

@ -374,7 +374,7 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker {
const labels = this._instantiationService.createInstance(ResourceLabels, DEFAULT_LABELS_CONTAINER /* TODO@Jo visibility propagation */);
this._disposables.add(labels);
return this._instantiationService.createInstance(WorkbenchAsyncDataTree, container, new FileVirtualDelegate(), [this._instantiationService.createInstance(FileRenderer, labels)], this._instantiationService.createInstance(FileDataSource), {
return this._instantiationService.createInstance(WorkbenchAsyncDataTree, 'BreadcrumbsFilePicker', container, new FileVirtualDelegate(), [this._instantiationService.createInstance(FileRenderer, labels)], this._instantiationService.createInstance(FileDataSource), {
multipleSelectionSupport: false,
sorter: new FileSorter(),
filter: this._instantiationService.createInstance(FileFilter),
@ -440,6 +440,7 @@ export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker {
protected _createTree(container: HTMLElement) {
return this._instantiationService.createInstance(
WorkbenchDataTree,
'BreadcrumbsOutlinePicker',
container,
new OutlineVirtualDelegate(),
[new OutlineGroupRenderer(), this._instantiationService.createInstance(OutlineElementRenderer)],

View file

@ -72,6 +72,7 @@ export class NotificationsList extends Themable {
// List
this.list = this._register(this.instantiationService.createInstance(
WorkbenchList,
'NotificationsList',
this.listContainer,
new NotificationsListDelegate(this.listContainer),
[renderer],

View file

@ -246,7 +246,7 @@ export class QuickInputList {
this.id = id;
this.container = dom.append(this.parent, $('.quick-input-list'));
const delegate = new ListElementDelegate();
this.list = this.instantiationService.createInstance(WorkbenchList, this.container, delegate, [new ListElementRenderer()], {
this.list = this.instantiationService.createInstance(WorkbenchList, 'QuickInput', this.container, delegate, [new ListElementRenderer()], {
identityProvider: { getId: element => element.saneLabel },
openController: { shouldOpen: () => false }, // Workaround #58124
setRowLineHeight: false,

View file

@ -370,26 +370,26 @@ export class CustomTreeView extends Disposable implements ITreeView {
const aligner = new Aligner(this.themeService);
const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, treeMenus, this.treeLabels, actionViewItemProvider, aligner);
this.tree = this._register(this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new CustomTreeDelegate(), [renderer],
this.tree = this._register(this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'CustomView', this.treeContainer, new CustomTreeDelegate(), [renderer],
dataSource, {
identityProvider: new CustomViewIdentityProvider(),
accessibilityProvider: {
getAriaLabel(element: ITreeItem): string {
return element.tooltip ? element.tooltip : element.label ? element.label.label : '';
}
},
ariaLabel: this.title,
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (item: ITreeItem) => {
return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined);
}
},
expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command,
collapseByDefault: (e: ITreeItem): boolean => {
return e.collapsibleState !== TreeItemCollapsibleState.Expanded;
},
multipleSelectionSupport: this.canSelectMany,
}) as WorkbenchAsyncDataTree<ITreeItem, ITreeItem, FuzzyScore>);
identityProvider: new CustomViewIdentityProvider(),
accessibilityProvider: {
getAriaLabel(element: ITreeItem): string {
return element.tooltip ? element.tooltip : element.label ? element.label.label : '';
}
},
ariaLabel: this.title,
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (item: ITreeItem) => {
return item.label ? item.label.label : (item.resourceUri ? basename(URI.revive(item.resourceUri)) : undefined);
}
},
expandOnlyOnTwistieClick: (e: ITreeItem) => !!e.command,
collapseByDefault: (e: ITreeItem): boolean => {
return e.collapsibleState !== TreeItemCollapsibleState.Expanded;
},
multipleSelectionSupport: this.canSelectMany,
}) as WorkbenchAsyncDataTree<ITreeItem, ITreeItem, FuzzyScore>);
aligner.tree = this.tree;
const actionRunner = new MultipleSelectionActionRunner(() => this.tree!.getSelection());
renderer.actionRunner = actionRunner;

View file

@ -242,7 +242,7 @@ import { isMacintosh, isWindows, isLinux, isWeb } from 'vs/base/common/platform'
},
'workbench.octiconsUpdate.enabled': {
'type': 'boolean',
'default': false,
'default': true,
'description': nls.localize('workbench.octiconsUpdate.enabled', "Controls the visibility of the new Octicons style in the workbench.")
}
}

View file

@ -203,6 +203,7 @@ export class CallHierarchyTreePeekWidget extends PeekViewWidget {
};
this._tree = <any>this._instantiationService.createInstance(
WorkbenchAsyncDataTree,
'CallHierarchyPeek',
treeContainer,
new callHTree.VirtualDelegate(),
[this._instantiationService.createInstance(callHTree.CallRenderer)],

View file

@ -175,6 +175,7 @@ export class CommentsList extends WorkbenchAsyncDataTree<any, any> {
];
super(
'CommentsTree',
container,
delegate,
renderers,

View file

@ -70,23 +70,23 @@ export class BreakpointsView extends ViewletPanel {
dom.addClass(container, 'debug-breakpoints');
const delegate = new BreakpointsDelegate(this.debugService);
this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [
this.list = this.instantiationService.createInstance(WorkbenchList, 'Breakpoints', container, delegate, [
this.instantiationService.createInstance(BreakpointsRenderer),
new ExceptionBreakpointsRenderer(this.debugService),
this.instantiationService.createInstance(FunctionBreakpointsRenderer),
this.instantiationService.createInstance(DataBreakpointsRenderer),
new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService)
], {
identityProvider: { getId: (element: IEnablement) => element.getId() },
multipleSelectionSupport: false,
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IEnablement) => e },
ariaProvider: {
getSetSize: (_: IEnablement, index: number, listLength: number) => listLength,
getPosInSet: (_: IEnablement, index: number) => index,
getRole: (breakpoint: IEnablement) => 'checkbox',
isChecked: (breakpoint: IEnablement) => breakpoint.enabled
}
});
identityProvider: { getId: (element: IEnablement) => element.getId() },
multipleSelectionSupport: false,
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IEnablement) => e },
ariaProvider: {
getSetSize: (_: IEnablement, index: number, listLength: number) => listLength,
getPosInSet: (_: IEnablement, index: number) => index,
getRole: (breakpoint: IEnablement) => 'checkbox',
isChecked: (breakpoint: IEnablement) => breakpoint.enabled
}
});
CONTEXT_BREAKPOINTS_FOCUSED.bindTo(this.list.contextKeyService);

View file

@ -105,7 +105,7 @@ export class CallStackView extends ViewletPanel {
const treeContainer = renderViewTree(container);
this.dataSource = new CallStackDataSource(this.debugService);
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, new CallStackDelegate(), [
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'CallStackView', treeContainer, new CallStackDelegate(), [
new SessionsRenderer(),
new ThreadsRenderer(),
this.instantiationService.createInstance(StackFramesRenderer),
@ -113,40 +113,40 @@ export class CallStackView extends ViewletPanel {
new LoadMoreRenderer(),
new ShowMoreRenderer()
], this.dataSource, {
accessibilityProvider: new CallStackAccessibilityProvider(),
ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel' }, "Debug Call Stack"),
identityProvider: {
getId: (element: CallStackItem) => {
if (typeof element === 'string') {
return element;
}
if (element instanceof Array) {
return `showMore ${element[0].getId()}`;
}
return element.getId();
accessibilityProvider: new CallStackAccessibilityProvider(),
ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel' }, "Debug Call Stack"),
identityProvider: {
getId: (element: CallStackItem) => {
if (typeof element === 'string') {
return element;
}
},
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (e: CallStackItem) => {
if (isDebugSession(e)) {
return e.getLabel();
}
if (e instanceof Thread) {
return `${e.name} ${e.stateLabel}`;
}
if (e instanceof StackFrame || typeof e === 'string') {
return e;
}
if (e instanceof ThreadAndSessionIds) {
return LoadMoreRenderer.LABEL;
}
return nls.localize('showMoreStackFrames2', "Show More Stack Frames");
if (element instanceof Array) {
return `showMore ${element[0].getId()}`;
}
},
expandOnlyOnTwistieClick: true
});
return element.getId();
}
},
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (e: CallStackItem) => {
if (isDebugSession(e)) {
return e.getLabel();
}
if (e instanceof Thread) {
return `${e.name} ${e.stateLabel}`;
}
if (e instanceof StackFrame || typeof e === 'string') {
return e;
}
if (e instanceof ThreadAndSessionIds) {
return LoadMoreRenderer.LABEL;
}
return nls.localize('showMoreStackFrames2', "Show More Stack Frames");
}
},
expandOnlyOnTwistieClick: true
});
this.tree.setInput(this.debugService.getModel()).then(undefined, onUnexpectedError);

View file

@ -73,13 +73,13 @@ export class DebugHoverWidget implements IContentWidget {
this.treeContainer.setAttribute('role', 'tree');
const dataSource = new DebugHoverDataSource();
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new DebugHoverDelegate(), [this.instantiationService.createInstance(VariablesRenderer)],
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'DebugHover', this.treeContainer, new DebugHoverDelegate(), [this.instantiationService.createInstance(VariablesRenderer)],
dataSource, {
ariaLabel: nls.localize('treeAriaLabel', "Debug Hover"),
accessibilityProvider: new DebugHoverAccessibilityProvider(),
mouseSupport: false,
horizontalScrolling: true
});
ariaLabel: nls.localize('treeAriaLabel', "Debug Hover"),
accessibilityProvider: new DebugHoverAccessibilityProvider(),
mouseSupport: false,
horizontalScrolling: true
});
this.valueContainer = $('.value');
this.valueContainer.tabIndex = 0;

View file

@ -419,7 +419,7 @@ export class LoadedScriptsView extends ViewletPanel {
this.treeLabels = this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility });
this._register(this.treeLabels);
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, this.treeContainer, new LoadedScriptsDelegate(),
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'LoadedScriptsView', this.treeContainer, new LoadedScriptsDelegate(),
[new LoadedScriptsRenderer(this.treeLabels)],
new LoadedScriptsDataSource(),
{

View file

@ -406,6 +406,7 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati
dom.toggleClass(treeContainer, 'word-wrap', wordWrap);
this.tree = this.instantiationService.createInstance(
WorkbenchAsyncDataTree,
'DebugRepl',
treeContainer,
this.replDelegate,
[

View file

@ -86,14 +86,14 @@ export class VariablesView extends ViewletPanel {
dom.addClass(container, 'debug-variables');
const treeContainer = renderViewTree(container);
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, new VariablesDelegate(),
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(),
[this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer()],
new VariablesDataSource(), {
ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"),
accessibilityProvider: new VariablesAccessibilityProvider(),
identityProvider: { getId: (element: IExpression | IScope) => element.getId() },
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IExpression | IScope) => e }
});
ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"),
accessibilityProvider: new VariablesAccessibilityProvider(),
identityProvider: { getId: (element: IExpression | IScope) => element.getId() },
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IExpression | IScope) => e }
});
this.tree.setInput(this.debugService.getViewModel()).then(null, onUnexpectedError);

View file

@ -61,14 +61,14 @@ export class WatchExpressionsView extends ViewletPanel {
const treeContainer = renderViewTree(container);
const expressionsRenderer = this.instantiationService.createInstance(WatchExpressionsRenderer);
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, treeContainer, new WatchExpressionsDelegate(), [expressionsRenderer, this.instantiationService.createInstance(VariablesRenderer)],
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'WatchExpressions', treeContainer, new WatchExpressionsDelegate(), [expressionsRenderer, this.instantiationService.createInstance(VariablesRenderer)],
new WatchExpressionsDataSource(), {
ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'watchAriaTreeLabel' }, "Debug Watch Expressions"),
accessibilityProvider: new WatchExpressionsAccessibilityProvider(),
identityProvider: { getId: (element: IExpression) => element.getId() },
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IExpression) => e },
dnd: new WatchExpressionsDragAndDrop(this.debugService),
});
ariaLabel: nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'watchAriaTreeLabel' }, "Debug Watch Expressions"),
accessibilityProvider: new WatchExpressionsAccessibilityProvider(),
identityProvider: { getId: (element: IExpression) => element.getId() },
keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: (e: IExpression) => e },
dnd: new WatchExpressionsDragAndDrop(this.debugService),
});
this.tree.setInput(this.debugService).then(undefined, onUnexpectedError);
CONTEXT_WATCH_EXPRESSIONS_FOCUSED.bindTo(this.tree.contextKeyService);

View file

@ -198,6 +198,7 @@ export class ExtensionsTree extends WorkbenchAsyncDataTree<IExtensionData, IExte
};
super(
'ExtensionsTree',
container,
delegate,
renderers,

View file

@ -124,12 +124,12 @@ export class ExtensionsListView extends ViewletPanel {
const delegate = new Delegate();
const extensionsViewState = new ExtensionsViewState();
const renderer = this.instantiationService.createInstance(Renderer, extensionsViewState);
this.list = this.instantiationService.createInstance(WorkbenchPagedList, extensionsList, delegate, [renderer], {
this.list = this.instantiationService.createInstance(WorkbenchPagedList, 'Extensions', extensionsList, delegate, [renderer], {
ariaLabel: localize('extensions', "Extensions"),
multipleSelectionSupport: false,
setRowLineHeight: false,
horizontalScrolling: false
}) as WorkbenchPagedList<IExtension>;
});
this._register(this.list.onContextMenu(e => this.onContextMenu(e), this));
this._register(this.list.onFocusChange(e => extensionsViewState.onFocusChange(coalesce(e.elements)), this));
this._register(this.list);

View file

@ -404,7 +404,9 @@ export class RuntimeExtensionsEditor extends BaseEditor {
}
};
this._list = this._instantiationService.createInstance(WorkbenchList, parent, delegate, [renderer], {
this._list = this._instantiationService.createInstance(WorkbenchList,
'RuntimeExtensions',
parent, delegate, [renderer], {
multipleSelectionSupport: false,
setRowLineHeight: false,
horizontalScrolling: false

View file

@ -275,35 +275,35 @@ export class ExplorerView extends ViewletPanel {
this._register(createFileIconThemableTreeContainerScope(container, this.themeService));
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, container, new ExplorerDelegate(), [filesRenderer],
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'FileExplorer', container, new ExplorerDelegate(), [filesRenderer],
this.instantiationService.createInstance(ExplorerDataSource), {
accessibilityProvider: new ExplorerAccessibilityProvider(),
ariaLabel: nls.localize('treeAriaLabel', "Files Explorer"),
identityProvider: {
getId: (stat: ExplorerItem) => {
if (stat instanceof NewExplorerItem) {
return `new:${stat.resource}`;
}
return stat.resource;
accessibilityProvider: new ExplorerAccessibilityProvider(),
ariaLabel: nls.localize('treeAriaLabel', "Files Explorer"),
identityProvider: {
getId: (stat: ExplorerItem) => {
if (stat instanceof NewExplorerItem) {
return `new:${stat.resource}`;
}
},
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (stat: ExplorerItem) => {
if (this.explorerService.isEditable(stat)) {
return undefined;
}
return stat.name;
return stat.resource;
}
},
keyboardNavigationLabelProvider: {
getKeyboardNavigationLabel: (stat: ExplorerItem) => {
if (this.explorerService.isEditable(stat)) {
return undefined;
}
},
multipleSelectionSupport: true,
filter: this.filter,
sorter: this.instantiationService.createInstance(FileSorter),
dnd: this.instantiationService.createInstance(FileDragAndDrop),
autoExpandSingleChildren: true,
additionalScrollHeight: ExplorerDelegate.ITEM_HEIGHT
});
return stat.name;
}
},
multipleSelectionSupport: true,
filter: this.filter,
sorter: this.instantiationService.createInstance(FileSorter),
dnd: this.instantiationService.createInstance(FileDragAndDrop),
autoExpandSingleChildren: true,
additionalScrollHeight: ExplorerDelegate.ITEM_HEIGHT
});
this._register(this.tree);
// Bind context keys

View file

@ -213,13 +213,13 @@ export class OpenEditorsView extends ViewletPanel {
this.listLabels.clear();
}
this.listLabels = this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility });
this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [
this.list = this.instantiationService.createInstance(WorkbenchList, 'OpenEditors', container, delegate, [
new EditorGroupRenderer(this.keybindingService, this.instantiationService),
new OpenEditorRenderer(this.listLabels, this.instantiationService, this.keybindingService, this.configurationService)
], {
identityProvider: { getId: (element: OpenEditor | IEditorGroup) => element instanceof OpenEditor ? element.getId() : element.id.toString() },
dnd: new OpenEditorsDragAndDrop(this.instantiationService, this.editorGroupService)
});
identityProvider: { getId: (element: OpenEditor | IEditorGroup) => element instanceof OpenEditor ? element.getId() : element.id.toString() },
dnd: new OpenEditorsDragAndDrop(this.instantiationService, this.editorGroupService)
});
this._register(this.list);
this._register(this.listLabels);

View file

@ -310,6 +310,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
};
this.tree = this.instantiationService.createInstance(WorkbenchObjectTree,
'MarkersPanel',
this.treeContainer,
virtualDelegate,
renderers,

View file

@ -317,6 +317,7 @@ export class OutlinePanel extends ViewletPanel {
this._treeComparator = new OutlineItemComparator(this._outlineViewState.sortBy);
this._tree = this._instantiationService.createInstance(
WorkbenchDataTree,
'OutlinePanel',
treeContainer,
new OutlineVirtualDelegate(),
[new OutlineGroupRenderer(), this._treeRenderer],

View file

@ -453,7 +453,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor
private createList(parent: HTMLElement): void {
this.keybindingsListContainer = DOM.append(parent, $('.keybindings-list-container'));
this.keybindingsList = this._register(this.instantiationService.createInstance(WorkbenchList, this.keybindingsListContainer, new Delegate(), [new KeybindingItemRenderer(this, this.instantiationService)], {
this.keybindingsList = this._register(this.instantiationService.createInstance(WorkbenchList, 'KeybindingsEditor', this.keybindingsListContainer, new Delegate(), [new KeybindingItemRenderer(this, this.instantiationService)], {
identityProvider: { getId: (e: IListEntry) => e.id },
ariaLabel: localize('keybindingsLabel', "Keybindings"),
setRowLineHeight: false,

View file

@ -1469,7 +1469,7 @@ export class SettingsTree extends ObjectTree<SettingsTreeElement> {
) {
const treeClass = 'settings-editor-tree';
super(container,
super('SettingsTree', container,
new SettingsTreeDelegate(),
renderers,
{
@ -1556,8 +1556,8 @@ export class SettingsTree extends ObjectTree<SettingsTreeElement> {
}));
}
protected createModel(view: ISpliceable<ITreeNode<SettingsTreeGroupChild>>, options: IObjectTreeOptions<SettingsTreeGroupChild>): ITreeModel<SettingsTreeGroupChild | null, void, SettingsTreeGroupChild | null> {
return new NonCollapsibleObjectTreeModel<SettingsTreeGroupChild>(view, options);
protected createModel(user: string, view: ISpliceable<ITreeNode<SettingsTreeGroupChild>>, options: IObjectTreeOptions<SettingsTreeGroupChild>): ITreeModel<SettingsTreeGroupChild | null, void, SettingsTreeGroupChild | null> {
return new NonCollapsibleObjectTreeModel<SettingsTreeGroupChild>(user, view, options);
}
}

View file

@ -204,7 +204,7 @@ export class TOCTree extends ObjectTree<SettingsTreeGroupElement> {
collapseByDefault: true
};
super(container,
super('SettingsTOC', container,
new TOCTreeDelegate(),
[new TOCRenderer()],
options);

View file

@ -315,6 +315,7 @@ class HelpPanel extends ViewletPanel {
container.appendChild(treeContainer);
this.tree = this.instantiationService.createInstance(WorkbenchAsyncDataTree,
'RemoteHelp',
treeContainer,
new HelpTreeVirtualDelegate(),
[new HelpTreeRenderer()],

View file

@ -243,7 +243,7 @@ export class MainPanel extends ViewletPanel {
const renderer = this.instantiationService.createInstance(ProviderRenderer);
const identityProvider = { getId: (r: ISCMRepository) => r.provider.id };
this.list = this.instantiationService.createInstance(WorkbenchList, container, delegate, [renderer], {
this.list = this.instantiationService.createInstance(WorkbenchList, `SCM Main`, container, delegate, [renderer], {
identityProvider,
horizontalScrolling: false
});
@ -848,7 +848,7 @@ export class RepositoryPanel extends ViewletPanel {
new ResourceRenderer(this.listLabels, actionViewItemProvider, () => this.getSelectedResources(), this.themeService, this.menus)
];
this.list = this.instantiationService.createInstance(WorkbenchList, this.listContainer, delegate, renderers, {
this.list = this.instantiationService.createInstance(WorkbenchList, `SCM Repo`, this.listContainer, delegate, renderers, {
identityProvider: scmResourceIdentityProvider,
keyboardNavigationLabelProvider: scmKeyboardNavigationLabelProvider,
horizontalScrolling: false

View file

@ -640,6 +640,7 @@ export class SearchView extends ViewletPanel {
this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, { onDidChangeVisibility: this.onDidChangeBodyVisibility }));
this.tree = this._register(this.instantiationService.createInstance(WorkbenchObjectTree,
'SearchView',
this.resultsElement,
delegate,
[