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