1 // Copyright (C) 2006-2021 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);
50 virtual void notifyObserverFromClone(Node *originalInstance, const std::string& event, Node *clonedInstanceGeneratingEvent);
54 /*! \brief Base class for dispatcher in observer pattern
56 * Dispatcher and Observer objects can be used to be notified about events
57 * that occurs in editing or executing a calculation schema.
59 * When an object wants to notify an event, it calls the dispatch method
60 * of the dispatcher with 2 arguments : the object reference and an event type.
61 * The dispatcher which is a singleton is obtained by calling the class method
63 * The dispatcher notifies all the registered observers by calling their notifyObserver
66 * Observers can be registered by calling the addObserver method with two
67 * arguments : an object reference and an event type. This observer will be
68 * notify with events coming only from this object.
70 * Limitation : emitting objects can be only Node
73 class YACSLIBENGINE_EXPORT Dispatcher
76 virtual void dispatch(Node* object,const std::string& event);
77 virtual void dispatch2(Node* object,const std::string& event, void *something);
78 virtual void dispatchFromClone(Node *originalInstance, const std::string& event, Node *clonedInstanceGeneratingEvent);
79 virtual void addObserver(Observer* observer,Node* object,const std::string& event);
80 virtual void removeObserver(Observer* observer,Node* object,const std::string& event);
81 virtual void printObservers();
82 static Dispatcher* getDispatcher();
83 static void setDispatcher(Dispatcher* dispatcher);
84 virtual ~Dispatcher();
86 std::map< std::pair<Node*,std::string> , std::set<Observer*> > _observers;
87 static Dispatcher* _singleton;