using System; using System.Collections.Generic; using System.IO; using System.IO.Abstractions; using System.Linq; using Terminal.Gui.Resources; namespace Terminal.Gui { /// /// Default file operation handlers using modal dialogs. /// public class DefaultFileOperations : IFileOperations { /// public bool Delete (IEnumerable toDelete) { // Default implementation does not allow deleting multiple files if (toDelete.Count () != 1) { return false; } var d = toDelete.Single (); var adjective = d.Name; int result = MessageBox.Query ( string.Format (Strings.fdDeleteTitle, adjective), string.Format (Strings.fdDeleteBody, adjective), Strings.fdYes, Strings.fdNo); try { if (result == 0) { if (d is IFileInfo) { d.Delete (); } else { ((IDirectoryInfo)d).Delete (true); } return true; } } catch (Exception ex) { MessageBox.ErrorQuery (Strings.fdDeleteFailedTitle, ex.Message, "Ok"); } return false; } private bool Prompt (string title, string defaultText, out string result) { bool confirm = false; var btnOk = new Button ("Ok") { IsDefault = true, }; btnOk.Clicked += (s, e) => { confirm = true; Application.RequestStop (); }; var btnCancel = new Button ("Cancel"); btnCancel.Clicked += (s, e) => { confirm = false; Application.RequestStop (); }; var lbl = new Label (Strings.fdRenamePrompt); var tf = new TextField (defaultText) { X = Pos.Right (lbl), Width = Dim.Fill (), }; tf.SelectAll (); var dlg = new Dialog (title) { Width = Dim.Percent (50), Height = 4 }; dlg.Add (lbl); dlg.Add (tf); // Add buttons last so tab order is friendly // and TextField gets focus dlg.AddButton (btnOk); dlg.AddButton (btnCancel); Application.Run (dlg); result = tf.Text?.ToString (); return confirm; } /// public IFileSystemInfo Rename (IFileSystem fileSystem, IFileSystemInfo toRename) { // Don't allow renaming C: or D: or / (on linux) etc if (toRename is IDirectoryInfo dir && dir.Parent == null) { return null; } if (Prompt (Strings.fdRenameTitle, toRename.Name, out var newName)) { if (!string.IsNullOrWhiteSpace (newName)) { try { if (toRename is IFileInfo f) { var newLocation = fileSystem.FileInfo.New (Path.Combine (f.Directory.FullName, newName)); f.MoveTo (newLocation.FullName); return newLocation; } else { var d = (IDirectoryInfo)toRename; var newLocation = fileSystem.DirectoryInfo.New (Path.Combine (d.Parent.FullName, newName)); d.MoveTo (newLocation.FullName); return newLocation; } } catch (Exception ex) { MessageBox.ErrorQuery (Strings.fdRenameFailedTitle, ex.Message, "Ok"); } } } return null; } /// public IFileSystemInfo New (IFileSystem fileSystem, IDirectoryInfo inDirectory) { if (Prompt (Strings.fdNewTitle, "", out var named)) { if (!string.IsNullOrWhiteSpace (named)) { try { var newDir = fileSystem.DirectoryInfo.New (Path.Combine (inDirectory.FullName, named)); newDir.Create (); return newDir; } catch (Exception ex) { MessageBox.ErrorQuery (Strings.fdNewFailed, ex.Message, "Ok"); } } } return null; } } }