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; }
/* * 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; } } }
/* * 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); }
/// <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); }
/* * 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; } }
/* * 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; }
/* * 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); } } }
/// <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; }
/* * 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; } } } } } }