Xcos MVC: implement from / to
[scilab.git] / scilab / modules / scicos / src / cpp / model / Port.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 PORT_HXX_
14 #define PORT_HXX_
15
16 #include <string>
17 #include <vector>
18
19 #include "Model.hxx"
20 #include "model/BaseObject.hxx"
21
22 namespace org_scilab_modules_scicos
23 {
24 namespace model
25 {
26
27 enum portKind
28 {
29     UNDEF, IN, OUT, EIN, EOUT
30 };
31
32 class Port: public BaseObject
33 {
34     friend class ::org_scilab_modules_scicos::Model;
35
36 private:
37     Port() : BaseObject(PORT), dataType(0), sourceBlock(0), kind(UNDEF), implicit(false),
38         style(), label(), connectedSignals(std::vector<ScicosID> (1, 0)) {};
39     Port(const Port& o) : BaseObject(PORT), dataType(o.dataType), sourceBlock(o.sourceBlock), kind(o.kind), implicit(o.implicit),
40         style(o.style), label(o.label), connectedSignals(o.connectedSignals) {};
41     ~Port() {};
42
43     const std::vector<ScicosID>& getConnectedSignals() const
44     {
45         return connectedSignals;
46     }
47
48     update_status_t setConnectedSignals(const std::vector<ScicosID>& connectedSignals)
49     {
50         if (this->connectedSignals == connectedSignals)
51         {
52             return NO_CHANGES;
53         }
54
55         this->connectedSignals = connectedSignals;
56         return SUCCESS;
57     }
58
59     void getDataType(std::vector<int>& v) const
60     {
61         if (dataType == 0)
62         {
63             v.resize(3, 0);
64         }
65         else
66         {
67             v.resize(3);
68             v[0] = dataType->rows;
69             v[1] = dataType->columns;
70             v[2] = dataType->datatype_id;
71         }
72     }
73
74     update_status_t setDataType(Model* model, const std::vector<int>& v)
75     {
76         if (v.size() != 3)
77         {
78             return FAIL;
79         }
80
81         model::Datatype datatype = model::Datatype(v);
82         if (this->dataType != 0 && *this->dataType == datatype)
83         {
84             return NO_CHANGES;
85         }
86
87         this->dataType = model->flyweight(datatype);
88         return SUCCESS;
89     }
90
91     void getKind(int& k) const
92     {
93         k = kind;
94     }
95
96     update_status_t setKind(int k)
97     {
98         if (k < UNDEF || k > EOUT)
99         {
100             return FAIL;
101         }
102
103         if (k == kind)
104         {
105             return NO_CHANGES;
106         }
107
108         kind = static_cast<portKind>(k);
109         return SUCCESS;
110     }
111
112     void getSourceBlock(ScicosID& sb) const
113     {
114         sb = sourceBlock;
115     }
116
117     update_status_t setSourceBlock(const ScicosID sb)
118     {
119         if (sb == this->sourceBlock)
120         {
121             return NO_CHANGES;
122         }
123         this->sourceBlock = sb;
124         return SUCCESS;
125     }
126
127     void getImplicit(bool& v) const
128     {
129         v = implicit;
130     }
131
132     update_status_t setImplicit(bool implicit)
133     {
134         if (implicit == this->implicit)
135         {
136             return NO_CHANGES;
137         }
138         this->implicit = implicit;
139         return SUCCESS;
140     }
141
142     void getStyle(std::string& s) const
143     {
144         s = style;
145     }
146
147     update_status_t setStyle(const std::string& style)
148     {
149         if (style == this->style)
150         {
151             return NO_CHANGES;
152         }
153         this->style = style;
154         return SUCCESS;
155     }
156
157     void getLabel(std::string& l) const
158     {
159         l = style;
160     }
161
162     update_status_t setLabel(const std::string& label)
163     {
164         if (label == this->label)
165         {
166             return NO_CHANGES;
167         }
168         this->label = label;
169         return SUCCESS;
170     }
171
172     void getFiring(double& f) const
173     {
174         f = firing;
175     }
176
177     update_status_t setFiring(double firing)
178     {
179         if (firing == this->firing)
180         {
181             return NO_CHANGES;
182         }
183         this->firing = firing;
184         return SUCCESS;
185     }
186
187 private:
188     Datatype* dataType;
189     ScicosID sourceBlock;
190     portKind kind;
191     bool implicit;
192     std::string style;
193     std::string label;
194     double firing;
195
196     std::vector<ScicosID> connectedSignals;
197 };
198
199 } /* namespace model */
200 } /* namespace org_scilab_modules_scicos */
201
202 #endif /* PORT_HXX_ */