/// <summary>
        /// Recursively contructs the nodes to add to the tree model.
        /// </summary>
        /// <param name="projectItem">The current project item for which to build a node.</param>
        /// <param name="parent">The parent project item of the added project item.</param>
        private void BuildNodes(ProjectItem projectItem, ProjectItem parent = null)
        {
            if (projectItem == null)
            {
                return;
            }

            Bitmap image = null;

            if (projectItem is AddressItem)
            {
                image = ImageUtils.BitmapImageToBitmap(Images.CollectValues);
            }
            else if (projectItem is ScriptItem)
            {
                image = ImageUtils.BitmapImageToBitmap(Images.CollectValues);
            }
            else if (projectItem is FolderItem)
            {
                image = ImageUtils.BitmapImageToBitmap(Images.Open);
            }

            image?.MakeTransparent();

            // Create new node to insert
            ProjectNode projectNode = new ProjectNode(projectItem.Description);

            projectNode.ProjectItem       = projectItem;
            projectNode.EntryValuePreview = (projectItem is AddressItem) ? (projectItem as AddressItem).Value?.ToString() : String.Empty;
            projectNode.EntryIcon         = image;
            projectNode.IsChecked         = projectItem.IsActivated;

            if (parent != null && this.nodeCache.ContainsKey(parent))
            {
                ProjectNode result;
                if (this.nodeCache.TryGetValue(parent, out result))
                {
                    result.Nodes.Add(projectNode);
                }
            }
            else
            {
                this.projectTree.Nodes.Add(projectNode);
            }

            this.nodeCache.Add(projectItem, projectNode);

            if (projectItem is FolderItem)
            {
                FolderItem folderItem = projectItem as FolderItem;

                foreach (ProjectItem child in folderItem.Children.ToArray())
                {
                    this.BuildNodes(child, projectItem);
                }
            }
        }
        /// <summary>
        /// Initialize all windows forms components.
        /// </summary>
        private void InitializeDesigner()
        {
            NodeCheckBox entryCheckBox = new NodeCheckBox();

            entryCheckBox.DataPropertyName          = "IsChecked";
            entryCheckBox.EditEnabled               = true;
            entryCheckBox.LeftMargin                = 0;
            entryCheckBox.ParentColumn              = null;
            entryCheckBox.IsEditEnabledValueNeeded += this.CheckIndex;

            NodeIcon entryIcon = new NodeIcon();

            entryIcon.DataPropertyName = "EntryIcon";
            entryIcon.LeftMargin       = 1;
            entryIcon.ParentColumn     = null;
            entryIcon.ScaleMode        = ImageScaleMode.Clip;

            NodeTextBox entryDescription = new NodeTextBox();

            entryDescription.DataPropertyName         = "EntryDescription";
            entryDescription.IncrementalSearchEnabled = true;
            entryDescription.LeftMargin   = 3;
            entryDescription.ParentColumn = null;
            entryDescription.DrawText    += this.EntryDescriptionDrawText;

            NodeTextBox entryValuePreview = new NodeTextBox();

            entryValuePreview.DataPropertyName         = "EntryValuePreview";
            entryValuePreview.IncrementalSearchEnabled = true;
            entryValuePreview.LeftMargin   = 3;
            entryValuePreview.ParentColumn = null;
            entryValuePreview.DrawText    += this.EntryValuePreviewDrawText;

            this.projectItemToolTip       = new ToolTip();
            this.toggleSelectionMenuItem  = new ToolStripMenuItem("Toggle");
            this.compileSelectionMenuItem = new ToolStripMenuItem("Compile");
            this.addNewItemMenuItem       = new ToolStripMenuItem("Add New...");
            this.deleteSelectionMenuItem  = new ToolStripMenuItem("Delete");
            this.copySelectionMenuItem    = new ToolStripMenuItem("Copy");
            this.cutSelectionMenuItem     = new ToolStripMenuItem("Cut");
            this.pasteSelectionMenuItem   = new ToolStripMenuItem("Paste");
            this.addNewFolderMenuItem     = new ToolStripMenuItem("Add Folder", ImageUtils.BitmapImageToBitmap(Images.Open));
            this.addNewAddressMenuItem    = new ToolStripMenuItem("Add Address", ImageUtils.BitmapImageToBitmap(Images.CollectValues));
            this.addNewScriptMenuItem     = new ToolStripMenuItem("Add Script", ImageUtils.BitmapImageToBitmap(Images.CollectValues));
            this.contextMenuStrip         = new ContextMenuStrip();

            KeysConverter keysConverter = new KeysConverter();

            this.toggleSelectionMenuItem.ShortcutKeyDisplayString = keysConverter.ConvertToString(Keys.Space);
            this.copySelectionMenuItem.ShortcutKeyDisplayString   = keysConverter.ConvertToString(Keys.Control | Keys.C);
            this.cutSelectionMenuItem.ShortcutKeyDisplayString    = keysConverter.ConvertToString(Keys.Control | Keys.X);
            this.pasteSelectionMenuItem.ShortcutKeyDisplayString  = keysConverter.ConvertToString(Keys.Control | Keys.V);
            this.deleteSelectionMenuItem.ShortcutKeyDisplayString = keysConverter.ConvertToString(Keys.Delete);

            this.toggleSelectionMenuItem.Click  += this.ToggleSelectionMenuItemClick;
            this.compileSelectionMenuItem.Click += this.CompileSelectionMenuItemClick;
            this.deleteSelectionMenuItem.Click  += this.DeleteSelectionMenuItemClick;
            this.copySelectionMenuItem.Click    += this.CopySelectionMenuItemClick;
            this.cutSelectionMenuItem.Click     += this.CutSelectionMenuItemClick;
            this.pasteSelectionMenuItem.Click   += this.PasteSelectionMenuItemClick;
            this.addNewFolderMenuItem.Click     += this.AddNewFolderMenuItemClick;
            this.addNewAddressMenuItem.Click    += this.AddNewAddressMenuItemClick;
            this.addNewScriptMenuItem.Click     += this.AddNewScriptMenuItemClick;
            this.contextMenuStrip.Opening       += this.ContextMenuStripOpening;

            this.addNewItemMenuItem.DropDownItems.Add(this.addNewFolderMenuItem);
            this.addNewItemMenuItem.DropDownItems.Add(this.addNewAddressMenuItem);
            this.addNewItemMenuItem.DropDownItems.Add(this.addNewScriptMenuItem);

            this.contextMenuStrip.Items.Add(this.toggleSelectionMenuItem);
            this.contextMenuStrip.Items.Add(this.compileSelectionMenuItem);
            this.contextMenuStrip.Items.Add(this.addNewItemMenuItem);
            this.contextMenuStrip.Items.Add(this.deleteSelectionMenuItem);
            this.contextMenuStrip.Items.Add(new ToolStripSeparator());
            this.contextMenuStrip.Items.Add(this.copySelectionMenuItem);
            this.contextMenuStrip.Items.Add(this.cutSelectionMenuItem);
            this.contextMenuStrip.Items.Add(this.pasteSelectionMenuItem);

            this.projectExplorerTreeView = new TreeViewAdv();
            this.projectExplorerTreeView.NodeControls.Add(entryCheckBox);
            this.projectExplorerTreeView.NodeControls.Add(entryIcon);
            this.projectExplorerTreeView.NodeControls.Add(entryDescription);
            this.projectExplorerTreeView.NodeControls.Add(entryValuePreview);
            this.projectExplorerTreeView.SelectionMode    = TreeSelectionMode.Multi;
            this.projectExplorerTreeView.BorderStyle      = BorderStyle.None;
            this.projectExplorerTreeView.Model            = this.projectTree;
            this.projectExplorerTreeView.AllowDrop        = true;
            this.projectExplorerTreeView.FullRowSelect    = true;
            this.projectExplorerTreeView.ContextMenuStrip = this.contextMenuStrip;

            this.projectExplorerTreeView.ItemDrag             += this.ProjectExplorerTreeViewItemDrag;
            this.projectExplorerTreeView.NodeMouseDoubleClick += this.ProjectExplorerTreeViewNodeMouseDoubleClick;
            this.projectExplorerTreeView.SelectionChanged     += this.ProjectExplorerTreeViewSelectionChanged;
            this.projectExplorerTreeView.DragDrop             += this.ProjectExplorerTreeViewDragDrop;
            this.projectExplorerTreeView.DragEnter            += this.ProjectExplorerTreeViewDragEnter;
            this.projectExplorerTreeView.DragOver             += this.ProjectExplorerTreeViewDragOver;
            this.projectExplorerTreeView.MouseMove            += this.ProjectExplorerTreeViewMouseMove;

            this.projectExplorerTreeView.BackColor         = DarkBrushes.BaseColor3;
            this.projectExplorerTreeView.ForeColor         = DarkBrushes.BaseColor2;
            this.projectExplorerTreeView.DragDropMarkColor = DarkBrushes.BaseColor11;
            this.projectExplorerTreeView.LineColor         = DarkBrushes.BaseColor11;
        }