vdk 2.4.0
|
00001 /* 00002 * =========================== 00003 * VDK Visual Develeopment Kit 00004 * Version 0.4 00005 * October 1998 00006 * =========================== 00007 * 00008 * Copyright (C) 1998, Mario Motta 00009 * Developed by Mario Motta <mmotta@guest.net> 00010 * 00011 * This library is free software; you can redistribute it and/or 00012 * modify it under the terms of the GNU Library General Public 00013 * License as published by the Free Software Foundation; either 00014 * version 2 of the License, or (at your option) any later version. 00015 * 00016 * This library is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 * Library General Public License for more details. 00020 * 00021 * You should have received a copy of the GNU Library General Public 00022 * License along with this library; if not, write to the Free Software 00023 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 00024 * 02111-1307, USA. 00025 */ 00026 #ifndef EVJOBHANDLE_H 00027 #define EVJOBHANDLE_H 00028 #include <vdk/vdkobj.h> 00029 #include <gdk/gdktypes.h> 00030 /* 00031 ============================================== 00032 OBJECT_SIGNAL DISPATCHER ROUTINES 00033 ============================================== 00034 */ 00035 /* 00036 OBJECT_SIGNALTableEntry: 00037 Obj/Signal/Response method Table Entry 00038 */ 00039 template <class T> 00040 class OBJECT_SIGNALTableEntry { 00041 public: 00042 typedef bool (T::*OBJPMF)(VDKObject* sender); 00043 int signal; /* signal type (see enum VDKSignal in vdkobj.h) */ 00044 OBJPMF Pmf; /* pointer to <class T> member function */ 00045 bool connected; /* connected flag, if false deny signal */ 00046 }; 00047 00048 00049 /* 00050 Signal response function map declaration: 00051 declare a static signal table for each object class 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 define form signal response function that in turn call 00066 object signal response function 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 /*bool treated = false;*/\ 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 /*break;*/\ 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 fill static signal table 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 OBJECT_EVENT DISPATCHER ROUTINES 00149 ============================================== 00150 */ 00151 /* 00152 OBJECT_EVENTTableEntry: 00153 Event-ObjectCallback Table Entry 00154 */ 00155 template <class T> 00156 class OBJECT_EVENTTableEntry { 00157 public: 00158 typedef bool (T::*OBJPMF)(VDKObject* sender, GdkEvent* event); 00159 GdkEventType event; /* event type (see enum VDKevent in vdkobj.h) */ 00160 OBJPMF Pmf; /* pointer to <class T> member function */ 00161 bool connected; 00162 }; 00163 /* 00164 Events response function map declaration: 00165 declare a static events table for each form 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 define form OBJECT_EVENT response function that in turn call 00180 object OBJECT_EVENT response function 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 /*break;*/\ 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 fill static OBJECT_EVENT table 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