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