Finish to replace sciprint by Scierror when needed in graphics
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_zoom_rect.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2006 - ENPC - Jean-Philipe Chancelier
4  * Copyright (C) 2006 - INRIA - Fabrice Leray
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
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-en.txt
12  *
13  */
14
15 /*------------------------------------------------------------------------*/
16 /* file: sci_zoom_rect.c                                                  */
17 /* desc : interface for zoom_rect routine                                 */
18 /*------------------------------------------------------------------------*/
19
20 #include "sci_zoom_rect.h"
21 #include "stack-c.h"
22 #include "getPropertyAssignedValue.h"
23 #include "BuildObjects.h"
24 #include "gw_graphics.h"
25 #include "axesScale.h"
26 #include "DrawingBridge.h"
27 #include "CurrentObjectsManagement.h"
28 #include "GraphicSynchronizerInterface.h"
29 #include "Interaction.h"
30 #include "localization.h"
31 #include "Scierror.h"
32 #include "getPropertyAssignedValue.h"
33 #include "GetProperty.h"
34 #include "SetPropertyStatus.h"
35
36 /*--------------------------------------------------------------------------*/
37 static sciPointObj * getZoomedObject(const char * fname);
38 static BOOL getZoomRect(const char * fname, int attribPos, double rect[4]);
39 /*--------------------------------------------------------------------------*/
40 /**
41  * Get the [xmin, ymin, xmax, ymax] vector specified as input argument
42  * @param fname name of the calling function for error messages
43  * @param attribPos position of the argument within the rhs (1 or 2)
44  * @param[out] rect retrieved rectangle
45  * @return TRUE if the rect could be retrieved, false otherwise
46  */
47 static BOOL getZoomRect(const char * fname, int attribPos, double rect[4])
48 {
49   int nbRow;
50   int nbCol;
51   size_t stackPointer = 0;
52   int i;
53   double * rectVect;
54   GetRhsVar(attribPos, MATRIX_OF_DOUBLE_DATATYPE, &nbRow, &nbCol, &stackPointer);
55
56   if (nbRow * nbCol != 4)
57   {
58     if (attribPos == 1)
59     {
60       Scierror(999, _("%s: Wrong size for input argument #%d: Vector of size %d expected.\n"), fname, 1, 4);
61     }
62     else
63     {
64       Scierror(999, _("%s: Wrong size for input argument #%d: Vector of size %d expected.\n"), fname, 2, 4);
65     }
66     return FALSE;
67   }
68
69   rectVect = getDoubleMatrixFromStack(stackPointer);
70   for (i = 0; i < 4; i++)
71   {
72     rect[i] = rectVect[i];
73   }
74
75   return TRUE;
76
77 }
78 /*--------------------------------------------------------------------------*/
79 /**
80  * Return the handle passed as input argument if one exists
81  * @param fname of the function for errors
82  * @return NULL if the input argument is not correct,
83  *              the object to zoom otherwise
84  */
85 static sciPointObj * getZoomedObject(const char * fname)
86 {
87   int nbRow;
88   int nbCol;
89   size_t stackPointer = 0;
90   sciPointObj * res = NULL;
91   /* if a handle is specified it must be the first input argument */
92   GetRhsVar(1, GRAPHICAL_HANDLE_DATATYPE, &nbRow, &nbCol, &stackPointer);
93
94   /* check that there is only a single Figre or subwin */
95   if (nbRow * nbCol != 1)
96   {
97     Scierror(999, _("%s: Wrong size for input argument #%d: Single handle expected.\n"), fname, 1);
98     return NULL;
99   }
100
101   res = sciGetPointerFromHandle(getHandleFromStack(stackPointer));
102
103   if (sciGetEntityType(res) != SCI_SUBWIN && sciGetEntityType(res) != SCI_FIGURE)
104   {
105     Scierror(999, _("%s: Wrong type for input argument #%d: Figure or Axes handle expected.\n"), fname, 1);
106     return NULL;
107   }
108
109   /* chack bounds */
110
111
112   return res;
113
114
115 }
116 /*--------------------------------------------------------------------------*/
117 int sci_zoom_rect(char *fname,unsigned long fname_len)
118 {
119   CheckRhs(0,2) ;
120   CheckLhs(0,1) ;
121   if (Rhs == 0) 
122   {
123     /* zoom_rect() */
124     sciDefaultInteractiveZoom();
125   }
126   else if (Rhs == 1)
127   {
128     /* zoom_rect([xmin,ymin,xmax,ymax]) or zoom_rect(handle) */
129     /* with handle a figure or subwindow */
130     if (GetType(1) == sci_handles)
131     {
132       sciPointObj * zoomedObject = getZoomedObject(fname);
133       if (zoomedObject == NULL)
134       {
135         LhsVar(1)=0; 
136         return -1;
137       }
138       sciInteractiveZoom(zoomedObject);
139     }
140     else if (GetType(1) == sci_matrix)
141     {
142       double rect[4];
143       if (getZoomRect(fname, 1, rect))
144       {
145         /* rectangle found */
146         int status = sciDefaultZoom2D(rect);
147         if (status == SET_PROPERTY_ERROR)
148         {
149           /* error on rectangle bounds */
150           Scierror(999, _("%s: Wrong value for input argument #%d: Specified bounds are not correct.\n"), fname, 1);
151           LhsVar(1)=0; 
152           return -1;
153         }
154       }
155       else
156       {
157         /* error on rectagle definition */
158         LhsVar(1)=0; 
159         return -1;
160       }
161     }
162     else
163     {
164       Scierror(999, _("%s: Wrong type for input argument #%d: Handle or vector of double expected.\n"), fname, 1);
165       LhsVar(1)=0; 
166       return 0;
167     }
168   }
169   else if (Rhs == 2)
170   {
171     /* zoom_rect(handle, [xmin,ymin,xmax,ymax]) */
172
173     double rect[4];
174     sciPointObj * zoomedObject = NULL;
175
176     if (GetType(1) != sci_handles || GetType(2) != sci_matrix)
177     {
178       Scierror(999, _("%s: Wrong type for input arguments: Handle or vector of double expected.\n"), fname);
179       LhsVar(1)=0; 
180       return -1;
181     }
182
183     zoomedObject = getZoomedObject(fname);
184     if (zoomedObject == NULL || !getZoomRect(fname, 2, rect))
185     {
186       LhsVar(1)=0; 
187       return -1;
188     }
189
190     if (sciZoomRect(zoomedObject, rect) == SET_PROPERTY_ERROR)
191     {
192       /* error on rectangle bounds */
193       Scierror(999, _("%s: Error on input argument #%d: Specified bounds are not correct.\n"), fname, 1);
194       LhsVar(1)=0; 
195       return -1;
196     }
197   }
198
199   LhsVar(1)=0; 
200   return 0;
201
202 /*--------------------------------------------------------------------------*/