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

This commit is contained in:
Charlie Kindel
2022-11-02 16:54:38 -06:00
6 changed files with 88 additions and 33 deletions

View File

@@ -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>

View File

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

View File

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

View File

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

View File

@@ -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);

View File

@@ -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"));
}
}
}