Initial step :
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_rubberbox.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008 - INRIA - Jean-Baptiste Silvy
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 /*------------------------------------------------------------------------*/
14 /* file: sci_rubberbox.c                                                  */
15 /* desc : interface for rubberbox routine                                 */
16 /*------------------------------------------------------------------------*/
17 #include "gw_graphics.h"
18 #include "stack-c.h"
19 #include "localization.h"
20 #include "getPropertyAssignedValue.h"
21 #include "Scierror.h"
22 #include "Interaction.h"
23
24 /*--------------------------------------------------------------------------*/
25 static int getInitialRectangle(double initRect[4]);
26 static int getEditionMode(int rhsPos);
27 static int returnRectAndButton(const double selectedRect[4], int button);
28 /*--------------------------------------------------------------------------*/
29 static int getInitialRectangle(double initRect[4])
30 {
31   int rectNbRow = 0;
32   int rectNbCol = 0;
33   int rectStackPointer = 0;
34         int i;
35         int nbDims;
36         double * rect;
37
38         /* Initial rect is always in first position */
39   GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE,&rectNbRow,&rectNbCol,&rectStackPointer);
40
41         /* We have found a matrix of double within the parameters check its dims */
42   nbDims = rectNbCol * rectNbRow;
43   if (nbDims != 2 && nbDims != 4)
44   {
45     return -1;
46   }
47
48
49   /* pointer on the stack */
50   rect = getDoubleMatrixFromStack(rectStackPointer);
51
52         /* intialize to 0 */
53   for (i = 0; i < 4; i++)
54   {
55     initRect[i] = 0.0;
56   }
57
58   /* Set specified values */
59   for (i = 0; i < nbDims; i++)
60   {
61     initRect[i] = rect[i];
62   }
63         return 1;
64 }
65 /*--------------------------------------------------------------------------*/
66 static int getEditionMode(int rhsPos)
67 {
68         int stackPointer = 0;
69         int nbRow = 0;
70         int nbCol = 0;
71         BOOL isEditionModeOn;
72         GetRhsVar(rhsPos,MATRIX_OF_BOOLEAN_DATATYPE,&nbRow,&nbCol,&stackPointer);
73
74         if (nbRow * nbCol != 1)
75         {
76     return -1;
77         }
78
79         isEditionModeOn = *istk(stackPointer);
80         if (isEditionModeOn)
81         {
82                 return 1;
83         }
84         else
85         {
86                 return 0;
87         }
88
89 }
90 /*--------------------------------------------------------------------------*/
91 static int returnRectAndButton(const double selectedRect[4], int button)
92 {
93   int selectedRectSize = 4;
94   int one = 1;
95   int rectStackPointer = 0;
96   int i;
97
98   /* return rectangle */
99   CreateVar(Rhs + 1, MATRIX_OF_DOUBLE_DATATYPE, &one, &selectedRectSize, &rectStackPointer);
100   for ( i = 0; i < selectedRectSize; i++)
101   {
102     stk(rectStackPointer)[i] = selectedRect[i];
103   }
104   LhsVar(1) = Rhs + 1;
105
106   /* return button */
107   if (Lhs >= 2)
108   {
109     int buttonStackPointer = 0;
110     CreateVar(Rhs + 2, MATRIX_OF_DOUBLE_DATATYPE, &one, &one, &buttonStackPointer);
111     *stk(buttonStackPointer) = button;
112     LhsVar(2) = Rhs + 2;
113   }
114
115   C2F(putlhsvar)();
116   return 0;
117 }
118 /*--------------------------------------------------------------------------*/
119 int sci_rubberbox(char * fname, unsigned long fname_len)
120 {
121
122   /* [final_rect, btn] = rubberbox([initial_rect],[edition_mode]) */
123
124   int button = 0;
125   double selectedRect[4];
126
127   CheckRhs(0,2);
128   CheckLhs(1,2);
129
130         if (Rhs == 0)
131         {
132                 /* rubberbox() */
133                 rubberBox(sciGetCurrentSubWin(), TRUE, NULL, selectedRect, &button);
134         }
135         else if (Rhs == 1)
136         {
137                 /* rubberbox(initial_rect) or rubberbox(edition_mode) */
138                 if (GetType(1) == sci_matrix)
139                 {
140                         /* rubberbox(initial_rect) */
141                         /* Default values, intial rect and edition mode to false */
142                         double initialRect[4] = {0.0, 0.0, 0.0, 0.0};
143
144                         if (getInitialRectangle(initialRect) == 1)
145                         {
146                                 rubberBox(sciGetCurrentSubWin(), TRUE, initialRect, selectedRect, &button);
147                         }
148                         else
149                         {
150                                 Scierror(999, _("%s: Wrong size for input argument #%d: Vector of size %d or %d expected.\n"), fname, 1, 2, 4);
151                                 return -1;
152                         }
153                 }
154                 else if (GetType(1) == sci_boolean)
155                 {
156                         /* rubberbox(editionMode) */
157                         int editionModeStatus = getEditionMode(1);
158                         if (editionModeStatus == 1)
159                         {
160                                 /* rubberbox(%t) */
161                                 rubberBox(sciGetCurrentSubWin(), FALSE, NULL, selectedRect, &button);
162                         }
163                         else if (editionModeStatus == 0)
164                         {
165                                 /* rubberbox(%f) */
166                                 rubberBox(sciGetCurrentSubWin(), TRUE, NULL, selectedRect, &button);
167                         }
168                         else
169                         {
170                                 Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected\n."), fname, 1);
171                                 return -1;
172                         }
173                 }
174                 else
175                 {
176                         /* Wrong parameter specified, neither edition mode nor intial rect */
177                         Scierror(999, _("%s: Wrong type for input argument #%d: Real row vector or a boolean expected.\n"), fname, 1);
178                         return -1;
179                 }
180         }
181         else if (Rhs == 2)
182         {
183                 /* rubberbox(initial_rect, edition_mode) */
184
185                 /* Default values, intial rect and edition mode to false */
186                 double initialRect[4] = {0.0, 0.0, 0.0, 0.0};
187                 int editionModeStatus;
188
189                 if (GetType(1) != sci_matrix)
190                 {
191                         Scierror(999, _("%s: Wrong type for input argument #%d: Real row vector expected.\n"), fname, 1);
192                         return -1;
193                 }
194
195                 if (GetType(2) != sci_boolean)
196                 {
197                         Scierror(999, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), fname, 2);
198                         return -1;
199                 }
200
201                 /* Getting initial rect */
202                 if(getInitialRectangle(initialRect) != 1)
203                 {
204                         Scierror(999, _("%s: Wrong size for input argument #%d: Vector of size %d or %d expected.\n"), fname, 1, 2, 4);
205                         return -1;
206                 }
207
208                 /* Getting edition mode */
209                 editionModeStatus = getEditionMode(2);
210
211                 if (editionModeStatus == 1)
212                 {
213                         /* rubberbox(initial_rect, %t) */
214                         rubberBox(sciGetCurrentSubWin(), FALSE, initialRect, selectedRect, &button);
215                 }
216                 else if (editionModeStatus == 0)
217                 {
218                         /* rubberbox(initial_rect, %f) */
219                         rubberBox(sciGetCurrentSubWin(), TRUE, initialRect, selectedRect, &button);
220                 }
221                 else
222                 {
223                         Scierror(999, _("%s: Wrong size for input argument #%d: A boolean expected\n."), fname, 2);
224                         return -1;
225                 }
226
227         }
228
229
230   /* Put values into the stack and return */
231   return returnRectAndButton(selectedRect, button);
232 }
233
234 /*--------------------------------------------------------------------------*/