2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
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
15 #include "Controller.hxx"
17 #include "LoggerView.hxx"
19 namespace org_scilab_modules_scicos
23 * Implement SharedData methods
25 Controller::SharedData::SharedData() :
28 LoggerView* v = new LoggerView();
29 allViews.push_back(v);
32 Controller::SharedData::~SharedData()
34 for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
40 Controller::SharedData* Controller::_instance = 0;
42 void Controller::delete_all_instances()
52 void Controller::register_view(View* v)
56 _instance = new SharedData();
59 _instance->allViews.push_back(v);
62 void Controller::unregister_view(View* v)
69 view_set_t::iterator it = std::find(_instance->allViews.begin(), _instance->allViews.end(), v);
70 if (it != _instance->allViews.end())
72 _instance->allViews.erase(it);
76 Controller::Controller()
80 _instance = new SharedData();
84 Controller::Controller(const Controller& c)
86 // _instance is already initialized
88 // silent unused parameter warnings
92 Controller::~Controller()
96 ScicosID Controller::createObject(kind_t k)
98 ScicosID id = _instance->model.createObject(k);
100 for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
102 (*iter)->objectCreated(id, k);
108 static void unlink_vector(Controller& controller, ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop)
111 controller.getObjectProperty(uid, k, uid_prop, v);
114 model::BaseObject* o = controller.getObject(v);
116 std::vector<ScicosID> children;
117 controller.getObjectProperty(o->id(), o->kind(), ref_prop, children);
119 std::vector<ScicosID>::iterator it = std::find(children.begin(), children.end(), uid);
120 if (it != children.end())
125 controller.setObjectProperty(o->id(), o->kind(), ref_prop, children);
129 static void unlink(Controller& controller, ScicosID uid, kind_t k, object_properties_t uid_prop, object_properties_t ref_prop)
132 controller.getObjectProperty(uid, k, uid_prop, v);
135 model::BaseObject* o = controller.getObject(v);
136 controller.setObjectProperty(o->id(), o->kind(), ref_prop, 0);
140 void Controller::deleteObject(ScicosID uid)
142 // disconnect / remove references first
143 model::BaseObject* initial = getObject(uid);
144 const kind_t k = initial->kind();
147 unlink_vector(*this, uid, k, PARENT_DIAGRAM, CHILDREN);
148 // RELATED_TO is not referenced back
152 unlink_vector(*this, uid, k, PARENT_DIAGRAM, CHILDREN);
153 // INPUTS will be removed on delete
154 // OUTPUTS will be removed on delete
155 // EVENT_INPUTS will be removed on delete
156 // EVENT_OUTPUTS will be removed on delete
157 unlink_vector(*this, uid, k, PARENT_BLOCK, CHILDREN);
158 // CHILDREN will be removed on delete
159 // FIXME what about REFERENCED_PORT ?
161 else if (k == DIAGRAM)
163 // CHILDREN will be removed on delete
167 unlink_vector(*this, uid, k, PARENT_DIAGRAM, CHILDREN);
168 unlink_vector(*this, uid, k, SOURCE_PORT, CONNECTED_SIGNALS);
169 unlink_vector(*this, uid, k, DESTINATION_PORT, CONNECTED_SIGNALS);
173 unlink(*this, uid, k, SOURCE_BLOCK, INPUTS);
174 unlink(*this, uid, k, SOURCE_BLOCK, OUTPUTS);
175 unlink(*this, uid, k, SOURCE_BLOCK, EVENT_INPUTS);
176 unlink(*this, uid, k, SOURCE_BLOCK, EVENT_OUTPUTS);
178 unlink(*this, uid, k, CONNECTED_SIGNALS, SOURCE_PORT);
179 unlink(*this, uid, k, CONNECTED_SIGNALS, DESTINATION_PORT);
183 _instance->model.deleteObject(uid);
185 for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
187 (*iter)->objectDeleted(uid);
191 ScicosID Controller::cloneObject(std::map<ScicosID, ScicosID>& mapped, ScicosID uid)
193 model::BaseObject* initial = getObject(uid);
194 const kind_t k = initial->kind();
195 ScicosID o = createObject(k);
196 mapped.insert(std::make_pair(uid, o));
198 // Get then set all properties per type that do not manage ScicosID
199 cloneProperties<double>(initial, o);
200 cloneProperties<int>(initial, o);
201 cloneProperties<bool>(initial, o);
202 cloneProperties<std::string>(initial, o);
203 cloneProperties<std::vector<double> >(initial, o);
204 cloneProperties<std::vector<int> >(initial, o);
205 cloneProperties<std::vector<std::string> >(initial, o);
207 // deep copy children, manage ScicosID and std::vector<ScicosID>
210 deepClone(mapped, uid, o, k, PARENT_DIAGRAM, false);
211 deepClone(mapped, uid, o, k, RELATED_TO, true);
215 deepClone(mapped, uid, o, k, PARENT_DIAGRAM, false);
216 deepCloneVector(mapped, uid, o, k, INPUTS, true);
217 deepCloneVector(mapped, uid, o, k, OUTPUTS, true);
218 deepCloneVector(mapped, uid, o, k, EVENT_INPUTS, true);
219 deepCloneVector(mapped, uid, o, k, EVENT_OUTPUTS, true);
220 deepClone(mapped, uid, o, k, PARENT_BLOCK, false);
221 deepCloneVector(mapped, uid, o, k, CHILDREN, true);
222 // FIXME what about REFERENCED_PORT ?
224 else if (k == DIAGRAM)
226 deepCloneVector(mapped, uid, o, k, CHILDREN, true);
230 deepClone(mapped, uid, o, k, PARENT_DIAGRAM, false);
231 deepClone(mapped, uid, o, k, SOURCE_PORT, true);
232 deepClone(mapped, uid, o, k, DESTINATION_PORT, true);
236 deepClone(mapped, uid, o, k, SOURCE_BLOCK, true);
237 deepCloneVector(mapped, uid, o, k, CONNECTED_SIGNALS, true);
243 void Controller::deepClone(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound)
246 getObjectProperty(uid, k, p, v);
250 std::map<ScicosID, ScicosID>::iterator it = mapped.find(v);
251 if (it != mapped.end())
261 cloned = cloneObject(mapped, v);
274 setObjectProperty(clone, k, p, cloned);
277 void Controller::deepCloneVector(std::map<ScicosID, ScicosID>& mapped, ScicosID uid, ScicosID clone, kind_t k, object_properties_t p, bool cloneIfNotFound)
279 std::vector<ScicosID> v;
280 getObjectProperty(uid, k, p, v);
282 std::vector<ScicosID> cloned;
283 cloned.reserve(v.size());
285 for (const ScicosID& id : v)
288 std::map<ScicosID, ScicosID>::iterator it = mapped.find(id);
289 if (it != mapped.end())
291 cloned.push_back(it->second);
299 cloned.push_back(cloneObject(mapped, id));
313 setObjectProperty(clone, k, p, cloned);
316 ScicosID Controller::cloneObject(ScicosID uid)
318 std::map<ScicosID, ScicosID> mapped;
319 return cloneObject(mapped, uid);
322 model::BaseObject* Controller::getObject(ScicosID uid)
324 return _instance->model.getObject(uid);
327 update_status_t Controller::setObject(model::BaseObject* o)
329 update_status_t status = _instance->model.setObject(o);
331 if (status == SUCCESS)
333 for (view_set_t::iterator iter = _instance->allViews.begin(); iter != _instance->allViews.end(); ++iter)
335 (*iter)->objectUpdated(o->id(), o->kind());
341 } /* namespace org_scilab_modules_scicos */