]> git.saurik.com Git - wxWidgets.git/commitdiff
extracted the part of ProcessEvent() which is repeated multiple times during the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 22 Sep 2008 00:08:28 +0000 (00:08 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 22 Sep 2008 00:08:28 +0000 (00:08 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55784 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/event.h
src/common/event.cpp

index da1de711aa7ca1d8af57b2d8f3a249657a220912..7bc5cd914ff9f35182c9759ac3d47cf09ce660e3 100644 (file)
@@ -2343,6 +2343,10 @@ public:
     void SetClientData( void *data ) { DoSetClientData(data); }
     void *GetClientData() const { return DoGetClientData(); }
 
+
+    // implementation from now on
+    // --------------------------
+
     // check if the given event table entry matches this event and call the
     // handler if it does
     //
@@ -2352,7 +2356,6 @@ public:
                                       wxEvtHandler *handler,
                                       wxEvent& event);
 
-    // implementation from now on
     virtual bool SearchEventTable(wxEventTable& table, wxEvent& event);
     bool SearchDynamicEventTable( wxEvent& event );
 
@@ -2360,6 +2363,20 @@ public:
     void ClearEventHashTable() { GetEventHashTable().Clear(); }
     void OnSinkDestroyed( wxEvtHandler *sink );
 
+
+    // The method processing the event in this event handler (or rather in this
+    // event handler chain as it also tries the next handler and so on), i.e.
+    // it returns true if we processed this event or false if we didn't but
+    // does not call TryParent() in the latter case. It also doesn't call
+    // wxApp::FilterEvent() before processing it, this is supposed to be done
+    // by the public ProcessEvent() only once for every event we handle.
+    //
+    // It is meant to be called from ProcessEvent() only and is not virtual,
+    // additional event handlers can be hooked into the normal event processing
+    // logic using TryValidator() hook.
+    bool ProcessEventHere(wxEvent& event);
+
+
 private:
     static const wxEventTableEntry sm_eventTableEntries[];
 
index 63b0d382c1ce9323b784512433dc1cd34a983237..6c504bc51ccb95371fb7454aa0dd8364682851f7 100644 (file)
@@ -1304,6 +1304,16 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
         //else: proceed normally
     }
 
+    if ( ProcessEventHere(event) )
+        return true;
+
+    // propagate the event upwards the window chain and/or to the application
+    // object if it wasn't processed at this level 
+    return TryParent(event);
+}
+
+bool wxEvtHandler::ProcessEventHere(wxEvent& event)
+{
     // An event handler can be enabled or disabled
     if ( GetEvtHandlerEnabled() )
     {
@@ -1322,17 +1332,11 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event)
     }
 
     // Try going down the event handler chain
-    if ( GetNextHandler() )
-    {
-        // notice that we shouldn't let the parent have the event even if the
-        // next handler does not process it because it will have already passed
-        // it to the parent in this case
-        return GetNextHandler()->ProcessEvent(event);
-    }
+    if ( GetNextHandler() && GetNextHandler()->ProcessEventHere(event) )
+        return true;
 
-    // Finally propagate the event upwards the window chain and/or to the
-    // application object as necessary
-    return TryParent(event);
+    // We don't have a handler for this event.
+    return false;
 }
 
 bool wxEvtHandler::SafelyProcessEvent(wxEvent& event)