monaco-editor-core 0.55.0-dev-20251023 → 0.55.0-dev-20251024
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.messages.cs.js +1 -1
- package/esm/nls.messages.de.js +1 -1
- package/esm/nls.messages.es.js +1 -1
- package/esm/nls.messages.fr.js +1 -1
- package/esm/nls.messages.it.js +1 -1
- package/esm/nls.messages.ja.js +1 -1
- package/esm/nls.messages.ko.js +1 -1
- package/esm/nls.messages.pl.js +1 -1
- package/esm/nls.messages.pt-br.js +1 -1
- package/esm/nls.messages.ru.js +1 -1
- package/esm/nls.messages.tr.js +1 -1
- package/esm/nls.messages.zh-cn.js +1 -1
- package/esm/nls.messages.zh-tw.js +1 -1
- package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- package/esm/vs/base/browser/ui/iconLabel/iconlabel.css +2 -0
- package/esm/vs/base/browser/ui/toggle/toggle.js +2 -2
- package/esm/vs/base/browser/ui/toggle/toggle.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js +7 -0
- package/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/objectTree.js +3 -0
- package/esm/vs/base/browser/ui/tree/objectTree.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/objectTreeModel.js +20 -0
- package/esm/vs/base/browser/ui/tree/objectTreeModel.js.map +1 -1
- package/esm/vs/base/common/codiconsLibrary.js +2 -0
- package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
- package/esm/vs/base/common/network.js +5 -1
- package/esm/vs/base/common/network.js.map +1 -1
- package/esm/vs/base/common/platform.js +0 -1
- package/esm/vs/base/common/platform.js.map +1 -1
- package/esm/vs/platform/configuration/common/configurationRegistry.js +12 -0
- package/esm/vs/platform/configuration/common/configurationRegistry.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +2 -0
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -0
- package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTree.js +9 -9
- package/esm/vs/platform/quickinput/browser/tree/quickInputTree.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js +19 -26
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeSorter.js +46 -0
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeSorter.js.map +1 -0
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/ui/tree/objectTree.ts","vs/base/browser/ui/tree/objectTree.ts"],"names":[],"mappings":"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","file":"objectTree.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from '../list/list.js';\nimport { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate, IStickyScrollDelegate, StickyScrollNode } from './abstractTree.js';\nimport { CompressibleObjectTreeModel, ICompressedTreeElement, ICompressedTreeNode } from './compressedObjectTreeModel.js';\nimport { IObjectTreeModel, ObjectTreeModel } from './objectTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElementRenderDetails, ITreeModel, ITreeNode, ITreeRenderer, ITreeSorter } from './tree.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n}\n\nexport interface IObjectTreeSetChildrenOptions<T> {\n\n\t/**\n\t * Identity provider used to optimize splice() calls in the IndexTree. If\n\t * this is not present, optimized splicing is not enabled.\n\t *\n\t * Warning: if this is present, calls to `setChildren()` will not replace\n\t * or update nodes if their identity is the same, even if the elements are\n\t * different. For this, you should call `rerender()`.\n\t */\n\treadonly diffIdentityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> {\n\n\tprotected declare model: IObjectTreeModel<T, TFilterData>;\n\n\toverride get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }\n\n\tconstructor(\n\t\tprotected readonly user: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ITreeRenderer<T, TFilterData, any>[],\n\t\toptions: IObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tsuper(user, container, delegate, renderers, options as IObjectTreeOptions<T | null, TFilterData>);\n\t}\n\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\trerender(element?: T): void {\n\t\tif (element === undefined) {\n\t\t\tthis.view.rerender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.rerender(element);\n\t}\n\n\thasElement(element: T): boolean {\n\t\treturn this.model.has(element);\n\t}\n\n\tprotected createModel(user: string, options: IObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new ObjectTreeModel(user, options);\n\t}\n}\n\ninterface ICompressedTreeNodeProvider<T, TFilterData> {\n\tgetCompressedTreeNode(location: T | null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData>;\n}\n\nexport interface ICompressibleTreeRenderer<T, TFilterData = void, TTemplateData = void> extends ITreeRenderer<T, TFilterData, TTemplateData> {\n\trenderCompressedElements(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n\tdisposeCompressedElements?(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n}\n\ninterface CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\tcompressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined;\n\treadonly data: TTemplateData;\n}\n\nclass CompressibleRenderer<T extends NonNullable<any>, TFilterData, TTemplateData> implements ITreeRenderer<T, TFilterData, CompressibleTemplateData<T, TFilterData, TTemplateData>> {\n\n\treadonly templateId: string;\n\treadonly onDidChangeTwistieState: Event<T> | undefined;\n\n\t@memoize\n\tprivate get compressedTreeNodeProvider(): ICompressedTreeNodeProvider<T, TFilterData> {\n\t\treturn this._compressedTreeNodeProvider();\n\t}\n\n\tconstructor(private _compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, private stickyScrollDelegate: CompressibleStickyScrollDelegate<T, TFilterData>, private renderer: ICompressibleTreeRenderer<T, TFilterData, TTemplateData>) {\n\t\tthis.templateId = renderer.templateId;\n\n\t\tif (renderer.onDidChangeTwistieState) {\n\t\t\tthis.onDidChangeTwistieState = renderer.onDidChangeTwistieState;\n\t\t}\n\t}\n\n\trenderTemplate(container: HTMLElement): CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\t\tconst data = this.renderer.renderTemplate(container);\n\t\treturn { compressedTreeNode: undefined, data };\n\t}\n\n\trenderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tlet compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node);\n\t\tif (!compressedTreeNode) {\n\t\t\tcompressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t}\n\n\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\ttemplateData.compressedTreeNode = undefined;\n\t\t\tthis.renderer.renderElement(node, index, templateData.data, details);\n\t\t} else {\n\t\t\ttemplateData.compressedTreeNode = compressedTreeNode;\n\t\t\tthis.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tif (templateData.compressedTreeNode) {\n\t\t\tthis.renderer.disposeCompressedElements?.(templateData.compressedTreeNode, index, templateData.data, details);\n\t\t} else {\n\t\t\tthis.renderer.disposeElement?.(node, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeTemplate(templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>): void {\n\t\tthis.renderer.disposeTemplate(templateData.data);\n\t}\n\n\trenderTwistie(element: T, twistieElement: HTMLElement): boolean {\n\t\treturn this.renderer.renderTwistie?.(element, twistieElement) ?? false;\n\t}\n}\n\nclass CompressibleStickyScrollDelegate<T, TFilterData> implements IStickyScrollDelegate<T, TFilterData> {\n\n\tprivate readonly compressedStickyNodes = new Map<ITreeNode<T, TFilterData>, ITreeNode<ICompressedTreeNode<T>, TFilterData>>();\n\n\tconstructor(private readonly modelProvider: () => CompressibleObjectTreeModel<T, TFilterData>) { }\n\n\tgetCompressedNode(node: ITreeNode<T, TFilterData>): ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined {\n\t\treturn this.compressedStickyNodes.get(node);\n\t}\n\n\tconstrainStickyScrollNodes(stickyNodes: StickyScrollNode<T, TFilterData>[], stickyScrollMaxItemCount: number, maxWidgetHeight: number): StickyScrollNode<T, TFilterData>[] {\n\t\tthis.compressedStickyNodes.clear();\n\t\tif (stickyNodes.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst stickyNodeBottom = stickyNode.position + stickyNode.height;\n\t\t\tconst followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight;\n\n\t\t\tif (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) {\n\t\t\t\tconst uncompressedStickyNodes = stickyNodes.slice(0, i);\n\t\t\t\tconst overflowingStickyNodes = stickyNodes.slice(i);\n\t\t\t\tconst compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes);\n\t\t\t\treturn [...uncompressedStickyNodes, compressedStickyNode];\n\t\t\t}\n\n\t\t}\n\n\t\treturn stickyNodes;\n\t}\n\n\tprivate compressStickyNodes(stickyNodes: StickyScrollNode<T, TFilterData>[]): StickyScrollNode<T, TFilterData> {\n\n\t\tif (stickyNodes.length === 0) {\n\t\t\tthrow new Error('Can\\'t compress empty sticky nodes');\n\t\t}\n\t\tconst compressionModel = this.modelProvider();\n\t\tif (!compressionModel.isCompressionEnabled()) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Collect all elements to be compressed\n\t\tconst elements: T[] = [];\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst compressedNode = compressionModel.getCompressedTreeNode(stickyNode.node.element);\n\n\t\t\tif (compressedNode.element) {\n\t\t\t\t// if an element is incompressible, it can't be compressed with it's parent element\n\t\t\t\tif (i !== 0 && compressedNode.element.incompressible) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telements.push(...compressedNode.element.elements);\n\t\t\t}\n\t\t}\n\n\t\tif (elements.length < 2) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Compress the elements\n\t\tconst lastStickyNode = stickyNodes[stickyNodes.length - 1];\n\t\tconst compressedElement: ICompressedTreeNode<T> = { elements, incompressible: false };\n\t\tconst compressedNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> = { ...lastStickyNode.node, children: [], element: compressedElement };\n\n\t\tconst stickyTreeNode = new Proxy(stickyNodes[0].node, {});\n\n\t\tconst compressedStickyNode: StickyScrollNode<T, TFilterData> = {\n\t\t\tnode: stickyTreeNode,\n\t\t\tstartIndex: stickyNodes[0].startIndex,\n\t\t\tendIndex: lastStickyNode.endIndex,\n\t\t\tposition: stickyNodes[0].position,\n\t\t\theight: stickyNodes[0].height,\n\t\t};\n\n\t\tthis.compressedStickyNodes.set(stickyTreeNode, compressedNode);\n\n\t\treturn compressedStickyNode;\n\t}\n}\n\nexport interface ICompressibleKeyboardNavigationLabelProvider<T> extends IKeyboardNavigationLabelProvider<T> {\n\tgetCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined } | undefined;\n}\n\nexport interface ICompressibleObjectTreeOptions<T, TFilterData = void> extends IObjectTreeOptions<T, TFilterData> {\n\treadonly keyboardNavigationLabelProvider?: ICompressibleKeyboardNavigationLabelProvider<T>;\n}\n\nfunction asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, options?: ICompressibleObjectTreeOptions<T, TFilterData>): IObjectTreeOptions<T, TFilterData> | undefined {\n\treturn options && {\n\t\t...options,\n\t\tkeyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n\t\t\tgetKeyboardNavigationLabel(e: T) {\n\t\t\t\tlet compressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\n\t\t\t\ttry {\n\t\t\t\t\tcompressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t}\n\n\t\t\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport interface ICompressibleObjectTreeOptionsUpdate extends IAbstractTreeOptionsUpdate {\n\treadonly compressionEnabled?: boolean;\n}\n\nexport class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = void> extends ObjectTree<T, TFilterData> implements ICompressedTreeNodeProvider<T, TFilterData> {\n\n\tprotected declare model: CompressibleObjectTreeModel<T, TFilterData>;\n\n\tconstructor(\n\t\tuser: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ICompressibleTreeRenderer<T, TFilterData, any>[],\n\t\toptions: ICompressibleObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tconst compressedTreeNodeProvider = () => this;\n\t\tconst stickyScrollDelegate = new CompressibleStickyScrollDelegate<T, TFilterData>(() => this.model);\n\t\tconst compressibleRenderers = renderers.map(r => new CompressibleRenderer<T, TFilterData, any>(compressedTreeNodeProvider, stickyScrollDelegate, r));\n\n\t\tsuper(user, container, delegate, compressibleRenderers, { ...asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider, options), stickyScrollDelegate });\n\t}\n\n\toverride setChildren(element: T | null, children: Iterable<ICompressedTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\tprotected override createModel(user: string, options: ICompressibleObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new CompressibleObjectTreeModel(user, options);\n\t}\n\n\toverride updateOptions(optionsUpdate: ICompressibleObjectTreeOptionsUpdate = {}): void {\n\t\tsuper.updateOptions(optionsUpdate);\n\n\t\tif (typeof optionsUpdate.compressionEnabled !== 'undefined') {\n\t\t\tthis.model.setCompressionEnabled(optionsUpdate.compressionEnabled);\n\t\t}\n\t}\n\n\tgetCompressedTreeNode(element: T | null = null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData> {\n\t\treturn this.model.getCompressedTreeNode(element);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from '../list/list.js';\nimport { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate, IStickyScrollDelegate, StickyScrollNode } from './abstractTree.js';\nimport { CompressibleObjectTreeModel, ICompressedTreeElement, ICompressedTreeNode } from './compressedObjectTreeModel.js';\nimport { IObjectTreeModel, ObjectTreeModel } from './objectTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElementRenderDetails, ITreeModel, ITreeNode, ITreeRenderer, ITreeSorter } from './tree.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n}\n\nexport interface IObjectTreeSetChildrenOptions<T> {\n\n\t/**\n\t * Identity provider used to optimize splice() calls in the IndexTree. If\n\t * this is not present, optimized splicing is not enabled.\n\t *\n\t * Warning: if this is present, calls to `setChildren()` will not replace\n\t * or update nodes if their identity is the same, even if the elements are\n\t * different. For this, you should call `rerender()`.\n\t */\n\treadonly diffIdentityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> {\n\n\tprotected declare model: IObjectTreeModel<T, TFilterData>;\n\n\toverride get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }\n\n\tconstructor(\n\t\tprotected readonly user: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ITreeRenderer<T, TFilterData, any>[],\n\t\toptions: IObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tsuper(user, container, delegate, renderers, options as IObjectTreeOptions<T | null, TFilterData>);\n\t}\n\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\trerender(element?: T): void {\n\t\tif (element === undefined) {\n\t\t\tthis.view.rerender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.rerender(element);\n\t}\n\n\thasElement(element: T): boolean {\n\t\treturn this.model.has(element);\n\t}\n\n\tprotected createModel(user: string, options: IObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new ObjectTreeModel(user, options);\n\t}\n}\n\ninterface ICompressedTreeNodeProvider<T, TFilterData> {\n\tgetCompressedTreeNode(location: T | null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData>;\n}\n\nexport interface ICompressibleTreeRenderer<T, TFilterData = void, TTemplateData = void> extends ITreeRenderer<T, TFilterData, TTemplateData> {\n\trenderCompressedElements(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n\tdisposeCompressedElements?(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n}\n\ninterface CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\tcompressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined;\n\treadonly data: TTemplateData;\n}\n\nclass CompressibleRenderer<T extends NonNullable<any>, TFilterData, TTemplateData> implements ITreeRenderer<T, TFilterData, CompressibleTemplateData<T, TFilterData, TTemplateData>> {\n\n\treadonly templateId: string;\n\treadonly onDidChangeTwistieState: Event<T> | undefined;\n\n\t@memoize\n\tprivate get compressedTreeNodeProvider(): ICompressedTreeNodeProvider<T, TFilterData> {\n\t\treturn this._compressedTreeNodeProvider();\n\t}\n\n\tconstructor(private _compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, private stickyScrollDelegate: CompressibleStickyScrollDelegate<T, TFilterData>, private renderer: ICompressibleTreeRenderer<T, TFilterData, TTemplateData>) {\n\t\tthis.templateId = renderer.templateId;\n\n\t\tif (renderer.onDidChangeTwistieState) {\n\t\t\tthis.onDidChangeTwistieState = renderer.onDidChangeTwistieState;\n\t\t}\n\t}\n\n\trenderTemplate(container: HTMLElement): CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\t\tconst data = this.renderer.renderTemplate(container);\n\t\treturn { compressedTreeNode: undefined, data };\n\t}\n\n\trenderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tlet compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node);\n\t\tif (!compressedTreeNode) {\n\t\t\tcompressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t}\n\n\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\ttemplateData.compressedTreeNode = undefined;\n\t\t\tthis.renderer.renderElement(node, index, templateData.data, details);\n\t\t} else {\n\t\t\ttemplateData.compressedTreeNode = compressedTreeNode;\n\t\t\tthis.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tif (templateData.compressedTreeNode) {\n\t\t\tthis.renderer.disposeCompressedElements?.(templateData.compressedTreeNode, index, templateData.data, details);\n\t\t} else {\n\t\t\tthis.renderer.disposeElement?.(node, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeTemplate(templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>): void {\n\t\tthis.renderer.disposeTemplate(templateData.data);\n\t}\n\n\trenderTwistie(element: T, twistieElement: HTMLElement): boolean {\n\t\treturn this.renderer.renderTwistie?.(element, twistieElement) ?? false;\n\t}\n}\n\nclass CompressibleStickyScrollDelegate<T, TFilterData> implements IStickyScrollDelegate<T, TFilterData> {\n\n\tprivate readonly compressedStickyNodes = new Map<ITreeNode<T, TFilterData>, ITreeNode<ICompressedTreeNode<T>, TFilterData>>();\n\n\tconstructor(private readonly modelProvider: () => CompressibleObjectTreeModel<T, TFilterData>) { }\n\n\tgetCompressedNode(node: ITreeNode<T, TFilterData>): ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined {\n\t\treturn this.compressedStickyNodes.get(node);\n\t}\n\n\tconstrainStickyScrollNodes(stickyNodes: StickyScrollNode<T, TFilterData>[], stickyScrollMaxItemCount: number, maxWidgetHeight: number): StickyScrollNode<T, TFilterData>[] {\n\t\tthis.compressedStickyNodes.clear();\n\t\tif (stickyNodes.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst stickyNodeBottom = stickyNode.position + stickyNode.height;\n\t\t\tconst followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight;\n\n\t\t\tif (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) {\n\t\t\t\tconst uncompressedStickyNodes = stickyNodes.slice(0, i);\n\t\t\t\tconst overflowingStickyNodes = stickyNodes.slice(i);\n\t\t\t\tconst compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes);\n\t\t\t\treturn [...uncompressedStickyNodes, compressedStickyNode];\n\t\t\t}\n\n\t\t}\n\n\t\treturn stickyNodes;\n\t}\n\n\tprivate compressStickyNodes(stickyNodes: StickyScrollNode<T, TFilterData>[]): StickyScrollNode<T, TFilterData> {\n\n\t\tif (stickyNodes.length === 0) {\n\t\t\tthrow new Error('Can\\'t compress empty sticky nodes');\n\t\t}\n\t\tconst compressionModel = this.modelProvider();\n\t\tif (!compressionModel.isCompressionEnabled()) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Collect all elements to be compressed\n\t\tconst elements: T[] = [];\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst compressedNode = compressionModel.getCompressedTreeNode(stickyNode.node.element);\n\n\t\t\tif (compressedNode.element) {\n\t\t\t\t// if an element is incompressible, it can't be compressed with it's parent element\n\t\t\t\tif (i !== 0 && compressedNode.element.incompressible) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telements.push(...compressedNode.element.elements);\n\t\t\t}\n\t\t}\n\n\t\tif (elements.length < 2) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Compress the elements\n\t\tconst lastStickyNode = stickyNodes[stickyNodes.length - 1];\n\t\tconst compressedElement: ICompressedTreeNode<T> = { elements, incompressible: false };\n\t\tconst compressedNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> = { ...lastStickyNode.node, children: [], element: compressedElement };\n\n\t\tconst stickyTreeNode = new Proxy(stickyNodes[0].node, {});\n\n\t\tconst compressedStickyNode: StickyScrollNode<T, TFilterData> = {\n\t\t\tnode: stickyTreeNode,\n\t\t\tstartIndex: stickyNodes[0].startIndex,\n\t\t\tendIndex: lastStickyNode.endIndex,\n\t\t\tposition: stickyNodes[0].position,\n\t\t\theight: stickyNodes[0].height,\n\t\t};\n\n\t\tthis.compressedStickyNodes.set(stickyTreeNode, compressedNode);\n\n\t\treturn compressedStickyNode;\n\t}\n}\n\nexport interface ICompressibleKeyboardNavigationLabelProvider<T> extends IKeyboardNavigationLabelProvider<T> {\n\tgetCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined } | undefined;\n}\n\nexport interface ICompressibleObjectTreeOptions<T, TFilterData = void> extends IObjectTreeOptions<T, TFilterData> {\n\treadonly keyboardNavigationLabelProvider?: ICompressibleKeyboardNavigationLabelProvider<T>;\n}\n\nfunction asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, options?: ICompressibleObjectTreeOptions<T, TFilterData>): IObjectTreeOptions<T, TFilterData> | undefined {\n\treturn options && {\n\t\t...options,\n\t\tkeyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n\t\t\tgetKeyboardNavigationLabel(e: T) {\n\t\t\t\tlet compressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\n\t\t\t\ttry {\n\t\t\t\t\tcompressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t}\n\n\t\t\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport interface ICompressibleObjectTreeOptionsUpdate extends IAbstractTreeOptionsUpdate {\n\treadonly compressionEnabled?: boolean;\n}\n\nexport class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = void> extends ObjectTree<T, TFilterData> implements ICompressedTreeNodeProvider<T, TFilterData> {\n\n\tprotected declare model: CompressibleObjectTreeModel<T, TFilterData>;\n\n\tconstructor(\n\t\tuser: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ICompressibleTreeRenderer<T, TFilterData, any>[],\n\t\toptions: ICompressibleObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tconst compressedTreeNodeProvider = () => this;\n\t\tconst stickyScrollDelegate = new CompressibleStickyScrollDelegate<T, TFilterData>(() => this.model);\n\t\tconst compressibleRenderers = renderers.map(r => new CompressibleRenderer<T, TFilterData, any>(compressedTreeNodeProvider, stickyScrollDelegate, r));\n\n\t\tsuper(user, container, delegate, compressibleRenderers, { ...asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider, options), stickyScrollDelegate });\n\t}\n\n\toverride setChildren(element: T | null, children: Iterable<ICompressedTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\tprotected override createModel(user: string, options: ICompressibleObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new CompressibleObjectTreeModel(user, options);\n\t}\n\n\toverride updateOptions(optionsUpdate: ICompressibleObjectTreeOptionsUpdate = {}): void {\n\t\tsuper.updateOptions(optionsUpdate);\n\n\t\tif (typeof optionsUpdate.compressionEnabled !== 'undefined') {\n\t\t\tthis.model.setCompressionEnabled(optionsUpdate.compressionEnabled);\n\t\t}\n\t}\n\n\tgetCompressedTreeNode(element: T | null = null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData> {\n\t\treturn this.model.getCompressedTreeNode(element);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/ui/tree/objectTree.ts","vs/base/browser/ui/tree/objectTree.ts"],"names":[],"mappings":"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","file":"objectTree.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from '../list/list.js';\nimport { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate, IStickyScrollDelegate, StickyScrollNode } from './abstractTree.js';\nimport { CompressibleObjectTreeModel, ICompressedTreeElement, ICompressedTreeNode } from './compressedObjectTreeModel.js';\nimport { IObjectTreeModel, ObjectTreeModel } from './objectTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElementRenderDetails, ITreeModel, ITreeNode, ITreeRenderer, ITreeSorter } from './tree.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n}\n\nexport interface IObjectTreeSetChildrenOptions<T> {\n\n\t/**\n\t * Identity provider used to optimize splice() calls in the IndexTree. If\n\t * this is not present, optimized splicing is not enabled.\n\t *\n\t * Warning: if this is present, calls to `setChildren()` will not replace\n\t * or update nodes if their identity is the same, even if the elements are\n\t * different. For this, you should call `rerender()`.\n\t */\n\treadonly diffIdentityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> {\n\n\tprotected declare model: IObjectTreeModel<T, TFilterData>;\n\n\toverride get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }\n\n\tconstructor(\n\t\tprotected readonly user: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ITreeRenderer<T, TFilterData, any>[],\n\t\toptions: IObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tsuper(user, container, delegate, renderers, options as IObjectTreeOptions<T | null, TFilterData>);\n\t}\n\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\trerender(element?: T): void {\n\t\tif (element === undefined) {\n\t\t\tthis.view.rerender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.rerender(element);\n\t}\n\n\tresort(element: T | null, recursive = true): void {\n\t\tthis.model.resort(element, recursive);\n\t}\n\n\thasElement(element: T): boolean {\n\t\treturn this.model.has(element);\n\t}\n\n\tprotected createModel(user: string, options: IObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new ObjectTreeModel(user, options);\n\t}\n}\n\ninterface ICompressedTreeNodeProvider<T, TFilterData> {\n\tgetCompressedTreeNode(location: T | null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData>;\n}\n\nexport interface ICompressibleTreeRenderer<T, TFilterData = void, TTemplateData = void> extends ITreeRenderer<T, TFilterData, TTemplateData> {\n\trenderCompressedElements(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n\tdisposeCompressedElements?(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n}\n\ninterface CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\tcompressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined;\n\treadonly data: TTemplateData;\n}\n\nclass CompressibleRenderer<T extends NonNullable<any>, TFilterData, TTemplateData> implements ITreeRenderer<T, TFilterData, CompressibleTemplateData<T, TFilterData, TTemplateData>> {\n\n\treadonly templateId: string;\n\treadonly onDidChangeTwistieState: Event<T> | undefined;\n\n\t@memoize\n\tprivate get compressedTreeNodeProvider(): ICompressedTreeNodeProvider<T, TFilterData> {\n\t\treturn this._compressedTreeNodeProvider();\n\t}\n\n\tconstructor(private _compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, private stickyScrollDelegate: CompressibleStickyScrollDelegate<T, TFilterData>, private renderer: ICompressibleTreeRenderer<T, TFilterData, TTemplateData>) {\n\t\tthis.templateId = renderer.templateId;\n\n\t\tif (renderer.onDidChangeTwistieState) {\n\t\t\tthis.onDidChangeTwistieState = renderer.onDidChangeTwistieState;\n\t\t}\n\t}\n\n\trenderTemplate(container: HTMLElement): CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\t\tconst data = this.renderer.renderTemplate(container);\n\t\treturn { compressedTreeNode: undefined, data };\n\t}\n\n\trenderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tlet compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node);\n\t\tif (!compressedTreeNode) {\n\t\t\tcompressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t}\n\n\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\ttemplateData.compressedTreeNode = undefined;\n\t\t\tthis.renderer.renderElement(node, index, templateData.data, details);\n\t\t} else {\n\t\t\ttemplateData.compressedTreeNode = compressedTreeNode;\n\t\t\tthis.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tif (templateData.compressedTreeNode) {\n\t\t\tthis.renderer.disposeCompressedElements?.(templateData.compressedTreeNode, index, templateData.data, details);\n\t\t} else {\n\t\t\tthis.renderer.disposeElement?.(node, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeTemplate(templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>): void {\n\t\tthis.renderer.disposeTemplate(templateData.data);\n\t}\n\n\trenderTwistie(element: T, twistieElement: HTMLElement): boolean {\n\t\treturn this.renderer.renderTwistie?.(element, twistieElement) ?? false;\n\t}\n}\n\nclass CompressibleStickyScrollDelegate<T, TFilterData> implements IStickyScrollDelegate<T, TFilterData> {\n\n\tprivate readonly compressedStickyNodes = new Map<ITreeNode<T, TFilterData>, ITreeNode<ICompressedTreeNode<T>, TFilterData>>();\n\n\tconstructor(private readonly modelProvider: () => CompressibleObjectTreeModel<T, TFilterData>) { }\n\n\tgetCompressedNode(node: ITreeNode<T, TFilterData>): ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined {\n\t\treturn this.compressedStickyNodes.get(node);\n\t}\n\n\tconstrainStickyScrollNodes(stickyNodes: StickyScrollNode<T, TFilterData>[], stickyScrollMaxItemCount: number, maxWidgetHeight: number): StickyScrollNode<T, TFilterData>[] {\n\t\tthis.compressedStickyNodes.clear();\n\t\tif (stickyNodes.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst stickyNodeBottom = stickyNode.position + stickyNode.height;\n\t\t\tconst followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight;\n\n\t\t\tif (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) {\n\t\t\t\tconst uncompressedStickyNodes = stickyNodes.slice(0, i);\n\t\t\t\tconst overflowingStickyNodes = stickyNodes.slice(i);\n\t\t\t\tconst compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes);\n\t\t\t\treturn [...uncompressedStickyNodes, compressedStickyNode];\n\t\t\t}\n\n\t\t}\n\n\t\treturn stickyNodes;\n\t}\n\n\tprivate compressStickyNodes(stickyNodes: StickyScrollNode<T, TFilterData>[]): StickyScrollNode<T, TFilterData> {\n\n\t\tif (stickyNodes.length === 0) {\n\t\t\tthrow new Error('Can\\'t compress empty sticky nodes');\n\t\t}\n\t\tconst compressionModel = this.modelProvider();\n\t\tif (!compressionModel.isCompressionEnabled()) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Collect all elements to be compressed\n\t\tconst elements: T[] = [];\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst compressedNode = compressionModel.getCompressedTreeNode(stickyNode.node.element);\n\n\t\t\tif (compressedNode.element) {\n\t\t\t\t// if an element is incompressible, it can't be compressed with it's parent element\n\t\t\t\tif (i !== 0 && compressedNode.element.incompressible) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telements.push(...compressedNode.element.elements);\n\t\t\t}\n\t\t}\n\n\t\tif (elements.length < 2) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Compress the elements\n\t\tconst lastStickyNode = stickyNodes[stickyNodes.length - 1];\n\t\tconst compressedElement: ICompressedTreeNode<T> = { elements, incompressible: false };\n\t\tconst compressedNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> = { ...lastStickyNode.node, children: [], element: compressedElement };\n\n\t\tconst stickyTreeNode = new Proxy(stickyNodes[0].node, {});\n\n\t\tconst compressedStickyNode: StickyScrollNode<T, TFilterData> = {\n\t\t\tnode: stickyTreeNode,\n\t\t\tstartIndex: stickyNodes[0].startIndex,\n\t\t\tendIndex: lastStickyNode.endIndex,\n\t\t\tposition: stickyNodes[0].position,\n\t\t\theight: stickyNodes[0].height,\n\t\t};\n\n\t\tthis.compressedStickyNodes.set(stickyTreeNode, compressedNode);\n\n\t\treturn compressedStickyNode;\n\t}\n}\n\nexport interface ICompressibleKeyboardNavigationLabelProvider<T> extends IKeyboardNavigationLabelProvider<T> {\n\tgetCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined } | undefined;\n}\n\nexport interface ICompressibleObjectTreeOptions<T, TFilterData = void> extends IObjectTreeOptions<T, TFilterData> {\n\treadonly keyboardNavigationLabelProvider?: ICompressibleKeyboardNavigationLabelProvider<T>;\n}\n\nfunction asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, options?: ICompressibleObjectTreeOptions<T, TFilterData>): IObjectTreeOptions<T, TFilterData> | undefined {\n\treturn options && {\n\t\t...options,\n\t\tkeyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n\t\t\tgetKeyboardNavigationLabel(e: T) {\n\t\t\t\tlet compressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\n\t\t\t\ttry {\n\t\t\t\t\tcompressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t}\n\n\t\t\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport interface ICompressibleObjectTreeOptionsUpdate extends IAbstractTreeOptionsUpdate {\n\treadonly compressionEnabled?: boolean;\n}\n\nexport class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = void> extends ObjectTree<T, TFilterData> implements ICompressedTreeNodeProvider<T, TFilterData> {\n\n\tprotected declare model: CompressibleObjectTreeModel<T, TFilterData>;\n\n\tconstructor(\n\t\tuser: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ICompressibleTreeRenderer<T, TFilterData, any>[],\n\t\toptions: ICompressibleObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tconst compressedTreeNodeProvider = () => this;\n\t\tconst stickyScrollDelegate = new CompressibleStickyScrollDelegate<T, TFilterData>(() => this.model);\n\t\tconst compressibleRenderers = renderers.map(r => new CompressibleRenderer<T, TFilterData, any>(compressedTreeNodeProvider, stickyScrollDelegate, r));\n\n\t\tsuper(user, container, delegate, compressibleRenderers, { ...asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider, options), stickyScrollDelegate });\n\t}\n\n\toverride setChildren(element: T | null, children: Iterable<ICompressedTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\tprotected override createModel(user: string, options: ICompressibleObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new CompressibleObjectTreeModel(user, options);\n\t}\n\n\toverride updateOptions(optionsUpdate: ICompressibleObjectTreeOptionsUpdate = {}): void {\n\t\tsuper.updateOptions(optionsUpdate);\n\n\t\tif (typeof optionsUpdate.compressionEnabled !== 'undefined') {\n\t\t\tthis.model.setCompressionEnabled(optionsUpdate.compressionEnabled);\n\t\t}\n\t}\n\n\tgetCompressedTreeNode(element: T | null = null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData> {\n\t\treturn this.model.getCompressedTreeNode(element);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from '../list/list.js';\nimport { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate, IStickyScrollDelegate, StickyScrollNode } from './abstractTree.js';\nimport { CompressibleObjectTreeModel, ICompressedTreeElement, ICompressedTreeNode } from './compressedObjectTreeModel.js';\nimport { IObjectTreeModel, ObjectTreeModel } from './objectTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElementRenderDetails, ITreeModel, ITreeNode, ITreeRenderer, ITreeSorter } from './tree.js';\nimport { memoize } from '../../../common/decorators.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeOptions<T, TFilterData = void> extends IAbstractTreeOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n}\n\nexport interface IObjectTreeSetChildrenOptions<T> {\n\n\t/**\n\t * Identity provider used to optimize splice() calls in the IndexTree. If\n\t * this is not present, optimized splicing is not enabled.\n\t *\n\t * Warning: if this is present, calls to `setChildren()` will not replace\n\t * or update nodes if their identity is the same, even if the elements are\n\t * different. For this, you should call `rerender()`.\n\t */\n\treadonly diffIdentityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends AbstractTree<T | null, TFilterData, T | null> {\n\n\tprotected declare model: IObjectTreeModel<T, TFilterData>;\n\n\toverride get onDidChangeCollapseState(): Event<ICollapseStateChangeEvent<T | null, TFilterData>> { return this.model.onDidChangeCollapseState; }\n\n\tconstructor(\n\t\tprotected readonly user: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ITreeRenderer<T, TFilterData, any>[],\n\t\toptions: IObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tsuper(user, container, delegate, renderers, options as IObjectTreeOptions<T | null, TFilterData>);\n\t}\n\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\trerender(element?: T): void {\n\t\tif (element === undefined) {\n\t\t\tthis.view.rerender();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.rerender(element);\n\t}\n\n\tresort(element: T | null, recursive = true): void {\n\t\tthis.model.resort(element, recursive);\n\t}\n\n\thasElement(element: T): boolean {\n\t\treturn this.model.has(element);\n\t}\n\n\tprotected createModel(user: string, options: IObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new ObjectTreeModel(user, options);\n\t}\n}\n\ninterface ICompressedTreeNodeProvider<T, TFilterData> {\n\tgetCompressedTreeNode(location: T | null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData>;\n}\n\nexport interface ICompressibleTreeRenderer<T, TFilterData = void, TTemplateData = void> extends ITreeRenderer<T, TFilterData, TTemplateData> {\n\trenderCompressedElements(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n\tdisposeCompressedElements?(node: ITreeNode<ICompressedTreeNode<T>, TFilterData>, index: number, templateData: TTemplateData, details?: ITreeElementRenderDetails): void;\n}\n\ninterface CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\tcompressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined;\n\treadonly data: TTemplateData;\n}\n\nclass CompressibleRenderer<T extends NonNullable<any>, TFilterData, TTemplateData> implements ITreeRenderer<T, TFilterData, CompressibleTemplateData<T, TFilterData, TTemplateData>> {\n\n\treadonly templateId: string;\n\treadonly onDidChangeTwistieState: Event<T> | undefined;\n\n\t@memoize\n\tprivate get compressedTreeNodeProvider(): ICompressedTreeNodeProvider<T, TFilterData> {\n\t\treturn this._compressedTreeNodeProvider();\n\t}\n\n\tconstructor(private _compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, private stickyScrollDelegate: CompressibleStickyScrollDelegate<T, TFilterData>, private renderer: ICompressibleTreeRenderer<T, TFilterData, TTemplateData>) {\n\t\tthis.templateId = renderer.templateId;\n\n\t\tif (renderer.onDidChangeTwistieState) {\n\t\t\tthis.onDidChangeTwistieState = renderer.onDidChangeTwistieState;\n\t\t}\n\t}\n\n\trenderTemplate(container: HTMLElement): CompressibleTemplateData<T, TFilterData, TTemplateData> {\n\t\tconst data = this.renderer.renderTemplate(container);\n\t\treturn { compressedTreeNode: undefined, data };\n\t}\n\n\trenderElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tlet compressedTreeNode = this.stickyScrollDelegate.getCompressedNode(node);\n\t\tif (!compressedTreeNode) {\n\t\t\tcompressedTreeNode = this.compressedTreeNodeProvider.getCompressedTreeNode(node.element) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t}\n\n\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\ttemplateData.compressedTreeNode = undefined;\n\t\t\tthis.renderer.renderElement(node, index, templateData.data, details);\n\t\t} else {\n\t\t\ttemplateData.compressedTreeNode = compressedTreeNode;\n\t\t\tthis.renderer.renderCompressedElements(compressedTreeNode, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeElement(node: ITreeNode<T, TFilterData>, index: number, templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>, details?: ITreeElementRenderDetails): void {\n\t\tif (templateData.compressedTreeNode) {\n\t\t\tthis.renderer.disposeCompressedElements?.(templateData.compressedTreeNode, index, templateData.data, details);\n\t\t} else {\n\t\t\tthis.renderer.disposeElement?.(node, index, templateData.data, details);\n\t\t}\n\t}\n\n\tdisposeTemplate(templateData: CompressibleTemplateData<T, TFilterData, TTemplateData>): void {\n\t\tthis.renderer.disposeTemplate(templateData.data);\n\t}\n\n\trenderTwistie(element: T, twistieElement: HTMLElement): boolean {\n\t\treturn this.renderer.renderTwistie?.(element, twistieElement) ?? false;\n\t}\n}\n\nclass CompressibleStickyScrollDelegate<T, TFilterData> implements IStickyScrollDelegate<T, TFilterData> {\n\n\tprivate readonly compressedStickyNodes = new Map<ITreeNode<T, TFilterData>, ITreeNode<ICompressedTreeNode<T>, TFilterData>>();\n\n\tconstructor(private readonly modelProvider: () => CompressibleObjectTreeModel<T, TFilterData>) { }\n\n\tgetCompressedNode(node: ITreeNode<T, TFilterData>): ITreeNode<ICompressedTreeNode<T>, TFilterData> | undefined {\n\t\treturn this.compressedStickyNodes.get(node);\n\t}\n\n\tconstrainStickyScrollNodes(stickyNodes: StickyScrollNode<T, TFilterData>[], stickyScrollMaxItemCount: number, maxWidgetHeight: number): StickyScrollNode<T, TFilterData>[] {\n\t\tthis.compressedStickyNodes.clear();\n\t\tif (stickyNodes.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst stickyNodeBottom = stickyNode.position + stickyNode.height;\n\t\t\tconst followingReachesMaxHeight = i + 1 < stickyNodes.length && stickyNodeBottom + stickyNodes[i + 1].height > maxWidgetHeight;\n\n\t\t\tif (followingReachesMaxHeight || i >= stickyScrollMaxItemCount - 1 && stickyScrollMaxItemCount < stickyNodes.length) {\n\t\t\t\tconst uncompressedStickyNodes = stickyNodes.slice(0, i);\n\t\t\t\tconst overflowingStickyNodes = stickyNodes.slice(i);\n\t\t\t\tconst compressedStickyNode = this.compressStickyNodes(overflowingStickyNodes);\n\t\t\t\treturn [...uncompressedStickyNodes, compressedStickyNode];\n\t\t\t}\n\n\t\t}\n\n\t\treturn stickyNodes;\n\t}\n\n\tprivate compressStickyNodes(stickyNodes: StickyScrollNode<T, TFilterData>[]): StickyScrollNode<T, TFilterData> {\n\n\t\tif (stickyNodes.length === 0) {\n\t\t\tthrow new Error('Can\\'t compress empty sticky nodes');\n\t\t}\n\t\tconst compressionModel = this.modelProvider();\n\t\tif (!compressionModel.isCompressionEnabled()) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Collect all elements to be compressed\n\t\tconst elements: T[] = [];\n\t\tfor (let i = 0; i < stickyNodes.length; i++) {\n\t\t\tconst stickyNode = stickyNodes[i];\n\t\t\tconst compressedNode = compressionModel.getCompressedTreeNode(stickyNode.node.element);\n\n\t\t\tif (compressedNode.element) {\n\t\t\t\t// if an element is incompressible, it can't be compressed with it's parent element\n\t\t\t\tif (i !== 0 && compressedNode.element.incompressible) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telements.push(...compressedNode.element.elements);\n\t\t\t}\n\t\t}\n\n\t\tif (elements.length < 2) {\n\t\t\treturn stickyNodes[0];\n\t\t}\n\n\t\t// Compress the elements\n\t\tconst lastStickyNode = stickyNodes[stickyNodes.length - 1];\n\t\tconst compressedElement: ICompressedTreeNode<T> = { elements, incompressible: false };\n\t\tconst compressedNode: ITreeNode<ICompressedTreeNode<T>, TFilterData> = { ...lastStickyNode.node, children: [], element: compressedElement };\n\n\t\tconst stickyTreeNode = new Proxy(stickyNodes[0].node, {});\n\n\t\tconst compressedStickyNode: StickyScrollNode<T, TFilterData> = {\n\t\t\tnode: stickyTreeNode,\n\t\t\tstartIndex: stickyNodes[0].startIndex,\n\t\t\tendIndex: lastStickyNode.endIndex,\n\t\t\tposition: stickyNodes[0].position,\n\t\t\theight: stickyNodes[0].height,\n\t\t};\n\n\t\tthis.compressedStickyNodes.set(stickyTreeNode, compressedNode);\n\n\t\treturn compressedStickyNode;\n\t}\n}\n\nexport interface ICompressibleKeyboardNavigationLabelProvider<T> extends IKeyboardNavigationLabelProvider<T> {\n\tgetCompressedNodeKeyboardNavigationLabel(elements: T[]): { toString(): string | undefined } | undefined;\n}\n\nexport interface ICompressibleObjectTreeOptions<T, TFilterData = void> extends IObjectTreeOptions<T, TFilterData> {\n\treadonly keyboardNavigationLabelProvider?: ICompressibleKeyboardNavigationLabelProvider<T>;\n}\n\nfunction asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider: () => ICompressedTreeNodeProvider<T, TFilterData>, options?: ICompressibleObjectTreeOptions<T, TFilterData>): IObjectTreeOptions<T, TFilterData> | undefined {\n\treturn options && {\n\t\t...options,\n\t\tkeyboardNavigationLabelProvider: options.keyboardNavigationLabelProvider && {\n\t\t\tgetKeyboardNavigationLabel(e: T) {\n\t\t\t\tlet compressedTreeNode: ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\n\t\t\t\ttry {\n\t\t\t\t\tcompressedTreeNode = compressedTreeNodeProvider().getCompressedTreeNode(e) as ITreeNode<ICompressedTreeNode<T>, TFilterData>;\n\t\t\t\t} catch {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t}\n\n\t\t\t\tif (compressedTreeNode.element.elements.length === 1) {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getKeyboardNavigationLabel(e);\n\t\t\t\t} else {\n\t\t\t\t\treturn options.keyboardNavigationLabelProvider!.getCompressedNodeKeyboardNavigationLabel(compressedTreeNode.element.elements);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\nexport interface ICompressibleObjectTreeOptionsUpdate extends IAbstractTreeOptionsUpdate {\n\treadonly compressionEnabled?: boolean;\n}\n\nexport class CompressibleObjectTree<T extends NonNullable<any>, TFilterData = void> extends ObjectTree<T, TFilterData> implements ICompressedTreeNodeProvider<T, TFilterData> {\n\n\tprotected declare model: CompressibleObjectTreeModel<T, TFilterData>;\n\n\tconstructor(\n\t\tuser: string,\n\t\tcontainer: HTMLElement,\n\t\tdelegate: IListVirtualDelegate<T>,\n\t\trenderers: ICompressibleTreeRenderer<T, TFilterData, any>[],\n\t\toptions: ICompressibleObjectTreeOptions<T, TFilterData> = {}\n\t) {\n\t\tconst compressedTreeNodeProvider = () => this;\n\t\tconst stickyScrollDelegate = new CompressibleStickyScrollDelegate<T, TFilterData>(() => this.model);\n\t\tconst compressibleRenderers = renderers.map(r => new CompressibleRenderer<T, TFilterData, any>(compressedTreeNodeProvider, stickyScrollDelegate, r));\n\n\t\tsuper(user, container, delegate, compressibleRenderers, { ...asObjectTreeOptions<T, TFilterData>(compressedTreeNodeProvider, options), stickyScrollDelegate });\n\t}\n\n\toverride setChildren(element: T | null, children: Iterable<ICompressedTreeElement<T>> = Iterable.empty(), options?: IObjectTreeSetChildrenOptions<T>): void {\n\t\tthis.model.setChildren(element, children, options);\n\t}\n\n\tprotected override createModel(user: string, options: ICompressibleObjectTreeOptions<T | null, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {\n\t\treturn new CompressibleObjectTreeModel(user, options);\n\t}\n\n\toverride updateOptions(optionsUpdate: ICompressibleObjectTreeOptionsUpdate = {}): void {\n\t\tsuper.updateOptions(optionsUpdate);\n\n\t\tif (typeof optionsUpdate.compressionEnabled !== 'undefined') {\n\t\t\tthis.model.setCompressionEnabled(optionsUpdate.compressionEnabled);\n\t\t}\n\t}\n\n\tgetCompressedTreeNode(element: T | null = null): ITreeNode<ICompressedTreeNode<T> | null, TFilterData> {\n\t\treturn this.model.getCompressedTreeNode(element);\n\t}\n}\n"]}
|
|
@@ -120,6 +120,26 @@ export class ObjectTreeModel {
|
|
|
120
120
|
const location = this.getElementLocation(element);
|
|
121
121
|
this.model.rerender(location);
|
|
122
122
|
}
|
|
123
|
+
resort(element = null, recursive = true) {
|
|
124
|
+
if (!this.sorter) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const location = this.getElementLocation(element);
|
|
128
|
+
const node = this.model.getNode(location);
|
|
129
|
+
this._setChildren(location, this.resortChildren(node, recursive), {});
|
|
130
|
+
}
|
|
131
|
+
resortChildren(node, recursive, first = true) {
|
|
132
|
+
let childrenNodes = [...node.children];
|
|
133
|
+
if (recursive || first) {
|
|
134
|
+
childrenNodes = childrenNodes.sort(this.sorter.compare.bind(this.sorter));
|
|
135
|
+
}
|
|
136
|
+
return Iterable.map(childrenNodes, node => ({
|
|
137
|
+
element: node.element,
|
|
138
|
+
collapsible: node.collapsible,
|
|
139
|
+
collapsed: node.collapsed,
|
|
140
|
+
children: this.resortChildren(node, recursive, false)
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
123
143
|
getFirstElementChild(ref = null) {
|
|
124
144
|
const location = this.getElementLocation(ref);
|
|
125
145
|
return this.model.getFirstElementChild(location);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/ui/tree/objectTreeModel.ts","vs/base/browser/ui/tree/objectTreeModel.ts"],"names":[],"mappings":"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","file":"objectTreeModel.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider } from '../list/list.js';\nimport { IIndexTreeModelOptions, IIndexTreeModelSpliceOptions, IndexTreeModel } from './indexTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElement, ITreeListSpliceData, ITreeModel, ITreeModelSpliceEvent, ITreeNode, ITreeSorter, ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> extends ITreeModel<T | null, TFilterData, T | null> {\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> | undefined, options?: IObjectTreeModelSetChildrenOptions<T, TFilterData>): void;\n}\n\nexport interface IObjectTreeModelSetChildrenOptions<T, TFilterData> extends IIndexTreeModelSpliceOptions<T, TFilterData> {\n}\n\nexport interface IObjectTreeModelOptions<T, TFilterData> extends IIndexTreeModelOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n\treadonly identityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> implements IObjectTreeModel<T, TFilterData> {\n\n\treadonly rootRef = null;\n\n\tprivate model: IndexTreeModel<T | null, TFilterData>;\n\tprivate nodes = new Map<T | null, ITreeNode<T, TFilterData>>();\n\tprivate readonly nodesByIdentity = new Map<string, ITreeNode<T, TFilterData>>();\n\tprivate readonly identityProvider?: IIdentityProvider<T>;\n\tprivate sorter?: ITreeSorter<{ element: T }>;\n\n\treadonly onDidSpliceModel: Event<ITreeModelSpliceEvent<T | null, TFilterData>>;\n\treadonly onDidSpliceRenderedNodes: Event<ITreeListSpliceData<T | null, TFilterData>>;\n\treadonly onDidChangeCollapseState: Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\treadonly onDidChangeRenderNodeCount: Event<ITreeNode<T, TFilterData>>;\n\n\tconstructor(\n\t\tprivate user: string,\n\t\toptions: IObjectTreeModelOptions<T, TFilterData> = {}\n\t) {\n\t\tthis.model = new IndexTreeModel(user, null, options);\n\t\tthis.onDidSpliceModel = this.model.onDidSpliceModel;\n\t\tthis.onDidSpliceRenderedNodes = this.model.onDidSpliceRenderedNodes;\n\t\tthis.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\t\tthis.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;\n\n\t\tif (options.sorter) {\n\t\t\tthis.sorter = {\n\t\t\t\tcompare(a, b) {\n\t\t\t\t\treturn options.sorter!.compare(a.element, b.element);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tthis.identityProvider = options.identityProvider;\n\t}\n\n\tsetChildren(\n\t\telement: T | null,\n\t\tchildren: Iterable<IObjectTreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData> = {},\n\t): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis._setChildren(location, this.preserveCollapseState(children), options);\n\t}\n\n\tprivate _setChildren(\n\t\tlocation: number[],\n\t\tchildren: Iterable<ITreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData>,\n\t): void {\n\t\tconst insertedElements = new Set<T | null>();\n\t\tconst insertedElementIds = new Set<string>();\n\n\t\tconst onDidCreateNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tinsertedElements.add(tnode.element);\n\t\t\tthis.nodes.set(tnode.element, tnode);\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tinsertedElementIds.add(id);\n\t\t\t\tthis.nodesByIdentity.set(id, tnode);\n\t\t\t}\n\n\t\t\toptions.onDidCreateNode?.(tnode);\n\t\t};\n\n\t\tconst onDidDeleteNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tif (!insertedElements.has(tnode.element)) {\n\t\t\t\tthis.nodes.delete(tnode.element);\n\t\t\t}\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tif (!insertedElementIds.has(id)) {\n\t\t\t\t\tthis.nodesByIdentity.delete(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.onDidDeleteNode?.(tnode);\n\t\t};\n\n\t\tthis.model.splice(\n\t\t\t[...location, 0],\n\t\t\tNumber.MAX_VALUE,\n\t\t\tchildren,\n\t\t\t{ ...options, onDidCreateNode, onDidDeleteNode }\n\t\t);\n\t}\n\n\tprivate preserveCollapseState(elements: Iterable<IObjectTreeElement<T>> = Iterable.empty()): Iterable<ITreeElement<T>> {\n\t\tif (this.sorter) {\n\t\t\telements = [...elements].sort(this.sorter.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map(elements, treeElement => {\n\t\t\tlet node = this.nodes.get(treeElement.element);\n\n\t\t\tif (!node && this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(treeElement.element).toString();\n\t\t\t\tnode = this.nodesByIdentity.get(id);\n\t\t\t}\n\n\t\t\tif (!node) {\n\t\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\t\tif (typeof treeElement.collapsed === 'undefined') {\n\t\t\t\t\tcollapsed = undefined;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) {\n\t\t\t\t\tcollapsed = true;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\t\tcollapsed = false;\n\t\t\t\t} else {\n\t\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...treeElement,\n\t\t\t\t\tchildren: this.preserveCollapseState(treeElement.children),\n\t\t\t\t\tcollapsed\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst collapsible = typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : node.collapsible;\n\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\tif (typeof treeElement.collapsed === 'undefined' || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\tcollapsed = node.collapsed;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) {\n\t\t\t\tcollapsed = true;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) {\n\t\t\t\tcollapsed = false;\n\t\t\t} else {\n\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...treeElement,\n\t\t\t\tcollapsible,\n\t\t\t\tcollapsed,\n\t\t\t\tchildren: this.preserveCollapseState(treeElement.children)\n\t\t\t};\n\t\t});\n\t}\n\n\trerender(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.rerender(location);\n\t}\n\n\tgetFirstElementChild(ref: T | null = null): T | null | undefined {\n\t\tconst location = this.getElementLocation(ref);\n\t\treturn this.model.getFirstElementChild(location);\n\t}\n\n\thas(element: T | null): boolean {\n\t\treturn this.nodes.has(element);\n\t}\n\n\tgetListIndex(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListIndex(location);\n\t}\n\n\tgetListRenderCount(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListRenderCount(location);\n\t}\n\n\tisCollapsible(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsible(location);\n\t}\n\n\tsetCollapsible(element: T | null, collapsible?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsible(location, collapsible);\n\t}\n\n\tisCollapsed(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsed(location);\n\t}\n\n\tsetCollapsed(element: T | null, collapsed?: boolean, recursive?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsed(location, collapsed, recursive);\n\t}\n\n\texpandTo(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.expandTo(location);\n\t}\n\n\trefilter(): void {\n\t\tthis.model.refilter();\n\t}\n\n\tgetNode(element: T | null = null): ITreeNode<T | null, TFilterData> {\n\t\tif (element === null) {\n\t\t\treturn this.model.getNode(this.model.rootRef);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tgetNodeLocation(node: ITreeNode<T, TFilterData>): T | null {\n\t\treturn node.element;\n\t}\n\n\tgetParentNodeLocation(element: T | null): T | null {\n\t\tif (element === null) {\n\t\t\tthrow new TreeError(this.user, `Invalid getParentNodeLocation call`);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\tconst location = this.model.getNodeLocation(node);\n\t\tconst parentLocation = this.model.getParentNodeLocation(location);\n\t\tconst parent = this.model.getNode(parentLocation);\n\n\t\treturn parent.element;\n\t}\n\n\tprivate getElementLocation(element: T | null): number[] {\n\t\tif (element === null) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn this.model.getNodeLocation(node);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider } from '../list/list.js';\nimport { IIndexTreeModelOptions, IIndexTreeModelSpliceOptions, IndexTreeModel } from './indexTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElement, ITreeListSpliceData, ITreeModel, ITreeModelSpliceEvent, ITreeNode, ITreeSorter, ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> extends ITreeModel<T | null, TFilterData, T | null> {\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> | undefined, options?: IObjectTreeModelSetChildrenOptions<T, TFilterData>): void;\n}\n\nexport interface IObjectTreeModelSetChildrenOptions<T, TFilterData> extends IIndexTreeModelSpliceOptions<T, TFilterData> {\n}\n\nexport interface IObjectTreeModelOptions<T, TFilterData> extends IIndexTreeModelOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n\treadonly identityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> implements IObjectTreeModel<T, TFilterData> {\n\n\treadonly rootRef = null;\n\n\tprivate model: IndexTreeModel<T | null, TFilterData>;\n\tprivate nodes = new Map<T | null, ITreeNode<T, TFilterData>>();\n\tprivate readonly nodesByIdentity = new Map<string, ITreeNode<T, TFilterData>>();\n\tprivate readonly identityProvider?: IIdentityProvider<T>;\n\tprivate sorter?: ITreeSorter<{ element: T }>;\n\n\treadonly onDidSpliceModel: Event<ITreeModelSpliceEvent<T | null, TFilterData>>;\n\treadonly onDidSpliceRenderedNodes: Event<ITreeListSpliceData<T | null, TFilterData>>;\n\treadonly onDidChangeCollapseState: Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\treadonly onDidChangeRenderNodeCount: Event<ITreeNode<T, TFilterData>>;\n\n\tconstructor(\n\t\tprivate user: string,\n\t\toptions: IObjectTreeModelOptions<T, TFilterData> = {}\n\t) {\n\t\tthis.model = new IndexTreeModel(user, null, options);\n\t\tthis.onDidSpliceModel = this.model.onDidSpliceModel;\n\t\tthis.onDidSpliceRenderedNodes = this.model.onDidSpliceRenderedNodes;\n\t\tthis.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\t\tthis.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;\n\n\t\tif (options.sorter) {\n\t\t\tthis.sorter = {\n\t\t\t\tcompare(a, b) {\n\t\t\t\t\treturn options.sorter!.compare(a.element, b.element);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tthis.identityProvider = options.identityProvider;\n\t}\n\n\tsetChildren(\n\t\telement: T | null,\n\t\tchildren: Iterable<IObjectTreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData> = {},\n\t): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis._setChildren(location, this.preserveCollapseState(children), options);\n\t}\n\n\tprivate _setChildren(\n\t\tlocation: number[],\n\t\tchildren: Iterable<ITreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData>,\n\t): void {\n\t\tconst insertedElements = new Set<T | null>();\n\t\tconst insertedElementIds = new Set<string>();\n\n\t\tconst onDidCreateNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tinsertedElements.add(tnode.element);\n\t\t\tthis.nodes.set(tnode.element, tnode);\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tinsertedElementIds.add(id);\n\t\t\t\tthis.nodesByIdentity.set(id, tnode);\n\t\t\t}\n\n\t\t\toptions.onDidCreateNode?.(tnode);\n\t\t};\n\n\t\tconst onDidDeleteNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tif (!insertedElements.has(tnode.element)) {\n\t\t\t\tthis.nodes.delete(tnode.element);\n\t\t\t}\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tif (!insertedElementIds.has(id)) {\n\t\t\t\t\tthis.nodesByIdentity.delete(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.onDidDeleteNode?.(tnode);\n\t\t};\n\n\t\tthis.model.splice(\n\t\t\t[...location, 0],\n\t\t\tNumber.MAX_VALUE,\n\t\t\tchildren,\n\t\t\t{ ...options, onDidCreateNode, onDidDeleteNode }\n\t\t);\n\t}\n\n\tprivate preserveCollapseState(elements: Iterable<IObjectTreeElement<T>> = Iterable.empty()): Iterable<ITreeElement<T>> {\n\t\tif (this.sorter) {\n\t\t\telements = [...elements].sort(this.sorter.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map(elements, treeElement => {\n\t\t\tlet node = this.nodes.get(treeElement.element);\n\n\t\t\tif (!node && this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(treeElement.element).toString();\n\t\t\t\tnode = this.nodesByIdentity.get(id);\n\t\t\t}\n\n\t\t\tif (!node) {\n\t\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\t\tif (typeof treeElement.collapsed === 'undefined') {\n\t\t\t\t\tcollapsed = undefined;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) {\n\t\t\t\t\tcollapsed = true;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\t\tcollapsed = false;\n\t\t\t\t} else {\n\t\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...treeElement,\n\t\t\t\t\tchildren: this.preserveCollapseState(treeElement.children),\n\t\t\t\t\tcollapsed\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst collapsible = typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : node.collapsible;\n\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\tif (typeof treeElement.collapsed === 'undefined' || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\tcollapsed = node.collapsed;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) {\n\t\t\t\tcollapsed = true;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) {\n\t\t\t\tcollapsed = false;\n\t\t\t} else {\n\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...treeElement,\n\t\t\t\tcollapsible,\n\t\t\t\tcollapsed,\n\t\t\t\tchildren: this.preserveCollapseState(treeElement.children)\n\t\t\t};\n\t\t});\n\t}\n\n\trerender(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.rerender(location);\n\t}\n\n\tgetFirstElementChild(ref: T | null = null): T | null | undefined {\n\t\tconst location = this.getElementLocation(ref);\n\t\treturn this.model.getFirstElementChild(location);\n\t}\n\n\thas(element: T | null): boolean {\n\t\treturn this.nodes.has(element);\n\t}\n\n\tgetListIndex(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListIndex(location);\n\t}\n\n\tgetListRenderCount(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListRenderCount(location);\n\t}\n\n\tisCollapsible(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsible(location);\n\t}\n\n\tsetCollapsible(element: T | null, collapsible?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsible(location, collapsible);\n\t}\n\n\tisCollapsed(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsed(location);\n\t}\n\n\tsetCollapsed(element: T | null, collapsed?: boolean, recursive?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsed(location, collapsed, recursive);\n\t}\n\n\texpandTo(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.expandTo(location);\n\t}\n\n\trefilter(): void {\n\t\tthis.model.refilter();\n\t}\n\n\tgetNode(element: T | null = null): ITreeNode<T | null, TFilterData> {\n\t\tif (element === null) {\n\t\t\treturn this.model.getNode(this.model.rootRef);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tgetNodeLocation(node: ITreeNode<T, TFilterData>): T | null {\n\t\treturn node.element;\n\t}\n\n\tgetParentNodeLocation(element: T | null): T | null {\n\t\tif (element === null) {\n\t\t\tthrow new TreeError(this.user, `Invalid getParentNodeLocation call`);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\tconst location = this.model.getNodeLocation(node);\n\t\tconst parentLocation = this.model.getParentNodeLocation(location);\n\t\tconst parent = this.model.getNode(parentLocation);\n\n\t\treturn parent.element;\n\t}\n\n\tprivate getElementLocation(element: T | null): number[] {\n\t\tif (element === null) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn this.model.getNodeLocation(node);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/base/browser/ui/tree/objectTreeModel.ts","vs/base/browser/ui/tree/objectTreeModel.ts"],"names":[],"mappings":"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","file":"objectTreeModel.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider } from '../list/list.js';\nimport { IIndexTreeModelOptions, IIndexTreeModelSpliceOptions, IndexTreeModel } from './indexTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElement, ITreeListSpliceData, ITreeModel, ITreeModelSpliceEvent, ITreeNode, ITreeSorter, ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> extends ITreeModel<T | null, TFilterData, T | null> {\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> | undefined, options?: IObjectTreeModelSetChildrenOptions<T, TFilterData>): void;\n\tresort(element?: T | null, recursive?: boolean): void;\n}\n\nexport interface IObjectTreeModelSetChildrenOptions<T, TFilterData> extends IIndexTreeModelSpliceOptions<T, TFilterData> {\n}\n\nexport interface IObjectTreeModelOptions<T, TFilterData> extends IIndexTreeModelOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n\treadonly identityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> implements IObjectTreeModel<T, TFilterData> {\n\n\treadonly rootRef = null;\n\n\tprivate model: IndexTreeModel<T | null, TFilterData>;\n\tprivate nodes = new Map<T | null, ITreeNode<T, TFilterData>>();\n\tprivate readonly nodesByIdentity = new Map<string, ITreeNode<T, TFilterData>>();\n\tprivate readonly identityProvider?: IIdentityProvider<T>;\n\tprivate sorter?: ITreeSorter<{ element: T }>;\n\n\treadonly onDidSpliceModel: Event<ITreeModelSpliceEvent<T | null, TFilterData>>;\n\treadonly onDidSpliceRenderedNodes: Event<ITreeListSpliceData<T | null, TFilterData>>;\n\treadonly onDidChangeCollapseState: Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\treadonly onDidChangeRenderNodeCount: Event<ITreeNode<T, TFilterData>>;\n\n\tconstructor(\n\t\tprivate user: string,\n\t\toptions: IObjectTreeModelOptions<T, TFilterData> = {}\n\t) {\n\t\tthis.model = new IndexTreeModel(user, null, options);\n\t\tthis.onDidSpliceModel = this.model.onDidSpliceModel;\n\t\tthis.onDidSpliceRenderedNodes = this.model.onDidSpliceRenderedNodes;\n\t\tthis.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\t\tthis.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;\n\n\t\tif (options.sorter) {\n\t\t\tthis.sorter = {\n\t\t\t\tcompare(a, b) {\n\t\t\t\t\treturn options.sorter!.compare(a.element, b.element);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tthis.identityProvider = options.identityProvider;\n\t}\n\n\tsetChildren(\n\t\telement: T | null,\n\t\tchildren: Iterable<IObjectTreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData> = {},\n\t): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis._setChildren(location, this.preserveCollapseState(children), options);\n\t}\n\n\tprivate _setChildren(\n\t\tlocation: number[],\n\t\tchildren: Iterable<ITreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData>,\n\t): void {\n\t\tconst insertedElements = new Set<T | null>();\n\t\tconst insertedElementIds = new Set<string>();\n\n\t\tconst onDidCreateNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tinsertedElements.add(tnode.element);\n\t\t\tthis.nodes.set(tnode.element, tnode);\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tinsertedElementIds.add(id);\n\t\t\t\tthis.nodesByIdentity.set(id, tnode);\n\t\t\t}\n\n\t\t\toptions.onDidCreateNode?.(tnode);\n\t\t};\n\n\t\tconst onDidDeleteNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tif (!insertedElements.has(tnode.element)) {\n\t\t\t\tthis.nodes.delete(tnode.element);\n\t\t\t}\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tif (!insertedElementIds.has(id)) {\n\t\t\t\t\tthis.nodesByIdentity.delete(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.onDidDeleteNode?.(tnode);\n\t\t};\n\n\t\tthis.model.splice(\n\t\t\t[...location, 0],\n\t\t\tNumber.MAX_VALUE,\n\t\t\tchildren,\n\t\t\t{ ...options, onDidCreateNode, onDidDeleteNode }\n\t\t);\n\t}\n\n\tprivate preserveCollapseState(elements: Iterable<IObjectTreeElement<T>> = Iterable.empty()): Iterable<ITreeElement<T>> {\n\t\tif (this.sorter) {\n\t\t\telements = [...elements].sort(this.sorter.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map(elements, treeElement => {\n\t\t\tlet node = this.nodes.get(treeElement.element);\n\n\t\t\tif (!node && this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(treeElement.element).toString();\n\t\t\t\tnode = this.nodesByIdentity.get(id);\n\t\t\t}\n\n\t\t\tif (!node) {\n\t\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\t\tif (typeof treeElement.collapsed === 'undefined') {\n\t\t\t\t\tcollapsed = undefined;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) {\n\t\t\t\t\tcollapsed = true;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\t\tcollapsed = false;\n\t\t\t\t} else {\n\t\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...treeElement,\n\t\t\t\t\tchildren: this.preserveCollapseState(treeElement.children),\n\t\t\t\t\tcollapsed\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst collapsible = typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : node.collapsible;\n\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\tif (typeof treeElement.collapsed === 'undefined' || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\tcollapsed = node.collapsed;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) {\n\t\t\t\tcollapsed = true;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) {\n\t\t\t\tcollapsed = false;\n\t\t\t} else {\n\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...treeElement,\n\t\t\t\tcollapsible,\n\t\t\t\tcollapsed,\n\t\t\t\tchildren: this.preserveCollapseState(treeElement.children)\n\t\t\t};\n\t\t});\n\t}\n\n\trerender(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.rerender(location);\n\t}\n\n\tresort(element: T | null = null, recursive = true): void {\n\t\tif (!this.sorter) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst location = this.getElementLocation(element);\n\t\tconst node = this.model.getNode(location);\n\n\t\tthis._setChildren(location, this.resortChildren(node, recursive), {});\n\t}\n\n\tprivate resortChildren(node: ITreeNode<T | null, TFilterData>, recursive: boolean, first = true): Iterable<ITreeElement<T>> {\n\t\tlet childrenNodes = [...node.children] as ITreeNode<T, TFilterData>[];\n\n\t\tif (recursive || first) {\n\t\t\tchildrenNodes = childrenNodes.sort(this.sorter!.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map<ITreeNode<T | null, TFilterData>, ITreeElement<T>>(childrenNodes, node => ({\n\t\t\telement: node.element as T,\n\t\t\tcollapsible: node.collapsible,\n\t\t\tcollapsed: node.collapsed,\n\t\t\tchildren: this.resortChildren(node, recursive, false)\n\t\t}));\n\t}\n\n\tgetFirstElementChild(ref: T | null = null): T | null | undefined {\n\t\tconst location = this.getElementLocation(ref);\n\t\treturn this.model.getFirstElementChild(location);\n\t}\n\n\thas(element: T | null): boolean {\n\t\treturn this.nodes.has(element);\n\t}\n\n\tgetListIndex(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListIndex(location);\n\t}\n\n\tgetListRenderCount(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListRenderCount(location);\n\t}\n\n\tisCollapsible(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsible(location);\n\t}\n\n\tsetCollapsible(element: T | null, collapsible?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsible(location, collapsible);\n\t}\n\n\tisCollapsed(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsed(location);\n\t}\n\n\tsetCollapsed(element: T | null, collapsed?: boolean, recursive?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsed(location, collapsed, recursive);\n\t}\n\n\texpandTo(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.expandTo(location);\n\t}\n\n\trefilter(): void {\n\t\tthis.model.refilter();\n\t}\n\n\tgetNode(element: T | null = null): ITreeNode<T | null, TFilterData> {\n\t\tif (element === null) {\n\t\t\treturn this.model.getNode(this.model.rootRef);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tgetNodeLocation(node: ITreeNode<T, TFilterData>): T | null {\n\t\treturn node.element;\n\t}\n\n\tgetParentNodeLocation(element: T | null): T | null {\n\t\tif (element === null) {\n\t\t\tthrow new TreeError(this.user, `Invalid getParentNodeLocation call`);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\tconst location = this.model.getNodeLocation(node);\n\t\tconst parentLocation = this.model.getParentNodeLocation(location);\n\t\tconst parent = this.model.getNode(parentLocation);\n\n\t\treturn parent.element;\n\t}\n\n\tprivate getElementLocation(element: T | null): number[] {\n\t\tif (element === null) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn this.model.getNodeLocation(node);\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IIdentityProvider } from '../list/list.js';\nimport { IIndexTreeModelOptions, IIndexTreeModelSpliceOptions, IndexTreeModel } from './indexTreeModel.js';\nimport { ICollapseStateChangeEvent, IObjectTreeElement, ITreeElement, ITreeListSpliceData, ITreeModel, ITreeModelSpliceEvent, ITreeNode, ITreeSorter, ObjectTreeElementCollapseState, TreeError } from './tree.js';\nimport { Event } from '../../../common/event.js';\nimport { Iterable } from '../../../common/iterator.js';\n\nexport interface IObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> extends ITreeModel<T | null, TFilterData, T | null> {\n\tsetChildren(element: T | null, children: Iterable<IObjectTreeElement<T>> | undefined, options?: IObjectTreeModelSetChildrenOptions<T, TFilterData>): void;\n\tresort(element?: T | null, recursive?: boolean): void;\n}\n\nexport interface IObjectTreeModelSetChildrenOptions<T, TFilterData> extends IIndexTreeModelSpliceOptions<T, TFilterData> {\n}\n\nexport interface IObjectTreeModelOptions<T, TFilterData> extends IIndexTreeModelOptions<T, TFilterData> {\n\treadonly sorter?: ITreeSorter<T>;\n\treadonly identityProvider?: IIdentityProvider<T>;\n}\n\nexport class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> implements IObjectTreeModel<T, TFilterData> {\n\n\treadonly rootRef = null;\n\n\tprivate model: IndexTreeModel<T | null, TFilterData>;\n\tprivate nodes = new Map<T | null, ITreeNode<T, TFilterData>>();\n\tprivate readonly nodesByIdentity = new Map<string, ITreeNode<T, TFilterData>>();\n\tprivate readonly identityProvider?: IIdentityProvider<T>;\n\tprivate sorter?: ITreeSorter<{ element: T }>;\n\n\treadonly onDidSpliceModel: Event<ITreeModelSpliceEvent<T | null, TFilterData>>;\n\treadonly onDidSpliceRenderedNodes: Event<ITreeListSpliceData<T | null, TFilterData>>;\n\treadonly onDidChangeCollapseState: Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\treadonly onDidChangeRenderNodeCount: Event<ITreeNode<T, TFilterData>>;\n\n\tconstructor(\n\t\tprivate user: string,\n\t\toptions: IObjectTreeModelOptions<T, TFilterData> = {}\n\t) {\n\t\tthis.model = new IndexTreeModel(user, null, options);\n\t\tthis.onDidSpliceModel = this.model.onDidSpliceModel;\n\t\tthis.onDidSpliceRenderedNodes = this.model.onDidSpliceRenderedNodes;\n\t\tthis.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ICollapseStateChangeEvent<T, TFilterData>>;\n\t\tthis.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;\n\n\t\tif (options.sorter) {\n\t\t\tthis.sorter = {\n\t\t\t\tcompare(a, b) {\n\t\t\t\t\treturn options.sorter!.compare(a.element, b.element);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tthis.identityProvider = options.identityProvider;\n\t}\n\n\tsetChildren(\n\t\telement: T | null,\n\t\tchildren: Iterable<IObjectTreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData> = {},\n\t): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis._setChildren(location, this.preserveCollapseState(children), options);\n\t}\n\n\tprivate _setChildren(\n\t\tlocation: number[],\n\t\tchildren: Iterable<ITreeElement<T>> = Iterable.empty(),\n\t\toptions: IObjectTreeModelSetChildrenOptions<T, TFilterData>,\n\t): void {\n\t\tconst insertedElements = new Set<T | null>();\n\t\tconst insertedElementIds = new Set<string>();\n\n\t\tconst onDidCreateNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tinsertedElements.add(tnode.element);\n\t\t\tthis.nodes.set(tnode.element, tnode);\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tinsertedElementIds.add(id);\n\t\t\t\tthis.nodesByIdentity.set(id, tnode);\n\t\t\t}\n\n\t\t\toptions.onDidCreateNode?.(tnode);\n\t\t};\n\n\t\tconst onDidDeleteNode = (node: ITreeNode<T | null, TFilterData>) => {\n\t\t\tif (node.element === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst tnode = node as ITreeNode<T, TFilterData>;\n\n\t\t\tif (!insertedElements.has(tnode.element)) {\n\t\t\t\tthis.nodes.delete(tnode.element);\n\t\t\t}\n\n\t\t\tif (this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(tnode.element).toString();\n\t\t\t\tif (!insertedElementIds.has(id)) {\n\t\t\t\t\tthis.nodesByIdentity.delete(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toptions.onDidDeleteNode?.(tnode);\n\t\t};\n\n\t\tthis.model.splice(\n\t\t\t[...location, 0],\n\t\t\tNumber.MAX_VALUE,\n\t\t\tchildren,\n\t\t\t{ ...options, onDidCreateNode, onDidDeleteNode }\n\t\t);\n\t}\n\n\tprivate preserveCollapseState(elements: Iterable<IObjectTreeElement<T>> = Iterable.empty()): Iterable<ITreeElement<T>> {\n\t\tif (this.sorter) {\n\t\t\telements = [...elements].sort(this.sorter.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map(elements, treeElement => {\n\t\t\tlet node = this.nodes.get(treeElement.element);\n\n\t\t\tif (!node && this.identityProvider) {\n\t\t\t\tconst id = this.identityProvider.getId(treeElement.element).toString();\n\t\t\t\tnode = this.nodesByIdentity.get(id);\n\t\t\t}\n\n\t\t\tif (!node) {\n\t\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\t\tif (typeof treeElement.collapsed === 'undefined') {\n\t\t\t\t\tcollapsed = undefined;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed) {\n\t\t\t\t\tcollapsed = true;\n\t\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\t\tcollapsed = false;\n\t\t\t\t} else {\n\t\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...treeElement,\n\t\t\t\t\tchildren: this.preserveCollapseState(treeElement.children),\n\t\t\t\t\tcollapsed\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst collapsible = typeof treeElement.collapsible === 'boolean' ? treeElement.collapsible : node.collapsible;\n\t\t\tlet collapsed: boolean | undefined;\n\n\t\t\tif (typeof treeElement.collapsed === 'undefined' || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrCollapsed || treeElement.collapsed === ObjectTreeElementCollapseState.PreserveOrExpanded) {\n\t\t\t\tcollapsed = node.collapsed;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Collapsed) {\n\t\t\t\tcollapsed = true;\n\t\t\t} else if (treeElement.collapsed === ObjectTreeElementCollapseState.Expanded) {\n\t\t\t\tcollapsed = false;\n\t\t\t} else {\n\t\t\t\tcollapsed = Boolean(treeElement.collapsed);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...treeElement,\n\t\t\t\tcollapsible,\n\t\t\t\tcollapsed,\n\t\t\t\tchildren: this.preserveCollapseState(treeElement.children)\n\t\t\t};\n\t\t});\n\t}\n\n\trerender(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.rerender(location);\n\t}\n\n\tresort(element: T | null = null, recursive = true): void {\n\t\tif (!this.sorter) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst location = this.getElementLocation(element);\n\t\tconst node = this.model.getNode(location);\n\n\t\tthis._setChildren(location, this.resortChildren(node, recursive), {});\n\t}\n\n\tprivate resortChildren(node: ITreeNode<T | null, TFilterData>, recursive: boolean, first = true): Iterable<ITreeElement<T>> {\n\t\tlet childrenNodes = [...node.children] as ITreeNode<T, TFilterData>[];\n\n\t\tif (recursive || first) {\n\t\t\tchildrenNodes = childrenNodes.sort(this.sorter!.compare.bind(this.sorter));\n\t\t}\n\n\t\treturn Iterable.map<ITreeNode<T | null, TFilterData>, ITreeElement<T>>(childrenNodes, node => ({\n\t\t\telement: node.element as T,\n\t\t\tcollapsible: node.collapsible,\n\t\t\tcollapsed: node.collapsed,\n\t\t\tchildren: this.resortChildren(node, recursive, false)\n\t\t}));\n\t}\n\n\tgetFirstElementChild(ref: T | null = null): T | null | undefined {\n\t\tconst location = this.getElementLocation(ref);\n\t\treturn this.model.getFirstElementChild(location);\n\t}\n\n\thas(element: T | null): boolean {\n\t\treturn this.nodes.has(element);\n\t}\n\n\tgetListIndex(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListIndex(location);\n\t}\n\n\tgetListRenderCount(element: T | null): number {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.getListRenderCount(location);\n\t}\n\n\tisCollapsible(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsible(location);\n\t}\n\n\tsetCollapsible(element: T | null, collapsible?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsible(location, collapsible);\n\t}\n\n\tisCollapsed(element: T | null): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.isCollapsed(location);\n\t}\n\n\tsetCollapsed(element: T | null, collapsed?: boolean, recursive?: boolean): boolean {\n\t\tconst location = this.getElementLocation(element);\n\t\treturn this.model.setCollapsed(location, collapsed, recursive);\n\t}\n\n\texpandTo(element: T | null): void {\n\t\tconst location = this.getElementLocation(element);\n\t\tthis.model.expandTo(location);\n\t}\n\n\trefilter(): void {\n\t\tthis.model.refilter();\n\t}\n\n\tgetNode(element: T | null = null): ITreeNode<T | null, TFilterData> {\n\t\tif (element === null) {\n\t\t\treturn this.model.getNode(this.model.rootRef);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn node;\n\t}\n\n\tgetNodeLocation(node: ITreeNode<T, TFilterData>): T | null {\n\t\treturn node.element;\n\t}\n\n\tgetParentNodeLocation(element: T | null): T | null {\n\t\tif (element === null) {\n\t\t\tthrow new TreeError(this.user, `Invalid getParentNodeLocation call`);\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\tconst location = this.model.getNodeLocation(node);\n\t\tconst parentLocation = this.model.getParentNodeLocation(location);\n\t\tconst parent = this.model.getNode(parentLocation);\n\n\t\treturn parent.element;\n\t}\n\n\tprivate getElementLocation(element: T | null): number[] {\n\t\tif (element === null) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst node = this.nodes.get(element);\n\n\t\tif (!node) {\n\t\t\tthrow new TreeError(this.user, `Tree element not found: ${element}`);\n\t\t}\n\n\t\treturn this.model.getNodeLocation(node);\n\t}\n}\n"]}
|
|
@@ -626,5 +626,7 @@ export const codiconsLibrary = {
|
|
|
626
626
|
strikethrough: register('strikethrough', 0xec64),
|
|
627
627
|
openInProduct: register('open-in-product', 0xec65),
|
|
628
628
|
indexZero: register('index-zero', 0xec66),
|
|
629
|
+
agent: register('agent', 0xec67),
|
|
630
|
+
editCode: register('edit-code', 0xec68),
|
|
629
631
|
};
|
|
630
632
|
//# sourceMappingURL=codiconsLibrary.js.map
|