using System.IO.Abstractions;
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;
}
IFileSystemInfo d = toDelete.Single ();
string adjective = d.Name;
int result = MessageBox.Query (
string.Format (Strings.fdDeleteTitle, adjective),
string.Format (Strings.fdDeleteBody, adjective),
Strings.btnYes,
Strings.btnNo
);
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, Strings.btnOk);
}
return false;
}
///
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 is null)
{
return null;
}
if (Prompt (Strings.fdRenameTitle, toRename.Name, out string newName))
{
if (!string.IsNullOrWhiteSpace (newName))
{
try
{
if (toRename is IFileInfo f)
{
IFileInfo newLocation =
fileSystem.FileInfo.New (
Path.Combine (
f.Directory.FullName,
newName
)
);
f.MoveTo (newLocation.FullName);
return newLocation;
}
else
{
var d = (IDirectoryInfo)toRename;
IDirectoryInfo 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 string named))
{
if (!string.IsNullOrWhiteSpace (named))
{
try
{
IDirectoryInfo 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;
}
private bool Prompt (string title, string defaultText, out string result)
{
var confirm = false;
var btnOk = new Button { IsDefault = true, Text = Strings.btnOk };
btnOk.Accepting += (s, e) =>
{
confirm = true;
Application.RequestStop ();
// Anytime Accepting is handled, make sure to set e.Cancel to false.
e.Cancel = false;
};
var btnCancel = new Button { Text = Strings.btnCancel };
btnCancel.Accepting += (s, e) =>
{
confirm = false;
Application.RequestStop ();
// Anytime Accepting is handled, make sure to set e.Cancel to false.
e.Cancel = false;
};
var lbl = new Label { Text = Strings.fdRenamePrompt };
var tf = new TextField { X = Pos.Right (lbl), Width = Dim.Fill (), Text = defaultText };
tf.SelectAll ();
var dlg = new Dialog { Title = 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);
dlg.Dispose ();
result = tf.Text;
return confirm;
}
}