Skip to content

Commit 47887c1

Browse files
committed
Initial replacement of lazy loading ParseTreeView complete
There is however a bug in the viewer
1 parent c1e1455 commit 47887c1

4 files changed

Lines changed: 68 additions & 26 deletions

File tree

GunWin/GunWin.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@
181181
<Project>{8bd992fd-a3b3-4af9-9371-5aa14ddfda68}</Project>
182182
<Name>Common</Name>
183183
</ProjectReference>
184+
<ProjectReference Include="..\ParserTreeView\ParserTreeView.csproj">
185+
<Project>{b96d577c-e90a-4817-aa1c-3a211efb83f0}</Project>
186+
<Name>ParserTreeView</Name>
187+
</ProjectReference>
184188
<ProjectReference Include="..\Utilities\Utilities.csproj">
185189
<Project>{4e020f1d-27bf-4853-8573-474d7edb4e72}</Project>
186190
<Name>Utilities</Name>

GunWin/VisualAnalyzer.Designer.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

GunWin/VisualAnalyzer.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -431,10 +431,11 @@ private void BuildParseTreeTreeViewGuide(ITree tree)
431431
return;
432432
}
433433

434-
var treeNode =
435-
new TreeNode(Trees.GetNodeText(tree, _Grammar.ParserRules)) { Tag = tree, Name = tree.GetHashCode().ToString() };
436-
ParseTreeView.Nodes.Add(treeNode);
437-
AddTreeBranchesAndLeaves(treeNode, tree);
434+
//var treeNode =
435+
// new TreeNode(Trees.GetNodeText(tree, _Grammar.ParserRules)) { Tag = tree, Name = tree.GetHashCode().ToString() };
436+
//ParseTreeView.Nodes.Add(treeNode);
437+
//AddTreeBranchesAndLeaves(treeNode, tree);
438+
ParseTreeView.LoadParseTree(tree, _Grammar);
438439

439440
ParseTreeView.EndUpdate();
440441
ParseTreeView.ResumeLayout();
@@ -819,16 +820,19 @@ private void LoadSourceToolStripMenuItem_Click(object sender, EventArgs e)
819820

820821
private void Menu_GraphFromHere_Click(object sender, EventArgs e)
821822
{
822-
if (_Viewer.SelectedObject is Node node)
823+
if (_Viewer.SelectedObject is Node node && node.UserData is ITree target)
823824
{
824-
var treeNodes = ParseTreeView.Nodes.Find(node.UserData?.GetHashCode().ToString(), true);
825-
if (treeNodes.Length != 0)
826-
{
827-
var workingNode = treeNodes.First();
828-
ParseTreeView.SelectedNode = workingNode;
829-
RenderParseTreeGraph(workingNode.Tag as ITree, 0);
830-
ParseTreeView.Focus();
831-
}
825+
ParseTreeView.SelectTreeNode(target);
826+
RenderParseTreeGraph(target, 0);
827+
ParseTreeView.Focus();
828+
//var treeNodes = ParseTreeView.Nodes.Find(node.UserData?.GetHashCode().ToString(), true);
829+
//if (treeNodes.Length != 0)
830+
//{
831+
// var workingNode = treeNodes.First();
832+
// ParseTreeView.SelectedNode = workingNode;
833+
// RenderParseTreeGraph(workingNode.Tag as ITree, 0);
834+
// ParseTreeView.Focus();
835+
//}
832836
}
833837
}
834838

ParserTreeView/ParserTreeView.cs

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@ public ParserTreeView()
1818
{
1919
InitializeComponent();
2020
BeforeSelect += ParserTreeView_BeforeSelect;
21+
BeforeExpand += ParserTreeView_BeforeExpand;
22+
}
23+
24+
private void ParserTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
25+
{
26+
if (e.Node.Tag is ITree tree)
27+
{
28+
for (var i = 0; i < tree.ChildCount; i++)
29+
{
30+
var child = tree.GetChild(i);
31+
AddChildNode(e.Node, child);
32+
}
33+
}
2134
}
2235

2336
/// <summary>
@@ -47,6 +60,7 @@ public void LoadParseTree(ITree parseTree, GrammarReference grammar)
4760
{
4861
ParseTree = parseTree;
4962
Grammar = grammar;
63+
AddChildNode(null, parseTree);
5064
}
5165

5266
/// <summary>
@@ -68,6 +82,8 @@ public void SelectTreeNode(ITree tree)
6882
/// <returns>The final leaf <see cref="TreeNode"/> instance that was created.</returns>
6983
private TreeNode AddBranchesTillLeaf(ITree tree)
7084
{
85+
// TODO: Find and fix the bug in this method's logic
86+
7187
// fetch our unique ID for the tree instance and then check if it already exists in active nodes
7288
// if so, we return the existing tree node since nothing more needs to be done
7389
var nodeName = tree.GetHashCode().ToString();
@@ -119,19 +135,37 @@ private TreeNode AddBranchesTillLeaf(ITree tree)
119135

120136
private TreeNode AddChildNode(TreeNode root, ITree tree)
121137
{
138+
// Add the child node
122139
var nodeName = tree.GetHashCode().ToString();
123-
if (ActiveNodes.TryGetValue(nodeName, out var treeNode))
124-
return treeNode;
125-
treeNode = new TreeNode(Trees.GetNodeText(tree, Grammar.ParserRules))
140+
if (!ActiveNodes.TryGetValue(nodeName, out var treeNode))
141+
{
142+
treeNode = new TreeNode(Trees.GetNodeText(tree, Grammar.ParserRules))
143+
{
144+
Tag = tree,
145+
Name = nodeName
146+
};
147+
if (root == null)
148+
this.Nodes.Add(treeNode);
149+
else
150+
root.Nodes.Add(treeNode);
151+
ActiveNodes[nodeName] = treeNode;
152+
}
153+
154+
// Now we also add any children of that child node to prepopulate the tree enough to show nodes with children
155+
for (var i = 0; i < tree.ChildCount; i++)
126156
{
127-
Tag = tree,
128-
Name = nodeName
129-
};
130-
if (root == null)
131-
this.Nodes.Add(treeNode);
132-
else
133-
root.Nodes.Add(treeNode);
134-
ActiveNodes[nodeName] = treeNode;
157+
var child = tree.GetChild(i);
158+
nodeName = child.GetHashCode().ToString();
159+
if (ActiveNodes.ContainsKey(nodeName))
160+
continue;
161+
var newChild = new TreeNode(Trees.GetNodeText(child, Grammar.ParserRules))
162+
{
163+
Tag = child,
164+
Name = nodeName
165+
};
166+
treeNode.Nodes.Add(newChild);
167+
ActiveNodes[nodeName] = newChild;
168+
}
135169

136170
return treeNode;
137171
}

0 commit comments

Comments
 (0)