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