* Bug #14586 - Xcos simulation stop button did not work.
[scilab.git] / scilab / modules / scicos / includes / Controller.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef CONTROLLER_HXX_
17 #define CONTROLLER_HXX_
18
19 #include <atomic>
20 #include <string>
21 #include <vector>
22 #include <map>
23
24 #include "utilities.hxx"
25 #include "Model.hxx"
26 #include "View.hxx"
27 #include "model/BaseObject.hxx"
28
29 #include "dynlib_scicos.h"
30
31 namespace org_scilab_modules_scicos
32 {
33
34 /**
35  * Controller from the MVC pattern
36  *
37  * All calls to objects should use this controller, all usable objects are referenced by this controller.
38  */
39 class SCICOS_IMPEXP Controller
40 {
41 public:
42     static View* register_view(const std::string& name, View* v);
43     static void unregister_view(View* v);
44     static View* unregister_view(const std::string& name);
45     static View* look_for_view(const std::string& name);
46
47     static void end_simulation();
48
49     Controller();
50     ~Controller();
51
52     ScicosID createObject(kind_t k);
53     unsigned referenceObject(const ScicosID uid) const;
54     template<typename T>
55     T* referenceObject(T* o) const
56     {
57         referenceObject(o->id());
58         return o;
59     }
60     void deleteObject(ScicosID uid);
61     ScicosID cloneObject(ScicosID uid, bool cloneChildren, bool clonePorts);
62
63     kind_t getKind(ScicosID uid) const;
64     std::vector<ScicosID> getAll(kind_t k) const;
65     void sortAndFillKind(std::vector<ScicosID>& uids, std::vector<int>& kind);
66     model::BaseObject* getObject(ScicosID uid) const;
67     template<typename T>
68     T* getObject(ScicosID uid) const
69     {
70         return static_cast<T*>(getObject(uid));
71     }
72
73     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double& v) const;
74     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int& v) const;
75     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool& v) const;
76     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::string& v) const;
77     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID& v) const;
78     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<double>& v) const;
79     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<int>& v) const;
80     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<bool>& v) const;
81     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector< std::string >& v) const;
82     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<ScicosID>& v) const;
83
84     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double v);
85     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int v);
86     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool v);
87     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID v);
88     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::string& v);
89     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<double>& v);
90     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<int>& v);
91     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<bool>& v);
92     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector< std::string >& v);
93     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<ScicosID>& v);
94
95 private:
96
97     typedef std::vector<View*> view_set_t;
98     typedef std::vector<std::string> view_name_set_t;
99
100     /**
101      * Shared data through all instance of the controllers
102      */
103     struct SharedData
104     {
105         std::atomic_flag onModelStructuralModification;
106         Model model;
107
108         std::atomic_flag onViewsStructuralModification;
109         view_name_set_t allNamedViews;
110         view_set_t allViews;
111
112         SharedData();
113         ~SharedData();
114     };
115
116     /**
117      * Shared instance of the data
118      *
119      * This will be allocated on-demand by Controller::get_instance()
120      */
121     static SharedData m_instance;
122
123     /*
124      * Methods
125      */
126
127     ScicosID cloneObject(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, bool cloneChildren, bool clonePorts);
128     template<typename T> void cloneProperties(model::BaseObject* initial, ScicosID clone);
129     template<typename T> bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, T& v) const;
130     template<typename T> update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, T v);
131     void deepClone(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound);
132     void deepCloneVector(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound);
133     void unlinkVector(ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop);
134     void unlink(ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop);
135     void deleteVector(ScicosID uid, kind_t k, object_properties_t uid_prop);
136 };
137
138 } /* namespace org_scilab_modules_scicos */
139
140 #endif /* CONTROLLER_HXX_ */