/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Reactions. * * $Id$ * $CurLog$ */ #ifndef DnnReaction_H_ #define DnnReaction_H_ #include "ccu/List.h" class DnnTrigger; class DnnEvent; class DnnBaseReaction { friend class DnnTrigger; public: enum REL_PRIORITY { isFirstPriority, isNormalPriority, isLastPriority }; protected: DnnBaseReaction (); CcuListOf Triggers; CcuListOf Grabbed; void Forget (DnnTrigger&); public: virtual ~DnnBaseReaction (); void SubscribeTo (DnnTrigger&, REL_PRIORITY = isNormalPriority); void UnsubscribeTo (DnnTrigger&); void Grab (DnnTrigger&); void Release (DnnTrigger&); virtual void Manage (DnnEvent&); }; typedef void (*DnnHandlingFunction) (DnnEvent&); class DnnCallback : public DnnBaseReaction { protected: DnnHandlingFunction Handler; public: DnnCallback (DnnHandlingFunction); ~DnnCallback (); void Manage (DnnEvent&); }; template class DnnReactionOf : public DnnBaseReaction { protected: T& Object; void (T::*Reaction) (DnnEvent&); public: DnnReactionOf (T& o, void (T::*r) (DnnEvent&)) : DnnBaseReaction (), Object (o), Reaction (r) {} ~DnnReactionOf () {} void Manage (DnnEvent& ev) { (Object.*Reaction) (ev); } }; #define SpecializedReaction(R,S) \ class R : public DnnBaseReaction { \ protected: \ S& Body; \ void (S::*React) (DnnEvent&); \ public: \ R (S& s, void (S::*sc) (DnnEvent&)) : DnnBaseReaction (), Body (s), React (sc) {} \ ~R () {} \ void Manage (DnnEvent& ev) { (Body.*React) (ev); } \ }; /* Attempt at having reactions that locate the object which should be activated. DnnObjectReactionOf should be renamed DnnReactionOf, and DnnReactionOf should be renamed DnnBasicReactionOf */ class DnnObjectReaction : public DnnBaseReaction { protected: virtual void* LocateObject (DnnEvent&) = 0; public: DnnObjectReaction () : DnnBaseReaction () {} ~DnnObjectReaction () {} }; template class DnnObjectReactionOf : public DnnObjectReaction { protected: void (T::*Reaction) (DnnEvent&); public: DnnObjectReactionOf (void (T::*r) (DnnEvent&)) : DnnObjectReaction (), Reaction (r) {} ~DnnObjectReactionOf () {} void Manage (DnnEvent& ev) { T* o = (T*) LocateObject (ev); (o->*Reaction) (ev); } }; #if 0 template class XtvReflexOf : public DnnObjectReactionOf { protected: void* LocateObject (DnnEvent& ev) { return ((XtvEvent*)&ev)->GetTarget (); } public: XtvReflexOf (void (T::*r) (DnnEvent&)) : DnnObjectReactionOf (r) {} }; #endif #endif /* DnnReaction_H_ */