#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); } }