public override bool AcceptInput(ConsoleKeyInfo keyPressed, GraphicsContext g) { if (_escPressedOnce) { if (keyPressed.Key == ConsoleKey.Escape) { if (_app.Tasks.GetTasks().Count != 0) { _app.ShowHelpMessage("Tasks are still running, try again later", g, ConsoleColor.Red); _escPressedOnce = false; return(true); } g.Clear(); Environment.Exit(0); return(true); } _app.ShowHelpMessage("Exit cancelled (press Escape twice to exit)", g); _escPressedOnce = false; } var b = base.AcceptInput(keyPressed, g); if (b) { return(true); } if (keyPressed.Key == ConsoleKey.Escape) { _app.ShowHelpMessage("Press Escape again to exit SCFE", g, ConsoleColor.Yellow); _escPressedOnce = true; return(true); } if (_app.CurrentMode.SearchEnabled && keyPressed.KeyChar != (char)0 && !char.IsControl(keyPressed.KeyChar) && keyPressed.Key != ConsoleKey.Enter && (keyPressed.Modifiers & ConsoleModifiers.Control) == 0 && (keyPressed.Modifiers & ConsoleModifiers.Alt) == 0) { SetFocused(false, g); _app.TextBox.Text += keyPressed.KeyChar; _app.TextBox.CaretPosition += 1; _app.TextBox.Print(_app.TextBox.Width - 5, g); if (_app.TextBoxHandler == null) { _app.SwitchToFolder(_app.CurrentDir, g); } _app.TextBox.SetFocused(true, g); return(true); } return(false); }
public Dictionary <string, Action <object, ActionEventArgs> > GetActions() { return(new Dictionary <string, Action <object, ActionEventArgs> > { { StandardActionNames.MoveRight, (sender, args) => _app.HandlerOpenFileInTable(_app.FocusedElement, args.Graphics) }, { ScfeActions.ChangeMode, (sender, args) => { var i = NavigationMode.NavigationModes.IndexOf(_app.CurrentMode); _app.ChangeModeTo( NavigationMode.NavigationModes[(i + 1) % NavigationMode.NavigationModes.Count], args.Graphics); } }, { ScfeActions.ToggleShowHiddenFiles, (sender, args) => { var focused = _app.FocusedElement; _app.ShowHiddenFiles = !_app.ShowHiddenFiles; if (_app.ShowHiddenFiles) { _app.ShowHelpMessage("Hidden files are now shown", args.Graphics); } else { _app.ShowHelpMessage("Hidden files are now hidden", args.Graphics); } _app.SwitchToFolder(_app.CurrentDir, args.Graphics, focused); } }, { ScfeActions.CreateFile, (o, args) => { _app.Request("[New] Enter new file name (Esc to cancel)", args.Graphics, (s, g, finishAction) => { if (string.IsNullOrWhiteSpace(s)) { return; } var newFile = _app.CurrentDir.GetChild(s); if (newFile.Exists()) { _app.ShowHelpMessage("File already exists, choose another name", g, ConsoleColor.Red); return; } finishAction(); FileWatchExtension.TempIgnoreList.Add(newFile); newFile.CreateFile(); _app.ShowHelpMessage("File created.", args.Graphics, ConsoleColor.Green); _app.FireFileChangedEvent(this, new FileChangedEventArgs(new[] { newFile }, g)); _app.SwitchToFolder(_app.CurrentDir, g, newFile); }); } }, { ScfeActions.CreateFolder, (o, args) => { _app.Request("[NewF] Enter new folder name (Esc to cancel)", args.Graphics, (s, g, finish) => { if (string.IsNullOrWhiteSpace(s)) { return; } var newFile = _app.CurrentDir.GetChild(s); if (newFile.Exists()) { _app.ShowHelpMessage("Folder already exists, choose another name", g, ConsoleColor.Red); return; } finish(); FileWatchExtension.TempIgnoreList.Add(newFile); newFile.CreateDirectory(); _app.ShowHelpMessage("Folder created and opened.", g, ConsoleColor.Green); _app.FireFileChangedEvent(this, new FileChangedEventArgs(new[] { newFile }, g)); _app.SwitchToFolder(newFile, g); }); } }, { ScfeActions.Rename, (o, args) => { var files = _app.SelectedElements.Count == 0 ? new[] { _app.FocusedElement }.ToImmutableList() : _app.SelectedElements; if (files.Count != 1) { _app.ShowHelpMessage("Cannot rename more than one file at the same time", args.Graphics, ConsoleColor.Red); return; } _app.Request($"[Rename] Enter new name for {files[0].GetFileName()} (Esc to cancel)", args.Graphics, (s, g, finish) => { finish(); if (string.IsNullOrWhiteSpace(s)) { return; } var moveTo = files[0].GetSibling(s); if (moveTo.Exists()) { _app.ShowHelpMessage("A file already exists with this name", g, ConsoleColor.Red); return; } try { FileWatchExtension.TempIgnoreList.Add(moveTo); files[0].MoveTo(moveTo); _app.ShowHelpMessage("File renamed successfully", args.Graphics, ConsoleColor.Green); _app.FireFileChangedEvent(this, new FileChangedEventArgs(new[] { files[0], moveTo }, args.Graphics)); _app.SwitchToFolder(_app.CurrentDir, args.Graphics, moveTo); } catch (Exception e) { if (e is IOException) { _app.ShowHelpMessage(e.Message, args.Graphics, ConsoleColor.Red); } throw; } }); } }, { ScfeActions.GoToFolder, (o, args) => { _app.Request("[Go-To] Enter destination folder (Esc to cancel)", args.Graphics, (s, g, finish) => { finish(); if (string.IsNullOrWhiteSpace(s)) { _app.ShowHelpMessage("Cancelled", g); return; } var goTo = new File(s); if (!goTo.Exists()) { _app.ShowHelpMessage("Destination does not exist", g, ConsoleColor.Red); return; } _app.ShowHelpMessage("Destination opened.", g, ConsoleColor.Green); _app.HandlerOpenFileInTable(goTo, g); }); } }, { ScfeActions.DeleteFile, (o, args) => { var files = _app.SelectedElements.IsEmpty ? new[] { _app.FocusedElement }.ToImmutableList() : _app.SelectedElements; var folderFrom = _app.CurrentDir; _app.Request(files.Count == 1 ? "[Delete] To delete file " + files[0].GetFileName() + " enter 'yes' (Esc to cancel)" : "[Delete] To delete " + files.Count + " files enter 'yes' (Esc to cancel)", args.Graphics, (s, context, finish) => { finish(); if (s == "yes") { var task = new ManagedTask <string>(tsk => { try { foreach (var f in files) { f.Delete(true); } return new TaskResult(true, "Files deleted"); } catch (Exception e) { return new TaskResult(false, "Error: " + e.Message); } }); task.AddCallback((managedTask, result) => { _app.DoGraphicsLater(g => { if (_app.CurrentDir == folderFrom) { _app.FireFileChangedEvent(this, new FileChangedEventArgs(files, args.Graphics)); } }); }); _app.AddTask(task); _app.ShowHelpMessage(files.Count == 1 ? "Deleting " + files[0].GetFileName() + "..." : "Deleting " + files.Count + " files...", args.Graphics); } else { _app.ShowHelpMessage("Cancelled", args.Graphics); } }); } }, { ScfeActions.CopyFile, (o, args) => { var files = _app.SelectedElements.IsEmpty ? (IEnumerable <File>) new[] { _app.FocusedElement } : _app.SelectedElements; _app.ClipboardContent = files.ToImmutableList(); _app.ClipboardMode = FileTransferMode.Copy; _app.ShowHelpMessage(_app.ClipboardContent.Count + " files copied to clipboard", args.Graphics); } }, { ScfeActions.CutFile, (o, args) => { var files = _app.SelectedElements.IsEmpty ? (IEnumerable <File>) new[] { _app.FocusedElement } : _app.SelectedElements; _app.ClipboardContent = files.ToImmutableList(); _app.ClipboardMode = FileTransferMode.Cut; _app.ShowHelpMessage(_app.ClipboardContent.Count + " files cut to clipboard", args.Graphics); } }, { ScfeActions.PasteFile, (o, args) => { var filesToPaste = _app.ClipboardContent; var destinationFolder = _app.CurrentDir; var mode = _app.ClipboardMode; var task = new ManagedTask <string>(tsk => { try { if (filesToPaste.Count == 1) { FileWatchExtension.TempIgnoreList.Add( destinationFolder.GetChild(filesToPaste[0].GetFileName())); } foreach (var f in filesToPaste) { if (mode == FileTransferMode.Copy) { f.CopyTo(destinationFolder.GetChild(f.GetFileName())); } else { f.MoveTo(destinationFolder.GetChild(f.GetFileName())); } } return new TaskResult(true, "Successfully " + (mode == FileTransferMode.Copy ? "copied " : "moved ") + (filesToPaste.Count == 1 ? "1 file" : filesToPaste.Count + " files")); } catch (Exception e) { return new TaskResult(false, "Error: " + e.Message); } }); task.AddCallback((managedTask, result) => { _app.DoGraphicsLater(g => { if (_app.CurrentDir == destinationFolder) { _app.FireFileChangedEvent(this, new FileChangedEventArgs(filesToPaste.Add(destinationFolder), args.Graphics)); if (filesToPaste.Count == 1) { _app.SwitchToFolder(_app.CurrentDir, g, destinationFolder.GetChild(filesToPaste[0].GetFileName())); } } }); }); _app.AddTask(task); _app.ShowHelpMessage( (mode == FileTransferMode.Copy ? "Copying " : "Moving ") + (filesToPaste.Count == 1 ? "1 file..." : filesToPaste.Count + " files..."), args.Graphics); } }, { ScfeActions.Refresh, (o, args) => { _app.ShowHelpMessage("Refreshing folder view...", args.Graphics); _app.FirePreRefreshEvent(this); _app.SwitchToFolder(_app.CurrentDir, args.Graphics, _app.FocusedElement); _app.ShowHelpMessage("Folder refreshed", args.Graphics, ConsoleColor.DarkGreen); } }, { ScfeActions.CurrDirOptions, (o, args) => _app.OpenActionSecondaryAction(null, args.Graphics) }, { ScfeActions.ChangeSort, (o, args) => { int nextIndex = (_app.FileSorters.IndexOf(_app.FileSorting) + 1) % _app.FileSorters.Count; _app.FileSorting = _app.FileSorters[nextIndex]; var ordName = _app.UseReverseSorting ? _app.FileSorting.ReversedComparerOrder : _app.FileSorting.NormalComparerOrder; _app.ShowHelpMessage($"Now sorting {_app.FileSorting.Name} ({ordName})", args.Graphics, ConsoleColor.Magenta); _app.SwitchToFolder(_app.CurrentDir, args.Graphics, _app.FocusedElement); } }, { ScfeActions.ToggleSortOrder, (o, args) => { _app.UseReverseSorting = !_app.UseReverseSorting; var ordName = _app.UseReverseSorting ? _app.FileSorting.ReversedComparerOrder : _app.FileSorting.NormalComparerOrder; _app.ShowHelpMessage($"Now sorting {_app.FileSorting.Name} ({ordName})", args.Graphics, ConsoleColor.Magenta); _app.SwitchToFolder(_app.CurrentDir, args.Graphics, _app.FocusedElement); } } }); }
public Dictionary <string, Action <object, ActionEventArgs> > GetActions() { return(new Dictionary <string, Action <object, ActionEventArgs> > { { ScfeActions.ComMode, (o, args) => { _app.PrintModeInformation(NavigationMode.ComMode, args.Graphics); _app.Request("Command...", args.Graphics, (s, context, finish) => { finish(); Regex reg = new Regex(@"^(\d+)\$(.+)$"); Match match = reg.Match(s); if (match.Success) { int id = int.Parse(match.Groups[1].Value); if (!_managedProcesses.ContainsKey(id)) { _app.ShowHelpMessage("Invalid or untracked PID: " + id, args.Graphics); return; } _managedProcesses[id].StandardInput.WriteLine(s); return; } _app.PrintModeInformation(_app.CurrentMode, args.Graphics); _app.AddTask(task => { try { string filename; string pargs; switch (Environment.OSVersion.Platform) { case PlatformID.Win32NT: filename = "powershell"; pargs = "-NonInteractive -Command \"& {" + s.Trim().Replace("\"", "\"\"\"") + "}\""; break; case PlatformID.Unix: case PlatformID.MacOSX: filename = "bash"; pargs = "-c \"" + s.Replace("\"", "\\\"") + "\""; break; default: return new TaskResult(false, "COM mode is not supported on your platform"); } var proc = new Process { StartInfo = new ProcessStartInfo { FileName = filename, Arguments = pargs, UseShellExecute = false, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, WorkingDirectory = _app.CurrentDir.FullPath } }; proc.Start(); Thread.Sleep(100); _managedProcesses.Add(proc.Id, proc); _app.ShowHelpMessageLater("Command started executing with PID " + proc.Id); string lastLine = null; while (!proc.StandardOutput.EndOfStream) { var line = proc.StandardOutput.ReadLine(); if (line != null) { line = line.Replace("\n", "").Replace("\t", ""); if (!string.IsNullOrWhiteSpace(line)) { lastLine = line; _app.ShowHelpMessageLater($"[{proc.Id}] {line}"); } } } if (proc.ExitCode == 0) { return new TaskResult(true, lastLine != null ? $"[{proc.Id}] Finished: {lastLine}" : $"[{proc.Id}] Process finished"); } string errorMsg = proc.StandardError.ReadLine(); if (errorMsg == null) { return new TaskResult(false, $"[{proc.Id}] Failed (exit code {proc.ExitCode})"); } return new TaskResult(false, $"[{proc.Id}] Failed (code {proc.ExitCode}): {errorMsg}"); } catch (Exception e) { return new TaskResult(false, "Error: " + e.Message); } }); }, false, g => { _app.PrintModeInformation(_app.CurrentMode, g); }); } } }); }