GUI module ported to api_scilab. test_run("gui")
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_toolbar.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2005 - INRIA - Allan CORNET
4  * Copyright (C) 2008 - INRIA - Vincent COUVERT
5  * Copyright (C) 2011 - DIGITEO - Vincent COUVERT
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 #include "gw_gui.h"
16 #include "api_scilab.h"
17 #include "Scierror.h"
18 #include "MALLOC.h"
19 #include "localization.h"
20 #include "Toolbar.h"
21 #include "FigureList.h"
22 #include "HandleManagement.h"
23 #include "GetProperty.h"
24 #include "freeArrayOfString.h"
25 #if _MSC_VER
26 #include "strdup_windows.h"
27 #endif
28 #include "getGraphicObjectProperty.h"
29 #include "graphicObjectProperties.h"
30 #include "getConsoleIdentifier.h"
31 /*--------------------------------------------------------------------------*/
32 int sci_toolbar(char *fname, unsigned long l)
33 {
34     SciErr sciErr;
35
36     int* piAddr1 = NULL;
37     int* piStkAdr = NULL;
38     int* piAddrstkAdr = NULL;
39     long long* stkAdr = NULL;
40     int* piAddrparam = NULL;
41
42     int nbCol = 0;
43     int nbRow = 0;
44
45     char *Output = NULL;
46     char **param = NULL;
47     int figNum = -2;
48
49     char *pParentUID = NULL;
50     int iParentType = -1;
51     int *piParentType = &iParentType;
52
53     CheckInputArgument(pvApiCtx, 1, 2);
54     CheckOutputArgument(pvApiCtx, 0, 1);
55
56     /* Figure number */
57     if (checkInputArgumentType(pvApiCtx, 1, sci_matrix))
58     {
59         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
60         if (sciErr.iErr)
61         {
62             printError(&sciErr, 0);
63             return 1;
64         }
65
66         // Retrieve a matrix of double at position 1.
67         sciErr = getMatrixOfDoubleAsInteger(pvApiCtx, piAddr1, &nbRow, &nbCol, &piStkAdr);
68         if (sciErr.iErr)
69         {
70             printError(&sciErr, 0);
71             Scierror(202, _("%s: Wrong type for argument %d: A real expected.\n"), fname, 1);
72             return 1;
73         }
74
75         if (nbRow * nbCol != 1)
76         {
77             Scierror(999, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, 1);
78             return FALSE;
79         }
80         figNum = *piStkAdr;
81
82         if (figNum < -1)
83         {
84             Scierror(999, _("%s: Wrong value for input argument #%d: Must be > %d expected.\n"), fname, 1, -1);
85             return FALSE;
86         }
87
88         if (figNum != -1)       /* Check that the figure exists */
89         {
90             if (getFigureFromIndex(figNum) == NULL)
91             {
92                 Scierror(999, _("%s: Wrong value for input argument #%d: 'Graphic Window Number %d' does not exist.\n"), fname, 1, figNum);
93                 return FALSE;
94             }
95         }
96
97         if (figNum == -1)
98         {
99             pParentUID = getConsoleIdentifier();
100         }
101         else
102         {
103             pParentUID = (char*)getFigureFromIndex(figNum);
104         }
105     }
106     else if (checkInputArgumentType(pvApiCtx, 1, sci_handles))
107     {
108         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrstkAdr);
109         if (sciErr.iErr)
110         {
111             printError(&sciErr, 0);
112             return 1;
113         }
114
115         // Retrieve a matrix of handle at position 1.
116         sciErr = getMatrixOfHandle(pvApiCtx, piAddrstkAdr, &nbRow, &nbCol, &stkAdr);
117         if (sciErr.iErr)
118         {
119             printError(&sciErr, 0);
120             Scierror(202, _("%s: Wrong type for argument %d: Handle matrix expected.\n"), fname, 1);
121             return 1;
122         }
123
124         if (nbRow * nbCol != 1)
125         {
126             Scierror(999, _("%s: Wrong size for input argument #%d: A graphic handle expected.\n"), fname, 1);
127             return FALSE;
128         }
129         pParentUID = (char*)getObjectFromHandle((long) * stkAdr);
130
131         if (pParentUID == NULL)
132         {
133             Scierror(999, _("%s: Wrong value for input argument #%d: this handle does not exist.\n"), fname, 1);
134             return FALSE;
135         }
136
137         getGraphicObjectProperty(pParentUID, __GO_TYPE__, jni_int, (void **)&piParentType);
138         if (iParentType == __GO_FIGURE__)
139         {
140             Scierror(999, _("%s: Wrong type for input argument #%d: A real or a Figure handle expected.\n"), fname, 1);
141             return FALSE;
142         }
143     }
144     else
145     {
146         Scierror(999, _("%s: Wrong type for input argument #%d: A real or Figure handle expected.\n"), fname, 1);
147         return FALSE;
148     }
149
150     if (nbInputArgument(pvApiCtx) == 2)               /* New status */
151     {
152         if ((checkInputArgumentType(pvApiCtx, 2, sci_strings)))
153         {
154             sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrparam);
155             if (sciErr.iErr)
156             {
157                 printError(&sciErr, 0);
158                 return 1;
159             }
160
161             // Retrieve a matrix of string at position 2.
162             if (getAllocatedMatrixOfString(pvApiCtx, piAddrparam, &nbRow, &nbCol, &param))
163             {
164                 Scierror(202, _("%s: Wrong type for argument #%d: String matrix expected.\n"), fname, 2);
165                 return 1;
166             }
167
168             if (nbRow * nbCol != 1)
169             {
170                 freeAllocatedMatrixOfString(nbRow, nbCol, param);
171                 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
172                 return FALSE;
173             }
174
175             if ((strcmp(param[0], "off") == 0) || (strcmp(param[0], "on") == 0))
176             {
177                 setToolbarVisible(pParentUID, strcmp(param[0], "on") == 0);
178                 freeAllocatedMatrixOfString(nbRow, nbCol, param);
179             }
180             else
181             {
182                 freeAllocatedMatrixOfString(nbRow, nbCol, param);
183                 Scierror(999, _("%s: Wrong value for input argument #%d: '%s' or '%s' expected.\n"), fname, 2, "on", "off");
184                 return FALSE;
185             }
186         }
187         else
188         {
189             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
190             return FALSE;
191         }
192     }
193
194     /* Returned value */
195     if (isToolbarVisible(pParentUID))
196     {
197         Output = strdup("on");
198     }
199     else
200     {
201         Output = strdup("off");
202     }
203
204     nbCol = 1;
205     nbRow = (int)strlen(Output);
206     if (createSingleString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, Output))
207     {
208         Scierror(999, _("%s: Memory allocation error.\n"), fname);
209         return 1;
210     }
211
212     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
213
214     if (Output)
215     {
216         FREE(Output);
217         Output = NULL;
218     }
219
220     ReturnArguments(pvApiCtx);
221     return TRUE;
222 }
223
224 /*--------------------------------------------------------------------------*/