Coverity #1165289,90,91,92,93,94,95,96,97,98,#1165304,05,06,07,09 Fixed
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_border_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 "createGraphicObject.h"
31 #include "deleteGraphicObject.h"
32 #include "setGraphicObjectProperty.h"
33 #include "getGraphicObjectProperty.h"
34 #include "graphicObjectProperties.h"
35 #include "BorderLayoutType.h"
36 /*------------------------------------------------------------------------*/
37 int clearBorder(int iObjUID);
38 int createBorder(void* _pvCtx, int* _piAddrList, int _iParent);
39 int createLineBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
40 int createBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
41 int createSoftBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
42 int createCommonBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID, int _iStyle);
43 int createEtchedBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
44 int createTitledBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
45 int createEmptyBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
46 int createCompoundBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
47 int createMatteBorder(void* _pvCtx, int* _piAddrList, int _iObjUID);
48 /*------------------------------------------------------------------------*/
49 int set_border_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
50 {
51
52     if ((valueType != sci_tlist && valueType != sci_matrix) || (valueType == sci_matrix && (nbRow != 0 || nbCol != 0)))
53     {
54         Scierror(999, _("Wrong type for '%s' property: An empty matrix or a tlist expected.\n"), "border");
55         return SET_PROPERTY_ERROR;
56     }
57     else if (valueType == sci_matrix)
58     {
59         return clearBorder(iObjUID);
60     }
61     else
62     {
63         int iHidden = 1;
64         int* piAddrList = (int*)_pvData;
65
66         int iBorder = createBorder(_pvCtx, piAddrList, iObjUID);
67         if (iBorder == 0)
68         {
69             return SET_PROPERTY_ERROR;
70         }
71
72         setGraphicObjectProperty(iObjUID, __GO_UI_FRAME_BORDER__, &iBorder, jni_int, 1);
73         setGraphicObjectProperty(iBorder, __GO_HIDDEN__, &iHidden, jni_bool, 1);
74         setGraphicObjectRelationship(iObjUID, iBorder);
75         return SET_PROPERTY_SUCCEED;
76     }
77 }
78 /*------------------------------------------------------------------------*/
79 int createBorder(void* _pvCtx, int* _piAddrList, int _iParent)
80 {
81     SciErr sciErr;
82     int* piAddr = NULL;
83     char** pstField = NULL;
84     int iRows = 0;
85     int iCols = 0;
86     char* pstType = NULL;
87
88
89     sciErr = getListItemAddress(_pvCtx, _piAddrList, 1, &piAddr);
90     if (sciErr.iErr)
91     {
92         return SET_PROPERTY_ERROR;
93     }
94
95     if (getAllocatedMatrixOfString(_pvCtx, piAddr, &iRows, &iCols, &pstField))
96     {
97         return SET_PROPERTY_ERROR;
98     }
99
100     pstType = pstField[0];
101     int ret = 0; //empty uid
102     
103     //depend of kind of tlist
104     if (strcmp(pstType, "NoBorder") == 0)
105     {
106         ret = clearBorder(_iParent);
107     }
108     else if (strcmp(pstType, "LineBorder") == 0)
109     {
110         ret = createLineBorder(_pvCtx, _piAddrList, _iParent);
111     }
112     else if (strcmp(pstType, "BevelBorder") == 0)
113     {
114         ret = createBevelBorder(_pvCtx, _piAddrList, _iParent);
115     }
116     else if (strcmp(pstType, "SoftBevelBorder") == 0)
117     {
118         ret = createSoftBevelBorder(_pvCtx, _piAddrList, _iParent);
119     }
120     else if (strcmp(pstType, "EtchedBorder") == 0)
121     {
122         ret = createEtchedBorder(_pvCtx, _piAddrList, _iParent);
123     }
124     else if (strcmp(pstType, "TitledBorder") == 0)
125     {
126         ret = createTitledBorder(_pvCtx, _piAddrList, _iParent);
127     }
128     else if (strcmp(pstType, "EmptyBorder") == 0)
129     {
130         ret = createEmptyBorder(_pvCtx, _piAddrList, _iParent);
131     }
132     else if (strcmp(pstType, "CompoundBorder") == 0)
133     {
134         ret = createCompoundBorder(_pvCtx, _piAddrList, _iParent);
135     }
136     else if (strcmp(pstType, "MatteBorder") == 0)
137     {
138         ret = createMatteBorder(_pvCtx, _piAddrList, _iParent);
139     }
140
141     freeAllocatedMatrixOfString(iRows, iCols, pstField);
142     return ret;
143 }
144 /*------------------------------------------------------------------------*/
145 int clearBorder(int iObjUID)
146 {
147     BOOL status = FALSE;
148     int iBorder = 0;
149     int* piBorder = &iBorder;
150
151     getGraphicObjectProperty(iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
152     if (piBorder != NULL && iBorder != 0)
153     {
154         //delete current border
155         deleteGraphicObject(iBorder);
156     }
157
158     iBorder = 0;
159     status = setGraphicObjectProperty(iObjUID, __GO_UI_FRAME_BORDER__, &iBorder, jni_int, 1);
160     if (status != TRUE)
161     {
162         Scierror(999, _("'%s' property does not exist for this handle.\n"), "constraints");
163         return SET_PROPERTY_ERROR;
164     }
165
166     return SET_PROPERTY_SUCCEED;
167 }
168 /*------------------------------------------------------------------------*/
169 int createLineBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
170 {
171     //arg1 = string -> string
172     //arg2 = double -> int
173     //arg3 = boolean -> boolean
174     SciErr sciErr;
175     int iBorder = 0;
176     int* piBorder = &iBorder;
177     int iStyle = 1; //FrameBorderType.LINE in java
178     int* piAddr2 = NULL;
179     char* pstColor = NULL;
180     int* piAddr3 = NULL;
181     double dblThickness = 0;
182     int iThickness = 0;
183     int* piAddr4 = NULL;
184     int bRounded = 0;
185     int iCount = 0;
186
187     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
188     if (sciErr.iErr)
189     {
190         return SET_PROPERTY_ERROR;
191     }
192
193     //color
194     sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
195     if (sciErr.iErr)
196     {
197         return SET_PROPERTY_ERROR;
198     }
199
200     if (getAllocatedSingleString(_pvCtx, piAddr2, &pstColor))
201     {
202         return SET_PROPERTY_ERROR;
203     }
204
205
206     //thickness
207     if (iCount > 2)
208     {
209         sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
210         if (sciErr.iErr)
211         {
212             freeAllocatedSingleString(pstColor);
213             return SET_PROPERTY_ERROR;
214         }
215
216         if (getScalarDouble(_pvCtx, piAddr3, &dblThickness))
217         {
218             freeAllocatedSingleString(pstColor);
219             return SET_PROPERTY_ERROR;
220         }
221
222         iThickness = (int)dblThickness;
223     }
224
225     //rounded
226     if (iCount > 3)
227     {
228         sciErr = getListItemAddress(_pvCtx, _piAddrList, 4, &piAddr4);
229         if (sciErr.iErr)
230         {
231             freeAllocatedSingleString(pstColor);
232             return SET_PROPERTY_ERROR;
233         }
234
235         if (getScalarBoolean(_pvCtx, piAddr4, &bRounded))
236         {
237             freeAllocatedSingleString(pstColor);
238             return SET_PROPERTY_ERROR;
239         }
240     }
241
242     //get current border
243     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
244     if (piBorder != NULL && iBorder != 0)
245     {
246         //delete previous border
247         deleteGraphicObject(iBorder);
248     }
249
250     //create new border object
251     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
252     if (iBorder == 0)
253     {
254         freeAllocatedSingleString(pstColor);
255         return SET_PROPERTY_ERROR;
256     }
257
258     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
259     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_COLOR__, pstColor, jni_string, 1);
260     freeAllocatedSingleString(pstColor);
261
262     if (iCount > 2)
263     {
264         setGraphicObjectProperty(iBorder, __GO_LINE_THICKNESS__, &iThickness, jni_int, 1);
265     }
266
267     if (iCount > 3)
268     {
269         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_ROUNDED__, &bRounded, jni_bool, 1);
270     }
271
272
273     return iBorder;
274 }
275 /*------------------------------------------------------------------------*/
276 int createBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
277 {
278     return createCommonBevelBorder(_pvCtx, _piAddrList, _iObjUID, 2);
279 }
280 /*------------------------------------------------------------------------*/
281 int createSoftBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
282 {
283     return createCommonBevelBorder(_pvCtx, _piAddrList, _iObjUID, 3);
284 }
285 /*------------------------------------------------------------------------*/
286 int createCommonBevelBorder(void* _pvCtx, int* _piAddrList, int _iObjUID, int _iStyle)
287 {
288     //arg1 = string -> int ( RAISED or LOWERED )
289     //arg2 = string -> string ( color )
290     //arg3 = string -> string ( color )
291     //arg4 = string -> string ( color )
292     //arg5 = string -> string ( color )
293
294     SciErr sciErr;
295     int iBorder = 0;
296     int* piBorder = &iBorder;
297     int* piAddr2 = NULL;
298     char* pstType = NULL;
299     int iType = 0;
300     int* piAddr3 = NULL;
301     char* pstHlOutColor = NULL;
302     int* piAddr4 = NULL;
303     char* pstHlInColor = NULL;
304     int* piAddr5 = NULL;
305     char* pstShadowOutColor = NULL;
306     int* piAddr6 = NULL;
307     char* pstShadowInColor = NULL;
308     int iCount = 0;
309
310     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
311     if (sciErr.iErr)
312     {
313         return SET_PROPERTY_ERROR;
314     }
315
316     //type
317     sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
318     if (sciErr.iErr)
319     {
320         return SET_PROPERTY_ERROR;
321     }
322
323     if (getAllocatedSingleString(_pvCtx, piAddr2, &pstType))
324     {
325         return SET_PROPERTY_ERROR;
326     }
327
328     if (stricmp(pstType, "raised") == 0)
329     {
330         iType = 0;
331     }
332     else if (stricmp(pstType, "lowered") == 0)
333     {
334         iType = 1;
335     }
336
337     freeAllocatedSingleString(pstType);
338
339     //highlight out and highlight in or hl and shadow
340     if (iCount > 2)
341     {
342         //highlight out
343         sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
344         if (sciErr.iErr)
345         {
346             return SET_PROPERTY_ERROR;
347         }
348
349         if (getAllocatedSingleString(_pvCtx, piAddr3, &pstHlOutColor))
350         {
351             return SET_PROPERTY_ERROR;
352         }
353
354         //highlight in
355         sciErr = getListItemAddress(_pvCtx, _piAddrList, 4, &piAddr4);
356         if (sciErr.iErr)
357         {
358             freeAllocatedSingleString(pstHlOutColor);
359             return SET_PROPERTY_ERROR;
360         }
361
362         if (getAllocatedSingleString(_pvCtx, piAddr4, &pstHlInColor))
363         {
364             freeAllocatedSingleString(pstHlOutColor);
365             return SET_PROPERTY_ERROR;
366         }
367     }
368
369     if (iCount > 4)
370     {
371         //shadow out
372         sciErr = getListItemAddress(_pvCtx, _piAddrList, 5, &piAddr5);
373         if (sciErr.iErr)
374         {
375             freeAllocatedSingleString(pstHlInColor);
376             freeAllocatedSingleString(pstHlOutColor);
377             return SET_PROPERTY_ERROR;
378         }
379
380         if (getAllocatedSingleString(_pvCtx, piAddr5, &pstShadowOutColor))
381         {
382             freeAllocatedSingleString(pstHlInColor);
383             freeAllocatedSingleString(pstHlOutColor);
384             return SET_PROPERTY_ERROR;
385         }
386
387         //shadow in
388         sciErr = getListItemAddress(_pvCtx, _piAddrList, 6, &piAddr6);
389         if (sciErr.iErr)
390         {
391             freeAllocatedSingleString(pstShadowOutColor);
392             freeAllocatedSingleString(pstHlInColor);
393             freeAllocatedSingleString(pstHlOutColor);
394             return SET_PROPERTY_ERROR;
395         }
396
397         if (getAllocatedSingleString(_pvCtx, piAddr6, &pstShadowInColor))
398         {
399             freeAllocatedSingleString(pstShadowOutColor);
400             freeAllocatedSingleString(pstHlInColor);
401             freeAllocatedSingleString(pstHlOutColor);
402             return SET_PROPERTY_ERROR;
403         }
404     }
405
406     //get current border
407     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
408     if (piBorder != NULL && iBorder != 0)
409     {
410         //delete previous border
411         deleteGraphicObject(iBorder);
412     }
413
414     //create new border object
415     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
416     if (iBorder == 0)
417     {
418         freeAllocatedSingleString(pstShadowInColor);
419         freeAllocatedSingleString(pstShadowOutColor);
420         freeAllocatedSingleString(pstHlInColor);
421         freeAllocatedSingleString(pstHlOutColor);
422         return SET_PROPERTY_ERROR;
423     }
424
425     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &_iStyle, jni_int, 1);
426     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_TYPE__, &iType, jni_int, 1);
427
428     if (iCount > 2)
429     {
430         if (iCount == 4)
431         {
432             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_HIGHLIGHT_OUT__, pstHlOutColor, jni_string, 1);
433             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_SHADOW_OUT__, pstHlInColor, jni_string, 1);
434
435             freeAllocatedSingleString(pstHlOutColor);
436             freeAllocatedSingleString(pstHlInColor);
437         }
438         else
439         {
440             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_HIGHLIGHT_OUT__, pstHlOutColor, jni_string, 1);
441             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_HIGHLIGHT_IN__, pstHlInColor, jni_string, 1);
442             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_SHADOW_OUT__, pstShadowOutColor, jni_string, 1);
443             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_SHADOW_IN__, pstShadowInColor, jni_string, 1);
444
445             freeAllocatedSingleString(pstHlOutColor);
446             freeAllocatedSingleString(pstHlInColor);
447             freeAllocatedSingleString(pstShadowOutColor);
448             freeAllocatedSingleString(pstShadowInColor);
449         }
450     }
451
452     return iBorder;
453 }
454 /*------------------------------------------------------------------------*/
455 int createEtchedBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
456 {
457     //arg1 = double -> int ( RAISED or LOWERED )
458     //arg2 = string -> string ( color ) mapped on hl out
459     //arg3 = string -> string ( color ) mapped on shadow out
460     SciErr sciErr;
461     int iBorder = 0;
462     int* piBorder = &iBorder;
463
464     int iStyle = 4; //FrameBorderType.ETCHED in java
465     int* piAddr2 = NULL;
466     char* pstType = NULL;
467     int iType = 0;
468     int* piAddr3 = NULL;
469     char* pstHlOutColor = NULL;
470     int* piAddr4 = NULL;
471     char* pstShadowOutColor = NULL;
472     int iCount = 0;
473
474     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
475     if (sciErr.iErr)
476     {
477         return SET_PROPERTY_ERROR;
478     }
479
480     if (iCount == 2 || iCount == 4)
481     {
482         //type
483         sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
484         if (sciErr.iErr)
485         {
486             return SET_PROPERTY_ERROR;
487         }
488
489         if (getAllocatedSingleString(_pvCtx, piAddr2, &pstType))
490         {
491             return SET_PROPERTY_ERROR;
492         }
493
494         if (stricmp(pstType, "raised") == 0)
495         {
496             iType = 0;
497         }
498         else if (stricmp(pstType, "lowered") == 0)
499         {
500             iType = 1;
501         }
502
503         freeAllocatedSingleString(pstType);
504     }
505
506     if (iCount == 3 || iCount == 4)
507     {
508         int iPos = iCount - 1;
509         //highlight out
510         sciErr = getListItemAddress(_pvCtx, _piAddrList, iPos, &piAddr3);
511         if (sciErr.iErr)
512         {
513             return SET_PROPERTY_ERROR;
514         }
515
516         if (getAllocatedSingleString(_pvCtx, piAddr3, &pstHlOutColor))
517         {
518             return SET_PROPERTY_ERROR;
519         }
520
521         //shadow out
522         sciErr = getListItemAddress(_pvCtx, _piAddrList, iPos + 1, &piAddr4);
523         if (sciErr.iErr)
524         {
525             return SET_PROPERTY_ERROR;
526         }
527
528         if (getAllocatedSingleString(_pvCtx, piAddr4, &pstShadowOutColor))
529         {
530             freeAllocatedSingleString(pstHlOutColor);
531             return SET_PROPERTY_ERROR;
532         }
533     }
534
535
536
537     //get current border
538     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
539     if (piBorder != NULL && iBorder != 0)
540     {
541         //delete previous border
542         deleteGraphicObject(iBorder);
543     }
544
545     //create new border object
546     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
547     if (iBorder == 0)
548     {
549         freeAllocatedSingleString(pstShadowOutColor);
550         freeAllocatedSingleString(pstHlOutColor);
551         return SET_PROPERTY_ERROR;
552     }
553
554     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
555     if (iCount == 2 || iCount == 4)
556     {
557         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_TYPE__, &iType, jni_int, 1);
558     }
559
560     if (iCount == 3 || iCount == 4)
561     {
562         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_HIGHLIGHT_OUT__, pstHlOutColor, jni_string, 1);
563         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_SHADOW_OUT__, pstShadowOutColor, jni_string, 1);
564
565         freeAllocatedSingleString(pstHlOutColor);
566         freeAllocatedSingleString(pstShadowOutColor);
567     }
568
569     return iBorder;
570 }
571 /*------------------------------------------------------------------------*/
572 int createTitledBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
573 {
574     //arg1 = another border
575     //arg2 = string -> string
576     //arg3 = string -> int ( enum  JustificationType in java )
577     //arg4 = string -> string
578     //arg5 = string -> string
579     //arg6 = double -> int
580     //arg7 = string -> string
581     //arg8 = string -> int (  enum TitlePositionType in java )
582     //arg9 = string -> string
583     SciErr sciErr;
584     int iBorder = 0;
585     int* piBorder = &iBorder;
586     int iStyle = 5; //FrameBorderType.TITLED in java
587     int* piAddr2 = NULL;
588     int iChildBorder = 0;
589     int* piAddr3 = NULL;
590     char* pstTitle = NULL;
591     int* piAddr4 = NULL;
592     char* pstJustification = NULL;
593     int iJustification = 0;
594     int* piAddr5 = NULL;
595     int iPosition = 0;
596     char* pstPosition = NULL;
597     int* piAddr6 = NULL;
598     int* piFont = NULL;
599     int* piAddr7 = NULL;
600     char* pstColor = NULL;
601
602     //font data
603     char* pstFontName = NULL;
604     int iFontSize = 0;
605     char* pstFontAngle = NULL;
606     char* pstFontWeight = NULL;
607
608     int iCount = 0;
609
610     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
611     if (sciErr.iErr)
612     {
613         return SET_PROPERTY_ERROR;
614     }
615
616     if (iCount == 2)
617     {
618         //child border or title
619         sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
620         if (sciErr.iErr)
621         {
622             return SET_PROPERTY_ERROR;
623         }
624     }
625
626     if (iCount > 2)
627     {
628         //child border
629         sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
630         if (sciErr.iErr)
631         {
632             return SET_PROPERTY_ERROR;
633         }
634
635         //title
636         sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
637         if (sciErr.iErr)
638         {
639             return SET_PROPERTY_ERROR;
640         }
641
642         if (getAllocatedSingleString(_pvCtx, piAddr3, &pstTitle))
643         {
644             return SET_PROPERTY_ERROR;
645         }
646     }
647
648     if (iCount > 3)
649     {
650         //justification
651         sciErr = getListItemAddress(_pvCtx, _piAddrList, 4, &piAddr4);
652         if (sciErr.iErr)
653         {
654             freeAllocatedSingleString(pstTitle);
655             return SET_PROPERTY_ERROR;
656         }
657
658         if (getAllocatedSingleString(_pvCtx, piAddr4, &pstJustification))
659         {
660             freeAllocatedSingleString(pstTitle);
661             return SET_PROPERTY_ERROR;
662         }
663
664         if (stricmp(pstJustification, "leading") == 0)
665         {
666             iJustification = 0;
667         }
668         else if (stricmp(pstJustification, "left") == 0)
669         {
670             iJustification = 1;
671         }
672         else if (stricmp(pstJustification, "center") == 0)
673         {
674             iJustification = 2;
675         }
676         else if (stricmp(pstJustification, "right") == 0)
677         {
678             iJustification = 3;
679         }
680         else if (stricmp(pstJustification, "trailing") == 0)
681         {
682             iJustification = 4;
683         }
684
685         freeAllocatedSingleString(pstJustification);
686
687         //position
688         sciErr = getListItemAddress(_pvCtx, _piAddrList, 5, &piAddr5);
689         if (sciErr.iErr)
690         {
691             freeAllocatedSingleString(pstTitle);
692             return SET_PROPERTY_ERROR;
693         }
694
695         if (getAllocatedSingleString(_pvCtx, piAddr5, &pstPosition))
696         {
697             freeAllocatedSingleString(pstTitle);
698             return SET_PROPERTY_ERROR;
699         }
700
701         if (stricmp(pstPosition, "top") == 0)
702         {
703             iPosition = 0;
704         }
705         else if (stricmp(pstPosition, "above_top") == 0)
706         {
707             iPosition = 1;
708         }
709         else if (stricmp(pstPosition, "below_top") == 0)
710         {
711             iPosition = 2;
712         }
713         else if (stricmp(pstPosition, "bottom") == 0)
714         {
715             iPosition = 3;
716         }
717         else if (stricmp(pstPosition, "above_bottom") == 0)
718         {
719             iPosition = 4;
720         }
721         else if (stricmp(pstPosition, "below_bottom") == 0)
722         {
723             iPosition = 5;
724         }
725
726         freeAllocatedSingleString(pstPosition);
727     }
728
729     if (iCount > 5)
730     {
731         int* piAddrFont = NULL;
732         double dblFontSize = 0;
733         //font
734         sciErr = getListItemAddress(_pvCtx, _piAddrList, 6, &piAddr6);
735         if (sciErr.iErr)
736         {
737             freeAllocatedSingleString(pstTitle);
738             return SET_PROPERTY_ERROR;
739         }
740
741         //read data from font tlist
742         sciErr = getListItemAddress(_pvCtx, piAddr6, 2, &piAddrFont);
743         if (sciErr.iErr)
744         {
745             return SET_PROPERTY_ERROR;
746         }
747
748         if (getAllocatedSingleString(_pvCtx, piAddrFont, &pstFontName))
749         {
750             freeAllocatedSingleString(pstTitle);
751             return SET_PROPERTY_ERROR;
752         }
753
754         sciErr = getListItemAddress(_pvCtx, piAddr6, 3, &piAddrFont);
755         if (sciErr.iErr)
756         {
757             return SET_PROPERTY_ERROR;
758         }
759
760         if (getScalarDouble(_pvCtx, piAddrFont, &dblFontSize))
761         {
762             return SET_PROPERTY_ERROR;
763         }
764
765         iFontSize = (int)dblFontSize;
766
767         sciErr = getListItemAddress(_pvCtx, piAddr6, 4, &piAddrFont);
768         if (sciErr.iErr)
769         {
770             return SET_PROPERTY_ERROR;
771         }
772
773         if (getAllocatedSingleString(_pvCtx, piAddrFont, &pstFontAngle))
774         {
775             return SET_PROPERTY_ERROR;
776         }
777
778         sciErr = getListItemAddress(_pvCtx, piAddr6, 5, &piAddrFont);
779         if (sciErr.iErr)
780         {
781             return SET_PROPERTY_ERROR;
782         }
783
784         if (getAllocatedSingleString(_pvCtx, piAddrFont, &pstFontWeight))
785         {
786             return SET_PROPERTY_ERROR;
787         }
788     }
789
790     if (iCount > 6)
791     {
792         //color
793         sciErr = getListItemAddress(_pvCtx, _piAddrList, 7, &piAddr7);
794         if (sciErr.iErr)
795         {
796             return SET_PROPERTY_ERROR;
797         }
798
799         if (getAllocatedSingleString(_pvCtx, piAddr7, &pstColor))
800         {
801             return SET_PROPERTY_ERROR;
802         }
803     }
804
805     //get current border
806     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
807     if (piBorder != NULL && iBorder != 0)
808     {
809         //delete previous border
810         deleteGraphicObject(iBorder);
811     }
812
813     //create new border object
814     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
815     if (iBorder == 0)
816     {
817         freeAllocatedSingleString(pstTitle);
818         return SET_PROPERTY_ERROR;
819     }
820
821     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
822
823     if (iCount == 2)
824     {
825         if (isTListType(_pvCtx, piAddr2))
826         {
827             int iHidden = 1;
828             iChildBorder = createBorder(_pvCtx, piAddr2, iBorder);
829             if (iChildBorder == 0)
830             {
831                 return SET_PROPERTY_ERROR;
832             }
833
834             setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_TITLE__, &iChildBorder, jni_int, 1);
835             setGraphicObjectProperty(iChildBorder, __GO_HIDDEN__, &iHidden, jni_bool, 1);
836             setGraphicObjectRelationship(iBorder, iChildBorder);
837         }
838         else //title
839         {
840             if (getAllocatedSingleString(_pvCtx, piAddr2, &pstTitle))
841             {
842                 return SET_PROPERTY_ERROR;
843             }
844
845             setGraphicObjectProperty(iBorder, __GO_TITLE__, pstTitle, jni_string, 1);
846
847             freeAllocatedSingleString(pstTitle);
848         }
849
850         return iBorder;
851     }
852
853
854     if (iCount > 2)
855     {
856         iChildBorder = createBorder(_pvCtx, piAddr2, iBorder);
857         if (iChildBorder == 0)
858         {
859             freeAllocatedSingleString(pstTitle);
860             return SET_PROPERTY_ERROR;
861         }
862
863         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_TITLE__, &iChildBorder, jni_int, 1);
864         setGraphicObjectProperty(iBorder, __GO_TITLE__, pstTitle, jni_string, 1);
865
866         freeAllocatedSingleString(pstTitle);
867     }
868
869     if (iCount > 3)
870     {
871         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_JUSTIFICATION__, &iJustification, jni_int, 1);
872         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_POSITION__, &iPosition, jni_int, 1);
873     }
874
875     if (iCount > 5)
876     {
877         setGraphicObjectProperty(iBorder, __GO_UI_FONTNAME__, pstFontName, jni_string, 1);
878         setGraphicObjectProperty(iBorder, __GO_UI_FONTANGLE__, pstFontAngle, jni_string, 1);
879         setGraphicObjectProperty(iBorder, __GO_UI_FONTSIZE__, &iFontSize, jni_int, 1);
880         setGraphicObjectProperty(iBorder, __GO_UI_FONTWEIGHT__, pstFontWeight, jni_string, 1);
881
882         freeAllocatedSingleString(pstFontName);
883         freeAllocatedSingleString(pstFontAngle);
884         freeAllocatedSingleString(pstFontWeight);
885     }
886
887     if (iCount > 6)
888     {
889         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_COLOR__, pstColor, jni_string, 1);
890
891         freeAllocatedSingleString(pstColor);
892     }
893
894     return iBorder;
895 }
896 /*------------------------------------------------------------------------*/
897 int createEmptyBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
898 {
899     //arg1 = double -> double
900     //arg2 = double -> double
901     //arg3 = double -> double
902     //arg4 = double -> double
903     SciErr sciErr;
904     int iBorder = 0;
905     int* piBorder = &iBorder;
906     int iStyle = 6; //FrameBorderType.EMPTY in java
907     int* piAddr2 = NULL;
908     int* piAddr3 = NULL;
909     int* piAddr4 = NULL;
910     int* piAddr5 = NULL;
911     double pdblPosition[4];
912     int iCount = 0;
913
914     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
915     if (sciErr.iErr)
916     {
917         return SET_PROPERTY_ERROR;
918     }
919
920     if (iCount > 1)
921     {
922         //top
923         sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
924         if (sciErr.iErr)
925         {
926             return SET_PROPERTY_ERROR;
927         }
928
929         if (getScalarDouble(_pvCtx, piAddr2, &pdblPosition[0]))
930         {
931             return SET_PROPERTY_ERROR;
932         }
933
934         //left
935         sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
936         if (sciErr.iErr)
937         {
938             return SET_PROPERTY_ERROR;
939         }
940
941         if (getScalarDouble(_pvCtx, piAddr3, &pdblPosition[1]))
942         {
943             return SET_PROPERTY_ERROR;
944         }
945
946         //bottom
947         sciErr = getListItemAddress(_pvCtx, _piAddrList, 4, &piAddr4);
948         if (sciErr.iErr)
949         {
950             return SET_PROPERTY_ERROR;
951         }
952
953         if (getScalarDouble(_pvCtx, piAddr4, &pdblPosition[2]))
954         {
955             return SET_PROPERTY_ERROR;
956         }
957
958         //right
959         sciErr = getListItemAddress(_pvCtx, _piAddrList, 5, &piAddr5);
960         if (sciErr.iErr)
961         {
962             return SET_PROPERTY_ERROR;
963         }
964
965         if (getScalarDouble(_pvCtx, piAddr5, &pdblPosition[3]))
966         {
967             return SET_PROPERTY_ERROR;
968         }
969     }
970
971     //get current border
972     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
973     if (piBorder != NULL && iBorder != 0)
974     {
975         //delete previous border
976         deleteGraphicObject(iBorder);
977     }
978
979     //create new border object
980     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
981     if (iBorder == 0)
982     {
983         return SET_PROPERTY_ERROR;
984     }
985
986     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
987
988     if (iCount > 1)
989     {
990         setGraphicObjectProperty(iBorder, __GO_POSITION__, pdblPosition, jni_double_vector, 4);
991     }
992
993     return iBorder;
994 }
995 /*------------------------------------------------------------------------*/
996 int createCompoundBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
997 {
998     SciErr sciErr;
999     int iBorder = 0;
1000     int* piBorder = &iBorder;
1001     int iStyle = 7; //FrameBorderType.COMPOUND in java
1002     int* piAddr2 = NULL;
1003     int iChildBorderOut = 0;
1004     int* piAddr3 = NULL;
1005     int iChildBorderIn = 0;
1006     int iCount = 0;
1007
1008     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
1009     if (sciErr.iErr)
1010     {
1011         return SET_PROPERTY_ERROR;
1012     }
1013
1014     if (iCount > 1)
1015     {
1016         //child border out
1017         sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
1018         if (sciErr.iErr)
1019         {
1020             return SET_PROPERTY_ERROR;
1021         }
1022
1023         iChildBorderOut = createBorder(_pvCtx, piAddr2, _iObjUID);
1024         if (iChildBorderOut == 0)
1025         {
1026             return SET_PROPERTY_ERROR;
1027         }
1028
1029         //child border in
1030         sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
1031         if (sciErr.iErr)
1032         {
1033             return SET_PROPERTY_ERROR;
1034         }
1035
1036         iChildBorderIn = createBorder(_pvCtx, piAddr3, _iObjUID);
1037         if (iChildBorderIn == 0)
1038         {
1039             return SET_PROPERTY_ERROR;
1040         }
1041     }
1042     //get current border
1043     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
1044     if (piBorder != NULL && iBorder != 0)
1045     {
1046         //delete previous border
1047         deleteGraphicObject(iBorder);
1048     }
1049
1050     //create new border object
1051     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
1052     if (iBorder == 0)
1053     {
1054         return SET_PROPERTY_ERROR;
1055     }
1056
1057     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
1058
1059     if (iCount > 1)
1060     {
1061         int iHidden = 1;
1062         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_OUT_BORDER__, &iChildBorderOut, jni_int, 1);
1063         setGraphicObjectProperty(iChildBorderOut, __GO_HIDDEN__, &iHidden, jni_bool, 1);
1064         setGraphicObjectRelationship(iBorder, iChildBorderOut);
1065
1066         setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_IN_BORDER__, &iChildBorderIn, jni_int, 1);
1067         setGraphicObjectProperty(iChildBorderIn, __GO_HIDDEN__, &iHidden, jni_bool, 1);
1068         setGraphicObjectRelationship(iBorder, iChildBorderIn);
1069     }
1070
1071     return iBorder;
1072 }
1073 /*------------------------------------------------------------------------*/
1074 int createMatteBorder(void* _pvCtx, int* _piAddrList, int _iObjUID)
1075 {
1076     //arg1 = double -> double
1077     //arg2 = double -> double
1078     //arg3 = double -> double
1079     //arg4 = double -> double
1080     //arg4 = string -> string
1081     SciErr sciErr;
1082     int iBorder = 0;
1083     int* piBorder = &iBorder;
1084     int iStyle = 8; //FrameBorderType.MATTE in java
1085     int* piAddr2 = NULL;
1086     int* piAddr3 = NULL;
1087     int* piAddr4 = NULL;
1088     int* piAddr5 = NULL;
1089     double pdblPosition[4];
1090     int* piAddr6 = NULL;
1091     char* pstColor = NULL;
1092     int iCount = 0;
1093
1094     sciErr = getListItemNumber(_pvCtx, _piAddrList, &iCount);
1095     if (sciErr.iErr)
1096     {
1097         return SET_PROPERTY_ERROR;
1098     }
1099
1100     //top
1101     sciErr = getListItemAddress(_pvCtx, _piAddrList, 2, &piAddr2);
1102     if (sciErr.iErr)
1103     {
1104         return SET_PROPERTY_ERROR;
1105     }
1106
1107     if (getScalarDouble(_pvCtx, piAddr2, &pdblPosition[0]))
1108     {
1109         return SET_PROPERTY_ERROR;
1110     }
1111
1112     //left
1113     sciErr = getListItemAddress(_pvCtx, _piAddrList, 3, &piAddr3);
1114     if (sciErr.iErr)
1115     {
1116         return SET_PROPERTY_ERROR;
1117     }
1118
1119     if (getScalarDouble(_pvCtx, piAddr3, &pdblPosition[1]))
1120     {
1121         return SET_PROPERTY_ERROR;
1122     }
1123
1124     //bottom
1125     sciErr = getListItemAddress(_pvCtx, _piAddrList, 4, &piAddr4);
1126     if (sciErr.iErr)
1127     {
1128         return SET_PROPERTY_ERROR;
1129     }
1130
1131     if (getScalarDouble(_pvCtx, piAddr4, &pdblPosition[2]))
1132     {
1133         return SET_PROPERTY_ERROR;
1134     }
1135
1136     //right
1137     sciErr = getListItemAddress(_pvCtx, _piAddrList, 5, &piAddr5);
1138     if (sciErr.iErr)
1139     {
1140         return SET_PROPERTY_ERROR;
1141     }
1142
1143     if (getScalarDouble(_pvCtx, piAddr5, &pdblPosition[3]))
1144     {
1145         return SET_PROPERTY_ERROR;
1146     }
1147
1148     //color
1149     sciErr = getListItemAddress(_pvCtx, _piAddrList, 6, &piAddr6);
1150     if (sciErr.iErr)
1151     {
1152         return SET_PROPERTY_ERROR;
1153     }
1154
1155     if (getAllocatedSingleString(_pvCtx, piAddr6, &pstColor))
1156     {
1157         return SET_PROPERTY_ERROR;
1158     }
1159
1160     //get current border
1161     getGraphicObjectProperty(_iObjUID, __GO_UI_FRAME_BORDER__, jni_int, (void**)&piBorder);
1162     if (piBorder != NULL && iBorder != 0)
1163     {
1164         //delete previous border
1165         deleteGraphicObject(iBorder);
1166     }
1167
1168     //create new border object
1169     iBorder = createGraphicObject(__GO_UI_FRAME_BORDER__);
1170     if (iBorder == 0)
1171     {
1172         freeAllocatedSingleString(pstColor);
1173         return SET_PROPERTY_ERROR;
1174     }
1175
1176     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_STYLE__, &iStyle, jni_int, 1);
1177     setGraphicObjectProperty(iBorder, __GO_POSITION__, pdblPosition, jni_double_vector, 4);
1178
1179     setGraphicObjectProperty(iBorder, __GO_UI_FRAME_BORDER_COLOR__, pstColor, jni_string, 1);
1180     freeAllocatedSingleString(pstColor);
1181
1182     return iBorder;
1183 }
1184 /*------------------------------------------------------------------------*/