59a5f852d4e95b55807163054deee13337b332bb
[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             sciErr = getListItemAddress(_pvCtx, piAddrList, 2, &piAddr2);
101             if (sciErr.iErr)
102             {
103                 freeAllocatedMatrixOfString(iRows, iCols, pstField);
104                 return SET_PROPERTY_ERROR;
105             }
106
107             if (getAllocatedSingleString(_pvCtx, piAddr2, &pstPos))
108             {
109                 freeAllocatedMatrixOfString(iRows, iCols, pstField);
110                 return SET_PROPERTY_ERROR;
111             }
112
113             //convert string value to enum
114             if (stricmp(pstPos, "center") == 0)
115             {
116                 iPos = BORDER_CENTER;
117             }
118             else if (stricmp(pstPos, "bottom") == 0)
119             {
120                 iPos = BORDER_BOTTOM;
121             }
122             else if (stricmp(pstPos, "top") == 0)
123             {
124                 iPos = BORDER_TOP;
125             }
126             else if (stricmp(pstPos, "left") == 0)
127             {
128                 iPos = BORDER_LEFT;
129             }
130             else if (stricmp(pstPos, "right") == 0)
131             {
132                 iPos = BORDER_RIGHT;
133             }
134             else
135             {
136                 Scierror(999, _("Wrong value for '%s' property: Must be in the set {%s}.\n"), "constraints.position", "center, top, bottom, left, right");
137                 freeAllocatedSingleString(pstPos);
138                 freeAllocatedMatrixOfString(iRows, iCols, pstField);
139                 return SET_PROPERTY_ERROR;
140             }
141
142             freeAllocatedSingleString(pstPos);
143
144             sciErr = getListItemAddress(_pvCtx, piAddrList, 3, &piAddr3);
145             if (sciErr.iErr)
146             {
147                 freeAllocatedMatrixOfString(iRows, iCols, pstField);
148                 return SET_PROPERTY_ERROR;
149             }
150
151             sciErr = getMatrixOfDouble(_pvCtx, piAddr3, &iRows3, &iCols3, &pdblPreferredSize);
152             if (sciErr.iErr)
153             {
154                 freeAllocatedMatrixOfString(iRows, iCols, pstField);
155                 return SET_PROPERTY_ERROR;
156             }
157
158             //reassign double values in int[]
159             piPreferredSize[0] = (int)pdblPreferredSize[0];
160             piPreferredSize[1] = (int)pdblPreferredSize[1];
161
162             setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_POSITION__, &iPos, jni_int, 1);
163             setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_PREFERREDSIZE__, piPreferredSize, jni_int_vector, 2);
164         }
165         else if (strcmp(pstType, "GridConstraints") == 0)
166         {
167             freeAllocatedMatrixOfString(iRows, iCols, pstField);
168             return clearConstraints(iObjUID);
169         }
170         else if (strcmp(pstType, "GridBagConstraints") == 0)
171         {
172             //arg2 -> double 1x4 -> int 1*4
173             //arg3 -> double 1x2 -> double 1*2
174             //arg4 -> string -> int enum
175             //arg5 -> string -> int enum
176             //arg6 -> double 1x2 -> int 1*2
177             //arg7 -> double 1x2 -> int 1*2
178
179             int* piAddr2 = NULL;
180             int iRows2 = 0;
181             int iCols2 = 0;
182             double* pdblGrid = NULL;
183             int piGrid[4];
184
185             int* piAddr3 = NULL;
186             int iRows3 = 0;
187             int iCols3 = 0;
188             double* pdblWeight = NULL;
189
190             int* piAddr4 = NULL;
191             char* pstFill = NULL;
192             int iFill = 0;
193
194             int* piAddr5 = NULL;
195             char* pstAnchor = NULL;
196             int iAnchor = 0;
197
198             int* piAddr6 = NULL;
199             int iRows6 = 0;
200             int iCols6 = 0;
201             double* pdblPadding = NULL;
202             int piPadding[2];
203
204             int* piAddr7 = NULL;
205             int iRows7 = 0;
206             int iCols7 = 0;
207             double* pdblPreferredSize = NULL;
208             int piPreferredSize[2];
209
210             freeAllocatedMatrixOfString(iRows, iCols, pstField);
211             sciErr = getListItemAddress(_pvCtx, piAddrList, 2, &piAddr2);
212             if (sciErr.iErr)
213             {
214                 return SET_PROPERTY_ERROR;
215             }
216
217             sciErr = getMatrixOfDouble(_pvCtx, piAddr2, &iRows2, &iCols2, &pdblGrid);
218             if (sciErr.iErr)
219             {
220                 return SET_PROPERTY_ERROR;
221             }
222
223             sciErr = getListItemAddress(_pvCtx, piAddrList, 3, &piAddr3);
224             if (sciErr.iErr)
225             {
226                 return SET_PROPERTY_ERROR;
227             }
228
229             sciErr = getMatrixOfDouble(_pvCtx, piAddr3, &iRows3, &iCols3, &pdblWeight);
230             if (sciErr.iErr)
231             {
232                 return SET_PROPERTY_ERROR;
233             }
234
235             sciErr = getListItemAddress(_pvCtx, piAddrList, 4, &piAddr4);
236             if (sciErr.iErr)
237             {
238                 return SET_PROPERTY_ERROR;
239             }
240
241             if (getAllocatedSingleString(_pvCtx, piAddr4, &pstFill))
242             {
243                 return SET_PROPERTY_ERROR;
244             }
245
246             //convert string value to enum
247             if (stricmp(pstFill, "none") == 0)
248             {
249                 iFill = FILL_NONE;
250             }
251             else if (stricmp(pstFill, "horizontal") == 0)
252             {
253                 iFill = FILL_HORIZONTAL;
254             }
255             else if (stricmp(pstFill, "vertical") == 0)
256             {
257                 iFill = FILL_VERTICAL;
258             }
259             else if (stricmp(pstFill, "both") == 0)
260             {
261                 iFill = FILL_BOTH;
262             }
263             else
264             {
265                 Scierror(999, _("Wrong value for '%s' property: Must be in the set {%s}.\n"), "constraints.fill", "none, horizontal, vertical, both");
266                 freeAllocatedSingleString(pstFill);
267                 return SET_PROPERTY_ERROR;
268             }
269
270             freeAllocatedSingleString(pstFill);
271
272             sciErr = getListItemAddress(_pvCtx, piAddrList, 5, &piAddr5);
273             if (sciErr.iErr)
274             {
275                 return SET_PROPERTY_ERROR;
276             }
277
278             if (getAllocatedSingleString(_pvCtx, piAddr5, &pstAnchor))
279             {
280                 return SET_PROPERTY_ERROR;
281             }
282
283             //convert string value to enum
284             if (stricmp(pstAnchor, "center") == 0)
285             {
286                 iAnchor = ANCHOR_CENTER;
287             }
288             else if (stricmp(pstAnchor, "upper") == 0)
289             {
290                 iAnchor = ANCHOR_UPPER;
291             }
292             else if (stricmp(pstAnchor, "lower") == 0)
293             {
294                 iAnchor = ANCHOR_LOWER;
295             }
296             else if (stricmp(pstAnchor, "right") == 0)
297             {
298                 iAnchor = ANCHOR_RIGHT;
299             }
300             else if (stricmp(pstAnchor, "left") == 0)
301             {
302                 iAnchor = ANCHOR_LEFT;
303             }
304             else if (stricmp(pstAnchor, "upper_right") == 0)
305             {
306                 iAnchor = ANCHOR_UPPER_RIGHT;
307             }
308             else if (stricmp(pstAnchor, "upper_left") == 0)
309             {
310                 iAnchor = ANCHOR_UPPER_LEFT;
311             }
312             else if (stricmp(pstAnchor, "lower_right") == 0)
313             {
314                 iAnchor = ANCHOR_LOWER_RIGHT;
315             }
316             else if (stricmp(pstAnchor, "lower_left") == 0)
317             {
318                 iAnchor = ANCHOR_LOWER_LEFT;
319             }
320             else
321             {
322                 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");
323                 freeAllocatedSingleString(pstAnchor);
324                 return SET_PROPERTY_ERROR;
325             }
326
327             freeAllocatedSingleString(pstAnchor);
328
329             sciErr = getListItemAddress(_pvCtx, piAddrList, 6, &piAddr6);
330             if (sciErr.iErr)
331             {
332                 return SET_PROPERTY_ERROR;
333             }
334
335             sciErr = getMatrixOfDouble(_pvCtx, piAddr6, &iRows6, &iCols6, &pdblPadding);
336             if (sciErr.iErr)
337             {
338                 return SET_PROPERTY_ERROR;
339             }
340
341             sciErr = getListItemAddress(_pvCtx, piAddrList, 7, &piAddr7);
342             if (sciErr.iErr)
343             {
344                 return SET_PROPERTY_ERROR;
345             }
346
347             sciErr = getMatrixOfDouble(_pvCtx, piAddr7, &iRows7, &iCols7, &pdblPreferredSize);
348             if (sciErr.iErr)
349             {
350                 return SET_PROPERTY_ERROR;
351             }
352
353             //reassign double values in int[]
354             piGrid[0] = (int)pdblGrid[0];
355             piGrid[1] = (int)pdblGrid[1];
356             piGrid[2] = (int)pdblGrid[2];
357             piGrid[3] = (int)pdblGrid[3];
358
359             piPadding[0] = (int)pdblPadding[0];
360             piPadding[1] = (int)pdblPadding[1];
361
362             piPreferredSize[0] = (int)pdblPreferredSize[0];
363             piPreferredSize[1] = (int)pdblPreferredSize[1];
364
365             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_GRID__, piGrid, jni_int_vector, 4);
366             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_WEIGHT__, pdblWeight, jni_double_vector, 2);
367             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_FILL__, &iFill, jni_int, 1);
368             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_ANCHOR__, &iAnchor, jni_int, 1);
369             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PADDING__, piPadding, jni_int_vector, 2);
370             setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PREFERREDSIZE__, piPreferredSize, jni_int_vector, 2);
371         }
372         else
373         {
374             freeAllocatedMatrixOfString(iRows, iCols, pstField);
375             return SET_PROPERTY_ERROR;
376         }
377     }
378
379     return SET_PROPERTY_SUCCEED;
380 }
381
382 int clearConstraints(int iObjUID)
383 {
384     //reset all constraints data in model
385     int pi[4] = {0, 0, 0, 0};
386     double pdbl[2] = {0, 0};
387     int iPos = BORDER_CENTER;
388     int iFill = FILL_NONE;
389     int iAnchor = ANCHOR_CENTER;
390     BOOL status = FALSE;
391
392     status = setGraphicObjectProperty(iObjUID, __GO_UI_BORDER_POSITION__, &iPos, jni_int, 1);
393     if (status != TRUE)
394     {
395         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
396         return SET_PROPERTY_ERROR;
397     }
398
399     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_GRID__, pi, jni_int_vector, 4);
400     if (status != TRUE)
401     {
402         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
403         return SET_PROPERTY_ERROR;
404     }
405
406     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_WEIGHT__, pdbl, jni_double_vector, 2);
407     if (status != TRUE)
408     {
409         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
410         return SET_PROPERTY_ERROR;
411     }
412
413     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_FILL__, &iFill, jni_int, 1);
414     if (status != TRUE)
415     {
416         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
417         return SET_PROPERTY_ERROR;
418     }
419
420     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_ANCHOR__, &iAnchor, jni_int, 1);
421     if (status != TRUE)
422     {
423         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
424         return SET_PROPERTY_ERROR;
425     }
426
427     status = setGraphicObjectProperty(iObjUID, __GO_UI_GRIDBAG_PADDING__, pi, jni_int_vector, 2);
428     if (status != TRUE)
429     {
430         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
431         return SET_PROPERTY_ERROR;
432     }
433
434     return SET_PROPERTY_SUCCEED;
435 }