public void MenuUndoGit_Click(object sende, RoutedEventArgs e)
        {
            var selectedFiles = FolderBrowser.GetSelectedItems();

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

            var gh = new GitHelper();

            foreach (var selected in selectedFiles)
            {
                if (selected == null)
                {
                    continue;
                }

                if (selected.FileStatus != LibGit2Sharp.FileStatus.ModifiedInIndex &&
                    selected.FileStatus != LibGit2Sharp.FileStatus.ModifiedInWorkdir)
                {
                    continue;
                }

                gh.UndoChanges(selected.FullPath);
            }
        }
        public void FileBrowserCopyFile(bool isCut = false)
        {
            var selectedFiles = FolderBrowser.GetSelectedItems();

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

            var files = selectedFiles.Select(pi => pi.FullPath).ToArray();

            IDataObject  data = new DataObject(DataFormats.FileDrop, files);
            MemoryStream memo = new MemoryStream(4);

            byte[] bytes = new byte[] { (byte)(isCut ? 2 : 5), 0, 0, 0 };
            memo.Write(bytes, 0, bytes.Length);
            data.SetData("Preferred DropEffect", memo);
            Clipboard.SetDataObject(data);

            if (isCut)
            {
                foreach (var selectedFile in selectedFiles)
                {
                    selectedFile.IsCut = true;
                }
            }

            string fileString = files.Length == 1 ? "1 item" : files.Length + " items";

            Model.Window.ShowStatusSuccess($"{fileString} {(isCut ? "cut" : "copied")} to the clipboard.");
        }
        public void MenuOptimizeImage_Click(object sender, RoutedEventArgs e)
        {
            var selectedItems = FolderBrowser.GetSelectedItems();

            if (selectedItems.Count < 1)
            {
                return;
            }

            foreach (var selected in selectedItems)
            {
                if (!mmFileUtils.IsImage(selected.FullPath))
                {
                    continue;
                }

                long filesize = new FileInfo(selected.FullPath).Length;
                Model.Window.ShowStatusProgress("Optimizing image " + selected.FullPath, 10000);

                mmFileUtils.OptimizeImage(selected.FullPath, 0, new Action <bool>((res) =>
                {
                    FolderBrowser.Dispatcher.Invoke(() =>
                    {
                        var fi         = new FileInfo(selected.FullPath);
                        long filesize2 = fi.Length;

                        decimal diff = 0;
                        if (filesize2 < filesize)
                        {
                            diff = (Convert.ToDecimal(filesize2) / Convert.ToDecimal(filesize)) * 100;
                        }
                        if (diff > 0)
                        {
                            mmApp.Model.Window.ShowStatusSuccess(
                                $"Image size reduced by {(100 - diff):n2}%. New size: {(Convert.ToDecimal(filesize2) / 1000):n1}kb");
                            Model.Window.OpenBrowserTab(selected.FullPath, isImageFile: true);
                        }
                        else
                        {
                            mmApp.Model.Window.ShowStatusError("Image optimization couldn't improve image size.",
                                                               5000);
                        }
                    }, DispatcherPriority.ApplicationIdle);
                }));
            }
        }
        public void MenuEditImage_Click(object sender, RoutedEventArgs e)
        {
            var selectedItems = FolderBrowser.GetSelectedItems();

            if (selectedItems.Count < 1)
            {
                return;
            }

            foreach (var selected in selectedItems)
            {
                if (mmFileUtils.IsImage(selected.FullPath))
                {
                    mmFileUtils.OpenImageInImageEditor(selected.FullPath);
                }
            }
        }
        public void MenuOpenInEditor_Click(object sender, RoutedEventArgs e)
        {
            var selectedItems = FolderBrowser.GetSelectedItems();

            if (selectedItems.Count < 1)
            {
                return;
            }

            foreach (var selected in selectedItems)
            {
                if (selected.IsFolder)
                {
                    ShellUtils.GoUrl(selected.FullPath);
                }
                else
                {
                    Model.Window.OpenTab(selected.FullPath, rebindTabHeaders: true);
                }
            }
        }
        public void MenuOpenWithShell_Click(object sender, RoutedEventArgs e)
        {
            var selectedItems = FolderBrowser.GetSelectedItems();

            if (selectedItems.Count < 1)
            {
                return;
            }

            foreach (var selected in selectedItems)
            {
                try
                {
                    ShellUtils.GoUrl(selected.FullPath);
                }
                catch
                {
                    Model.Window.ShowStatusError($"Unable to open file {selected.FullPath}");
                }
            }
        }
        public void ShowContextMenu()
        {
            ClearMenu();

            var  selectedItems         = FolderBrowser.GetSelectedItems();
            bool multipleItemsSelected = selectedItems.Count > 1;

            var cm       = ContextMenu;
            var pathItem = FolderBrowser.GetSelectedItem();

            if (pathItem == null)
            {
                return;
            }

            cm.Items.Clear();

            var ci = new MenuItem();

            ci.Header           = "_New File";
            ci.InputGestureText = "Ctrl-N";
            ci.Click           += MenuAddFile_Click;
            cm.Items.Add(ci);

            ci                  = new MenuItem();
            ci.Header           = "New Folder";
            ci.InputGestureText = "F8";
            ci.Click           += MenuAddDirectory_Click;
            cm.Items.Add(ci);

            cm.Items.Add(new Separator());


            var ciOpen = new MenuItem()
            {
                Header = "Open"
            };

            cm.Items.Add(ciOpen);

            if (pathItem.IsImage)
            {
                cm.Items.Add(new Separator());

                ci        = new MenuItem();
                ci.Header = "Show Image";
                ci.Name   = "FBCM_ShowImage";
                ci.Click += MenuShowImage_Click;
                cm.Items.Add(ci);

                ci        = new MenuItem();
                ci.Header = "Edit Image";
                ci.Name   = "FBCM_EditImage";
                ci.Click += MenuEditImage_Click;
                cm.Items.Add(ci);

                ci        = new MenuItem();
                ci.Header = "Optimize Image";
                ci.Name   = "FBCM_OptimizeImage";
                ci.Click += MenuOptimizeImage_Click;
                cm.Items.Add(ci);

                cm.Items.Add(new Separator());
            }
            else
            {
                if (pathItem.IsFile)
                {
                    ci        = new MenuItem();
                    ci.Header = "Open in Editor";
                    ci.Name   = "FBCM_OpenInEditor";
                    ci.Click += MenuOpenInEditor_Click;
                    ciOpen.Items.Add(ci);
                }

                ci        = new MenuItem();
                ci.Header = "Open with Shell";
                ci.Name   = "FBCM_OpenWithShell";
                ci.Click += MenuOpenWithShell_Click;
                ciOpen.Items.Add(ci);
            }


            ci                  = new MenuItem();
            ci.Header           = "Open With...";
            ci.Name             = "FBCM_OpenWith";
            ci.IsEnabled        = !multipleItemsSelected;
            ci.Command          = Model.Commands.OpenWithCommand;
            ci.CommandParameter = pathItem.FullPath;
            ciOpen.Items.Add(ci);



            ci        = new MenuItem();
            ci.Header = "Show in Explorer";
            ci.Name   = "FBCM_ShowInExplorer";
            ci.Click += MenuOpenInExplorer_Click;
            cm.Items.Add(ci);

            ci        = new MenuItem();
            ci.Header = "Open in Terminal";
            ci.Name   = "FBCM_OpenInTerminal";
            ci.Click += MenuOpenTerminal_Click;
            cm.Items.Add(ci);

            if (pathItem.IsFolder)
            {
                ci        = new MenuItem();
                ci.Header = "Open Folder Browser here";
                ci.Name   = "FBCM_OpenFolderBrowser";
                ci.Click += MenuOpenFolderBrowserHere_Click;
                cm.Items.Add(ci);
            }


            cm.Items.Add(new Separator());


            ci = new MenuItem();

            if (pathItem.DisplayName != "..")
            {
                ci.Header           = "Delete";
                ci.Name             = "FBCM_Delete";
                ci.InputGestureText = "Del";
                ci.Click           += MenuDeleteFile_Click;
                cm.Items.Add(ci);

                ci                  = new MenuItem();
                ci.Header           = "Rename";
                ci.Name             = "FBCM_Rename";
                ci.InputGestureText = "F2";
                ci.Click           += MenuRenameFile_Click;
                cm.Items.Add(ci);

                cm.Items.Add(new Separator());

                ci = new MenuItem
                {
                    Header           = "Cut",
                    ToolTip          = "Cut currently selected file(s)",
                    InputGestureText = "Ctrl-X",
                };
                ci.Name   = "FBCM_CutFile";
                ci.Click += MenuCutFile_Click;
                cm.Items.Add(ci);

                ci = new MenuItem
                {
                    Header           = "Copy",
                    ToolTip          = "Copy currently selected file(s)",
                    InputGestureText = "Ctrl-C",
                };
                ci.Click += MenuCopyFile_Click;
                cm.Items.Add(ci);

                if (Clipboard.ContainsFileDropList())
                {
                    ci = new MenuItem
                    {
                        Header           = "Paste",
                        InputGestureText = "Ctrl-V",
                        ToolTip          = "Paste copied files from the Folder Browser or Explorer into the current folder."
                    };
                    ci.Name   = "FBCM_Paste";
                    ci.Click += MenuPasteFile_Click;
                    cm.Items.Add(ci);
                }
                else if (Clipboard.ContainsImage())
                {
                    ci                  = new MenuItem();
                    ci.Header           = "Paste Clipboard Image as File";
                    ci.Name             = "FBCM_PasteImageAsFile";
                    ci.Command          = Model.Commands.PasteImageToFileCommand;
                    ci.CommandParameter = pathItem.FullPath;
                    cm.Items.Add(ci);
                }

                cm.Items.Add(new Separator());
            }

            ci                  = new MenuItem();
            ci.Header           = "Find in Files";
            ci.Name             = "FBCM_FindInFiles";
            ci.InputGestureText = "Ctrl-F";
            ci.Click           += FolderBrowser.MenuFindFiles_Click;
            cm.Items.Add(ci);

            ci                  = new MenuItem();
            ci.Header           = "Add to Favorites";
            ci.Name             = "FBCM_AddToFavorites";
            ci.Command          = Model.Commands.AddFavoriteCommand;
            ci.CommandParameter = pathItem.FullPath;
            cm.Items.Add(ci);

            cm.Items.Add(new Separator());

            bool   isGit        = false;
            var    git          = new GitHelper();
            string gitRemoteUrl = null;

            using (var repo = git.OpenRepository(pathItem.FullPath))
            {
                isGit = repo != null;
                if (isGit)
                {
                    gitRemoteUrl = repo.Network?.Remotes.FirstOrDefault()?.Url;
                }
            }

            if (isGit)
            {
                var ciGit = new MenuItem()
                {
                    Header = "Git"
                };
                ci.Name = "FBCM_GitSubmenu";
                cm.Items.Add(ciGit);

                ci                  = new MenuItem();
                ci.Header           = "Commit to _Git...";
                ci.Name             = "FBCM_GIT_Commit";
                ci.InputGestureText = "Ctrl-G";
                ci.Click           += MenuCommitGit_Click;
                ciGit.Items.Add(ci);

                if (pathItem.FileStatus == LibGit2Sharp.FileStatus.ModifiedInIndex ||
                    pathItem.FileStatus == LibGit2Sharp.FileStatus.ModifiedInWorkdir)
                {
                    ci                  = new MenuItem();
                    ci.Name             = "FBCM_GIT_UndoChanges";
                    ci.Header           = "_Undo Changes in Git";
                    ci.InputGestureText = "Ctrl-Z";
                    ci.Click           += MenuUndoGit_Click;
                    ciGit.Items.Add(ci);
                }

                ci           = new MenuItem();
                ci.Header    = "Open Folder in Git Client";
                ci.Name      = "FBCM_GIT_OpenFolderInGitClient";
                ci.Click    += MenuGitClient_Click;
                ci.IsEnabled = Model.Configuration.Git.GitClientExecutable != null &&
                               File.Exists(Model.Configuration.Git.GitClientExecutable);
                ciGit.Items.Add(ci);

                if (pathItem.FileStatus != LibGit2Sharp.FileStatus.Nonexistent)
                {
                    if (gitRemoteUrl != null && gitRemoteUrl.Contains("github.com"))
                    {
                        ci                  = new MenuItem();
                        ci.Header           = "Open on GitHub";
                        ci.Name             = "FBCM_PasteImageAsFile";
                        ci.Command          = mmApp.Model.Commands.Git.OpenOnGithubCommand;
                        ci.CommandParameter = pathItem.FullPath;
                        ciGit.Items.Add(ci);
                    }
                }

                cm.Items.Add(new Separator());
            }


            ci        = new MenuItem();
            ci.Header = "Copy Path to Clipboard";
            ci.Name   = "FBCM_CopyPathToClipboard";
            ci.Click += MenuCopyPathToClipboard_Click;
            cm.Items.Add(ci);


            cm.IsOpen = true;

            Show();
        }
        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);
            }
        }