bad space
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_xgetfile.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Allan CORNET
4  * Copyright (C) 2007 - INRIA - Vincent COUVERT (java version)
5  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13  
14 #include "gw_gui.h"
15 #include "machine.h"
16 #include "stack-c.h"
17 #include "CallFileChooser.h"
18 #include "MALLOC.h"
19 #include "localization.h"
20 #include "Scierror.h"
21 /*--------------------------------------------------------------------------*/
22 int C2F(sci_xgetfile)(char *fname,unsigned long fname_len)
23 {
24   int fileChooserID = 0;
25   
26   int nbRow = 0, nbCol = 0;
27
28   char **userSelection = NULL;
29   int voidSelectionAdr = 0;
30
31   char *optName = NULL;
32
33   int titleAdr = 0;
34   int initialDirectoryAdr = 0;
35   int fileMaskAdr = 0;
36
37   char *title = NULL, *fileMask = NULL, *initialDirectory = NULL;
38
39   CheckRhs(0,3);
40   CheckLhs(1,1);
41
42   if ((optName = (char*)MALLOC(sizeof(char*)*(strlen("title")+1))) == NULL)
43     {
44       Scierror(999, _("%s: No more memory.\n"),fname);
45       return FALSE;
46     }
47   
48   
49   if (Rhs==1)
50     {
51       /* Argument is file_mask or optional title */
52       if (VarType(1) == sci_strings) /* Check type */
53         {
54           if (IsOpt(1, optName)) /* Check if optional title */
55             {
56               if (strcmp(optName,"title")==0) /* Check if optional parameter is title */
57                 {
58                   GetRhsVar(1, STRING_DATATYPE, &nbRow, &nbCol, &titleAdr);
59                   if (nbCol !=1)
60                     {
61                       Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 1);
62                       FREE(optName);
63                       return FALSE;
64                     }
65                   title = cstk(titleAdr);
66                 }
67               else
68                 {
69                                         Scierror(999, _("%s: Wrong input argument: '%s' expected.\n"),fname, "title");
70                   FREE(optName);
71                   return FALSE;
72                 }
73             }
74           else
75             {
76               GetRhsVar(1, STRING_DATATYPE, &nbRow, &nbCol, &fileMaskAdr);
77               if (nbCol !=1)
78                 {
79                                         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 1);
80                                         FREE(optName);
81                                         return FALSE;
82                 }
83               fileMask = cstk(fileMaskAdr);
84             }
85         }
86       else
87         {
88           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 1);
89           FREE(optName);
90           return FALSE;
91         }
92     }
93   else if (Rhs==2)
94     {
95       /* First argument is file_mask */
96       if (VarType(1) == sci_strings) /* Check type */
97         {
98           GetRhsVar(1, STRING_DATATYPE, &nbRow, &nbCol, &fileMaskAdr);
99           if (nbCol !=1)
100             {
101               Scierror(999,  _("%s: Wrong type for input argument %d: A string expected.\n"),fname,1);
102               FREE(optName);
103               return FALSE;
104             }
105           fileMask = cstk(fileMaskAdr);
106         }
107       else
108         {
109           Scierror(999,  _("%s: Wrong type for input argument %d: A string expected.\n"),fname, 1);
110           FREE(optName);
111           return FALSE;
112         }
113
114       /* Second argument is initial directory or optional title */
115       if (VarType(2) == sci_strings) /* Check type */
116         {
117           if (IsOpt(2, optName)) /* Check if optional title */
118             {
119               if (strcmp(optName,"title")==0) /* Check if optional parameter is title */
120                 {
121                   GetRhsVar(2, STRING_DATATYPE, &nbRow, &nbCol, &titleAdr);
122                   if (nbCol !=1)
123                     {
124                       Scierror(999,  _("%s: Wrong type for input argument %d: A string expected.\n"),fname, 2);
125                       FREE(optName);
126                       return FALSE;
127                     }
128                   title = cstk(titleAdr);
129                 }
130               else
131                 {
132                   Scierror(999, _("%s: Wrong value for input argument #%d: '%s' expected.\n"),fname, 2, "title");
133                   FREE(optName);
134                   return FALSE;
135                 }
136             }
137           else
138             {
139               GetRhsVar(2, STRING_DATATYPE, &nbRow, &nbCol, &initialDirectoryAdr);
140               if (nbCol !=1)
141                 {
142                   Scierror(999,  _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 2);
143                   FREE(optName);
144                   return FALSE;
145                 }
146               initialDirectory = cstk(initialDirectoryAdr);
147             }
148         }
149       else
150         {
151           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 2);
152           FREE(optName);
153           return FALSE;
154         }
155     }
156   else if (Rhs==3)
157     {
158       /* First argument is file_mask */
159       if (VarType(1) == sci_strings) /* Check type */
160         {
161           GetRhsVar(1, STRING_DATATYPE, &nbRow, &nbCol, &fileMaskAdr);
162           if (nbCol !=1)
163             {
164               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"),fname, 1);
165               FREE(optName);
166               return FALSE;
167             }
168           fileMask = cstk(fileMaskAdr);
169         }
170       else
171         {
172           Scierror(999,  _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 1);
173           return FALSE;
174         }
175
176       /* Second argument is initial directory */
177       if (VarType(2) == sci_strings) /* Check type */
178         {
179           GetRhsVar(2, STRING_DATATYPE, &nbRow, &nbCol, &initialDirectoryAdr);
180           if (nbCol !=1)
181             {
182               Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"),fname, 2);
183               FREE(optName);
184               return FALSE;
185             }
186           initialDirectory = cstk(initialDirectoryAdr);
187         }
188       else
189         {
190           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 2);
191           FREE(optName);
192           return FALSE;
193         }
194      
195       /* Third argument is title or optional title */
196       if (VarType(3) == sci_strings)  /* Check type */
197         {
198           if (IsOpt(3, optName)) /* Check if optional title */
199             {
200               if (strcmp(optName,"title")==0) /* Check if optional parameter is title */
201                 {
202                   GetRhsVar(3, STRING_DATATYPE, &nbRow, &nbCol, &titleAdr);
203                   if (nbCol !=1)
204                     {
205                       Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 3);
206                       FREE(optName);
207                       return FALSE;
208                     }
209                   title = cstk(titleAdr);
210                 }
211               else
212                 {
213                   Scierror(999, _("%s: Wrong value for input argument #%d: '%s' expected.\n"),fname, 3, "title");
214                   FREE(optName);
215                   return FALSE;
216                 }
217             }
218           else
219             {
220               GetRhsVar(3, STRING_DATATYPE, &nbRow, &nbCol, &titleAdr);
221               if (nbCol !=1)
222                 {
223                   Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"),fname, 3);
224                   FREE(optName);
225                   return FALSE;
226                 }
227               title = cstk(titleAdr);
228             }
229         }
230       else
231         {
232           Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 3);
233           FREE(optName);
234           return FALSE;
235         }
236     }
237
238   /* Create the Java Object */
239   fileChooserID = createFileChooser();
240
241   /* Do not allow to select a directory */
242   setFileChooserFileSelectionOnly(fileChooserID);
243   
244   /* Set options */
245   if (title != NULL)
246     {
247       setFileChooserTitle(fileChooserID, title);
248     }
249
250   if (initialDirectory != NULL)
251     {
252       setFileChooserInitialDirectory(fileChooserID, initialDirectory);
253     }
254
255   if (fileMask != NULL)
256     {
257       setFileChooserMask(fileChooserID, fileMask);
258     }
259
260   /* Display it and wait for a user input */
261   fileChooserDisplayAndWait(fileChooserID);
262
263   /* Read the size of the selection, if 0 then no file selected */
264   nbRow = getFileChooserSelectionSize(fileChooserID);
265
266   if (nbRow !=0 ) 
267     {
268       /* The user selected a file --> returns the files names */
269       nbCol = 1;
270       
271       userSelection = getFileChooserSelection(fileChooserID);
272
273       CreateVarFromPtr(Rhs+1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, userSelection);
274     }
275   else
276     {
277       /* The user canceled the selection --> returns an empty matrix */
278       nbRow = 0;
279       nbCol = 0;
280
281       CreateVar(Rhs+1, STRING_DATATYPE, &nbRow, &nbCol, &voidSelectionAdr);
282     }
283   
284   LhsVar(1)=Rhs+1;
285   C2F(putlhsvar)();
286
287   FREE(optName);
288
289   return TRUE;
290 }
291 /*--------------------------------------------------------------------------*/