using Terminal.Gui.Resources;
namespace Terminal.Gui;
/// Interface for restrictions on which file type(s) the user is allowed to select/enter.
public interface IAllowedType
{
///
/// Returns true if the file at is compatible with this allow option. Note that the file
/// may not exist (e.g. in the case of saving).
///
///
///
bool IsAllowed (string path);
}
/// that allows selection of any types (*.*).
public class AllowedTypeAny : IAllowedType
{
///
public bool IsAllowed (string path) { return true; }
/// Returns a string representation of this .
///
public override string ToString () { return Strings.fdAnyFiles + "(*.*)"; }
}
///
/// Describes a requirement on what can be selected. This can be combined with other
/// in a to for example show only .csv files but let user change to
/// open any if they want.
///
public class AllowedType : IAllowedType
{
/// Initializes a new instance of the class.
/// The human-readable text to display.
/// Extension(s) to match e.g. .csv.
public AllowedType (string description, params string [] extensions)
{
if (extensions.Length == 0)
{
throw new ArgumentException ("You must supply at least one extension");
}
Description = description;
Extensions = extensions;
}
/// Gets or Sets the human-readable description for the file type e.g. "Comma Separated Values".
public string Description { get; set; }
/// Gets or Sets the permitted file extension(s) (e.g. ".csv").
public string [] Extensions { get; set; }
///
public bool IsAllowed (string path)
{
if (string.IsNullOrWhiteSpace (path))
{
return false;
}
string extension = Path.GetExtension (path);
if (Extensions.Any (e => path.EndsWith (e, StringComparison.InvariantCultureIgnoreCase)))
{
return true;
}
// There is a requirement to have a particular extension and we have none
if (string.IsNullOrEmpty (extension))
{
return false;
}
return Extensions.Any (e => e.Equals (extension, StringComparison.InvariantCultureIgnoreCase));
}
/// Returns plus all separated by semicolons.
public override string ToString ()
{
const int maxLength = 30;
var desc = $"{Description} ({string.Join (";", Extensions.Select (e => '*' + e).ToArray ())})";
if (desc.Length > maxLength)
{
return desc.Substring (0, maxLength - 2) + "…";
}
return desc;
}
}