@@ -17,7 +17,9 @@ public interface ITreeNode
17
17
string Path { get ; set ; }
18
18
string Label { get ; set ; }
19
19
int Level { get ; set ; }
20
+ bool IsContainer { get ; set ; }
20
21
bool IsFolder { get ; set ; }
22
+ bool IsFolderOrContainer { get ; }
21
23
bool IsCollapsed { get ; set ; }
22
24
bool IsHidden { get ; set ; }
23
25
bool IsActive { get ; set ; }
@@ -52,29 +54,45 @@ public void Load(IEnumerable<TData> treeDatas)
52
54
var isCheckable = IsCheckable ;
53
55
54
56
var isSelected = IsSelectable && selectedNodePath != null && Title == selectedNodePath ;
55
- AddNode ( Title , Title , - 1 + displayRootLevel , true , false , false , false , isSelected , false , null ) ;
57
+ AddNode ( Title , Title , - 1 + displayRootLevel , true , false , false , false , isSelected , false , null , false ) ;
56
58
57
59
var hideChildren = false ;
58
60
var hideChildrenBelowLevel = 0 ;
59
61
60
62
var folders = new HashSet < string > ( ) ;
61
63
64
+ TNode lastAddedNode = null ;
62
65
foreach ( var treeData in treeDatas )
63
66
{
64
67
var parts = treeData . Path . Split ( new [ ] { pathSeparator } , StringSplitOptions . None ) ;
65
- for ( var i = 0 ; i < parts . Length ; i ++ )
68
+ for ( var level = 0 ; level < parts . Length ; level ++ )
66
69
{
67
- var label = parts [ i ] ;
68
- var level = i + 1 ;
69
- var nodePath = String . Join ( pathSeparator , parts , 0 , level ) ;
70
- var isFolder = i < parts . Length - 1 ;
70
+ var label = parts [ level ] ;
71
+ var nodePath = String . Join ( pathSeparator , parts , 0 , level + 1 ) ;
72
+ var isFolder = level < parts . Length - 1 ;
73
+ var parentIsPromoted = false ;
74
+
75
+ if ( lastAddedNode != null )
76
+ {
77
+ if ( ! lastAddedNode . IsFolder )
78
+ {
79
+ if ( PromoteNode ( lastAddedNode , label ) )
80
+ {
81
+ Logger . Trace ( "Promoting Node Label:{0}" , lastAddedNode . Label ) ;
82
+
83
+ parentIsPromoted = true ;
84
+ lastAddedNode . IsContainer = true ;
85
+ }
86
+ }
87
+ }
88
+
71
89
var alreadyExists = folders . Contains ( nodePath ) ;
72
90
if ( ! alreadyExists )
73
91
{
74
92
var nodeIsHidden = false ;
75
93
if ( hideChildren )
76
94
{
77
- if ( level <= hideChildrenBelowLevel )
95
+ if ( level + 1 <= hideChildrenBelowLevel )
78
96
{
79
97
hideChildren = false ;
80
98
}
@@ -100,7 +118,7 @@ public void Load(IEnumerable<TData> treeDatas)
100
118
if ( ! hideChildren )
101
119
{
102
120
hideChildren = true ;
103
- hideChildrenBelowLevel = level ;
121
+ hideChildrenBelowLevel = level + 1 ;
104
122
}
105
123
}
106
124
}
@@ -112,8 +130,9 @@ public void Load(IEnumerable<TData> treeDatas)
112
130
}
113
131
114
132
isSelected = selectedNodePath != null && nodePath == selectedNodePath ;
115
- AddNode ( nodePath , label , i + displayRootLevel , isFolder , isActive , nodeIsHidden ,
116
- nodeIsCollapsed , isSelected , isChecked , treeNodeTreeData ) ;
133
+
134
+ lastAddedNode = AddNode ( nodePath , label , level + displayRootLevel + ( parentIsPromoted ? 1 : 0 ) , isFolder , isActive , nodeIsHidden ,
135
+ nodeIsCollapsed , isSelected , isChecked , treeNodeTreeData , false ) ;
117
136
}
118
137
}
119
138
}
@@ -124,7 +143,7 @@ public void Load(IEnumerable<TData> treeDatas)
124
143
for ( var index = nodes . Count - 1 ; index >= 0 ; index -- )
125
144
{
126
145
var node = nodes [ index ] ;
127
- if ( node . Level >= 0 && node . IsFolder )
146
+ if ( node . Level >= 0 && node . IsFolderOrContainer )
128
147
{
129
148
bool ? anyChecked = null ;
130
149
bool ? allChecked = null ;
@@ -150,6 +169,27 @@ public void Load(IEnumerable<TData> treeDatas)
150
169
}
151
170
}
152
171
172
+ protected bool PromoteNode ( TNode previouslyAddedNode , string nextLabel )
173
+ {
174
+ if ( ! PromoteMetaFiles )
175
+ {
176
+ return false ;
177
+ }
178
+
179
+ if ( previouslyAddedNode == null )
180
+ {
181
+ return false ;
182
+ }
183
+
184
+ if ( ! nextLabel . EndsWith ( ".meta" ) )
185
+ {
186
+ return false ;
187
+ }
188
+
189
+ var substring = nextLabel . Substring ( 0 , nextLabel . Length - 5 ) ;
190
+ return previouslyAddedNode . Label == substring ;
191
+ }
192
+
153
193
public void SetCheckStateOnAll ( bool isChecked )
154
194
{
155
195
var nodeCheckState = isChecked ? CheckState . Checked : CheckState . Empty ;
@@ -174,9 +214,9 @@ public void SetCheckStateOnAll(bool isChecked)
174
214
175
215
protected abstract IEnumerable < string > GetCollapsedFolders ( ) ;
176
216
177
- protected void AddNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isSelected , bool isChecked , TData ? treeData )
217
+ protected TNode AddNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isSelected , bool isChecked , TData ? treeData , bool isContainer )
178
218
{
179
- var node = CreateTreeNode ( path , label , level , isFolder , isActive , isHidden , isCollapsed , isChecked , treeData ) ;
219
+ var node = CreateTreeNode ( path , label , level , isFolder , isActive , isHidden , isCollapsed , isChecked , treeData , isContainer ) ;
180
220
181
221
SetNodeIcon ( node ) ;
182
222
Nodes . Add ( node ) ;
@@ -185,6 +225,8 @@ protected void AddNode(string path, string label, int level, bool isFolder, bool
185
225
{
186
226
SelectedNode = node ;
187
227
}
228
+
229
+ return node ;
188
230
}
189
231
190
232
protected void Clear ( )
@@ -198,7 +240,7 @@ protected void Clear()
198
240
199
241
protected abstract void AddCheckedNode ( TNode node ) ;
200
242
201
- protected abstract TNode CreateTreeNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isChecked , TData ? treeData ) ;
243
+ protected abstract TNode CreateTreeNode ( string path , string label , int level , bool isFolder , bool isActive , bool isHidden , bool isCollapsed , bool isChecked , TData ? treeData , bool isContainer ) ;
202
244
203
245
protected abstract void OnClear ( ) ;
204
246
@@ -212,7 +254,7 @@ protected void ToggleNodeVisibility(int idx, TNode node)
212
254
for ( ; idx < Nodes . Count && Nodes [ idx ] . Level > nodeLevel ; idx ++ )
213
255
{
214
256
Nodes [ idx ] . IsHidden = node . IsCollapsed ;
215
- if ( Nodes [ idx ] . IsFolder && ! node . IsCollapsed && Nodes [ idx ] . IsCollapsed )
257
+ if ( Nodes [ idx ] . IsFolderOrContainer && ! node . IsCollapsed && Nodes [ idx ] . IsCollapsed )
216
258
{
217
259
var level = Nodes [ idx ] . Level ;
218
260
for ( idx ++ ; idx < Nodes . Count && Nodes [ idx ] . Level > level ; idx ++ )
@@ -245,11 +287,7 @@ protected void ToggleNodeChecked(int idx, TNode node)
245
287
break ;
246
288
}
247
289
248
- if ( node . IsFolder )
249
- {
250
- ToggleChildrenChecked ( idx , node , isChecked ) ;
251
- }
252
- else
290
+ if ( ! node . IsFolder )
253
291
{
254
292
if ( isChecked )
255
293
{
@@ -261,6 +299,11 @@ protected void ToggleNodeChecked(int idx, TNode node)
261
299
}
262
300
}
263
301
302
+ if ( node . IsFolderOrContainer )
303
+ {
304
+ ToggleChildrenChecked ( idx , node , isChecked ) ;
305
+ }
306
+
264
307
ToggleParentFoldersChecked ( idx , node , isChecked ) ;
265
308
}
266
309
@@ -272,11 +315,7 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
272
315
var wasChecked = childNode . CheckState == CheckState . Checked ;
273
316
childNode . CheckState = isChecked ? CheckState . Checked : CheckState . Empty ;
274
317
275
- if ( childNode . IsFolder )
276
- {
277
- ToggleChildrenChecked ( i , childNode , isChecked ) ;
278
- }
279
- else
318
+ if ( ! childNode . IsFolder )
280
319
{
281
320
if ( isChecked && ! wasChecked )
282
321
{
@@ -287,6 +326,11 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
287
326
RemoveCheckedNode ( childNode ) ;
288
327
}
289
328
}
329
+
330
+ if ( childNode . IsFolderOrContainer )
331
+ {
332
+ ToggleChildrenChecked ( i , childNode , isChecked ) ;
333
+ }
290
334
}
291
335
}
292
336
@@ -367,5 +411,6 @@ private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked)
367
411
public abstract bool IsSelectable { get ; set ; }
368
412
public abstract bool IsCheckable { get ; set ; }
369
413
public abstract string PathSeparator { get ; set ; }
414
+ protected abstract bool PromoteMetaFiles { get ; }
370
415
}
371
416
}
0 commit comments