GUI module ported to api_scilab. test_run("gui")
[scilab.git] / scilab / modules / gui / sci_gateway / cpp / sci_uigetdir.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent COUVERT
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 "CallJuigetfile.hxx"
14 #include "GiwsException.hxx"
15 #include "BOOL.h"
16
17 extern "C"
18 {
19 #include <stdio.h>
20 #include "gw_gui.h"
21 #include "PATH_MAX.h"
22 #include "api_scilab.h"
23 #include "MALLOC.h"
24 #include "localization.h"
25 #include "Scierror.h"
26 #include "expandPathVariable.h"
27 #include "freeArrayOfString.h"
28 }
29
30 using namespace org_scilab_modules_gui_filechooser;
31
32 /*--------------------------------------------------------------------------*/
33 int sci_uigetdir(char *fname, unsigned long l)
34 {
35     SciErr sciErr;
36
37     int nbRow = 0, nbCol = 0;
38
39     int* piAddr1 = NULL;
40     int* piAddr2 = NULL;
41
42     char* title = NULL;
43     char* initialDirectory = NULL;
44     char** userSelection = NULL;
45     char* expandedpath = NULL;
46
47     CheckInputArgument(pvApiCtx, 0, 2);
48     CheckOutputArgument(pvApiCtx, 1, 1);
49
50     if (nbInputArgument(pvApiCtx) >= 1)
51     {
52         /* First argument is initial directory */
53         if (checkInputArgumentType(pvApiCtx, 1, sci_strings))
54         {
55             sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1);
56             if (sciErr.iErr)
57             {
58                 printError(&sciErr, 0);
59                 return 1;
60             }
61
62             if (getAllocatedSingleString(pvApiCtx, piAddr1, &initialDirectory))
63             {
64                 printError(&sciErr, 0);
65                 return 1;
66             }
67
68             expandedpath = expandPathVariable(initialDirectory);
69             freeAllocatedSingleString(initialDirectory);
70         }
71         else
72         {
73             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
74             return 1;
75         }
76     }
77
78     if (nbInputArgument(pvApiCtx) == 2)
79     {
80         /* Second argument is title */
81         if (checkInputArgumentType(pvApiCtx, 2, sci_strings))
82         {
83             sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2);
84             if (sciErr.iErr)
85             {
86                 FREE(expandedpath);
87                 printError(&sciErr, 0);
88                 return 1;
89             }
90
91             if (getAllocatedSingleString(pvApiCtx, piAddr2, &title))
92             {
93                 FREE(expandedpath);
94                 printError(&sciErr, 0);
95                 return 1;
96             }
97         }
98         else
99         {
100             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
101             FREE(expandedpath);
102             return 1;
103         }
104     }
105
106     try
107     {
108         switch (nbInputArgument(pvApiCtx))
109         {
110                 /* Initial path is given */
111             case 1:
112                 CallJuigetfileForDirectoryWithInitialdirectory(expandedpath);
113                 FREE(expandedpath);
114                 break;
115                 /* Initial path and title are given */
116             case 2:
117                 CallJuigetfileForDirectoryWithInitialdirectoryAndTitle(expandedpath, title);
118                 FREE(expandedpath);
119                 freeAllocatedSingleString(title);
120                 break;
121                 /* Default call with default path and title */
122             default:
123                 CallJuigetfileForDirectoryWithoutInput();
124                 break;
125         }
126
127         /* Read the size of the selection, if 0 then no file selected */
128         nbRow = getJuigetfileSelectionSize();
129         /* Read the selection */
130         userSelection = getJuigetfileSelection();
131     }
132     catch (const GiwsException::JniCallMethodException & exception)
133     {
134         FREE(expandedpath);
135         FREE(title);
136         Scierror(999, "%s: %s\n", fname, exception.getJavaDescription().c_str());
137         return 1;
138     }
139     catch (const GiwsException::JniException & e)
140     {
141         FREE(expandedpath);
142         FREE(title);
143         Scierror(999, _("%s: A Java exception arisen:\n%s"), fname, e.whatStr().c_str());
144         return 1;
145     }
146
147     if (nbRow != 0)
148     {
149         /* The user selected a file --> returns the files names */
150         nbCol = 1;
151
152         sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, nbRow, nbCol, userSelection);
153         if (sciErr.iErr)
154         {
155             Scierror(999, _("%s: Memory allocation error.\n"), fname);
156             return 1;
157         }
158
159         if (userSelection)
160         {
161             for (int i = 0; i < nbRow; i++)
162             {
163                 if (userSelection[i])
164                 {
165                     delete userSelection[i];
166                     userSelection[i] = NULL;
167                 }
168             }
169             delete[]userSelection;
170             userSelection = NULL;
171         }
172     }
173     else
174     {
175         char* empty = "";
176         /* The user canceled the selection --> returns an empty string */
177         sciErr = createMatrixOfString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 1, 1, &empty);
178         if (sciErr.iErr)
179         {
180             printError(&sciErr, 0);
181             Scierror(999, _("%s: Memory allocation error.\n"), fname);
182             return 1;
183         }
184     }
185
186     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
187     returnArguments(pvApiCtx);
188     return 0;
189 }
190
191 /*--------------------------------------------------------------------------*/