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/*
36OBJECT_SIGNALTableEntry:
37Obj/Signal/Response method Table Entry
38*/
39template <class T>
40class 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/*
50Signal response function map declaration:
51declare a static signal table for each object class
52*/
53#define DECLARE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_) \
54private:\
55static OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > __OC_OBJ_Bentries[];\
56typedef OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ >::OBJPMF _Member_;\
57typedef _OBJECT_SIGNALclass_ _OBJECT_SIGNALmyclass_;\
58protected:\
59 virtual int VDKObjectSignalResponseTableSize();\
60public:\
61 virtual int VDKObjectSignalResponse(GtkWidget*,int signal,void*, bool);\
62 virtual int ObjectSignalDetach(int signal);\
63 virtual bool ObjectSignalAttach(int slot);
64/*
65define form signal response function that in turn call
66object signal response function
67*/
68#define DEFINE_OBJECT_SIGNAL_MAP(_OBJECT_SIGNALclass_,base)\
69\
70\
71\
72\
73int _OBJECT_SIGNALclass_::VDKObjectSignalResponse(GtkWidget* mobj, int signal, void* obj, bool treated) \
74{\
75int t=0;\
76VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
77 /*bool treated = false;*/\
78for(;__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 }\
92if(treated) return 1;\
93else return base::VDKObjectSignalResponse(mobj,signal,obj, treated); \
94}\
95\
96\
97\
98int _OBJECT_SIGNALclass_::VDKObjectSignalResponseTableSize()\
99{\
100int t = 0;\
101for(;__OC_OBJ_Bentries[t].signal >= 0;t++)\
102 ;\
103return t;\
104}\
105\
106\
107\
108int _OBJECT_SIGNALclass_::ObjectSignalDetach(int signal)\
109{\
110int t=0;\
111for(;__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 }\
120return -1;\
121}\
122\
123\
124\
125bool _OBJECT_SIGNALclass_::ObjectSignalAttach(int slot)\
126{\
127if( (slot >= 0) && (slot <= VDKObjectSignalResponseTableSize()) )\
128 {\
129 __OC_OBJ_Bentries[slot].connected = true;\
130 return true;\
131 }\
132else\
133 return false;\
134}\
135\
136\
137OBJECT_SIGNALTableEntry< _OBJECT_SIGNALclass_ > _OBJECT_SIGNALclass_::__OC_OBJ_Bentries[] = {
138/*
139fill 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/*
152OBJECT_EVENTTableEntry:
153Event-ObjectCallback Table Entry
154*/
155template <class T>
156class 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/*
164Events response function map declaration:
165declare a static events table for each form
166*/
167#define DECLARE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_) \
168private:\
169static OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > __OCBOBJECT_EVENTEntries[];\
170typedef OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ >::OBJPMF _EvMember_;\
171typedef _OBJECT_EVENTclass_ _OBJECT_EVENTmyclass_;\
172protected:\
173 virtual int VDKObjectEventResponseTableSize();\
174public:\
175 virtual int VDKObjectEventResponse(GtkWidget* , GdkEvent* , void*, bool);\
176 virtual int ObjectEventDetach(VDKEvent event);\
177 virtual bool ObjectEventAttach(int slot);
178/*
179define form OBJECT_EVENT response function that in turn call
180object OBJECT_EVENT response function
181*/
182#define DEFINE_OBJECT_EVENT_MAP(_OBJECT_EVENTclass_,base) \
183int _OBJECT_EVENTclass_::VDKObjectEventResponse(GtkWidget* wid, GdkEvent* event, void* obj, bool treated) \
184{\
185int t=0;\
186VDKObject* vdkobj = static_cast<VDKObject*>(obj);\
187for(;__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 }\
202if(treated) return 1;\
203else return base::VDKObjectEventResponse(wid,event,obj, treated); \
204}\
205\
206\
207\
208int _OBJECT_EVENTclass_::VDKObjectEventResponseTableSize()\
209{\
210int t = 0;\
211for(;__OCBOBJECT_EVENTEntries[t].event>= 0;t++)\
212 ;\
213return t;\
214}\
215\
216\
217\
218int _OBJECT_EVENTclass_::ObjectEventDetach(VDKEvent event)\
219{\
220int t=0;\
221for(;__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 }\
230return -1;\
231}\
232\
233\
234\
235bool _OBJECT_EVENTclass_::ObjectEventAttach(int slot)\
236{\
237if( (slot >= 0) && (slot <= VDKObjectEventResponseTableSize()) )\
238 {\
239 __OCBOBJECT_EVENTEntries[slot].connected = true;\
240 return true;\
241 }\
242else\
243 return false;\
244}\
245\
246\
247OBJECT_EVENTTableEntry< _OBJECT_EVENTclass_ > _OBJECT_EVENTclass_::__OCBOBJECT_EVENTEntries[] = {
248/*
249fill 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
Definition: vdkobj.h:141