@@ -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