Fix more segfaults in 64bits
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_uigetfont.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT (java version)
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-en.txt
10  *
11  */
12
13 #include "gw_gui.h"
14 #include "stack-c.h"
15 #include "localization.h"
16 #include "Scierror.h"
17 #include "CallFontChooser.h"
18 #include "getPropertyAssignedValue.h"
19
20 /*--------------------------------------------------------------------------*/
21 int sci_uigetfont(char *fname,unsigned long fname_len)
22 {
23   int fontChooserID = 0;
24
25   int nbRow = 0, nbCol = 0;
26
27   char **fontNameAdr = NULL;
28   int fontSizeAdr = 0;
29   int boldAdr = 0;
30   int italicAdr = 0;
31
32   char *selectedFontName = NULL;
33   int selectedFontSize = 0;
34   BOOL selectedBold = FALSE;
35   BOOL selectedItalic = FALSE;
36
37
38   CheckRhs(0,4);
39   CheckLhs(1,4);
40
41   /* Default font name */
42   if (Rhs >= 1) {
43     if (VarType(1) == sci_strings) 
44       {
45         GetRhsVar(1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &fontNameAdr);
46         if (nbRow*nbCol != 1)
47           {
48             Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 1);
49             return FALSE;
50           }
51       }
52     else
53       {
54         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
55         return FALSE;
56       }
57   }
58
59   /* Default font size */
60   if (Rhs >= 2) 
61     {
62       if (VarType(2) == sci_matrix)
63         {
64           GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &fontSizeAdr);
65           if (nbRow*nbCol!=1)
66             {
67               Scierror(999, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, 2);
68               return FALSE;
69             }
70         }
71       else
72         {
73           Scierror(999, _("%s: Wrong type for input argument #%d: A real expected.\n"), fname, 2);
74           return FALSE;
75         }
76     }
77
78   /* Is the default font bold ? */
79   if (Rhs >= 3)
80     {
81       if (VarType(3) == sci_boolean)
82         {
83           GetRhsVar(3,MATRIX_OF_BOOLEAN_DATATYPE,&nbRow,&nbCol,&boldAdr);
84           if (nbRow*nbCol != 1)
85             {
86               Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 3);
87               return FALSE;
88             }
89
90         }
91       else
92         {
93           Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 3);
94           return FALSE;
95         }
96     }
97
98   /* Is the default font italic ? */
99   if (Rhs >= 4)
100     {
101       if (VarType(4) == sci_boolean)
102         {
103           GetRhsVar(4,MATRIX_OF_BOOLEAN_DATATYPE,&nbRow,&nbCol,&italicAdr);
104           if (nbRow*nbCol != 1)
105             {
106               Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), fname, 4);
107               return FALSE;
108             }
109
110         }
111       else
112         {
113           Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 4);
114           return FALSE;
115         }
116     }
117
118   /* Create the Java Object */
119   fontChooserID = createFontChooser();
120
121   /* Default font */
122   if (fontNameAdr != 0)
123     {
124       setFontChooserFontName(fontChooserID, getStringMatrixFromStack((size_t)fontNameAdr)[0]);
125     }
126   
127   /* Default size */
128   if (fontSizeAdr != 0)
129     {
130       setFontChooserFontSize(fontChooserID, (int)stk(fontSizeAdr)[0]);
131     }
132   
133   /* Default bold */
134   if (boldAdr != 0)
135     {
136       setFontChooserBold(fontChooserID, istk(boldAdr)[0]);
137     }
138   
139   /* Default italic */
140   if (italicAdr != 0)
141     {
142       setFontChooserItalic(fontChooserID, istk(italicAdr)[0]);
143     }
144   
145   /* Display it and wait for a user input */
146   fontChooserDisplayAndWait(fontChooserID);
147
148   /* Return the selected font */
149   
150   /* Read the user answer */
151   selectedFontName = getFontChooserFontName(fontChooserID);
152   
153
154   if (strcmp(selectedFontName,"")) /* The user selected a font */
155     {
156       selectedFontSize = getFontChooserFontSize(fontChooserID);
157       selectedBold = getFontChooserBold(fontChooserID);
158       selectedItalic = getFontChooserItalic(fontChooserID);
159
160       nbRow = 1; nbCol = 1;
161       if (Lhs>=1)
162         {
163           CreateVarFromPtr(Rhs+1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &selectedFontName);
164         }
165   
166       if (Lhs>=2)
167         {
168           CreateVar(Rhs+2, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &fontSizeAdr);
169           *stk(fontSizeAdr) = selectedFontSize;
170         }
171
172       if (Lhs>=3)
173         {
174           CreateVar(Rhs+3, MATRIX_OF_BOOLEAN_DATATYPE, &nbRow, &nbCol, &boldAdr);
175           *istk(boldAdr) = selectedBold;
176         }
177
178       if (Lhs>=4)
179         {
180           CreateVar(Rhs+4, MATRIX_OF_BOOLEAN_DATATYPE, &nbRow, &nbCol, &italicAdr);
181           *istk(italicAdr) = selectedItalic;
182         }
183     }
184   else /* The user canceled */
185     {
186       nbRow = 0; nbCol = 0;
187       if (Lhs>=1)
188         {
189           /* Return "" as font name */
190           CreateVar(Rhs+1, STRING_DATATYPE, &nbRow, &nbCol, &fontNameAdr);
191         }
192   
193       if (Lhs>=2)
194         {
195           /* Return [] as font size */
196           CreateVar(Rhs+2, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &fontSizeAdr);
197         }
198
199       if (Lhs>=3)
200         {
201           /* Return [] as bold value */
202           CreateVar(Rhs+3, MATRIX_OF_BOOLEAN_DATATYPE, &nbRow, &nbCol, &boldAdr);
203         }
204
205       if (Lhs>=4)
206         {
207            /* Return [] as italic value */
208          CreateVar(Rhs+4, MATRIX_OF_BOOLEAN_DATATYPE, &nbRow, &nbCol, &italicAdr);
209         }
210     }
211   
212   /* TO DO delete [] selectedFontName */
213   
214   LhsVar(1) = Rhs+1;
215   LhsVar(2) = Rhs+2;
216   LhsVar(3) = Rhs+3;
217   LhsVar(4) = Rhs+4;
218   
219   C2F(putlhsvar)();
220   return TRUE;
221 }
222 /*--------------------------------------------------------------------------*/