vdk 2.4.0
evobjhandle.h
1 /*
2  * ===========================
3  * VDK Visual Develeopment Kit
4  * Version 0.4
5  * October 1998
6  * ===========================
7  *
8  * Copyright (C) 1998, Mario Motta
9  * Developed by Mario Motta <mmotta@guest.net>
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public
22  * License along with this library; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24  * 02111-1307, USA.
25  */
26 #ifndef EVJOBHANDLE_H
27 #define EVJOBHANDLE_H
28 #include <vdk/vdkobj.h>
29 #include <gdk/gdktypes.h>
30 /*
31 ==============================================
32  OBJECT_SIGNAL DISPATCHER ROUTINES
33 ==============================================
34 */
35 /*
36 OBJECT_SIGNALTableEntry:
37 Obj/Signal/Response method Table Entry
38 */
39 template <class T>
40 class OBJECT_SIGNALTableEntry {
41  public:
42  typedef bool (T::*OBJPMF)(VDKObject* sender);
43  int signal; /* signal type (see enum VDKSignal in vdkobj.h) */
44  OBJPMF Pmf; /* pointer to <class T> member function */
45  bool connected; /* connected flag, if false deny signal */
46 };
47 
48 
49 /*
50 Signal response function map declaration:
51 declare a static signal table for each object class
52 */
53 #define DECLARE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_) \
54 private:\
55 static OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > __OC_OBJ_Bentries[];\
56 typedef OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ >::OBJPMF _Member_;\
57 typedef _OBJECT_SIGNALclass_ _OBJECT_SIGNALmyclass_;\
58 protected:\
59  virtual int VDKObjectSignalResponseTableSize();\
60 public:\
61  virtual int VDKObjectSignalResponse(GtkWidget*,int signal,void*, bool);\
62  virtual int ObjectSignalDetach(int signal);\
63  virtual bool ObjectSignalAttach(int slot);
64 /*
65 define form signal response function that in turn call
66 object signal response function
67 */
68 #define DEFINE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_,base)\
69 \
70 \
71 \
72 \
73 int _OBJECT_SIGNALclass_::VDKObjectSignalResponse(GtkWidget* mobj, int signal, void* obj, bool treated) \
74 {\
75 int t=0;\
76 VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
77  /*bool treated = false;*/\
78 for(;__OC_OBJ_Bentries[t].signal >= 0 ;t++)\
79  {\
80  if( (__OC_OBJ_Bentries[t].signal == signal) )\
81  {\
82  if (__OC_OBJ_Bentries[t].connected)\
83  {\
84  bool (_OBJECT_SIGNALclass_::*response)(VDKObject* sender)=\
85  __OC_OBJ_Bentries[t].Pmf;\
86  if(((*this).*response)(vdkobj))\
87  treated = true;\
88  }\
89  /*break;*/\
90  }\
91  }\
92 if(treated) return 1;\
93 else return base::VDKObjectSignalResponse(mobj,signal,obj, treated); \
94 }\
95 \
96 \
97 \
98 int _OBJECT_SIGNALclass_::VDKObjectSignalResponseTableSize()\
99 {\
100 int t = 0;\
101 for(;__OC_OBJ_Bentries[t].signal >= 0;t++)\
102  ;\
103 return t;\
104 }\
105 \
106 \
107 \
108 int _OBJECT_SIGNALclass_::ObjectSignalDetach(int signal)\
109 {\
110 int t=0;\
111 for(;__OC_OBJ_Bentries[t].signal>= 0 ;t++)\
112  {\
113  if((__OC_OBJ_Bentries[t].signal == signal) &&\
114  __OC_OBJ_Bentries[t].connected != false)\
115  {\
116  __OC_OBJ_Bentries[t].connected = false;\
117  return t;\
118  }\
119  }\
120 return -1;\
121 }\
122 \
123 \
124 \
125 bool _OBJECT_SIGNALclass_::ObjectSignalAttach(int slot)\
126 {\
127 if( (slot >= 0) && (slot <= VDKObjectSignalResponseTableSize()) )\
128  {\
129  __OC_OBJ_Bentries[slot].connected = true;\
130  return true;\
131  }\
132 else\
133  return false;\
134 }\
135 \
136 \
137 OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > _OBJECT_SIGNALclass_::__OC_OBJ_Bentries[] = {
138 /*
139 fill static signal table
140 */
141 #define ON_OBJECT_SIGNAL(_OBJECT_SIGNAL_,_member_) \
142  {_OBJECT_SIGNAL_,&(_OBJECT_SIGNALmyclass_::_member_),true}
143 /*
144 */
145 #define END_OBJECT_SIGNAL_MAP ,{-1, NULL,false} };
146 /*
147 ==============================================
148  OBJECT_EVENT DISPATCHER ROUTINES
149 ==============================================
150 */
151 /*
152 OBJECT_EVENTTableEntry:
153 Event-ObjectCallback Table Entry
154 */
155 template <class T>
156 class OBJECT_EVENTTableEntry {
157  public:
158  typedef bool (T::*OBJPMF)(VDKObject* sender, GdkEvent* event);
159  GdkEventType event; /* event type (see enum VDKevent in vdkobj.h) */
160  OBJPMF Pmf; /* pointer to <class T> member function */
161  bool connected;
162 };
163 /*
164 Events response function map declaration:
165 declare a static events table for each form
166 */
167 #define DECLARE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_) \
168 private:\
169 static OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > __OCBOBJECT_EVENTEntries[];\
170 typedef OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ >::OBJPMF _EvMember_;\
171 typedef _OBJECT_EVENTclass_ _OBJECT_EVENTmyclass_;\
172 protected:\
173  virtual int VDKObjectEventResponseTableSize();\
174 public:\
175  virtual int VDKObjectEventResponse(GtkWidget* , GdkEvent* , void*, bool);\
176  virtual int ObjectEventDetach(VDKEvent event);\
177  virtual bool ObjectEventAttach(int slot);
178 /*
179 define form OBJECT_EVENT response function that in turn call
180 object OBJECT_EVENT response function
181 */
182 #define DEFINE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_,base) \
183 int _OBJECT_EVENTclass_::VDKObjectEventResponse(GtkWidget* wid, GdkEvent* event, void* obj, bool treated) \
184 {\
185 int t=0;\
186 VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
187 for(;__OCBOBJECT_EVENTEntries[t].event >= 0 ;t++)\
188  {\
189  if((__OCBOBJECT_EVENTEntries[t].event == ((GdkEventAny*)event)->type) )\
190  {\
191  if (__OCBOBJECT_EVENTEntries[t].connected)\
192  {\
193  bool (_OBJECT_EVENTclass_::*response)\
194  (VDKObject* , GdkEvent* )= \
195  __OCBOBJECT_EVENTEntries[t].Pmf;\
196  if(((*this).*response)(vdkobj,event))\
197  treated = true;\
198  }\
199  /*break;*/\
200  }\
201  }\
202 if(treated) return 1;\
203 else return base::VDKObjectEventResponse(wid,event,obj, treated); \
204 }\
205 \
206 \
207 \
208 int _OBJECT_EVENTclass_::VDKObjectEventResponseTableSize()\
209 {\
210 int t = 0;\
211 for(;__OCBOBJECT_EVENTEntries[t].event>= 0;t++)\
212  ;\
213 return t;\
214 }\
215 \
216 \
217 \
218 int _OBJECT_EVENTclass_::ObjectEventDetach(VDKEvent event)\
219 {\
220 int t=0;\
221 for(;__OCBOBJECT_EVENTEntries[t].event >= 0 ;t++)\
222  {\
223  if((__OCBOBJECT_EVENTEntries[t].event == (GdkEventType) event) &&\
224  __OCBOBJECT_EVENTEntries[t].connected != false)\
225  {\
226  __OCBOBJECT_EVENTEntries[t].connected = false;\
227  return t;\
228  }\
229  }\
230 return -1;\
231 }\
232 \
233 \
234 \
235 bool _OBJECT_EVENTclass_::ObjectEventAttach(int slot)\
236 {\
237 if( (slot >= 0) && (slot <= VDKObjectEventResponseTableSize()) )\
238  {\
239  __OCBOBJECT_EVENTEntries[slot].connected = true;\
240  return true;\
241  }\
242 else\
243  return false;\
244 }\
245 \
246 \
247 OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > _OBJECT_EVENTclass_::__OCBOBJECT_EVENTEntries[] = {
248 /*
249 fill static OBJECT_EVENT table
250 */
251 #define ON_OBJECT_EVENT(_OBJECT_EVENT_,_member_) \
252  {(GdkEventType) _OBJECT_EVENT_,&(_OBJECT_EVENTmyclass_::_member_),true}
253 /*
254 */
255 #define END_OBJECT_EVENT_MAP ,{(GdkEventType) -1, NULL,false} };
256 
257 #endif
258 
259 
260 
261 
262