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