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