private void tv_DragDrop(object sender, DragEventArgs e)
        {
            var invalidFilesList = new List <string>();

            // Retrieve the current selected node
            var treeview    = (TreeView)sender;
            var location    = tv.PointToScreen(Point.Empty);
            var currentNode = treeview.GetNodeAt(e.X - location.X, e.Y - location.Y);

            var files = (string[])e.Data.GetData(DataFormats.FileDrop);

            foreach (var file in files.OrderBy(f => !File.GetAttributes(f).HasFlag(FileAttributes.Directory)).ThenBy(f => Path.GetFileName(f)))
            {
                if (File.GetAttributes(file).HasFlag(FileAttributes.Directory))
                {
                    var di = new DirectoryInfo(file);

                    AddSingleFolder((FolderNode)currentNode, di.Name, di);

                    continue;
                }

                var fi = new FileInfo(file);

                AddFilesAsNodes((FolderNode)currentNode, new List <string> {
                    fi.FullName
                }, invalidFilesList);

                // Create file if the current node has a filepath in its tag
                // this means, wen resources come from disk
                if (Directory.Exists(((FolderNode)currentNode).FolderPath))
                {
                    var resultingFileName = Path.Combine(((FolderNode)currentNode).FolderPath, fi.Name);
                    if (resultingFileName.ToLower() != fi.FullName.ToLower())
                    {
                        if (DialogResult.Yes == MessageBox.Show(
                                $@"Would you like to also copy this file to folder '{((FolderNode)currentNode).FolderPath}'?",
                                @"Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                        {
                            File.WriteAllBytes(resultingFileName, File.ReadAllBytes(file));
                        }
                    }
                }
            }

            if (invalidFilesList.Any())
            {
                ShowInvalidFilesRequested?.Invoke(this, new InvalidFilesEventArgs(invalidFilesList));
            }

            tv.Sort();
        }
        public void DisplayNodes(IEnumerable <Webresource> resources, Entity theSolution = null, bool expanded = false)
        {
            Invoke(new Action(() =>
            {
                //pnlTop.Visible = false;

                solution = theSolution;
                if (solution != null)
                {
                    lblSolution.Text =
                        $@"{solution.GetAttributeValue<string>("friendlyname")} ({solution.GetAttributeValue<string>("version")})";
                    pnlSolution.Visible = true;
                }
            }));

            var resourcesToDisplay = mainControl.WebresourcesCache.Where(w => txtSearch.Text.Length == 0 ||
                                                                         w.ToString().ToLower()
                                                                         .Contains(txtSearch.Text.ToLower()) ||
                                                                         chkSearchInContent.Checked &&
                                                                         w.UpdatedStringContent.ToLower()
                                                                         .Contains(txtSearch.Text.ToLower())).ToList();

            if (!resourcesToDisplay.Any() && txtSearch.Text.Length > 0)
            {
                txtSearch.BackColor = Color.LightCoral;
                return;
            }

            var rootNodes = new List <TreeNode>();

            var invalidFilesList = new List <string>();

            var orderedResources = resourcesToDisplay.OrderBy(r => r.Name.ToLower());

            foreach (var resource in orderedResources)
            {
                if (Webresource.IsNameValid(resource.Name, OrganizationMajorVersion) &&
                    Webresource.IsValidExtension(Path.GetExtension(resource.Name), Settings))
                {
                    var nameParts = resource.Name.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

                    if (nameParts.Length == 1)
                    {
                        var node = AddSingleNode(resource, nameParts);
                        if (node != null)
                        {
                            rootNodes.Add(node);
                        }
                    }
                    else
                    {
                        AddFolderNode(resource, nameParts, rootNodes);
                    }
                }
                else
                {
                    invalidFilesList.Add(resource.Name);
                }
            }

            if (invalidFilesList.Any())
            {
                ShowInvalidFilesRequested?.Invoke(this, new InvalidFilesEventArgs(invalidFilesList));
            }

            tv.Nodes.Clear();
            tv.Nodes.AddRange(rootNodes.ToArray());
            tv.Sort();

            if (expanded)
            {
                tv.ExpandAll();
            }
        }