From 7f853dd0467e95ef3006d5c45f26917d584a3396 Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Thu, 22 Jan 2009 11:53:09 +0000 Subject: [PATCH] fix wxWindow::PushEventHandler and related wxWindow functions for the stack management; currently they don't work well when passing event handlers which are part of an event handler chain (see wx-dev thread 'wxWindow event handler stack'); implement wxEvtHandler Unlink() and IsUnlinked() functions and document them; revise docs of all involved functions of both wxEvtHandler and wxWindow, adding images for better explanations git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58291 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- .../images/evthandler_unlink_after.dia | Bin 0 -> 2179 bytes .../images/evthandler_unlink_after.png | Bin 0 -> 12337 bytes .../images/evthandler_unlink_before.dia | Bin 0 -> 1936 bytes .../images/evthandler_unlink_before.png | Bin 0 -> 12581 bytes .../images/overview_eventhandling_chain.dia | Bin 0 -> 1948 bytes .../images/overview_eventhandling_chain.png | Bin 0 -> 12581 bytes .../overview_eventhandling_winstack.dia | Bin 0 -> 2273 bytes .../overview_eventhandling_winstack.png | Bin 0 -> 25506 bytes docs/doxygen/overviews/eventhandling.h | 22 ++- docs/doxygen/wxwidgets.css | 6 +- include/wx/event.h | 24 +++- include/wx/window.h | 16 ++- interface/wx/event.h | 82 ++++++++--- interface/wx/window.h | 108 +++++++++----- src/common/event.cpp | 27 +++- src/common/wincmn.cpp | 133 ++++++++++++------ 16 files changed, 301 insertions(+), 117 deletions(-) create mode 100644 docs/doxygen/images/evthandler_unlink_after.dia create mode 100644 docs/doxygen/images/evthandler_unlink_after.png create mode 100644 docs/doxygen/images/evthandler_unlink_before.dia create mode 100644 docs/doxygen/images/evthandler_unlink_before.png create mode 100644 docs/doxygen/images/overview_eventhandling_chain.dia create mode 100644 docs/doxygen/images/overview_eventhandling_chain.png create mode 100644 docs/doxygen/images/overview_eventhandling_winstack.dia create mode 100644 docs/doxygen/images/overview_eventhandling_winstack.png diff --git a/docs/doxygen/images/evthandler_unlink_after.dia b/docs/doxygen/images/evthandler_unlink_after.dia new file mode 100644 index 0000000000000000000000000000000000000000..bf494dba217becaafd6886fd75714bd9ec906156 GIT binary patch literal 2179 zcmV-}2z>V+iwFP!000021MOYibDKC2f6rgxabF!Gtpq|zlTLfnn?7`|4{e`4*d`8F z3?3j~FZZ{f1h|ed#IccZNR^p-##G)#V!wW?)$;zs!y+8q`AHhY(d7_ZXgKhrX*>&} z`Q`BEkH1gd;fJe}_p`t|7yssow-|_DM5+9CIlRfT<@wp!{r$ZaKBit4Csr8TTB(2b zpBIMSnHY37ygC^So)VaOnJ2H6SG_Dtg2`>>40;7*&p&#$lWc z?!54F`0hIY8=jS9&Nk>gLwo7X{Ym0`znV!S@yGcgq?dkDCA(P0X&{DVkIStg4Rqw^ zlQHF}R1AvdSMNU3cf~E07uK}uZnTj}w(yd95N-1jYZDd=0hS8@Vliy)a>OXZt2No5 z-K1M~VYlp(ZrKItco`>I;sx0@%SjxEz84i-v*gx4oKHISLLp+$O{>K$u7fO#cijKA z7p5W`YJ-vwzf3H`de528#N`A0S6 zt4}Al-s_*Yl!k&@qkEXSzU|xlyNCI0F!R$LVzxP^fznMm>}=PnSI50{VTwx?XPvVM zy+=PO$$!6&qggy0ln=MGHcwU{p8V@ivvO+RGcTHX$!u^s_!K`3*Aa(^H-g#a@Eh7( zn(AZ(F=6$#)@B*61;`$qlImo)O+^#&$)rj<5qIxJ^UyEpQ;SO$7P2ouevXj%IE2PNMB_K+TMD2D#1Hp4G};xGhNE_`&=pYo>kRZ3mH9k@2Pm)`n=)C(+-2EYh3! zeq0k`?)IPia4DYcIPqq|ZQ8s{*uu=FoDv(!_`qehe@b>em*QffT?eZhZmn+4=oECS zo1Lp0NOi-mRJT(ku4vV_!>9BTeFKg9hF^s;>?xT){D4X(* zV^O_(SgU9kI>|PH$u_-$XcxDxa{}GzCa9#F0D2bgnsk%utyPn5>UD|JacZ1!`ywa3 z2`5-5oS>706PSe4YjDBsE1Yy^oS>3%0;gv?J|^R&+69}8Q?FgH?&_wmLFCu@U|Yel z3aa~51t-8qVA%vwav^{*I4+S~9fsUP^Ak}t_M=%ok$tA8GD#&QYr3rRt~>g=m%EN; zV=qbK`)33hT9O`zel&kB)If(y#G1v9VCKafR3w1u*7L9VEncZI+Waxnuan0>K zT#GZ;9i37Ohy%jDaqIAY8(kW>PsYG0HgHnZ1me}N*p=H)O6YDV<8IQ;}oI*QBZWJx#VsGU4YXi zy4ajtUFE1j7jJh9o3w!!^f>UMeGx6`246@%Yk(mSHg*Cq6im+`41+LsAPl?x5sPjR zhTyY87_2C0XEsPZB)AXVIt{+)0$=m}A&5+&$^MG%GyVSh1mV1(^TUCgU>%in%{K0jFwE(iAy zpYO6SxjjnG&llrm;@<`FZCYMBiE73~;x5XsrUF5Arf@@OP5FURA5PSouBMcotKw}@ znqSESmg~57&c+rf>>_upEPq=C<*w}#-DLsQDb@@jVu;Dvy|J8Ki&H1S8;_r94U=1! zE^@u^oN=GL`>m5#Epn|doH41nKRGo=kb=PfP`~lge)m8j_nnko$R^{ZUxeOo0c=;WpqIuxzk%GXu$F0ez385!_kz{3vk(7sxZ=>-q6Bi#x-aNFjxgCb+p z$?*fC6gdV%7!0wJM1diQg9tV#qK_};gtjQ6_#S$XesXnEd=dZViMO~q`5zcTBC(5( F008SlNYVfR literal 0 HcmV?d00001 diff --git a/docs/doxygen/images/evthandler_unlink_after.png b/docs/doxygen/images/evthandler_unlink_after.png new file mode 100644 index 0000000000000000000000000000000000000000..f96ffcc7dfb9d61eadea10c731d4b464e62005f8 GIT binary patch literal 12337 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 WT-3Cmid4@h{pF<}OBG5OzWG1OE~rNzN)H#xffO zDnNc*_P6iwh$Il`HOxrZ@OA)oFwkf?jXXb` z-41^J{QJE<_;`2q!Smf~_HP!ubB&!5CfTRk!9$uZu1BM%rzbslN!&Dw^}t{12_60C z27xJWlFWsozvUF#GU@0#nCeK2F0jy+%yWJSbKDX z+rhj0{AVyK#f&O)cF111GdhW>`@3Btg4NDDl~l^kuO%q(x5l|Hhbd zRKf;@v%7bnjCaK)l?T?cnl7|eNji7qnICTJVQUi<3xRYSA;cDgIJN^U!-9X-SDR-{A9d{;xu;sbX(;liUR6}h1N7)($n=MQ#W8Hwrg4(v$*%uG}?3h_im6J zGJ)do%G-|h+*#~7g7p+PCWUafdEUai|8?xr)Gjp>Zkx z$9)uf(LgJ2ZW(PhRv?=EOQ&f$wI8V)dT#7#@3qg-^I*+57~k-{+rf8GU7Gr2m@pRg zw$^45tqq9iEW8e}4hbUlNpFXYHYJluT}RAj;fAw-mU;}`A-Nua$PL0eV4qAKfm5~8 zfX>I$C=R!|LATS(73G0sdy0R8h|MATf%>zDv|TnnO|~Dhl^IvvvXQqTGqK}Nji5hwKm!xg=v$f?6`LC z&i&wpU630l11(8kGFricQ*r7)GbzBy_eFI$sbvJG{2)$U$ejhR#mk&{-9)I!0$lp>xmC***(8L+&;#WJ#)CnVaP+ zOeB@BI+&iSU#a@lZYSjK!$OisGODm-EQ=*0MUyXyCPVHX5#5zwW7UXWl!bs9{CRjmfLlR1NFg=CR9ilXMFBZmfP?{M|1*Mr@)r<9}QF>*0 z3Z;9C(xRKOzWO0;f@$t{EC}R;Jx6y8WEn%m6gddpK%zs(G&8G*hGm{w>D@ zG@J{|b3yf7Aj`qI+r1EyRDFQChp!wQSu!2GWtKup+{(c()xj}`gTr%qxYb!bT(pNH z-Gf(|nImZ@GiM#_*zbLccAr(W>v%&NM}@n7hdXel zaL3)Oh@qTtSL(^b9s8ZY{)D@~RJiN-fihI#uHWGfijH?Jr7DEFd1af34tIubIF17| zMF1J_hA@H$fHTZC%LKOQN>%eD8^#T7Ri1iX<*C|x#ipEgOvK-gd8#QMyxYz&dtKtj z(lZv4y(=NK`*LWD>$x-p_FN*NuP0TvZ&$A;okaP$J4wmV5sG}sKnz%Pf*I;rjNuI( z-LNj7=70P3_3ImB`ariq^~Vsta|yEsU?J5;+Q&9hbfz{^L^|r87tZ@J%8CDq_cOhW z_(Ms&zh#z90~Pasbq}U-EA`+1WEz=*6Z)3C!Q`)B3QZg^SY;0RE(a1)2dHufl{*N^ z9V~tv6`DLS_*`cX49!&fpwfpe`&0QtZ}W%q?0Sg!8(e|Vu$O&X2a9=(WMp0BjAUTJ zB;)k?96~an$PJW?*Yq7)+>MzKGDa%0O9`@gi&3^)OO{nK)65dw9z3-F_WkFV>#K!! zt35q`c})MwBT;;PJs&S(`shc?q&##LHjD|`Rg@pq!~c$ZovIeA9{P8R-uTG4Rea9B WS@!O#^3}6(f5~ literal 0 HcmV?d00001 diff --git a/docs/doxygen/images/evthandler_unlink_before.png b/docs/doxygen/images/evthandler_unlink_before.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4c931fe3cd3bb17ebefe60c3ba75e6a9f8d8ca GIT binary patch literal 12581 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 literal 0 HcmV?d00001 diff --git a/docs/doxygen/images/overview_eventhandling_chain.png b/docs/doxygen/images/overview_eventhandling_chain.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4c931fe3cd3bb17ebefe60c3ba75e6a9f8d8ca GIT binary patch literal 12581 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 literal 0 HcmV?d00001 diff --git a/docs/doxygen/images/overview_eventhandling_winstack.png b/docs/doxygen/images/overview_eventhandling_winstack.png new file mode 100644 index 0000000000000000000000000000000000000000..397a97cb134678d378871ce2969a31341041becd GIT binary patch literal 25506 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 Tyweok3YXE3dv+EXIGp__-n*%W literal 0 HcmV?d00001 diff --git a/docs/doxygen/overviews/eventhandling.h b/docs/doxygen/overviews/eventhandling.h index 8c6511a0c0..3ee135fc24 100644 --- a/docs/doxygen/overviews/eventhandling.h +++ b/docs/doxygen/overviews/eventhandling.h @@ -184,7 +184,7 @@ in the previous section. However the similarities end here and both the syntax and the possibilities of handling events in this way are rather different. Let us start by looking at the syntax: the first obvious difference is that you -need not use @c DECLARE_EVENT_TABLE() nor @c BEGIN_EVENT_TABLE and the +need not use DECLARE_EVENT_TABLE() nor BEGIN_EVENT_TABLE() and the associated macros. Instead, in any place in your code, but usually in the code of the class defining the handler itself (and definitely not in the global scope as with the event tables), call its Connect() method like this: @@ -331,10 +331,20 @@ doesn't count as having handled the event and the search continues):
  • The event is passed to the next event handler, if any, in the event handler chain, i.e., the steps (1) to (4) are done for it. This chain can be formed - using wxEvtHandler::SetNextHandler() or wxWindow::PushEventHandler() but - usually there is no next event handler and chaining event handlers using - these functions is much less useful now that Connect() exists so this step - will almost never do anything. + using wxEvtHandler::SetNextHandler(): + @image html overview_eventhandling_chain.png + (referring to the image, if @c A->ProcessEvent is called and it doesn't handle + the event, @c B->ProcessEvent will be called and so on...). + In the case of wxWindow you can build a stack (implemented using wxEvtHandler + double-linked list) using wxWindow::PushEventHandler(): + @image html overview_eventhandling_winstack.png + (referring to the image, if @c W->ProcessEvent is called, it immediately calls + @c A->ProcessEvent; if nor @c A nor @c B handle the event, then the wxWindow + itself is used - i.e. the dynamically connected event handlers and static + event table entries of wxWindow are looked as the last possibility, after + all pushed event handlers were tested). + Note however that usually there are no wxEvtHandler chains nor wxWindows stacks + so this step will usually do anything.
  • @@ -349,7 +359,7 @@ doesn't count as having handled the event and the search continues):
  • Finally, i.e., if the event is still not processed, the wxApp object itself - gets a last chance to process it. + (which derives from wxEvtHandler) gets a last chance to process it.
  • diff --git a/docs/doxygen/wxwidgets.css b/docs/doxygen/wxwidgets.css index 9f32c5b848..22957b7128 100644 --- a/docs/doxygen/wxwidgets.css +++ b/docs/doxygen/wxwidgets.css @@ -283,7 +283,7 @@ HR { } .memproto, .memdoc { - border: 1px solid #84b0c7; + border: 1px solid #84b0c7; } .memproto { @@ -400,6 +400,10 @@ H2 > A.anchor { color: black; } +IMG { + margin: 20px; +} + IMG.logo { float: right; margin: 20px; diff --git a/include/wx/event.h b/include/wx/event.h index 42c5406b13..b1c8df4821 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -2668,14 +2668,27 @@ public: wxEvtHandler(); virtual ~wxEvtHandler(); + + // Event handler chain + // ------------------- + wxEvtHandler *GetNextHandler() const { return m_nextHandler; } wxEvtHandler *GetPreviousHandler() const { return m_previousHandler; } - void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; } - void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; } + virtual void SetNextHandler(wxEvtHandler *handler) { m_nextHandler = handler; } + virtual void SetPreviousHandler(wxEvtHandler *handler) { m_previousHandler = handler; } void SetEvtHandlerEnabled(bool enabled) { m_enabled = enabled; } bool GetEvtHandlerEnabled() const { return m_enabled; } + void Unlink(); + bool IsUnlinked() const; + + + + // Event queuing and processing + // ---------------------------- + + // Process an event right now: this can only be called from the main // thread, use QueueEvent() for scheduling the events for // processing from other threads. @@ -2686,6 +2699,7 @@ public: // when called from C code (e.g. in GTK+ callback) when the exception // wouldn't correctly propagate to wxEventLoop. bool SafelyProcessEvent(wxEvent& event); + // NOTE: uses ProcessEvent() // Schedule the given event to be processed later. It takes ownership of // the event pointer, i.e. it will be deleted later. This is safe to call @@ -2708,11 +2722,17 @@ public: } void ProcessPendingEvents(); + // NOTE: uses ProcessEvent() #if wxUSE_THREADS bool ProcessThreadEvent(const wxEvent& event); + // NOTE: uses AddPendingEvent() #endif + + // Connecting and disconnecting + // ---------------------------- + // Dynamic association of a member function handler with the event handler, // winid and event type void Connect(int winid, diff --git a/include/wx/window.h b/include/wx/window.h index 3a626d5a88..932ac84f36 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -792,7 +792,7 @@ public: // replace the event handler (allows to completely subclass the // window) - void SetEventHandler( wxEvtHandler *handler ) { m_eventHandler = handler; } + void SetEventHandler( wxEvtHandler *handler ); // push/pop event handler: allows to chain a custom event handler to // alreasy existing ones @@ -806,13 +806,17 @@ public: // be there) bool RemoveEventHandler(wxEvtHandler *handler); - // Process an event by calling GetEventHandler()->ProcessEvent() and - // handling any exceptions thrown by event handlers. It's mostly useful - // when processing wx events when called from C code (e.g. in GTK+ - // callback) when the exception wouldn't correctly propagate to - // wxEventLoop. + // Process an event by calling GetEventHandler()->ProcessEvent() and + // handling any exceptions thrown by event handlers. It's mostly useful + // when processing wx events when called from C code (e.g. in GTK+ + // callback) when the exception wouldn't correctly propagate to + // wxEventLoop. bool HandleWindowEvent(wxEvent& event) const; + // disable wxEvtHandler double-linked list mechanism: + virtual void SetNextHandler(wxEvtHandler *handler); + virtual void SetPreviousHandler(wxEvtHandler *handler); + // validators // ---------- diff --git a/interface/wx/event.h b/interface/wx/event.h index 8f76631f11..7fa2d397e6 100644 --- a/interface/wx/event.h +++ b/interface/wx/event.h @@ -258,7 +258,7 @@ public: wxWindow is (and therefore all window classes are) derived from this class. When events are received, wxEvtHandler invokes the method listed in the - event table using itself as the object. When using multiple inheritance + event table using itself as the object. When using multiple inheritance it is imperative that the wxEvtHandler(-derived) class is the first class inherited such that the @c this pointer for the overall object will be identical to the @c this pointer of the wxEvtHandler portion. @@ -279,8 +279,8 @@ public: /** Destructor. - If the handler is part of a chain, the destructor will unlink itself and - restore the previous and next handlers so that they point to each other. + If the handler is part of a chain, the destructor will unlink itself + (see Unlink()). */ virtual ~wxEvtHandler(); @@ -382,17 +382,23 @@ public: The normal order of event table searching is as follows: -# If the object is disabled (via a call to wxEvtHandler::SetEvtHandlerEnabled) - the function skips to step (6). + the function skips to step (6). -# If the object is a wxWindow, ProcessEvent() is recursively called on the - window's wxValidator. If this returns @true, the function exits. + window's wxValidator. If this returns @true, the function exits. -# SearchEventTable() is called for this event handler. If this fails, the base - class table is tried, and so on until no more tables exist or an appropriate - function was found, in which case the function exits. + class table is tried, and so on until no more tables exist or an appropriate + function was found, in which case the function exits. -# The search is applied down the entire chain of event handlers (usually the - chain has a length of one). If this succeeds, the function exits. + chain has a length of one). This chain can be formed using wxEvtHandler::SetNextHandler(): + @image html overview_eventhandling_chain.png + (referring to the image, if @c A->ProcessEvent is called and it doesn't handle + the event, @c B->ProcessEvent will be called and so on...). + Note that in the case of wxWindow you can build a stack of event handlers + (see wxWindow::PushEventHandler() for more info). + If any of the handlers of the chain return @true, the function exits. -# If the object is a wxWindow and the event is a wxCommandEvent, ProcessEvent() - is recursively applied to the parent window's event handler. - If this returns true, the function exits. + is recursively applied to the parent window's event handler. + If this returns @true, the function exits. -# Finally, ProcessEvent() is called on the wxApp object. @param event @@ -620,7 +626,10 @@ public: /** - @name Event handler chain + @name Event handler chaining + + wxEvtHandler can be arranged in a double-linked list of handlers + which is automatically iterated by ProcessEvent() if needed. */ //@{ @@ -664,21 +673,60 @@ public: /** Sets the pointer to the next handler. + @remarks + See ProcessEvent() for more info about how the chains of event handlers + are internally used. + Also remember that wxEvtHandler uses double-linked lists and thus if you + use this function, you should also call SetPreviousHandler() on the + argument passed to this function: + @code + handlerA->SetNextHandler(handlerB); + handlerB->SetPreviousHandler(handlerA); + @endcode + @param handler - Event handler to be set as the next handler. + The event handler to be set as the next handler. + Cannot be @NULL. - @see GetNextHandler(), SetPreviousHandler(), GetPreviousHandler(), - wxWindow::PushEventHandler, wxWindow::PopEventHandler + @see @ref overview_eventhandling_processing */ - void SetNextHandler(wxEvtHandler* handler); + virtual void SetNextHandler(wxEvtHandler* handler); /** Sets the pointer to the previous handler. + All remarks about SetNextHandler() apply to this function as well. @param handler - Event handler to be set as the previous handler. + The event handler to be set as the previous handler. + Cannot be @NULL. + + @see @ref overview_eventhandling_processing + */ + virtual void SetPreviousHandler(wxEvtHandler* handler); + + /** + Unlinks this event handler from the chain it's part of (if any); + then links the "previous" event handler to the "next" one + (so that the chain won't be interrupted). + + E.g. if before calling Unlink() you have the following chain: + @image html evthandler_unlink_before.png + then after calling @c B->Unlink() you'll have: + @image html evthandler_unlink_after.png + + @since 2.9.0 + */ + void Unlink(); + + /** + Returns @true if the next and the previous handler pointers of this + event handler instance are @NULL. + + @since 2.9.0 + + @see SetPreviousHandler(), SetNextHandler() */ - void SetPreviousHandler(wxEvtHandler* handler); + bool IsUnlinked() const; //@} }; diff --git a/interface/wx/window.h b/interface/wx/window.h index 3bfeaf9b37..a77ebf3604 100644 --- a/interface/wx/window.h +++ b/interface/wx/window.h @@ -1656,6 +1656,9 @@ public: /** @name Event-handling functions + + wxWindow allows you to build a (sort of) stack of event handlers which + can be used to override the window's own event handling. */ //@{ @@ -1669,9 +1672,8 @@ public: wxEvtHandler* GetEventHandler() const; /** - This function will generate the appropriate call to - Navigate() if the key event is one normally used for - keyboard navigation and return @true in this case. + This function will generate the appropriate call to Navigate() if the key + event is one normally used for keyboard navigation and return @true in this case. @return Returns @true if the key pressed was for navigation and was handled, @false otherwise. @@ -1691,44 +1693,62 @@ public: /** Removes and returns the top-most event handler on the event handler stack. + E.g. in the case of: + @image html overview_eventhandling_winstack.png + when calling @c W->PopEventHandler(), the event handler @c A will be + removed and @c B will be the first handler of the stack. + + Note that it's an error to call this function when no event handlers + were pushed on this window (i.e. when the window itself is its only + event handler). + @param deleteHandler - If this is @true, the handler will be deleted after it is removed. - The default value is @false. + If this is @true, the handler will be deleted after it is removed + (and the returned value will be @NULL). - @see SetEventHandler(), GetEventHandler(), - PushEventHandler(), wxEvtHandler::ProcessEvent, wxEvtHandler + @see @ref overview_eventhandling_processing */ wxEvtHandler* PopEventHandler(bool deleteHandler = false); /** Pushes this event handler onto the event stack for the window. + An event handler is an object that is capable of processing the events sent + to a window. By default, the window is its own event handler, but an application + may wish to substitute another, for example to allow central implementation + of event-handling for a variety of different window classes. + + wxWindow::PushEventHandler allows an application to set up a @e stack + of event handlers, where an event not handled by one event handler is + handed to the next one in the chain. + + E.g. if you have two event handlers @c A and @c B and a wxWindow instance + @c W and you call: + @code + W->PushEventHandler(A); + W->PushEventHandler(B); + @endcode + you will end up with the following situation: + @image html overview_eventhandling_winstack.png + + Note that you can use wxWindow::PopEventHandler to remove the event handler. + @param handler Specifies the handler to be pushed. + It must not be part of a wxEvtHandler chain; an assert will fail + if it's not unlinked (see wxEvtHandler::IsUnlinked). - @remarks An event handler is an object that is capable of processing the - events sent to a window. By default, the window is its - own event handler, but an application may wish to - substitute another, for example to allow central - implementation of event-handling for a variety of - different window classes. - wxWindow::PushEventHandler allows an application to set up a - chain of event handlers, where an event not handled by one event - handler is handed to the next one in the chain. - Use wxWindow::PopEventHandler to remove the event handler. - - @see SetEventHandler(), GetEventHandler(), - PopEventHandler(), wxEvtHandler::ProcessEvent, wxEvtHandler + @see @ref overview_eventhandling_processing */ void PushEventHandler(wxEvtHandler* handler); /** - Find the given @a handler in the windows event handler chain and remove - (but not delete) it from it. + Find the given @a handler in the windows event handler stack and unlinks + (but not delete) it. See wxEvtHandler::Unlink() for more info. @param handler The event handler to remove, must be non-@NULL and - must be present in this windows event handlers chain + must be present in this windows event handlers stack. @return Returns @true if it was found and @false otherwise (this also results in an assert failure so this function should @@ -1741,27 +1761,41 @@ public: /** Sets the event handler for this window. + Note that if you use this function you may want to use as the "next" handler + of @a handler the window itself; in this way when @a handler doesn't process + an event, the window itself will have a chance to do it. + @param handler - Specifies the handler to be set. - - @remarks An event handler is an object that is capable of processing the - events sent to a window. By default, the window is its - own event handler, but an application may wish to - substitute another, for example to allow central - implementation of event-handling for a variety of - different window classes. - It is usually better to use wxWindow::PushEventHandler since - this sets up a chain of event handlers, where an event not - handled by one event handler is handed to the next one in the chain. - - @see GetEventHandler(), PushEventHandler(), - PopEventHandler(), wxEvtHandler::ProcessEvent, wxEvtHandler + Specifies the handler to be set. Cannot be @NULL. + + @see @ref overview_eventhandling_processing */ void SetEventHandler(wxEvtHandler* handler); + /** + wxWindows cannot be used to form event handler chains; this function + thus will assert when called. + + Note that instead you can use PushEventHandler() or SetEventHandler() to + implement a stack of event handlers to override wxWindow's own + event handling mechanism. + */ + virtual void SetNextHandler(wxEvtHandler* handler); + + /** + wxWindows cannot be used to form event handler chains; this function + thus will assert when called. + + Note that instead you can use PushEventHandler() or SetEventHandler() to + implement a stack of event handlers to override wxWindow's own + event handling mechanism. + */ + virtual void SetPreviousHandler(wxEvtHandler* handler); + //@} + /** @name Window styles functions */ diff --git a/src/common/event.cpp b/src/common/event.cpp index 3ee0d136ed..4d349cf956 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1036,12 +1036,7 @@ wxEvtHandler::wxEvtHandler() wxEvtHandler::~wxEvtHandler() { - // Takes itself out of the list of handlers - if (m_previousHandler) - m_previousHandler->m_nextHandler = m_nextHandler; - - if (m_nextHandler) - m_nextHandler->m_previousHandler = m_previousHandler; + Unlink(); if (m_dynamicEvents) { @@ -1103,6 +1098,26 @@ wxEvtHandler::~wxEvtHandler() delete m_clientObject; } +void wxEvtHandler::Unlink() +{ + // this event handler must take itself out of the chain of handlers: + + if (m_previousHandler) + m_previousHandler->SetNextHandler(m_nextHandler); + + if (m_nextHandler) + m_nextHandler->SetPreviousHandler(m_previousHandler); + + m_nextHandler = NULL; + m_previousHandler = NULL; +} + +bool wxEvtHandler::IsUnlinked() const +{ + return m_previousHandler == NULL && + m_nextHandler == NULL; +} + #if wxUSE_THREADS bool wxEvtHandler::ProcessThreadEvent(const wxEvent& event) diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 964585411a..878bca5ae8 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -1096,73 +1096,121 @@ bool wxWindowBase::Reparent(wxWindowBase *newParent) // event handler stuff // ---------------------------------------------------------------------------- -void wxWindowBase::PushEventHandler(wxEvtHandler *handler) +void wxWindowBase::SetEventHandler(wxEvtHandler *handler) { + wxCHECK_RET(handler != NULL, "SetEventHandler(NULL) called"); + + m_eventHandler = handler; +} + +void wxWindowBase::SetNextHandler(wxEvtHandler *WXUNUSED(handler)) +{ + // disable wxEvtHandler chain mechanism for wxWindows: + // wxWindow uses its own stack mechanism which doesn't mix well with wxEvtHandler's one + + wxFAIL_MSG("wxWindow cannot be part of a wxEvtHandler chain"); +} +void wxWindowBase::SetPreviousHandler(wxEvtHandler *WXUNUSED(handler)) +{ + // we can't simply wxFAIL here as in SetNextHandler: in fact the last + // handler of our stack when is destroyed will be Unlink()ed and thus + // will call this function to update the pointer of this window... + + //wxFAIL_MSG("wxWindow cannot be part of a wxEvtHandler chain"); +} + +void wxWindowBase::PushEventHandler(wxEvtHandler *handlerToPush) +{ + wxCHECK_RET( handlerToPush != NULL, "PushEventHandler(NULL) called" ); + + // the new handler is going to be part of the wxWindow stack of event handlers: + // it can't be part also of an event handler double-linked chain: + wxASSERT_MSG(handlerToPush->IsUnlinked(), + "The handler being pushed in the wxWindow stack shouldn't be part of " + "a wxEvtHandler chain; call Unlink() on it first"); + wxEvtHandler *handlerOld = GetEventHandler(); + wxCHECK_RET( handlerOld, "an old event handler is NULL?" ); + + // now use wxEvtHandler double-linked list to implement a stack: + handlerToPush->SetNextHandler(handlerOld); - handler->SetNextHandler(handlerOld); + if (handlerOld != this) + handlerOld->SetPreviousHandler(handlerToPush); - if ( handlerOld ) - GetEventHandler()->SetPreviousHandler(handler); + SetEventHandler(handlerToPush); - SetEventHandler(handler); +#ifdef __WXDEBUG__ + // final checks of the operations done above: + wxASSERT_MSG( handlerToPush->GetPreviousHandler() == NULL, + "the first handler of the wxWindow stack should have no previous handlers set" ); + wxASSERT_MSG( handlerToPush->GetNextHandler() != NULL, + "the first handler of the wxWindow stack should have non-NULL next handler" ); + + wxEvtHandler* pLast = handlerToPush; + while (pLast && pLast != this) + pLast = pLast->GetNextHandler(); + wxASSERT_MSG( pLast->GetNextHandler() == NULL, + "the last handler of the wxWindow stack should have this window as next handler" ); +#endif } wxEvtHandler *wxWindowBase::PopEventHandler(bool deleteHandler) { - wxEvtHandler *handlerA = GetEventHandler(); - if ( handlerA ) - { - wxEvtHandler *handlerB = handlerA->GetNextHandler(); - handlerA->SetNextHandler(NULL); + // we need to pop the wxWindow stack, i.e. we need to remove the first handler - if ( handlerB ) - handlerB->SetPreviousHandler(NULL); - SetEventHandler(handlerB); + wxEvtHandler *firstHandler = GetEventHandler(); + wxCHECK_MSG( firstHandler != NULL, NULL, "wxWindow cannot have a NULL event handler" ); + wxCHECK_MSG( firstHandler != this, NULL, "cannot pop the wxWindow itself" ); + wxCHECK_MSG( firstHandler->GetPreviousHandler() == NULL, NULL, + "the first handler of the wxWindow stack should have no previous handlers set" ); - if ( deleteHandler ) - { - delete handlerA; - handlerA = NULL; - } + wxEvtHandler *secondHandler = firstHandler->GetNextHandler(); + wxCHECK_MSG( secondHandler != NULL, NULL, + "the first handler of the wxWindow stack should have non-NULL next handler" ); + + firstHandler->SetNextHandler(NULL); + secondHandler->SetPreviousHandler(NULL); + + // now firstHandler is completely unlinked; set secondHandler as the new window event handler + SetEventHandler(secondHandler); + + if ( deleteHandler ) + { + delete firstHandler; + firstHandler = NULL; } - return handlerA; + return firstHandler; } -bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler) +bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handlerToRemove) { - wxCHECK_MSG( handler, false, _T("RemoveEventHandler(NULL) called") ); + wxCHECK_MSG( handlerToRemove != NULL, false, "RemoveEventHandler(NULL) called" ); + wxCHECK_MSG( handlerToRemove != this, false, "Cannot remove the window itself" ); + + if (handlerToRemove == GetEventHandler()) + { + // removing the first event handler is equivalent to "popping" the stack + PopEventHandler(false); + return true; + } - wxEvtHandler *handlerPrev = NULL, - *handlerCur = GetEventHandler(); - while ( handlerCur ) + // NOTE: the wxWindow event handler list is always terminated with "this" handler + wxEvtHandler *handlerCur = GetEventHandler()->GetNextHandler(); + while ( handlerCur != this ) { wxEvtHandler *handlerNext = handlerCur->GetNextHandler(); - if ( handlerCur == handler ) + if ( handlerCur == handlerToRemove ) { - if ( handlerPrev ) - { - handlerPrev->SetNextHandler(handlerNext); - } - else - { - SetEventHandler(handlerNext); - } - - if ( handlerNext ) - { - handlerNext->SetPreviousHandler ( handlerPrev ); - } - - handler->SetNextHandler(NULL); - handler->SetPreviousHandler(NULL); + handlerCur->Unlink(); + wxASSERT_MSG( handlerCur != GetEventHandler(), + "the case Remove == Pop should was already handled" ); return true; } - handlerPrev = handlerCur; handlerCur = handlerNext; } @@ -1173,6 +1221,7 @@ bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler) bool wxWindowBase::HandleWindowEvent(wxEvent& event) const { + // SafelyProcessEvent() will handle exceptions nicely return GetEventHandler()->SafelyProcessEvent(event); } -- 2.45.2