ML Reference
|
00001 // **InsertLicense** code 00002 //------------------------------------------------------------------------- 00005 00010 //------------------------------------------------------------------------- 00011 #ifndef __mlEventSource_H 00012 #define __mlEventSource_H 00013 00014 #include "mlBase.h" 00015 00016 ML_START_NAMESPACE 00017 00018 class BaseEvent; 00019 00020 typedef void BaseEventCallback(void*, BaseEvent*); 00021 00022 //---------------------------------------------------------------------- 00025 class ML_UTILS_EXPORT EventSource : public Base 00026 { 00027 public: 00028 EventSource() {} 00029 virtual ~EventSource(); 00030 00033 void addEventListener(BaseEventCallback* cb, void* userData); 00034 00037 void removeEventListener(BaseEventCallback* cb, void* userData); 00038 00042 bool hasEventListeners() const; 00043 00046 ML_ABSTRACT_CLASS_HEADER(EventSource) 00047 00048 protected: 00054 void sendEvent(BaseEvent* event, void* skipListener = NULL); 00055 00056 private: 00058 struct ListenerEntry { 00059 ListenerEntry(BaseEventCallback* aCB, void* aUserData) : cb(aCB), userData(aUserData) {} 00060 void sendEvent(BaseEvent* event) const { (*cb)(userData, event); } 00061 bool operator==(const ListenerEntry& b) const { return cb == b.cb && userData == b.userData; } 00062 00063 BaseEventCallback* cb; 00064 void* userData; 00065 }; 00066 00068 std::list<ListenerEntry> _eventListeners; 00069 }; 00070 00071 //---------------------------------------------------------------------- 00074 00075 class ML_UTILS_EXPORT BaseEvent 00076 { 00077 public: 00078 BaseEvent() : _source(NULL) {} 00079 virtual ~BaseEvent() {} 00080 00082 EventSource* source() const { return _source; } 00083 00086 ML_ABSTRACT_CLASS_HEADER(BaseEvent) 00087 00088 private: 00089 friend class EventSource; 00090 00092 EventSource* _source; 00093 }; 00094 00095 //---------------------------------------------------------------------- 00098 00099 class ML_UTILS_EXPORT EventSourceDeletedEvent : public BaseEvent 00100 { 00101 public: 00102 EventSourceDeletedEvent() {} 00103 00104 ML_CLASS_HEADER(EventSourceDeletedEvent) 00105 }; 00106 00107 00108 ML_END_NAMESPACE 00109 00110 00112 template<typename ToTypePtr> 00113 inline ToTypePtr mlbaseevent_cast(ML_UTILS_NAMESPACE::BaseEvent* from) { 00114 if (from) { 00115 if (from->getTypeId()->isDerivedFrom((static_cast<ToTypePtr>(0))->getClassTypeId())) { 00116 return static_cast<ToTypePtr>(from); 00117 } else { 00118 return NULL; 00119 } 00120 } else { 00121 return NULL; 00122 } 00123 } 00124 00126 template<typename ToTypePtr> 00127 inline ToTypePtr mlbaseevent_cast(const ML_UTILS_NAMESPACE::BaseEvent* from) { 00128 if (from) { 00129 if (from->getTypeId()->isDerivedFrom((static_cast<ToTypePtr>(0))->getClassTypeId())) { 00130 return static_cast<ToTypePtr>(from); 00131 } else { 00132 return NULL; 00133 } 00134 } else { 00135 return NULL; 00136 } 00137 } 00138 00139 00140 #endif // __mlEventSource_H 00141 00142