1 /* 2 GWEN 3 Copyright (c) 2010 Facepunch Studios 4 See license in Gwen.h 5 */ 6 7 #include "Gwen/Events.h" 8 9 using namespace Gwen; 10 using namespace Gwen::Event; 11 Handler()12Handler::Handler() 13 { 14 } 15 ~Handler()16Handler::~Handler() 17 { 18 CleanLinks(); 19 } 20 CleanLinks()21void Handler::CleanLinks() 22 { 23 // Tell all the callers that we're dead 24 std::list<Caller*>::iterator iter = m_Callers.begin(); 25 while (iter != m_Callers.end()) 26 { 27 Caller* pCaller = *iter; 28 UnRegisterCaller(pCaller); 29 pCaller->RemoveHandler(this); 30 iter = m_Callers.begin(); 31 } 32 } 33 RegisterCaller(Caller * pCaller)34void Handler::RegisterCaller(Caller* pCaller) 35 { 36 m_Callers.push_back(pCaller); 37 } 38 UnRegisterCaller(Caller * pCaller)39void Handler::UnRegisterCaller(Caller* pCaller) 40 { 41 m_Callers.remove(pCaller); 42 } 43 Caller()44Caller::Caller() 45 { 46 } 47 ~Caller()48Caller::~Caller() 49 { 50 CleanLinks(); 51 } 52 CleanLinks()53void Caller::CleanLinks() 54 { 55 std::list<handler>::iterator iter; 56 for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) 57 { 58 handler& h = *iter; 59 h.pObject->UnRegisterCaller(this); 60 } 61 62 m_Handlers.clear(); 63 } 64 Call(Controls::Base * pThis)65void Caller::Call(Controls::Base* pThis) 66 { 67 std::list<handler>::iterator iter; 68 for (iter = m_Handlers.begin(); iter != m_Handlers.end(); ++iter) 69 { 70 handler& h = *iter; 71 (h.pObject->*h.fnFunction)(pThis); 72 } 73 } 74 AddInternal(Event::Handler * pObject,Event::Handler::Function pFunction)75void Caller::AddInternal(Event::Handler* pObject, Event::Handler::Function pFunction) 76 { 77 handler h; 78 h.fnFunction = pFunction; 79 h.pObject = pObject; 80 81 m_Handlers.push_back(h); 82 83 pObject->RegisterCaller(this); 84 } 85 RemoveHandler(Event::Handler * pObject)86void Caller::RemoveHandler(Event::Handler* pObject) 87 { 88 pObject->UnRegisterCaller(this); 89 90 std::list<handler>::iterator iter = m_Handlers.begin(); 91 92 while (iter != m_Handlers.end()) 93 { 94 handler& h = *iter; 95 96 if (h.pObject == pObject) 97 { 98 iter = m_Handlers.erase(iter); 99 } 100 else 101 { 102 ++iter; 103 } 104 } 105 }