mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-29 01:07:58 +01:00
Ooops. I see now IsOverridden must work for this to work
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -484,7 +484,7 @@ namespace Terminal.Gui {
|
||||
search.SetFocus ();
|
||||
}
|
||||
|
||||
search.CursorPosition = search.Text.ConsoleWidth;
|
||||
search.CursorPosition = search.Text.RuneCount;
|
||||
|
||||
return base.OnEnter (view);
|
||||
}
|
||||
|
||||
@@ -728,6 +728,7 @@ namespace Terminal.Gui {
|
||||
|
||||
if (lastSelectedItem == -1) {
|
||||
EnsuresVisibilitySelectedItem ();
|
||||
OnSelectedChanged ();
|
||||
}
|
||||
|
||||
return base.OnEnter (view);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user