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()12 Handler::Handler()
13 {
14 }
15 
~Handler()16 Handler::~Handler()
17 {
18 	CleanLinks();
19 }
20 
CleanLinks()21 void 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)34 void Handler::RegisterCaller(Caller* pCaller)
35 {
36 	m_Callers.push_back(pCaller);
37 }
38 
UnRegisterCaller(Caller * pCaller)39 void Handler::UnRegisterCaller(Caller* pCaller)
40 {
41 	m_Callers.remove(pCaller);
42 }
43 
Caller()44 Caller::Caller()
45 {
46 }
47 
~Caller()48 Caller::~Caller()
49 {
50 	CleanLinks();
51 }
52 
CleanLinks()53 void 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)65 void 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)75 void 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)86 void 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 }