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