public void MenuAddDirectory_Click(object sender, RoutedEventArgs e)
        {
            var selected = TreeFolderBrowser.SelectedItem as PathItem;

            if (selected == null || selected.Parent == null)
            {
                // No files/folders
                selected = new PathItem()
                {
                    IsFolder = true,
                    FullPath = FolderBrowser.FolderPath,
                    Parent   = FolderBrowser.ActivePathItem.Parent,
                    Files    = FolderBrowser.ActivePathItem.Files
                };
                FolderBrowser.ActivePathItem = selected;
            }

            string path;

            if (!selected.IsFolder)
            {
                path = Path.Combine(Path.GetDirectoryName(selected.FullPath), "NewFolder");
            }
            else
            {
                var treeItem = FolderBrowser.GetNestedTreeviewItem(selected);
                if (treeItem != null)
                {
                    treeItem.IsExpanded = true;
                }

                path = Path.Combine(selected.FullPath, "NewFolder");
            }

            var item = new PathItem {
                FullPath   = path,
                IsFolder   = true,
                IsEditing  = true,
                IsSelected = true
            };

            item.SetIcon();

            if (!selected.IsFolder)
            {
                item.Parent = selected.Parent;
            }
            else
            {
                item.Parent = selected;
            }

            item.Parent.Files.Insert(0, item);

            FolderBrowser.SetTreeViewSelectionByItem(item);
        }
        public void MenuAddFile_Click(object sender, RoutedEventArgs e)
        {
            var selected = TreeFolderBrowser.SelectedItem as PathItem;

            if (selected == null)
            {
                // No files/folders
                selected = new PathItem()
                {
                    IsFolder = true, FullPath = FolderBrowser.FolderPath
                };
                FolderBrowser.ActivePathItem = selected;
            }

            string       path;
            TreeViewItem parentTreeViewItem = FolderBrowser.GetNestedTreeviewItem(selected);

            if (selected.FullPath == "..")
            {
                path = Path.Combine(FolderBrowser.FolderPath, "README.md");
            }
            else if (!selected.IsFolder)
            {
                path = Path.Combine(Path.GetDirectoryName(selected.FullPath), "README.md");
            }
            else
            {
                if (parentTreeViewItem != null)
                {
                    parentTreeViewItem.IsExpanded = true;
                }

                path = Path.Combine(selected.FullPath, "README.md");
            }

            if (File.Exists(path))
            {
                path = Path.Combine(Path.GetDirectoryName(path), "NewFile.md");
                if (File.Exists(path))
                {
                    for (int i = 1; i < 30; i++)
                    {
                        path = Path.Combine(Path.GetDirectoryName(path), $"NewFile{i}.md");
                        if (!File.Exists(path))
                        {
                            break;
                        }
                    }
                }
            }

            var item = new PathItem
            {
                FullPath   = path,
                IsFolder   = false,
                IsFile     = true,
                IsEditing  = true,
                IsSelected = true
            };

            item.EditName = item.DisplayName;
            item.SetIcon();

            if (selected.FullPath == "..")
            {
                item.Parent = FolderBrowser.ActivePathItem;     // current path
            }
            else if (!selected.IsFolder)
            {
                item.Parent = selected.Parent;
            }
            else
            {
                item.Parent = selected;
            }

            item.Parent.Files.Insert(0, item);

            Model.Window.Dispatcher.InvokeAsync(
                () => FolderBrowser.SetTreeViewSelectionByItem(item, parentTreeViewItem),
                DispatcherPriority.ApplicationIdle);
        }
        public void MenuDeleteFile_Click(object sender, RoutedEventArgs e)
        {
            var selectedFiles = FolderBrowser.GetSelectedItems();

            if (selectedFiles.Count < 0)
            {
                return;
            }

            StringBuilder sb = new StringBuilder();

            foreach (var file in selectedFiles)
            {
                sb.AppendLine(file.DisplayName);
            }

            if (MessageBox.Show(
                    sb + "\r\n" +
                    "Are you sure?",
                    "Delete File(s)",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Question) != MessageBoxResult.Yes)
            {
                return;
            }

            try
            {
                foreach (var selected in selectedFiles)
                {
                    // Recyle Bin Code can handle both files and directories
                    mmFileUtils.MoveToRecycleBin(selected.FullPath);
                }

                var parent = selectedFiles[0].Parent;

                var index = -1;
                foreach (var selected in selectedFiles)
                {
                    var  file      = parent?.Files?.FirstOrDefault(fl => fl.FullPath == selected.FullPath);
                    bool firstFile = true;
                    if (file != null)
                    {
                        var tab = Model.Window.GetTabFromFilename(file.FullPath);
                        if (tab != null)
                        {
                            Model.Window.CloseTab(tab, dontPromptForSave: true);
                        }

                        if (parent != null)
                        {
                            index = parent.Files.IndexOf(selected);
                            parent.Files.Remove(file);

                            if (firstFile && index > 0)
                            {
                                FolderBrowser.SetTreeViewSelectionByItem(parent.Files[index]);
                                firstFile = false;
                            }
                        }
                    }
                }

                // Delay required to overcome editor focus after MsgBox
                Model.Window.Dispatcher.Delay(700, s => TreeFolderBrowser.Focus());
            }
            catch (Exception ex)
            {
                Model.Window.ShowStatusError("Delete operation failed: " + ex.Message);
            }
        }