Finish to replace sciprint by Scierror when needed in graphics
[scilab.git] / scilab / modules / graphics / sci_gateway / c / sci_xset.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  * 
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at    
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 /*------------------------------------------------------------------------*/
15 /* file: sci_xset.c                                                       */
16 /* desc : interface for xset routine                                      */
17 /*------------------------------------------------------------------------*/
18
19 #include <string.h>
20
21 #include "sci_xset.h"
22 #include "stack-c.h"
23 #include "GetProperty.h"
24 #include "SetProperty.h"
25 #include "ObjectStructure.h"
26 #include "sci_demo.h"
27 #include "BuildObjects.h"
28 #include "gw_graphics.h"
29 #include "DrawObjects.h"
30 #include "InitObjects.h"
31 #include "XsetXgetParameters.h"
32 #include "CurrentObjectsManagement.h"
33 #include "Format.h"
34 #include "ObjectSelection.h"
35 #include "msgs.h"
36 #include "localization.h"
37 #include "Scierror.h"
38 #include "DrawingBridge.h"
39 /*--------------------------------------------------------------------------*/
40 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1) ;
41 /*--------------------------------------------------------------------------*/
42 int sci_xset( char *fname, unsigned long fname_len )
43 {
44   int m1,n1,l1,m2,n2,l2, xm[5],xn[5],x[5], i, v;
45   int lr;
46   double  xx[5];
47   sciPointObj *subwin = NULL; 
48   BOOL keyFound = FALSE ;
49
50   if (Rhs <= 0) {int zero=0; sci_demo(fname,"xsetm();",&zero); return 0; }
51
52   CheckRhs(1,6);
53   CheckLhs(0,1);
54
55   GetRhsVar(1,STRING_DATATYPE,&m1,&n1,&l1);
56
57   for ( i = 0 ; i < NUMSETFONC ; i++ )
58   {
59     if ( strcmp(cstk(l1),KeyTab_[i]) == 0 )
60     {
61       keyFound = TRUE ;
62       break ;
63     }
64   }
65
66   if ( !keyFound )
67   {
68     Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
69     LhsVar(1)=0;
70     return 0;
71   }
72
73   /* Allan CORNET Avril 2004 */
74   /* Bloque la commande xset('window') sans numero de fenetre */
75   if (Rhs == 1 && (strcmp(cstk(l1),"window") == 0) )
76   {
77     Scierror(999, _("%s : '%s' must be set\n"),fname, "window-number");
78     LhsVar(1)=0; return 0;
79   }
80
81   if (Rhs == 2 && VarType(2) != sci_matrix) 
82   {
83     /* second argument is not a scalar it must be a string */ 
84     GetRhsVar(2,STRING_DATATYPE,&m2,&n2,&l2);
85     C2F(xsetg)(cstk(l1),cstk(l2),m1,m2);
86     LhsVar(1)=0; return 0;
87   }
88
89   if (Rhs == 1 && strcmp(cstk(l1),"default") == 0) 
90   {
91     /* first treatment for xsetg : then we continue */
92     C2F(xsetg)(cstk(l1),"void",m1,4L);
93   }
94
95   for ( i = 2 ; i <= Rhs ; i++ ) 
96   {
97     GetRhsVar(i,MATRIX_OF_DOUBLE_DATATYPE,&xm[i-2],&xn[i-2],&lr);
98     x[i - 2] = (int)  *stk(lr); xx[i - 2] = *stk(lr);
99   }
100   if (strcmp(cstk(l1),"wdim") == 0 || strcmp(cstk(l1),"wpdim") == 0) {
101     /* Xwindows limits dimensions to 2^16 */
102     if ( (x[0]>65535)||(x[1]>65535)) {
103       x[0]=Min(x[0],65535);
104       x[1]=Min(x[1],65535);
105       i = 106;v=0;
106       C2F(msgs)(&i,&v);
107     }
108   }
109
110   if (strcmp(cstk(l1),"clipping") == 0)
111   {
112     subwin = sciGetCurrentSubWin() ;
113     sciSetClipping(subwin,xx);
114     sciSetIsClipping(subwin, 1);
115     forceRedraw(subwin);
116   }
117   else if ( strcmp(cstk(l1),"colormap") == 0)
118   {
119     sciSetColormap (sciGetCurrentFigure(), stk(lr), *xm, *xn);
120     sciRedrawFigure();
121   }
122   else if ( strcmp(cstk(l1),"mark size") == 0)
123   {
124
125     subwin = sciGetCurrentSubWin() ;
126     sciSetMarkSizeUnit(subwin,2); /* force switch to tabulated mode : old syntax */
127     subwin = sciGetCurrentSubWin();
128     sciSetMarkSize(subwin,(int)xx[0]);
129     forceRedraw(subwin);
130   }
131   else if ( strcmp(cstk(l1),"mark") == 0)
132   {
133     subwin = sciGetCurrentSubWin();
134     sciSetMarkSizeUnit(subwin,2); /* force switch to tabulated mode : old syntax */
135     sciSetMarkStyle(subwin,(int) xx[0]);
136     sciSetMarkSize(subwin,(int) xx[1]);
137
138     // force mark drawing
139     sciSetIsMark(subwin, TRUE);
140     forceRedraw(subwin);
141   }
142   else if ( strcmp(cstk(l1),"font size") == 0) {
143     double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
144     double fontSize = xx[0];
145     // set also the default subwin font size in order
146     // to have the right font size for labels if they are created
147     sciSetFontSize(getAxesModel(), fontSize);
148     subwin = sciGetCurrentSubWin();
149
150     // restore previous font size
151     sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
152
153     sciSetFontSize(subwin, fontSize);
154     sciSetFontSize(sciGetParent(subwin), fontSize);
155     forceRedraw(subwin);
156   }
157   /* NG beg */
158   else if ( strcmp(cstk(l1),"old_style") == 0)
159   {
160     if (*stk(lr) == 1)
161     {
162       Scierror(999, _("%s: Old graphic mode is no longer available. Please refer to the set help page.\n"),"xset");
163                         LhsVar(1)=0;
164                         return -1;
165     }
166     else if (*stk(lr) != 0)
167     {
168       Scierror(999,"%s: Wrong value for input argument: %d or %d expected.\n",fname,0, 1);
169                         LhsVar(1)=0;
170                         return -1;
171     }
172   }/* NG end */
173   else if( strcmp(cstk(l1),"default") == 0 )
174   {
175     sciPointObj * pfigure = sciGetCurrentFigure();
176     
177
178     /*special treatement for xset default and old_style off F.Leray 23.09.04 */
179     /* mimic clf(gcf(),'reset') behaviour here */
180     sciXbasc();
181
182                 ResetFigureToDefaultValues(pfigure);
183   }
184   else if( strcmp(cstk(l1),"clipgrf") == 0 ) {
185     /* special treatement for xset("cligrf") */
186     sciPointObj * psubwin = sciGetCurrentSubWin();
187     sciSetIsClipping(psubwin,0);
188     forceRedraw(psubwin);
189   }
190   else if( strcmp(cstk(l1),"clipoff") == 0 ) {
191     /* special treatement for xset("clipoff") */
192     sciPointObj * psubwin = sciGetCurrentSubWin();
193     sciSetIsClipping(psubwin,-1);
194     forceRedraw(psubwin);
195   }
196   else if( strcmp(cstk(l1),"hidden3d") == 0 ) {
197     /* special treatement for xset("hidden3d") */
198     sciPointObj * psubwin = sciGetCurrentSubWin();
199     pSUBWIN_FEATURE(psubwin)->hiddencolor = x[0];
200     forceRedraw(psubwin);
201   }
202   else if ( strcmp(cstk(l1),"font") == 0) {
203     int defaultSubwinFontStyle = sciGetFontStyle(getAxesModel());
204     double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
205     int fontStyle = x[0];
206     double fontSize = x[1];
207
208     // set also the default subwin font size in order
209     // to have the right font size for labels if they are created
210     sciSetFontStyle(getAxesModel(), fontStyle);
211     sciSetFontSize(getAxesModel(), fontSize);
212     subwin = sciGetCurrentSubWin();
213
214     // restore previous font size
215     sciSetFontStyle(getAxesModel(), defaultSubwinFontStyle);
216     sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
217
218     sciSetFontStyle(subwin, fontStyle); 
219     sciSetFontSize(subwin,  fontSize);  
220     sciSetFontStyle(sciGetParent(subwin), fontStyle); 
221     sciSetFontSize(sciGetParent(subwin), fontSize);
222     forceRedraw(subwin);
223   } 
224   else if ( strcmp(cstk(l1),"window") == 0 || strcmp(cstk(l1),"figure") == 0 )
225   {
226     if (sciSwitchWindow(x[0]) != 0){
227       Scierror(999,_("%s: Unable to create requested figure: No more memory.\n"), fname);
228     }
229   }
230   else
231   {
232     subwin = sciGetCurrentSubWin();
233     if (( strcmp(cstk(l1),"foreground") == 0) || (strcmp(cstk(l1),"color") == 0) ||( strcmp(cstk(l1),"pattern") == 0) ) {
234       sciSetForeground(subwin, x[0]); 
235       if (sciGetSons((sciPointObj *) subwin) == (sciSons *)NULL) {/* added SS 20.04.04 */
236         /* if subwin is empty, set also the ticscolor and fontforeground */
237         pSUBWIN_FEATURE (subwin)->axes.ticscolor= x[0];
238         sciSetFontForeground(subwin,x[0]); 
239       }
240       forceRedraw(subwin);
241     } 
242     else if ( strcmp(cstk(l1),"background") == 0) {
243       sciSetBackground(subwin, x[0]);
244       forceRedraw(subwin);
245     }  
246     else if ( strcmp(cstk(l1),"thickness") == 0) {
247       sciSetLineWidth(subwin, x[0]); 
248       sciSetLineWidth(sciGetParent(subwin), x[0]);
249       forceRedraw(subwin);
250     } 
251     else if ( strcmp(cstk(l1),"line style") == 0) {
252       sciSetLineStyle(subwin, x[0]); 
253       sciSetLineStyle(sciGetParent(subwin), x[0]);   
254       forceRedraw(subwin);
255     }  
256     else if ( strcmp(cstk(l1),"mark") == 0) {
257       sciSetIsMark(subwin,1);                  /* A REVOIR F.Leray 21.01.05 */
258       sciSetIsMark(sciGetParent(subwin),1);
259       sciSetMarkStyle(subwin,x[0]); 
260       sciSetMarkStyle(sciGetParent(subwin),x[0]);   
261       forceRedraw(subwin);
262     } 
263     else if ( strcmp(cstk(l1),"colormap") == 0) {
264       sciSetColormap(sciGetParent(subwin), stk(lr),xm[0], xn[0]);
265     }
266     else if ( strcmp(cstk(l1),"dashes") == 0) {
267       sciSetLineStyle(subwin, x[0]); 
268       sciSetLineStyle(sciGetParent(subwin), x[0]);
269       forceRedraw(subwin);
270     }
271     else if ( strcmp(cstk(l1),"alufunction") == 0) {
272       sciSetXorMode(subwin, x[0]); 
273       sciSetXorMode(sciGetParent(subwin), x[0]);
274     }
275     else if ( strcmp(cstk(l1),"auto clear") == 0) {
276       if ( x[0] == 1 )
277       {
278         sciSetAddPlot(subwin, TRUE); 
279         sciSetAddPlot(sciGetParent(subwin), TRUE);  
280       }
281       else  
282       {
283         sciSetAddPlot(subwin, FALSE); 
284         sciSetAddPlot(sciGetParent(subwin), FALSE);  
285       }
286       forceRedraw(subwin);
287     } 
288     else if ( strcmp(cstk(l1),"auto scale") == 0) {
289       if ( x[0] == 1 )
290       {
291         sciSetAutoScale(subwin, TRUE); 
292         sciSetAutoScale(sciGetParent(subwin), TRUE);  
293       }
294       else  
295       {
296         sciSetAutoScale(subwin, FALSE); 
297         sciSetAutoScale(sciGetParent(subwin), FALSE);  
298       }
299       forceRedraw(subwin);
300     }
301     else if ( strcmp(cstk(l1),"wresize") == 0) {
302       if ( x[0] == 1 )
303       {
304         sciSetResize(subwin, TRUE); 
305         sciSetResize(sciGetParent(subwin), TRUE);  
306       }
307       else  
308       {
309         sciSetResize(subwin, FALSE); 
310         sciSetResize(sciGetParent(subwin), FALSE);  
311       }
312       forceRedraw(subwin);
313     }
314     else if ( strcmp(cstk(l1),"wpos") == 0) {
315       sciSetScreenPosition(sciGetParent(subwin), x[0], x[1]);
316     }
317     else if ( strcmp(cstk(l1),"wpdim") == 0) {
318       sciSetWindowDim(sciGetParent(subwin), x[0], x[1] ) ;
319     } 
320     else if ( strcmp(cstk(l1),"wdim") == 0) {
321       sciSetDimension(sciGetParent(subwin), x[0], x[1] ) ;
322
323     } /*Ajout A.Djalel le 10/11/03 */
324     else if ( strcmp(cstk(l1),"pixmap") == 0) {
325       sciSetPixmapMode(sciGetParent(subwin), x[0]);
326     }
327     else if ( strcmp(cstk(l1),"wshow") == 0) { /* a supprimer ce n'est pas une propriete mais une action */
328       showPixmap(sciGetParentFigure(subwin));
329     }
330     else if (strcmp(cstk(l1),"viewport") == 0) {
331       int viewport[4] = {x[0], x[1], 0, 0};
332       sciSetViewport(sciGetParentFigure(subwin), viewport);
333     }
334     else if (strcmp(cstk(l1),"wwpc") == 0) {
335       // clear pixmap
336       clearPixmap(sciGetParentFigure(subwin));
337     }
338     else if(strcmp(cstk(l1),"line mode") == 0)
339     {
340       if (x[0] == 0)
341       {
342         sciSetIsLine(subwin, FALSE);
343       }
344       else
345       {
346         sciSetIsLine(subwin, TRUE);
347       }
348       forceRedraw(subwin);
349     }
350     else
351     {
352       Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
353                         LhsVar(1)=0;
354                         return 0;
355     }
356
357     if(strcmp(cstk(l1),"window") != 0 && strcmp(cstk(l1),"wshow") != 0)
358     {
359       // for wshow redraw already done
360       sciRedrawFigure();
361     }
362   }
363    
364   LhsVar(1)=0;
365   return 0;
366 }
367 /*--------------------------------------------------------------------------*/
368 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1)
369 {
370   if ( strcmp(str,"fpf") == 0) 
371   {
372     strcpy(getFPF(),str1);
373   }
374   else if ( strcmp(str,"auto clear")==0) 
375   {
376     sciPointObj * subwin = sciGetFirstTypedSelectedSon(sciGetCurrentFigure(), SCI_SUBWIN);
377     if (strcmp(str1,"on")==0 )
378     {
379       sciSetAddPlot( subwin,FALSE);
380     }
381     else{
382       sciSetAddPlot( subwin,TRUE);
383     }
384     forceRedraw(subwin);
385   }
386   else if ( strcmp(str,"default")==0)
387   {
388     getFPF()[0]='\0';
389   }
390   else 
391   {
392     Scierror(999, _("%s: Unrecognized input argument '%s'.\n"),"xset(arg,<string>)",str);
393                 return -1;
394   }
395   return 0;
396 }
397 /*--------------------------------------------------------------------------*/