Skip to content

Commit 8f7864e

Browse files
committed
Show enums in left view.
1 parent 03d1126 commit 8f7864e

File tree

4 files changed

+136
-32
lines changed

4 files changed

+136
-32
lines changed

ReClass.NET/Forms/MainForm.Functions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Diagnostics.Contracts;
@@ -83,10 +83,12 @@ void UpdateClassNodes(BaseNode node)
8383
c.NodesChanged -= UpdateClassNodes;
8484
c.NameChanged -= UpdateClassNodes;
8585
};
86+
currentProject.EnumAdded += e => { classesView.AddEnum(e); };
8687

8788
ClassNode.ClassCreated += currentProject.AddClass;
8889

8990
classesView.Clear();
91+
classesView.AddEnums(currentProject.Enums);
9092
classesView.AddClasses(currentProject.Classes);
9193
memoryViewControl.ClassNode = currentProject.Classes.FirstOrDefault();
9294
}

ReClass.NET/Forms/MainForm.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,11 @@ private void memoryViewControl_ChangeEnumTypeClick(object sender, NodeClickEvent
879879
enumNode.GetParentContainer()?.ChildHasChanged(enumNode);
880880
}
881881
}
882+
883+
foreach (var @enum in CurrentProject.Enums)
884+
{
885+
classesView.UpdateEnumNode(@enum);
886+
}
882887
}
883888
}
884889

ReClass.NET/Project/ReClassNetProject.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ public class ReClassNetProject : IDisposable
1313
public event ClassesChangedEvent ClassAdded;
1414
public event ClassesChangedEvent ClassRemoved;
1515

16+
public delegate void EnumsChangedEvent(EnumMetaData sender);
17+
public event EnumsChangedEvent EnumAdded;
18+
public event EnumsChangedEvent EnumRemoved;
19+
1620
private readonly List<EnumMetaData> enums = new List<EnumMetaData>();
1721
private readonly List<ClassNode> classes = new List<ClassNode>();
1822

@@ -39,6 +43,9 @@ public void Dispose()
3943

4044
ClassAdded = null;
4145
ClassRemoved = null;
46+
47+
EnumAdded = null;
48+
EnumRemoved = null;
4249
}
4350

4451
public void AddClass(ClassNode node)
@@ -83,6 +90,15 @@ public void Clear()
8390

8491
ClassRemoved?.Invoke(node);
8592
}
93+
94+
var temp2 = enums.ToList();
95+
96+
enums.Clear();
97+
98+
foreach (var @enum in temp2)
99+
{
100+
EnumRemoved?.Invoke(@enum);
101+
}
86102
}
87103

88104
private IEnumerable<ClassNode> GetClassReferences(ClassNode node)
@@ -132,6 +148,8 @@ public void AddEnum(EnumMetaData @enum)
132148
Contract.Requires(@enum != null);
133149

134150
enums.Add(@enum);
151+
152+
EnumAdded?.Invoke(@enum);
135153
}
136154

137155
public void RemoveEnum(EnumMetaData @enum)
@@ -144,7 +162,10 @@ public void RemoveEnum(EnumMetaData @enum)
144162
throw new EnumReferencedException(@enum, refrences.Select(e => e.GetParentClass()).Distinct());
145163
}
146164

147-
enums.Remove(@enum);
165+
if (enums.Remove(@enum))
166+
{
167+
EnumRemoved?.Invoke(@enum);
168+
}
148169
}
149170

150171
private IEnumerable<EnumNode> GetEnumReferences(EnumMetaData @enum)

ReClass.NET/UI/ClassNodeView.cs

Lines changed: 106 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Windows.Forms;
77
using ReClassNET.Extensions;
88
using ReClassNET.Nodes;
9+
using ReClassNET.Project;
910

1011
namespace 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

Comments
 (0)