* Bug #14659 fixed: number of I/O ports of the superblock was not updated when adding...
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / graph / model / XcosGraphModel.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011-2017 - 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 package org.scilab.modules.xcos.graph.model;
16
17 import com.mxgraph.model.mxCell;
18 import com.mxgraph.model.mxGraphModel;
19 import java.rmi.server.UID;
20 import org.scilab.modules.xcos.JavaController;
21 import org.scilab.modules.xcos.Kind;
22 import org.scilab.modules.xcos.ObjectProperties;
23 import org.scilab.modules.xcos.VectorOfBool;
24 import org.scilab.modules.xcos.VectorOfDouble;
25 import org.scilab.modules.xcos.VectorOfInt;
26 import org.scilab.modules.xcos.VectorOfScicosID;
27 import org.scilab.modules.xcos.VectorOfString;
28 import org.scilab.modules.xcos.block.BasicBlock;
29
30 /**
31  * Implement a custom model for Xcos
32  */
33 public class XcosGraphModel extends mxGraphModel {
34
35     public XcosGraphModel(JavaController controller, long diagramId, Kind kind, String uid) {
36         super(new mxCell());
37
38         XcosCell parent = new XcosCell(controller, diagramId, kind, null, null, null, uid);
39         ((mxCell) root).insert(parent);
40     }
41
42     @Override
43     public final String createId(Object cell) {
44         return new UID().toString();
45     }
46
47     /**
48      * Common property change support for a generic type
49      *
50      * @param <T> the type
51      */
52     private static abstract class PropertyChange<T> extends mxAtomicGraphModelChange {
53
54         private final long uid;
55         private final ObjectProperties key;
56
57         private T previous;
58
59         public PropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, T value) {
60             super(model);
61
62             this.uid = cell.getUID();
63             this.key = key;
64             this.previous = value;
65         }
66
67         protected abstract T getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p);
68
69         protected abstract void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, T value);
70
71         @Override
72         public void execute() {
73             JavaController controller = new JavaController();
74
75             T temp = getProperty(controller, uid, Kind.BLOCK, key);
76             setProperty(controller, uid, Kind.LINK, key, previous);
77             previous = temp;
78         }
79     }
80
81     /**
82      * Set a block property
83      *
84      * @param cell the block
85      * @param key the property
86      * @param value the value to assign
87      */
88     public void setProperty(BasicBlock cell, ObjectProperties key, double[] value) {
89         execute(new DoublePropertyChange(this, cell, key, value));
90     }
91
92     private static final class DoublePropertyChange extends PropertyChange<double[]> {
93
94         public DoublePropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, double[] value) {
95             super(model, cell, key, value);
96         }
97
98         @Override
99         protected double[] getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
100             double[] v = {0};
101             controller.getObjectProperty(uid, kind, p, v);
102             return v;
103         }
104
105         @Override
106         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, double[] value) {
107             controller.setObjectProperty(uid, kind, p, value[0]);
108         }
109     }
110
111     /**
112      * Set a block property
113      *
114      * @param cell the block
115      * @param key the property
116      * @param value the value to assign
117      */
118     public void setProperty(BasicBlock cell, ObjectProperties key, int[] value) {
119         execute(new IntPropertyChange(this, cell, key, value));
120     }
121
122     private static class IntPropertyChange extends PropertyChange<int[]> {
123
124         public IntPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, int[] value) {
125             super(model, cell, key, value);
126         }
127
128         @Override
129         protected int[] getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
130             int[] v = {0};
131             controller.getObjectProperty(uid, kind, p, v);
132             return v;
133         }
134
135         @Override
136         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, int[] value) {
137             controller.setObjectProperty(uid, kind, p, value[0]);
138         }
139     }
140
141     /**
142      * Set a block property
143      *
144      * @param cell the block
145      * @param key the property
146      * @param value the value to assign
147      */
148     public void setProperty(BasicBlock cell, ObjectProperties key, boolean[] value) {
149         execute(new BoolPropertyChange(this, cell, key, value));
150     }
151
152     private static class BoolPropertyChange extends PropertyChange<boolean[]> {
153
154         public BoolPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, boolean[] value) {
155             super(model, cell, key, value);
156         }
157
158         @Override
159         protected boolean[] getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
160             boolean[] v = {false};
161             controller.getObjectProperty(uid, kind, p, v);
162             return v;
163         }
164
165         @Override
166         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, boolean[] value) {
167             controller.setObjectProperty(uid, kind, p, value[0]);
168         }
169     }
170
171     /**
172      * Set a block property
173      *
174      * @param cell the block
175      * @param key the property
176      * @param value the value to assign
177      */
178     public void setProperty(BasicBlock cell, ObjectProperties key, String[] value) {
179         execute(new StringPropertyChange(this, cell, key, value));
180     }
181
182     private static class StringPropertyChange extends PropertyChange<String[]> {
183
184         public StringPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, String[] value) {
185             super(model, cell, key, value);
186         }
187
188         @Override
189         protected String[] getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
190             String[] v = {""};
191             controller.getObjectProperty(uid, kind, p, v);
192             return v;
193         }
194
195         @Override
196         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, String[] value) {
197             controller.setObjectProperty(uid, kind, p, value[0]);
198         }
199     }
200
201     /**
202      * Set a block property
203      *
204      * @param cell the block
205      * @param key the property
206      * @param value the value to assign
207      */
208     public void setProperty(BasicBlock cell, ObjectProperties key, long[] value) {
209         execute(new LongPropertyChange(this, cell, key, value));
210     }
211
212     private static class LongPropertyChange extends PropertyChange<long[]> {
213
214         public LongPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, long[] value) {
215             super(model, cell, key, value);
216         }
217
218         @Override
219         protected long[] getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
220             long[] v = {0};
221             controller.getObjectProperty(uid, kind, p, v);
222             return v;
223         }
224
225         @Override
226         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, long[] value) {
227             controller.setObjectProperty(uid, kind, p, value[0]);
228         }
229     }
230
231     /**
232      * Set a block property
233      *
234      * @param cell the block
235      * @param key the property
236      * @param value the value to assign
237      */
238     public void setProperty(BasicBlock cell, ObjectProperties key, VectorOfDouble value) {
239         execute(new VectorOfDoublePropertyChange(this, cell, key, value));
240     }
241
242     private static class VectorOfDoublePropertyChange extends PropertyChange<VectorOfDouble> {
243
244         public VectorOfDoublePropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, VectorOfDouble value) {
245             super(model, cell, key, value);
246         }
247
248         @Override
249         protected VectorOfDouble getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
250             VectorOfDouble v = new VectorOfDouble();
251             controller.getObjectProperty(uid, kind, p, v);
252             return v;
253         }
254
255         @Override
256         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, VectorOfDouble value) {
257             controller.setObjectProperty(uid, kind, p, value);
258         }
259     }
260
261     /**
262      * Set a block property
263      *
264      * @param cell the block
265      * @param key the property
266      * @param value the value to assign
267      */
268     public void setProperty(BasicBlock cell, ObjectProperties key, VectorOfInt value) {
269         execute(new VectorOfIntPropertyChange(this, cell, key, value));
270     }
271
272     private static class VectorOfIntPropertyChange extends PropertyChange<VectorOfInt> {
273
274         public VectorOfIntPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, VectorOfInt value) {
275             super(model, cell, key, value);
276         }
277
278         @Override
279         protected VectorOfInt getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
280             VectorOfInt v = new VectorOfInt();
281             controller.getObjectProperty(uid, kind, p, v);
282             return v;
283         }
284
285         @Override
286         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, VectorOfInt value) {
287             controller.setObjectProperty(uid, kind, p, value);
288         }
289     }
290
291     /**
292      * Set a block property
293      *
294      * @param cell the block
295      * @param key the property
296      * @param value the value to assign
297      */
298     public void setProperty(BasicBlock cell, ObjectProperties key, VectorOfBool value) {
299         execute(new VectorOfBoolPropertyChange(this, cell, key, value));
300     }
301
302     private static class VectorOfBoolPropertyChange extends PropertyChange<VectorOfBool> {
303
304         public VectorOfBoolPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, VectorOfBool value) {
305             super(model, cell, key, value);
306         }
307
308         @Override
309         protected VectorOfBool getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
310             VectorOfBool v = new VectorOfBool();
311             controller.getObjectProperty(uid, kind, p, v);
312             return v;
313         }
314
315         @Override
316         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, VectorOfBool value) {
317             controller.setObjectProperty(uid, kind, p, value);
318         }
319     }
320
321     /**
322      * Set a block property
323      *
324      * @param cell the block
325      * @param key the property
326      * @param value the value to assign
327      */
328     public void setProperty(BasicBlock cell, ObjectProperties key, VectorOfString value) {
329         execute(new VectorOfStringPropertyChange(this, cell, key, value));
330     }
331
332     private static class VectorOfStringPropertyChange extends PropertyChange<VectorOfString> {
333
334         public VectorOfStringPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, VectorOfString value) {
335             super(model, cell, key, value);
336         }
337
338         @Override
339         protected VectorOfString getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
340             VectorOfString v = new VectorOfString();
341             controller.getObjectProperty(uid, kind, p, v);
342             return v;
343         }
344
345         @Override
346         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, VectorOfString value) {
347             controller.setObjectProperty(uid, kind, p, value);
348         }
349     }
350
351     /**
352      * Set a block property
353      *
354      * @param cell the block
355      * @param key the property
356      * @param value the value to assign
357      */
358     public void setProperty(BasicBlock cell, ObjectProperties key, VectorOfScicosID value) {
359         execute(new VectorOfScicosIDPropertyChange(this, cell, key, value));
360     }
361
362     private static class VectorOfScicosIDPropertyChange extends PropertyChange<VectorOfScicosID> {
363
364         public VectorOfScicosIDPropertyChange(XcosGraphModel model, BasicBlock cell, ObjectProperties key, VectorOfScicosID value) {
365             super(model, cell, key, value);
366         }
367
368         @Override
369         protected VectorOfScicosID getProperty(JavaController controller, long uid, Kind kind, ObjectProperties p) {
370             VectorOfScicosID v = new VectorOfScicosID();
371             controller.getObjectProperty(uid, kind, p, v);
372             return v;
373         }
374
375         @Override
376         protected void setProperty(JavaController controller, long uid, Kind kind, ObjectProperties p, VectorOfScicosID value) {
377
378             // move the children to the parent
379             if (ObjectProperties.CHILDREN == p) {
380                 final int size = value.size();
381                 for (int i = 0; i < size; i++) {
382                     long child = value.get(i);
383                     controller.referenceObject(child);
384                     controller.setObjectProperty(child, controller.getKind(child), ObjectProperties.PARENT_BLOCK, uid);
385                 }
386             }
387
388             controller.setObjectProperty(uid, kind, p, value);
389         }
390     }
391 }