/// <summary>
        /// Event for Drag Drop of a project node.
        /// </summary>
        /// <param name="sender">Sending object.</param>
        /// <param name="e">Drag event args.</param>
        private void ProjectExplorerTreeViewDragDrop(Object sender, DragEventArgs e)
        {
            // Retrieve the client coordinates of the drop location.
            Point targetPoint = this.projectExplorerTreeView.PointToClient(new Point(e.X, e.Y));

            // Retrieve the node at the drop location.
            TreeNodeAdv targetNodeAdv = this.projectExplorerTreeView.GetNodeAt(targetPoint);

            // Retrieve the node that was dragged.
            TreeNodeAdv[] draggedNodesAdv = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];

            if (draggedNodesAdv.Count() <= 0)
            {
                return;
            }

            TreeNodeAdv draggedNodeAdv = draggedNodesAdv[0];

            if (draggedNodeAdv != null && targetNodeAdv != null && draggedNodeAdv != targetNodeAdv)
            {
                ProjectRoot projectRoot = this.ProjectExplorerViewModel.ProjectRoot;
                ProjectItem draggedItem = this.GetProjectItemFromNode(draggedNodeAdv);
                ProjectItem targetItem  = this.GetProjectItemFromNode(targetNodeAdv);

                projectRoot?.BuildParents();

                if (!(draggedItem is FolderItem) || !(draggedItem as FolderItem).HasNode(targetItem))
                {
                    switch (this.projectExplorerTreeView.DropPosition.Position)
                    {
                    case NodePosition.Before:
                        projectRoot.RemoveNode(draggedItem);
                        targetItem.Parent?.AddSibling(targetItem, draggedItem, after: false);
                        break;

                    case NodePosition.Inside:
                        if (targetItem is FolderItem)
                        {
                            projectRoot.RemoveNode(draggedItem);
                            (targetItem as FolderItem).AddChild(draggedItem);
                        }

                        break;

                    case NodePosition.After:
                        projectRoot.RemoveNode(draggedItem);
                        targetItem.Parent?.AddSibling(targetItem, draggedItem, after: true);
                        break;
                    }
                }

                this.UpdateStructure(this.ProjectExplorerViewModel.ProjectRoot);
            }
        }