@@ -12,6 +12,7 @@ import { Emitter, Event } from 'vs/base/common/event';
1212export interface ITreeElement < T > {
1313 readonly element : T ;
1414 readonly children ?: IIterator < ITreeElement < T > > | ITreeElement < T > [ ] ;
15+ readonly collapsible ?: boolean ;
1516 readonly collapsed ?: boolean ;
1617}
1718
@@ -20,6 +21,7 @@ export interface ITreeNode<T> {
2021 readonly element : T ;
2122 readonly children : IMutableTreeNode < T > [ ] ;
2223 readonly depth : number ;
24+ readonly collapsible : boolean ;
2325 readonly collapsed : boolean ;
2426 readonly visibleCount : number ;
2527}
@@ -61,15 +63,16 @@ function getTreeElementIterator<T>(elements: IIterator<ITreeElement<T>> | ITreeE
6163
6264function treeElementToNode < T > ( treeElement : ITreeElement < T > , parent : IMutableTreeNode < T > , visible : boolean , treeListElements : ITreeNode < T > [ ] ) : IMutableTreeNode < T > {
6365 const depth = parent . depth + 1 ;
64- const { element, collapsed } = treeElement ;
65- const node = { parent, element, children : [ ] , depth, collapsed : ! ! collapsed , visibleCount : 0 } ;
66+ const { element, collapsible , collapsed } = treeElement ;
67+ const node = { parent, element, children : [ ] , depth, collapsible : ! ! collapsible , collapsed : ! ! collapsed , visibleCount : 0 } ;
6668
6769 if ( visible ) {
6870 treeListElements . push ( node ) ;
6971 }
7072
7173 const children = getTreeElementIterator ( treeElement . children ) ;
7274 node . children = collect ( map ( children , el => treeElementToNode ( el , node , visible && ! treeElement . collapsed , treeListElements ) ) ) ;
75+ node . collapsible = node . collapsible || node . children . length > 0 ;
7376 node . visibleCount = 1 + getVisibleCount ( node . children ) ;
7477
7578 return node ;
@@ -89,6 +92,7 @@ export class TreeModel<T> {
8992 element : undefined ,
9093 children : [ ] ,
9194 depth : 0 ,
95+ collapsible : false ,
9296 collapsed : false ,
9397 visibleCount : 1
9498 } ;
@@ -131,6 +135,10 @@ export class TreeModel<T> {
131135 private _setCollapsed ( location : number [ ] , collapsed ?: boolean | undefined ) : boolean {
132136 const { node, listIndex, visible } = this . findNode ( location ) ;
133137
138+ if ( ! node . collapsible ) {
139+ return false ;
140+ }
141+
134142 if ( typeof collapsed === 'undefined' ) {
135143 collapsed = ! node . collapsed ;
136144 }
0 commit comments