00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _CEGUIEvent_h_
00029 #define _CEGUIEvent_h_
00030
00031 #include "CEGUIString.h"
00032 #include "CEGUIBoundSlot.h"
00033 #include "CEGUISubscriberSlot.h"
00034 #include "CEGUIRefCounted.h"
00035
00036 #include <map>
00037
00038 #if defined(_MSC_VER)
00039 # pragma warning(push)
00040 # pragma warning(disable : 4251)
00041 #endif
00042
00043
00044 namespace CEGUI
00045 {
00058 class CEGUIEXPORT Event
00059 {
00060 public:
00068 typedef RefCounted<BoundSlot> Connection;
00069
00076 typedef CEGUI::SubscriberSlot Subscriber;
00077
00084 typedef unsigned int Group;
00085
00091 class ScopedConnection : public Connection
00092 {
00093 public:
00094 ScopedConnection() {}
00095
00096 ~ScopedConnection()
00097 { disconnect(); }
00098
00099 ScopedConnection(const Event::Connection& connection) :
00100 d_connection(connection)
00101 {}
00102
00103 ScopedConnection& operator=(const Event::Connection& connection)
00104 {
00105 d_connection = connection;
00106 return *this;
00107 }
00108
00109 bool connected() const
00110 { return d_connection.isValid() ? d_connection->connected() : false; }
00111
00112 void disconnect()
00113 { if (d_connection.isValid()) d_connection->disconnect(); }
00114
00115 private:
00116 Event::Connection d_connection;
00117 };
00118
00123 Event(const String& name);
00124
00130 ~Event();
00131
00139 const String& getName(void) const
00140 { return d_name; }
00141
00156 Connection subscribe(const Subscriber& slot);
00157
00177 Connection subscribe(Group group, const Subscriber& slot);
00178
00192 void operator()(EventArgs& args);
00193
00194
00195 private:
00196 friend void CEGUI::BoundSlot::disconnect();
00207 void unsubscribe(const BoundSlot& slot);
00208
00209
00210 Event(const Event& other) {}
00211 Event& operator=(const Event& other) {return *this;}
00212
00213 typedef std::multimap<Group, Connection> SlotContainer;
00214 SlotContainer d_slots;
00215 const String d_name;
00216 };
00217
00218 }
00219
00220 #if defined(_MSC_VER)
00221 # pragma warning(pop)
00222 #endif
00223
00224 #endif // end of guard _CEGUIEvent_h_