/* GWEN Copyright (c) 2010 Facepunch Studios See license in Gwen.h */ #include "Gwen/Events.h" using namespace Gwen; using namespace Gwen::Event; Handler::Handler() { } Handler::~Handler() { CleanLinks(); } void Handler::CleanLinks() { // Tell all the callers that we're dead std::list::iterator iter = m_Callers.begin(); while (iter != m_Callers.end()) { Caller* pCaller = *iter; UnRegisterCaller(pCaller); pCaller->RemoveHandler(this); iter = m_Callers.begin(); } } void Handler::RegisterCaller(Caller* pCaller) { m_Callers.push_back(pCaller); } void Handler::UnRegisterCaller(Caller* pCaller) { m_Callers.remove(pCaller); } Caller::Caller() { } Caller::~Caller() { CleanLinks(); } void Caller::CleanLinks() { std::list::iterator iter; for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) { handler& h = *iter; h.pObject->UnRegisterCaller(this); } m_Handlers.clear(); } void Caller::Call(Controls::Base* pThis) { std::list::iterator iter; for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) { handler& h = *iter; (h.pObject->*h.fnFunction)(pThis); } } void Caller::AddInternal(Event::Handler* pObject, Event::Handler::Function pFunction) { handler h; h.fnFunction = pFunction; h.pObject = pObject; m_Handlers.push_back(h); pObject->RegisterCaller(this); } void Caller::RemoveHandler(Event::Handler* pObject) { pObject->UnRegisterCaller(this); std::list::iterator iter = m_Handlers.begin(); while (iter != m_Handlers.end()) { handler& h = *iter; if (h.pObject == pObject) { iter = m_Handlers.erase(iter); } else { ++iter; } } }