Xcos MVC: standardize C++ code
[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  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef CONTROLLER_HXX_
14 #define CONTROLLER_HXX_
15
16 #include <vector>
17 #include <map>
18 #include <memory>
19
20 #include "utilities.hxx"
21 #include "Model.hxx"
22 #include "View.hxx"
23
24 #include "dynlib_scicos.h"
25
26 namespace org_scilab_modules_scicos
27 {
28
29 /**
30  * Controller from the MVC pattern
31  *
32  * All calls to objects should use this controller, all usable objects are referenced by this controller.
33  */
34 class SCICOS_IMPEXP Controller
35 {
36 public:
37     static void register_view(View* v);
38     static void unregister_view(View* v);
39
40     Controller();
41     ~Controller();
42
43     ScicosID createObject(kind_t k);
44     void deleteObject(ScicosID uid);
45     ScicosID cloneObject(ScicosID uid);
46
47     std::shared_ptr<model::BaseObject> getObject(ScicosID uid) const;
48
49     template<typename T>
50     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, T& v) const
51     {
52         return m_instance.model.getObjectProperty(uid, k, p, v);
53     };
54
55     template<typename T>
56     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, T v)
57     {
58         update_status_t status = m_instance.model.setObjectProperty(uid, k, p, v);
59         if (status == SUCCESS)
60         {
61             for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
62             {
63                 (*iter)->propertyUpdated(uid, k, p);
64             }
65         }
66         for (view_set_t::iterator iter = m_instance.allViews.begin(); iter != m_instance.allViews.end(); ++iter)
67         {
68             (*iter)->propertyUpdated(uid, k, p, status);
69         }
70         return status;
71     }
72
73 private:
74
75     typedef std::vector<View*> view_set_t;
76
77     /**
78      * Shared data through all instance of the controllers
79      */
80     struct SharedData
81     {
82         Model model;
83         view_set_t allViews;
84
85         SharedData();
86         ~SharedData();
87     };
88
89     /**
90      * Shared instance of the data
91      *
92      * This will be allocated on-demand be Controller::get_instance()
93      */
94     static SharedData m_instance;
95
96     /*
97      * Methods
98      */
99
100     ScicosID cloneObject(std::map<ScicosID, ScicosID>& mapped, ScicosID uid);
101
102     template<typename T>
103     void cloneProperties(std::shared_ptr<model::BaseObject> initial, ScicosID clone)
104     {
105         for (int i = 0; i < MAX_OBJECT_PROPERTIES; ++i)
106         {
107             enum object_properties_t p = static_cast<enum object_properties_t>(i);
108
109             T value;
110             bool status = getObjectProperty(initial->id(), initial->kind(), p, value);
111             if (status)
112             {
113                 setObjectProperty(clone, initial->kind(), p, value);
114             }
115         }
116
117     };
118
119     void deepClone(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound);
120     void deepCloneVector(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound);
121     void unlinkVector(ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop);
122     void unlink(ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop);
123     void deleteVector(ScicosID uid, kind_t k, object_properties_t uid_prop);
124 };
125
126 } /* namespace org_scilab_modules_scicos */
127
128 #endif /* CONTROLLER_HXX_ */