public void GenerateTree() { Debug.WriteLine("GenerateTree"); initializing = true; tvModel.SuspendLayout(); tvModel.Nodes.Clear(); //var p = new Queue<RcChipBase>(); //var q = new Queue<RcChipBase>(); //var r = new Queue<RcTreeNode>(); //RcChipBase w; //RcTreeNode n; RcTreeNode top = new RcTreeNode(datasource.model.root); //// ルートチップをキューに入れる //p.Enqueue(datasource.model.root); //q.Enqueue(datasource.model.root); //// qに対して、チップのツリーを展開していく //while(p.Count > 0){ // w = p.Dequeue(); // foreach(RcChipBase c in w.Child){ // if(c == null)break; // q.Enqueue(c); // p.Enqueue(c); // } // q.Enqueue(null); //} //// 展開されたチップリストからツリーを再構築 //r.Enqueue(top = new RcTreeNode(q.Dequeue())); //while(q.Count > 0){ // w = q.Dequeue(); // if(w == null){ // if((n = r.Dequeue()).ChipType != RcChipType.Cowl) // n.Expand(); // } // else{ // n = new RcTreeNode(w); // r.Enqueue(n); // r.Peek().Nodes.Add(n); // } //} tvModel.Nodes.Add(top); top.Expand(); tvModel.ResumeLayout(true); initializing = false; }
// [Obsolete("未完成です。ずっと日の目を見ないかも。")] public void UpdateTree(RcChipBase updateRoot) { RcTreeNode root = ((RcTreeNode)tvModel.Nodes[0]).Find(updateRoot); if (root == null) { // まだないチップ -> 親をアップデート if (updateRoot.Parent == null) { GenerateTree(); return; } Debug.WriteLine(updateRoot.Parent, "Parent Update"); UpdateTree(updateRoot.Parent); root = ((RcTreeNode)tvModel.Nodes[0]).Find(updateRoot); if (root == null) { throw new ArgumentException("ツリービューの更新に失敗しました。"); } } int childCount = 0; for (int i = 0; i < RcData.ChildCapasity; i++) { if (updateRoot.Child[i] == null) { continue; } childCount++; var childChip = updateRoot.Child[i]; var childNode = root.Find(childChip); int nodeIndex = root.Nodes.IndexOf(childNode); if (childNode == null) { // 追加 RcTreeNode n; root.Nodes.Insert(i, n = new RcTreeNode(childChip)); Debug.WriteLine(n, "New node"); } else if (nodeIndex != i) { // 間にあるノードを削除 List <TreeNode> nodesToDelete = new List <TreeNode>(); for (int j = i; j < nodeIndex; j++) { nodesToDelete.Add(root.Nodes[j]); } foreach (var n in nodesToDelete) { root.Nodes.Remove(n); Debug.WriteLine(n, "Delete node"); } } } Debug.WriteLine(root, "Update text"); root.UpdateText(); if (updateRoot is RcChipCowl) { root.Collapse(); } else { root.Expand(); } }