Ejemplo n.º 1
0
        public TriStateTreeNode AddChild(TriStateTreeNode parent, String text)
        {
            TriStateTreeNode node = new TriStateTreeNode(text);

            parent.Nodes.Add(node);
            return(node);
        }
Ejemplo n.º 2
0
        /*
         * [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);
        }
Ejemplo n.º 3
0
 /// <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);
 }
Ejemplo n.º 4
0
        /// <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;
 }
Ejemplo n.º 6
0
 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];
     }
 }
Ejemplo n.º 7
0
 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;
     }
 }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
 public static TreeNode ConvertToTreeNode(TriStateTreeNode node)
 {
     return(node);
 }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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));
            }
        }
Ejemplo n.º 12
0
        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;
            //}
        }