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