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