File: eventHandler.hpp - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off


#ifndef _PANE_EVENT
#define _PANE_EVENT

#include <vector>

namespace       Pane
{
        /*
        ** EventHandler class (4 parameters)
        */

        template<typename Return, typename Param1 = void, typename Param2 = void, typename Param3 = void, typename Param4 = void>
        class   EventHandler
        {
                public:
                        class   EventClass
                        {
                                public:
                                        virtual                 ~EventClass ()
                                        {
                                        }

                                        virtual Return  operator () (Param1, Param2, Param3, Param4) = 0;
                        };

                        template<typename Sender = void>
                        class   Event : public EventClass
                        {
                                public:
                                        typedef Return  (Sender::*Method) (Param1, Param2, Param3, Param4);

                                        /**/    Event (Sender* sender, Method method) :
                                                method (method),
                                                sender (sender)
                                        {
                                        }

                                        virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3, Param4 param4)
                                        {
                                                return (this->sender->*method) (param1, param2, param3, param4);
                                        }

                                private:
                                        Method  method;
                                        Sender* sender;
                        };

                        /**/    ~EventHandler ();

                        void    operator += (EventClass*);
                        bool    operator () (Param1, Param2, Param3, Param4);

                private:
                        typedef std::vector<EventClass*>        Events;

                        Events  events;
        };

        /*
        ** EventHandler class (3 parameters)
        */

        template<typename Return, typename Param1, typename Param2, typename Param3>
        class   EventHandler<Return, Param1, Param2, Param3>
        {
                public:
                        class   EventClass
                        {
                                public:
                                        virtual                 ~EventClass ()
                                        {
                                        }

                                        virtual Return  operator () (Param1, Param2, Param3) = 0;
                        };

                        template<typename Sender = void>
                        class   Event : public EventClass
                        {
                                public:
                                        typedef Return  (Sender::*Method) (Param1, Param2, Param3);

                                        /**/    Event (Sender* sender, Method method) :
                                                method (method),
                                                sender (sender)
                                        {
                                        }

                                        virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3)
                                        {
                                                return (this->sender->*method) (param1, param2, param3);
                                        }

                                private:
                                        Method  method;
                                        Sender* sender;
                        };

                        /**/    ~EventHandler ();

                        void    operator += (EventClass*);
                        bool    operator () (Param1, Param2, Param3);

                private:
                        typedef std::vector<EventClass*>        Events;

                        Events  events;
        };

        /*
        ** EventHandler class (2 parameters)
        */

        template<typename Return, typename Param1, typename Param2>
        class   EventHandler<Return, Param1, Param2>
        {
                public:
                        class   EventClass
                        {
                                public:
                                        virtual                 ~EventClass ()
                                        {
                                        }

                                        virtual Return  operator () (Param1, Param2) = 0;
                        };

                        template<typename Sender = void>
                        class   Event : public EventClass
                        {
                                public:
                                        typedef Return  (Sender::*Method) (Param1, Param2);

                                        /**/    Event (Sender* sender, Method method) :
                                                method (method),
                                                sender (sender)
                                        {
                                        }

                                        virtual Return  operator () (Param1 param1, Param2 param2)
                                        {
                                                return (this->sender->*method) (param1, param2);
                                        }

                                private:
                                        Method  method;
                                        Sender* sender;
                        };

                        /**/    ~EventHandler ();

                        void    operator += (EventClass*);
                        bool    operator () (Param1, Param2);

                private:
                        typedef std::vector<EventClass*>        Events;

                        Events  events;
        };

        /*
        ** EventHandler class (1 parameter)
        */

        template<typename Return, typename Param1>
        class   EventHandler<Return, Param1>
        {
                public:
                        class   EventClass
                        {
                                public:
                                        virtual                 ~EventClass ()
                                        {
                                        }

                                        virtual Return  operator () (Param1) = 0;
                        };

                        template<typename Sender = void>
                        class   Event : public EventClass
                        {
                                public:
                                        typedef Return  (Sender::*Method) (Param1);

                                        /**/    Event (Sender* sender, Method method) :
                                                method (method),
                                                sender (sender)
                                        {
                                        }

                                        virtual Return  operator () (Param1 param1)
                                        {
                                                return (this->sender->*method) (param1);
                                        }

                                private:
                                        Method  method;
                                        Sender* sender;
                        };

                        /**/    ~EventHandler ();

                        void    operator += (EventClass*);
                        bool    operator () (Param1);

                private:
                        typedef std::vector<EventClass*>        Events;

                        Events  events;
        };

        /*
        ** EventHandler class (0 parameter)
        */

        template<typename Return>
        class   EventHandler<Return>
        {
                public:
                        class   EventClass
                        {
                                public:
                                        virtual                 ~EventClass ()
                                        {
                                        }

                                        virtual Return  operator () () = 0;
                        };

                        template<typename Sender = void>
                        class   Event : public EventClass
                        {
                                public:
                                        typedef Return  (Sender::*Method) ();

                                        /**/    Event (Sender* sender, Method method) :
                                                method (method),
                                                sender (sender)
                                        {
                                        }

                                        virtual Return  operator () ()
                                        {
                                                return (this->sender->*method) ();
                                        }

                                private:
                                        Method  method;
                                        Sender* sender;
                        };

                        /**/    ~EventHandler ();

                        void    operator += (EventClass*);
                        bool    operator () ();

                private:
                        typedef std::vector<EventClass*>        Events;

                        Events  events;
        };
}

#include "eventHandler.hxx"

#endif // _PANE_EVENT