diff --git a/Terminal.Gui/Core/Responder.cs b/Terminal.Gui/Core/Responder.cs index 37de821453..7b92f8a04d 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 @@ public virtual void OnEnabledChanged () { } /// 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 0fcd73b077..488478991a 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -3073,19 +3073,5 @@ public View GetTopSuperView () 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/UnitTests/ResponderTests.cs b/UnitTests/ResponderTests.cs index 7f2d927f88..3b21a9af78 100644 --- a/UnitTests/ResponderTests.cs +++ b/UnitTests/ResponderTests.cs @@ -3,6 +3,7 @@ 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 @@ public void Dispose_Works () { } + + 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")); + } } }