#ifndef __CCKEYPAD_DISPATCHER_H__
#define __CCKEYPAD_DISPATCHER_H__
#include "CCKeypadDelegate.h"
#include "cocoa/CCArray.h"
NS_CC_BEGIN
typedef enum {
// the back key clicked msg
kTypeBackClicked = 1,
kTypeMenuClicked,
} ccKeypadMSGType;
struct _ccCArray;
/**
@class CCKeypadDispatcher
@brief Dispatch the keypad message from the phone//分发手机的键盘消息
*/
class CC_DLLCCKeypadDispatcher : public CCObject
{
public:
CCKeypadDispatcher();
~CCKeypadDispatcher();
voidaddDelegate(CCKeypadDelegate* pDelegate);//增加回调键盘消息方法
voidremoveDelegate(CCKeypadDelegate* pDelegate); //移除回调键盘消息方法
voidforceAddDelegate(CCKeypadDelegate* pDelegate);//force 强迫
voidforceRemoveDelegate(CCKeypadDelegate* pDelegate);
booldispatchKeypadMSG(ccKeypadMSGType nMsgType);//分发键盘消息 参数是键盘消息类型 包括kTypeBackClicked kTypeMenuClicked
{
CCKeypadHandler* pHandler = NULL;
CCKeypadDelegate* pDelegate = NULL;
m_bLocked = true;
if (m_pDelegates->count() > 0)
{
CCObject* pObj = NULL;
CCARRAY_FOREACH(m_pDelegates, pObj)
{
CC_BREAK_IF(!pObj);
pHandler = (CCKeypadHandler*)pObj;
pDelegate = pHandler->getDelegate();
switch (nMsgType)
{
case kTypeBackClicked:
pDelegate->keyBackClicked();
break;
case kTypeMenuClicked:
pDelegate->keyMenuClicked();
break;
default:
break;
}
}
}
m_bLocked = false;
if (m_bToRemove)
{
m_bToRemove = false;
for (unsigned int i = 0; i < m_pHandlersToRemove->num; ++i)
{
forceRemoveDelegate((CCKeypadDelegate*)m_pHandlersToRemove->arr[i]);
}
ccCArrayRemoveAllValues(m_pHandlersToRemove);
}
if (m_bToAdd)
{
m_bToAdd = false;
for (unsigned int i = 0; i < m_pHandlersToAdd->num; ++i)
{
forceAddDelegate((CCKeypadDelegate*)m_pHandlersToAdd->arr[i]);
}
ccCArrayRemoveAllValues(m_pHandlersToAdd);
}
return true;
}
protected:
CCArray* m_pDelegates; //消息回调委托 数组
bool m_bLocked;
bool m_bToAdd;
bool m_bToRemove;
struct _ccCArray *m_pHandlersToAdd;
struct _ccCArray *m_pHandlersToRemove;
};
NS_CC_END
#endif //__CCKEYPAD_DISPATCHER_H__