]> SALOME platform Git repositories - modules/yacs.git/blobdiff - src/hmi/guiObservers.hxx
Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / hmi / guiObservers.hxx
diff --git a/src/hmi/guiObservers.hxx b/src/hmi/guiObservers.hxx
new file mode 100644 (file)
index 0000000..8bf18ff
--- /dev/null
@@ -0,0 +1,706 @@
+
+#ifndef _GUIOBSERVERS_HXX_
+#define _GUIOBSERVERS_HXX_
+
+#include <set>
+#include <string>
+#include <map>
+#include <list>
+#include "Dispatcher.hxx"
+
+namespace YACS
+{
+  namespace ENGINE
+  {
+    class Node;
+    class ComposedNode;
+    class Bloc;
+    class Proc;
+    class ForLoop;
+    class ForEachLoop;
+    class WhileLoop;
+    class Switch;
+    class OptimizerLoop;
+    class ElementaryNode;
+    class InlineNode;
+    class ServiceNode;
+    class PythonNode;
+    class PyFuncNode;
+    class CORBANode;
+    class CppNode;
+    class SalomeNode;
+    class SalomePythonNode;
+    class XmlNode;
+    class SplitterNode;
+    class DataNode;
+    class PresetNode;
+    class OutNode;
+    class StudyInNode;
+    class StudyOutNode;
+    class DataPort;
+    class InputPort;
+    class OutputPort;
+    class InPort;
+    class OutPort;
+    class InputDataStreamPort;
+    class OutputDataStreamPort;
+    class Catalog;
+    class ComponentInstance;
+    class Container;
+    class TypeCode;
+  }
+
+  namespace HMI
+  {
+
+    typedef enum
+      {
+        ADD,
+        REMOVE,
+        CUT,
+        PASTE,
+        EDIT,
+       UPDATE,
+       UPDATEPROGRESS,
+       UP,
+       DOWN,
+        RENAME,
+        NEWROOT,
+        ADDLINK,
+        ADDCONTROLLINK,
+        ADDREF,
+      } GuiEvent;
+    
+    class ProcInvoc;
+    class GuiObserver;
+    
+    class SubjectReference;
+    class Subject: public YACS::ENGINE::Observer
+    {
+    public:
+      Subject(Subject *parent);
+      virtual ~Subject();
+      virtual void attach(GuiObserver *obs);
+      virtual void detach(GuiObserver *obs);
+      virtual void select(bool isSelected);
+      virtual void update(GuiEvent event, int type, Subject* son);
+      virtual std::string getName();
+      virtual bool setName(std::string name);
+      virtual Subject* getParent();
+      virtual bool destroy(Subject *son);
+      virtual void loadChildren();
+      virtual void loadLinks();
+      virtual void addSubjectReference(Subject *ref);
+      virtual void clean();
+      void localClean();
+      bool isDestructible() { return _destructible; };
+      static void erase(Subject* sub);
+    protected:
+      std::set<GuiObserver *> _setObs;
+      Subject *_parent;
+      bool _destructible;
+    };
+    
+    class GuiObserver
+    {
+    public:
+      GuiObserver();
+      virtual ~GuiObserver();
+      virtual void select(bool isSelected);
+      virtual void update(GuiEvent event, int type, Subject* son);
+      void incrementSubjects(Subject *subject);
+      void decrementSubjects(Subject *subject);
+      int getNbSubjects();
+    protected:
+      std::set<Subject*> _subjectSet;
+    };
+    
+    class SubjectReference: public Subject
+    {
+    public:
+      SubjectReference(Subject* ref, Subject *parent);
+      virtual ~SubjectReference();
+      virtual std::string getName();
+      virtual Subject* getReference() const;
+      virtual void clean();
+      void localClean();
+    protected:
+      Subject* _reference;
+    };
+
+    class SubjectLink;
+    class SubjectControlLink;
+    class SubjectDataPort: public Subject
+    {
+    public:
+      SubjectDataPort(YACS::ENGINE::DataPort* port, Subject *parent);
+      virtual ~SubjectDataPort();
+      virtual std::string getName();
+      virtual YACS::ENGINE::DataPort* getPort();
+      static bool tryCreateLink(SubjectDataPort *subOutport, SubjectDataPort *subInport);
+      virtual void clean();
+      void localClean();
+      void addSubjectLink(SubjectLink* subject) { _listSubjectLink.push_back(subject); };
+      void removeSubjectLink(SubjectLink* subject) { _listSubjectLink.remove(subject); };
+      std::list<SubjectLink*> getListOfSubjectLink() { return _listSubjectLink; };
+    protected:
+      YACS::ENGINE::DataPort *_dataPort;
+      std::list<SubjectLink*> _listSubjectLink;
+    };
+
+    class SubjectInputPort: public SubjectDataPort
+    {
+    public:
+      SubjectInputPort(YACS::ENGINE::InputPort *port, Subject *parent);
+      virtual ~SubjectInputPort();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::InputPort *_inputPort;
+    };
+    
+    class SubjectOutputPort: public SubjectDataPort
+    {
+    public:
+      SubjectOutputPort(YACS::ENGINE::OutputPort *port, Subject *parent);
+      virtual ~SubjectOutputPort();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::OutputPort *_outputPort;
+    };
+    
+    class SubjectInputDataStreamPort: public SubjectDataPort
+    {
+    public:
+      SubjectInputDataStreamPort(YACS::ENGINE::InputDataStreamPort *port, Subject *parent);
+      virtual ~SubjectInputDataStreamPort();
+      virtual bool setProperties(std::map<std::string, std::string> properties);
+      virtual std::map<std::string, std::string> getProperties();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::InputDataStreamPort *_inputDataStreamPort;
+    };
+    
+    class SubjectOutputDataStreamPort: public SubjectDataPort
+    {
+    public:
+      SubjectOutputDataStreamPort(YACS::ENGINE::OutputDataStreamPort *port, Subject *parent);
+      virtual ~SubjectOutputDataStreamPort();
+      virtual bool setProperties(std::map<std::string, std::string> properties);
+      virtual std::map<std::string, std::string> getProperties();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::OutputDataStreamPort *_outputDataStreamPort;
+    };
+
+    
+    class SubjectNode: public Subject
+    {
+    public:
+      SubjectNode(YACS::ENGINE::Node *node, Subject *parent);
+      virtual ~SubjectNode();
+      virtual void reparent(Subject* parent);
+      virtual std::string getName();
+      virtual bool setName(std::string name);
+      virtual YACS::ENGINE::Node* getNode();
+      virtual void clean();
+      SubjectControlLink* addSubjectControlLink(SubjectControlLink *sub) { _listSubjectControlLink.push_back(sub); };
+      void removeSubjectControlLink(SubjectControlLink* sub) { _listSubjectControlLink.remove(sub); };
+      std::list<SubjectLink*> getSubjectLinks() const { return _listSubjectLink; };
+      std::list<SubjectControlLink*> getSubjectControlLinks() const { return _listSubjectControlLink; };
+      std::list<SubjectInputPort*> getSubjectInputPorts() const { return _listSubjectInputPort; };
+      std::list<SubjectOutputPort*> getSubjectOutputPorts() const { return _listSubjectOutputPort; };
+      std::list<SubjectInputDataStreamPort*> getSubjectInputDataStreamPorts() const { return _listSubjectIDSPort; };
+      std::list<SubjectOutputDataStreamPort*> getSubjectOutputDataStreamPorts() const { return _listSubjectODSPort; };
+      void localClean();
+      virtual void update(GuiEvent event, int type, Subject* son);
+      static bool tryCreateLink(SubjectNode *subOutNode, SubjectNode *subInNode);
+    //protected: // a temporary solution while SessionCataLoader use loadTypesOld(...)
+                 // method instead of a new loadTypes(...) method
+      virtual SubjectInputPort* addSubjectInputPort(YACS::ENGINE::InputPort *port,
+                                                    std::string name = "");
+      virtual SubjectOutputPort* addSubjectOutputPort(YACS::ENGINE::OutputPort *port,
+                                                      std::string name = "");
+      virtual SubjectInputDataStreamPort* addSubjectIDSPort(YACS::ENGINE::InputDataStreamPort *port,
+                                                            std::string name = "");
+      virtual SubjectOutputDataStreamPort* addSubjectODSPort(YACS::ENGINE::OutputDataStreamPort *port,
+                                                             std::string name = "");
+      virtual void notifyObserver(YACS::ENGINE::Node* object,const std::string& event);
+    protected:
+      virtual void removeExternalLinks();
+      YACS::ENGINE::Node *_node;
+      std::list<SubjectInputPort*> _listSubjectInputPort;
+      std::list<SubjectOutputPort*> _listSubjectOutputPort;
+      std::list<SubjectInputDataStreamPort*> _listSubjectIDSPort;
+      std::list<SubjectOutputDataStreamPort*> _listSubjectODSPort;
+      std::list<SubjectLink*> _listSubjectLink;
+      std::list<SubjectControlLink*> _listSubjectControlLink;
+    };
+    
+    class SubjectComposedNode: public SubjectNode
+    {
+    public:
+      SubjectComposedNode(YACS::ENGINE::ComposedNode *composedNode, Subject *parent);
+      virtual ~SubjectComposedNode();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const  { return 0; }
+      virtual void loadChildren();
+      virtual void loadLinks();
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      SubjectLink* addSubjectLink(SubjectNode *sno,
+                                  SubjectDataPort *spo,
+                                  SubjectNode *sni,
+                                  SubjectDataPort *spi);
+      SubjectControlLink* addSubjectControlLink(SubjectNode *sno,
+                                                SubjectNode *sni);
+      virtual void removeLink(SubjectLink* link);
+      virtual void removeControlLink(SubjectControlLink* link);
+      virtual void clean();
+      void localClean();
+      static SubjectComposedNode* getLowestCommonAncestor(SubjectNode* snode1, SubjectNode* snode2);
+    protected:
+      virtual SubjectNode *createNode(YACS::ENGINE::Catalog *catalog,
+                                      std::string compo,
+                                      std::string type,
+                                      std::string name,
+                                      int swCase=0);
+      virtual SubjectNode* addSubjectNode(YACS::ENGINE::Node * node,
+                                          std::string name = "",
+                                          YACS::ENGINE::Catalog *catalog = 0,
+                                          std::string compo = "",
+                                          std::string type ="");
+      YACS::ENGINE::ComposedNode *_composedNode;
+    };
+
+    class SubjectBloc: public SubjectComposedNode
+    {
+    public:
+      SubjectBloc(YACS::ENGINE::Bloc *bloc, Subject *parent);
+      virtual ~SubjectBloc();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual void removeNode(SubjectNode* child);
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const;
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::Bloc *_bloc;
+      std::set<SubjectNode*> _children;
+    };
+
+    class SubjectContainer: public Subject
+    {
+    public:
+      SubjectContainer(YACS::ENGINE::Container* container, Subject *parent);
+      virtual ~SubjectContainer();
+      virtual std::string getName();
+      virtual std::map<std::string, std::string> getProperties();
+      virtual bool setProperties(std::map<std::string, std::string> properties);
+      virtual void clean();
+      void localClean();
+      YACS::ENGINE::Container* getContainer() const;
+    protected:
+      YACS::ENGINE::Container* _container;
+    };
+
+    class SubjectComponent: public Subject
+    {
+    public:
+      SubjectComponent(YACS::ENGINE::ComponentInstance* component, Subject *parent);
+      virtual ~SubjectComponent();
+      virtual std::string getName();
+      virtual void setContainer();
+      virtual void associateToContainer(SubjectContainer* subcont);
+      virtual std::pair<std::string, int> getKey();
+      virtual void clean();
+      void localClean();
+      YACS::ENGINE::ComponentInstance* getComponent() const;
+    protected:
+      int _id;
+      YACS::ENGINE::ComponentInstance* _compoInst;
+    };
+
+    class SubjectDataType: public Subject
+    {
+    public:
+      SubjectDataType(YACS::ENGINE::TypeCode *typeCode, Subject *parent);
+      virtual ~SubjectDataType();
+      virtual std::string getName();
+      virtual YACS::ENGINE::TypeCode* getTypeCode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::TypeCode *_typeCode;
+    };
+
+    class SubjectProc: public SubjectBloc
+    {
+    public:
+      SubjectProc(YACS::ENGINE::Proc *proc, Subject *parent);
+      virtual ~SubjectProc();
+      void loadProc();
+      void loadComponents();
+      void loadContainers();
+      virtual SubjectComponent* addComponent(std::string name);
+      virtual SubjectContainer* addContainer(std::string name, std::string ref="");
+      virtual SubjectDataType* addDataType(YACS::ENGINE::Catalog* catalog, std::string typeName);
+      SubjectComponent* addSubjectComponent(YACS::ENGINE::ComponentInstance* compo);
+      SubjectContainer* addSubjectContainer(YACS::ENGINE::Container* cont,
+                                            std::string name = "");
+      SubjectDataType* addSubjectDataType(YACS::ENGINE::TypeCode *type);
+      void removeSubjectDataType(YACS::ENGINE::TypeCode *type);
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::Proc *_proc;
+    };
+
+    class SubjectForLoop: public SubjectComposedNode
+    {
+    public:
+      SubjectForLoop(YACS::ENGINE::ForLoop *forLoop, Subject *parent);
+      virtual ~SubjectForLoop();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const { return _body; }
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::ForLoop *_forLoop;
+      SubjectNode* _body;
+    };
+
+    class SubjectWhileLoop: public SubjectComposedNode
+    {
+    public:
+      SubjectWhileLoop(YACS::ENGINE::WhileLoop *whileLoop, Subject *parent);
+      virtual ~SubjectWhileLoop();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const { return _body; }
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::WhileLoop *_whileLoop;
+      SubjectNode* _body;
+    };
+
+    class SubjectSwitch: public SubjectComposedNode
+    {
+    public:
+      SubjectSwitch(YACS::ENGINE::Switch *aSwitch, Subject *parent);
+      virtual ~SubjectSwitch();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name,
+                                  int swCase,
+                                  bool replace = false);
+      virtual void removeNode(SubjectNode* son);
+      std::map<int, SubjectNode*> getBodyMap();
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const;
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::Switch *_switch;
+      std::map<int, SubjectNode*> _bodyMap;
+    };
+
+    class SubjectForEachLoop: public SubjectComposedNode
+    {
+    public:
+      SubjectForEachLoop(YACS::ENGINE::ForEachLoop *forEachLoop, Subject *parent);
+      virtual ~SubjectForEachLoop();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const { return _body; }
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::ForEachLoop *_forEachLoop;
+      SubjectNode* _body;
+      SubjectNode* _splitter;
+    };
+
+    class SubjectOptimizerLoop: public SubjectComposedNode
+    {
+    public:
+      SubjectOptimizerLoop(YACS::ENGINE::OptimizerLoop *optimizerLoop, Subject *parent);
+      virtual ~SubjectOptimizerLoop();
+      virtual SubjectNode* addNode(YACS::ENGINE::Catalog *catalog,
+                                  std::string compo,
+                                  std::string type,
+                                  std::string name);
+      virtual void completeChildrenSubjectList(SubjectNode *son);
+      virtual SubjectNode* getChild(YACS::ENGINE::Node* node=0) const { return _body; }
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::OptimizerLoop *_optimizerLoop;
+      SubjectNode* _body;
+    };
+
+    class SubjectElementaryNode: public SubjectNode
+    {
+    public:
+      SubjectElementaryNode(YACS::ENGINE::ElementaryNode *elementaryNode, Subject *parent);
+      virtual ~SubjectElementaryNode();
+      virtual SubjectDataPort* addInputPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name);
+      virtual SubjectDataPort* addOutputPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name);
+      virtual SubjectDataPort* addIDSPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name);
+      virtual SubjectDataPort* addODSPort(YACS::ENGINE::Catalog *catalog, std::string type, std::string name);
+      virtual void removePort(SubjectDataPort* port);
+      virtual void loadChildren();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::ElementaryNode *_elementaryNode;
+    };
+
+    class SubjectInlineNode: public SubjectElementaryNode
+    {
+    public:
+      SubjectInlineNode(YACS::ENGINE::InlineNode *inlineNode, Subject *parent);
+      virtual ~SubjectInlineNode();
+      virtual bool setScript(std::string script);
+      virtual std::string getScript();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::InlineNode *_inlineNode;
+    };
+
+    class SubjectPythonNode: public SubjectInlineNode
+    {
+    public:
+      SubjectPythonNode(YACS::ENGINE::PythonNode *pythonNode, Subject *parent);
+      virtual ~SubjectPythonNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::PythonNode *_pythonNode;
+    };
+
+    class SubjectPyFuncNode: public SubjectInlineNode
+    {
+    public:
+      SubjectPyFuncNode(YACS::ENGINE::PyFuncNode *pyFuncNode, Subject *parent);
+      virtual ~SubjectPyFuncNode();
+      virtual bool setFunctionName(std::string funcName);
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::PyFuncNode *_pyFuncNode;
+    };
+
+    class SubjectServiceNode: public SubjectElementaryNode
+    {
+    public:
+      SubjectServiceNode(YACS::ENGINE::ServiceNode *serviceNode, Subject *parent);
+      virtual ~SubjectServiceNode();
+      virtual void setComponentFromCatalog(YACS::ENGINE::Catalog *catalog,
+                                           std::string compo,
+                                           std::string service);
+      virtual void setComponent();
+      virtual void associateToComponent(SubjectComponent *subcomp);
+      virtual void removeSubjectReference(Subject *ref);
+      virtual void addSubjectReference(Subject *ref);
+      virtual SubjectReference* getSubjectReference();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::ServiceNode *_serviceNode;
+      SubjectReference* _subjectReference;
+    };
+
+    class SubjectCORBANode: public SubjectServiceNode
+    {
+    public:
+      SubjectCORBANode(YACS::ENGINE::CORBANode *corbaNode, Subject *parent);
+      virtual ~SubjectCORBANode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::CORBANode *_corbaNode;
+    };
+
+    class SubjectCppNode: public SubjectServiceNode
+    {
+    public:
+      SubjectCppNode(YACS::ENGINE::CppNode *cppNode, Subject *parent);
+      virtual ~SubjectCppNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::CppNode *_cppNode;
+    };
+
+    class SubjectSalomeNode: public SubjectServiceNode
+    {
+    public:
+      SubjectSalomeNode(YACS::ENGINE::SalomeNode *salomeNode, Subject *parent);
+      virtual ~SubjectSalomeNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::SalomeNode *_salomeNode;
+    };
+
+    class SubjectSalomePythonNode: public SubjectServiceNode
+    {
+    public:
+      SubjectSalomePythonNode(YACS::ENGINE::SalomePythonNode *salomePythonNode,
+                              Subject *parent);
+      virtual ~SubjectSalomePythonNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::SalomePythonNode *_salomePythonNode;
+    };
+
+    class SubjectXmlNode: public SubjectServiceNode
+    {
+    public:
+      SubjectXmlNode(YACS::ENGINE::XmlNode *xmlNode, Subject *parent);
+      virtual ~SubjectXmlNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::XmlNode *_xmlNode;
+    };
+
+    class SubjectSplitterNode: public SubjectElementaryNode
+    {
+    public:
+      SubjectSplitterNode(YACS::ENGINE::SplitterNode *splitterNode, Subject *parent);
+      virtual ~SubjectSplitterNode();
+      virtual std::string getName();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::SplitterNode *_splitterNode;
+    };
+
+    class SubjectDataNode: public SubjectElementaryNode
+    {
+    public:
+      SubjectDataNode(YACS::ENGINE::DataNode *dataNode, Subject *parent);
+      virtual ~SubjectDataNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::DataNode *_dataNode;
+    };
+
+    class SubjectPresetNode: public SubjectDataNode
+    {
+    public:
+      SubjectPresetNode(YACS::ENGINE::PresetNode *presetNode, Subject *parent);
+      virtual ~SubjectPresetNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::PresetNode *_presetNode;
+    };
+
+    class SubjectOutNode: public SubjectDataNode
+    {
+    public:
+      SubjectOutNode(YACS::ENGINE::OutNode *outNode, Subject *parent);
+      virtual ~SubjectOutNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::OutNode *_outNode;
+    };
+
+    class SubjectStudyInNode: public SubjectDataNode
+    {
+    public:
+      SubjectStudyInNode(YACS::ENGINE::StudyInNode *studyInNode, Subject *parent);
+      virtual ~SubjectStudyInNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::StudyInNode *_studyInNode;
+    };
+
+    class SubjectStudyOutNode: public SubjectDataNode
+    {
+    public:
+      SubjectStudyOutNode(YACS::ENGINE::StudyOutNode *studyOutNode, Subject *parent);
+      virtual ~SubjectStudyOutNode();
+      virtual void clean();
+      void localClean();
+    protected:
+      YACS::ENGINE::StudyOutNode *_studyOutNode;
+    };
+
+    class SubjectLink: public Subject
+    {
+    public:
+      SubjectLink(SubjectNode* subOutNode,
+                  SubjectDataPort* outPort,
+                  SubjectNode* subInNode,
+                  SubjectDataPort* inPort,
+                  Subject *parent);
+      virtual ~SubjectLink();
+      virtual std::string getName();
+      virtual void clean();
+      void localClean();
+      SubjectNode* getSubjectOutNode() { return _subOutNode; };
+      SubjectNode* getSubjectInNode() { return _subInNode; };
+      SubjectDataPort* getSubjectOutPort() { return _outPort; };
+      SubjectDataPort* getSubjectInPort() { return _inPort; };
+    protected:
+      SubjectNode* _subOutNode;
+      SubjectDataPort* _outPort;
+      SubjectNode* _subInNode;
+      SubjectDataPort* _inPort;
+      std::string _name;
+      YACS::ENGINE::ComposedNode *_cla;
+      YACS::ENGINE::OutPort *_outp;
+      YACS::ENGINE::InPort *_inp;
+    };
+
+    class SubjectControlLink: public Subject
+    {
+    public:
+      SubjectControlLink(SubjectNode* subOutNode,
+                         SubjectNode* subInNode,
+                         Subject *parent);
+      virtual ~SubjectControlLink();
+      virtual std::string getName();
+      virtual void clean();
+      void localClean();
+      SubjectNode* getSubjectOutNode() { return _subOutNode; };
+      SubjectNode* getSubjectInNode() { return _subInNode; };
+    protected:
+      SubjectNode* _subOutNode;
+      SubjectNode* _subInNode;
+      std::string _name;
+      YACS::ENGINE::ComposedNode *_cla;
+    };
+
+  }
+}
+#endif