private void tvModel_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { #if false RcTreeNode rcnode = (RcTreeNode)e.Node; RcChipBase c; c = RcChipBase.Parse(datasource, e.Label); if (c is RcChipCowl && Array.Exists(rcnode.Chip.Child, x => !(x is RcChipCowl))) { if ( MessageBox.Show("派生チップにカウル以外のチップが存在します。すべてカウルに変更しますか?", "ツリービュー編集", MessageBoxButtons.YesNo) == DialogResult.Yes) { for (int i = 0; i < RcData.ChildCapasity; i++) { rcnode.Chip.Child[i] = rcnode.Chip.Child[i].ChangeType(RcChipType.Cowl); } } else { } } #else e.CancelEdit = true; #endif }
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; }
public RcTreeNode Find(RcChipBase chip) { if (this.Chip == chip) { return(this); } else { foreach (TreeNode tn in this.Nodes) { RcTreeNode rctn = (RcTreeNode)tn; RcTreeNode ret = rctn.Find(chip); if (ret != null) { return(ret); } } } return(null); }
// [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(); } }