From 4b6d82c73925712233e68a773f6099f5de8b9222 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 18 Jul 2010 11:53:08 +0000 Subject: [PATCH] Ensure that validators work even in presence of pushed event handlers. Call pre-processing hooks for each of the handlers in the chain and not only the first one. This ensures that a validator (which is invoked during the pre-processing stage) of a window is used even if a window has an event handler pushed on top of it. Closes #12177. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65006 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/event.h | 18 +++++++++++++----- src/common/event.cpp | 28 ++++++++-------------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/include/wx/event.h b/include/wx/event.h index 959796dbea..c0629e53e6 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -3253,11 +3253,19 @@ protected: // validators. virtual bool TryBefore(wxEvent& event); - // this one is not a hook but just a helper which looks up the handler in - // this object itself called from ProcessEventLocally() and normally - // shouldn't be called directly as doing it would ignore any chained event - // handlers - bool TryHere(wxEvent& event); + // This one is not a hook but just a helper which looks up the handler in + // this object itself. + // + // It is called from ProcessEventLocally() and normally shouldn't be called + // directly as doing it would ignore any chained event handlers + bool TryHereOnly(wxEvent& event); + + // Another helper which simply calls pre-processing hook and then tries to + // handle the event at this handler level. + bool TryBeforeAndHere(wxEvent& event) + { + return TryBefore(event) || TryHereOnly(event); + } // this one is called after failing to find the event handle in our own // table to give a chance to the other windows to process it diff --git a/src/common/event.cpp b/src/common/event.cpp index cbcf705f28..dd439f8427 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1379,7 +1379,7 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) // Short circuit the event processing logic if we're requested to process // this event in this handler only, see DoTryChain() for more details. if ( event.ShouldProcessOnlyIn(this) ) - return TryHere(event); + return TryBeforeAndHere(event); // Try to process the event in this handler itself. @@ -1406,23 +1406,11 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) bool wxEvtHandler::ProcessEventLocally(wxEvent& event) { - // First try the hooks which should be called before our own handlers - if ( TryBefore(event) ) - return true; - - // Then try this handler itself, notice that we should not call - // ProcessEvent() on this one as we're already called from it, which - // explains why we do it here and not in DoTryChain() - if ( TryHere(event) ) - return true; - - // Finally try the event handlers chained to this one, - if ( DoTryChain(event) ) - return true; - - // And return false to indicate that we didn't find any handler at this - // level. - return false; + // Try the hooks which should be called before our own handlers and this + // handler itself first. Notice that we should not call ProcessEvent() on + // this one as we're already called from it, which explains why we do it + // here and not in DoTryChain() + return TryBeforeAndHere(event) || DoTryChain(event); } bool wxEvtHandler::DoTryChain(wxEvent& event) @@ -1434,7 +1422,7 @@ bool wxEvtHandler::DoTryChain(wxEvent& event) // ProcessEvent() from which we were called or will be done by it when // we return. // - // However we must call ProcessEvent() and not TryHere() because the + // However we must call ProcessEvent() and not TryHereOnly() because the // existing code (including some in wxWidgets itself) expects the // overridden ProcessEvent() in its custom event handlers pushed on a // window to be called. @@ -1478,7 +1466,7 @@ bool wxEvtHandler::DoTryChain(wxEvent& event) return false; } -bool wxEvtHandler::TryHere(wxEvent& event) +bool wxEvtHandler::TryHereOnly(wxEvent& event) { // If the event handler is disabled it doesn't process any events if ( !GetEvtHandlerEnabled() ) -- 2.45.2