diff --git a/Terminal.Gui/Core/Responder.cs b/Terminal.Gui/Core/Responder.cs
index 37de82145..7b92f8a04 100644
--- a/Terminal.Gui/Core/Responder.cs
+++ b/Terminal.Gui/Core/Responder.cs
@@ -16,6 +16,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Reflection;
namespace Terminal.Gui {
///
@@ -236,6 +237,25 @@ namespace Terminal.Gui {
///
public virtual void OnVisibleChanged () { }
+ ///
+ /// Utilty function to determine is overridden in the .
+ ///
+ /// The view.
+ /// The method name.
+ /// if it's overridden, otherwise.
+ 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;
+ }
+
///
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
///
diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs
index 0fcd73b07..488478991 100644
--- a/Terminal.Gui/Core/View.cs
+++ b/Terminal.Gui/Core/View.cs
@@ -3073,19 +3073,5 @@ namespace Terminal.Gui {
return top;
}
-
- ///
- /// Check if the is overridden in the .
- ///
- /// The view.
- /// The method name.
- /// if it's overridden, otherwise.
- 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);
- }
}
}
diff --git a/Terminal.Gui/Views/ComboBox.cs b/Terminal.Gui/Views/ComboBox.cs
index 173dc188d..c26a340ed 100644
--- a/Terminal.Gui/Views/ComboBox.cs
+++ b/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);
}
diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs
index 6997ce5ce..957216837 100644
--- a/Terminal.Gui/Views/ListView.cs
+++ b/Terminal.Gui/Views/ListView.cs
@@ -728,6 +728,7 @@ namespace Terminal.Gui {
if (lastSelectedItem == -1) {
EnsuresVisibilitySelectedItem ();
+ OnSelectedChanged ();
}
return base.OnEnter (view);
diff --git a/UnitTests/ComboBoxTests.cs b/UnitTests/ComboBoxTests.cs
index 41adc4b40..bf5b385c0 100644
--- a/UnitTests/ComboBoxTests.cs
+++ b/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);
diff --git a/UnitTests/ResponderTests.cs b/UnitTests/ResponderTests.cs
index 7f2d927f8..3b21a9af7 100644
--- a/UnitTests/ResponderTests.cs
+++ b/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"));
+ }
}
}