6
6
using System . Windows . Forms ;
7
7
using ReClassNET . Extensions ;
8
8
using ReClassNET . Nodes ;
9
+ using ReClassNET . Project ;
9
10
10
11
namespace ReClassNET . UI
11
12
{
@@ -93,22 +94,47 @@ private void RebuildClassHierarchy(HashSet<ClassNode> seen)
93
94
}
94
95
}
95
96
97
+ public class EnumTreeNode : TreeNode
98
+ {
99
+ public EnumMetaData Enum { get ; }
100
+
101
+ public EnumTreeNode ( EnumMetaData @enum )
102
+ {
103
+ Contract . Requires ( @enum != null ) ;
104
+
105
+ Enum = @enum ;
106
+
107
+ ImageIndex = 3 ;
108
+ SelectedImageIndex = 3 ;
109
+ }
110
+
111
+ public void Update ( )
112
+ {
113
+ Text = Enum . Name ;
114
+ }
115
+ }
116
+
96
117
private class NodeSorter : IComparer
97
118
{
98
119
public int Compare ( object x , object y )
99
120
{
100
121
var compare = Application . CurrentCulture . CompareInfo ;
101
122
102
- if ( x is ClassTreeNode n1 && y is ClassTreeNode n2 )
123
+ if ( x is ClassTreeNode cn1 && y is ClassTreeNode cn2 )
103
124
{
104
- return compare . Compare ( n1 . Text , n2 . Text ) ;
125
+ return compare . Compare ( cn1 . Text , cn2 . Text ) ;
126
+ }
127
+ if ( x is EnumTreeNode en1 && y is EnumTreeNode en2 )
128
+ {
129
+ return compare . Compare ( en1 . Text , en2 . Text ) ;
105
130
}
106
131
107
132
return 0 ;
108
133
}
109
134
}
110
135
111
- private readonly TreeNode root ;
136
+ private readonly TreeNode enumsRootNode ;
137
+ private readonly TreeNode classesRootNode ;
112
138
113
139
private ClassNode selectedClass ;
114
140
@@ -166,9 +192,9 @@ public bool EnableClassHierarchyView
166
192
{
167
193
enableClassHierarchyView = value ;
168
194
169
- var classes = root . Nodes . Cast < ClassTreeNode > ( ) . Select ( t => t . ClassNode ) . ToList ( ) ;
195
+ var classes = classesRootNode . Nodes . Cast < ClassTreeNode > ( ) . Select ( t => t . ClassNode ) . ToList ( ) ;
170
196
171
- root . Nodes . Clear ( ) ;
197
+ classesRootNode . Nodes . Clear ( ) ;
172
198
173
199
AddClasses ( classes ) ;
174
200
}
@@ -181,7 +207,7 @@ public bool EnableClassHierarchyView
181
207
182
208
public ClassNodeView ( )
183
209
{
184
- Contract . Ensures ( root != null ) ;
210
+ Contract . Ensures ( classesRootNode != null ) ;
185
211
186
212
InitializeComponent ( ) ;
187
213
@@ -191,15 +217,26 @@ public ClassNodeView()
191
217
classesTreeView . ImageList = new ImageList ( ) ;
192
218
classesTreeView . ImageList . Images . Add ( Properties . Resources . B16x16_Text_List_Bullets ) ;
193
219
classesTreeView . ImageList . Images . Add ( Properties . Resources . B16x16_Class_Type ) ;
220
+ classesTreeView . ImageList . Images . Add ( Properties . Resources . B16x16_Category ) ;
221
+ classesTreeView . ImageList . Images . Add ( Properties . Resources . B16x16_Enum_Type ) ;
194
222
195
- root = new TreeNode
223
+ classesRootNode = new TreeNode
196
224
{
197
225
Text = "Classes" ,
198
226
ImageIndex = 0 ,
199
227
SelectedImageIndex = 0
200
228
} ;
201
229
202
- classesTreeView . Nodes . Add ( root ) ;
230
+ classesTreeView . Nodes . Add ( classesRootNode ) ;
231
+
232
+ enumsRootNode = new TreeNode
233
+ {
234
+ Text = "Enums" ,
235
+ ImageIndex = 2 ,
236
+ SelectedImageIndex = 2
237
+ } ;
238
+
239
+ classesTreeView . Nodes . Add ( enumsRootNode ) ;
203
240
}
204
241
205
242
#region Event Handler
@@ -242,7 +279,7 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e)
242
279
var cms = ClassTreeNodeContextMenuStrip ;
243
280
cms ? . Show ( classesTreeView , e . Location ) ;
244
281
}
245
- else
282
+ else if ( node == classesRootNode )
246
283
{
247
284
var cms = ProjectTreeNodeContextMenuStrip ;
248
285
cms ? . Show ( classesTreeView , e . Location ) ;
@@ -277,20 +314,21 @@ private void classesTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArg
277
314
278
315
public void ExpandAllClassNodes ( )
279
316
{
280
- root . ExpandAll ( ) ;
317
+ classesRootNode . ExpandAll ( ) ;
281
318
}
282
319
283
320
public void CollapseAllClassNodes ( )
284
321
{
285
- foreach ( var tn in root . Nodes . Cast < TreeNode > ( ) )
322
+ foreach ( var tn in classesRootNode . Nodes . Cast < TreeNode > ( ) )
286
323
{
287
324
tn . Collapse ( ) ;
288
325
}
289
326
}
290
327
291
328
public void Clear ( )
292
329
{
293
- root . Nodes . Clear ( ) ;
330
+ classesRootNode . Nodes . Clear ( ) ;
331
+ enumsRootNode . Nodes . Clear ( ) ;
294
332
}
295
333
296
334
/// <summary>Adds the class to the view.</summary>
@@ -310,27 +348,16 @@ public void AddClasses(IEnumerable<ClassNode> nodes)
310
348
311
349
foreach ( var node in nodes )
312
350
{
313
- AddClassInternal ( node ) ;
351
+ classesRootNode . Nodes . Add ( new ClassTreeNode ( node , this ) ) ;
314
352
}
315
353
354
+ classesRootNode . Expand ( ) ;
355
+
316
356
classesTreeView . Sort ( ) ;
317
357
318
358
classesTreeView . EndUpdate ( ) ;
319
359
}
320
360
321
- /// <summary>
322
- /// Adds a new <see cref="ClassTreeNode"/> to the tree.
323
- /// </summary>
324
- /// <param name="node">The class to add.</param>
325
- private void AddClassInternal ( ClassNode node )
326
- {
327
- Contract . Requires ( node != null ) ;
328
-
329
- root . Nodes . Add ( new ClassTreeNode ( node , this ) ) ;
330
-
331
- root . Expand ( ) ;
332
- }
333
-
334
361
/// <summary>Removes the class from the view.</summary>
335
362
/// <param name="node">The class to remove.</param>
336
363
public void RemoveClass ( ClassNode node )
@@ -344,9 +371,9 @@ public void RemoveClass(ClassNode node)
344
371
345
372
if ( selectedClass == node )
346
373
{
347
- if ( root . Nodes . Count > 0 )
374
+ if ( classesRootNode . Nodes . Count > 0 )
348
375
{
349
- classesTreeView . SelectedNode = root . Nodes [ 0 ] ;
376
+ classesTreeView . SelectedNode = classesRootNode . Nodes [ 0 ] ;
350
377
}
351
378
else
352
379
{
@@ -362,7 +389,7 @@ private ClassTreeNode FindMainClassTreeNode(ClassNode node)
362
389
{
363
390
Contract . Requires ( node != null ) ;
364
391
365
- return root . Nodes
392
+ return classesRootNode . Nodes
366
393
. Cast < ClassTreeNode > ( )
367
394
. FirstOrDefault ( t => t . ClassNode == node ) ;
368
395
}
@@ -374,7 +401,7 @@ private IEnumerable<ClassTreeNode> FindClassTreeNodes(ClassNode node)
374
401
{
375
402
Contract . Requires ( node != null ) ;
376
403
377
- return root . Nodes
404
+ return classesRootNode . Nodes
378
405
. Cast < ClassTreeNode > ( )
379
406
. Traverse ( t => t . Nodes . Cast < ClassTreeNode > ( ) )
380
407
. Where ( n => n . ClassNode == node ) ;
@@ -395,5 +422,54 @@ public void UpdateClassNode(ClassNode node)
395
422
396
423
classesTreeView . EndUpdate ( ) ;
397
424
}
425
+
426
+ public void AddEnum ( EnumMetaData @enum )
427
+ {
428
+ Contract . Requires ( @enum != null ) ;
429
+
430
+ AddEnums ( new [ ] { @enum } ) ;
431
+ }
432
+
433
+ public void AddEnums ( IEnumerable < EnumMetaData > enums )
434
+ {
435
+ Contract . Requires ( enums != null ) ;
436
+
437
+ classesTreeView . BeginUpdate ( ) ;
438
+
439
+ foreach ( var @enum in enums )
440
+ {
441
+ enumsRootNode . Nodes . Add ( new EnumTreeNode ( @enum ) ) ;
442
+ }
443
+
444
+ enumsRootNode . ExpandAll ( ) ;
445
+
446
+ classesTreeView . Sort ( ) ;
447
+
448
+ classesTreeView . EndUpdate ( ) ;
449
+ }
450
+
451
+ public void UpdateEnumNode ( EnumMetaData @enum )
452
+ {
453
+ Contract . Requires ( @enum != null ) ;
454
+
455
+ classesTreeView . BeginUpdate ( ) ;
456
+
457
+ var nodes = enumsRootNode . Nodes
458
+ . Cast < EnumTreeNode > ( )
459
+ . Where ( n => n . Enum == @enum ) ;
460
+ foreach ( var tn in nodes )
461
+ {
462
+ tn . Update ( ) ;
463
+ }
464
+
465
+ if ( nodes . None ( ) )
466
+ {
467
+ AddEnum ( @enum ) ;
468
+ }
469
+
470
+ classesTreeView . Sort ( ) ;
471
+
472
+ classesTreeView . EndUpdate ( ) ;
473
+ }
398
474
}
399
475
}
0 commit comments