ML Reference
MeVis/Foundation/Sources/MLUtilities/mlEventSource.h
Go to the documentation of this file.
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