bbe4513f95b85da644471bb0574bbc8ac0a0cb35
[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       sciprint("Warning: graduation number %d is ignored : when switching to logarithmic scale, we must have strictly positive graduations!\n",i);
59     }
60     else
61     {
62         u_xgrads[cmpteur] = log10(u_xgrads[i]);
63         cmpteur++;
64     }
65   }
66
67     if(cmpteur != nbtics)
68     {
69         if((ticklabel=(char **)MALLOC(cmpteur*sizeof(char *)))==NULL){
70             Scierror(999, _("%s: No more memory.\n"),"CaseLogflagN");
71                         return NULL;
72         }
73
74         cmpteur2 = 0;
75         offset = nbtics - cmpteur;
76         for(i=0;i<cmpteur;i++){
77             if((ticklabel[cmpteur2]=(char *)MALLOC((strlen(u_xlabels[i+offset])+1)*sizeof(char )))==NULL){
78                                 Scierror(999, _("%s: No more memory.\n"),"CaseLogflagN");
79             }
80             strcpy(ticklabel[cmpteur2],u_xlabels[i+offset]);
81             cmpteur2++;
82         }
83
84         freeArrayOfString(u_xlabels, nbtics);
85         u_xlabels = ticklabel;
86     }
87
88     *u_nxgrads = cmpteur;
89     cmpteur = 0;
90     cmpteur2 = 0;
91
92     return u_xlabels;
93 }
94 /*--------------------------------------------------------------------------*/
95 /* Called by a.log_flags='nn','ln','nl', or 'll'*/
96 /* For the moment, z has no logflag F.Leray 05.10.04 */
97 char ** ReBuildUserTicks( char old_logflag, char new_logflag, double * u_xgrads, int *u_nxgrads, char ** u_xlabels)
98 {
99
100     if(old_logflag==new_logflag) { return u_xlabels; } /* nothing to do l->l or n->n */
101
102     if(u_xgrads!=NULL)
103     {
104         if(old_logflag=='n' && new_logflag=='l') /* n->l */ /* 10-> 1, 100->2 ...*/
105         {
106
107             u_xlabels=CaseLogflagN2L(u_nxgrads,u_xgrads,u_xlabels);
108
109         }
110         else if(old_logflag=='l' && new_logflag=='n')
111         {
112             int nbtics = *u_nxgrads;
113             int i;
114
115             for(i=0;i<nbtics;i++) u_xgrads[i] = exp10(u_xgrads[i]);
116
117         }
118     }
119
120     return  u_xlabels;
121 }
122 /*------------------------------------------------------------------------*/
123 int set_log_flags_property(void* _pvCtx, char* pobjUID, size_t stackPointer, int valueType, int nbRow, int nbCol )
124 {
125     BOOL status[3];
126     char * flags = NULL;
127     char curLogFlags[4] = "nnn";
128     int iLogFlag = 0;
129     int* piLogFlag = &iLogFlag;
130     int logFlags[3];
131     int i = 0;
132     double* dataBounds = NULL;
133
134     if ( !isParameterStringMatrix( valueType ) )
135     {
136         Scierror(999, _("Wrong type for '%s' property: String expected.\n"), "log_flags");
137         return SET_PROPERTY_ERROR ;
138     }
139
140     if ( nbRow * nbCol != 2 && nbRow * nbCol != 3 )
141     {
142         Scierror(999, _("Wrong size for '%s' property: Must be %s or %s.\n"), "log_flags", "2", "3");
143         return SET_PROPERTY_ERROR ;
144     }
145
146     flags = getStringFromStack(stackPointer);
147
148     /* flags must be 'n' or 'l' */
149     if (   (flags[0] != 'n' && flags[0] != 'l')
150            || (flags[1] != 'n' && flags[1] != 'l'))
151     {
152         Scierror(999, _("%s: Wrong value for argument: '%s' or '%s' expected.\n"),"flags","n","l");
153         return SET_PROPERTY_ERROR ;
154     }
155
156     getGraphicObjectProperty(pobjUID, __GO_X_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
157
158     if (piLogFlag == NULL)
159     {
160         Scierror(999, _("'%s' property does not exist for this handle.\n"),"log_flags");
161         return SET_PROPERTY_ERROR;
162     }
163
164     logFlags[0] = iLogFlag;
165
166     getGraphicObjectProperty(pobjUID, __GO_Y_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
167     logFlags[1] = iLogFlag;
168
169     getGraphicObjectProperty(pobjUID, __GO_Z_AXIS_LOG_FLAG__, jni_bool, (void **)&piLogFlag);
170     logFlags[2] = iLogFlag;
171
172     for (i = 0; i < 3; i++)
173     {
174         if (logFlags[i] == 1)
175         {
176             curLogFlags[i] = 'l';
177         }
178         else
179         {
180             curLogFlags[i] = 'n';
181         }
182     }
183
184     getGraphicObjectProperty(pobjUID, __GO_DATA_BOUNDS__, jni_double_vector, (void **)&dataBounds);
185
186     if (dataBounds == NULL)
187     {
188         Scierror(999, _("'%s' property does not exist for this handle.\n"),"data_bounds");
189         return SET_PROPERTY_ERROR;
190     }
191
192     /* X axes */
193     if( ( dataBounds[0] <= 0. || dataBounds[1] <= 0.) && flags[0] == 'l' )
194     {
195         Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"x");
196         return SET_PROPERTY_ERROR ;
197     }
198
199     /*
200      * Commented out for now
201      * To be implemented using the MVC framework
202      */
203 #if 0
204     ppSubWin->axes.u_xlabels = ReBuildUserTicks( curLogFlags[0], flags[0],
205                                                  ppSubWin->axes.u_xgrads,
206                                                  &ppSubWin->axes.u_nxgrads,
207                                                  ppSubWin->axes.u_xlabels  );
208 #endif
209
210     curLogFlags[0] = flags[0];
211
212     /* Y axes */
213     if( ( dataBounds[2] <= 0. || dataBounds[3] <= 0. ) && flags[1] == 'l' )
214     {
215         Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"y");
216         return SET_PROPERTY_ERROR;
217     }
218
219     /*
220      * Commented out for now
221      * To be implemented using the MVC framework
222      */
223 #if 0
224     ppSubWin->axes.u_ylabels = ReBuildUserTicks( curLogFlags[1], flags[1],
225                                                  ppSubWin->axes.u_ygrads,
226                                                  &ppSubWin->axes.u_nygrads,
227                                                  ppSubWin->axes.u_ylabels  );
228 #endif
229
230     curLogFlags[1] = flags[1];
231
232
233     if ( nbRow * nbCol == 3 )
234     {
235         if ( flags[2] != 'n' && flags[2] != 'l' )
236         {
237             Scierror(999, "flags must be 'n' or 'l'.\n");
238             return SET_PROPERTY_ERROR;
239         }
240
241         if ( ( dataBounds[4] <= 0. || dataBounds[5] <= 0. ) && flags[2] == 'l' )
242         {
243             Scierror(999, _("Error: data_bounds on %s axis must be strictly positive to switch to logarithmic mode.\n"),"z");
244             return SET_PROPERTY_ERROR;
245         }
246
247         /*
248          * Commented out for now
249          * To be implemented using the MVC framework
250          */
251 #if 0
252         ppSubWin->axes.u_zlabels = ReBuildUserTicks( curLogFlags[2], flags[2],
253                                                      ppSubWin->axes.u_zgrads,
254                                                      &ppSubWin->axes.u_nzgrads,
255                                                      ppSubWin->axes.u_zlabels);
256 #endif
257
258         curLogFlags[2] = flags[2];
259     }
260
261     for (i = 0; i < 3; i++)
262     {
263         if (curLogFlags[i] == 'l')
264         {
265             logFlags[i] = 1;
266         }
267         else
268         {
269             logFlags[i] = 0;
270         }
271     }
272
273     status[0] = setGraphicObjectProperty(pobjUID, __GO_X_AXIS_LOG_FLAG__, &logFlags[0], jni_bool, 1);
274     status[1] = setGraphicObjectProperty(pobjUID, __GO_Y_AXIS_LOG_FLAG__, &logFlags[1], jni_bool, 1);
275     status[2] = setGraphicObjectProperty(pobjUID, __GO_Z_AXIS_LOG_FLAG__, &logFlags[2], jni_bool, 1);
276
277     if (status[0] == TRUE && status[1] == TRUE && status[2] == TRUE)
278     {
279         return SET_PROPERTY_SUCCEED;
280     }
281     else
282     {
283         Scierror(999, _("'%s' property does not exist for this handle.\n"),"log_flags");
284         return SET_PROPERTY_ERROR;
285     }
286 }
287 /*------------------------------------------------------------------------*/