Stop using some useless helpers.
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_log_flags_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Allan Cornet
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * Copyright (C) 2010 - DIGITEO - Manuel Juliachs
7  *
8  * This file must be used under the terms of the CeCILL.
9  * This source file is licensed as described in the file COPYING, which
10  * you should have received as part of this distribution.  The terms
11  * are also available at
12  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
13  *
14  */
15
16 /*------------------------------------------------------------------------*/
17 /* file: set_log_flags_property.c                                         */
18 /* desc : function to modify in Scilab the log_flags field of             */
19 /*        a handle                                                        */
20 /*------------------------------------------------------------------------*/
21 #ifndef _MSC_VER
22 #define _GNU_SOURCE
23 #endif
24 #include <string.h>
25 #include <math.h>
26 #include "setHandleProperty.h"
27 #include "SetProperty.h"
28 #include "getPropertyAssignedValue.h"
29 #include "SetPropertyStatus.h"
30 #include "GetProperty.h"
31 #include "Scierror.h"
32 #include "sciprint.h"
33 #include "localization.h"
34 #include "MALLOC.h"
35 #include "freeArrayOfString.h"
36
37 #include "getGraphicObjectProperty.h"
38 #include "setGraphicObjectProperty.h"
39 #include "graphicObjectProperties.h"
40
41 /*--------------------------------------------------------------------------*/
42 char ** ReBuildUserTicks( char old_logflag, char new_logflag, double * u_xgrads, int *u_nxgrads, char ** u_xlabels);
43 /*--------------------------------------------------------------------------*/
44 char ** CaseLogflagN2L(int * u_nxgrads, double *u_xgrads, char ** u_xlabels);
45 /*--------------------------------------------------------------------------*/
46 /* Remove negative graduations when switching from N (linear) to L (logarithmic) scale */
47 char ** CaseLogflagN2L(int * u_nxgrads, double *u_xgrads, char ** u_xlabels)
48 {
49     int nbtics = *u_nxgrads;
50     int i = 0;
51     char ** ticklabel = (char **) NULL;
52     int cmpteur = 0, cmpteur2 = 0, offset = 0;
53
54
55     for (i = 0; i < nbtics; i++)
56     {
57         if (u_xgrads[i] <= 0)
58         {
59             sciprint("Warning: graduation number %d is ignored : when switching to logarithmic scale, we must have strictly positive graduations!\n", i);
60         }
61         else
62         {
63             u_xgrads[cmpteur] = log10(u_xgrads[i]);
64             cmpteur++;
65         }
66     }
67
68     if (cmpteur != nbtics)
69     {
70         if ((ticklabel = (char **)MALLOC(cmpteur * sizeof(char *))) == NULL)
71         {
72             Scierror(999, _("%s: No more memory.\n"), "CaseLogflagN");
73             return NULL;
74         }
75
76         cmpteur2 = 0;
77         offset = nbtics - cmpteur;
78         for (i = 0; i < cmpteur; i++)
79         {
80             if ((ticklabel[cmpteur2] = (char *)MALLOC((strlen(u_xlabels[i + offset]) + 1) * sizeof(char ))) == NULL)
81             {
82                 Scierror(999, _("%s: No more memory.\n"), "CaseLogflagN");
83             }
84             strcpy(ticklabel[cmpteur2], u_xlabels[i + offset]);
85             cmpteur2++;
86         }
87
88         freeArrayOfString(u_xlabels, nbtics);
89         u_xlabels = ticklabel;
90     }
91
92     *u_nxgrads = cmpteur;
93     cmpteur = 0;
94     cmpteur2 = 0;
95
96     return u_xlabels;
97 }
98 /*--------------------------------------------------------------------------*/
99 /* Called by a.log_flags='nn','ln','nl', or 'll'*/
100 /* For the moment, z has no logflag F.Leray 05.10.04 */
101 char ** ReBuildUserTicks( char old_logflag, char new_logflag, double * u_xgrads, int *u_nxgrads, char ** u_xlabels)
102 {
103
104     if (old_logflag == new_logflag)
105     {
106         return u_xlabels;    /* nothing to do l->l or n->n */
107     }
108
109     if (u_xgrads != NULL)
110     {
111         if (old_logflag == 'n' && new_logflag == 'l') /* n->l */ /* 10-> 1, 100->2 ...*/
112         {
113
114             u_xlabels = CaseLogflagN2L(u_nxgrads, u_xgrads, u_xlabels);
115
116         }
117         else if (old_logflag == 'l' && new_logflag == 'n')
118         {
119             int nbtics = *u_nxgrads;
120             int i;
121
122             for (i = 0; i < nbtics; i++) u_xgrads[i] = exp10(u_xgrads[i]);
123
124         }
125     }
126
127     return  u_xlabels;
128 }
129 /*------------------------------------------------------------------------*/
130 int set_log_flags_property(void* _pvCtx, char* pobjUID, size_t stackPointer, int valueType, int nbRow, int nbCol )
131 {
132     BOOL status[3];
133     char * flags = NULL;
134     char curLogFlags[4] = "nnn";
135     int iLogFlag = 0;
136     int* piLogFlag = &iLogFlag;
137     int logFlags[3];
138     int i = 0;
139     double* dataBounds = NULL;
140
141     if ( !( valueType == sci_strings ) )
142     {
143         Scierror(999, _("Wrong type for '%s' property: String expected.\n"), "log_flags");
144         return SET_PROPERTY_ERROR ;
145     }
146
147     if ( nbRow * nbCol != 2 && nbRow * nbCol != 3 )
148     {
149         Scierror(999, _("Wrong size for '%s' property: Must be %s or %s.\n"), "log_flags", "2", "3");
150         return SET_PROPERTY_ERROR ;
151     }
152
153     flags = getStringFromStack(stackPointer);
154
155     /* flags must be 'n' or 'l' */
156     if (   (flags[0] != 'n' && flags[0] != 'l')
157             || (flags[1] != 'n' && flags[1] != 'l'))
158     {
159         Scierror(999, _("%s: Wrong value for argument: '%s' or '%s' expected.\n"), "flags", "n", "l");
160         return SET_PROPERTY_ERROR ;
161     }
162
163     getGraphicObjectProperty(pobjUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
164
165     if (piLogFlag == NULL)
166     {
167         Scierror(999, _("'%s' property does not exist for this handle.\n"), "log_flags");
168         return SET_PROPERTY_ERROR;
169     }
170
171     logFlags[0] = iLogFlag;
172
173     getGraphicObjectProperty(pobjUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
174     logFlags[1] = iLogFlag;
175
176     getGraphicObjectProperty(pobjUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
177     logFlags[2] = iLogFlag;
178
179     for (i = 0; i < 3; i++)
180     {
181         if (logFlags[i] == 1)
182         {
183             curLogFlags[i] = 'l';
184         }
185         else
186         {
187             curLogFlags[i] = 'n';
188         }
189     }
190
191     getGraphicObjectProperty(pobjUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
192
193     if (dataBounds == NULL)
194     {
195         Scierror(999, _("'%s' property does not exist for this handle.\n"), "data_bounds");
196         return SET_PROPERTY_ERROR;
197     }
198
199     /* X axes */
200     if ( ( dataBounds[0] <= 0. || dataBounds[1] <= 0.) && flags[0] == 'l' )
201     {
202         Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"), "x");
203         return SET_PROPERTY_ERROR ;
204     }
205
206     /*
207      * Commented out for now
208      * To be implemented using the MVC framework
209      */
210 #if 0
211     ppSubWin->axes.u_xlabels = ReBuildUserTicks( curLogFlags[0], flags[0],
212                                ppSubWin->axes.u_xgrads,
213                                &ppSubWin->axes.u_nxgrads,
214                                ppSubWin->axes.u_xlabels  );
215 #endif
216
217     curLogFlags[0] = flags[0];
218
219     /* Y axes */
220     if ( ( dataBounds[2] <= 0. || dataBounds[3] <= 0. ) && flags[1] == 'l' )
221     {
222         Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"), "y");
223         return SET_PROPERTY_ERROR;
224     }
225
226     /*
227      * Commented out for now
228      * To be implemented using the MVC framework
229      */
230 #if 0
231     ppSubWin->axes.u_ylabels = ReBuildUserTicks( curLogFlags[1], flags[1],
232                                ppSubWin->axes.u_ygrads,
233                                &ppSubWin->axes.u_nygrads,
234                                ppSubWin->axes.u_ylabels  );
235 #endif
236
237     curLogFlags[1] = flags[1];
238
239
240     if ( nbRow * nbCol == 3 )
241     {
242         if ( flags[2] != 'n' && flags[2] != 'l' )
243         {
244             Scierror(999, "flags must be 'n' or 'l'.\n");
245             return SET_PROPERTY_ERROR;
246         }
247
248         if ( ( dataBounds[4] <= 0. || dataBounds[5] <= 0. ) && flags[2] == 'l' )
249         {
250             Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"), "z");
251             return SET_PROPERTY_ERROR;
252         }
253
254         /*
255          * Commented out for now
256          * To be implemented using the MVC framework
257          */
258 #if 0
259         ppSubWin->axes.u_zlabels = ReBuildUserTicks( curLogFlags[2], flags[2],
260                                    ppSubWin->axes.u_zgrads,
261                                    &ppSubWin->axes.u_nzgrads,
262                                    ppSubWin->axes.u_zlabels);
263 #endif
264
265         curLogFlags[2] = flags[2];
266     }
267
268     for (i = 0; i < 3; i++)
269     {
270         if (curLogFlags[i] == 'l')
271         {
272             logFlags[i] = 1;
273         }
274         else
275         {
276             logFlags[i] = 0;
277         }
278     }
279
280     status[0] = setGraphicObjectProperty(pobjUID, __GO_X_AXIS_LOG_FLAG__, &logFlags[0], jni_bool, 1);
281     status[1] = setGraphicObjectProperty(pobjUID, __GO_Y_AXIS_LOG_FLAG__, &logFlags[1], jni_bool, 1);
282     status[2] = setGraphicObjectProperty(pobjUID, __GO_Z_AXIS_LOG_FLAG__, &logFlags[2], jni_bool, 1);
283
284     if (status[0] == TRUE && status[1] == TRUE && status[2] == TRUE)
285     {
286         return SET_PROPERTY_SUCCEED;
287     }
288     else
289     {
290         Scierror(999, _("'%s' property does not exist for this handle.\n"), "log_flags");
291         return SET_PROPERTY_ERROR;
292     }
293 }
294 /*------------------------------------------------------------------------*/