CID #1098686, #1098693 Fixed
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_mpopup.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Vincent COUVERT
4  * Copyright (C) 2012 - Scilab Enterprises - Vincent COUVERT
5  *
6  * (temporary function waiting for uicontextmenu function)
7  *
8  * Copyright (C) 2012 - 2016 - Scilab Enterprises
9  *
10  * This file is hereby licensed under the terms of the GNU GPL v2.0,
11  * pursuant to article 5.3.4 of the CeCILL v.2.1.
12  * This file was originally licensed under the terms of the CeCILL v2.1,
13  * and continues to be available under such terms.
14  * For more information, see the COPYING file which you should have received
15  * along with this program.
16  *
17  */
18
19 #include <stdio.h>
20 #include <string.h>
21 /*--------------------------------------------------------------------------*/
22 #include "gw_gui.h"
23 #include "api_scilab.h"
24 #include "localization.h"
25 #include "ContextMenu.h"
26 #include "Scierror.h"
27 #include "createGraphicObject.h"
28 #include "graphicObjectProperties.h"
29 #include "setGraphicObjectProperty.h"
30 #include "configvariable_interface.h"
31 #include "sciprint.h"
32 #include "Sciwarning.h"
33 /*--------------------------------------------------------------------------*/
34 int sci_mpopup(char *fname, void* pvApiCtx)
35 {
36     SciErr sciErr;
37     int* piAddr = NULL;
38     int iRet = 0;
39     int iRows = 0;
40     int iCols = 0;
41     int iMenuitemIndex = 0;
42
43     char *pstRes = NULL;
44     int iUicontextmenuUID = 0;
45     int iMenuitemUID = 0;
46     char **pstAllMenuLabels = NULL;
47
48     CheckInputArgument(pvApiCtx, 1, 1);
49     CheckOutputArgument(pvApiCtx, 0, 1);
50
51     if (getWarningMode())
52     {
53         sciprint(_("%s: Feature %s is obsolete.\n"), _("Warning"), fname);
54         sciprint(_("%s: Please use %s instead.\n"), _("Warning"), "uicontextmenu");
55         Sciwarning(_("%s: This feature will be permanently removed in Scilab %s\n\n"), _("Warning"), "5.4.1");
56     }
57
58     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
59     if (sciErr.iErr)
60     {
61         printError(&sciErr, 0);
62         return 0;
63     }
64
65     if (isStringType(pvApiCtx, piAddr))
66     {
67         iRet = getAllocatedMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, &pstAllMenuLabels);
68         if (iRet)
69         {
70             freeAllocatedMatrixOfString(iRows, iCols, pstAllMenuLabels);
71             return iRet;
72         }
73         if ((iRows != 1) && (iCols != 1))
74         {
75             Scierror(999, _("%s: Wrong size for input argument #%d: A string vector expected.\n"), fname, 1);
76             freeAllocatedMatrixOfString(iRows, iCols, pstAllMenuLabels);
77             return FALSE;
78         }
79     }
80     else
81     {
82         Scierror(999, _("%s: Wrong type for input argument #%d: A string vector expected.\n"), fname, 1);
83         return FALSE;
84     }
85
86     /* Create an uicontextmenu */
87     iUicontextmenuUID = createGraphicObject(__GO_UICONTEXTMENU__);
88     if (iUicontextmenuUID != 0)
89     {
90         for (iMenuitemIndex = 0; iMenuitemIndex < iRows * iCols; iMenuitemIndex++)
91         {
92             // Create sub-menus
93             iMenuitemUID = createGraphicObject(__GO_UIMENU__);
94             setGraphicObjectProperty(iMenuitemUID, __GO_UI_LABEL__, pstAllMenuLabels[iMenuitemIndex], jni_string, 1);
95             setGraphicObjectRelationship(iUicontextmenuUID, iMenuitemUID);
96         }
97     }
98
99     pstRes = uiWaitContextMenu(iUicontextmenuUID);
100
101     iRet = createSingleString(pvApiCtx, nbInputArgument(pvApiCtx) + 1, pstRes);
102     FREE(pstRes);
103     if (iRet)
104     {
105         freeAllocatedMatrixOfString(iRows, iCols, pstAllMenuLabels);
106         return iRet;
107     }
108
109     freeAllocatedMatrixOfString(iRows, iCols, pstAllMenuLabels);
110
111     AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
112
113     ReturnArguments(pvApiCtx);
114
115     return TRUE;
116 }
117 /*--------------------------------------------------------------------------*/