#nullable enable
using System.ComponentModel;
namespace Terminal.Gui.Views;
///
/// .Net MaskedTextProvider Provider for TextValidateField.
///
///
///
/// Wrapper around MaskedTextProvider
///
///
///
///
/// Masking elements
///
///
///
public class NetMaskedTextProvider : ITextValidateProvider
{
private MaskedTextProvider? _provider;
/// Empty Constructor
public NetMaskedTextProvider (string mask) { Mask = mask; }
/// Mask property
public string Mask
{
get => _provider!.Mask;
set
{
string current = _provider != null
? _provider.ToString (false, false)
: string.Empty;
_provider = new (value == string.Empty ? "&&&&&&" : value);
if (!string.IsNullOrEmpty (current))
{
_provider.Set (current);
}
}
}
///
public event EventHandler>? TextChanged;
///
public string Text
{
get => _provider!.ToString ();
set => _provider!.Set (value);
}
///
public bool IsValid => _provider!.MaskCompleted;
///
public bool Fixed => true;
///
public string DisplayText => _provider!.ToDisplayString ();
///
public int Cursor (int pos)
{
if (pos < 0)
{
return CursorStart ();
}
if (pos > _provider!.Length)
{
return CursorEnd ();
}
int p = _provider.FindEditPositionFrom (pos, false);
if (p == -1)
{
p = _provider.FindEditPositionFrom (pos, true);
}
return p;
}
///
public int CursorStart ()
{
return _provider!.IsEditPosition (0)
? 0
: _provider.FindEditPositionFrom (0, true);
}
///
public int CursorEnd ()
{
return _provider!.IsEditPosition (_provider.Length - 1)
? _provider.Length - 1
: _provider.FindEditPositionFrom (_provider.Length, false);
}
///
public int CursorLeft (int pos)
{
int c = _provider!.FindEditPositionFrom (pos - 1, false);
return c == -1 ? pos : c;
}
///
public int CursorRight (int pos)
{
int c = _provider!.FindEditPositionFrom (pos + 1, true);
return c == -1 ? pos : c;
}
///
public bool Delete (int pos)
{
string oldValue = Text;
bool result = _provider!.Replace (' ', pos); // .RemoveAt (pos);
if (result)
{
OnTextChanged (new (in oldValue));
}
return result;
}
///
public bool InsertAt (char ch, int pos)
{
string oldValue = Text;
bool result = _provider!.Replace (ch, pos);
if (result)
{
OnTextChanged (new (in oldValue));
}
return result;
}
///
public void OnTextChanged (EventArgs args) { TextChanged?.Invoke (this, args); }
}