Coverity: graphics module resource leaks fixed
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_constraints_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
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 /*------------------------------------------------------------------------*/
17 /* file: set_figure_name_property.c                                       */
18 /* desc : function to modify in Scilab the figure_name field of           */
19 /*        a handle                                                        */
20 /*------------------------------------------------------------------------*/
21 #include "api_scilab.h"
22 #include "sci_malloc.h"
23 #include "freeArrayOfString.h"
24 #include "Scierror.h"
25 #include "localization.h"
26 #include "SetPropertyStatus.h"
27 #include "sci_types.h"
28 #include "os_string.h"
29
30 #include "setGraphicObjectProperty.h"
31 #include "getGraphicObjectProperty.h"
32 #include "graphicObjectProperties.h"
33 #include "LayoutType.h"
34 #include "BorderLayoutType.h"
35 #include "FillType.h"
36 #include "AnchorType.h"
37 /*------------------------------------------------------------------------*/
38 int clearConstraints(int iObjUID);
39 /*------------------------------------------------------------------------*/
40 int set_constraints_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
41 {
42
43     //[] or tlist
44     if (valueType == sci_matrix)
45     {
46         return clearConstraints(iObjUID);
47     }
48     else
49     {
50         SciErr sciErr;
51         int i = 0;
52         int* piAddrList = (int*)_pvData;
53
54         int* piAddr = NULL;
55         int iRows = 0;
56         int iCols = 0;
57         char** pstField = NULL;
58         char* pstType = NULL;
59
60
61         if (valueType != sci_tlist)
62         {
63             Scierror(999, _("Wrong type for '%s' property: A '%s' expected.\n"), "constraints", "tlist");
64             return 1;
65         }
66
67         sciErr = getListItemAddress(_pvCtx, piAddrList, 1, &piAddr);
68         if (sciErr.iErr)
69         {
70             return SET_PROPERTY_ERROR;
71         }
72
73         if (getAllocatedMatrixOfString(_pvCtx, piAddr, &iRows, &iCols, &pstField))
74         {
75             return SET_PROPERTY_ERROR;
76         }
77
78         pstType = pstField[0];
79         //depend of kind of tlist
80         if (strcmp(pstType, "NoLayoutConstraint") == 0)
81         {
82             freeAllocatedMatrixOfString(iRows, iCols, pstField);
83             return clearConstraints(iObjUID);
84         }
85         else if (strcmp(pstType, "BorderConstraint") == 0)
86         {
87             //arg2 -> string -> int enum
88             //arg3 -> double[] -> int[]
89
90             int* piAddr2 = NULL;
91             char* pstPos = NULL;
92             int iPos = 0;
93
94             int* piAddr3 = NULL;
95             int iRows3 = 0;
96             int iCols3 = 0;
97             double* pdblPreferredSize = NULL;
98             int piPreferredSize[2];
99
100             freeAllocatedMatrixOfString(iRows, iCols, pstField);
101             sciErr = getListItemAddress(_pvCtx, piAddrList, 2, &piAddr2);
102             if (sciErr.iErr)
103             {
104                 return SET_PROPERTY_ERROR;
105             }
106
107             if (getAllocatedSingleString(_pvCtx, piAddr2, &pstPos))
108             {
109                 return SET_PROPERTY_ERROR;
110             }
111
112             //convert string value to enum
113             if (stricmp(pstPos, "center") == 0)
114             {
115                 iPos = BORDER_CENTER;
116             }
117             else if (stricmp(pstPos, "bottom") == 0)
118             {
119                 iPos = BORDER_BOTTOM;
120             }
121             else if (stricmp(pstPos, "top") == 0)
122             {
123                 iPos = BORDER_TOP;
124             }
125             else if (stricmp(pstPos, "left") == 0)
126             {
127                 iPos = BORDER_LEFT;
128             }
129             else if (stricmp(pstPos, "right") == 0)
130             {
131                 iPos = BORDER_RIGHT;
132             }
133             else
134             {
135                 Scierror(999, _("Wrong value for '%s' property: Must be in the set {%s}.\n"), "constraints.position", "center, top, bottom, left, right");
136                 freeAllocatedSingleString(pstPos);
137                 return SET_PROPERTY_ERROR;
138             }
139
140             freeAllocatedSingleString(pstPos);
141
142             sciErr = getListItemAddress(_pvCtx, piAddrList, 3, &piAddr3);
143             if (sciErr.iErr)
144             {
145                 return SET_PROPERTY_ERROR;
146             }
147
148             sciErr = getMatrixOfDouble(_pvCtx, piAddr3, &iRows3, &iCols3, &pdblPreferredSize);
149             if (sciErr.iErr)
150             {
151                 return SET_PROPERTY_ERROR;
152             }
153
154             //reassign double values in int[]
155             piPreferredSize[0] = (int)pdblPreferredSize[0];
156             piPreferredSize[1] = (int)pdblPreferredSize[1];
157
158             setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_POSITION__, &iPos, jni_int, 1);
159             setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_PREFERREDSIZE__, piPreferredSize, jni_int_vector, 2);
160         }
161         else if (strcmp(pstType, "GridConstraints") == 0)
162         {
163             freeAllocatedMatrixOfString(iRows, iCols, pstField);
164             return clearConstraints(iObjUID);
165         }
166         else if (strcmp(pstType, "GridBagConstraints") == 0)
167         {
168             //arg2 -> double 1x4 -> int 1*4
169             //arg3 -> double 1x2 -> double 1*2
170             //arg4 -> string -> int enum
171             //arg5 -> string -> int enum
172             //arg6 -> double 1x2 -> int 1*2
173             //arg7 -> double 1x2 -> int 1*2
174
175             int* piAddr2 = NULL;
176             int iRows2 = 0;
177             int iCols2 = 0;
178             double* pdblGrid = NULL;
179             int piGrid[4];
180
181             int* piAddr3 = NULL;
182             int iRows3 = 0;
183             int iCols3 = 0;
184             double* pdblWeight = NULL;
185
186             int* piAddr4 = NULL;
187             char* pstFill = NULL;
188             int iFill = 0;
189
190             int* piAddr5 = NULL;
191             char* pstAnchor = NULL;
192             int iAnchor = 0;
193
194             int* piAddr6 = NULL;
195             int iRows6 = 0;
196             int iCols6 = 0;
197             double* pdblPadding = NULL;
198             int piPadding[2];
199
200             int* piAddr7 = NULL;
201             int iRows7 = 0;
202             int iCols7 = 0;
203             double* pdblPreferredSize = NULL;
204             int piPreferredSize[2];
205
206             freeAllocatedMatrixOfString(iRows, iCols, pstField);
207             sciErr = getListItemAddress(_pvCtx, piAddrList, 2, &piAddr2);
208             if (sciErr.iErr)
209             {
210                 return SET_PROPERTY_ERROR;
211             }
212
213             sciErr = getMatrixOfDouble(_pvCtx, piAddr2, &iRows2, &iCols2, &pdblGrid);
214             if (sciErr.iErr)
215             {
216                 return SET_PROPERTY_ERROR;
217             }
218
219             sciErr = getListItemAddress(_pvCtx, piAddrList, 3, &piAddr3);
220             if (sciErr.iErr)
221             {
222                 return SET_PROPERTY_ERROR;
223             }
224
225             sciErr = getMatrixOfDouble(_pvCtx, piAddr3, &iRows3, &iCols3, &pdblWeight);
226             if (sciErr.iErr)
227             {
228                 return SET_PROPERTY_ERROR;
229             }
230
231             sciErr = getListItemAddress(_pvCtx, piAddrList, 4, &piAddr4);
232             if (sciErr.iErr)
233             {
234                 return SET_PROPERTY_ERROR;
235             }
236
237             if (getAllocatedSingleString(_pvCtx, piAddr4, &pstFill))
238             {
239                 return SET_PROPERTY_ERROR;
240             }
241
242             //convert string value to enum
243             if (stricmp(pstFill, "none") == 0)
244             {
245                 iFill = FILL_NONE;
246             }
247             else if (stricmp(pstFill, "horizontal") == 0)
248             {
249                 iFill = FILL_HORIZONTAL;
250             }
251             else if (stricmp(pstFill, "vertical") == 0)
252             {
253                 iFill = FILL_VERTICAL;
254             }
255             else if (stricmp(pstFill, "both") == 0)
256             {
257                 iFill = FILL_BOTH;
258             }
259             else
260             {
261                 Scierror(999, _("Wrong value for '%s' property: Must be in the set {%s}.\n"), "constraints.fill", "none, horizontal, vertical, both");
262                 freeAllocatedSingleString(pstFill);
263                 return SET_PROPERTY_ERROR;
264             }
265
266             freeAllocatedSingleString(pstFill);
267
268             sciErr = getListItemAddress(_pvCtx, piAddrList, 5, &piAddr5);
269             if (sciErr.iErr)
270             {
271                 return SET_PROPERTY_ERROR;
272             }
273
274             if (getAllocatedSingleString(_pvCtx, piAddr5, &pstAnchor))
275             {
276                 return SET_PROPERTY_ERROR;
277             }
278
279             //convert string value to enum
280             if (stricmp(pstAnchor, "center") == 0)
281             {
282                 iAnchor = ANCHOR_CENTER;
283             }
284             else if (stricmp(pstAnchor, "upper") == 0)
285             {
286                 iAnchor = ANCHOR_UPPER;
287             }
288             else if (stricmp(pstAnchor, "lower") == 0)
289             {
290                 iAnchor = ANCHOR_LOWER;
291             }
292             else if (stricmp(pstAnchor, "right") == 0)
293             {
294                 iAnchor = ANCHOR_RIGHT;
295             }
296             else if (stricmp(pstAnchor, "left") == 0)
297             {
298                 iAnchor = ANCHOR_LEFT;
299             }
300             else if (stricmp(pstAnchor, "upper_right") == 0)
301             {
302                 iAnchor = ANCHOR_UPPER_RIGHT;
303             }
304             else if (stricmp(pstAnchor, "upper_left") == 0)
305             {
306                 iAnchor = ANCHOR_UPPER_LEFT;
307             }
308             else if (stricmp(pstAnchor, "lower_right") == 0)
309             {
310                 iAnchor = ANCHOR_LOWER_RIGHT;
311             }
312             else if (stricmp(pstAnchor, "lower_left") == 0)
313             {
314                 iAnchor = ANCHOR_LOWER_LEFT;
315             }
316             else
317             {
318                 Scierror(999, _("Wrong value for '%s' property: Must be in the set {%s}.\n"), "constraints.anchor", "center, upper, lower, right, left, upper_right, upper_left, lower_right, lower_left");
319                 freeAllocatedSingleString(pstAnchor);
320                 return SET_PROPERTY_ERROR;
321             }
322
323             freeAllocatedSingleString(pstAnchor);
324
325             sciErr = getListItemAddress(_pvCtx, piAddrList, 6, &piAddr6);
326             if (sciErr.iErr)
327             {
328                 return SET_PROPERTY_ERROR;
329             }
330
331             sciErr = getMatrixOfDouble(_pvCtx, piAddr6, &iRows6, &iCols6, &pdblPadding);
332             if (sciErr.iErr)
333             {
334                 return SET_PROPERTY_ERROR;
335             }
336
337             sciErr = getListItemAddress(_pvCtx, piAddrList, 7, &piAddr7);
338             if (sciErr.iErr)
339             {
340                 return SET_PROPERTY_ERROR;
341             }
342
343             sciErr = getMatrixOfDouble(_pvCtx, piAddr7, &iRows7, &iCols7, &pdblPreferredSize);
344             if (sciErr.iErr)
345             {
346                 return SET_PROPERTY_ERROR;
347             }
348
349             //reassign double values in int[]
350             piGrid[0] = (int)pdblGrid[0];
351             piGrid[1] = (int)pdblGrid[1];
352             piGrid[2] = (int)pdblGrid[2];
353             piGrid[3] = (int)pdblGrid[3];
354
355             piPadding[0] = (int)pdblPadding[0];
356             piPadding[1] = (int)pdblPadding[1];
357
358             piPreferredSize[0] = (int)pdblPreferredSize[0];
359             piPreferredSize[1] = (int)pdblPreferredSize[1];
360
361             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_GRID__, piGrid, jni_int_vector, 4);
362             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_WEIGHT__, pdblWeight, jni_double_vector, 2);
363             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_FILL__, &iFill, jni_int, 1);
364             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_ANCHOR__, &iAnchor, jni_int, 1);
365             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PADDING__, piPadding, jni_int_vector, 2);
366             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PREFERREDSIZE__, piPreferredSize, jni_int_vector, 2);
367         }
368         else
369         {
370             freeAllocatedMatrixOfString(iRows, iCols, pstField);
371             return SET_PROPERTY_ERROR;
372         }
373     }
374
375     return SET_PROPERTY_SUCCEED;
376 }
377
378 int clearConstraints(int iObjUID)
379 {
380     //reset all constraints data in model
381     int pi[4] = {0, 0, 0, 0};
382     double pdbl[2] = {0, 0};
383     int iPos = BORDER_CENTER;
384     int iFill = FILL_NONE;
385     int iAnchor = ANCHOR_CENTER;
386     BOOL status = FALSE;
387
388     status = setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_POSITION__, &iPos, jni_int, 1);
389     if (status != TRUE)
390     {
391         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
392         return SET_PROPERTY_ERROR;
393     }
394
395     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_GRID__, pi, jni_int_vector, 4);
396     if (status != TRUE)
397     {
398         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
399         return SET_PROPERTY_ERROR;
400     }
401
402     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_WEIGHT__, pdbl, jni_double_vector, 2);
403     if (status != TRUE)
404     {
405         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
406         return SET_PROPERTY_ERROR;
407     }
408
409     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_FILL__, &iFill, jni_int, 1);
410     if (status != TRUE)
411     {
412         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
413         return SET_PROPERTY_ERROR;
414     }
415
416     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_ANCHOR__, &iAnchor, jni_int, 1);
417     if (status != TRUE)
418     {
419         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
420         return SET_PROPERTY_ERROR;
421     }
422
423     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PADDING__, pi, jni_int_vector, 2);
424     if (status != TRUE)
425     {
426         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
427         return SET_PROPERTY_ERROR;
428     }
429
430     return SET_PROPERTY_SUCCEED;
431 }