2225e198552ad63e56d92c0eea77a8ce8452d941
[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 "Format.h"
27 #include "ObjectSelection.h"
28 #include "msgs.h"
29 #include "localization.h"
30 #include "Scierror.h"
31 #include "DrawingBridge.h"
32 #include "HandleManagement.h"
33
34 #include "BuildObjects.h"
35 #include "graphicObjectProperties.h"
36 #include "setGraphicObjectProperty.h"
37 #include "FigureList.h"
38 #include "CurrentFigure.h"
39 #include "CurrentSubwin.h"
40 #include "AxesModel.h"
41 /*--------------------------------------------------------------------------*/
42 int xsetg(char * str,char * str1,int lx0,int lx1) ;
43 /*--------------------------------------------------------------------------*/
44 int sci_xset( char *fname, unsigned long fname_len )
45 {
46     int m1,n1,l1,m2,n2,l2, xm[5],xn[5],x[5], i, v;
47     int lr;
48     double  xx[5];
49     sciPointObj *subwin = NULL;
50     char * subwinUID = NULL;
51     BOOL keyFound = FALSE ;
52
53     if (Rhs <= 0)
54     {
55         sci_demo(fname, fname_len);
56         return 0;
57     }
58
59     CheckRhs(1,6);
60     CheckLhs(0,1);
61
62     GetRhsVar(1,STRING_DATATYPE,&m1,&n1,&l1);
63
64     for ( i = 0 ; i < NUMSETFONC ; i++ )
65     {
66         if ( strcmp(cstk(l1),KeyTab_[i]) == 0 )
67         {
68             keyFound = TRUE ;
69             break ;
70         }
71     }
72
73     if ( !keyFound )
74     {
75         Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
76         return 0;
77     }
78
79     /* Allan CORNET Avril 2004 */
80     /* Bloque la commande xset('window') sans numero de fenetre */
81     if (Rhs == 1 && (strcmp(cstk(l1),"window") == 0) )
82     {
83         Scierror(999, _("%s : '%s' must be set\n"),fname, "window-number");
84         return 0;
85     }
86
87     if (Rhs == 2 && VarType(2) != sci_matrix)
88     {
89         /* second argument is not a scalar it must be a string */
90         GetRhsVar(2,STRING_DATATYPE,&m2,&n2,&l2);
91         xsetg(cstk(l1),cstk(l2),m1,m2);
92         LhsVar(1)=0;
93         PutLhsVar();
94         return 0;
95     }
96
97     if (Rhs == 1 && strcmp(cstk(l1),"default") == 0)
98     {
99         /* first treatment for xsetg : then we continue */
100         xsetg(cstk(l1),"void",m1,4L);
101     }
102
103     for ( i = 2 ; i <= Rhs ; i++ )
104     {
105         GetRhsVar(i,MATRIX_OF_DOUBLE_DATATYPE,&xm[i-2],&xn[i-2],&lr);
106         x[i - 2] = (int)  *stk(lr);
107         xx[i - 2] = *stk(lr);
108     }
109     if (strcmp(cstk(l1),"wdim") == 0 || strcmp(cstk(l1),"wpdim") == 0) {
110         /* Xwindows limits dimensions to 2^16 */
111         if ( (x[0]>65535)||(x[1]>65535)) {
112             x[0]=Min(x[0],65535);
113             x[1]=Min(x[1],65535);
114             i = 106;
115             v=0;
116             C2F(msgs)(&i,&v);
117         }
118     }
119
120     if (strcmp(cstk(l1),"clipping") == 0)
121     {
122         int clipState = 2;
123         if (Rhs != 5)
124         {
125             Scierror(999, _("%s: Wrong number of input argument %d expected.\n"),fname, 5);
126             return -1;
127         }
128         subwinUID = getOrCreateDefaultSubwin();
129         setGraphicObjectProperty(subwinUID, __GO_CLIP_BOX__, xx, jni_double_vector, 4);
130         setGraphicObjectProperty(subwinUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
131     }
132     else if ( strcmp(cstk(l1),"colormap") == 0)
133     {
134         char *pFigureUID = NULL;
135         getOrCreateDefaultSubwin();
136         pFigureUID = getCurrentFigure();
137         setGraphicObjectProperty(pFigureUID, __GO_COLORMAP__, stk(lr), jni_double_vector, *xm*(*xn));
138     }
139     else if ( strcmp(cstk(l1),"mark size") == 0)
140     {
141         int markSize = (int) xx[0];
142         int markSizeUnit = 1; /* force switch to tabulated mode : old syntax / 0 : point, 1 : tabulated */
143         char *subwinUID = getOrCreateDefaultSubwin();
144
145         setGraphicObjectProperty(subwinUID, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1);
146         setGraphicObjectProperty(subwinUID, __GO_MARK_SIZE__, &markSize, jni_int, 1);
147     }
148     else if ( strcmp(cstk(l1),"mark") == 0)
149     {
150         int markStyle = (int) xx[0];
151         int markSize = (int) xx[1];
152         int markSizeUnit = 1; /* force switch to tabulated mode : old syntax / 0 : point, 1 : tabulated */
153         char *subwinUID = getOrCreateDefaultSubwin();
154         setGraphicObjectProperty(subwinUID, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1); /* force switch to tabulated mode : old syntax */
155         setGraphicObjectProperty(subwinUID, __GO_MARK_STYLE__, &markStyle, jni_int, 1);
156         setGraphicObjectProperty(subwinUID, __GO_MARK_SIZE__, &markSize, jni_int, 1);
157     }
158     else if ( strcmp(cstk(l1),"font size") == 0) {
159         double defaultSubwinFontSize = sciGetFontSize(getAxesModel());
160         double fontSize = xx[0];
161         // set also the default subwin font size in order
162         // to have the right font size for labels if they are created
163         sciSetFontSize(getAxesModel(), fontSize);
164         subwin = sciGetCurrentSubWin();
165
166         // restore previous font size
167         sciSetFontSize(getAxesModel(), defaultSubwinFontSize);
168
169         sciSetFontSize(subwin, fontSize);
170         sciSetFontSize(sciGetParent(subwin), fontSize);
171         forceRedraw(subwin);
172     }  
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         sciClearFigure(sciGetCurrentFigure());
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         // Find if window already exists, if not create a new one
227         if (getObjectFromHandle(x[0]) == NULL)
228         {
229             int iID = x[0];
230             char *pFigureUID = createNewFigureWithAxes();
231             setGraphicObjectProperty(pFigureUID, __GO_ID__, &iID, jni_int, 1);
232             setCurrentFigure(pFigureUID);
233         }
234     }
235     else
236     {
237         subwin = NULL;
238         if (( strcmp(cstk(l1),"foreground") == 0) || (strcmp(cstk(l1),"color") == 0) ||( strcmp(cstk(l1),"pattern") == 0) ) {
239             sciSetForeground(subwin, x[0]);
240             if (sciGetSons((sciPointObj *) subwin) == (sciSons *)NULL) {/* added SS 20.04.04 */
241                 /* if subwin is empty, set also the ticscolor and fontforeground */
242                 pSUBWIN_FEATURE (subwin)->axes.ticscolor= x[0];
243                 sciSetFontForeground(subwin,x[0]);
244             }
245             forceRedraw(subwin);
246         }
247         else if ( strcmp(cstk(l1),"background") == 0) {
248             sciSetBackground(subwin, x[0]);
249             forceRedraw(subwin);
250         }
251         else if ( strcmp(cstk(l1),"thickness") == 0) {
252             sciSetLineWidth(subwin, x[0]);
253             sciSetLineWidth(sciGetParent(subwin), x[0]);
254             forceRedraw(subwin);
255         }
256         else if ( strcmp(cstk(l1),"line style") == 0) {
257             int lineStyle = (int) x[0];
258             setGraphicObjectProperty(getOrCreateDefaultSubwin(), __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
259         }
260         else if ( strcmp(cstk(l1),"mark") == 0) {
261             sciSetIsMark(subwin,1);                  /* A REVOIR F.Leray 21.01.05 */
262             sciSetIsMark(sciGetParent(subwin),1);
263             sciSetMarkStyle(subwin,x[0]);
264             sciSetMarkStyle(sciGetParent(subwin),x[0]);
265             forceRedraw(subwin);
266         }
267         else if ( strcmp(cstk(l1),"colormap") == 0) {
268             sciSetColormap(sciGetParent(subwin), stk(lr),xm[0], xn[0]);
269         }
270         else if ( strcmp(cstk(l1),"dashes") == 0) {
271             sciSetLineStyle(subwin, x[0]);
272             sciSetLineStyle(sciGetParent(subwin), x[0]);
273             forceRedraw(subwin);
274         }
275         else if ( strcmp(cstk(l1),"alufunction") == 0) {
276             sciSetXorMode(subwin, x[0]);
277             sciSetXorMode(sciGetParent(subwin), x[0]);
278         }
279         else if ( strcmp(cstk(l1),"auto clear") == 0) {
280             if ( x[0] == 1 )
281             {
282                 sciSetAddPlot(subwin, TRUE);
283                 sciSetAddPlot(sciGetParent(subwin), TRUE);
284             }
285             else
286             {
287                 sciSetAddPlot(subwin, FALSE);
288                 sciSetAddPlot(sciGetParent(subwin), FALSE);
289             }
290             forceRedraw(subwin);
291         }
292         else if ( strcmp(cstk(l1),"auto scale") == 0) {
293             if ( x[0] == 1 )
294             {
295                 sciSetAutoScale(subwin, TRUE);
296                 sciSetAutoScale(sciGetParent(subwin), TRUE);
297             }
298             else
299             {
300                 sciSetAutoScale(subwin, FALSE);
301                 sciSetAutoScale(sciGetParent(subwin), FALSE);
302             }
303             forceRedraw(subwin);
304         }
305         else if ( strcmp(cstk(l1),"wresize") == 0) {
306             if ( x[0] == 1 )
307             {
308                 sciSetResize(subwin, TRUE);
309                 sciSetResize(sciGetParent(subwin), TRUE);
310             }
311             else
312             {
313                 sciSetResize(subwin, FALSE);
314                 sciSetResize(sciGetParent(subwin), FALSE);
315             }
316             forceRedraw(subwin);
317         }
318         else if ( strcmp(cstk(l1),"wpos") == 0) {
319             sciSetScreenPosition(sciGetParent(subwin), x[0], x[1]);
320         }
321         else if ( strcmp(cstk(l1),"wpdim") == 0) {
322             sciSetWindowDim(sciGetParent(subwin), x[0], x[1] ) ;
323         }
324         else if ( strcmp(cstk(l1),"wdim") == 0) {
325             sciSetDimension(sciGetParent(subwin), x[0], x[1] ) ;
326
327         } /*Ajout A.Djalel le 10/11/03 */
328         else if ( strcmp(cstk(l1),"pixmap") == 0) {
329             sciSetPixmapMode(sciGetParent(subwin), x[0]);
330         }
331         else if ( strcmp(cstk(l1),"wshow") == 0) { /* a supprimer ce n'est pas une propriete mais une action */
332             showPixmap(sciGetParentFigure(subwin));
333         }
334         else if (strcmp(cstk(l1),"viewport") == 0) {
335             int viewport[4] = {x[0], x[1], 0, 0};
336             sciSetViewport(sciGetParentFigure(subwin), viewport);
337         }
338         else if (strcmp(cstk(l1),"wwpc") == 0) {
339             // clear pixmap
340             clearPixmap(sciGetParentFigure(subwin));
341         }
342         else if(strcmp(cstk(l1),"line mode") == 0)
343         {
344             if (x[0] == 0)
345             {
346                 sciSetIsLine(subwin, FALSE);
347             }
348             else
349             {
350                 sciSetIsLine(subwin, TRUE);
351             }
352             forceRedraw(subwin);
353         }
354         else
355         {
356             Scierror(999, _("%s: Unrecognized input argument: '%s'.\n"), fname, cstk(l1));
357             return 0;
358         }
359
360         if(strcmp(cstk(l1),"window") != 0 && strcmp(cstk(l1),"wshow") != 0)
361         {
362             // for wshow redraw already done
363             sciRedrawFigure();
364         }
365     }
366
367     LhsVar(1)=0;
368     PutLhsVar();
369     return 0;
370 }
371 /*--------------------------------------------------------------------------*/
372 int xsetg(char * str,char * str1,int lx0,int lx1)
373 {
374     if ( strcmp(str,"fpf") == 0)
375     {
376         strcpy(getFPF(),str1);
377     }
378     else if ( strcmp(str,"auto clear")==0)
379     {
380         sciPointObj * subwin = sciGetFirstTypedSelectedSon(sciGetCurrentFigure(), SCI_SUBWIN);
381         if (strcmp(str1,"on")==0 )
382         {
383             sciSetAddPlot( subwin,FALSE);
384         }
385         else{
386             sciSetAddPlot( subwin,TRUE);
387         }
388         forceRedraw(subwin);
389     }
390     else if ( strcmp(str,"default")==0)
391     {
392         getFPF()[0]='\0';
393     }
394     else
395     {
396         Scierror(999, _("%s: Unrecognized input argument '%s'.\n"),"xset(arg,<string>)",str);
397         return -1;
398     }
399     return 0;
400 }
401 /*--------------------------------------------------------------------------*/