a4dfb46d69c42e700b0e3cdcf6bbe12e52281bdf
[scilab.git] / scilab / modules / scicos / src / cpp / Controller.cpp
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 #include <algorithm>
14
15 #include "Controller.hxx"
16
17 #include "LoggerView.hxx"
18
19 namespace org_scilab_modules_scicos
20 {
21
22 /*
23  * Implement SharedData methods
24  */
25 Controller::SharedData::SharedData() : model(), allViews()
26 {
27     LoggerView* v = new LoggerView();
28     allViews.push_back(v);
29 }
30
31 Controller::SharedData::~SharedData()
32 {
33     for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
34     {
35         delete *iter;
36     }
37 }
38
39 Controller::SharedData* Controller::_instance = 0;
40
41 void Controller::delete_all_instances()
42 {
43     if (_instance == 0)
44     {
45         return;
46     }
47
48     delete _instance;
49 }
50
51 void Controller::register_view(View* v)
52 {
53     if (_instance == 0)
54     {
55         _instance = new SharedData();
56     }
57
58     _instance->allViews.push_back(v);
59 }
60
61 void Controller::unregister_view(View* v)
62 {
63     if (_instance == 0)
64     {
65         return;
66     }
67
68     view_set_t::iterator it = std::find(_instance->allViews.begin(), _instance->allViews.end(), v);
69     if (it != _instance->allViews.end())
70     {
71         _instance->allViews.erase(it);
72     }
73 }
74
75 Controller::Controller()
76 {
77     if (_instance == 0)
78     {
79         _instance = new SharedData();
80     }
81 }
82
83 Controller::Controller(const Controller& c)
84 {
85     // _instance is already initialized
86
87     // silent unused parameter warnings
88     (void) c;
89 }
90
91 Controller::~Controller()
92 {
93 }
94
95 ScicosID Controller::createObject(kind_t k)
96 {
97     ScicosID id = _instance->model.createObject(k);
98
99     for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
100     {
101         (*iter)->objectCreated(id, k);
102     }
103
104     return id;
105 }
106
107 void Controller::deleteObject(ScicosID uid)
108 {
109     _instance->model.deleteObject(uid);
110
111     for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
112     {
113         (*iter)->objectDeleted(uid);
114     }
115 }
116
117 template<typename T>
118 void cloneProperties(Controller* controller, model::BaseObject* initial, ScicosID clone)
119 {
120     for (int i = 0; i < MAX_OBJECT_PROPERTIES; ++i)
121     {
122         enum object_properties_t p = static_cast<enum object_properties_t>(i);
123
124         T value;
125         bool status = controller->getObjectProperty(initial->id(), initial->kind(), p, value);
126         if (status)
127         {
128             controller->setObjectProperty(clone, initial->kind(), p, value);
129         }
130     }
131
132 };
133
134 ScicosID Controller::cloneObject(ScicosID uid)
135 {
136     model::BaseObject* initial = getObject(uid);
137     ScicosID o = createObject(initial->kind());
138
139     // Get then set all properties per type
140     cloneProperties<double>(this, initial, o);
141     cloneProperties<int>(this, initial, o);
142     cloneProperties<bool>(this, initial, o);
143     cloneProperties<std::string>(this, initial, o);
144     cloneProperties<ScicosID>(this, initial, o);
145     cloneProperties< std::vector<double> >(this, initial, o);
146     cloneProperties< std::vector<int> >(this, initial, o);
147     cloneProperties< std::vector<std::string> >(this, initial, o);
148     cloneProperties< std::vector<ScicosID> >(this, initial, o);
149
150     return o;
151 }
152
153 model::BaseObject* Controller::getObject(ScicosID uid)
154 {
155     return _instance->model.getObject(uid);
156 }
157
158 update_status_t Controller::setObject(model::BaseObject* o)
159 {
160     update_status_t status = _instance->model.setObject(o);
161
162     if (status == SUCCESS)
163     {
164         for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
165         {
166             (*iter)->objectUpdated(o->id(), o->kind());
167         }
168     }
169     return status;
170 }
171
172 } /* namespace org_scilab_modules_scicos */