5c902b62adbbf3d5279c3766787c4708aa11d604
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_messagebox.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 "CallMessageBox.h"
17 #include "Scierror.h"
18 #include "getPropertyAssignedValue.h"
19 #include "stricmp.h"
20 #include "messageboxoptions.h"
21
22 /*--------------------------------------------------------------------------*/
23 int sci_messagebox(char *fname, unsigned long fname_len)
24 {
25     int messageBoxID = 0;
26
27     /* Used to read input arguments */
28     int nbRow = 0, nbCol = 0;
29     int nbRowButtons = 0, nbColButtons = 0;
30     int nbRowMessage = 0, nbColMessage = 0;
31
32     char **buttonsTextAdr = 0;
33     char **messageAdr = 0;
34     char **titleAdr = 0;
35     char **modalOptionAdr = 0;
36     char **iconAdr = 0;
37
38     /* Used to write output argument */
39     int buttonNumberAdr = 0;
40     int buttonNumber = 0;
41
42     CheckRhs(1, 5);
43     CheckLhs(0, 1);
44
45     /* Message to be displayed */
46     if (VarType(1) == sci_strings)
47     {
48         GetRhsVar(1, MATRIX_OF_STRING_DATATYPE, &nbRowMessage, &nbColMessage, &messageAdr);
49     }
50     else
51     {
52         Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 1);
53         return FALSE;
54     }
55
56     /* Title to be displayed */
57     if (Rhs >= 2)
58     {
59         if (VarType(2) == sci_strings)
60         {
61             GetRhsVar(2, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &titleAdr);
62             if (nbRow * nbCol != 1)
63             {
64                 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 2);
65                 return FALSE;
66             }
67             /* The title argument can be used to give the modal option */
68             if (isModalOption(titleAdr[0]))
69             {
70                 modalOptionAdr = titleAdr;
71                 titleAdr = NULL;
72             }
73         }
74         else
75         {
76             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
77             return FALSE;
78         }
79     }
80
81     /* Icon to be displayed */
82     if (Rhs >= 3)
83     {
84         if (VarType(3) == sci_strings)
85         {
86             GetRhsVar(3, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &iconAdr);
87             if (nbRow * nbCol == 1)
88             {
89                 /* The icon argument can be used to give the modal option or the buttons names */
90                 if (isModalOption(iconAdr[0]))
91                 {
92                     modalOptionAdr = (char **)iconAdr;
93                     iconAdr = NULL;
94                 }
95                 else if (!isIconName(iconAdr[0]))
96                 {
97                     buttonsTextAdr = (char **)iconAdr;
98                     nbRowButtons = nbRow;
99                     nbColButtons = nbCol;
100                     iconAdr = NULL;
101                 }
102             }
103             else  /* More than one string --> buttons names */
104             {
105                 buttonsTextAdr = (char **)iconAdr;
106                 nbRowButtons = nbRow;
107                 nbColButtons = nbCol;
108                 iconAdr = NULL;
109             }
110
111         }
112         else
113         {
114             Scierror(999, _("%s: Wrong type for input argument #%d: A string or a string vector expected.\n"), fname, 3);
115             return FALSE;
116         }
117     }
118
119     /* Buttons names */
120     if (Rhs >= 4)
121     {
122         if (VarType(4) == sci_strings)
123         {
124             GetRhsVar(4, MATRIX_OF_STRING_DATATYPE, &nbRowButtons, &nbColButtons, &buttonsTextAdr);
125             if (nbRow * nbCol == 1)
126             {
127                 /* The buttons names argument can be used to give the modal option */
128                 if (isModalOption(buttonsTextAdr[0]))
129                 {
130                     modalOptionAdr = buttonsTextAdr;
131                     buttonsTextAdr = NULL;
132                 }
133             }
134         }
135         else
136         {
137             Scierror(999, _("%s: Wrong type for input argument #%d: A string or a string vector expected.\n"), fname, 3);
138             return FALSE;
139         }
140     }
141
142     /* Modal option */
143     if (Rhs == 5)
144     {
145         if (VarType(5) == sci_strings)
146         {
147             GetRhsVar(5, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &modalOptionAdr);
148             if (nbRow * nbCol != 1)
149             {
150                 Scierror(999, _("%s: Wrong size for input argument #%d: A string expected.\n"), fname, 5);
151                 return FALSE;
152             }
153         }
154         else
155         {
156             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 5);
157             return FALSE;
158         }
159     }
160     /* Create the Java Object */
161     messageBoxID = createMessageBox();
162
163     /* Message */
164     setMessageBoxMultiLineMessage(messageBoxID, messageAdr, nbColMessage * nbRowMessage);
165
166     /* Title */
167     if (titleAdr != NULL)
168     {
169         setMessageBoxTitle(messageBoxID, titleAdr[0]);
170     }
171     else
172     {
173         setMessageBoxTitle(messageBoxID, _("Scilab Message"));
174     }
175
176     /* Icon */
177     if (iconAdr != NULL)
178     {
179         setMessageBoxIcon(messageBoxID, iconAdr[0]);
180     }
181
182     /* Buttons */
183     if (buttonsTextAdr != NULL)
184     {
185         setMessageBoxButtonsLabels(messageBoxID, buttonsTextAdr, nbColButtons * nbRowButtons);
186     }
187
188     /* Modal ? */
189     if (modalOptionAdr != NULL)
190     {
191         setMessageBoxModal(messageBoxID, !stricmp(modalOptionAdr[0], "modal"));
192     }
193     else
194     {
195         setMessageBoxModal(messageBoxID, FALSE);
196     }
197
198     /* Display it and wait for a user input */
199     messageBoxDisplayAndWait(messageBoxID);
200
201     /* Return the index of the button selected */
202
203     if (Lhs == 1)
204     {
205         /* Read the user answer */
206         buttonNumber = getMessageBoxSelectedButton(messageBoxID);
207
208         nbRow = 1;
209         nbCol = 1;
210         CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &buttonNumberAdr);
211         *stk(buttonNumberAdr) = buttonNumber;
212
213         LhsVar(1) = Rhs + 1;
214     }
215     else
216     {
217         LhsVar(1) = 0;
218     }
219
220     PutLhsVar();
221     return TRUE;
222 }
223 /*--------------------------------------------------------------------------*/