1 // Copyright (C) 2006-2016 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef __DISPATCHER_HXX__
21 #define __DISPATCHER_HXX__
23 #include "YACSlibEngineExport.hxx"
36 /*! \brief Base class for observer in observer pattern
38 * When an event occurs, a registered observer is notified by
39 * calling its notifyObserver method with 2 arguments : the object
40 * which has emitted the event and the event type. There is no more
41 * data. It's the responsability of the observer to request all needed
42 * information from the emitting object.
45 class YACSLIBENGINE_EXPORT Observer
48 virtual void notifyObserver(Node* object,const std::string& event);
49 virtual void notifyObserver2(Node* object,const std::string& event, void *something);
53 /*! \brief Base class for dispatcher in observer pattern
55 * Dispatcher and Observer objects can be used to be notified about events
56 * that occurs in editing or executing a calculation schema.
58 * When an object wants to notify an event, it calls the dispatch method
59 * of the dispatcher with 2 arguments : the object reference and an event type.
60 * The dispatcher which is a singleton is obtained by calling the class method
62 * The dispatcher notifies all the registered observers by calling their notifyObserver
65 * Observers can be registered by calling the addObserver method with two
66 * arguments : an object reference and an event type. This observer will be
67 * notify with events coming only from this object.
69 * Limitation : emitting objects can be only Node
72 class YACSLIBENGINE_EXPORT Dispatcher
75 virtual void dispatch(Node* object,const std::string& event);
76 virtual void dispatch2(Node* object,const std::string& event, void *something);
77 virtual void addObserver(Observer* observer,Node* object,const std::string& event);
78 virtual void removeObserver(Observer* observer,Node* object,const std::string& event);
79 virtual void printObservers();
80 static Dispatcher* getDispatcher();
81 static void setDispatcher(Dispatcher* dispatcher);
82 virtual ~Dispatcher();
84 std::map< std::pair<Node*,std::string> , std::set<Observer*> > _observers;
85 static Dispatcher* _singleton;