public void ShowTree() { //Желательно строить в отдельном потоке а потом разом выводить. Незабуть про синхронизацию. //Пока можно посто в лоб. try { PascalABCCompiler.SemanticTree.IProgramNode Root = VisualEnvironmentCompiler.StandartCompiler.SemanticTree; treeView.Nodes.Clear(); // связываем Visitor и treeView.Nodes Visitor = new SematicTreeVisitor(treeView.Nodes); Visitor.CreateMyDictionaries(); Visitor.setTreeView(treeView); // собственно проходим по дереву от корня Root.visit(Visitor); //Visitor.visit(Root, treeView.Nodes); //Visitor.visit(Root); // устанавливаем обратные связи Visitor.makeUpRows(treeView); // по умолчанию выбранным является Nodes[0] treeView.SelectedNode = treeView.Nodes[0]; //treeView.SelectedNode.BackColor = Color.Chocolate; //treeView.Invalidate(); treeView.Invalidate(); treeView.Refresh(); treeView.Update(); } catch (Exception e) { VisualEnvironmentCompiler.ExecuteAction(VisualEnvironmentCompilerAction.AddTextToCompilerMessages, "SemanticVisualisator Exception: " + e.ToString()); } }
// для одного node из ICollection public void prepare_node_in_collection(ISemanticNode subnode, string node_name, myTreeNode tn_parent, bool is_leaf) { myTreeNode t; if (treeView.SelectedNode == null) t = null; else if (treeView.SelectedNode.Tag == null) t = null; else t = treeView.SelectedNode as myTreeNode; if (subnode != null) { myTreeNode tn = new myTreeNode(); tn.Text = node_name + " : " + subnode.GetType().Name; tn.Tag = subnode; SematicTreeVisitor vs = new SematicTreeVisitor(tn.Nodes); tn_parent.Nodes.Add(tn); try { if (!table_subnodes.ContainsKey(subnode)) table_subnodes.Add(subnode, tn); } catch (System.Exception e) { MessageBox.Show("Exception was \n" + e.ToString()); } //treeView.Invalidate(); //(tn as myTreeNode).is_leaf = is_leaf; } }
//-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- // для обычного node - потомка ISemanticNode public void prepare_node(ISemanticNode subnode, string node_name) { myTreeNode t; if (treeView.SelectedNode == null) t = null; else if (treeView.SelectedNode.Tag == null) t = null; else t = treeView.SelectedNode as myTreeNode; if (subnode != null) { myTreeNode tn = new myTreeNode(); tn.Text = node_name + " : " + subnode.GetType().Name; tn.Tag = subnode; SematicTreeVisitor vs = new SematicTreeVisitor(tn.Nodes); if (t != null) t.Nodes.Add(tn); else nodes.Add(tn); try { if (!table_subnodes.ContainsKey(subnode)) table_subnodes.Add(subnode, tn); } catch (System.Exception e) { MessageBox.Show("Exception was \n" + e.ToString()); } } }