00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef EVJOBHANDLE_H
00027
#define EVJOBHANDLE_H
00028
#include <vdk/vdkobj.h>
00029
#include <gdk/gdktypes.h>
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
template <
class T>
00040
class OBJECT_SIGNALTableEntry {
00041
public:
00042
typedef bool (T::*OBJPMF)(
VDKObject* sender);
00043
int signal;
00044 OBJPMF Pmf;
00045
bool connected;
00046 };
00047
00048
00049
00050
00051
00052
00053
#define DECLARE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_) \
00054
private:\
00055
static OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > __OC_OBJ_Bentries[];\
00056
typedef OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ >::OBJPMF _Member_;\
00057
typedef _OBJECT_SIGNALclass_ _OBJECT_SIGNALmyclass_;\
00058
protected:\
00059
virtual int VDKObjectSignalResponseTableSize();\
00060
public:\
00061
virtual int VDKObjectSignalResponse(GtkWidget*,int signal,void*, bool);\
00062
virtual int ObjectSignalDetach(int signal);\
00063
virtual bool ObjectSignalAttach(int slot);
00064
00065
00066
00067
00068
#define DEFINE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_,base)\
00069
\
00070
\
00071
\
00072
\
00073
int _OBJECT_SIGNALclass_::VDKObjectSignalResponse(GtkWidget* mobj, int signal, void* obj, bool treated) \
00074
{\
00075
int t=0;\
00076
VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
00077
\
00078 for(;__OC_OBJ_Bentries[t].signal >= 0 ;t++)\
00079 {\
00080 if( (__OC_OBJ_Bentries[t].signal == signal) )\
00081 {\
00082 if (__OC_OBJ_Bentries[t].connected)\
00083 {\
00084 bool (_OBJECT_SIGNALclass_::*response)(VDKObject* sender)=\
00085 __OC_OBJ_Bentries[t].Pmf;\
00086 if(((*this).*response)(vdkobj))\
00087 treated = true;\
00088 }\
00089 \
00090 }\
00091 }\
00092 if(treated) return 1;\
00093 else return base::VDKObjectSignalResponse(mobj,signal,obj, treated); \
00094 }\
00095 \
00096 \
00097 \
00098 int _OBJECT_SIGNALclass_::VDKObjectSignalResponseTableSize()\
00099 {\
00100 int t = 0;\
00101 for(;__OC_OBJ_Bentries[t].signal >= 0;t++)\
00102 ;\
00103 return t;\
00104 }\
00105 \
00106 \
00107 \
00108 int _OBJECT_SIGNALclass_::ObjectSignalDetach(int signal)\
00109 {\
00110 int t=0;\
00111 for(;__OC_OBJ_Bentries[t].signal>= 0 ;t++)\
00112 {\
00113 if((__OC_OBJ_Bentries[t].signal == signal) &&\
00114 __OC_OBJ_Bentries[t].connected != false)\
00115 {\
00116 __OC_OBJ_Bentries[t].connected = false;\
00117 return t;\
00118 }\
00119 }\
00120 return -1;\
00121 }\
00122 \
00123 \
00124 \
00125 bool _OBJECT_SIGNALclass_::ObjectSignalAttach(int slot)\
00126 {\
00127 if( (slot >= 0) && (slot <= VDKObjectSignalResponseTableSize()) )\
00128 {\
00129 __OC_OBJ_Bentries[slot].connected = true;\
00130 return true;\
00131 }\
00132 else\
00133 return false;\
00134 }\
00135 \
00136 \
00137 OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > _OBJECT_SIGNALclass_::__OC_OBJ_Bentries[] = {
00138
00139
00140
00141
#define ON_OBJECT_SIGNAL(_OBJECT_SIGNAL_,_member_) \
00142
{_OBJECT_SIGNAL_,&(_OBJECT_SIGNALmyclass_::_member_),true}
00143
00144
00145
#define END_OBJECT_SIGNAL_MAP ,{-1, NULL,false} };
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
template <
class T>
00156
class OBJECT_EVENTTableEntry {
00157
public:
00158
typedef bool (T::*OBJPMF)(
VDKObject* sender, GdkEvent* event);
00159 GdkEventType event;
00160 OBJPMF Pmf;
00161
bool connected;
00162 };
00163
00164
00165
00166
00167
#define DECLARE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_) \
00168
private:\
00169
static OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > __OCBOBJECT_EVENTEntries[];\
00170
typedef OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ >::OBJPMF _EvMember_;\
00171
typedef _OBJECT_EVENTclass_ _OBJECT_EVENTmyclass_;\
00172
protected:\
00173
virtual int VDKObjectEventResponseTableSize();\
00174
public:\
00175
virtual int VDKObjectEventResponse(GtkWidget* , GdkEvent* , void*, bool);\
00176
virtual int ObjectEventDetach(VDKEvent event);\
00177
virtual bool ObjectEventAttach(int slot);
00178
00179
00180
00181
00182
#define DEFINE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_,base) \
00183
int _OBJECT_EVENTclass_::VDKObjectEventResponse(GtkWidget* wid, GdkEvent* event, void* obj, bool treated) \
00184
{\
00185
int t=0;\
00186
VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
00187
for(;__OCBOBJECT_EVENTEntries[t].event >= 0 ;t++)\
00188
{\
00189
if((__OCBOBJECT_EVENTEntries[t].event == ((GdkEventAny*)event)->type) )\
00190
{\
00191
if (__OCBOBJECT_EVENTEntries[t].connected)\
00192
{\
00193
bool (_OBJECT_EVENTclass_::*response)\
00194
(VDKObject* , GdkEvent* )= \
00195
__OCBOBJECT_EVENTEntries[t].Pmf;\
00196
if(((*this).*response)(vdkobj,event))\
00197
treated = true;\
00198
}\
00199
\
00200 }\
00201 }\
00202 if(treated) return 1;\
00203 else return base::VDKObjectEventResponse(wid,event,obj, treated); \
00204 }\
00205 \
00206 \
00207 \
00208 int _OBJECT_EVENTclass_::VDKObjectEventResponseTableSize()\
00209 {\
00210 int t = 0;\
00211 for(;__OCBOBJECT_EVENTEntries[t].event>= 0;t++)\
00212 ;\
00213 return t;\
00214 }\
00215 \
00216 \
00217 \
00218 int _OBJECT_EVENTclass_::ObjectEventDetach(VDKEvent event)\
00219 {\
00220 int t=0;\
00221 for(;__OCBOBJECT_EVENTEntries[t].event >= 0 ;t++)\
00222 {\
00223 if((__OCBOBJECT_EVENTEntries[t].event == (GdkEventType) event) &&\
00224 __OCBOBJECT_EVENTEntries[t].connected != false)\
00225 {\
00226 __OCBOBJECT_EVENTEntries[t].connected = false;\
00227 return t;\
00228 }\
00229 }\
00230 return -1;\
00231 }\
00232 \
00233 \
00234 \
00235 bool _OBJECT_EVENTclass_::ObjectEventAttach(int slot)\
00236 {\
00237 if( (slot >= 0) && (slot <= VDKObjectEventResponseTableSize()) )\
00238 {\
00239 __OCBOBJECT_EVENTEntries[slot].connected = true;\
00240 return true;\
00241 }\
00242 else\
00243 return false;\
00244 }\
00245 \
00246 \
00247 OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > _OBJECT_EVENTclass_::__OCBOBJECT_EVENTEntries[] = {
00248
00249
00250
00251
#define ON_OBJECT_EVENT(_OBJECT_EVENT_,_member_) \
00252
{(GdkEventType) _OBJECT_EVENT_,&(_OBJECT_EVENTmyclass_::_member_),true}
00253
00254
00255
#define END_OBJECT_EVENT_MAP ,{(GdkEventType) -1, NULL,false} };
00256
00257
#endif
00258
00259
00260
00261
00262