--- trunk/FAS/src/event.cpp 2002/08/19 23:06:57 90 +++ trunk/FAS/src/event.cpp 2002/08/20 17:54:47 91 @@ -19,6 +19,307 @@ ***********************************************************************/ #include "event.h" /*********************************************************************** -* Class TAnimation +* Class TEventItem ***********************************************************************/ +void TEventItem::Clear() +{ + _handlers.clear(); +} +TEventItem::TEventItem(TEventObject *object) +{ + Clear(); + _object = object; +} + +TEventItem::~TEventItem() +{ + Clear(); +} + +void TEventItem::AddHandler(PEventHandler handler) +{ + vector::iterator i; + + i = find(_handlers.begin(), _handlers.end(), handler); + + if (i == _handlers.end()) + { + _handlers.push_back(handler); + } +} + +void TEventItem::RemoveHandler(PEventHandler handler) +{ + vector::iterator i; + + i = find(_handlers.begin(), _handlers.end(), handler); + + if (i != _handlers.end()) + { + _handlers.erase(i); + } + +} +/*********************************************************************** +* Class TEventItems +***********************************************************************/ +void TEventItems::Clear() +{ + for(int i=0; i<_items.size(); i++) + { + if (_items[i] != NULL) + { + delete _items[i]; + } + } + + _items.clear(); +} + +TEventItems::TEventItems() +{ + Clear(); + + SetType(TEventType::Unknown); +} + +TEventItems::TEventItems(int eventType) +{ + Clear(); + SetType(eventType); +} + +TEventItems::~TEventItems() +{ + Clear(); +} + +void TEventItems::AddItem(TEventObject *object, PEventHandler handler) +{ + TEventItem * item; + + item = GetEventItem(object); + + if (item != NULL) + { + item->AddHandler(handler); + } + else + { + item = new TEventItem(object); + if(item != NULL) + { + item->AddHandler(handler); + _items.push_back(item); + } + else + { + //Memory allocation fail + } + } +} + +void TEventItems::RemoveItem(TEventObject *object, PEventHandler handler) +{ + TEventItem * item; + + item = GetEventItem(object); + + if (item !=NULL) + { + item->RemoveHandler(handler); + if (item->Count() == 0) + _items.erase(find(_items.begin(), _items.end(), item)); + } +} + +void TEventItems::RemoveItem(TEventObject *object) +{ + vector::iterator i; + + i = find_if(_items.begin(), _items.end(), TMatchEventItem(object)); + + if (i != _items.end()) + { + delete *i; + _items.erase(i); + } +} + +TEventItem *TEventItems::GetEventItem(TEventObject *object) +{ + vector::iterator i; + + i = find_if(_items.begin(), _items.end(), TMatchEventItem(object)); + + if (i != _items.end()) + { + return *i; + } + else + { + return NULL; + } + +} +void TEventItems::Dispatch(TEventDispatcher *dispatcher, void *extra) +{ + +} +/*********************************************************************** +* Class TEventTable +***********************************************************************/ +void TEventTable::Clear() +{ + for(int i=0; i<_table.size(); i++) + { + if (_table[i] != NULL) + delete _table[i]; + } + + _table.clear(); +} + +TEventTable::TEventTable() +{ + Clear(); +} + +TEventTable::~TEventTable() +{ + Clear(); +} + +void TEventTable::AddItem(int eventType, + TEventObject *object, PEventHandler handler) +{ + TEventItems *items; + + items = GetEventItemsByType(eventType); + + + if (items == NULL) + { + items = new TEventItems(eventType); + if (items != NULL) + { + items->AddItem(object, handler); + _table.push_back(items); + } + else + { + //Error + } + } + else + { + items->AddItem(object, handler); + } + +} + +void TEventTable::RemoveItem(int eventType, + TEventObject *object, PEventHandler handler) +{ + TEventItems *items; + + items = GetEventItemsByType(eventType); + + if (items != NULL) + { + items->RemoveItem(object, handler); + + } +} + +void TEventTable::RemoveItem(int eventType, TEventObject *object) +{ + TEventItems *items; + + items = GetEventItemsByType(eventType); + + if (items != NULL) + { + items->RemoveItem(object); + } +} + +void TEventTable::RemoveItem(TEventObject *object) +{ + for(int i=0; i<_table.size(); i++) + RemoveItem(_table[i]->_eventType, object); +} + +TEventItems *TEventTable::GetEventItemsByType(int eventType) +{ + vector::iterator i; + + + i = find_if(_table.begin(), _table.end(), TMatchEventItems(eventType)); + + if(i == _table.end()) + { + return NULL; + } + else + { + return *i; + } +} + +void TEventTable::Dispatch(int eventType, + TEventDispatcher *dispatcher, void *extra) +{ + TEventItems *items; + + items = GetEventItemsByType(eventType); + + if (items != NULL) + { + items->Dispatch(dispatcher, extra); + } + else + { + return; + } +} + +/*********************************************************************** +* Class TEventObject +***********************************************************************/ +TEventObject::~TEventObject() +{ + UnRegister(this); +} + +void TEventObject::Register(int eventType, TEventObject *object, + PEventHandler handler) +{ + _table->AddItem(eventType, object, handler); +} + +void TEventObject::UnRegister(int eventType, TEventObject *object, + PEventHandler handler) +{ + _table->RemoveItem(eventType, object, handler); +} + +void TEventObject::UnRegister(int eventType, TEventObject *object) +{ + _table->RemoveItem(eventType, object); +} + +void TEventObject::UnRegister(TEventObject *object) +{ + _table->RemoveItem(object); +} +/*********************************************************************** +* Class TEventDispatcher +***********************************************************************/ +void TEventDispatcher::Dispatch(int eventType, + TEventDispatcher *dispatcher,void *extra) +{ + _table->Dispatch(eventType, dispatcher, extra); +} +