fix xclick
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_xclick.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
5  * Copyright (C) 2007 - INRIA - Vincent Couvert
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 /* file: sci_xclick.c                                                     */
17 /* desc : interface for xclick routine                                    */
18 /*------------------------------------------------------------------------*/
19
20 #include <string.h>
21 #include "gw_graphics.h"
22 #include "api_scilab.h"
23 #include "Scierror.h"
24 #include "localization.h"
25 #include "CallJxclick.h"
26 #include "GetProperty.h"
27 #include "FigureList.h"
28 #include "axesScale.h"
29 #include "HandleManagement.h"
30 #include "BuildObjects.h"
31 #include "CurrentSubwin.h"
32
33 #include "graphicObjectProperties.h"
34 #include "getGraphicObjectProperty.h"
35
36 /*--------------------------------------------------------------------------*/
37 int sci_xclick(char *fname, void *pvApiCtx)
38 {
39     SciErr sciErr;
40
41     double* rep = NULL;
42     int one = 1, three = 3;
43     int istr = 0;
44     //int iflag = 0;
45
46     int mouseButtonNumber = 0;
47     char * menuCallback = NULL;
48     int iWindowUID = 0;
49     int pixelCoords[2];
50     double userCoords2D[2];
51
52     int iFigureId = 0;
53     int *piFigureId = &iFigureId;
54
55     CheckInputArgument(pvApiCtx, -1, 1);
56     CheckOutputArgument(pvApiCtx, 1, 5);
57
58     //iflag = (nbInputArgument(pvApiCtx) >= 1) ? 1 :0;
59
60     // Select current figure or create it
61     getOrCreateDefaultSubwin();
62
63     // Call Java xclick
64     CallJxclick();
65
66     // Get return values
67     mouseButtonNumber = getJxclickMouseButtonNumber();
68     pixelCoords[0] = (int) getJxclickXCoordinate();
69     pixelCoords[1] = (int) getJxclickYCoordinate();
70     iWindowUID = getJxclickWindowID();
71     menuCallback = getJxclickMenuCallback();
72
73     // Convert pixel coordinates to user coordinates
74     // Conversion is not done if the user clicked on a menu (pixelCoords[*] == -1)
75     if (pixelCoords[0] != -1 && pixelCoords[1] != -1)
76     {
77         int iClickedSubwinUID = getCurrentSubWin();
78         sciGet2dViewCoordFromPixel(iClickedSubwinUID, pixelCoords, userCoords2D);
79     }
80     else
81     {
82         userCoords2D[0] = pixelCoords[0];
83         userCoords2D[1] = pixelCoords[1];
84     }
85
86     if (nbOutputArgument(pvApiCtx) == 1)
87     {
88         AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
89
90         sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, one, three, &rep);
91         if (sciErr.iErr)
92         {
93             printError(&sciErr, 0);
94             Scierror(999, _("%s: Memory allocation error.\n"), fname);
95             return 1;
96         }
97
98         rep[0] = (double) mouseButtonNumber;
99         rep[1] = userCoords2D[0];
100         rep[2] = userCoords2D[1];
101     }
102     else
103     {
104         AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1;
105
106         sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 1, one, one, &rep);
107         if (sciErr.iErr)
108         {
109             printError(&sciErr, 0);
110             Scierror(999, _("%s: Memory allocation error.\n"), fname);
111             return 1;
112         }
113
114         rep[0] = (double) mouseButtonNumber;
115     }
116
117     if (nbOutputArgument(pvApiCtx) >= 2)
118     {
119         AssignOutputVariable(pvApiCtx, 2) = nbInputArgument(pvApiCtx) + 2;
120
121         sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 2, one, one, &rep);
122         if (sciErr.iErr)
123         {
124             printError(&sciErr, 0);
125             Scierror(999, _("%s: Memory allocation error.\n"), fname);
126             return 1;
127         }
128
129         rep[0] = userCoords2D[0];
130     }
131
132     if (nbOutputArgument(pvApiCtx) >= 3)
133     {
134         AssignOutputVariable(pvApiCtx, 3) = nbInputArgument(pvApiCtx) + 3;
135         // YOU MUST REMOVE YOUR VARIABLE DECLARATION "int rep".
136         sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 3, one, one, &rep);
137         if (sciErr.iErr)
138         {
139             printError(&sciErr, 0);
140             Scierror(999, _("%s: Memory allocation error.\n"), fname);
141             return 1;
142         }
143
144         rep[0] = userCoords2D[1];
145     }
146
147     if (nbOutputArgument(pvApiCtx) >= 4)
148     {
149         AssignOutputVariable(pvApiCtx, 4) = nbInputArgument(pvApiCtx) + 4;
150
151         sciErr = allocMatrixOfDouble(pvApiCtx, nbInputArgument(pvApiCtx) + 4, one, one, &rep);
152         if (sciErr.iErr)
153         {
154             printError(&sciErr, 0);
155             Scierror(999, _("%s: Memory allocation error.\n"), fname);
156             return 1;
157         }
158
159         getGraphicObjectProperty(iWindowUID, __GO_ID__, jni_int, (void**)&piFigureId);
160         rep[0] = (double) iFigureId;
161     }
162
163     if (nbOutputArgument(pvApiCtx) >= 5)
164     {
165         char *strRep  = NULL;
166         AssignOutputVariable(pvApiCtx, 5) = nbInputArgument(pvApiCtx) + 5;
167         istr = (int)strlen(menuCallback);
168
169         if (allocSingleString(pvApiCtx, nbInputArgument(pvApiCtx) + 5, istr * one, &strRep))
170         {
171             Scierror(999, _("%s: Memory allocation error.\n"), fname);
172             return 1;
173         }
174         strncpy(strRep, menuCallback, istr);
175     }
176
177     deleteJxclickString(menuCallback);
178
179     ReturnArguments(pvApiCtx);
180
181     return 0;
182 }
183 /*--------------------------------------------------------------------------*/