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