浏览代码

TextValidateField reimplementation without generics (#1261)

* TextValidateField reimplementation without generic

* mask change in catalog
José Miguel Perricone 4 年之前
父节点
当前提交
028e7e5bf2
共有 3 个文件被更改,包括 147 次插入221 次删除
  1. 73 138
      Terminal.Gui/Views/TextValidateField.cs
  2. 13 13
      UICatalog/Scenarios/Text.cs
  3. 61 70
      UnitTests/TextValidateFieldTests.cs

+ 73 - 138
Terminal.Gui/Views/TextValidateField.cs

@@ -81,16 +81,14 @@ namespace Terminal.Gui {
 			bool IsValid { get; }
 
 			/// <summary>
-			/// Set the input text, and get the formatted string for display.
+			/// Set the input text and get the current value.
 			/// </summary>
 			ustring Text { get; set; }
 
 			/// <summary>
-			/// Mask used for validation.
-			/// Not always a mask, can by a regex expression.
-			/// TODO: Maybe we can change the name.
+			/// Gets the formatted string for display.
 			/// </summary>
-			ustring Mask { get; set; }
+			ustring DisplayText { get; }
 		}
 
 		//////////////////////////////////////////////////////////////////////////////
@@ -107,22 +105,27 @@ namespace Terminal.Gui {
 		/// </summary>
 		public class NetMaskedTextProvider : ITextValidateProvider {
 			MaskedTextProvider provider;
-			string text;
 
 			/// <summary>
 			/// Empty Constructor
 			/// </summary>
-			public NetMaskedTextProvider () { }
+			public NetMaskedTextProvider (string mask)
+			{
+				Mask = mask;
+			}
 
-			///<inheritdoc/>
+			/// <summary>
+			/// Mask property
+			/// </summary>
 			public ustring Mask {
 				get {
 					return provider?.Mask;
 				}
 				set {
+					var current = provider != null ? provider.ToString (false, false) : string.Empty;
 					provider = new MaskedTextProvider (value == ustring.Empty ? "&&&&&&" : value.ToString ());
-					if (string.IsNullOrEmpty (text) == false) {
-						provider.Set (text);
+					if (string.IsNullOrEmpty (current) == false) {
+						provider.Set (current);
 					}
 				}
 			}
@@ -130,10 +133,9 @@ namespace Terminal.Gui {
 			///<inheritdoc/>
 			public ustring Text {
 				get {
-					return provider.ToDisplayString ();
+					return provider.ToString ();
 				}
 				set {
-					text = value.ToString ();
 					provider.Set (value.ToString ());
 				}
 			}
@@ -144,6 +146,9 @@ namespace Terminal.Gui {
 			///<inheritdoc/>
 			public bool Fixed => true;
 
+			///<inheritdoc/>
+			public ustring DisplayText => provider.ToDisplayString ();
+
 			///<inheritdoc/>
 			public int Cursor (int pos)
 			{
@@ -212,20 +217,25 @@ namespace Terminal.Gui {
 		public class TextRegexProvider : ITextValidateProvider {
 			Regex regex;
 			List<Rune> text;
-			List<Rune> mask;
+			List<Rune> pattern;
 
 			/// <summary>
-			/// Empty Constructor
+			/// Empty Constructor.
 			/// </summary>
-			public TextRegexProvider () { }
+			public TextRegexProvider (string pattern)
+			{
+				Pattern = pattern;
+			}
 
-			///<inheritdoc/>
-			public ustring Mask {
+			/// <summary>
+			/// Regex pattern property.
+			/// </summary>
+			public ustring Pattern {
 				get {
-					return ustring.Make (mask);
+					return ustring.Make (pattern);
 				}
 				set {
-					mask = value.ToRuneList ();
+					pattern = value.ToRuneList ();
 					CompileMask ();
 					SetupText ();
 				}
@@ -242,6 +252,9 @@ namespace Terminal.Gui {
 				}
 			}
 
+			///<inheritdoc/>
+			public ustring DisplayText => Text;
+
 			///<inheritdoc/>
 			public bool IsValid {
 				get {
@@ -257,6 +270,7 @@ namespace Terminal.Gui {
 			/// </summary>
 			public bool ValidateOnInput { get; set; } = true;
 
+
 			bool Validate (List<Rune> text)
 			{
 				var match = regex.Match (ustring.Make (text).ToString ());
@@ -340,7 +354,7 @@ namespace Terminal.Gui {
 			/// </summary>
 			private void CompileMask ()
 			{
-				regex = new Regex (ustring.Make (mask).ToString (), RegexOptions.Compiled);
+				regex = new Regex (ustring.Make (pattern).ToString (), RegexOptions.Compiled);
 			}
 		}
 		#endregion
@@ -349,58 +363,66 @@ namespace Terminal.Gui {
 	/// <summary>
 	/// Text field that validates input through a  <see cref="ITextValidateProvider"/>
 	/// </summary>
-	/// <typeparam name="T"></typeparam>
-	public class TextValidateField<T> : View, ITextValidateProvider where T : class {
+	public class TextValidateField : View {
 
 		ITextValidateProvider provider;
 		int cursorPosition = 0;
 
 		/// <summary>
-		/// Initializes a new instance of the <see cref="TextValidateField{T}"/> class using <see cref="LayoutStyle.Computed"/> positioning.
+		/// Initializes a new instance of the <see cref="TextValidateField"/> class using <see cref="LayoutStyle.Computed"/> positioning.
 		/// </summary>
-		public TextValidateField ()
+		public TextValidateField () : this (null)
 		{
 		}
 
 		/// <summary>
-		/// Initializes a new instance of the <see cref="TextValidateField{T}"></see>  class using <see cref="LayoutStyle.Computed"/> positioning.
+		/// Initializes a new instance of the <see cref="TextValidateField"/> class using <see cref="LayoutStyle.Computed"/> positioning.
 		/// </summary>
-		/// <param name="mask">Mask</param>
-		public TextValidateField (ustring mask) : this (mask, ustring.Empty) { }
-
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TextValidateField{T}"/> class using <see cref="LayoutStyle.Computed"/> positioning.
-		/// </summary>
-		/// <param name="mask"></param>
-		/// <param name="text">Initial Value</param>
-		public TextValidateField (ustring mask, ustring text)
+		public TextValidateField (ITextValidateProvider provider)
 		{
-			provider = Activator.CreateInstance (typeof (T)) as ITextValidateProvider;
+			if (provider != null) {
+				Provider = provider;
+			}
 
-			Mask = mask;
-			Text = text;
+			Initialize ();
+		}
 
-			this.Width = text == ustring.Empty ? 20 : Text.Length;
-			this.Height = 1;
-			this.CanFocus = true;
+		void Initialize ()
+		{
+			Height = 1;
+			CanFocus = true;
 		}
 
 		/// <summary>
-		/// Get the Provider
+		/// Provider
 		/// </summary>
-		public T Provider => (T)provider;
+		public ITextValidateProvider Provider {
+			get => provider;
+			set {
+				provider = value;
+				if (provider.Fixed == true) {
+					this.Width = provider.DisplayText == ustring.Empty ? 10 : Text.Length;
+				}
+				HomeKeyHandler ();
+				SetNeedsDisplay ();
+			}
+		}
 
 		///<inheritdoc/>
 		public override bool MouseEvent (MouseEvent mouseEvent)
 		{
-			var c = provider.Cursor (mouseEvent.X - GetMargins (Frame.Width).left);
-			if (provider.Fixed == false && TextAlignment == TextAlignment.Right && Text.Length > 0) {
-				c += 1;
+			if (mouseEvent.Flags.HasFlag (MouseFlags.Button1Pressed)) {
+
+				var c = provider.Cursor (mouseEvent.X - GetMargins (Frame.Width).left);
+				if (provider.Fixed == false && TextAlignment == TextAlignment.Right && Text.Length > 0) {
+					c += 1;
+				}
+				cursorPosition = c;
+				SetFocus ();
+				SetNeedsDisplay ();
+				return true;
 			}
-			cursorPosition = c;
-			SetFocus ();
-			SetNeedsDisplay ();
-			return true;
+			return false;
 		}
 
 		/// <summary>
@@ -424,22 +446,6 @@ namespace Terminal.Gui {
 			}
 		}
 
-		/// <summary>
-		/// Mask
-		/// </summary>
-		public ustring Mask {
-			get {
-				return provider.Mask;
-			}
-			set {
-				provider.Mask = value;
-
-				cursorPosition = provider.CursorStart ();
-
-				SetNeedsDisplay ();
-			}
-		}
-
 		///inheritdoc/>
 		public override void PositionCursor ()
 		{
@@ -501,8 +507,8 @@ namespace Terminal.Gui {
 			// Content
 			Driver.SetAttribute (textColor);
 			// Content
-			for (int i = 0; i < provider.Text.Length; i++) {
-				Driver.AddRune (provider.Text [i]);
+			for (int i = 0; i < provider.DisplayText.Length; i++) {
+				Driver.AddRune (provider.DisplayText [i]);
 			}
 
 			// Right Margin
@@ -615,75 +621,6 @@ namespace Terminal.Gui {
 			return true;
 		}
 
-		/// <summary>
-		/// Set Cursor position to <paramref name="pos" />.
-		/// </summary>
-		/// <param name="pos"></param>
-		/// <returns>Return first valid position.</returns>
-		public int Cursor (int pos)
-		{
-			return provider.Cursor (pos);
-		}
-
-		/// <summary>
-		/// First valid position before <paramref name="pos" />.
-		/// </summary>
-		/// <param name="pos"></param>
-		/// <returns>New cursor position if any, otherwise returns <paramref name="pos" /></returns>
-		public int CursorLeft (int pos)
-		{
-			return provider.CursorLeft (pos);
-		}
-
-		/// <summary>
-		/// First valid position after <paramref name="pos" />.
-		/// </summary>
-		/// <param name="pos">Current position.</param>
-		/// <returns>New cursor position if any, otherwise returns <paramref name="pos" /></returns>
-		public int CursorRight (int pos)
-		{
-			return provider.CursorRight (pos);
-		}
-
-		/// <summary>
-		/// Find the first valid character position.
-		/// </summary>
-		/// <returns>New cursor position.</returns>
-		public int CursorStart ()
-		{
-			return provider.CursorStart ();
-		}
-
-		/// <summary>
-		/// Find the last valid character position.
-		/// </summary>
-		/// <returns>New cursor position.</returns>
-		public int CursorEnd ()
-		{
-			return provider.CursorEnd ();
-		}
-
-		/// <summary>
-		/// Deletes the current character in <paramref name="pos" />.
-		/// </summary>
-		/// <param name="pos"></param>
-		/// <returns>true if the character was successfully removed, otherwise false.</returns>
-		public bool Delete (int pos)
-		{
-			return provider.Delete (pos);
-		}
-
-		/// <summary>
-		/// Insert character <paramref name="ch" /> in position <paramref name="pos" />.
-		/// </summary>
-		/// <param name="ch"></param>
-		/// <param name="pos"></param>
-		/// <returns>true if the character was successfully inserted, otherwise false.</returns>
-		public bool InsertAt (char ch, int pos)
-		{
-			return provider.InsertAt (ch, pos);
-		}
-
 		/// <summary>
 		/// This property returns true if the input is valid.
 		/// </summary>
@@ -696,7 +633,5 @@ namespace Terminal.Gui {
 				return provider.IsValid;
 			}
 		}
-
-		public bool Fixed => throw new NotImplementedException ();
 	}
 }

+ 13 - 13
UICatalog/Scenarios/Text.cs

@@ -112,35 +112,35 @@ namespace UICatalog {
 			_timeField.TimeChanged += TimeChanged;
 
 			// MaskedTextProvider
-			var netProvider = new Label (".Net MaskedTextProvider [ 999 000 LLL >LLL| AAA aaa ]") {
+			var netProviderLabel = new Label (".Net MaskedTextProvider [ 999 000 LLL >LLL| AAA aaa ]") {
 				X = Pos.Left (dateField),
 				Y = Pos.Bottom (dateField) + 1
 			};
-			Win.Add (netProvider);
+			Win.Add (netProviderLabel);
 
-			var netProviderField = new TextValidateField<NetMaskedTextProvider> ("999 000 LLL >LLL| AAA aaa") {
-				X = Pos.Right (netProvider) + 1,
-				Y = Pos.Y (netProvider),
-				Width = 40,
-				TextAlignment = TextAlignment.Centered
+			var netProvider = new NetMaskedTextProvider ("999 000 LLL > LLL | AAA aaa");
+
+			var netProviderField = new TextValidateField (netProvider) {
+				X = Pos.Right (netProviderLabel) + 1,
+				Y = Pos.Y (netProviderLabel)
 			};
+
 			Win.Add (netProviderField);
 
 			// TextRegexProvider
 			var regexProvider = new Label ("Gui.cs TextRegexProvider [ ^([0-9]?[0-9]?[0-9]|1000)$ ]") {
-				X = Pos.Left (netProvider),
-				Y = Pos.Bottom (netProvider) + 1
+				X = Pos.Left (netProviderLabel),
+				Y = Pos.Bottom (netProviderLabel) + 1
 			};
 			Win.Add (regexProvider);
 
-			var regexProviderField = new TextValidateField<TextRegexProvider> ("^([0-9]?[0-9]?[0-9]|1000)$") {
+			var provider2 = new TextRegexProvider ("^([0-9]?[0-9]?[0-9]|1000)$") { ValidateOnInput = false };
+			var regexProviderField = new TextValidateField (provider2) {
 				X = Pos.Right (regexProvider) + 1,
 				Y = Pos.Y (regexProvider),
-				Width = 40,
+				Width = 30,
 				TextAlignment = TextAlignment.Centered
 			};
-			// Access the inner Provider to configure.
-			regexProviderField.Provider.ValidateOnInput = false;
 
 			Win.Add (regexProviderField);
 		}

+ 61 - 70
UnitTests/TextValidateFieldTests.cs

@@ -15,14 +15,15 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(1___)--", field.Text);
+			Assert.Equal ("--(1___)--", field.Provider.DisplayText);
+			Assert.Equal ("--(1   )--", field.Text);
 		}
 
 		[Fact]
@@ -30,14 +31,15 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
 			field.ProcessKey (new KeyEvent (Key.A, new KeyModifiers { }));
 
-			Assert.Equal ("--(____)--", field.Text);
+			Assert.Equal ("--(    )--", field.Text);
+			Assert.Equal ("--(____)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 		}
 
@@ -46,7 +48,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -57,7 +59,8 @@ namespace Terminal.Gui.Views {
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(1___)--", field.Text);
+			Assert.Equal ("--(1___)--", field.Provider.DisplayText);
+			Assert.Equal ("--(1   )--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -66,7 +69,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                               *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -74,7 +77,9 @@ namespace Terminal.Gui.Views {
 			field.ProcessKey (new KeyEvent (Key.End, new KeyModifiers { }));
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
-			Assert.Equal ("--(___1)--", field.Text);
+
+			Assert.Equal ("--(___1)--", field.Provider.DisplayText);
+			Assert.Equal ("--(   1)--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -83,7 +88,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                               *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -93,7 +98,8 @@ namespace Terminal.Gui.Views {
 			}
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(___1)--", field.Text);
+			Assert.Equal ("--(___1)--", field.Provider.DisplayText);
+			Assert.Equal ("--(   1)--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -102,7 +108,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            *
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -112,7 +118,8 @@ namespace Terminal.Gui.Views {
 			}
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(1___)--", field.Text);
+			Assert.Equal ("--(1___)--", field.Provider.DisplayText);
+			Assert.Equal ("--(1   )--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -121,21 +128,21 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
-			Assert.Equal ("--(1___)--", field.Text);
+			Assert.Equal ("--(1   )--", field.Text);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D2, new KeyModifiers { }));
-			Assert.Equal ("--(12__)--", field.Text);
+			Assert.Equal ("--(12  )--", field.Text);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D3, new KeyModifiers { }));
-			Assert.Equal ("--(123_)--", field.Text);
+			Assert.Equal ("--(123 )--", field.Text);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D4, new KeyModifiers { }));
@@ -148,25 +155,25 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ** **
 			//                                                         01234567890
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(00-00)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(00-00)--")) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
-			Assert.Equal ("--(1_-__)--", field.Text);
+			Assert.Equal ("--(1_-__)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D2, new KeyModifiers { }));
-			Assert.Equal ("--(12-__)--", field.Text);
+			Assert.Equal ("--(12-__)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D3, new KeyModifiers { }));
-			Assert.Equal ("--(12-3_)--", field.Text);
+			Assert.Equal ("--(12-3_)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.D4, new KeyModifiers { }));
-			Assert.Equal ("--(12-34)--", field.Text);
+			Assert.Equal ("--(12-34)--", field.Provider.DisplayText);
 			Assert.True (field.IsValid);
 		}
 
@@ -176,7 +183,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--", "1234") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -190,12 +197,13 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--", "12345") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--") { Text = "12345" }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
-			Assert.Equal ("--(____)--", field.Text);
+			Assert.Equal ("--(____)--", field.Provider.DisplayText);
+			Assert.Equal ("--(    )--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -204,12 +212,13 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--", "123") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--") { Text = "123" }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
-			Assert.Equal ("--(123_)--", field.Text);
+			Assert.Equal ("--(123_)--", field.Provider.DisplayText);
+			Assert.Equal ("--(123 )--", field.Text);
 			Assert.False (field.IsValid);
 		}
 
@@ -218,19 +227,19 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--", "1234") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
 
-			Assert.Equal ("--(1234)--", field.Text);
+			Assert.Equal ("--(1234)--", field.Provider.DisplayText);
 			Assert.True (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.Delete, new KeyModifiers { }));
 			field.ProcessKey (new KeyEvent (Key.Delete, new KeyModifiers { }));
 			field.ProcessKey (new KeyEvent (Key.Delete, new KeyModifiers { }));
 
-			Assert.Equal ("--(_234)--", field.Text);
+			Assert.Equal ("--(_234)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.CursorRight, new KeyModifiers { }));
@@ -240,7 +249,7 @@ namespace Terminal.Gui.Views {
 			field.ProcessKey (new KeyEvent (Key.Delete, new KeyModifiers { }));
 			field.ProcessKey (new KeyEvent (Key.Delete, new KeyModifiers { }));
 
-			Assert.Equal ("--(_2_4)--", field.Text);
+			Assert.Equal ("--(_2_4)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 		}
 
@@ -249,7 +258,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--", "1234") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
@@ -258,20 +267,20 @@ namespace Terminal.Gui.Views {
 			field.ProcessKey (new KeyEvent (Key.End, new KeyModifiers { }));
 
 			field.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers { }));
-			Assert.Equal ("--(12_4)--", field.Text);
+			Assert.Equal ("--(12_4)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers { }));
-			Assert.Equal ("--(1__4)--", field.Text);
+			Assert.Equal ("--(1__4)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			field.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers { }));
-			Assert.Equal ("--(___4)--", field.Text);
+			Assert.Equal ("--(___4)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
 			// One more
 			field.ProcessKey (new KeyEvent (Key.Backspace, new KeyModifiers { }));
-			Assert.Equal ("--(___4)--", field.Text);
+			Assert.Equal ("--(___4)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 		}
 
@@ -281,7 +290,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Left,
 				Width = 30
 			};
@@ -297,7 +306,7 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Left,
 				Width = 30
 			};
@@ -306,8 +315,9 @@ namespace Terminal.Gui.Views {
 			Assert.Equal ("--(1234)--", field.Text);
 			Assert.True (field.IsValid);
 
-			field.Mask = "--------(00000000)--------";
-			Assert.Equal ("--------(1234____)--------", field.Text);
+			var provider = field.Provider as NetMaskedTextProvider;
+			provider.Mask = "--------(00000000)--------";
+			Assert.Equal ("--------(1234____)--------", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 		}
 
@@ -316,21 +326,21 @@ namespace Terminal.Gui.Views {
 		{
 			//                                                            ****
 			//                                                         0123456789
-			var field = new TextValidateField<NetMaskedTextProvider> ("--(0000)--") {
+			var field = new TextValidateField (new NetMaskedTextProvider ("--(0000)--")) {
 				TextAlignment = TextAlignment.Left,
 				Width = 30
 			};
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(1___)--", field.Text);
+			Assert.Equal ("--(1___)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 
-			field.MouseEvent (new MouseEvent () { X = 25, Flags = MouseFlags.Button1Clicked });
+			field.MouseEvent (new MouseEvent () { X = 25, Flags = MouseFlags.Button1Pressed });
 
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 
-			Assert.Equal ("--(1__1)--", field.Text);
+			Assert.Equal ("--(1__1)--", field.Provider.DisplayText);
 			Assert.False (field.IsValid);
 		}
 	}
@@ -344,13 +354,10 @@ namespace Terminal.Gui.Views {
 		[Fact]
 		public void Input_Without_Validate_On_Input ()
 		{
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9][0-9][0-9]$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }) {
 				Width = 20
 			};
 
-			// Let you input
-			field.Provider.ValidateOnInput = false;
-
 			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers { }));
 			Assert.Equal ("1", field.Text);
 			Assert.False (field.IsValid);
@@ -371,7 +378,7 @@ namespace Terminal.Gui.Views {
 		[Fact]
 		public void Input_With_Validate_On_Input_Set_Text ()
 		{
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9][0-9][0-9]$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9][0-9][0-9]$")) {
 				Width = 20
 			};
 
@@ -391,22 +398,10 @@ namespace Terminal.Gui.Views {
 			Assert.True (field.IsValid);
 		}
 
-		[Fact]
-		public void Empty_Mask_Does_Not_Validate ()
-		{
-			var field = new TextValidateField<TextRegexProvider> () {
-				Width = 20
-			};
-
-			field.ProcessKey (new KeyEvent (Key.D1, new KeyModifiers ()));
-			Assert.Equal ("", field.Text);
-			Assert.False (field.IsValid);
-		}
-
 		[Fact]
 		public void Text_With_All_Charset ()
 		{
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9][0-9][0-9]$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9][0-9][0-9]$")) {
 				Width = 20
 			};
 
@@ -432,7 +427,7 @@ namespace Terminal.Gui.Views {
 			}
 
 			try {
-				var field = new TextValidateField<TextRegexProvider> (mask) {
+				var field = new TextValidateField (new TextRegexProvider (mask)) {
 					Width = 20
 				};
 			} catch (RegexParseException ex) {
@@ -447,7 +442,7 @@ namespace Terminal.Gui.Views {
 		{
 			// Range 0 to 1000
 			// Accepts 001 too.
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9]?[0-9]?[0-9]|1000$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9]?[0-9]?[0-9]|1000$")) {
 				Width = 20
 			};
 
@@ -473,12 +468,10 @@ namespace Terminal.Gui.Views {
 		public void End_Key_End_Of_Input ()
 		{
 			// Exactly 5 numbers
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9]{5}$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9]{5}$") { ValidateOnInput = false }) {
 				Width = 20
 			};
 
-			field.Provider.ValidateOnInput = false;
-
 			for (int i = 0; i < 4; i++) {
 				field.ProcessKey (new KeyEvent (Key.D0, new KeyModifiers { }));
 			}
@@ -508,11 +501,10 @@ namespace Terminal.Gui.Views {
 		[Fact]
 		public void Right_Key_Stops_At_End_And_Insert ()
 		{
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9][0-9][0-9]$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
-			field.Provider.ValidateOnInput = false;
 
 			field.Text = "123";
 
@@ -533,11 +525,10 @@ namespace Terminal.Gui.Views {
 		[Fact]
 		public void Left_Key_Stops_At_Start_And_Insert ()
 		{
-			var field = new TextValidateField<TextRegexProvider> ("^[0-9][0-9][0-9]$") {
+			var field = new TextValidateField (new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }) {
 				TextAlignment = TextAlignment.Centered,
 				Width = 20
 			};
-			field.Provider.ValidateOnInput = false;
 
 			field.Text = "123";