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