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