1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/xtihandler.h
3 // Purpose:     XTI handlers
4 // Author:      Stefan Csomor
5 // Modified by: Francesco Montorsi
6 // Created:     27/07/03
7 // Copyright:   (c) 1997 Julian Smart
8 //              (c) 2003 Stefan Csomor
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _XTIHANDLER_H_
13 #define _XTIHANDLER_H_
14 
15 #include "wx/defs.h"
16 
17 #if wxUSE_EXTENDED_RTTI
18 
19 #include "wx/xti.h"
20 
21 // copied from event.h which cannot be included at this place
22 
23 class WXDLLIMPEXP_FWD_BASE wxEvent;
24 
25 #ifdef __VISUALC__
26 #define wxMSVC_FWD_MULTIPLE_BASES __multiple_inheritance
27 #else
28 #define wxMSVC_FWD_MULTIPLE_BASES
29 #endif
30 
31 class WXDLLIMPEXP_FWD_BASE wxMSVC_FWD_MULTIPLE_BASES wxEvtHandler;
32 typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&);
33 typedef wxEventFunction wxObjectEventFunction;
34 
35 // ----------------------------------------------------------------------------
36 // Handler Info
37 //
38 // this describes an event sink
39 // ----------------------------------------------------------------------------
40 
41 class WXDLLIMPEXP_BASE wxHandlerInfo
42 {
43     friend class WXDLLIMPEXP_BASE wxDynamicClassInfo;
44 
45 public:
wxHandlerInfo(wxHandlerInfo * & iter,wxClassInfo * itsClass,const wxString & name,wxObjectEventFunction address,const wxClassInfo * eventClassInfo)46     wxHandlerInfo(wxHandlerInfo* &iter,
47                   wxClassInfo* itsClass,
48                   const wxString& name,
49                   wxObjectEventFunction address,
50                   const wxClassInfo* eventClassInfo) :
51             m_eventFunction(address),
52             m_name(name),
53             m_eventClassInfo(eventClassInfo),
54             m_itsClass(itsClass)
55        {
56             Insert(iter);
57        }
58 
~wxHandlerInfo()59     ~wxHandlerInfo()
60         { Remove(); }
61 
62     // return the name of this handler
GetName()63     const wxString& GetName() const { return m_name; }
64 
65     // return the class info of the event
GetEventClassInfo()66     const wxClassInfo *GetEventClassInfo() const { return m_eventClassInfo; }
67 
68     // get the handler function pointer
GetEventFunction()69     wxObjectEventFunction GetEventFunction() const { return m_eventFunction; }
70 
71     // returns NULL if this is the last handler of this class
GetNext()72     wxHandlerInfo*     GetNext() const { return m_next; }
73 
74     // return the class this property is declared in
GetDeclaringClass()75     const wxClassInfo*   GetDeclaringClass() const { return m_itsClass; }
76 
77 private:
78 
79     // inserts this handler at the end of the linked chain which begins
80     // with "iter" handler.
81     void Insert(wxHandlerInfo* &iter);
82 
83     // removes this handler from the linked chain of the m_itsClass handlers.
84     void Remove();
85 
86     wxObjectEventFunction m_eventFunction;
87     wxString              m_name;
88     const wxClassInfo*    m_eventClassInfo;
89     wxHandlerInfo*        m_next;
90     wxClassInfo*          m_itsClass;
91 };
92 
93 #define wxHANDLER(name,eventClassType)                                               \
94     static wxHandlerInfo _handlerInfo##name( first, class_t::GetClassInfoStatic(),   \
95                     wxT(#name), (wxObjectEventFunction) (wxEventFunction) &name,     \
96                     wxCLASSINFO( eventClassType ) );
97 
98 #define wxBEGIN_HANDLERS_TABLE(theClass)          \
99     wxHandlerInfo *theClass::GetHandlersStatic()  \
100     {                                             \
101         typedef theClass class_t;                 \
102         static wxHandlerInfo* first = NULL;
103 
104 #define wxEND_HANDLERS_TABLE()                    \
105     return first; }
106 
107 #define wxEMPTY_HANDLERS_TABLE(theClass)          \
108     wxBEGIN_HANDLERS_TABLE(theClass)              \
109     wxEND_HANDLERS_TABLE()
110 
111 #endif      // wxUSE_EXTENDED_RTTI
112 #endif      // _XTIHANDLER_H_
113