public TriStateTreeNode AddChild(TriStateTreeNode parent, String text) { TriStateTreeNode node = new TriStateTreeNode(text); parent.Nodes.Add(node); return(node); }
/* * [Browsable(true)] * [EditorBrowsable] * public List<TriStateTreeNode> RootNodes * { * get * { * return (Nodes as TriStateTreeNodeCollection).ToList<TriStateTreeNode>(); * } * set * { * Nodes.Clear(); * (Nodes as TriStateTreeNodeCollection).AddRange(value); * } * } */ public TreeNode AddRoot(String text) { TriStateTreeNode aRoot = new TriStateTreeNode(text); this.Nodes.Add(aRoot); return(aRoot); }
/// <summary> /// 모든 하위 노드를 검색하여 체크가 된 endNode를 가져온다. /// </summary> /// <param name="passed"></param> /// <param name="allChecked"></param> /// <param name="nodes"></param> /// <returns></returns> List <TriStateTreeNode> getCheckedEndNodes(TriStateTreeNode passed, out bool allChecked, List <TriStateTreeNode> nodes = null) { if (nodes == null) { nodes = new List <TriStateTreeNode>(); } if (passed.Nodes.Count > 0) { if (passed.IsExpanded == false) { passed.ImageIndex = 2; passed.SelectedImageIndex = 2; } allChecked = true; bool tempCheck = true; foreach (TriStateTreeNode node in passed.Nodes) { getCheckedEndNodes(node, out tempCheck, nodes); if (tempCheck == false) { allChecked = false; } } if (allChecked) { passed.Checked = true; } else { if (nodes.Count == 0) { passed.Checked = false; } else { passed.Checked = null; } } } else if (passed.Checked == true) { allChecked = true; nodes.Add(passed); if (_checkedNodes.Contains(passed) == false) { _checkedNodes.Add(passed); } ///_checkedNodes는 자동으로 추가/삭제하므로 사용자가 node.Checked를 사용하여 access했을 경우 ///잡아내지 못한다. 그러므로 이런 식으로 갱신한다. } else { allChecked = false; if (_checkedNodes.Contains(passed)) { _checkedNodes.Remove(passed); } } return(nodes); }
/// <summary> /// 노드의 자식에 있는 모든 EndNode를 isChecked의 상태로 바꾼다. /// 만일 parent가 EndNode라면 그 자신의 상태만 갱신한다. /// </summary> /// <param name="node"></param> /// <param name="isChecked"></param> /// <param name="added"></param> /// <param name="removed"></param> public void setEndNodesChecked(TriStateTreeNode node, bool isChecked, List <TriStateTreeNode> added, List <TriStateTreeNode> removed) { if (node.Nodes.Count == 0) //자식 노드가 더이상 없으면 { if (isChecked) { if (node.Checked == false) { if (added != null) { added.Add(node); } _checkedNodes.Add(node); //setCheckBox(node, true); node.Checked = true; //setCheckBox(node, true); } } else { if (node.Checked == true) { if (removed != null) { removed.Add(node); } _checkedNodes.Remove(node); //setCheckBox(node, false); node.Checked = false; } } if (node is IStateTreeNode) { System.Windows.Forms.TreeViewCancelEventArgs e = new System.Windows.Forms.TreeViewCancelEventArgs(node, false, TreeViewAction.ByMouse); ((IStateTreeNode)node).UpdateState(e); } } else //자식 노드가 존재하면.. { foreach (TriStateTreeNode aNode in node.Nodes) { setEndNodesChecked(aNode, isChecked, added, removed); } //node.Checked = isChecked; //setCheckBox(node, isChecked); } //node.Checked = isChecked; // node.Checked = (isChecked); if (node.Parent != null) { CheckParent(node.Parent); } }
public RtwTreeNodeCheckedEventArg(TriStateTreeNode parent, int minIndex, int maxIndex, int beforeMinIndex, int beforeMaxIndex, bool state) { MinIndex = minIndex; MaxIndex = maxIndex; BeforeMinIndex = beforeMinIndex; BeforeMaxIndex = beforeMaxIndex; Parent = parent; CheckState = state; }
public TriStateTreeNode(TriStateTreeNode cloneBase) : base() { _nodes = new TriStateTreeNodeCollection(base.Nodes); this.Name = cloneBase.Name; this.Text = cloneBase.Text; this.Checked = cloneBase.Checked; foreach (String key in cloneBase.RelativeObject.Keys) { this.RelativeObject[key] = cloneBase.RelativeObject[key]; } }
public TriStateTreeNode(TriStateTreeNode node, String relObjName = null, Object relObj = null) : base(node.Text) { if (node.Name != null && node.Name.Length > 0) { this.Name = node.Name; } else { this.Name = node.Text; } this.CheckState = node.CheckState; if (relObjName != null && relObj != null) { _relativeObject[relObjName] = relObj; } }
/// <summary> /// 해당 root에 자식노드를 할당하고 새로 생성된 자식노드를 리턴한다. /// </summary> /// <param name="rootIndex">자식노들 추가할 루트의 인덱스</param> /// <param name="name">자식노드를 호출할 때 쓰일 이름</param> /// <param name="text">트리에 나타날 이름</param> /// <returns></returns> public TriStateTreeNode AddChild(int rootIndex, String text) { TriStateTreeNode root; TriStateTreeNode node = new TriStateTreeNode(text); if (rootIndex >= 0 && this.Nodes.Count > rootIndex) { root = this.Nodes[rootIndex] as TriStateTreeNode; root.Nodes.Add(node); } else { root = this.Nodes[this.Nodes.Count - 1] as TriStateTreeNode; root.Nodes.Add(node); } return(node); }
public static TreeNode ConvertToTreeNode(TriStateTreeNode node) { return(node); }
protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) { if (_isCheckBoxClicked) { //_isCheckBoxClicked = false; return; } this.HideSelection = true; _selectedTreeNode = e.Node as TriStateTreeNode; bool?state = (_selectedTreeNode.CheckState == CheckState.Checked) ? true : (_selectedTreeNode.CheckState == CheckState.Unchecked) ? false : (bool?)null; TreeNodeClickEventArg arg = new TreeNodeClickEventArg(state, e.Node, this); if (e.Button == System.Windows.Forms.MouseButtons.Left) { if (Control.ModifierKeys == Keys.Control) { } else if (Control.ModifierKeys == Keys.Shift) { } else if (Control.ModifierKeys == Keys.Alt) { } else { //노드를 클릭하면,(LeftClick) if (e.Node.Nodes.Count > 0) { DoAction(ActionOnParentNodeClicked, e.Node); if (E_OnParentNodeClicked != null) { E_OnParentNodeClicked(this, arg); } } else { //자식 노드가 없다면 마지막 노드이므로 이벤트를 호출한다. DoAction(ActionOnEndNodeClicked, e.Node); if (E_OnEndNodeClicked != null) { E_OnEndNodeClicked(this, arg); } } } return; } else if (e.Button != System.Windows.Forms.MouseButtons.Right) { if (e.Node.Nodes.Count > 0) { DoAction(ActionOnParentNodeRightClicked, e.Node); if (E_OnParentNodeRightClicked != null) { E_OnParentNodeRightClicked(this, arg); } } else { DoAction(ActionOnEndNodeRightClicked, e.Node); if (E_OnEndNodeRightClicked != null) { E_OnEndNodeRightClicked(this, arg); } } return; } else if (e.Button != System.Windows.Forms.MouseButtons.Middle) { if (e.Node.Nodes.Count > 0) { DoAction(ActionOnParentNodeMiddleClicked, e.Node); if (E_OnParentNodeMiddleClicked != null) { E_OnParentNodeMiddleClicked(this, arg); } } else { DoAction(ActionOnEndNodeMiddleClicked, e.Node); if (E_OnEndNodeMiddleClicked != null) { E_OnEndNodeMiddleClicked(this, arg); } } return; } //base.OnNodeMouseClick(e); }
void DoAction(Actions action, TreeNode passedNode) { if (_isCheckBoxClicked) { return; } TriStateTreeNode node = passedNode as TriStateTreeNode; if ((action & Actions.CloseSiblings) > 0) { //자신과 같은 depth의 node가 열려있으면 모두 닫고, TriStateTreeNode parent = node.Parent as TriStateTreeNode; if (parent != null) { if (node.Nodes.Count > 0) { foreach (TriStateTreeNode siblings in parent.Nodes) { if (siblings != node) { siblings.Collapse(true); } } } } else { if (node.Nodes.Count > 0) { foreach (TriStateTreeNode siblings in Nodes) { if (siblings != node) { siblings.Collapse(true); } } } } } if ((action & Actions.ToggleExpand) > 0) { //자식노드가 존재한다면 자식노드를 열거나 닫는다. if (node.Nodes.Count > 0) { if (node.IsExpanded) { node.Collapse(false); } else { node.Expand(); } } } if ((action & Actions.ContextMenuOpened) > 0) //ContextMenu가 있으면 연다. { if (node.Nodes.Count == 0) { if (U_ContextMenuEndNode != null) { U_ContextMenuEndNode.Show(this, this.PointToClient(Control.MousePosition)); } } else { if (U_ContextMenuParentNode != null) { U_ContextMenuParentNode.Show(this, this.PointToClient(Control.MousePosition)); } } } if ((action & Actions.CheckBoxClick) > 0) { List <TriStateTreeNode> added = new List <TriStateTreeNode>(); List <TriStateTreeNode> removed = new List <TriStateTreeNode>(); if (node.Checked == false) //기존에 상태가 false 이면.. { if (_isCheckBoxClicked == false) { setEndNodesChecked(node as TriStateTreeNode, true, added, removed); } } else //중간단계도 상태를 false로 만듬. { if (_isCheckBoxClicked == false) { setEndNodesChecked(node as TriStateTreeNode, false, added, removed); } } if (node.Nodes.Count == 0) { if (E_OnEndNodeChecked != null) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, added, removed)); } } else { if (E_OnParentNodeChecked != null) { E_OnParentNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, added, removed)); } } } if ((action & Actions.CopyNameToClipBaord) > 0) { Clipboard.SetText(getFullPathByText(node)); } }
void CheckBoxClicked(TriStateTreeNode treeNode) { //L_Title.Content = c.Name; //MessageBox.Show(c.Name); if (treeNode.Nodes.Count == 0 && treeNode.Parent != null) //endNode { if (BeforeClickedParent != treeNode.Parent) { BeforeClickedParent = null; BeforeClickedRow = -1; } int row_index = treeNode.Parent.Nodes.IndexOf(treeNode); if ((Control.ModifierKeys == Keys.Shift)) { if (BeforeClickedRow >= 0) { for (int i = 0; i < Added.Count; i++) { setEndNodesChecked(Added[i], false, null, null); //이전 것을 모두 undo한다. } Added.Clear(); int min = (BeforeClickedRow < row_index) ? BeforeClickedRow : row_index; int max = (BeforeClickedRow < row_index) ? row_index : BeforeClickedRow; for (int i = min; i <= max; i++) { TriStateTreeNode sibling = treeNode.Parent.Nodes[i] as TriStateTreeNode; setEndNodesChecked(sibling, true, Added, Removed); } if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } Added.Clear(); Removed.Clear(); BeforeClickedRow = -1; } else { BeforeClickedRow = row_index; BeforeClickedParent = treeNode.Parent as TriStateTreeNode; Added.Add(treeNode.Parent.Nodes[row_index]); } } else if (ModifierKeys == Keys.Alt) { if (BeforeClickedRow >= 0) { for (int i = 0; i < Removed.Count; i++) { setEndNodesChecked(Removed[i], true, null, null); //이전 것을 모두 undo한다. } Removed.Clear(); int min = (BeforeClickedRow < row_index) ? BeforeClickedRow : row_index; int max = (BeforeClickedRow < row_index) ? row_index : BeforeClickedRow; for (int i = min; i <= max; i++) { TriStateTreeNode child = treeNode.Parent.Nodes[i] as TriStateTreeNode; setEndNodesChecked(child, false, Added, Removed); } if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } Added.Clear(); Removed.Clear(); BeforeClickedRow = -1; } else { BeforeClickedRow = row_index; BeforeClickedParent = treeNode.Parent as TriStateTreeNode; } } else if (ModifierKeys == Keys.Control) { BeforeClickedRow = row_index; BeforeClickedParent = treeNode.Parent as TriStateTreeNode; bool?state = treeNode.Checked; setEndNodesChecked(treeNode, (state != true), Added, Removed); if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } Added.Clear(); Removed.Clear(); } else { bool?state = treeNode.Checked; setEndNodesChecked(treeNode, (state != true), Added, Removed); if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } Added.Clear(); Removed.Clear(); } CheckParent(treeNode.Parent); } else if (treeNode.Nodes.Count == 0) //end node with no parent { bool?state = treeNode.Checked; treeNode.Checked = (state != true); if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } Added.Clear(); Removed.Clear(); } else //부모노드일때 { bool?state = treeNode.Checked; setEndNodesChecked(treeNode, (state != true), Added, Removed); if (E_OnEndNodeChecked != null && _isEventEnabled) { E_OnEndNodeChecked(this, new RtwTreeNodeCheckedEventArg(_checkedNodes, Added, Removed)); } CheckParent(treeNode); Added.Clear(); Removed.Clear(); } //RunWhenEndNodeClicked(treeNode); //} //catch //{ // _isChecking = false; // return; //} }