81d83ce48ddde4f1ab685b6dd7b434d7489571de
[scilab.git] / scilab / modules / graphic_objects / src / java / org / scilab / modules / graphic_objects / polyline / Polyline.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Manuel JULIACHS
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
16 package org.scilab.modules.graphic_objects.polyline;
17
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_ARROW_SIZE_FACTOR__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_BAR_WIDTH__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CLOSED__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATATIPS_COUNT__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATATIPS__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATATIP_DISPLAY_FNC__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_DATATIP_MARK__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_INTERP_COLOR_MODE__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_INTERP_COLOR_VECTOR_SET__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_INTERP_COLOR_VECTOR__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POLYLINE_STYLE__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_X_SHIFT__;
30 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_Y_SHIFT__;
31 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_Z_SHIFT__;
32 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_COLOR_SET__;
33
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.LinkedList;
37 import java.util.List;
38
39 import org.scilab.modules.graphic_objects.ObjectRemovedException;
40 import org.scilab.modules.graphic_objects.contouredObject.ClippableContouredObject;
41 import org.scilab.modules.graphic_objects.datatip.Datatip;
42 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
43 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
44 import org.scilab.modules.graphic_objects.graphicObject.Visitor;
45
46 /**
47  * Polyline class
48  * @author Manuel JULIACHS
49  */
50 public class Polyline extends ClippableContouredObject {
51     /** TBD: data */
52     // Data data -> Data Model
53     /* TODO: properties relative to the data model */
54     /** Polyline properties names */
55     private enum PolylineProperty { CLOSED, ARROWSIZEFACTOR, POLYLINESTYLE,
56                                     INTERPCOLORVECTOR, INTERPCOLORVECTORSET, INTERPCOLORMODE,
57                                     XSHIFT, YSHIFT, ZSHIFT, BARWIDTH, DATATIPS, DATATIPSCOUNT,
58                                     TIP_DISPLAY_FNC, TIP_MARK, COLORSET
59                                   };
60
61     /** Specifies whether the polyline is closed */
62     private boolean closed;
63
64     /** Determines the arrow size */
65     private double arrowSizeFactor;
66
67     /** Polyline drawing style (normal, staircase, , etc.) */
68     private int polylineStyle;
69
70     /** Interpolation color vector (3- or 4-element array) */
71     private int[] interpColorVector;
72
73     /** Specifies whether the interpolation color vector has been set */
74     private boolean interpColorVectorSet;
75
76     /** Specifies whether interpolated shading is used */
77     private boolean interpColorMode;
78
79     /** Shift applied to the line points along the x-axis */
80     private double[] xShift;
81
82     /** Shift applied to the line points along the y-axis */
83     private double[] yShift;
84
85     /** Shift applied to the line points along the z-axis */
86     private double[] zShift;
87
88     /** Bar width */
89     private double barWidth;
90
91     /** Datatips objects list */
92     private List<Integer> datatips;
93
94     /** Display function*/
95     private String displayFnc;
96
97     private Integer tipMark;
98
99     /** has color set */
100     private boolean colorSet;
101
102     /** Constructor */
103     public Polyline() {
104         super();
105         closed = false;
106         arrowSizeFactor = 1.0;
107         polylineStyle = 1;
108         interpColorVector = new int[4];
109         interpColorVectorSet = false;
110         interpColorMode = false;
111         xShift = null;
112         yShift = null;
113         zShift = null;
114         barWidth = 0.0;
115         datatips = new ArrayList<Integer>();
116         displayFnc = "";
117         tipMark = 11;
118         colorSet = false;
119     }
120
121     @Override
122     public void accept(Visitor visitor) throws ObjectRemovedException {
123         visitor.visit(this);
124     }
125
126     /**
127      * Returns the enum associated to a property name
128      * @param propertyName the property name
129      * @return the property enum
130      */
131     public Object getPropertyFromName(int propertyName) {
132         switch (propertyName) {
133             case __GO_CLOSED__ :
134                 return PolylineProperty.CLOSED;
135             case __GO_ARROW_SIZE_FACTOR__ :
136                 return PolylineProperty.ARROWSIZEFACTOR;
137             case __GO_POLYLINE_STYLE__ :
138                 return PolylineProperty.POLYLINESTYLE;
139             case __GO_INTERP_COLOR_VECTOR__ :
140                 return PolylineProperty.INTERPCOLORVECTOR;
141             case __GO_INTERP_COLOR_VECTOR_SET__ :
142                 return PolylineProperty.INTERPCOLORVECTORSET;
143             case __GO_INTERP_COLOR_MODE__ :
144                 return PolylineProperty.INTERPCOLORMODE;
145             case __GO_X_SHIFT__ :
146                 return PolylineProperty.XSHIFT;
147             case __GO_Y_SHIFT__ :
148                 return PolylineProperty.YSHIFT;
149             case __GO_Z_SHIFT__ :
150                 return PolylineProperty.ZSHIFT;
151             case __GO_BAR_WIDTH__ :
152                 return PolylineProperty.BARWIDTH;
153             case __GO_DATATIPS__ :
154                 return PolylineProperty.DATATIPS;
155             case __GO_DATATIPS_COUNT__ :
156                 return PolylineProperty.DATATIPSCOUNT;
157             case __GO_DATATIP_DISPLAY_FNC__ :
158                 return PolylineProperty.TIP_DISPLAY_FNC;
159             case __GO_DATATIP_MARK__ :
160                 return PolylineProperty.TIP_MARK;
161             case __GO_COLOR_SET__ :
162                 return PolylineProperty.COLORSET;
163             default :
164                 return super.getPropertyFromName(propertyName);
165         }
166     }
167
168     /**
169      * Fast property get method
170      * @param property the property to get
171      * @return the property value
172      */
173     public Object getProperty(Object property) {
174         if (property instanceof PolylineProperty) {
175             switch ((PolylineProperty) property) {
176                 case CLOSED:
177                     return getClosed();
178                 case ARROWSIZEFACTOR:
179                     return getArrowSizeFactor();
180                 case POLYLINESTYLE:
181                     return getPolylineStyle();
182                 case INTERPCOLORVECTOR:
183                     return getInterpColorVector();
184                 case INTERPCOLORVECTORSET:
185                     return getInterpColorVectorSet();
186                 case INTERPCOLORMODE:
187                     return getInterpColorMode();
188                 case XSHIFT:
189                     return getXShift();
190                 case YSHIFT:
191                     return getYShift();
192                 case ZSHIFT:
193                     return getZShift();
194                 case BARWIDTH:
195                     return getBarWidth();
196                 case DATATIPS:
197                     return getDatatips();
198                 case DATATIPSCOUNT:
199                     return datatips.size();
200                 case TIP_DISPLAY_FNC:
201                     return getDisplayFunction();
202                 case TIP_MARK:
203                     return getTipMark();
204                 case COLORSET:
205                     return getColorSet();
206             }
207         }
208         return super.getProperty(property);
209     }
210
211     /**
212      * Fast property set method
213      * @param property the property to set
214      * @param value the property value
215      * @return true if the property has been set, false otherwise
216      */
217     public UpdateStatus setProperty(Object property, Object value) {
218         synchronized (this) {
219             if (property instanceof PolylineProperty) {
220                 switch ((PolylineProperty) property) {
221                     case CLOSED:
222                         setClosed((Boolean) value);
223                         break;
224                     case ARROWSIZEFACTOR:
225                         return setArrowSizeFactor((Double) value);
226                     case POLYLINESTYLE:
227                         return setPolylineStyle((Integer) value);
228                     case INTERPCOLORVECTOR:
229                         setInterpColorVector((Integer[]) value);
230                         break;
231                     case INTERPCOLORVECTORSET:
232                         setInterpColorVectorSet((Boolean) value);
233                         break;
234                     case INTERPCOLORMODE:
235                         return setInterpColorMode((Boolean) value);
236                     case XSHIFT:
237                         setXShift((double[]) value);
238                         break;
239                     case YSHIFT:
240                         setYShift((double[]) value);
241                         break;
242                     case ZSHIFT:
243                         setZShift((double[]) value);
244                         break;
245                     case BARWIDTH:
246                         setBarWidth((Double) value);
247                         break;
248                     case DATATIPS:
249                         setDatatips((Integer[]) value);
250                         break;
251                     case DATATIPSCOUNT:
252                         // nothing should be done
253                         break;
254                     case TIP_DISPLAY_FNC:
255                         setDisplayFunction((String) value);
256                         break;
257                     case TIP_MARK:
258                         setTipMark((Integer) value);
259                         break;
260                     case COLORSET:
261                         setColorSet((Boolean) value);
262                         break;
263                 }
264             }
265             return super.setProperty(property, value);
266         }
267     }
268
269     /**
270      * @return the arrowSizeFactor
271      */
272     public Double getArrowSizeFactor() {
273         return arrowSizeFactor;
274     }
275
276     /**
277      * @param arrowSizeFactor the arrowSizeFactor to set
278      */
279     public UpdateStatus setArrowSizeFactor(Double arrowSizeFactor) {
280         if (this.arrowSizeFactor == arrowSizeFactor) {
281             return UpdateStatus.NoChange;
282         }
283         this.arrowSizeFactor = arrowSizeFactor;
284         return UpdateStatus.Success;
285     }
286
287     /**
288      * @return the barWidth
289      */
290     public Double getBarWidth() {
291         return barWidth;
292     }
293
294     /**
295      * @param barWidth the barWidth to set
296      */
297     public UpdateStatus setBarWidth(Double barWidth) {
298         this.barWidth = barWidth;
299         return UpdateStatus.Success;
300     }
301
302     /**
303      * @return the closed
304      */
305     public Boolean getClosed() {
306         return closed;
307     }
308
309     /**
310      * @param closed the closed to set
311      */
312     public UpdateStatus setClosed(Boolean closed) {
313         this.closed = closed;
314         return UpdateStatus.Success;
315     }
316
317     /**
318      * @return the interpColorMode
319      */
320     public Boolean getInterpColorMode() {
321         return interpColorMode;
322     }
323
324     /**
325      * @param interpColorMode the interpColorMode to set
326      */
327     public UpdateStatus setInterpColorMode(Boolean interpColorMode) {
328         if (this.interpColorMode == interpColorMode) {
329             return UpdateStatus.NoChange;
330         }
331         this.interpColorMode = interpColorMode;
332         return UpdateStatus.Success;
333     }
334
335     /**
336      * @return the interpColorVector
337      */
338     public Integer[] getInterpColorVector() {
339         Integer[] retVector = new Integer[interpColorVector.length];
340         for (int i = 0; i < interpColorVector.length; i++) {
341             retVector[i] = interpColorVector[i];
342         }
343
344         return retVector;
345     }
346
347     /**
348      * @param interpColorVector the interpColorVector to set
349      */
350     public UpdateStatus setInterpColorVector(Integer[] interpColorVector) {
351         if (interpColorVectorSet == false) {
352             interpColorVectorSet = true;
353         }
354
355         for (int i = 0; i < interpColorVector.length; i++) {
356             this.interpColorVector[i] = interpColorVector[i];
357         }
358         return UpdateStatus.Success;
359     }
360
361     /**
362      * @return the interpColorVectorSet
363      */
364     public Boolean getInterpColorVectorSet() {
365         return interpColorVectorSet;
366     }
367
368     /**
369      * @param interpColorVectorSet the interpColorVectorSet to set
370      */
371     public UpdateStatus setInterpColorVectorSet(Boolean interpColorVectorSet) {
372         this.interpColorVectorSet = interpColorVectorSet;
373         return UpdateStatus.Success;
374     }
375
376     /**
377      * @return the polylineStyle
378      */
379     public Integer getPolylineStyle() {
380         return polylineStyle;
381     }
382
383     /**
384      * @param polylineStyle the polylineStyle to set
385      */
386     public UpdateStatus setPolylineStyle(Integer polylineStyle) {
387         if (this.polylineStyle == polylineStyle) {
388             return UpdateStatus.NoChange;
389         }
390         this.polylineStyle = polylineStyle;
391         return UpdateStatus.Success;
392     }
393
394     /**
395      * @return the xShift
396      */
397     public double[] getXShift() {
398         return xShift;
399     }
400
401     /**
402      * @param shift the xShift to set
403      */
404     public UpdateStatus setXShift(double[] shift) {
405         xShift = shift;
406         return UpdateStatus.Success;
407     }
408
409     /**
410      * @return the yShift
411      */
412     public double[] getYShift() {
413         return yShift;
414     }
415
416     /**
417      * @param shift the yShift to set
418      */
419     public UpdateStatus setYShift(double[] shift) {
420         yShift = shift;
421         return UpdateStatus.Success;
422     }
423
424     /**
425      * @return the zShift
426      */
427     public double[] getZShift() {
428         return zShift;
429     }
430
431     /**
432      * @param shift the zShift to set
433      */
434     public UpdateStatus setZShift(double[] shift) {
435         zShift = shift;
436         return UpdateStatus.Success;
437     }
438
439     /**
440      * @return datatips
441      */
442     public Integer[] getDatatips() {
443         return datatips.toArray(new Integer[datatips.size()]);
444     }
445
446     /**
447      * @param datatips the datatips to set
448      */
449     public UpdateStatus setDatatips(Integer[] datatips) {
450         this.datatips = new LinkedList<Integer>(Arrays.asList(datatips));
451         return UpdateStatus.Success;
452     }
453
454     public String getDisplayFunction() {
455         return displayFnc;
456     }
457
458     public UpdateStatus setDisplayFunction(String fnc) {
459         GraphicController controller =  GraphicController.getController();
460         displayFnc = fnc;
461         //update datatips
462         for (int i = 0 ; i < datatips.size() ; i++) {
463             Datatip tip = (Datatip) controller.getObjectFromId(datatips.get(i));
464             tip.updateText();
465         }
466         return UpdateStatus.Success;
467     }
468
469     public Integer getTipMark() {
470         return tipMark;
471     }
472
473     public UpdateStatus setTipMark(Integer tipMark) {
474         if (!this.tipMark.equals(tipMark)) {
475             this.tipMark = tipMark;
476
477             return UpdateStatus.Success;
478         }
479
480         return UpdateStatus.NoChange;
481     }
482
483     /**
484      * @return the colorSet
485      */
486     public Boolean getColorSet() {
487         return colorSet;
488     }
489
490     /**
491      * @param colorSet the colorSet to set
492      */
493     public UpdateStatus setColorSet(Boolean colorSet) {
494         this.colorSet = colorSet;
495         return UpdateStatus.Success;
496     }
497
498     /**
499      * @return Type as String
500      */
501     public Integer getType() {
502         return GraphicObjectProperties.__GO_POLYLINE__;
503     }
504 }