File: eventHandler.hpp - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

001: 
002: #ifndef _PANE_EVENT
003: #define _PANE_EVENT
004: 
005: #include <vector>
006: 
007: namespace Pane
008: {
009:   /*
010:   ** EventHandler class (4 parameters)
011:   */
012:   template<typename Return, typename Param1 = void, typename Param2 = void, typename Param3 = void, typename Param4 = void>
013:   class EventHandler
014:   {
015:     public:
016:       class EventClass
017:       {
018:         public:
019:           virtual     ~EventClass ()
020:           {
021:           }
022: 
023:           virtual Return  operator () (Param1, Param2, Param3, Param4) = 0;
024:       };
025: 
026:       template<typename Sender = void>
027:       class Event : public EventClass
028:       {
029:         public:
030:           typedef Return  (Sender::*Method) (Param1, Param2, Param3, Param4);
031: 
032:           /**/  Event (Sender* sender, Method method) :
033:             method (method),
034:             sender (sender)
035:           {
036:           }
037: 
038:           virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3, Param4 param4)
039:           {
040:             return (this->sender->*method) (param1, param2, param3, param4);
041:           }
042: 
043:         private:
044:           Method  method;
045:           Sender* sender;
046:       };
047: 
048:       /**/  ~EventHandler ();
049: 
050:       void  operator += (EventClass*);
051:       bool  operator () (Param1, Param2, Param3, Param4);
052: 
053:     private:
054:       typedef std::vector<EventClass*>  Events;
055: 
056:       Events  events;
057:   };
058: 
059:   /*
060:   ** EventHandler class (3 parameters)
061:   */
062:   template<typename Return, typename Param1, typename Param2, typename Param3>
063:   class EventHandler<Return, Param1, Param2, Param3>
064:   {
065:     public:
066:       class EventClass
067:       {
068:         public:
069:           virtual     ~EventClass ()
070:           {
071:           }
072: 
073:           virtual Return  operator () (Param1, Param2, Param3) = 0;
074:       };
075: 
076:       template<typename Sender = void>
077:       class Event : public EventClass
078:       {
079:         public:
080:           typedef Return  (Sender::*Method) (Param1, Param2, Param3);
081: 
082:           /**/  Event (Sender* sender, Method method) :
083:             method (method),
084:             sender (sender)
085:           {
086:           }
087: 
088:           virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3)
089:           {
090:             return (this->sender->*method) (param1, param2, param3);
091:           }
092: 
093:         private:
094:           Method  method;
095:           Sender* sender;
096:       };
097: 
098:       /**/  ~EventHandler ();
099: 
100:       void  operator += (EventClass*);
101:       bool  operator () (Param1, Param2, Param3);
102: 
103:     private:
104:       typedef std::vector<EventClass*>  Events;
105: 
106:       Events  events;
107:   };
108: 
109:   /*
110:   ** EventHandler class (2 parameters)
111:   */
112:   template<typename Return, typename Param1, typename Param2>
113:   class EventHandler<Return, Param1, Param2>
114:   {
115:     public:
116:       class EventClass
117:       {
118:         public:
119:           virtual     ~EventClass ()
120:           {
121:           }
122: 
123:           virtual Return  operator () (Param1, Param2) = 0;
124:       };
125: 
126:       template<typename Sender = void>
127:       class Event : public EventClass
128:       {
129:         public:
130:           typedef Return  (Sender::*Method) (Param1, Param2);
131: 
132:           /**/  Event (Sender* sender, Method method) :
133:             method (method),
134:             sender (sender)
135:           {
136:           }
137: 
138:           virtual Return  operator () (Param1 param1, Param2 param2)
139:           {
140:             return (this->sender->*method) (param1, param2);
141:           }
142: 
143:         private:
144:           Method  method;
145:           Sender* sender;
146:       };
147: 
148:       /**/  ~EventHandler ();
149: 
150:       void  operator += (EventClass*);
151:       bool  operator () (Param1, Param2);
152: 
153:     private:
154:       typedef std::vector<EventClass*>  Events;
155: 
156:       Events  events;
157:   };
158: 
159:   /*
160:   ** EventHandler class (1 parameter)
161:   */
162:   template<typename Return, typename Param1>
163:   class EventHandler<Return, Param1>
164:   {
165:     public:
166:       class EventClass
167:       {
168:         public:
169:           virtual     ~EventClass ()
170:           {
171:           }
172: 
173:           virtual Return  operator () (Param1) = 0;
174:       };
175: 
176:       template<typename Sender = void>
177:       class Event : public EventClass
178:       {
179:         public:
180:           typedef Return  (Sender::*Method) (Param1);
181: 
182:           /**/  Event (Sender* sender, Method method) :
183:             method (method),
184:             sender (sender)
185:           {
186:           }
187: 
188:           virtual Return  operator () (Param1 param1)
189:           {
190:             return (this->sender->*method) (param1);
191:           }
192: 
193:         private:
194:           Method  method;
195:           Sender* sender;
196:       };
197: 
198:       /**/  ~EventHandler ();
199: 
200:       void  operator += (EventClass*);
201:       bool  operator () (Param1);
202: 
203:     private:
204:       typedef std::vector<EventClass*>  Events;
205: 
206:       Events  events;
207:   };
208: 
209:   /*
210:   ** EventHandler class (0 parameter)
211:   */
212:   template<typename Return>
213:   class EventHandler<Return>
214:   {
215:     public:
216:       class EventClass
217:       {
218:         public:
219:           virtual     ~EventClass ()
220:           {
221:           }
222: 
223:           virtual Return  operator () () = 0;
224:       };
225: 
226:       template<typename Sender = void>
227:       class Event : public EventClass
228:       {
229:         public:
230:           typedef Return  (Sender::*Method) ();
231: 
232:           /**/  Event (Sender* sender, Method method) :
233:             method (method),
234:             sender (sender)
235:           {
236:           }
237: 
238:           virtual Return  operator () ()
239:           {
240:             return (this->sender->*method) ();
241:           }
242: 
243:         private:
244:           Method  method;
245:           Sender* sender;
246:       };
247: 
248:       /**/  ~EventHandler ();
249: 
250:       void  operator += (EventClass*);
251:       bool  operator () ();
252: 
253:     private:
254:       typedef std::vector<EventClass*>  Events;
255: 
256:       Events  events;
257:   };
258: }
259: 
260: #include "eventHandler.hxx"
261: 
262: #endif // _PANE_EVENT