66using System . Windows . Forms ;
77using ReClassNET . Extensions ;
88using ReClassNET . Nodes ;
9+ using ReClassNET . Project ;
910
1011namespace ReClassNET . UI
1112{
@@ -93,22 +94,47 @@ private void RebuildClassHierarchy(HashSet<ClassNode> seen)
9394 }
9495 }
9596
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+
96117 private class NodeSorter : IComparer
97118 {
98119 public int Compare ( object x , object y )
99120 {
100121 var compare = Application . CurrentCulture . CompareInfo ;
101122
102- if ( x is ClassTreeNode n1 && y is ClassTreeNode n2 )
123+ if ( x is ClassTreeNode cn1 && y is ClassTreeNode cn2 )
103124 {
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 ) ;
105130 }
106131
107132 return 0 ;
108133 }
109134 }
110135
111- private readonly TreeNode root ;
136+ private readonly TreeNode enumsRootNode ;
137+ private readonly TreeNode classesRootNode ;
112138
113139 private ClassNode selectedClass ;
114140
@@ -166,9 +192,9 @@ public bool EnableClassHierarchyView
166192 {
167193 enableClassHierarchyView = value ;
168194
169- var classes = root . Nodes . Cast < ClassTreeNode > ( ) . Select ( t => t . ClassNode ) . ToList ( ) ;
195+ var classes = classesRootNode . Nodes . Cast < ClassTreeNode > ( ) . Select ( t => t . ClassNode ) . ToList ( ) ;
170196
171- root . Nodes . Clear ( ) ;
197+ classesRootNode . Nodes . Clear ( ) ;
172198
173199 AddClasses ( classes ) ;
174200 }
@@ -181,7 +207,7 @@ public bool EnableClassHierarchyView
181207
182208 public ClassNodeView ( )
183209 {
184- Contract . Ensures ( root != null ) ;
210+ Contract . Ensures ( classesRootNode != null ) ;
185211
186212 InitializeComponent ( ) ;
187213
@@ -191,15 +217,26 @@ public ClassNodeView()
191217 classesTreeView . ImageList = new ImageList ( ) ;
192218 classesTreeView . ImageList . Images . Add ( Properties . Resources . B16x16_Text_List_Bullets ) ;
193219 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 ) ;
194222
195- root = new TreeNode
223+ classesRootNode = new TreeNode
196224 {
197225 Text = "Classes" ,
198226 ImageIndex = 0 ,
199227 SelectedImageIndex = 0
200228 } ;
201229
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 ) ;
203240 }
204241
205242 #region Event Handler
@@ -242,7 +279,7 @@ private void classesTreeView_MouseUp(object sender, MouseEventArgs e)
242279 var cms = ClassTreeNodeContextMenuStrip ;
243280 cms ? . Show ( classesTreeView , e . Location ) ;
244281 }
245- else
282+ else if ( node == classesRootNode )
246283 {
247284 var cms = ProjectTreeNodeContextMenuStrip ;
248285 cms ? . Show ( classesTreeView , e . Location ) ;
@@ -277,20 +314,21 @@ private void classesTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArg
277314
278315 public void ExpandAllClassNodes ( )
279316 {
280- root . ExpandAll ( ) ;
317+ classesRootNode . ExpandAll ( ) ;
281318 }
282319
283320 public void CollapseAllClassNodes ( )
284321 {
285- foreach ( var tn in root . Nodes . Cast < TreeNode > ( ) )
322+ foreach ( var tn in classesRootNode . Nodes . Cast < TreeNode > ( ) )
286323 {
287324 tn . Collapse ( ) ;
288325 }
289326 }
290327
291328 public void Clear ( )
292329 {
293- root . Nodes . Clear ( ) ;
330+ classesRootNode . Nodes . Clear ( ) ;
331+ enumsRootNode . Nodes . Clear ( ) ;
294332 }
295333
296334 /// <summary>Adds the class to the view.</summary>
@@ -310,27 +348,16 @@ public void AddClasses(IEnumerable<ClassNode> nodes)
310348
311349 foreach ( var node in nodes )
312350 {
313- AddClassInternal ( node ) ;
351+ classesRootNode . Nodes . Add ( new ClassTreeNode ( node , this ) ) ;
314352 }
315353
354+ classesRootNode . Expand ( ) ;
355+
316356 classesTreeView . Sort ( ) ;
317357
318358 classesTreeView . EndUpdate ( ) ;
319359 }
320360
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-
334361 /// <summary>Removes the class from the view.</summary>
335362 /// <param name="node">The class to remove.</param>
336363 public void RemoveClass ( ClassNode node )
@@ -344,9 +371,9 @@ public void RemoveClass(ClassNode node)
344371
345372 if ( selectedClass == node )
346373 {
347- if ( root . Nodes . Count > 0 )
374+ if ( classesRootNode . Nodes . Count > 0 )
348375 {
349- classesTreeView . SelectedNode = root . Nodes [ 0 ] ;
376+ classesTreeView . SelectedNode = classesRootNode . Nodes [ 0 ] ;
350377 }
351378 else
352379 {
@@ -362,7 +389,7 @@ private ClassTreeNode FindMainClassTreeNode(ClassNode node)
362389 {
363390 Contract . Requires ( node != null ) ;
364391
365- return root . Nodes
392+ return classesRootNode . Nodes
366393 . Cast < ClassTreeNode > ( )
367394 . FirstOrDefault ( t => t . ClassNode == node ) ;
368395 }
@@ -374,7 +401,7 @@ private IEnumerable<ClassTreeNode> FindClassTreeNodes(ClassNode node)
374401 {
375402 Contract . Requires ( node != null ) ;
376403
377- return root . Nodes
404+ return classesRootNode . Nodes
378405 . Cast < ClassTreeNode > ( )
379406 . Traverse ( t => t . Nodes . Cast < ClassTreeNode > ( ) )
380407 . Where ( n => n . ClassNode == node ) ;
@@ -395,5 +422,54 @@ public void UpdateClassNode(ClassNode node)
395422
396423 classesTreeView . EndUpdate ( ) ;
397424 }
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+ }
398474 }
399475}
0 commit comments