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(); } }