* Bug #13794 fixed - Datatips display mode
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_datatip_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Pedro Arthur dos S. Souza
4  * Copyright (C) 2012 - Caio Lucas dos S. Souza
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 #include "setHandleProperty.h"
18 #include "SetProperty.h"
19 #include "getPropertyAssignedValue.h"
20 #include "Scierror.h"
21 #include "localization.h"
22 #include "SetPropertyStatus.h"
23
24 #include "setGraphicObjectProperty.h"
25 #include "graphicObjectProperties.h"
26
27 /**
28  * Sets the datatip oriantation.
29  */
30 int set_tip_orientation_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
31 {
32     BOOL status = FALSE;
33     int tip_orientation;
34
35     if ( !( valueType == sci_matrix ) )
36     {
37         Scierror(999, _("Wrong type for '%s' property: Integer expected.\n"), "orientation");
38         return SET_PROPERTY_ERROR;
39     }
40
41     tip_orientation = (int)((double*)_pvData)[0];
42
43     status = setGraphicObjectProperty(iObj, __GO_DATATIP_ORIENTATION__, &tip_orientation, jni_int, 1);
44
45     if (status == TRUE)
46     {
47         int auto_orientation = 0;
48         setGraphicObjectProperty(iObj, __GO_DATATIP_AUTOORIENTATION__, &auto_orientation, jni_bool, 1);
49         return SET_PROPERTY_SUCCEED;
50     }
51     else
52     {
53         Scierror(999, _("'%s' property does not exist for this handle.\n"), "orientation");
54         return SET_PROPERTY_ERROR;
55     }
56 }
57
58 /**
59  * Old z_componet property, warns the user
60  */
61 int set_tip_z_component_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
62 {
63     char * tip_display_components;
64     getGraphicObjectProperty(iObj, __GO_DATATIP_DISPLAY_COMPONENTS__, jni_string, (void **)&tip_display_components);
65
66     //Only warns if the property exists for the object.
67     if (tip_display_components == NULL)
68     {
69         Scierror(999, _("'%s' property does not exist for this handle.\n"), "z_component");
70     }
71     else
72     {
73         Scierror(999, _("'%s' property is obsolete and will be removed, use '%s' instead.\n"), "z_component", "display_components");
74     }
75
76     return NULL;
77 }
78
79 /**
80  * Set display mode for datatips
81  */
82 int set_datatip_display_mode_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
83 {
84     BOOL status = FALSE;
85     const char * value = (const char*) _pvData;
86     int datatip_display_mode = -1;
87     if (strcmp(value, "always") == 0)
88     {
89         datatip_display_mode = 0;
90     }
91     else if (strcmp(value, "mouseclick") == 0)
92     {
93         datatip_display_mode = 1;
94     }
95     else if (strcmp(value, "mouseover") == 0)
96     {
97         datatip_display_mode = 2;
98     }
99
100     if (datatip_display_mode >= 0)
101     {
102         status = setGraphicObjectProperty(iObj, __GO_DATATIP_DISPLAY_MODE__, &datatip_display_mode, jni_int, 1);
103         if (status == TRUE)
104         {
105             return SET_PROPERTY_SUCCEED;
106         }
107     }
108     else
109     {
110         int type;
111         int *piType = &type;
112         getGraphicObjectProperty(iObj, __GO_TYPE__, jni_int, (void **)&piType);
113         if (type == __GO_POLYLINE__)
114         {
115             Scierror(999, _("Inavlid value for '%s' property, use 'always', 'mouseclick' or 'mouseover'.\n"), "datatip_display_mode");
116         }
117         else
118         {
119             Scierror(999, _("'%s' property does not exist for this handle.\n"), "datatip_display_mode");
120         }
121         return SET_PROPERTY_ERROR;
122     }
123 }
124
125 /**
126  * Set which coordinate components should be displayed
127  */
128 int set_tip_display_components_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
129 {
130     BOOL status = FALSE;
131     const char * value = (const char*) _pvData;
132
133     int isXSet = 0;
134     int isYSet = 0;
135     int isZSet = 0;
136     //check if the value is valid and throws properly error msg
137     int i;
138
139     if (valueType != sci_strings)
140     {
141         Scierror(999, _("Wrong type for '%s' property: String expected.\n"), "display_components");
142         return SET_PROPERTY_ERROR;
143     }
144
145     for (i = 0; i < 4; ++i)
146     {
147         if (value[i] == '\0')
148         {
149             if (i == 0)
150             {
151                 Scierror(999, _("Wrong value for '%s' property: Non-empty string expected.\n"), "display_components");
152                 return SET_PROPERTY_ERROR;
153             }
154             else
155             {
156                 break;
157             }
158         }
159         else
160         {
161             if (i == 3)
162             {
163                 Scierror(999, _("Wrong value for '%s' property: String with length 3 or less expected.\n"), "display_components");
164                 return SET_PROPERTY_ERROR;
165             }
166             switch (value[i])
167             {
168                 case 'x':
169                 case 'X':
170                     if (isXSet)
171                     {
172                         Scierror(999, _("Wrong value for '%s' property: String contains 'x' component more than once.\n"), "display_components");
173                         return SET_PROPERTY_ERROR;
174                     }
175                     isXSet++;
176                     break;
177                 case 'y':
178                 case 'Y':
179                     if (isYSet)
180                     {
181                         Scierror(999, _("Wrong value for '%s' property: String contains 'y' component more than once.\n"), "display_components");
182                         return SET_PROPERTY_ERROR;
183                     }
184                     isYSet++;
185                     break;
186                 case 'z':
187                 case 'Z':
188                     if (isZSet)
189                     {
190                         Scierror(999, _("Wrong value for '%s' property: String contains 'z' component more than once.\n"), "display_components");
191                         return SET_PROPERTY_ERROR;
192                     }
193                     isZSet++;
194                     break;
195                 default:
196                     Scierror(999, _("Wrong value for '%s' property: String with 'x|y|z' expected.\n"), "display_components");
197                     return SET_PROPERTY_ERROR;
198             }
199         }
200     }
201
202     status = setGraphicObjectProperty(iObj, __GO_DATATIP_DISPLAY_COMPONENTS__, value, jni_string, 1);
203     if (status == TRUE)
204     {
205         return SET_PROPERTY_SUCCEED;
206     }
207     else
208     {
209         Scierror(999, _("'%s' property does not exist for this handle.\n"), "display_components");
210         return SET_PROPERTY_ERROR;
211     }
212 }
213
214
215 /**
216  * Enable/disable the datatip auto-orientation.
217  */
218 int set_tip_auto_orientation_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
219 {
220     BOOL status = FALSE;
221     int auto_orientation = tryGetBooleanValueFromStack(_pvData, valueType, nbRow, nbCol, "auto_orientation");
222     if (auto_orientation == NOT_A_BOOLEAN_VALUE)
223     {
224         return SET_PROPERTY_ERROR;
225     }
226     status = setGraphicObjectProperty(iObj, __GO_DATATIP_AUTOORIENTATION__, &auto_orientation, jni_bool, 1);
227
228     if (status == TRUE)
229     {
230         return SET_PROPERTY_SUCCEED;
231     }
232     else
233     {
234         Scierror(999, _("'%s' property does not exist for this handle.\n"), "auto_orientation");
235         return SET_PROPERTY_ERROR;
236     }
237 }
238
239
240 /**
241  * Set the datatip interpolation mode (on/off).
242  */
243 int set_tip_interp_mode_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
244 {
245     BOOL status = FALSE;
246     int interp_mode = tryGetBooleanValueFromStack(_pvData, valueType, nbRow, nbCol, "interp_mode");
247     if (interp_mode == NOT_A_BOOLEAN_VALUE)
248     {
249         return SET_PROPERTY_ERROR;
250     }
251     status = setGraphicObjectProperty(iObj, __GO_DATATIP_INTERP_MODE__, &interp_mode, jni_bool, 1);
252
253     if (status == TRUE)
254     {
255         return SET_PROPERTY_SUCCEED;
256     }
257     else
258     {
259         Scierror(999, _("'%s' property does not exist for this handle.\n"), "interp_mode");
260         return SET_PROPERTY_ERROR;
261     }
262 }
263
264 /**
265  * Set the datatip box mode (true or false).
266  */
267 int set_tip_box_mode_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
268 {
269     BOOL status = FALSE;
270     int box_mode = tryGetBooleanValueFromStack(_pvData, valueType, nbRow, nbCol, "box_mode");
271     if (box_mode == NOT_A_BOOLEAN_VALUE)
272     {
273         return SET_PROPERTY_ERROR;
274     }
275     status = setGraphicObjectProperty(iObj, __GO_DATATIP_BOX_MODE__, &box_mode, jni_bool, 1);
276
277     if (status == TRUE)
278     {
279         return SET_PROPERTY_SUCCEED;
280     }
281     else
282     {
283         Scierror(999, _("'%s' property does not exist for this handle.\n"), "box_mode");
284         return SET_PROPERTY_ERROR;
285     }
286 }
287
288 /**
289  * Set the datatip label mode (true or false).
290  */
291 int set_tip_label_mode_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
292 {
293     BOOL status = FALSE;
294     int label_mode = tryGetBooleanValueFromStack(_pvData, valueType, nbRow, nbCol, "label_mode");
295     if (label_mode == NOT_A_BOOLEAN_VALUE)
296     {
297         return SET_PROPERTY_ERROR;
298     }
299     status = setGraphicObjectProperty(iObj, __GO_DATATIP_LABEL_MODE__, &label_mode, jni_bool, 1);
300
301     if (status == TRUE)
302     {
303         return SET_PROPERTY_SUCCEED;
304     }
305     else
306     {
307         Scierror(999, _("'%s' property does not exist for this handle.\n"), "label_mode");
308         return SET_PROPERTY_ERROR;
309     }
310 }
311
312
313 int set_tip_disp_function_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
314 {
315     BOOL status = FALSE;
316     if (valueType != sci_strings)
317     {
318         Scierror(999, _("Wrong type for '%s' property: String expected.\n"), "display_function");
319         return SET_PROPERTY_ERROR;
320     }
321
322     status = setGraphicObjectProperty(iObj, __GO_DATATIP_DISPLAY_FNC__, _pvData, jni_string, 1);
323
324     if (status == TRUE)
325     {
326         return SET_PROPERTY_SUCCEED;
327     }
328     else
329     {
330         Scierror(999, _("'%s' property does not exist for this handle.\n"), "display_function");
331         return SET_PROPERTY_ERROR;
332     }
333 }
334
335 int set_tip_detached_property(void* _pvCtx, int iObj, void* _pvData, int valueType, int nbRow, int nbCol)
336 {
337     BOOL status = FALSE;
338     int isDetached = nbRow * nbCol != 0;
339     double* detached_position = NULL;
340     if (valueType != sci_matrix)
341     {
342         Scierror(999, _("Wrong type for '%s' property: Matrix expected.\n"), "detached_position");
343         return SET_PROPERTY_ERROR;
344     }
345
346
347     if (nbRow * nbCol != 3 && isDetached)
348     {
349         Scierror(999, _("Wrong size for '%s' property: Matrix with length 3 or [] expected.\n"), "detached_position");
350         return SET_PROPERTY_ERROR;
351     }
352     status = setGraphicObjectProperty(iObj, __GO_DATATIP_DETACHED_MODE__, &isDetached, jni_bool, 1);
353     if (isDetached)
354     {
355         status = setGraphicObjectProperty(iObj, __GO_DATATIP_DETACHED_POSITION__, _pvData, jni_double_vector, 3);
356     }
357
358     if (status == TRUE)
359     {
360         return SET_PROPERTY_SUCCEED;
361     }
362     else
363     {
364         Scierror(999, _("'%s' property does not exist for this handle.\n"), "detached_position");
365         return SET_PROPERTY_ERROR;
366     }
367 }