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