#ifndef __CCSCRIPT_EVENT_DISPATCHER_H__
#define __CCSCRIPT_EVENT_DISPATCHER_H__
#include <map>
#include <vector>
#include "CCObject.h"
using namespace std;
NS_CC_BEGIN
class CC_DLL CCScriptHandlePair
{
public:
int index;
int listener;
int tag;
int priority;
bool enabled;
CCScriptHandlePair(int index_,int listener_, int tag_,int priority_)
: index(index_)
, listener(listener_)
, tag(tag_)
, priority(priority_)
, enabled(true)
{
}
};
#define NODE_EVENT 0
#define NODE_ENTER_FRAME_EVENT 1
#define NODE_TOUCH_EVENT 2
#define NODE_TOUCH_CAPTURE_EVENT 3
#define MENU_ITEM_CLICKED_EVENT 4
#define ACCELERATE_EVENT 5
#define KEYPAD_EVENT 6
#define NODE_TOUCH_CAPTURING_PHASE 0
#define NODE_TOUCH_TARGETING_PHASE 1
// listener handle -> listener pair
typedef vector<CCScriptHandlePair> CCScriptEventListenersForEvent;
typedef CCScriptEventListenersForEvent::iterator CCScriptEventListenersForEventIterator;
// event -> CCScriptEventListenersForEvent
typedef map<int, CCScriptEventListenersForEvent> CCScriptEventListenersForDispatcher;
typedef CCScriptEventListenersForDispatcher::iterator CCScriptEventListenersForDispatcherIterator;
class CC_DLL CCScriptEventDispatcher :public CCObject
{
public:
CCScriptEventDispatcher();
virtual ~CCScriptEventDispatcher();
int addScriptEventListener(int event,int listener, int tag =0, int priority =0);
void removeScriptEventListener(int handle);
void removeScriptEventListenersByEvent(int event);
void removeScriptEventListenersByTag(int tag);
void removeAllScriptEventListeners();
bool hasScriptEventListener(int event);
CCScriptEventListenersForEvent &getScriptEventListenersByEvent(int event)const;
CCScriptEventListenersForDispatcher &getAllScriptEventListeners()const;
private:
CCScriptEventListenersForDispatcher *m_scriptEventListeners;
static int s_nextScriptEventHandleIndex;
static CCScriptEventListenersForEvent s_emptyListenersForEvent;
static CCScriptEventListenersForDispatcher s_emptyListeners;
static bool sortListenerCompare(const CCScriptHandlePair &a,const CCScriptHandlePair &b);
static bool removeListenerByTag(CCScriptHandlePair &p);
static int s_removeTag;
};
NS_CC_END
#endif // __CCSCRIPT_EVENT_DISPATCHER_H__