소스 검색

Ooops. I see now IsOverridden must work for this to work

Charlie Kindel 2 년 전
부모
커밋
a8dfae7fc7
6개의 변경된 파일88개의 추가작업 그리고 33개의 파일을 삭제
  1. 20 0
      Terminal.Gui/Core/Responder.cs
  2. 0 14
      Terminal.Gui/Core/View.cs
  3. 1 1
      Terminal.Gui/Views/ComboBox.cs
  4. 1 0
      Terminal.Gui/Views/ListView.cs
  5. 18 18
      UnitTests/ComboBoxTests.cs
  6. 48 0
      UnitTests/ResponderTests.cs

+ 20 - 0
Terminal.Gui/Core/Responder.cs

@@ -16,6 +16,7 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.Reflection;
 
 namespace Terminal.Gui {
 	/// <summary>
@@ -236,6 +237,25 @@ namespace Terminal.Gui {
 		/// </summary>
 		public virtual void OnVisibleChanged () { }
 
+		/// <summary>
+		/// Utilty function to determine <paramref name="method"/> is overridden in the <paramref name="subclass"/>.
+		/// </summary>
+		/// <param name="subclass">The view.</param>
+		/// <param name="method">The method name.</param>
+		/// <returns><see langword="true"/> if it's overridden, <see langword="false"/> otherwise.</returns>
+		internal static bool IsOverridden (Responder subclass, string method)
+		{
+			MethodInfo m = subclass.GetType ().GetMethod (method,
+				BindingFlags.Instance
+				| BindingFlags.Public
+				| BindingFlags.NonPublic
+				| BindingFlags.DeclaredOnly);
+			if (m == null) {
+				return false;
+			}
+			return m.GetBaseDefinition ().DeclaringType != m.DeclaringType;
+		}
+		
 		/// <summary>
 		/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
 		/// </summary>

+ 0 - 14
Terminal.Gui/Core/View.cs

@@ -3073,19 +3073,5 @@ namespace Terminal.Gui {
 
 			return top;
 		}
-
-		/// <summary>
-		/// Check if the <paramref name="method"/> is overridden in the <paramref name="view"/>.
-		/// </summary>
-		/// <param name="view">The view.</param>
-		/// <param name="method">The method name.</param>
-		/// <returns><see langword="true"/> if it's overridden, <see langword="false"/> otherwise.</returns>
-		public bool IsOverridden (View view, string method)
-		{
-			Type t = view.GetType ();
-			MethodInfo m = t.GetMethod (method);
-
-			return (m.DeclaringType == t || m.ReflectedType == t) && m.GetBaseDefinition ().DeclaringType == typeof (Responder);
-		}
 	}
 }

+ 1 - 1
Terminal.Gui/Views/ComboBox.cs

@@ -484,7 +484,7 @@ namespace Terminal.Gui {
 				search.SetFocus ();
 			}
 
-			search.CursorPosition = search.Text.ConsoleWidth;
+			search.CursorPosition = search.Text.RuneCount;
 
 			return base.OnEnter (view);
 		}

+ 1 - 0
Terminal.Gui/Views/ListView.cs

@@ -728,6 +728,7 @@ namespace Terminal.Gui {
 
 			if (lastSelectedItem == -1) {
 				EnsuresVisibilitySelectedItem ();
+				OnSelectedChanged ();
 			}
 
 			return base.OnEnter (view);

+ 18 - 18
UnitTests/ComboBoxTests.cs

@@ -826,9 +826,9 @@ Three ", output);
 
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-222222
-222222
-222222", attributes);
+00000
+22222
+22222", attributes);
 
 			Assert.True (cb.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
 			Assert.Equal ("", selected);
@@ -838,9 +838,9 @@ Three ", output);
 			cb.Redraw (cb.Bounds);
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-222222
-000002
-222222", attributes);
+22222
+00000
+22222", attributes);
 
 			Assert.True (cb.Subviews [1].ProcessKey (new KeyEvent (Key.CursorDown, new KeyModifiers ())));
 			Assert.Equal ("", selected);
@@ -850,9 +850,9 @@ Three ", output);
 			cb.Redraw (cb.Bounds);
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-222222
-222222
-000002", attributes);
+22222
+22222
+00000", attributes);
 
 			Assert.True (cb.Subviews [1].ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ())));
 			Assert.Equal ("Three", selected);
@@ -868,9 +868,9 @@ Three ", output);
 			cb.Redraw (cb.Bounds);
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-222222
-222222
-000002", attributes);
+22222
+22222
+00000", attributes);
 
 			Assert.True (cb.Subviews [1].ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
 			Assert.Equal ("Three", selected);
@@ -880,9 +880,9 @@ Three ", output);
 			cb.Redraw (cb.Bounds);
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-222222
-000002
-111112", attributes);
+22222
+00000
+11111", attributes);
 
 			Assert.True (cb.Subviews [1].ProcessKey (new KeyEvent (Key.CursorUp, new KeyModifiers ())));
 			Assert.Equal ("Three", selected);
@@ -892,9 +892,9 @@ Three ", output);
 			cb.Redraw (cb.Bounds);
 			TestHelpers.AssertDriverColorsAre (@"
 000000
-000002
-222222
-111112", attributes);
+00000
+22222
+11111", attributes);
 
 			Assert.True (cb.ProcessKey (new KeyEvent (Key.F4, new KeyModifiers ())));
 			Assert.Equal ("Three", selected);

+ 48 - 0
UnitTests/ResponderTests.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using Terminal.Gui;
 using Xunit;
+using static Terminal.Gui.Core.ViewTests;
 
 // Alias Console to MockConsole so we don't accidentally use Console
 using Console = Terminal.Gui.FakeConsole;
@@ -44,5 +45,52 @@ namespace Terminal.Gui.Core {
 		{
 
 		}
+		
+		public class DerivedView : View {
+			public DerivedView ()
+			{
+			}
+
+			public override bool OnKeyDown (KeyEvent keyEvent)
+			{
+				return true;
+			}
+		}
+
+		[Fact]
+		public void IsOverridden_False_IfNotOverridden ()
+		{
+			// MouseEvent IS defined on Responder but NOT overridden
+			Assert.False (Responder.IsOverridden (new Responder () { }, "MouseEvent"));
+
+			// MouseEvent is defined on Responder and NOT overrident on View
+			Assert.False (Responder.IsOverridden (new View () { Text = "View does not override MouseEvent" }, "MouseEvent"));
+			Assert.False (Responder.IsOverridden (new DerivedView () { Text = "DerivedView does not override MouseEvent" }, "MouseEvent"));
+
+			// MouseEvent is NOT defined on DerivedView 
+			Assert.False (Responder.IsOverridden (new DerivedView () { Text = "DerivedView does not override MouseEvent" }, "MouseEvent"));
+
+			// OnKeyDown is defined on View and NOT overrident on Button
+			Assert.False (Responder.IsOverridden (new Button () { Text = "Button does not override OnKeyDown" }, "OnKeyDown"));
+		}
+
+		[Fact]
+		public void IsOverridden_True_IfOverridden ()
+		{
+			// MouseEvent is defined on Responder IS overriden on ScrollBarView (but not View)
+			Assert.True (Responder.IsOverridden (new ScrollBarView () { Text = "ScrollBarView overrides MouseEvent" }, "MouseEvent"));
+
+			// OnKeyDown is defined on View
+			Assert.True (Responder.IsOverridden (new View () { Text = "View overrides OnKeyDown" }, "OnKeyDown"));
+
+			// OnKeyDown is defined on DerivedView
+			Assert.True (Responder.IsOverridden (new DerivedView () { Text = "DerivedView overrides OnKeyDown" }, "OnKeyDown"));
+			
+			// ScrollBarView overrides both MouseEvent (from Responder) and Redraw (from View)
+			Assert.True (Responder.IsOverridden (new ScrollBarView () { Text = "ScrollBarView overrides MouseEvent" }, "MouseEvent"));
+			Assert.True (Responder.IsOverridden (new ScrollBarView () { Text = "ScrollBarView overrides Redraw" }, "Redraw"));
+
+			Assert.True (Responder.IsOverridden (new Button () { Text = "Button overrides MouseEvent" }, "MouseEvent"));
+		}
 	}
 }