예제 #1
0
        private void TreeViewCustomDraw(ref Message msg, NMTVCUSTOMDRAW tvDraw)
        {
            try
            {
                int hTreeNode = tvDraw.nmcd.dwItemSpec;

                if (hTreeNode == 0)
                {
                    msg.Result = new IntPtr(CommCtrl.CDRF_DODEFAULT);
                    return;
                }

                NuGenTreeNode curNode = NuGenTreeNode.FromHandle(this, new IntPtr(hTreeNode));

                if (curNode == null)
                {
                    msg.Result = new IntPtr(CommCtrl.CDRF_DODEFAULT);
                    return;
                }

                TreeView tree = curNode.TreeView;

                if (tree != null)
                {
                    if (!curNode.HasCheckBox)
                    {
                        this.UncheckNode(curNode.TreeView.Handle, curNode.Handle.ToInt32());
                    }
                }
            }
            finally
            {
                msg.Result = new IntPtr(CommCtrl.CDRF_DODEFAULT);
            }
        }
		/*
		 * GetDropPosition
		 */

		/// <summary>
		/// Determines the drop position: after the node, before the node, or inside the node. If this
		/// operation fails to determine the drop position, <see cref="T:NuGenDropPosition.Nowhere"/> is
		/// returned.
		/// </summary>
		/// <param name="targetTreeNode"></param>
		/// <param name="cursorPosition">Client coordinates.</param>
		/// <returns></returns>
		public NuGenDropPosition GetDropPosition(NuGenTreeNode targetTreeNode, Point cursorPosition)
		{
			if (targetTreeNode == null)
			{
				return NuGenDropPosition.Nowhere;
			}

			Rectangle targetBounds = targetTreeNode.Bounds;

			if (
				(cursorPosition.Y >= targetBounds.Top + this.EdgeSensivity)
				&& (cursorPosition.Y <= targetBounds.Bottom - this.EdgeSensivity)
				)
			{
				return NuGenDropPosition.Inside;
			}
			else if (
				(cursorPosition.Y >= targetBounds.Top)
				&& (cursorPosition.Y <= targetBounds.Top + this.EdgeSensivity)
				)
			{
				return NuGenDropPosition.Before;
			}
			else if (
				(cursorPosition.Y >= targetBounds.Bottom - this.EdgeSensivity)
				&& (cursorPosition.Y <= targetBounds.Bottom)
				)
			{
				return NuGenDropPosition.After;
			}

			return NuGenDropPosition.Nowhere;
		}
예제 #3
0
        /*
         * GetDropPosition
         */

        /// <summary>
        /// Determines the drop position: after the node, before the node, or inside the node. If this
        /// operation fails to determine the drop position, <see cref="T:NuGenDropPosition.Nowhere"/> is
        /// returned.
        /// </summary>
        /// <param name="targetTreeNode"></param>
        /// <param name="cursorPosition">Client coordinates.</param>
        /// <returns></returns>
        public NuGenDropPosition GetDropPosition(NuGenTreeNode targetTreeNode, Point cursorPosition)
        {
            if (targetTreeNode == null)
            {
                return(NuGenDropPosition.Nowhere);
            }

            Rectangle targetBounds = targetTreeNode.Bounds;

            if (
                (cursorPosition.Y >= targetBounds.Top + this.EdgeSensivity) &&
                (cursorPosition.Y <= targetBounds.Bottom - this.EdgeSensivity)
                )
            {
                return(NuGenDropPosition.Inside);
            }
            else if (
                (cursorPosition.Y >= targetBounds.Top) &&
                (cursorPosition.Y <= targetBounds.Top + this.EdgeSensivity)
                )
            {
                return(NuGenDropPosition.Before);
            }
            else if (
                (cursorPosition.Y >= targetBounds.Bottom - this.EdgeSensivity) &&
                (cursorPosition.Y <= targetBounds.Bottom)
                )
            {
                return(NuGenDropPosition.After);
            }

            return(NuGenDropPosition.Nowhere);
        }
        /*
         * RemoveSelectedNode
         */

        /// <summary>
        /// </summary>
        public void RemoveSelectedNode(NuGenTreeNode nodeToRemove)
        {
            if (this.SelectedNodes.Contains(nodeToRemove))
            {
                this.SelectedNodes.Remove(nodeToRemove);
            }
        }
		/*
		 * DoDrop
		 */

		/// <summary>
		/// Invokes service specific nodes merge operation.
		/// </summary>
		/// <exception cref="T:System.ArgumentNullException"><paramref name="selectedNodes"/> is <see langword="null"/>.</exception>
		public override void DoDrop(NuGenTreeNode targetTreeNode, List<NuGenTreeNode> selectedNodes, NuGenDropPosition dropPosition)
		{
			if (selectedNodes == null)
			{
				throw new ArgumentNullException("selectedNodes");
			}

			if (
				targetTreeNode == null
				|| this.CheckSelectedContainTarget(targetTreeNode, selectedNodes)
				|| !this.CheckParent(targetTreeNode, selectedNodes)
				)
			{
				return;
			}

			switch (dropPosition)
			{
				case NuGenDropPosition.After:
				case NuGenDropPosition.Before:
				{
					this.MoveNodes(targetTreeNode, selectedNodes, dropPosition);
					break;
				}
				case NuGenDropPosition.Inside:
				{
					this.InsertNodes(targetTreeNode, this.RetrieveInsertable(selectedNodes));
					break;
				}
			}
		}
예제 #6
0
        /*
         * DoDrop
         */

        /// <summary>
        /// Invokes service specific nodes merge operation.
        /// </summary>
        public virtual void DoDrop(
            NuGenTreeNode targetTreeNode,
            List <NuGenTreeNode> selectedNodes,
            NuGenDropPosition dropPosition
            )
        {
            return;
        }
		public void DeleteTaskTest()
		{
			NuGenTreeNode treeNode = new NuGenTreeNode();

			this._TaskTreeView.Nodes.AddNode(treeNode);
			Assert.AreEqual(this._InitialCount + 1, this._TaskTreeView.Nodes.Count);

			this._TaskTreeView.DeleteTask(treeNode);
			Assert.AreEqual(this._InitialCount, this._TaskTreeView.Nodes.Count);
		}
예제 #8
0
        /// <summary>
        /// </summary>
        /// <param name="m"></param>
        protected virtual void WmNcHitTest(ref Message m)
        {
            if (_IsDragging)
            {
                Point         clientCursorPosition = this.PointToClient(Cursor.Position);
                NuGenTreeNode targetTreeNode       = this.GetNodeAt(clientCursorPosition);
                Rectangle     targetBounds         = Rectangle.Empty;

                NuGenDropPosition dropPosition = this.DragDropService.GetDropPosition(
                    targetTreeNode,
                    clientCursorPosition
                    );

                if (dropPosition != NuGenDropPosition.Nowhere)
                {
                    targetBounds = targetTreeNode.Bounds;
                }

                Point dragLineLeft  = Point.Empty;
                Point dragLineRight = Point.Empty;

                using (Graphics g = Graphics.FromHwnd(this.Handle))
                {
                    NuGenControlPaint.DrawReversibleLine(g, _OldDragLineLeft, _OldDragLineRight);

                    switch (dropPosition)
                    {
                    case NuGenDropPosition.After:
                    {
                        dragLineLeft  = new Point(this.Left, targetBounds.Bottom);
                        dragLineRight = new Point(this.Right, targetBounds.Bottom);

                        NuGenControlPaint.DrawReversibleLine(g, dragLineLeft, dragLineRight);

                        break;
                    }

                    case NuGenDropPosition.Before:
                    {
                        dragLineLeft  = new Point(this.Left, targetBounds.Top);
                        dragLineRight = new Point(this.Right, targetBounds.Top);

                        NuGenControlPaint.DrawReversibleLine(g, dragLineLeft, dragLineRight);

                        break;
                    }
                    }
                }

                _OldDragLineLeft  = dragLineLeft;
                _OldDragLineRight = dragLineRight;
            }

            base.WndProc(ref m);
        }
예제 #9
0
        /*
         * OnAfterCollapse
         */

        /// <summary>
        /// Raises the <see cref="E:System.Windows.Forms.TreeView.AfterCollapse"></see> event.
        /// </summary>
        /// <param name="e">A <see cref="T:System.Windows.Forms.TreeViewEventArgs"></see> that contains the event data.</param>
        protected override void OnAfterCollapse(TreeViewEventArgs e)
        {
            base.OnAfterCollapse(e);

            if (e.Node is NuGenTreeNode)
            {
                NuGenTreeNode treeNode = (NuGenTreeNode)e.Node;

                treeNode.ImageIndex         = treeNode.DefaultImageIndex;
                treeNode.SelectedImageIndex = treeNode.DefaultImageIndex;
            }
        }
예제 #10
0
        /*
         * OnAfterExpand
         */

        /// <summary>
        /// Raises the <see cref="E:System.Windows.Forms.TreeView.AfterExpand"></see> event.
        /// </summary>
        /// <param name="e">A <see cref="T:System.Windows.Forms.TreeViewEventArgs"></see> that contains the event data.</param>
        protected override void OnAfterExpand(TreeViewEventArgs e)
        {
            base.OnAfterExpand(e);

            if (e.Node is NuGenTreeNode)
            {
                NuGenTreeNode treeNode = (NuGenTreeNode)e.Node;

                treeNode.ImageIndex         = treeNode.ExpandedImageIndex;
                treeNode.SelectedImageIndex = treeNode.ExpandedImageIndex;
            }
        }
		/*
		 * CheckParent
		 */

		/// <summary>
		/// Returns <see langword="true"/> if the parent of the <paramref name="targetNode"/> is not equal
		/// to any of the selected nodes' parent.
		/// </summary>
		/// <param name="targetNode"></param>
		/// <param name="selected"></param>
		/// <exception cref="T:System.ArgumentNullException">
		/// <paramref name="selected"/> is <see langword="null"/>.
		/// </exception>
		protected virtual bool CheckParent(NuGenTreeNode targetNode, List<NuGenTreeNode> selected)
		{
			if (selected == null)
			{
				throw new ArgumentNullException("selected");
			}

			foreach (NuGenTreeNode treeNode in selected)
			{
				if (targetNode.Parent == treeNode)
				{
					return false;
				}
			}

			return true;
		}
예제 #12
0
		/*
		 * SetTaskPriority
		 */

		/// <summary>
		/// </summary>
		/// <exception cref="T:System.ArgumentNullException">
		/// <paramref name="targetTaskNode"/> is <see langword="null"/>.
		/// </exception>
		public void SetTaskPriority(NuGenTreeNode targetTaskNode, NuGenTaskPriority priorityToSet)
		{
			if (targetTaskNode == null)
			{
				throw new ArgumentNullException("targetTaskNode");
			}

			if (targetTaskNode is NuGenTaskTreeNode)
			{
				((NuGenTaskTreeNode)targetTaskNode).TaskPriority = priorityToSet;
			}
			else if (targetTaskNode is NuGenFolderTreeNode)
			{
				foreach (NuGenTreeNode treeNode in targetTaskNode.Nodes)
				{
					this.SetTaskPriority(treeNode, priorityToSet);
				}
			}
		}
예제 #13
0
		/// <summary>
		/// </summary>
		/// <exception cref="T:System.ArgumentNullException">
		/// <paramref name="treeNode"/> is <see langword="null"/>.
		/// </exception>
		public void DeleteTask(NuGenTreeNode treeNode)
		{
			if (treeNode == null)
			{
				throw new ArgumentNullException("treeNode");
			}

			if (treeNode is NuGenTaskTreeNodeBase)
			{
				if (!((NuGenTaskTreeNodeBase)treeNode).IsRemovable)
				{
					return;
				}
			}

			this.Nodes.RemoveNode(treeNode);
			this.SelectionService.RemoveSelectedNode(treeNode);
		}
        /*
         * AddSelectedNode
         */

        /// <summary>
        /// </summary>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="selectedNodeToAdd"/> is <see langword="null"/>.
        /// </exception>
        public void AddSelectedNode(NuGenTreeNode selectedNodeToAdd, Keys pressedKeys, MouseButtons pressedMouseButtons)
        {
            if (selectedNodeToAdd == null)
            {
                throw new ArgumentNullException("selectedNodeToAdd");
            }

            if ((pressedMouseButtons & MouseButtons.Right) == MouseButtons.Right)
            {
                if (!this.SelectedNodes.Contains(selectedNodeToAdd))
                {
                    this.SelectedNodes.Clear();
                    this.SelectedNodes.Add(selectedNodeToAdd);
                }

                return;
            }

            if (pressedKeys == Keys.None)
            {
                this.SelectedNodes.Clear();
                this.SelectedNodes.Add(selectedNodeToAdd);
            }
            else if ((pressedKeys & Keys.Control) != 0)
            {
                if (this.SelectedNodes.Count == 0)
                {
                    this.SelectedNodes.Add(selectedNodeToAdd);
                }
                else
                {
                    if (this.SelectedNodes.Contains(selectedNodeToAdd))
                    {
                        this.SelectedNodes.Remove(selectedNodeToAdd);
                    }
                    else
                    {
                        if (this.SelectedNodes[0].Parent == selectedNodeToAdd.Parent)
                        {
                            this.SelectedNodes.Add(selectedNodeToAdd);
                        }
                    }
                }
            }
            else if ((pressedKeys & Keys.Shift) != 0)
            {
                if (this.SelectedNodes.Count == 0)
                {
                    this.SelectedNodes.Add(selectedNodeToAdd);
                }
                else
                {
                    if (this.SelectedNodes[0].Parent == selectedNodeToAdd.Parent)
                    {
                        int firstSelectedNodeIndex = this.SelectedNodes[0].Index;
                        int lastSelectedNodeIndex  = selectedNodeToAdd.Index;

                        NuGenTreeNode currentNode = this.SelectedNodes[0];
                        this.SelectedNodes.Clear();

                        if (lastSelectedNodeIndex > firstSelectedNodeIndex)
                        {
                            lastSelectedNodeIndex++;
                        }
                        else if (lastSelectedNodeIndex < firstSelectedNodeIndex)
                        {
                            this.SelectedNodes.Add(currentNode);
                            currentNode = selectedNodeToAdd;

                            NuGenArgument.Exchange <int>(ref firstSelectedNodeIndex, ref lastSelectedNodeIndex);
                        }

                        for (
                            int nodeIndex = firstSelectedNodeIndex;
                            nodeIndex < lastSelectedNodeIndex;
                            nodeIndex++
                            )
                        {
                            if (currentNode != null)
                            {
                                if (!this.SelectedNodes.Contains(currentNode))
                                {
                                    this.SelectedNodes.Add(currentNode);
                                }

                                currentNode = currentNode.NextVisibleNode;
                            }
                        }
                    }
                }
            }
        }
		/*
		 * DoDrop
		 */

		/// <summary>
		/// Invokes service specific nodes merge operation.
		/// </summary>
		public virtual void DoDrop(
			NuGenTreeNode targetTreeNode,
			List<NuGenTreeNode> selectedNodes,
			NuGenDropPosition dropPosition
			)
		{
			return;
		}
		/*
		 * RemoveSelectedNode
		 */

		/// <summary>
		/// </summary>
		public void RemoveSelectedNode(NuGenTreeNode nodeToRemove)
		{
			if (this.SelectedNodes.Contains(nodeToRemove))
			{
				this.SelectedNodes.Remove(nodeToRemove);
			}
		}
		/*
		 * MoveNodes
		 */

		/// <summary>
		/// Moves selected nodes to the new location specified by the <paramref name="targetNode"/> index.
		/// </summary>
		/// <param name="targetNode"></param>
		/// <param name="selected"></param>
		/// <param name="dropPosition"></param>
		/// <exception cref="T:System.ArgumentNullException">
		/// <paramref name="targetNode"/> is <see langword="null"/>
		/// -or-
		/// <paramref name="selected"/> is <see langword="null"?/>
		/// </exception>
		protected virtual void MoveNodes(NuGenTreeNode targetNode, List<NuGenTreeNode> selected, NuGenDropPosition dropPosition)
		{
			if (targetNode == null)
			{
				throw new ArgumentNullException("targetNode");
			}

			if (selected == null)
			{
				throw new ArgumentNullException("selected");
			}

			int targetIndex = 0;

			if (dropPosition == NuGenDropPosition.After)
			{
				targetIndex = targetNode.Index + 1;
				this.RemoveNodesFromParents(selected);
			}
			else if (dropPosition == NuGenDropPosition.Before)
			{
				this.RemoveNodesFromParents(selected);
				targetIndex = targetNode.Index;
			}
			else
			{
				return;
			}

			foreach (NuGenTreeNode treeNode in selected)
			{
				if (targetNode.Parent != null)
				{
					targetNode.Parent.Nodes.InsertNode(targetIndex, treeNode);
				}
				else if (targetNode.TreeView != null)
				{
					targetNode.TreeView.Nodes.Insert(targetIndex, treeNode);
				}
				else
				{
					return;
				}
			}
		}
		/*
		 * InsertNodes
		 */

		/// <summary>
		/// Inserts selected nodes into the specified <paramref name="targetNode"/>.
		/// </summary>
		/// <param name="targetNode"></param>
		/// <param name="selected"></param>
		/// <exception cref="ArgumentNullException">
		/// <paramref name="selected"/> is <see langword="null"/>.
		/// </exception>
		protected virtual void InsertNodes(NuGenTreeNode targetNode, List<NuGenTreeNode> selected)
		{
			if (
				targetNode is NuGenFolderTreeNode
				&& ((NuGenFolderTreeNode)targetNode).IsRemovable
				)
			{
				this.RemoveNodesFromParents(selected);

				foreach (NuGenTreeNode treeNode in selected)
				{
					targetNode.Nodes.AddNode(treeNode);
				}

				targetNode.Expand();
			}
		}
		/*
		 * AddSelectedNode
		 */

		/// <summary>
		/// </summary>
		/// <exception cref="T:System.ArgumentNullException">
		/// <paramref name="selectedNodeToAdd"/> is <see langword="null"/>.
		/// </exception>
		public void AddSelectedNode(NuGenTreeNode selectedNodeToAdd, Keys pressedKeys, MouseButtons pressedMouseButtons)
		{
			if (selectedNodeToAdd == null)
			{
				throw new ArgumentNullException("selectedNodeToAdd");
			}

			if ((pressedMouseButtons & MouseButtons.Right) == MouseButtons.Right)
			{
				if (!this.SelectedNodes.Contains(selectedNodeToAdd))
				{
					this.SelectedNodes.Clear();
					this.SelectedNodes.Add(selectedNodeToAdd);
				}

				return;
			}

			if (pressedKeys == Keys.None)
			{
				this.SelectedNodes.Clear();
				this.SelectedNodes.Add(selectedNodeToAdd);
			}
			else if ((pressedKeys & Keys.Control) != 0)
			{
				if (this.SelectedNodes.Count == 0)
				{
					this.SelectedNodes.Add(selectedNodeToAdd);
				}
				else
				{
					if (this.SelectedNodes.Contains(selectedNodeToAdd))
					{
						this.SelectedNodes.Remove(selectedNodeToAdd);
					}
					else
					{
						if (this.SelectedNodes[0].Parent == selectedNodeToAdd.Parent)
						{
							this.SelectedNodes.Add(selectedNodeToAdd);
						}
					}
				}
			}
			else if ((pressedKeys & Keys.Shift) != 0)
			{
				if (this.SelectedNodes.Count == 0)
				{
					this.SelectedNodes.Add(selectedNodeToAdd);
				}
				else
				{
					if (this.SelectedNodes[0].Parent == selectedNodeToAdd.Parent)
					{
						int firstSelectedNodeIndex = this.SelectedNodes[0].Index;
						int lastSelectedNodeIndex = selectedNodeToAdd.Index;

						NuGenTreeNode currentNode = this.SelectedNodes[0];
						this.SelectedNodes.Clear();

						if (lastSelectedNodeIndex > firstSelectedNodeIndex)
						{
							lastSelectedNodeIndex++;
						}
						else if (lastSelectedNodeIndex < firstSelectedNodeIndex)
						{
							this.SelectedNodes.Add(currentNode);
							currentNode = selectedNodeToAdd;

							NuGenArgument.Exchange<int>(ref firstSelectedNodeIndex, ref lastSelectedNodeIndex);
						}

						for (
							int nodeIndex = firstSelectedNodeIndex;
							nodeIndex < lastSelectedNodeIndex;
							nodeIndex++
							)
						{
							if (currentNode != null)
							{
								if (!this.SelectedNodes.Contains(currentNode))
								{
									this.SelectedNodes.Add(currentNode);
								}

								currentNode = currentNode.NextVisibleNode;
							}
						}
					}
				}
			}
		}