c7291ac4bd074dbbd5c95245932cc40d90599abc
[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 "gw_graphics.h"
20 #include "stack-c.h"
21 #include "GetProperty.h"
22 #include "SetProperty.h"
23 #include "DrawObjects.h"
24 #include "InitObjects.h"
25 #include "XsetXgetParameters.h"
26 #include "CurrentObjectsManagement.h"
27 #include "Format.h"
28 #include "ObjectSelection.h"
29 #include "msgs.h"
30 #include "localization.h"
31 #include "Scierror.h"
32 #include "DrawingBridge.h"
33 #include "HandleManagement.h"
34 /*--------------------------------------------------------------------------*/
35 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1) ;
36 /*--------------------------------------------------------------------------*/
37 int sci_xset( char *fname, unsigned long fname_len )
38 {
39   int m1,n1,l1,m2,n2,l2, xm[5],xn[5],x[5], i, v;
40   int lr;
41   double  xx[5];
42   sciPointObj *subwin = NULL; 
43   BOOL keyFound = FALSE ;
44
45   if (Rhs <= 0)
46         {
47                 sci_demo(fname, fname_len);
48                 return 0;
49         }
50
51   CheckRhs(1,6);
52   CheckLhs(0,1);
53
54   GetRhsVar(1,STRING_DATATYPE,&m1,&n1,&l1);
55
56   for ( i = 0 ; i < NUMSETFONC ; i++ )
57   {
58     if ( strcmp(cstk(l1),KeyTab_[i]) == 0 )
59     {
60       keyFound = TRUE ;
61       break ;
62     }
63   }
64
65   if ( !keyFound )
66   {
67     Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
68     return 0;
69   }
70
71   /* Allan CORNET Avril 2004 */
72   /* Bloque la commande xset('window') sans numero de fenetre */
73   if (Rhs == 1 && (strcmp(cstk(l1),"window") == 0) )
74   {
75     Scierror(999, _("%s : '%s' must be set\n"),fname, "window-number");
76                 return 0;
77   }
78
79   if (Rhs == 2 && VarType(2) != sci_matrix) 
80   {
81     /* second argument is not a scalar it must be a string */ 
82     GetRhsVar(2,STRING_DATATYPE,&m2,&n2,&l2);
83     C2F(xsetg)(cstk(l1),cstk(l2),m1,m2);
84                 LhsVar(1)=0;
85                 C2F(putlhsvar)();
86     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                         return -1;
164     }
165     else if (*stk(lr) != 0)
166     {
167       Scierror(999,"%s: Wrong value for input argument: %d or %d expected.\n",fname,0, 1);
168                         return -1;
169     }
170   }/* NG end */
171   else if( strcmp(cstk(l1),"default") == 0 )
172   {
173     sciPointObj * pfigure = sciGetCurrentFigure();
174     
175
176     /*special treatement for xset default and old_style off F.Leray 23.09.04 */
177     /* mimic clf(gcf(),'reset') behaviour here */
178     sciClearFigure(sciGetCurrentFigure());
179
180     ResetFigureToDefaultValues(pfigure);
181   }
182   else if( strcmp(cstk(l1),"clipgrf") == 0 ) {
183     /* special treatement for xset("cligrf") */
184     sciPointObj * psubwin = sciGetCurrentSubWin();
185     sciSetIsClipping(psubwin,0);
186     forceRedraw(psubwin);
187   }
188   else if( strcmp(cstk(l1),"clipoff") == 0 ) {
189     /* special treatement for xset("clipoff") */
190     sciPointObj * psubwin = sciGetCurrentSubWin();
191     sciSetIsClipping(psubwin,-1);
192     forceRedraw(psubwin);
193   }
194   else if( strcmp(cstk(l1),"hidden3d") == 0 ) {
195     /* special treatement for xset("hidden3d") */
196     sciPointObj * psubwin = sciGetCurrentSubWin();
197     pSUBWIN_FEATURE(psubwin)->hiddencolor = x[0];
198     forceRedraw(psubwin);
199   }
200   else if ( strcmp(cstk(l1),"font") == 0) {
201     int defaultSubwinFontStyle = sciGetFontStyle(getAxesModel());
202     double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
203     int fontStyle = x[0];
204     double fontSize = x[1];
205
206     // set also the default subwin font size in order
207     // to have the right font size for labels if they are created
208     sciSetFontStyle(getAxesModel(), fontStyle);
209     sciSetFontSize(getAxesModel(), fontSize);
210     subwin = sciGetCurrentSubWin();
211
212     // restore previous font size
213     sciSetFontStyle(getAxesModel(), defaultSubwinFontStyle);
214     sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
215
216     sciSetFontStyle(subwin, fontStyle); 
217     sciSetFontSize(subwin,  fontSize);  
218     sciSetFontStyle(sciGetParent(subwin), fontStyle); 
219     sciSetFontSize(sciGetParent(subwin), fontSize);
220     forceRedraw(subwin);
221   } 
222   else if ( strcmp(cstk(l1),"window") == 0 || strcmp(cstk(l1),"figure") == 0 )
223   {
224     if (sciSwitchWindow(x[0]) != 0){
225       Scierror(999,_("%s: Unable to create requested figure: No more memory.\n"), fname);
226     }
227   }
228   else
229   {
230     subwin = sciGetCurrentSubWin();
231     if (( strcmp(cstk(l1),"foreground") == 0) || (strcmp(cstk(l1),"color") == 0) ||( strcmp(cstk(l1),"pattern") == 0) ) {
232       sciSetForeground(subwin, x[0]); 
233       if (sciGetSons((sciPointObj *) subwin) == (sciSons *)NULL) {/* added SS 20.04.04 */
234         /* if subwin is empty, set also the ticscolor and fontforeground */
235         pSUBWIN_FEATURE (subwin)->axes.ticscolor= x[0];
236         sciSetFontForeground(subwin,x[0]); 
237       }
238       forceRedraw(subwin);
239     } 
240     else if ( strcmp(cstk(l1),"background") == 0) {
241       sciSetBackground(subwin, x[0]);
242       forceRedraw(subwin);
243     }  
244     else if ( strcmp(cstk(l1),"thickness") == 0) {
245       sciSetLineWidth(subwin, x[0]); 
246       sciSetLineWidth(sciGetParent(subwin), x[0]);
247       forceRedraw(subwin);
248     } 
249     else if ( strcmp(cstk(l1),"line style") == 0) {
250       sciSetLineStyle(subwin, x[0]); 
251       sciSetLineStyle(sciGetParent(subwin), x[0]);   
252       forceRedraw(subwin);
253     }  
254     else if ( strcmp(cstk(l1),"mark") == 0) {
255       sciSetIsMark(subwin,1);                  /* A REVOIR F.Leray 21.01.05 */
256       sciSetIsMark(sciGetParent(subwin),1);
257       sciSetMarkStyle(subwin,x[0]); 
258       sciSetMarkStyle(sciGetParent(subwin),x[0]);   
259       forceRedraw(subwin);
260     } 
261     else if ( strcmp(cstk(l1),"colormap") == 0) {
262       sciSetColormap(sciGetParent(subwin), stk(lr),xm[0], xn[0]);
263     }
264     else if ( strcmp(cstk(l1),"dashes") == 0) {
265       sciSetLineStyle(subwin, x[0]); 
266       sciSetLineStyle(sciGetParent(subwin), x[0]);
267       forceRedraw(subwin);
268     }
269     else if ( strcmp(cstk(l1),"alufunction") == 0) {
270       sciSetXorMode(subwin, x[0]); 
271       sciSetXorMode(sciGetParent(subwin), x[0]);
272     }
273     else if ( strcmp(cstk(l1),"auto clear") == 0) {
274       if ( x[0] == 1 )
275       {
276         sciSetAddPlot(subwin, TRUE); 
277         sciSetAddPlot(sciGetParent(subwin), TRUE);  
278       }
279       else  
280       {
281         sciSetAddPlot(subwin, FALSE); 
282         sciSetAddPlot(sciGetParent(subwin), FALSE);  
283       }
284       forceRedraw(subwin);
285     } 
286     else if ( strcmp(cstk(l1),"auto scale") == 0) {
287       if ( x[0] == 1 )
288       {
289         sciSetAutoScale(subwin, TRUE); 
290         sciSetAutoScale(sciGetParent(subwin), TRUE);  
291       }
292       else  
293       {
294         sciSetAutoScale(subwin, FALSE); 
295         sciSetAutoScale(sciGetParent(subwin), FALSE);  
296       }
297       forceRedraw(subwin);
298     }
299     else if ( strcmp(cstk(l1),"wresize") == 0) {
300       if ( x[0] == 1 )
301       {
302         sciSetResize(subwin, TRUE); 
303         sciSetResize(sciGetParent(subwin), TRUE);  
304       }
305       else  
306       {
307         sciSetResize(subwin, FALSE); 
308         sciSetResize(sciGetParent(subwin), FALSE);  
309       }
310       forceRedraw(subwin);
311     }
312     else if ( strcmp(cstk(l1),"wpos") == 0) {
313       sciSetScreenPosition(sciGetParent(subwin), x[0], x[1]);
314     }
315     else if ( strcmp(cstk(l1),"wpdim") == 0) {
316       sciSetWindowDim(sciGetParent(subwin), x[0], x[1] ) ;
317     } 
318     else if ( strcmp(cstk(l1),"wdim") == 0) {
319       sciSetDimension(sciGetParent(subwin), x[0], x[1] ) ;
320
321     } /*Ajout A.Djalel le 10/11/03 */
322     else if ( strcmp(cstk(l1),"pixmap") == 0) {
323       sciSetPixmapMode(sciGetParent(subwin), x[0]);
324     }
325     else if ( strcmp(cstk(l1),"wshow") == 0) { /* a supprimer ce n'est pas une propriete mais une action */
326       showPixmap(sciGetParentFigure(subwin));
327     }
328     else if (strcmp(cstk(l1),"viewport") == 0) {
329       int viewport[4] = {x[0], x[1], 0, 0};
330       sciSetViewport(sciGetParentFigure(subwin), viewport);
331     }
332     else if (strcmp(cstk(l1),"wwpc") == 0) {
333       // clear pixmap
334       clearPixmap(sciGetParentFigure(subwin));
335     }
336     else if(strcmp(cstk(l1),"line mode") == 0)
337     {
338       if (x[0] == 0)
339       {
340         sciSetIsLine(subwin, FALSE);
341       }
342       else
343       {
344         sciSetIsLine(subwin, TRUE);
345       }
346       forceRedraw(subwin);
347     }
348     else
349     {
350       Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
351                         return 0;
352     }
353
354     if(strcmp(cstk(l1),"window") != 0 && strcmp(cstk(l1),"wshow") != 0)
355     {
356       // for wshow redraw already done
357       sciRedrawFigure();
358     }
359   }
360    
361   LhsVar(1)=0;
362         C2F(putlhsvar)();
363   return 0;
364 }
365 /*--------------------------------------------------------------------------*/
366 int C2F(xsetg)(char * str,char * str1,int lx0,int lx1)
367 {
368   if ( strcmp(str,"fpf") == 0) 
369   {
370     strcpy(getFPF(),str1);
371   }
372   else if ( strcmp(str,"auto clear")==0) 
373   {
374     sciPointObj * subwin = sciGetFirstTypedSelectedSon(sciGetCurrentFigure(), SCI_SUBWIN);
375     if (strcmp(str1,"on")==0 )
376     {
377       sciSetAddPlot( subwin,FALSE);
378     }
379     else{
380       sciSetAddPlot( subwin,TRUE);
381     }
382     forceRedraw(subwin);
383   }
384   else if ( strcmp(str,"default")==0)
385   {
386     getFPF()[0]='\0';
387   }
388   else 
389   {
390     Scierror(999, _("%s: Unrecognized input argument '%s'.\n"),"xset(arg,<string>)",str);
391                 return -1;
392   }
393   return 0;
394 }
395 /*--------------------------------------------------------------------------*/