00001 #ifndef FBXFILESDK_KFBXEVENTS_KFBXEVENTHANDLER_H
00002 #define FBXFILESDK_KFBXEVENTS_KFBXEVENTHANDLER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <fbxfilesdk/components/kbaselib/kaydaradef_h.h>
00039
00040 #include <fbxfilesdk/kfbxevents/kfbxevents.h>
00041
00042
00043 #include <fbxfilesdk/components/kbaselib/klib/kintrusivelist.h>
00044
00045
00046 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00047 namespace kfbxevents
00048 {
00049 class KFbxListener;
00050
00051
00052 class KFbxEventHandler
00053 {
00054 public:
00055 enum
00056 {
00057 eNODE_LISTENER = 0,
00058 eNODE_EMITTER,
00059 eNODE_COUNT
00060 };
00061
00062 KFbxEventHandler(){}
00063 virtual ~KFbxEventHandler(){}
00064
00065
00066 virtual int GetHandlerEventType() = 0;
00067 virtual void FunctionCall(const KFbxEventBase& pEvent) = 0;
00068 virtual KFbxListener* GetListener() = 0;
00069
00070 KFBX_LISTNODE(KFbxEventHandler, eNODE_COUNT);
00071 };
00072
00073
00074 template <typename EventType, typename ListenerType>
00075 class KFbxMemberFuncEventHandler : public KFbxEventHandler
00076 {
00077
00078
00079 typedef void (ListenerType::*CBFunction)(const EventType*);
00080
00081 public:
00082 KFbxMemberFuncEventHandler(ListenerType* pListenerInstance, CBFunction pFunc) :
00083 mFunc(pFunc),
00084 mListener(pListenerInstance){}
00085
00086
00087 virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }
00088 virtual void FunctionCall(const KFbxEventBase& pEvent){ (*mListener.*mFunc)(reinterpret_cast<const EventType*>(&pEvent)); }
00089 virtual KFbxListener* GetListener(){ return mListener;}
00090
00091 private:
00092 ListenerType* mListener;
00093
00094
00095 CBFunction mFunc;
00096 };
00097
00098
00099 template <typename EventType, typename ListenerType>
00100 class KFbxConstMemberFuncEventHandler : public KFbxEventHandler
00101 {
00102
00103
00104 typedef void (ListenerType::*CBFunction)(const EventType*)const;
00105
00106 public:
00107 KFbxConstMemberFuncEventHandler(ListenerType* pListenerInstance, CBFunction pFunc) :
00108 mFunc(pFunc),
00109 mListener(pListenerInstance){}
00110
00111
00112 virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }
00113 virtual void FunctionCall(const KFbxEventBase& pEvent){ (*mListener.*mFunc)(reinterpret_cast<const EventType*>(&pEvent)); }
00114 virtual KFbxListener* GetListener(){ return mListener;}
00115
00116 private:
00117 ListenerType* mListener;
00118
00119
00120 CBFunction mFunc;
00121 };
00122
00123
00124 template <typename EventType>
00125 class KFbxFuncEventHandler : public KFbxEventHandler
00126 {
00127
00128
00129 typedef void (*CBFunction)(const EventType*,KFbxListener*);
00130
00131 public:
00132 KFbxFuncEventHandler(KFbxListener* pListener, CBFunction pFunc) :
00133 mFunc(pFunc),
00134 mListener(pListener){}
00135
00136
00137 virtual int GetHandlerEventType(){ return EventType::GetStaticTypeId(); }
00138 virtual void FunctionCall(const KFbxEventBase& pEvent){ (*mFunc)(reinterpret_cast<const EventType*>(&pEvent),mListener); }
00139 virtual KFbxListener* GetListener(){ return mListener; }
00140
00141 private:
00142 KFbxListener* mListener;
00143
00144
00145 CBFunction mFunc;
00146 };
00147 }
00148
00149 #include <fbxfilesdk/fbxfilesdk_nsend.h>
00150
00151 #endif // FBXFILESDK_KFBXEVENTS_KFBXEVENTHANDLER_H
00152