Remove graphics.h file.
[scilab.git] / scilab / modules / graphics / src / c / BuildObjects.c
1 /*------------------------------------------------------------------------
2  *    Graphic library 
3  *    Copyright INRIA
4  *    newGraph Library header
5  *    Matthieu PHILIPPE,  INRIA 2001-2002
6  *    Djalel ABDEMOUCHE,  INRIA 2002-2004
7  *    Fabrice Leray,      INRIA 2004-2006
8  *    Jean-Baptiste Silvy INIRA 2006-xxxx
9  *    Comment:
10  *    This file contains all functions used to BUILD new objects : 
11  - allocating memory
12  - setting default value
13  - binding the newly created object tyo the entire existing hierarchy
14  --------------------------------------------------------------------------*/
15
16 #include <stdio.h>
17 #include <string.h>
18 #include <math.h>
19 #include <stdlib.h>
20 #include <stdarg.h>
21 #include <time.h>
22
23 #if _MSC_VER
24 #include <windows.h>
25 #endif
26
27 #include "BuildObjects.h"
28 #include "GetProperty.h"
29 #include "InitObjects.h"
30 #include "DestroyObjects.h"
31 #include "bcg.h"
32 #include "BuildObjects.h"
33 #include "SetProperty.h"
34 #include "CloneObjects.h"
35 #include "StringMatrix.h"
36 #include "Xcall1.h"
37 #include "sciprint.h"
38
39 #include "MALLOC.h" /* MALLOC */
40
41 extern int LinearScaling2Colormap(sciPointObj* pobj);
42 extern double * AllocUserGrads(double * u_xgrads, int nb);
43 extern char ** AllocAndSetUserLabelsFromMdl(char ** u_xlabels, char ** u_xlabels_MDL, int u_nxgrads);
44 extern int CopyUserGrads(double *u_xgrad_SRC, double *u_xgrad_DEST, int dim);
45
46 extern unsigned short defcolors[];
47
48 /**ConstructStatusBar
49  * @memo this function creates the StatusBar of Figure and the elementaries structures
50  */
51 sciPointObj *
52 ConstructStatusBar (sciPointObj * pparentfigure)
53 {
54   sciPointObj *pobj = (sciPointObj *) NULL;
55
56   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
57     {
58       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
59         return NULL;
60       sciSetEntityType (pobj, SCI_STATUSB);
61       if ((pobj->pfeatures = MALLOC ((sizeof (sciStatusBar)))) == NULL)
62         {
63           FREE(pobj);
64           return (sciPointObj *) NULL;
65         }
66       if (sciAddNewHandle (pobj) == -1)
67         {
68           FREE(pobj->pfeatures);
69           FREE(pobj);
70           return (sciPointObj *) NULL;
71         }
72       /*sciSetParent (pobj, pparentfigure);*/
73       if (!(sciAddThisToItsParent (pobj, pparentfigure)))
74         {
75           sciDelHandle (pobj);
76           FREE(pobj->pfeatures);
77           FREE(pobj);
78           return (sciPointObj *) NULL;
79         }
80       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
81       pSTATUSB_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
82       pSTATUSB_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
83       if (sciInitGraphicContext (pobj) == -1)
84         {
85           sciDelThisToItsParent (pobj, sciGetParent (pobj));
86           sciDelHandle (pobj);
87           FREE(pobj->pfeatures);
88           FREE(pobj);
89           return (sciPointObj *) NULL;
90         }
91       if (sciInitFontContext (pobj) == -1)
92         {
93           sciDelThisToItsParent (pobj, sciGetParent (pobj));
94           sciDelHandle (pobj);
95           FREE(pobj->pfeatures);
96           FREE(pobj);
97           return (sciPointObj *) NULL;
98         }
99       return (sciPointObj *)pobj;
100     }
101   else
102     {
103       sciprint ("The parent has to be a FIGURE \n");
104       return (sciPointObj *) NULL;
105     }
106 }
107
108
109 /*-----------------------------------------------------------------------------*/
110 /**
111  * Create a new graphic window if any is selected.
112  */
113 int C2F(sciwin)( void )
114 {
115   integer verb = 0 ;
116   integer win  = 0 ;
117   integer v    = 1 ;
118   integer na       ;
119   double  dv       ;
120   C2F(dr)("xget","window",&verb,&win,&na,PI0,PI0,PI0,&dv,&dv,&dv,&dv,5L,7L);
121   C2F(dr)("xset","window",&win,&v,PI0,PI0,PI0,PI0,&dv,&dv,&dv,&dv,5L,7L);
122   return sciSwitchWindow(&win); 
123
124 /*-----------------------------------------------------------------------------*/
125
126 /**ConstructFigure
127  * This function creates the parents window (manager) and the elementaries structures
128  */
129 /************ 18/01/2002 ***********/
130 sciPointObj *
131 ConstructFigure (struct BCG *XGC) 
132 {
133  
134   sciPointObj *pobj = (sciPointObj *) NULL;
135   integer i , m, n;
136   integer x[2], verbose=0, narg=0;
137   int succeed = 0;
138   sciPointObj * pfiguremdl = getFigureModel() ;
139
140   /* memory allocation for the new Figure   affectation du type allocation de la structure */
141
142   if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
143     {
144       return NULL;        
145     }
146   sciSetEntityType (pobj, SCI_FIGURE);
147   if ((pobj->pfeatures = MALLOC ((sizeof (sciFigure)))) == NULL)
148     {
149       FREE(pobj);
150       return (sciPointObj *) NULL;
151     }
152   /* add a number in the HandelTable  reallocation de la table + 1 puis affectation de l'indice    */
153   
154   if (sciAddNewHandle (pobj) == -1)
155     {
156       FREE(pobj->pfeatures);
157       FREE(pobj);
158       return (sciPointObj *) NULL;
159     }
160  
161   /*  le seul parent est la root (l'ecran, le bureau quoi !) Pour l'instant il n'y a pas de fils selectionne */
162   /*sciSetParent (pobj, (sciPointObj *) NULL); */
163   /* il n'y a pas de parents !!!*/
164   
165   if (!(sciAddThisToItsParent(pobj, (sciPointObj *)NULL))) 
166     {
167       sciDelHandle (pobj);
168       FREE(pobj->pfeatures);
169       FREE(pobj);
170       return (sciPointObj *) NULL;
171     }
172   
173   sciSetCurrentSon (pobj, (sciPointObj *) NULL);
174
175   pFIGURE_FEATURE (pobj)->user_data = (int *) NULL; /* adding 27.06.05 */
176   pFIGURE_FEATURE (pobj)->size_of_user_data = 0;
177   pFIGURE_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
178   pFIGURE_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
179   pFIGURE_FEATURE (pobj)->pScilabXgc = XGC;
180   
181   /** Initialize the colormap */
182   n=3;
183   m = pFIGURE_FEATURE (getFigureModel())->numcolors;
184   /* try to install the colormap in the graphic context */
185   C2F(dr)("xset","colormap",&m,&n,&succeed,PI0,PI0,PI0,
186           pFIGURE_FEATURE(getFigureModel())->pcolormap,PD0,PD0,PD0,0L,0L);
187   
188   if(succeed == 1){ /* failed to allocate or xinit (for Gif driver) was missing */
189     sciprint ("Failed to load default colormap : Allocation failed or missing xinit detected\n");
190     return (sciPointObj *) NULL;
191   }
192   
193   if((pFIGURE_FEATURE(pobj)->pcolormap = (double *) MALLOC (XGC->Numcolors * n * sizeof (double))) == (double *) NULL)
194     {
195       sciDelHandle (pobj);
196       FREE(pobj->pfeatures);
197       FREE(pobj);
198       return (sciPointObj *) NULL;
199     }  
200
201   if (XGC->Numcolors == m) { 
202     /* xset('colormap') was  able to install the colormap */
203     for (i=0; i <m*n ; i++) {
204       pFIGURE_FEATURE(pobj)->pcolormap[i] = pFIGURE_FEATURE(pfiguremdl)->pcolormap[i];
205     }
206   }
207   else {
208     m=XGC->Numcolors;
209     for (i=0; i <m*n ; i++)
210       pFIGURE_FEATURE(pobj)->pcolormap[i] = defcolors[i]/255.0;
211   }
212
213   sciInitNumColors (pobj,m);
214    
215   /* initialisation de context et mode graphique par defaut (figure model)*/
216   if (sciInitGraphicContext (pobj) == -1)
217     {
218       sciDelHandle (pobj);
219       FREE(pFIGURE_FEATURE(pobj)->pcolormap);
220       FREE(pobj->pfeatures);
221       FREE(pobj);
222       return (sciPointObj *) NULL;
223     }
224   if (sciInitGraphicMode (pobj) == -1)
225     {
226       sciDelHandle (pobj);    
227       FREE(pFIGURE_FEATURE(pobj)->pcolormap);
228       FREE(pobj->pfeatures);
229       FREE(pobj);
230       return (sciPointObj *) NULL;
231     }   
232
233   /* F.Leray 08.04.04 */
234   if (sciInitFontContext (pobj) == -1)
235     {
236       sciDelHandle (pobj);
237       FREE(pobj->pfeatures);      
238       FREE(pobj);
239       return (sciPointObj *) NULL;
240     }
241   sciInitNum (pobj, &(XGC->CurWindow));            
242   sciSetName(pobj, sciGetName(pfiguremdl), sciGetNameLength(pfiguremdl));
243   sciInitResize((sciPointObj *) pobj,sciGetResize(pobj));
244   pFIGURE_FEATURE(pobj)->windowdimwidth=pFIGURE_FEATURE(pfiguremdl)->windowdimwidth;  
245   pFIGURE_FEATURE(pobj)->windowdimheight=pFIGURE_FEATURE(pfiguremdl)->windowdimheight;
246   C2F(dr)("xset","wdim",&(pFIGURE_FEATURE(pobj)->windowdimwidth),
247           &(pFIGURE_FEATURE(pobj)->windowdimheight),PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L); 
248   pFIGURE_FEATURE (pobj)->figuredimwidth = pFIGURE_FEATURE (pfiguremdl)->figuredimwidth;
249   pFIGURE_FEATURE (pobj)->figuredimheight = pFIGURE_FEATURE (pfiguremdl)->figuredimheight;
250   C2F(dr)("xset","wpdim",&(pFIGURE_FEATURE(pobj)->figuredimwidth),
251           &(pFIGURE_FEATURE(pobj)->figuredimheight),PI0,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
252   C2F(dr)("xget","wpos",&verbose,x,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,4L,4L);
253   x[0]=(pFIGURE_FEATURE (pfiguremdl)->inrootposx <0)?x[0]:pFIGURE_FEATURE (pfiguremdl)->inrootposx;
254   x[1]=(pFIGURE_FEATURE (pfiguremdl)->inrootposy <0)?x[1]:pFIGURE_FEATURE (pfiguremdl)->inrootposy;
255   x[0]=(pFIGURE_FEATURE (pfiguremdl)->inrootposx <0)?x[0]:pFIGURE_FEATURE (pfiguremdl)->inrootposx;
256   x[1]=(pFIGURE_FEATURE (pfiguremdl)->inrootposy <0)?x[1]:pFIGURE_FEATURE (pfiguremdl)->inrootposy;
257   sciInitFigurePos (pobj,x[0],x[1]);
258   pFIGURE_FEATURE (pobj)->isiconified = pFIGURE_FEATURE (pfiguremdl)->isiconified;
259   pFIGURE_FEATURE (pobj)->isselected = pFIGURE_FEATURE (pfiguremdl)->isselected; 
260   pFIGURE_FEATURE (pobj)->rotstyle = pFIGURE_FEATURE (pfiguremdl)->rotstyle;
261   pFIGURE_FEATURE (pobj)->visible = pFIGURE_FEATURE (pfiguremdl)->visible;
262   pFIGURE_FEATURE (pobj)->auto_redraw = pFIGURE_FEATURE (pfiguremdl)->auto_redraw;
263
264   pFIGURE_FEATURE (pobj)->numsubwinselected = pFIGURE_FEATURE (pfiguremdl)->numsubwinselected;
265   pFIGURE_FEATURE (pobj)->pixmap = pFIGURE_FEATURE (pfiguremdl)->pixmap ; 
266   pFIGURE_FEATURE (pobj)->wshow = pFIGURE_FEATURE (pfiguremdl)->wshow ; 
267   pFIGURE_FEATURE (pobj)->allredraw = pFIGURE_FEATURE (pfiguremdl)->allredraw;
268
269   return pobj;
270 }
271
272
273
274
275
276
277
278 /**ConstructSubWin
279  * @memo This function creates the Subwindow (the Axe) and the elementaries structures
280  */
281 sciPointObj *
282 ConstructSubWin (sciPointObj * pparentfigure, int pwinnum)
283 {
284
285   char dir;
286   int i;
287   sciPointObj *pobj = (sciPointObj *) NULL;
288   sciSubWindow * ppsubwin = NULL;
289   sciPointObj * paxesmdl = getAxesModel() ;
290   sciSubWindow * ppaxesmdl = pSUBWIN_FEATURE (paxesmdl); 
291   
292
293   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
294     {
295       
296       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
297         return NULL;
298       sciSetEntityType (pobj, SCI_SUBWIN);
299       if ((pobj->pfeatures = MALLOC ((sizeof (sciSubWindow)))) == NULL)
300         {
301           FREE(pobj);
302           return (sciPointObj *) NULL;
303         }
304       if (sciAddNewHandle (pobj) == -1)
305         {
306           FREE(pobj->pfeatures);
307           FREE(pobj);
308           return (sciPointObj *) NULL;
309         }
310       
311       if (!(sciAddThisToItsParent (pobj, pparentfigure)))
312         {
313           sciDelHandle (pobj);
314           FREE(pobj->pfeatures);
315           FREE(pobj);
316           return (sciPointObj *) NULL;
317         }
318       
319       ppsubwin =  pSUBWIN_FEATURE (pobj); /* debug */
320
321       ppsubwin->vertices_list = (Vertices*) NULL;
322
323       
324       ppsubwin->user_data = (int *) NULL; /* adding 27.06.05 */
325       ppsubwin->size_of_user_data = 0;
326       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
327       ppsubwin->relationship.psons = (sciSons *) NULL;
328       ppsubwin->relationship.plastsons = (sciSons *) NULL;
329       ppsubwin->callback = (char *)NULL;
330       ppsubwin->callbacklen = 0;
331       ppsubwin->callbackevent = 100;
332
333       if (sciInitGraphicContext (pobj) == -1)
334         {
335           sciDelThisToItsParent (pobj, sciGetParent (pobj));
336           sciDelHandle (pobj);
337           FREE(pobj->pfeatures);
338           FREE(pobj);          
339           return (sciPointObj *) NULL;
340         }   
341       if (sciInitGraphicMode (pobj) == -1)
342         {
343           sciDelThisToItsParent (pobj, sciGetParent (pobj));
344           sciDelHandle (pobj);
345           FREE(pobj->pfeatures);
346           FREE(pobj);
347           return (sciPointObj *) NULL;
348         } 
349       
350       /* F.Leray 08.04.04 */
351       if (sciInitFontContext (pobj) == -1)
352         {
353           sciDelThisToItsParent (pobj, sciGetParent (pobj));
354           sciDelHandle (pobj);
355           FREE(pobj->pfeatures);          
356           FREE(pobj);
357           return (sciPointObj *) NULL;
358         }
359
360       dir= ppaxesmdl->logflags[0];
361       ppsubwin->logflags[0] = dir;
362
363       dir= ppaxesmdl->logflags[1]; 
364       ppsubwin->logflags[1] = dir;
365
366       dir= ppaxesmdl->logflags[2];
367       ppsubwin->logflags[2] = dir;
368
369       ppsubwin->axes.ticscolor  = ppaxesmdl->axes.ticscolor;
370       ppsubwin->axes.subint[0]  = ppaxesmdl->axes.subint[0];   
371       ppsubwin->axes.subint[1]  = ppaxesmdl->axes.subint[1]; 
372       ppsubwin->axes.subint[2]  = ppaxesmdl->axes.subint[2];
373
374       dir= ppaxesmdl->axes.xdir; 
375       ppsubwin->axes.xdir = dir; 
376       dir= ppaxesmdl->axes.ydir; 
377       ppsubwin->axes.ydir = dir;
378  
379       ppsubwin->axes.rect  = ppaxesmdl->axes.rect;
380       for (i=0 ; i<7 ; i++)
381         ppsubwin->axes.limits[i]  = ppaxesmdl->axes.limits[i] ;
382  
383       for (i=0 ; i<3 ; i++)
384         ppsubwin->grid[i]  = ppaxesmdl->grid[i] ;
385       ppsubwin->alpha  = ppaxesmdl->alpha;
386       ppsubwin->theta  = ppaxesmdl->theta;
387       ppsubwin->alpha_kp  = ppaxesmdl->alpha_kp;
388       ppsubwin->theta_kp  = ppaxesmdl->theta_kp;
389       ppsubwin->is3d  = ppaxesmdl->is3d;
390        
391       for (i=0 ; i<4 ; i++)
392         {  
393           ppsubwin->axes.xlim[i]= ppaxesmdl->axes.xlim[i]; 
394           ppsubwin->axes.ylim[i]= ppaxesmdl->axes.ylim[i]; 
395         }
396
397       /* F.Leray 22.09.04 */
398
399       ppsubwin->axes.u_xlabels = (char **) NULL; /* init. ci-apres */
400       ppsubwin->axes.u_ylabels = (char **) NULL; /* init. ci-apres */
401       ppsubwin->axes.u_zlabels = (char **) NULL; /* init. ci-apres */
402       ppsubwin->axes.u_xgrads  = (double *)NULL;
403       ppsubwin->axes.u_ygrads  = (double *)NULL;
404       ppsubwin->axes.u_zgrads  = (double *)NULL;
405        
406
407       (ppsubwin->axes).axes_visible[0] = ppaxesmdl->axes.axes_visible[0];
408       (ppsubwin->axes).axes_visible[1] = ppaxesmdl->axes.axes_visible[1];
409       (ppsubwin->axes).axes_visible[2] = ppaxesmdl->axes.axes_visible[2];
410       (ppsubwin->axes).reverse[0] = ppaxesmdl->axes.reverse[0];
411       (ppsubwin->axes).reverse[1] = ppaxesmdl->axes.reverse[1];
412       (ppsubwin->axes).reverse[2] = ppaxesmdl->axes.reverse[2];
413       ppsubwin->flagNax = ppaxesmdl->flagNax;
414
415       /* do not forget the nbsubtics ! */
416       (ppsubwin->axes).nbsubtics[0] = ppaxesmdl->axes.nbsubtics[0];
417       (ppsubwin->axes).nbsubtics[1] = ppaxesmdl->axes.nbsubtics[1];
418       (ppsubwin->axes).nbsubtics[2] = ppaxesmdl->axes.nbsubtics[2];
419       
420       (ppsubwin->axes).nxgrads = ppaxesmdl->axes.nxgrads;
421       (ppsubwin->axes).nygrads = ppaxesmdl->axes.nygrads;
422       (ppsubwin->axes).nzgrads = ppaxesmdl->axes.nzgrads;
423       
424       for(i=0;i<(ppsubwin->axes).nxgrads;i++) ppsubwin->axes.xgrads[i] = ppaxesmdl->axes.xgrads[i];
425       for(i=0;i<(ppsubwin->axes).nygrads;i++) ppsubwin->axes.ygrads[i] = ppaxesmdl->axes.ygrads[i];
426       for(i=0;i<(ppsubwin->axes).nzgrads;i++) ppsubwin->axes.zgrads[i] = ppaxesmdl->axes.zgrads[i];
427      
428       (ppsubwin->axes).u_nxgrads = ppaxesmdl->axes.u_nxgrads;
429       (ppsubwin->axes).u_nygrads = ppaxesmdl->axes.u_nygrads;
430       (ppsubwin->axes).u_nzgrads = ppaxesmdl->axes.u_nzgrads;
431       (ppsubwin->axes).u_xgrads  = AllocUserGrads(ppsubwin->axes.u_xgrads,ppaxesmdl->axes.u_nxgrads);
432       CopyUserGrads(ppaxesmdl->axes.u_xgrads,
433                     ppsubwin->axes.u_xgrads,
434                     ppsubwin->axes.u_nxgrads);
435       (ppsubwin->axes).u_ygrads  = AllocUserGrads(ppsubwin->axes.u_ygrads,ppaxesmdl->axes.u_nygrads);
436       CopyUserGrads(ppaxesmdl->axes.u_ygrads,
437                     ppsubwin->axes.u_ygrads,
438                     ppsubwin->axes.u_nygrads);
439       (ppsubwin->axes).u_zgrads  = AllocUserGrads(ppsubwin->axes.u_zgrads,ppaxesmdl->axes.u_nzgrads);
440       CopyUserGrads(ppaxesmdl->axes.u_zgrads,
441                     ppsubwin->axes.u_zgrads,
442                     ppsubwin->axes.u_nzgrads);
443       (ppsubwin->axes).u_xlabels = AllocAndSetUserLabelsFromMdl(ppsubwin->axes.u_xlabels,
444                                                                 ppaxesmdl->axes.u_xlabels,
445                                                                 ppsubwin->axes.u_nxgrads);
446
447       (ppsubwin->axes).u_ylabels = AllocAndSetUserLabelsFromMdl(ppsubwin->axes.u_ylabels,
448                                                                 ppaxesmdl->axes.u_ylabels,
449                                                                 ppsubwin->axes.u_nygrads);
450       
451       (ppsubwin->axes).u_zlabels = AllocAndSetUserLabelsFromMdl(ppsubwin->axes.u_zlabels,
452                                                                 ppaxesmdl->axes.u_zlabels,
453                                                                 ppsubwin->axes.u_nzgrads);
454
455       (ppsubwin->axes).auto_ticks[0] = ppaxesmdl->axes.auto_ticks[0];
456       (ppsubwin->axes).auto_ticks[1] = ppaxesmdl->axes.auto_ticks[1];
457       (ppsubwin->axes).auto_ticks[2] = ppaxesmdl->axes.auto_ticks[2];
458       /* end 22.09.04 */
459
460       ppsubwin->axes.zlim[0]= ppaxesmdl->axes.zlim[0];
461       ppsubwin->axes.zlim[1]= ppaxesmdl->axes.zlim[1];
462       ppsubwin->axes.flag[0]= ppaxesmdl->axes.flag[0];
463       ppsubwin->axes.flag[1]= ppaxesmdl->axes.flag[1];
464       ppsubwin->axes.flag[2]= ppaxesmdl->axes.flag[2];
465       ppsubwin->axes.hiddenAxisColor = ppaxesmdl->axes.hiddenAxisColor ;
466       ppsubwin->project[0]= ppaxesmdl->project[0];
467       ppsubwin->project[1]= ppaxesmdl->project[1];
468       ppsubwin->project[2]= ppaxesmdl->project[2];
469       ppsubwin->hiddencolor= ppaxesmdl->hiddencolor;
470       ppsubwin->hiddenstate= ppaxesmdl->hiddenstate;
471       ppsubwin->isoview= ppaxesmdl->isoview;
472       ppsubwin->facetmerge = ppaxesmdl->facetmerge; 
473       ppsubwin->WRect[0]   = ppaxesmdl->WRect[0];
474       ppsubwin->WRect[1]   = ppaxesmdl->WRect[1];
475       ppsubwin->WRect[2]   = ppaxesmdl->WRect[2];
476       ppsubwin->WRect[3]   = ppaxesmdl->WRect[3];
477
478       ppsubwin->ARect[0]   = ppaxesmdl->ARect[0];
479       ppsubwin->ARect[1]   = ppaxesmdl->ARect[1];
480       ppsubwin->ARect[2]   = ppaxesmdl->ARect[2];
481       ppsubwin->ARect[3]   = ppaxesmdl->ARect[3];
482
483       ppsubwin->FRect[0]   = ppaxesmdl->FRect[0];
484       ppsubwin->FRect[1]   = ppaxesmdl->FRect[1] ;
485       ppsubwin->FRect[2]   = ppaxesmdl->FRect[2];
486       ppsubwin->FRect[3]   = ppaxesmdl->FRect[3];
487       ppsubwin->FRect[4]   = ppaxesmdl->FRect[4] ;
488       ppsubwin->FRect[5]   = ppaxesmdl->FRect[5];
489      
490
491       ppsubwin->isselected = ppaxesmdl->isselected;  
492       ppsubwin->visible = ppaxesmdl->visible;
493             
494       ppsubwin->clip_region_set = 0 ;
495       sciInitIsClipping( pobj, sciGetIsClipping(paxesmdl) ) ;
496       sciSetClipping(   pobj, sciGetClipping(  paxesmdl) ) ;
497             
498       ppsubwin->cube_scaling = ppaxesmdl->cube_scaling;
499       
500       ppsubwin->SRect[0]  =  ppaxesmdl->SRect[0];
501       ppsubwin->SRect[1]  =  ppaxesmdl->SRect[1];
502       ppsubwin->SRect[2]  =  ppaxesmdl->SRect[2];
503       ppsubwin->SRect[3]  =  ppaxesmdl->SRect[3];
504       ppsubwin->SRect[4]  =  ppaxesmdl->SRect[4];
505       ppsubwin->SRect[5]  =  ppaxesmdl->SRect[5];
506       
507       ppsubwin->tight_limits = ppaxesmdl->tight_limits;
508       ppsubwin->FirstPlot = ppaxesmdl->FirstPlot;
509       ppsubwin->with_leg =  ppaxesmdl->with_leg;
510       
511       if (sciInitSelectedSubWin(pobj) < 0 )
512       { 
513         return (sciPointObj *)NULL ;
514       }
515       
516       /* Construction des labels: x,y,z et Title */
517
518       if ((ppsubwin->mon_title =  ConstructLabel (pobj, "",1)) == NULL){
519         sciDelThisToItsParent (pobj, sciGetParent (pobj)); /* pobj type = scisubwindow*/
520         sciDelHandle (pobj);
521         FREE(pobj->pfeatures);
522         FREE(pobj);
523         return (sciPointObj *) NULL;
524       }
525
526       sciSetStrings( ppsubwin->mon_title,
527                      sciGetText( pSUBWIN_FEATURE(paxesmdl)->mon_title) ) ;
528
529             
530       /*------------------------------------*/
531       if ((ppsubwin->mon_x_label =  ConstructLabel (pobj, "",2)) == NULL){
532         DestroyLabel(ppsubwin->mon_title);
533         sciDelThisToItsParent (pobj, sciGetParent (pobj));
534         sciDelHandle (pobj);
535         FREE(pobj->pfeatures);
536         FREE(pobj);
537         return (sciPointObj *) NULL;
538       }
539
540       sciSetStrings( ppsubwin->mon_x_label,
541                      sciGetText(pSUBWIN_FEATURE(paxesmdl)->mon_x_label) ) ;
542       
543
544       /*------------------------------------*/
545       if ((ppsubwin->mon_y_label =  ConstructLabel (pobj, "",3)) == NULL){
546         DestroyLabel(ppsubwin->mon_title);
547         DestroyLabel(ppsubwin->mon_x_label);
548         sciDelThisToItsParent (pobj, sciGetParent (pobj));
549         sciDelHandle (pobj);
550         FREE(pobj->pfeatures);
551         FREE(pobj);
552         return (sciPointObj *) NULL;
553       }
554       sciSetStrings( ppsubwin->mon_y_label,
555                      sciGetText( pSUBWIN_FEATURE(paxesmdl)->mon_y_label) ) ;
556      
557       /*------------------------------------*/
558       if ((ppsubwin->mon_z_label =  ConstructLabel (pobj, "",4)) == NULL){
559         DestroyLabel(ppsubwin->mon_title);
560         DestroyLabel(ppsubwin->mon_x_label);
561         DestroyLabel(ppsubwin->mon_y_label);
562         sciDelThisToItsParent (pobj, sciGetParent (pobj));
563         sciDelHandle (pobj);
564         FREE(pobj->pfeatures);
565         FREE(pobj);
566         return (sciPointObj *) NULL;
567       }
568       sciSetStrings( ppsubwin->mon_z_label,
569                      sciGetText(pSUBWIN_FEATURE(paxesmdl)->mon_z_label)  ) ;
570            
571       /* labels auto_position modes */
572       pLABEL_FEATURE(ppsubwin->mon_x_label)->auto_position = 
573         pLABEL_FEATURE(ppaxesmdl->mon_x_label)->auto_position;
574
575       pLABEL_FEATURE(ppsubwin->mon_y_label)->auto_position = 
576         pLABEL_FEATURE(ppaxesmdl->mon_y_label)->auto_position;
577
578       pLABEL_FEATURE(ppsubwin->mon_z_label)->auto_position = 
579         pLABEL_FEATURE(ppaxesmdl->mon_z_label)->auto_position;
580
581       pLABEL_FEATURE(ppsubwin->mon_title)->auto_position = 
582         pLABEL_FEATURE(ppaxesmdl->mon_title)->auto_position;
583  
584       /* labels auto_rotation modes */
585       pLABEL_FEATURE(ppsubwin->mon_x_label)->auto_rotation = 
586         pLABEL_FEATURE(ppaxesmdl->mon_x_label)->auto_rotation;
587
588       pLABEL_FEATURE(ppsubwin->mon_y_label)->auto_rotation = 
589         pLABEL_FEATURE(ppaxesmdl->mon_y_label)->auto_rotation;
590
591       pLABEL_FEATURE(ppsubwin->mon_z_label)->auto_rotation = 
592         pLABEL_FEATURE(ppaxesmdl->mon_z_label)->auto_rotation;
593
594       pLABEL_FEATURE(ppsubwin->mon_title)->auto_rotation = 
595         pLABEL_FEATURE(ppaxesmdl->mon_title)->auto_rotation;
596
597       cloneGraphicContext( ppaxesmdl->mon_x_label, ppsubwin->mon_x_label ) ;
598       cloneGraphicContext( ppaxesmdl->mon_y_label, ppsubwin->mon_y_label ) ;
599       cloneGraphicContext( ppaxesmdl->mon_z_label, ppsubwin->mon_z_label ) ;
600       cloneGraphicContext( ppaxesmdl->mon_title  , ppsubwin->mon_title   ) ;
601                   
602       ppsubwin->pPopMenu = (sciPointObj *)NULL;/* initialisation of popup menu*/
603       ppsubwin->surfcounter = 0;
604       return (sciPointObj *)pobj;
605       
606     }
607   else
608     {
609       sciprint ("The parent has to be a FIGURE \n");
610       return (sciPointObj *) NULL;
611     }
612   
613   return (sciPointObj *) NULL;
614 }
615
616
617
618 /**ConstructScrollV
619  * This function creates the scroll bar erticall
620  */
621 sciPointObj *
622 ConstructScrollV (sciPointObj * pparentfigure)
623 {
624   sciPointObj *pobjsbv = (sciPointObj *) NULL;
625
626   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
627     {
628       /* definition of scrollbars with original code */
629       /* definition of the vertical scroll bar in the new struct */
630       if ((pobjsbv = MALLOC ((sizeof (sciPointObj)))) == NULL)
631         return NULL;
632       sciSetEntityType (pobjsbv, SCI_SBV);
633       if ((pobjsbv->pfeatures = MALLOC ((sizeof (sciScrollBarVert)))) == NULL)
634         {
635           FREE(pobjsbv);
636           return (sciPointObj *) NULL;
637         }
638       if (sciAddNewHandle (pobjsbv) == -1)
639         {
640           FREE(pobjsbv->pfeatures);
641           FREE(pobjsbv);
642           return (sciPointObj *) NULL;
643         }
644       /*sciSetParent (pobjsbv, pparentfigure);*/
645       if (!(sciAddThisToItsParent (pobjsbv, pparentfigure)))
646         {
647           sciDelHandle (pobjsbv);
648           FREE(pobjsbv->pfeatures);
649           FREE(pobjsbv);
650           return (sciPointObj *) NULL;
651         }
652       sciSetCurrentSon (pobjsbv, (sciPointObj *) NULL);
653       pSBH_FEATURE (pobjsbv)->relationship.psons = (sciSons *) NULL;
654       pSBH_FEATURE (pobjsbv)->relationship.plastsons = (sciSons *) NULL;
655       return pobjsbv;
656     }
657   else
658     {
659       sciprint ("The parent has to be a FIGURE \n");
660       return (sciPointObj *) NULL;
661     }
662 }
663
664
665
666 /**ConstructScrollH
667  * This function creates horizontal scroll bar 
668  */
669 sciPointObj *
670 ConstructScrollH (sciPointObj * pparentfigure)
671 {
672   sciPointObj *pobjsbh = (sciPointObj *) NULL;
673
674   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
675     {
676       /* definition of scrollbars with original code */
677       /* definition of the horizontal scroll bar in the new struct */
678       if ((pobjsbh = MALLOC ((sizeof (sciPointObj)))) == NULL)
679         return NULL;
680       sciSetEntityType (pobjsbh, SCI_SBH);
681       if ((pobjsbh->pfeatures = MALLOC ((sizeof (sciScrollBarHorz)))) == NULL)
682         {
683           FREE(pobjsbh);
684           return (sciPointObj *) NULL;
685         }
686       if (sciAddNewHandle (pobjsbh) == -1)
687         {
688           FREE(pobjsbh->pfeatures);
689           FREE(pobjsbh);
690           return (sciPointObj *) NULL;
691         }
692       /*sciSetParent (pobjsbh, pparentfigure);*/
693       if (!(sciAddThisToItsParent (pobjsbh, pparentfigure)))
694         {
695           sciDelHandle (pobjsbh);
696           FREE(pobjsbh->pfeatures);
697           FREE(pobjsbh);
698           return (sciPointObj *) NULL;
699         }
700       sciSetCurrentSon (pobjsbh, (sciPointObj *) NULL);
701       pSBH_FEATURE (pobjsbh)->relationship.psons = (sciSons *) NULL;
702       pSBH_FEATURE (pobjsbh)->relationship.plastsons = (sciSons *) NULL;
703       return pobjsbh;
704     }
705   else
706     {
707       sciprint ("The parent has to be a FIGURE \n");
708       return (sciPointObj *) NULL;
709     }
710 }
711
712
713 /**
714  * creates a new text object. However the object is not added in the handle list.
715  * Its graphic and font context are also not initialized.
716  * this function is to be used with objects including a text object.
717  */
718 sciPointObj * allocateText( sciPointObj       * pparentsubwin,
719                             char             ** text         ,
720                             int                 nbRow        ,
721                             int                 nbCol        ,
722                             double              x            ,
723                             double              y            ,
724                             BOOL                autoSize     ,
725                             double              userSize[2]  ,
726                             BOOL                centerPos    ,
727                             int               * foreground   ,
728                             int               * background   , 
729                             BOOL                isboxed      ,
730                             BOOL                isline       ,
731                             BOOL                isfilled     ,
732                             sciTextAlignment    align         )
733 {
734   sciPointObj * pObj = NULL ;
735   sciText * ppText ;
736   if ( ( pObj = MALLOC( sizeof(sciPointObj) ) ) == NULL )
737   {
738     return NULL;
739   }
740   
741   sciSetEntityType (pObj, SCI_TEXT);
742   
743   if ( ( pObj->pfeatures = MALLOC( sizeof (sciText) ) ) == NULL )
744   {
745     FREE( pObj ) ;
746     return NULL;
747   }
748   
749   ppText = pTEXT_FEATURE( pObj ) ;
750
751   ppText->user_data = (int *) NULL;
752   ppText->size_of_user_data = 0;
753   sciSetCurrentSon (pObj, NULL);
754   ppText->relationship.psons = NULL;
755   ppText->relationship.plastsons = NULL;
756
757   /* it must be specified for some functions */
758   sciSetParent( pObj, pparentsubwin ) ;
759
760   ppText->callback = (char *)NULL;
761   ppText->callbacklen = 0;
762   ppText->callbackevent = 100;
763   ppText->visible = sciGetVisibility( pparentsubwin );
764       
765   ppText->clip_region_set = 0 ;
766   sciInitIsClipping( pObj, sciGetIsClipping( pparentsubwin ) ) ;
767   sciSetClipping( pObj, sciGetClipping(pparentsubwin) );
768   
769   /* allocate the matrix */
770   ppText->pStrings = newFullStringMatrix( text, nbRow, nbCol ) ;
771   if ( ppText->pStrings == NULL )
772   {
773     FREE(pObj->pfeatures);
774     FREE(pObj);
775     return NULL ;
776   }
777   
778   /* initialize position */
779   ppText->is3d = TRUE ;
780   ppText->x = x;
781   ppText->y = y;
782   ppText->z = 0.0; /**DJ.Abdemouche 2003**/
783   
784   ppText->centeredPos = centerPos ;
785   ppText->autoSize = autoSize ;
786
787   /* userSize must be specified if the size is given by the user */
788   /* or the user specified a rectangle */
789
790   if ( !autoSize || centerPos )
791   {
792     ppText->userSize[0] = userSize[0] ;
793     ppText->userSize[1] = userSize[1] ;
794   }
795   else
796   {
797     ppText->userSize[0] = 0.0 ;
798     ppText->userSize[1] = 0.0 ;
799   }
800   
801   ppText->stringsAlign = align ;
802   
803   sciInitIsBoxed(pObj,isboxed);
804   sciInitIsLine(pObj,isline);
805   sciInitIsFilled(pObj,isfilled);
806
807   if ( foreground != NULL )
808   {
809     sciInitForeground(pObj,(*foreground));
810   }
811   
812   if ( background != NULL )
813   {
814     sciInitBackground(pObj,(*background));
815   }
816   
817   return pObj;
818 }
819
820 /**ConstructText
821  * This function creates the parents window (manager) and the elementaries structures
822  * @param  sciPointObj *pparentsubwin :
823  * @param  char * text[] : intial text matrix string.
824  * @param  int nbCol : the number column of the text
825  * @param  int nbRow : the number of row of the text
826  * @return  : pointer sciPointObj if ok , NULL if not
827  */
828 sciPointObj *
829 ConstructText (sciPointObj * pparentsubwin, char ** text, int nbRow, int nbCol, double x,
830                double y, BOOL autoSize, double userSize[2], BOOL centerPos, int *foreground, int *background, 
831                BOOL isboxed, BOOL isline, BOOL isfilled, sciTextAlignment align )
832 {
833   if ( sciGetEntityType( pparentsubwin ) == SCI_SUBWIN ) 
834   {
835     sciPointObj * pobj = allocateText( pparentsubwin, text, nbRow, nbCol, x, y,
836                                        autoSize, userSize, centerPos, foreground, background,
837                                        isboxed, isline, isfilled, align ) ;
838     
839     if ( pobj == NULL )
840     {
841       return NULL ;
842     }
843
844     if ( sciInitFontContext( pobj ) == -1 )
845     {
846       FREE(pobj->pfeatures);
847       FREE(pobj);
848       return NULL ;
849     }
850   
851     if ( sciInitGraphicContext( pobj ) == -1 )
852     {
853       deallocateText( pobj ) ;
854       return NULL ;
855     }
856     
857     if (sciAddNewHandle (pobj) == -1)
858     {
859       deallocateText( pobj ) ;
860       return  NULL;
861     }
862     
863     if ( !(sciAddThisToItsParent (pobj, pparentsubwin)) )
864     {
865       deleteMatrix( pTEXT_FEATURE( pobj )->pStrings ) ;
866       sciDelHandle (pobj);
867       FREE(pobj->pfeatures);
868       FREE(pobj);
869       return NULL;
870     }
871     
872     return pobj ;
873
874   }
875   
876   sciprint ("The parent has to be a SUBWIN \n");
877   return NULL;
878 }
879
880
881
882 /**ConstructTitle
883  * This function creates Title structure
884  * @param  sciPointObj *pparentsubwin
885  * @param  char text[] : intial text string.
886  * @param  int n the number of element in text
887  * @param  sciTitlePlace place : the title's place  (SCI_TITLE_IN_TOP, SCI_TITLE_IN_BOTTOM)
888  * @return  : pointer sciPointObj if ok , NULL if not
889  */
890 sciPointObj *
891 ConstructTitle (sciPointObj * pparentsubwin, char text[], int type)
892 {
893   sciPointObj * pobj    = (sciPointObj *) NULL;
894   sciTitle    * ppTitle ;
895
896   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
897     {
898       if ((pobj = MALLOC (sizeof (sciPointObj))) == NULL)
899         return (sciPointObj *) NULL;
900       sciSetEntityType (pobj, SCI_TITLE);
901       if ((pobj->pfeatures = MALLOC ((sizeof (sciTitle)))) == NULL)
902         {
903           FREE(pobj);
904           return (sciPointObj *) NULL;
905         }
906       
907       ppTitle = pTITLE_FEATURE(pobj) ;
908
909       if (sciAddNewHandle (pobj) == -1)
910         {
911           FREE(ppTitle);
912           FREE(pobj);
913           return (sciPointObj *) NULL;
914         }
915       /*sciSetParent (pobj, pparentsubwin);*/
916       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
917         {
918           sciDelHandle (pobj);
919           FREE(ppTitle);
920           FREE(pobj);
921           return (sciPointObj *) NULL;
922         }
923       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
924       
925       ppTitle->text.relationship.psons = (sciSons *) NULL;
926       ppTitle->text.relationship.plastsons = (sciSons *) NULL;
927
928       ppTitle->text.callback = (char *)NULL;
929       ppTitle->text.callbacklen = 0; 
930       ppTitle->visible = sciGetVisibility(sciGetParentSubwin(pobj));
931       ppTitle->text.isboxed = FALSE ;
932       ppTitle->text.isline  = TRUE  ;
933
934       ppTitle->text.pStrings = newFullStringMatrix( &text, 1, 1 ) ;
935      
936       if ( ppTitle->text.pStrings == NULL )
937       {
938         sciprint("No more place to allocates text string, try a shorter string");
939         sciDelThisToItsParent (pobj, sciGetParent (pobj));
940         sciDelHandle (pobj);
941         FREE(ppTitle);
942         FREE(pobj);
943         return (sciPointObj *) NULL;
944       }
945       /* on copie le texte du titre dans le champs specifique de l'objet */
946       
947       ppTitle->ptype = type;
948
949       ppTitle->text.fontcontext.textorientation = 0;
950
951       ppTitle->titleplace = SCI_TITLE_IN_TOP;
952       ppTitle->isselected = TRUE;
953       if (sciInitFontContext (pobj) == -1 )
954       {
955         deleteMatrix(ppTitle->text.pStrings);
956         sciDelThisToItsParent (pobj, sciGetParent (pobj));
957         sciDelHandle (pobj);
958         FREE(ppTitle);
959         FREE(pobj);
960         return (sciPointObj *) NULL;
961       }
962       return (sciPointObj *) pobj;
963     }
964   else
965     {
966       sciprint ("The parent has to be a SUBWIN \n");
967       return (sciPointObj *) NULL;
968     }
969 }
970
971
972
973 /**constructLegend
974  * This function creates  Legend structure
975  */
976 sciPointObj *
977 ConstructLegend (sciPointObj * pparentsubwin, char text[], int n, int nblegends, int *pstyle
978                  , sciPointObj **pptabofpointobj)
979 {
980   sciPointObj * pobj = (sciPointObj *) NULL;
981   sciLegend   * ppLegend ;
982
983   /*
984    * verifier qu'il n'y a pas d'objet existant !!!! 
985    * si oui alors le detruire puis le reconstruire.
986    * car il ne peut y avoir qu'une legende
987    */
988   sciSons *psonstmp;
989   int i=0;
990
991   psonstmp = sciGetSons (pparentsubwin);
992   /* init */
993   if (psonstmp != (sciSons *) NULL)     /* on peut commencer sur le next */
994     /* tant que le fils n'est pas une legende */
995     while ((psonstmp->pnext != (sciSons *) NULL)
996            && sciGetEntityType (psonstmp->pointobj) != SCI_LEGEND)
997       psonstmp = psonstmp->pnext;
998
999   if (sciGetEntityType (psonstmp->pointobj) == SCI_LEGEND)
1000     DestroyLegend (psonstmp->pointobj);
1001
1002   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1003     {
1004       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1005         return (sciPointObj *) NULL;
1006       sciSetEntityType (pobj, SCI_LEGEND);
1007       if ((pobj->pfeatures = MALLOC ((sizeof (sciLegend)))) == NULL)
1008         {
1009           FREE(pobj);
1010           return (sciPointObj *) NULL;
1011         }
1012       /* get the pointer on the features */
1013       ppLegend = pLEGEND_FEATURE( pobj );
1014
1015       if (sciAddNewHandle (pobj) == -1)
1016         {
1017           FREE(ppLegend);
1018           FREE(pobj);
1019           return (sciPointObj *) NULL;
1020         }
1021       /*sciSetParent (pobj, pparentsubwin);*/
1022       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1023         {
1024           sciDelHandle (pobj);
1025           FREE(ppLegend);
1026           FREE(pobj);
1027           return (sciPointObj *) NULL;
1028         }
1029       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1030       ppLegend->user_data = (int *) NULL;
1031       ppLegend->size_of_user_data = 0;
1032       ppLegend->text.relationship.psons = (sciSons *) NULL;
1033       ppLegend->text.relationship.plastsons = (sciSons *) NULL;
1034       ppLegend->text.callback = (char *)NULL;
1035       ppLegend->text.callbacklen = 0;
1036       ppLegend->text.callbackevent = 100;
1037       ppLegend->text.isboxed = FALSE ;
1038       ppLegend->text.isline  = TRUE ;
1039       
1040       ppLegend->visible = sciGetVisibility(sciGetParentSubwin(pobj)); 
1041
1042       ppLegend->text.pStrings = newFullStringMatrix( &text, 1, 1 ) ;
1043
1044       /* Allocation de la structure sciText */
1045       if ( ppLegend->text.pStrings == NULL)
1046       {
1047         sciprint("\nNo more place to allocates text string, try a shorter string\n");
1048         sciDelThisToItsParent (pobj, sciGetParent (pobj));
1049         sciDelHandle (pobj);
1050         FREE(ppLegend);
1051         FREE(pobj);
1052         return (sciPointObj *) NULL;
1053       }
1054       /* on copie le texte du titre dans le champs specifique de l'objet */
1055       ppLegend->nblegends = nblegends;
1056
1057       if ((ppLegend->pptabofpointobj = 
1058            MALLOC(nblegends*sizeof(sciPointObj*))) == NULL)
1059         {
1060           sciprint("No more memory for legend\n");
1061           deleteMatrix( ppLegend->text.pStrings ) ;
1062           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1063           sciDelHandle (pobj);
1064           FREE(ppLegend);
1065           FREE(pobj);
1066           return (sciPointObj *) NULL;
1067         }
1068
1069       if ((ppLegend->pstyle = MALLOC(nblegends*sizeof(int))) != NULL)
1070         {
1071           for (i=0; i < nblegends; i++)
1072             {
1073               ppLegend->pstyle[i] = pstyle[i];
1074               ppLegend->pptabofpointobj[i] = pptabofpointobj[i];
1075             }
1076         }
1077       else
1078         {                 
1079           sciprint("\nNo more place to allocates style\n");
1080           FREE(ppLegend->pptabofpointobj);
1081           deleteMatrix( ppLegend->text.pStrings ) ;
1082           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1083           sciDelHandle (pobj);
1084           FREE(ppLegend);
1085           FREE(pobj);
1086           return (sciPointObj *) NULL;
1087         }
1088
1089
1090
1091       ppLegend->text.fontcontext.textorientation = 0;
1092       ppLegend->pos.x = 0;
1093       ppLegend->pos.y = 0;
1094       ppLegend->width = 0;
1095       ppLegend->height = 0;
1096       ppLegend->place = SCI_LEGEND_IN_INSIDE;
1097       ppLegend->isselected = TRUE;
1098       ppLegend->issurround = FALSE;
1099
1100       if (sciInitGraphicContext (pobj) == -1) /* NEW :  used to draw the line and marks of the curve F.Leray 21.01.05 */
1101         {
1102           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1103           sciDelHandle (pobj);
1104           FREE(pobj->pfeatures);
1105           FREE(pobj);          
1106           return (sciPointObj *) NULL;
1107         } 
1108       
1109       if (sciInitFontContext (pobj) == -1)
1110         {
1111           sciprint("Problem with sciInitFontContext\n");
1112           FREE(ppLegend->pptabofpointobj);
1113           deleteMatrix( ppLegend->text.pStrings ) ;
1114           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1115           sciDelHandle (pobj);
1116           FREE(ppLegend);
1117           FREE(pobj);
1118           return (sciPointObj *) NULL;
1119         }
1120
1121       return pobj;
1122     }
1123   else
1124     {
1125       sciprint ("The parent has to be a SUBWIN \n");
1126       return (sciPointObj *) NULL;
1127     }
1128 }
1129
1130
1131
1132 /**ConstructPolyline
1133  * This function creates  Polyline 2d structure
1134  */
1135 sciPointObj *
1136 ConstructPolyline (sciPointObj * pparentsubwin, double *pvecx, double *pvecy, double *pvecz,
1137                    int closed, int n1, int n2,int plot, int *foreground, int *background,
1138                    int *mark_style, int *mark_foreground, int *mark_background,
1139                    BOOL isline, BOOL isfilled, BOOL ismark, BOOL isinterpshaded)
1140 {
1141   sciPointObj *pobj = (sciPointObj *) NULL;
1142   sciPolyline *ppoly = (sciPolyline *) NULL;
1143   int i = 0;
1144
1145   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1146     {
1147       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1148         return (sciPointObj *) NULL;
1149       sciSetEntityType (pobj, SCI_POLYLINE);
1150       if ((pobj->pfeatures = MALLOC ((sizeof (sciPolyline)))) == NULL)
1151         {
1152           FREE(pobj);
1153           return (sciPointObj *) NULL;
1154         }
1155       if (sciAddNewHandle (pobj) == -1)
1156         {
1157           FREE(pPOLYLINE_FEATURE(pobj));
1158           FREE(pobj);
1159           return (sciPointObj *) NULL;
1160         }
1161       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1162         {
1163           sciDelHandle (pobj);
1164           FREE(pPOLYLINE_FEATURE(pobj));
1165           FREE(pobj);
1166           return (sciPointObj *) NULL;
1167         }
1168       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1169       pPOLYLINE_FEATURE (pobj)->x_shift = (double *) NULL;
1170       pPOLYLINE_FEATURE (pobj)->y_shift = (double *) NULL;
1171       pPOLYLINE_FEATURE (pobj)->z_shift = (double *) NULL;
1172       pPOLYLINE_FEATURE (pobj)->bar_width = 0.;
1173       pPOLYLINE_FEATURE (pobj)->user_data = (int *) NULL;
1174       pPOLYLINE_FEATURE (pobj)->size_of_user_data = 0;
1175       pPOLYLINE_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
1176       pPOLYLINE_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
1177
1178       pPOLYLINE_FEATURE (pobj)->callback = (char *)NULL;
1179       pPOLYLINE_FEATURE (pobj)->callbacklen = 0; 
1180       pPOLYLINE_FEATURE (pobj)->callbackevent = 100; 
1181       pPOLYLINE_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj));
1182
1183       pPOLYLINE_FEATURE (pobj)->clip_region_set = 0;
1184       sciInitIsClipping( pobj, sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)) ) ;
1185       sciSetClipping(pobj,sciGetClipping(sciGetParentSubwin(pobj)));
1186       
1187       
1188       pPOLYLINE_FEATURE (pobj)->arsize_factor = 1;
1189
1190       pPOLYLINE_FEATURE (pobj)->isselected = TRUE;
1191       ppoly = pPOLYLINE_FEATURE (pobj);
1192       
1193       if ( n1 != 0 )
1194       {
1195         if ((ppoly->pvx = MALLOC (n1 * sizeof (double))) == NULL)
1196         {
1197           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1198           sciDelHandle (pobj);
1199           FREE(pPOLYLINE_FEATURE(pobj));
1200           FREE(pobj);
1201           return (sciPointObj *) NULL;
1202         }
1203       
1204         if ((ppoly->pvy = MALLOC (n1 * sizeof (double))) == NULL)
1205         {
1206           FREE(pPOLYLINE_FEATURE (pobj)->pvx);
1207           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1208           sciDelHandle (pobj);
1209           FREE(pPOLYLINE_FEATURE(pobj));
1210           FREE(pobj);
1211           return (sciPointObj *) NULL;
1212         }
1213       
1214         if ((pvecx != (double *)NULL)&&(pvecy != (double *)NULL))
1215         {
1216           for (i = 0; i < n1; i++)
1217           {
1218             ppoly->pvx[i] = pvecx[i] ;
1219             ppoly->pvy[i] = pvecy[i] ; 
1220           }
1221         }
1222         else
1223         {
1224           for (i = 0; i < n1; i++)
1225           {
1226             ppoly->pvx[i] = 0.0;
1227             ppoly->pvy[i] = 0.0;
1228           }
1229         }
1230
1231
1232         /**DJ.Abdemouche 2003**/
1233         if (pvecz == (double *) NULL)
1234         {
1235           pPOLYLINE_FEATURE (pobj)->pvz=NULL;
1236         }
1237         else
1238         {
1239           if ((ppoly->pvz = MALLOC (n1 * sizeof (double))) == NULL)
1240           {
1241             FREE(pPOLYLINE_FEATURE (pobj)->pvx);
1242             FREE(pPOLYLINE_FEATURE (pobj)->pvy);
1243             sciDelThisToItsParent (pobj, sciGetParent (pobj));
1244             sciDelHandle (pobj);
1245             FREE(pPOLYLINE_FEATURE(pobj));
1246             FREE(pobj);
1247             return (sciPointObj *) NULL;
1248           } 
1249           for (i = 0; i < n1; i++)
1250           {
1251             ppoly->pvz[i] = pvecz[i];
1252           }
1253         }
1254       }
1255       else
1256       {
1257         ppoly->pvx = NULL ;
1258         ppoly->pvy = NULL ;
1259         ppoly->pvz = NULL ;
1260       }
1261
1262       ppoly->n1 = n1;     /* memorisation du nombre de points */
1263       ppoly->n2 = n2;     /* memorisation du nombre des courbes */
1264       ppoly->closed = (closed > 0) ? 1 : 0;
1265       ppoly->plot = plot;
1266  
1267       if (sciInitGraphicContext (pobj) == -1)
1268         {
1269           FREE(pPOLYLINE_FEATURE (pobj)->pvy);
1270           FREE(pPOLYLINE_FEATURE (pobj)->pvx);
1271           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1272           sciDelHandle (pobj);
1273           FREE(pPOLYLINE_FEATURE(pobj));
1274           FREE(pobj);
1275           return (sciPointObj *) NULL;
1276         }
1277
1278       /* colors and marks setting */
1279       sciInitIsMark(pobj,ismark);
1280       sciInitIsLine(pobj,isline);
1281       sciInitIsFilled(pobj,isfilled);
1282       /*       sciSetIsInterpShaded(pobj,isinterpshaded); */
1283       
1284       ppoly->isinterpshaded = isinterpshaded; /* set the isinterpshaded mode */
1285       
1286       if(foreground != NULL)
1287         sciInitForeground(pobj,(*foreground));
1288       
1289       ppoly->scvector = (int *) NULL;
1290       
1291       ppoly->dim_icv = n1;
1292       
1293       if(background != NULL){
1294         if(isinterpshaded == TRUE){ /* 3 or 4 values to store */
1295           
1296           sciSetInterpVector(pobj,n1,background);
1297         }
1298         else
1299           sciInitBackground(pobj,(*background));
1300       }
1301       
1302       if(mark_style != NULL)
1303         sciInitMarkStyle(pobj,(*mark_style));
1304       
1305       if(mark_foreground != NULL)
1306         sciInitMarkForeground(pobj,(*mark_foreground));
1307       
1308       if(mark_background != NULL)
1309         sciInitMarkBackground(pobj,(*mark_background));
1310       
1311       return pobj;
1312     }
1313   else
1314     {
1315       sciprint ("The parent has to be a SUBWIN \n");
1316       return (sciPointObj *) NULL;
1317     }
1318 }
1319
1320
1321
1322 /**ConstructArc
1323  * @memo This function creates an Arc structure
1324  */
1325 sciPointObj *
1326 ConstructArc (sciPointObj * pparentsubwin, double x, double y,
1327               double height, double width, double alphabegin, double alphaend, 
1328               int *foreground, int *background, BOOL isfilled, BOOL isline)
1329 {
1330   sciPointObj * pobj  = (sciPointObj *) NULL;
1331   sciArc      * ppArc = NULL ;
1332
1333   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1334     {
1335       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1336         return (sciPointObj *) NULL;
1337       sciSetEntityType (pobj, SCI_ARC);
1338       if ((pobj->pfeatures = MALLOC ((sizeof (sciArc)))) == NULL)
1339         {
1340           FREE(pobj);
1341           return (sciPointObj *) NULL;
1342         }
1343
1344       /* get the pointer to features */
1345       ppArc = pobj->pfeatures ;
1346
1347       if (sciAddNewHandle (pobj) == -1)
1348         {
1349           FREE(ppArc);
1350           FREE(pobj);
1351           return (sciPointObj *) NULL;
1352         }
1353       /*sciSetParent (pobj, pparentsubwin);*/
1354       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1355         {
1356           sciDelHandle (pobj);
1357           FREE(ppArc);
1358           FREE(pobj);
1359           return (sciPointObj *) NULL;
1360         }
1361       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1362       ppArc->user_data = (int *) NULL;
1363       ppArc->size_of_user_data = 0;
1364       ppArc->relationship.psons = (sciSons *) NULL;
1365       ppArc->relationship.plastsons = (sciSons *) NULL;
1366
1367       ppArc->callback = (char *)NULL;
1368       ppArc->callbacklen = 0;
1369       ppArc->callbackevent = 100;
1370     
1371       ppArc->x = x;
1372       ppArc->y = y;
1373       ppArc->z = 0;
1374       ppArc->height = height;
1375       ppArc->width = width;
1376       ppArc->alphabegin = alphabegin;
1377       ppArc->alphaend = alphaend;
1378       ppArc->isselected = TRUE; 
1379       ppArc->visible = sciGetVisibility(sciGetParentSubwin(pobj));
1380
1381       ppArc->clip_region_set = 0;
1382       /*ppArc->isclip = sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)); */
1383       sciInitIsClipping( pobj, sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)) ) ;
1384       sciSetClipping(pobj,sciGetClipping(sciGetParentSubwin(pobj)));
1385       /*      pARC_FEATURE (pobj)->clip_region = (double *) NULL; */
1386
1387
1388       if (sciInitGraphicContext (pobj) == -1)
1389         {
1390           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1391           sciDelHandle (pobj);
1392           FREE(ppArc);
1393           FREE(pobj);
1394           sciprint("pas de context");
1395           return (sciPointObj *) NULL;
1396         }
1397
1398       sciInitIsFilled(pobj,isfilled);
1399       /* should be put after graphicContext initialization */
1400       sciInitIsLine(pobj,isline);
1401       
1402       if(foreground != NULL)
1403       {
1404         sciInitForeground(pobj,(*foreground));
1405       }
1406       
1407       if(background != NULL)
1408       {
1409         sciInitBackground(pobj,(*background));
1410       }
1411       
1412       return pobj;
1413     }
1414   else
1415     {
1416       sciprint ("The parent has to be a SUBWIN \n");
1417       return (sciPointObj *) NULL;
1418     }
1419 }
1420
1421
1422
1423 /**ConstructRectangle
1424  * @memo This function creates Rectangle structure and only this to destroy all sons use DelGraphicsSon
1425  */
1426 sciPointObj *
1427 ConstructRectangle (sciPointObj * pparentsubwin, double x, double y,
1428                     double height, double width, double horzcurvature,
1429                     double vertcurvature,  int *foreground, int *background,
1430                     int isfilled, int isline, int str, BOOL flagstring)
1431 {
1432   sciPointObj *pobj = (sciPointObj *) NULL;
1433
1434   if ( height < 0.0 || width < 0.0 )
1435   {
1436     Scierror(999,"Width and height must be positive.\n");
1437     return NULL ;
1438   }
1439  
1440   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1441     {
1442       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1443         return (sciPointObj *) NULL;
1444       sciSetEntityType (pobj, SCI_RECTANGLE);
1445       if ((pobj->pfeatures = MALLOC ((sizeof (sciRectangle)))) == NULL)
1446         {
1447           FREE(pobj);
1448           return (sciPointObj *) NULL;
1449         }
1450       if (sciAddNewHandle (pobj) == -1)
1451         {
1452           FREE(pRECTANGLE_FEATURE (pobj));
1453           FREE(pobj);
1454           return (sciPointObj *) NULL;
1455         }
1456       /*sciSetParent (pobj, pparentsubwin);*/
1457       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1458         {
1459           sciDelHandle (pobj);
1460           FREE(pRECTANGLE_FEATURE (pobj));
1461           FREE(pobj);
1462           return (sciPointObj *) NULL;
1463         }
1464       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1465       pRECTANGLE_FEATURE (pobj)->user_data = (int *) NULL;
1466       pRECTANGLE_FEATURE (pobj)->size_of_user_data = 0;
1467       pRECTANGLE_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
1468       pRECTANGLE_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
1469
1470       pRECTANGLE_FEATURE (pobj)->callback = (char *)NULL;
1471       pRECTANGLE_FEATURE (pobj)->callbacklen = 0;
1472       pRECTANGLE_FEATURE (pobj)->callbackevent = 100;
1473
1474
1475       pRECTANGLE_FEATURE (pobj)->flagstring = flagstring;
1476       pRECTANGLE_FEATURE (pobj)->x = x;
1477       pRECTANGLE_FEATURE (pobj)->y = y;
1478       pRECTANGLE_FEATURE (pobj)->z = 0; 
1479       pRECTANGLE_FEATURE (pobj)->height = height;
1480       pRECTANGLE_FEATURE (pobj)->width = width;
1481       pRECTANGLE_FEATURE (pobj)->str = str;
1482       pRECTANGLE_FEATURE (pobj)->strheight = 0;
1483       pRECTANGLE_FEATURE (pobj)->strwidth = 0;
1484       pRECTANGLE_FEATURE (pobj)->horzcurvature = horzcurvature;
1485       pRECTANGLE_FEATURE (pobj)->vertcurvature = vertcurvature;
1486       pRECTANGLE_FEATURE (pobj)->isselected = TRUE;
1487       pRECTANGLE_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj));
1488
1489       pRECTANGLE_FEATURE (pobj)->clip_region_set = 0;
1490       /*pRECTANGLE_FEATURE (pobj)->isclip = sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)); */
1491       sciInitIsClipping( pobj, sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)) ) ;
1492       sciSetClipping(pobj,sciGetClipping(sciGetParentSubwin(pobj)));
1493       
1494       /*     pRECTANGLE_FEATURE (pobj)->clip_region = (double *) NULL; */
1495
1496       if (sciInitGraphicContext (pobj) == -1)
1497         {
1498           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1499           sciDelHandle (pobj);
1500           FREE(pRECTANGLE_FEATURE (pobj));
1501           FREE(pobj);
1502           return (sciPointObj *) NULL;
1503         }
1504
1505       sciInitIsLine(pobj,isline);
1506       sciInitIsFilled(pobj,isfilled);
1507       
1508       if(foreground != NULL)
1509         sciInitForeground(pobj,(*foreground));
1510       
1511       if(background != NULL)
1512         sciInitBackground(pobj,(*background));
1513       
1514       /*       if (pRECTANGLE_FEATURE (pobj)->fillcolor < 0) */
1515       /*        sciSetForeground (pobj,-(pRECTANGLE_FEATURE (pobj)->fillcolor)); */
1516       /*       else      */
1517       /*        if (pRECTANGLE_FEATURE (pobj)->fillcolor > 0) */
1518       /*          sciSetForeground (pobj,pRECTANGLE_FEATURE (pobj)->fillcolor); */
1519       /*        else  */
1520       /*          sciSetForeground (pobj,sciGetForeground (sciGetParent (pobj)) ); */
1521       
1522       return pobj;
1523     }
1524   else
1525     {
1526       sciprint ("The parent has to be a SUBWIN \n");
1527       return (sciPointObj *) NULL;
1528     }
1529 }
1530
1531
1532
1533 /**ConstructSurface
1534  * @memo This function creates Surface Structure
1535  */
1536 sciPointObj *
1537 ConstructSurface (sciPointObj * pparentsubwin, sciTypeOf3D typeof3d, 
1538                   double * pvecx, double * pvecy, double * pvecz,double *zcol, 
1539                   integer izcol, integer dimzx, integer dimzy,  
1540                   integer *flag, double *ebox,integer flagcolor, 
1541                   integer *isfac, integer *m1, integer *n1, integer *m2, 
1542                   integer *n2, integer *m3, integer *n3, integer *m3n, integer *n3n)
1543 {
1544   sciPointObj *pobj = (sciPointObj *) NULL;
1545   /*debug F.Leray*/
1546   sciSurface *psurf;
1547
1548   int i=0, j=0;
1549   int nx,ny,nz,nc,izc=izcol;
1550
1551   if (typeof3d == SCI_PLOT3D) {
1552     nx=dimzx;
1553     ny=dimzy;
1554     nz=dimzx*dimzy;
1555     if (flagcolor == 2)
1556       nc=nz; /* one color per facet */    /* nc = dimzx * dimzy */
1557     else if (flagcolor == 3)
1558       nc=nz*4; /*one color per edge */    /* nc = 4* dimzx * dimzy ?????? */ /* 3 or 4 vectices are needed: 
1559                                                                                 I think we take 4 to have enough allocated memory*/ 
1560     /* made by Djalel : comes from the genfac3d case*/
1561     else 
1562       nc=0;
1563   }
1564   /* DJ.A 2003 */
1565   else { /* case SCI_FAC3D */
1566     nx=dimzx*dimzy;
1567     ny=dimzx*dimzy;
1568     nz=dimzx*dimzy;
1569     if (flagcolor == 2)
1570       nc=dimzy; /* one color per facet */ /* nc = dimzy */
1571     else if (flagcolor == 3)
1572       nc=nz; /*one color per edge */      /* nc = dimzx * dimzy */
1573     else 
1574       nc=0;
1575   }
1576
1577
1578   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1579     {
1580       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1581         return (sciPointObj *) NULL;
1582       sciSetEntityType (pobj, SCI_SURFACE);
1583       if ((pobj->pfeatures = MALLOC ((sizeof (sciSurface)))) == NULL)
1584         {
1585           FREE(pobj);
1586           return (sciPointObj *) NULL;
1587         }
1588       /*debug F.Leray*/
1589       psurf = pSURFACE_FEATURE (pobj);
1590       if (sciAddNewHandle (pobj) == -1)
1591         {
1592           FREE(psurf);
1593           FREE(pobj); pobj = NULL;
1594           return (sciPointObj *) NULL;
1595         }
1596       /*sciSetParent (pobj, pparentsubwin);*/
1597       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1598         {
1599           sciDelHandle (pobj);
1600           FREE(psurf);
1601           FREE(pobj); pobj = NULL;
1602           return (sciPointObj *) NULL;
1603         }
1604       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1605       psurf->user_data = (int *) NULL;
1606       psurf->size_of_user_data = 0;
1607       psurf->relationship.psons = (sciSons *) NULL;
1608       psurf->relationship.plastsons = (sciSons *) NULL;
1609
1610       psurf->callback = (char *)NULL;
1611       psurf->callbacklen = 0;
1612       psurf->callbackevent = 100; 
1613       psurf->visible = sciGetVisibility(sciGetParentSubwin(pobj));
1614
1615       
1616   
1617       /*F.Leray 12.03.04 Adding here to know the length of arrays pvecx, pvecy and pvecz*/
1618       psurf->nc = nc;
1619       psurf->nx = nx;
1620       psurf->ny = ny;
1621       psurf->nz = nz;
1622       psurf->isfac = *isfac;
1623       psurf->m1= *m1;
1624       psurf->m2= *m2;
1625       psurf->m3= *m3;
1626       psurf->n1= *n1;
1627       psurf->n2= *n2;
1628       psurf->n3= *n3;
1629       
1630       /*Adding F.Leray 19.03.04*/
1631       psurf->m3n= *m3n;
1632       psurf->n3n= *n3n;
1633
1634       if (((psurf->pvecx = MALLOC ((nx * sizeof (double)))) == NULL))
1635         {
1636           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1637           sciDelHandle (pobj);
1638           FREE(psurf);
1639           FREE(pobj); pobj = NULL;
1640           return (sciPointObj *) NULL;
1641         }
1642       else
1643         {
1644           for (i = 0;i < nx; i++)
1645             psurf->pvecx[i] = pvecx[i];
1646         }
1647       if (((psurf->pvecy = MALLOC ((ny * sizeof (double)))) == NULL))
1648         {
1649           FREE(psurf->pvecx);
1650           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1651           sciDelHandle (pobj);
1652           FREE(psurf);
1653           FREE(pobj); pobj = NULL;
1654           return (sciPointObj *) NULL;
1655         }
1656       else
1657         {
1658           for (j = 0;j < ny; j++)
1659             psurf->pvecy[j] = pvecy[j];
1660         }
1661
1662       if (((psurf->pvecz = MALLOC ((nz * sizeof (double)))) == NULL))
1663         {
1664           FREE(psurf->pvecy);
1665           FREE(psurf->pvecx);
1666           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1667           sciDelHandle (pobj);
1668           FREE(psurf);
1669           FREE(pobj); pobj = NULL;
1670           return (sciPointObj *) NULL;
1671         }
1672       else
1673         {
1674           for (j = 0;j < nz; j++)
1675             psurf->pvecz[j] = pvecz[j];
1676         }
1677       
1678       /*Storage of the input Color Matrix or Vector Data */ /* F.Leray 23.03.04*/
1679       psurf->inputCMoV = NULL;
1680       
1681       if((*m3n)*(*n3n) != 0){
1682         if (((psurf->inputCMoV = MALLOC (( (*m3n)*(*n3n) * sizeof (double)))) == NULL))
1683           {
1684             FREE(psurf->pvecy); psurf->pvecy = NULL;
1685             FREE(psurf->pvecx); psurf->pvecx = NULL;
1686             FREE(psurf->pvecz); psurf->pvecz = NULL;
1687             sciDelThisToItsParent (pobj, sciGetParent (pobj));
1688             sciDelHandle (pobj);
1689             FREE(psurf);
1690             FREE(pobj); pobj = NULL;
1691             return (sciPointObj *) NULL;
1692           }
1693       }
1694       
1695       for (j = 0;j < (*m3n)*(*n3n); j++)  
1696         psurf->inputCMoV[j] = zcol[j];
1697       
1698       /* Init. zcol & zcolReal to NULL F.Leray 17.03.04*/
1699       psurf->zcol = NULL;
1700       psurf->color = NULL;
1701       
1702       /*
1703         if (izc !=0&&nc>0 ) {
1704         if (((psurf->zcol = MALLOC ((nc * sizeof (integer)))) == NULL))
1705         {
1706         FREE(psurf->pvecy); psurf->pvecy = NULL;
1707         FREE(psurf->pvecx); psurf->pvecx = NULL;
1708         FREE(psurf->pvecz); psurf->pvecz = NULL;
1709         sciDelThisToItsParent (pobj, sciGetParent (pobj));
1710         sciDelHandle (pobj);
1711         FREE(psurf);
1712         FREE(pobj); pobj = NULL;
1713         return (sciPointObj *) NULL;
1714         }
1715         else
1716         {
1717         if (izcol !=0)
1718         for (j = 0;j < nc; j++)  
1719         psurf->zcol[j]= zcol[j];  */ /* DJ.A 2003 */
1720       /*}
1721         } */
1722       
1723       /*-------Replaced by: --------*/
1724
1725       if (izc !=0&&nc>0 ) { /* Allocation of good size depending on flagcolor for nc (see above)*/
1726         if (((psurf->zcol = MALLOC ((nc * sizeof (double)))) == NULL))
1727           {
1728             FREE(psurf->pvecy); psurf->pvecy = NULL;
1729             FREE(psurf->pvecx); psurf->pvecx = NULL;
1730             FREE(psurf->pvecz); psurf->pvecz = NULL;
1731             sciDelThisToItsParent (pobj, sciGetParent (pobj));
1732             sciDelHandle (pobj);
1733             FREE(psurf);
1734             FREE(pobj); pobj = NULL;
1735             return (sciPointObj *) NULL;
1736           }
1737       }
1738       
1739       if(nc>0)
1740         {
1741           /* case flagcolor == 2*/
1742           if(flagcolor==2 && ( *m3n==1 || *n3n ==1)) /* it means we have a vector in Color input: 1 color per facet in input*/
1743             {
1744               /* We have just enough information to fill the psurf->zcol array*/
1745               for (j = 0;j < nc; j++)  /* nc value is dimzx*dimzy == m3 * n3 */
1746                 psurf->zcol[j]= psurf->inputCMoV[j];  /* DJ.A 2003 */
1747             }
1748           else if(flagcolor==2 && !( *m3n==1 || *n3n ==1)) /* it means we have a matrix in Color input: 1 color per vertex in input*/
1749             {
1750               /* We have too much information and we take only the first dimzy colors to fill the psurf->zcol array*/
1751               /* NO !! Let's do better; F.Leray 08.05.04 : */
1752               /* We compute the average value (sum of the value of the nf=m3n vertices on a facet) / (nb of vertices per facet which is nf=m3n) */
1753               /* in our example: m3n=4 and n3n=400 */
1754               for (j = 0;j < nc; j++)   /* nc value is dimzy*/
1755                 {
1756                   double tmp = 0;
1757                   int ii=0;
1758                   for(ii=0;ii<(*m3n);ii++)
1759                     tmp = tmp +  psurf->inputCMoV[j*(*m3n) + ii];
1760                   tmp = tmp / (*m3n);
1761                   psurf->zcol[j]= tmp;
1762                 }
1763             }
1764           /* case flagcolor == 3*/
1765           else if(flagcolor==3 && ( *m3n==1 || *n3n ==1)) /* it means we have a vector in Color input: 1 color per facet in input*/
1766             {
1767               /* We have insufficient info. to fill the entire zcol array of dimension nc = dimzx*dimzy*/
1768               /* We repeat the data:*/
1769               for(i = 0; i< dimzy; i++){
1770                 for (j = 0;j < dimzx; j++)  /* nc value is dimzx*dimzy == m3 * n3 */
1771                   psurf->zcol[dimzx*i+j]= psurf->inputCMoV[i];  /* DJ.A 2003 */
1772               }
1773             }
1774           else if(flagcolor==3 && !( *m3n==1 || *n3n ==1)) /* it means we have a matrix in Color input: 1 color per vertex in input*/
1775             {
1776               /* We have just enough information to fill the psurf->zcol array*/
1777               for (j = 0;j < nc; j++)   /* nc value is dimzy*/
1778                 psurf->zcol[j]= psurf->inputCMoV[j];
1779             }
1780           /* Notice that the new case flagcolor == 4 is not available at the construction state */
1781           /* It is a flat mode display (like flagcolor == 2 case) with a different computation  */
1782           /* manner to simulate Matlab flat mode. It can be enabled by setting color_flag to 4. */
1783
1784         }
1785
1786
1787       psurf->cdatamapping = 1; /* direct mode enabled by default */
1788       
1789       
1790       /* We need to rebuild ...->color matrix */
1791       if(psurf->cdatamapping == 0){ /* scaled */
1792         FREE(psurf->color);
1793         LinearScaling2Colormap(pobj);
1794       }
1795       else{
1796         
1797         FREE(psurf->color);
1798         
1799         if(nc>0){
1800           if ((psurf->color = MALLOC (nc * sizeof (double))) == NULL)
1801             return (sciPointObj *) NULL;
1802         }
1803         
1804         for(i=0;i<nc;i++)
1805           psurf->color[i] = psurf->zcol[i];
1806         /* copy zcol that has just been freed and re-alloc + filled in */
1807       }
1808
1809       /*-------END Replaced by: --------*/
1810
1811       psurf->dimzx = dimzx; /* dimzx is completly equal to m3*/
1812       psurf->dimzy = dimzy; /* dimzx is completly equal to n3*/
1813       psurf->izcol = izc;
1814       psurf->isselected = TRUE;
1815
1816       psurf->flag[0] = flag[0]; /* F.Leray 16.04.04 HERE We store the flag=[mode (hidden part ), type (scaling), box (frame around the plot)] */
1817       psurf->flag[1] = flag[1];
1818       psurf->flag[2] = flag[2];
1819
1820       /* DJ.A 2003 */
1821    
1822       psurf->ebox[0] = ebox[0];
1823       psurf->ebox[1] = ebox[1];
1824       psurf->ebox[2] = ebox[2];
1825       psurf->ebox[3] = ebox[3];
1826       psurf->ebox[4] = ebox[4];
1827       psurf->ebox[5] = ebox[5];
1828       psurf->flagcolor =flagcolor;
1829       psurf->typeof3d = typeof3d;
1830       psurf->hiddencolor = pSUBWIN_FEATURE(pparentsubwin)->hiddencolor;
1831       
1832       if (sciInitGraphicContext (pobj) == -1)
1833         {
1834           FREE(psurf->pvecz);
1835           FREE(psurf->pvecy);
1836           FREE(psurf->pvecx);
1837           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1838           sciDelHandle (pobj);
1839           FREE(psurf);
1840           FREE(pobj);
1841           return (sciPointObj *) NULL;
1842         }
1843       pSUBWIN_FEATURE(pparentsubwin)->surfcounter++;
1844       return pobj;
1845     }
1846   else
1847     {
1848       sciprint ("The parent has to be a SUBWIN \n");
1849       return (sciPointObj *) NULL;
1850     }
1851 }
1852
1853
1854
1855 sciPointObj *
1856 ConstructMerge (sciPointObj * pparentsubwin,int N,int *index_in_entity,long *from_entity)
1857 {
1858   sciPointObj *pobj = (sciPointObj *) NULL;
1859  
1860   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1861     {
1862       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL) return (sciPointObj *) NULL;
1863   
1864       sciSetEntityType (pobj, SCI_MERGE);
1865       if ((pobj->pfeatures = MALLOC ((sizeof (sciMerge)))) == NULL) {
1866         FREE(pobj);
1867         return (sciPointObj *) NULL;
1868       }
1869       if (sciAddNewHandle (pobj) == -1) {
1870         FREE(pMERGE_FEATURE (pobj));
1871         FREE(pobj);
1872         return (sciPointObj *) NULL;
1873       }
1874       if (!(sciAddThisToItsParent (pobj, pparentsubwin))){
1875         sciDelHandle (pobj);
1876         FREE(pMERGE_FEATURE (pobj));
1877         FREE(pobj);
1878         return (sciPointObj *) NULL;
1879       }
1880
1881       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1882       pMERGE_FEATURE (pobj)->user_data = (int *) NULL;
1883       pMERGE_FEATURE (pobj)->size_of_user_data = 0;
1884       pMERGE_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
1885       pMERGE_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
1886       pMERGE_FEATURE (pobj)->index_in_entity=index_in_entity;
1887       pMERGE_FEATURE (pobj)->from_entity=from_entity;
1888       pMERGE_FEATURE (pobj)->N=N;
1889       return pobj;
1890     }
1891   else
1892     return (sciPointObj *) NULL;
1893 }
1894
1895
1896
1897 /********************** 14/05/2002 *****
1898  **ConstructGayplot
1899  * @memo This function creates Grayplot
1900  */
1901 sciPointObj *
1902 ConstructGrayplot (sciPointObj * pparentsubwin, double *pvecx, double *pvecy,
1903                    double *pvecz, int n1, int n2, int type)
1904 {
1905   sciPointObj *pobj = (sciPointObj *) NULL;
1906   sciGrayplot *pgray = (sciGrayplot *) NULL;
1907   int i = 0,cmpt;
1908   
1909   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
1910     {
1911       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
1912         return (sciPointObj *) NULL;
1913       sciSetEntityType (pobj, SCI_GRAYPLOT);
1914       if ((pobj->pfeatures = MALLOC ((sizeof (sciGrayplot)))) == NULL)
1915         {
1916           FREE(pobj);
1917           return (sciPointObj *) NULL;
1918         }
1919       if (sciAddNewHandle (pobj) == -1)
1920         {
1921           FREE(pGRAYPLOT_FEATURE(pobj));
1922           FREE(pobj);
1923           return (sciPointObj *) NULL;
1924         }
1925       /*sciSetParent (pobj, pparentsubwin);*/
1926       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
1927         {
1928           sciDelHandle (pobj);
1929           FREE(pGRAYPLOT_FEATURE(pobj));
1930           FREE(pobj);
1931           return (sciPointObj *) NULL;
1932         }
1933       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
1934       pGRAYPLOT_FEATURE (pobj)->user_data = (int *) NULL;
1935       pGRAYPLOT_FEATURE (pobj)->size_of_user_data = 0;
1936       pGRAYPLOT_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
1937       pGRAYPLOT_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
1938
1939       pGRAYPLOT_FEATURE (pobj)->callback = (char *)NULL;
1940       pGRAYPLOT_FEATURE (pobj)->callbacklen = 0; 
1941       pGRAYPLOT_FEATURE (pobj)->callbackevent = 100;
1942
1943       pGRAYPLOT_FEATURE (pobj)->isselected = TRUE; 
1944       pGRAYPLOT_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj));
1945
1946       pGRAYPLOT_FEATURE (pobj)->type = type;
1947       pGRAYPLOT_FEATURE (pobj)->pvecx = (double *)NULL;
1948       pGRAYPLOT_FEATURE (pobj)->pvecy = (double *)NULL;
1949
1950       strcpy( pGRAYPLOT_FEATURE (pobj)->datamapping, "scaled" ) ;
1951       pgray = pGRAYPLOT_FEATURE (pobj);
1952       
1953       if (pvecx && (pgray->pvecx = MALLOC (n1 * sizeof (double))) == NULL)
1954         {
1955           sciDelThisToItsParent (pobj, sciGetParent (pobj));
1956           sciDelHandle (pobj);
1957           FREE(pGRAYPLOT_FEATURE(pobj));
1958           FREE(pobj);
1959           return (sciPointObj *) NULL;
1960         }
1961       cmpt = (type == 2)? 4:n2 ;
1962       if (type != 2)
1963         if (pvecy && (pgray->pvecy = MALLOC (cmpt * sizeof (double))) == NULL)
1964           {
1965             if (pvecx) FREE(pGRAYPLOT_FEATURE (pobj)->pvecx);
1966             sciDelThisToItsParent (pobj, sciGetParent (pobj));
1967             sciDelHandle (pobj);
1968             FREE(pGRAYPLOT_FEATURE(pobj));
1969             FREE(pobj);
1970             return (sciPointObj *) NULL;
1971           }
1972       if ((pgray->pvecz = MALLOC ((n1*n2) * sizeof (double))) == NULL){
1973         if (pvecx) FREE(pGRAYPLOT_FEATURE (pobj)->pvecx);
1974         if (pvecy) FREE(pGRAYPLOT_FEATURE (pobj)->pvecy);
1975         sciDelThisToItsParent (pobj, sciGetParent (pobj));
1976         sciDelHandle (pobj);
1977         FREE(pGRAYPLOT_FEATURE(pobj));
1978         FREE(pobj);
1979         return (sciPointObj *) NULL;
1980       }
1981       if (pvecx) {
1982         for (i = 0; i < n1; i++) pgray->pvecx[i] = pvecx[i];
1983       } 
1984    
1985
1986       if (pvecy) {
1987         if (type != 2)
1988           for (i = 0; i < n2; i++) pgray->pvecy[i] = pvecy[i];
1989       }
1990     
1991       pgray->nx = n1;pgray->ny = n2;
1992       for (i = 0; i < (n1*n2); i++) pgray->pvecz[i] = pvecz[i];
1993         
1994       if (sciInitGraphicContext (pobj) == -1)
1995         {
1996           if (pvecx) FREE(pGRAYPLOT_FEATURE (pobj)->pvecx);
1997           if (pvecy) FREE(pGRAYPLOT_FEATURE (pobj)->pvecy); 
1998           FREE(pGRAYPLOT_FEATURE (pobj)->pvecz);
1999           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2000           sciDelHandle (pobj);
2001           FREE(pGRAYPLOT_FEATURE(pobj));
2002           FREE(pobj);
2003           return (sciPointObj *) NULL;
2004         }
2005       return pobj;
2006     }
2007   else
2008     {
2009       sciprint ("The parent has to be a SUBWIN \n");
2010       return (sciPointObj *) NULL;
2011     }
2012 }
2013
2014
2015
2016
2017
2018 /**ConstructAxes
2019  * @memo This function creates Axes structure
2020  * @author Djalel ABDEMOUCHE
2021  * @see sciSetCurrentObj
2022  *
2023  */
2024 sciPointObj *
2025 ConstructAxes (sciPointObj * pparentsubwin, char dir, char tics, double *vx, 
2026                int nx, double *vy, int ny,char **str, int subint, char *format,
2027                int fontsize, int textcolor, int ticscolor, char logscale, int seg, int nb_tics_labels)  
2028 {
2029   sciPointObj *pobj = (sciPointObj *) NULL;
2030   sciAxes *paxes = (sciAxes *) NULL;
2031   int i;
2032
2033   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
2034     {
2035       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2036         return (sciPointObj *) NULL;
2037       sciSetEntityType (pobj, SCI_AXES);
2038       if ((pobj->pfeatures = MALLOC ((sizeof (sciAxes)))) == NULL)
2039         {
2040           FREE(pobj);
2041           return (sciPointObj *) NULL;
2042         }
2043       if (sciAddNewHandle (pobj) == -1)
2044         {
2045           FREE(pAXES_FEATURE (pobj));
2046           FREE(pobj);
2047           return (sciPointObj *) NULL;
2048         }
2049       /*sciSetParent (pobj, pparentsubwin);*/
2050       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
2051         {
2052           sciDelHandle (pobj);
2053           FREE(pAXES_FEATURE (pobj));
2054           FREE(pobj);
2055           return (sciPointObj *) NULL;
2056         }
2057       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2058       pAXES_FEATURE (pobj)->user_data = (int *) NULL;
2059       pAXES_FEATURE (pobj)->size_of_user_data = 0;
2060       pAXES_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
2061       pAXES_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
2062
2063       pAXES_FEATURE (pobj)->callback = (char *)NULL;
2064       pAXES_FEATURE (pobj)->callbacklen = 0;
2065       pAXES_FEATURE (pobj)->callbackevent = 100;
2066       pAXES_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj));
2067
2068       /*pAXES_FEATURE (pobj)->isclip = sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)); */
2069       pAXES_FEATURE (pobj)->clip_region_set = 0;
2070       /*pAXES_FEATURE (pobj)->isclip = -1;*/  /*F.Leray Change here: by default Axis are not clipped. 10.03.04 */
2071       sciInitIsClipping( pobj, -1 ) ;
2072       sciSetClipping(pobj,sciGetClipping(sciGetParentSubwin(pobj)));
2073       /*       pAXES_FEATURE (pobj)->clip_region = (double *) NULL; */
2074      
2075       pAXES_FEATURE (pobj)->dir =dir;
2076       pAXES_FEATURE (pobj)->tics =tics;
2077   
2078       paxes = pAXES_FEATURE (pobj);
2079       if ((paxes->vector = MALLOC (Max(nx,ny) * sizeof (POINT2D))) == NULL)
2080         {
2081           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2082           sciDelHandle (pobj);
2083           FREE(pPOLYLINE_FEATURE(pobj));
2084           FREE(pobj);
2085           return (sciPointObj *) NULL;
2086         }
2087       /* pour le moment je garde les vecteurs separes, et non en POINT2D */
2088       if ((paxes->vx = MALLOC (nx * sizeof (double))) == NULL)
2089         {
2090           FREE(pAXES_FEATURE (pobj)->vector);
2091           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2092           sciDelHandle (pobj);
2093           FREE(pAXES_FEATURE(pobj));
2094           FREE(pobj);
2095           return (sciPointObj *) NULL;
2096         }
2097       if ((paxes->vy = MALLOC (ny * sizeof (double))) == NULL)
2098         {
2099           FREE(pAXES_FEATURE (pobj)->vector);
2100           FREE(pAXES_FEATURE (pobj)->vx);
2101           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2102           sciDelHandle (pobj);
2103           FREE(pAXES_FEATURE(pobj));
2104           FREE(pobj);
2105           return (sciPointObj *) NULL;
2106         }
2107       
2108       for (i = 0; i < nx; i++)
2109         {
2110           paxes->vx[i]       = vx[i];    
2111         }
2112       for (i = 0; i < ny; i++)
2113         {
2114           paxes->vy[i]       = vy[i];
2115         }
2116      
2117      
2118       
2119       pAXES_FEATURE (pobj)->nx =nx; 
2120       
2121      
2122       pAXES_FEATURE (pobj)->ny =ny;
2123      
2124       pAXES_FEATURE (pobj)->nb_tics_labels = nb_tics_labels; /* F.Leray 29.04.05 */
2125
2126       /* pAXES_FEATURE(pobj)->str = str;*/ /* Pb here, F.Leray : Weird init.: can not copy a string using '='*/
2127       if(str != (char **) NULL)
2128         {
2129           if(pAXES_FEATURE (pobj)->nb_tics_labels == -1){
2130             sciprint("Impossible case when buyilding axis\n");
2131             return (sciPointObj *) NULL;
2132           }
2133           
2134           if ((pAXES_FEATURE(pobj)->str= MALLOC (pAXES_FEATURE (pobj)->nb_tics_labels * sizeof (char*))) == NULL)
2135             return (sciPointObj *) NULL;
2136
2137           for(i=0;i<pAXES_FEATURE (pobj)->nb_tics_labels;i++) 
2138             {
2139               if(str[i] != (char *) NULL)
2140                 {
2141                   if((pAXES_FEATURE (pobj)->str[i] = MALLOC( (strlen(str[i])+1) * sizeof(char))) == NULL)
2142                     return (sciPointObj *) NULL;
2143                   else
2144                     strcpy(pAXES_FEATURE (pobj)->str[i],str[i]);
2145                 }
2146               else
2147                 pAXES_FEATURE (pobj)->str[i] = (char *) NULL;
2148             }
2149         }
2150       else
2151         {
2152           pAXES_FEATURE (pobj)->str = (char **) NULL;
2153         }
2154
2155       pAXES_FEATURE (pobj)->subint = subint;
2156       pAXES_FEATURE (pobj)->fontsize =fontsize; 
2157       pAXES_FEATURE (pobj)->textcolor =textcolor;
2158       pAXES_FEATURE (pobj)->ticscolor =ticscolor;
2159       pAXES_FEATURE (pobj)->seg =seg;    
2160       /*    pAXES_FEATURE (pobj)->format =format; */ /* Pb here, F.Leray : Weird init.: can not copy a string using '='*/
2161       pAXES_FEATURE (pobj)->logscale=logscale;
2162       if(format != (char *) NULL)
2163         {
2164           if((pAXES_FEATURE (pobj)->format = MALLOC( (strlen(format)+1) * sizeof(char))) == NULL)
2165             return (sciPointObj *) NULL;
2166           else
2167             strcpy(pAXES_FEATURE (pobj)->format,format);
2168         }
2169       else
2170         pAXES_FEATURE (pobj)->format = (char *) NULL;
2171           
2172       if (sciInitGraphicContext (pobj) == -1)
2173         {
2174           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2175           sciDelHandle (pobj);
2176           FREE(pAXES_FEATURE (pobj));
2177           FREE(pobj);
2178           return (sciPointObj *) NULL;
2179         }
2180
2181
2182       return pobj;
2183     }
2184   else
2185     {
2186       sciprint ("The parent has to be a SUBWIN \n");
2187       return (sciPointObj *) NULL;
2188     }
2189 }
2190
2191
2192
2193 /********************** 21/05/2002 *****
2194  **ConstructFec
2195  * @memo This function creates Grayplot
2196  * @author Djalel.ABDEMOUCHE
2197  * @see sciSetCurrentObj
2198  */
2199 sciPointObj *
2200 ConstructFec (sciPointObj * pparentsubwin, double *pvecx, double *pvecy, double *pnoeud, 
2201               double *pfun, int Nnode, int Ntr, double *zminmax, integer *colminmax, 
2202               integer *colout, BOOL with_mesh)
2203 {
2204   sciPointObj *pobj = (sciPointObj *) NULL;
2205   sciFec *pfec = (sciFec *) NULL;
2206   int i = 0;
2207   
2208   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
2209     {
2210       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2211         return (sciPointObj *) NULL;
2212       sciSetEntityType (pobj, SCI_FEC);
2213       if ((pobj->pfeatures = MALLOC ((sizeof (sciFec)))) == NULL)
2214         {
2215           FREE(pobj);
2216           return (sciPointObj *) NULL;
2217         }
2218       if (sciAddNewHandle (pobj) == -1)
2219         {
2220           FREE(pFEC_FEATURE(pobj));
2221           FREE(pobj);
2222           return (sciPointObj *) NULL;
2223         }
2224       /*sciSetParent (pobj, pparentsubwin);*/
2225       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
2226         {
2227           sciDelHandle (pobj);
2228           FREE(pFEC_FEATURE(pobj));
2229           FREE(pobj);
2230           return (sciPointObj *) NULL;
2231         }
2232       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2233       pFEC_FEATURE (pobj)->user_data = (int *) NULL;
2234       pFEC_FEATURE (pobj)->size_of_user_data = 0;
2235       pFEC_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
2236       pFEC_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
2237
2238       pFEC_FEATURE (pobj)->callback = (char *)NULL;
2239       pFEC_FEATURE (pobj)->callbacklen = 0;
2240       pFEC_FEATURE (pobj)->callbackevent = 100;
2241
2242       pFEC_FEATURE (pobj)->isselected = TRUE; 
2243       pFEC_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj));
2244    
2245       pfec = pFEC_FEATURE (pobj);
2246       
2247       if ((pfec->pvecx = MALLOC (Nnode * sizeof (double))) == NULL)
2248         {
2249           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2250           sciDelHandle (pobj);
2251           FREE(pFEC_FEATURE(pobj));
2252           FREE(pobj);
2253           return (sciPointObj *) NULL;
2254         }
2255       if ((pfec->pvecy = MALLOC (Nnode * sizeof (double))) == NULL)
2256         {
2257           FREE(pFEC_FEATURE (pobj)->pvecx);
2258           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2259           sciDelHandle (pobj);
2260           FREE(pFEC_FEATURE(pobj));
2261           FREE(pobj);
2262           return (sciPointObj *) NULL;
2263         }
2264       if ((pfec->pnoeud = MALLOC ((5*Ntr) * sizeof (double))) == NULL)
2265         {
2266           FREE(pFEC_FEATURE (pobj)->pvecx);
2267           FREE(pFEC_FEATURE (pobj)->pvecy);
2268           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2269           sciDelHandle (pobj);
2270           FREE(pFEC_FEATURE(pobj));
2271           FREE(pobj);
2272           return (sciPointObj *) NULL;
2273         }
2274       if ((pfec->pfun = MALLOC (Nnode * sizeof (double))) == NULL)
2275         {
2276           FREE(pFEC_FEATURE (pobj)->pvecx);
2277           FREE(pFEC_FEATURE (pobj)->pvecy); 
2278           FREE(pFEC_FEATURE (pobj)->pnoeud);
2279           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2280           sciDelHandle (pobj);
2281           FREE(pFEC_FEATURE(pobj));
2282           FREE(pobj);
2283           return (sciPointObj *) NULL;
2284         }
2285       if ((pfec->zminmax = MALLOC (2 * sizeof (double))) == NULL)
2286         {
2287           FREE(pFEC_FEATURE (pobj)->pvecx);
2288           FREE(pFEC_FEATURE (pobj)->pvecy);
2289           FREE(pFEC_FEATURE (pobj)->pnoeud); 
2290           FREE(pFEC_FEATURE (pobj)->pfun);
2291           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2292           sciDelHandle (pobj);
2293           FREE(pFEC_FEATURE(pobj));
2294           FREE(pobj);
2295           return (sciPointObj *) NULL;
2296         } 
2297       if ((pfec->colminmax = MALLOC (2 * sizeof (integer))) == NULL)
2298         {
2299           FREE(pFEC_FEATURE (pobj)->pvecx);
2300           FREE(pFEC_FEATURE (pobj)->pvecy);
2301           FREE(pFEC_FEATURE (pobj)->pnoeud); 
2302           FREE(pFEC_FEATURE (pobj)->pfun); 
2303           FREE(pFEC_FEATURE (pobj)->zminmax);
2304           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2305           sciDelHandle (pobj);
2306           FREE(pFEC_FEATURE(pobj));
2307           FREE(pobj);
2308           return (sciPointObj *) NULL;
2309         }
2310
2311       if ((pfec->colout = MALLOC (2 * sizeof (integer))) == NULL)
2312         {
2313           FREE(pFEC_FEATURE (pobj)->pvecx);
2314           FREE(pFEC_FEATURE (pobj)->pvecy);
2315           FREE(pFEC_FEATURE (pobj)->pnoeud); 
2316           FREE(pFEC_FEATURE (pobj)->pfun); 
2317           FREE(pFEC_FEATURE (pobj)->zminmax);
2318           FREE(pFEC_FEATURE (pobj)->colminmax);
2319           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2320           sciDelHandle (pobj);
2321           FREE(pFEC_FEATURE(pobj));
2322           FREE(pobj);
2323           return (sciPointObj *) NULL;
2324         }
2325
2326       for (i = 0; i < Nnode; i++)
2327         {
2328           pfec->pvecx[i] = pvecx[i];
2329           pfec->pvecy[i] = pvecy[i];
2330           pfec->pfun[i] = pfun[i];
2331         }
2332       for (i = 0; i < (5*Ntr); i++)
2333         {
2334           pfec->pnoeud[i] = pnoeud[i];
2335         }
2336       for (i = 0; i < 2; i++)
2337         {
2338           pfec->zminmax[i] = zminmax[i];
2339           pfec->colminmax[i] = colminmax[i];
2340           pfec->colout[i] = colout[i];
2341         }
2342       pfec->with_mesh = with_mesh;
2343       pfec->Nnode = Nnode;            
2344       pfec->Ntr = Ntr;          
2345       if (sciInitGraphicContext (pobj) == -1)
2346         {
2347           FREE(pFEC_FEATURE (pobj)->pvecx);
2348           FREE(pFEC_FEATURE (pobj)->pvecy); 
2349           FREE(pFEC_FEATURE (pobj)->pnoeud);
2350           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2351           sciDelHandle (pobj);
2352           FREE(pFEC_FEATURE(pobj));
2353           FREE(pobj);
2354           return (sciPointObj *) NULL;
2355         }
2356       return pobj;
2357     }
2358   else
2359     {
2360       sciprint ("The parent has to be a SUBWIN \n");
2361       return (sciPointObj *) NULL;
2362     }
2363 }
2364
2365
2366
2367 /**ConstructSegs
2368  * @memo This function creates Segments
2369  * @author Djalel.ABDEMOUCHE
2370  * @version 0.1
2371  * @see sciSetCurrentObj
2372  */
2373 sciPointObj *
2374 ConstructSegs (sciPointObj * pparentsubwin, integer type,double *vx, double *vy, 
2375                integer Nbr1,integer Nbr2, double *vfx, double *vfy, integer flag,
2376                integer *style, double arsize, integer colored, double arfact, int typeofchamp) 
2377 {
2378   sciPointObj *pobj = (sciPointObj *) NULL;
2379   sciSegs *psegs = (sciSegs *) NULL;
2380   integer i;
2381
2382   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
2383     {
2384       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2385         return (sciPointObj *) NULL;
2386       sciSetEntityType (pobj, SCI_SEGS);
2387       if ((pobj->pfeatures = MALLOC ((sizeof (sciSegs)))) == NULL)
2388         {
2389           FREE(pobj);
2390           return (sciPointObj *) NULL;
2391         }
2392       if (sciAddNewHandle (pobj) == -1)
2393         {
2394           FREE(pSEGS_FEATURE(pobj));
2395           FREE(pobj);
2396           return (sciPointObj *) NULL;
2397         }
2398       /*sciSetParent (pobj, pparentsubwin);*/
2399       if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
2400         {
2401           sciDelHandle (pobj);
2402           FREE(pSEGS_FEATURE(pobj));
2403           FREE(pobj);
2404           return (sciPointObj *) NULL;
2405         }
2406       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2407       pSEGS_FEATURE (pobj)->user_data = (int *) NULL;
2408       pSEGS_FEATURE (pobj)->size_of_user_data = 0;
2409       pSEGS_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
2410       pSEGS_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
2411
2412       pSEGS_FEATURE (pobj)->callback = (char *)NULL;
2413       pSEGS_FEATURE (pobj)->callbacklen = 0;
2414       pSEGS_FEATURE (pobj)->callbackevent = 100;
2415        
2416       pSEGS_FEATURE (pobj)->isselected = TRUE;
2417       pSEGS_FEATURE (pobj)->visible = sciGetVisibility(sciGetParentSubwin(pobj)); 
2418
2419       /* this must be done prior to the call of sciSetClipping to know */
2420       /* if the clip_state has been set */
2421       pSEGS_FEATURE (pobj)->clip_region_set = 0;
2422       /*pSEGS_FEATURE (pobj)->isclip = sciGetIsClipping((sciPointObj *) sciGetParentSubwin(pobj)); */
2423       sciInitIsClipping( pobj, sciGetIsClipping(sciGetParentSubwin(pobj) ));
2424       sciSetClipping(pobj,sciGetClipping(sciGetParentSubwin(pobj)));
2425       
2426       /*       pSEGS_FEATURE (pobj)->clip_region = (double *) NULL; */
2427    
2428       psegs = pSEGS_FEATURE (pobj); 
2429       psegs->ptype = type;
2430
2431       /* psegs->arrowsize = 50.;  */ /* default value F.Leray 25.03.04*/
2432           
2433       if ((psegs->vx = MALLOC (Nbr1 * sizeof (double))) == NULL)
2434         { 
2435           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2436           sciDelHandle (pobj);
2437           FREE(pSEGS_FEATURE(pobj));
2438           FREE(pobj);
2439           return (sciPointObj *) NULL;
2440         }
2441       if ((psegs->vy = MALLOC (Nbr2 * sizeof (double))) == NULL)
2442         { 
2443           FREE(pSEGS_FEATURE (pobj)->vx);
2444           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2445           sciDelHandle (pobj);
2446           FREE(pSEGS_FEATURE(pobj));
2447           FREE(pobj);
2448           return (sciPointObj *) NULL;
2449         }
2450      
2451       for (i = 0; i < Nbr1; i++)
2452         {
2453           psegs->vx[i] = vx[i];
2454         } 
2455       for (i = 0; i < Nbr2; i++)
2456         {
2457           psegs->vy[i] = vy[i];
2458         } 
2459       pSEGS_FEATURE (pobj)->vz=(double *) NULL; /**DJ.Abdemouche 2003**/
2460       psegs->ptype = type;
2461
2462       /* F.Leray Test imprortant sur type ici*/
2463       if (type == 0) /* attention ici type = 0 donc...*/
2464         {
2465           psegs->typeofchamp = -1; /* useless property in the case type == 0 */
2466           psegs->arrowsize = arsize /** 100*/;       /* A revoir: F.Leray 06.04.04 */
2467           if ((psegs->pstyle = MALLOC (Nbr1 * sizeof (integer))) == NULL)
2468             {
2469               FREE(pSEGS_FEATURE (pobj)->vx); 
2470               FREE(pSEGS_FEATURE (pobj)->vy); 
2471               sciDelThisToItsParent (pobj, sciGetParent (pobj));
2472               sciDelHandle (pobj);
2473               FREE(pSEGS_FEATURE(pobj));
2474               FREE(pobj);
2475               return (sciPointObj *) NULL;
2476             }
2477           if (flag == 1)
2478             {
2479               for (i = 0; i < Nbr1; i++)
2480                 psegs->pstyle[i] = style[i];
2481             }
2482           else {
2483             for (i = 0; i < Nbr1; i++)
2484               psegs->pstyle[i] =  style[0];
2485           }
2486         
2487           psegs->iflag = flag; 
2488           psegs->Nbr1 = Nbr1;
2489         }       
2490       else /* Warning here type = 1 so... building comes from champg */
2491         { 
2492           /* Rajout de psegs->arrowsize = arsize; F.Leray 18.02.04*/
2493           psegs->arrowsize = arsize /* * 100 */;
2494           psegs->Nbr1 = Nbr1;   
2495           psegs->Nbr2 = Nbr2;    
2496           sciInitForeground(pobj,sciGetForeground(sciGetSelectedSubWin (sciGetCurrentFigure ()))); /* set sciGetForeground(psubwin) as the current foreground */
2497           psegs->typeofchamp = typeofchamp; /* to know if it is a champ or champ1 */
2498           psegs->parfact = arfact;
2499           if ((psegs->vfx = MALLOC ((Nbr1*Nbr2) * sizeof (double))) == NULL)
2500             {
2501               FREE(pSEGS_FEATURE (pobj)->vx); 
2502               FREE(pSEGS_FEATURE (pobj)->vy); 
2503               sciDelThisToItsParent (pobj, sciGetParent (pobj));
2504               sciDelHandle (pobj);
2505               FREE(pSEGS_FEATURE(pobj));
2506               FREE(pobj);
2507               return (sciPointObj *) NULL;
2508             }
2509           if ((psegs->vfy = MALLOC ((Nbr1*Nbr2) * sizeof (double))) == NULL)
2510             {
2511               FREE(pSEGS_FEATURE (pobj)->vx); 
2512               FREE(pSEGS_FEATURE (pobj)->vy);
2513               FREE(pSEGS_FEATURE (pobj)->vfx); 
2514               sciDelThisToItsParent (pobj, sciGetParent (pobj));
2515               sciDelHandle (pobj);
2516               FREE(pSEGS_FEATURE(pobj));
2517               FREE(pobj);
2518               return (sciPointObj *) NULL;
2519             }  
2520           
2521           for (i = 0; i < (Nbr1*Nbr2); i++)
2522             {
2523               psegs->vfx[i] = vfx[i];
2524               psegs->vfy[i] = vfy[i]; 
2525             }
2526           pSEGS_FEATURE (pobj)->vfz=(double *) NULL; /**DJ.Abdemouche 2003**/
2527         }       
2528       if (sciInitGraphicContext (pobj) == -1)
2529         {
2530           FREE(pSEGS_FEATURE (pobj)->vx);
2531           FREE(pSEGS_FEATURE (pobj)->vy);  
2532           if (type ==0)
2533             {
2534               FREE(pSEGS_FEATURE (pobj)->pstyle);
2535             }
2536           else
2537             {
2538               FREE(pSEGS_FEATURE (pobj)->vfx);  
2539               FREE(pSEGS_FEATURE (pobj)->vfy);  
2540             }         
2541           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2542           sciDelHandle (pobj);
2543           FREE(pSEGS_FEATURE(pobj));
2544           FREE(pobj);
2545           return (sciPointObj *) NULL;
2546         }
2547       return pobj;
2548     }
2549   else
2550     {
2551       sciprint ("The parent has to be a SUBWIN \n");
2552       return (sciPointObj *) NULL;
2553     }
2554 }
2555
2556
2557 /**sciConstructCompound
2558  * @memo constructes an Compound of entities
2559  * @memo do only a association with a parent and a handle reservation !
2560  * @memo check for valid handle can be done using CheckForCompound
2561  */
2562 sciPointObj *
2563 ConstructCompound (long *handelsvalue, int number) /* Conflicting types with definition */
2564 {
2565   /* sciSons *sons, *sonsnext; */
2566   sciPointObj * pobj       ;
2567   sciAgreg    * ppCompound ;
2568   int i;
2569   long xtmp;
2570
2571  
2572   if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2573     return (sciPointObj *) NULL;
2574
2575   sciSetEntityType (pobj, SCI_AGREG);
2576   if ((pobj->pfeatures = MALLOC ((sizeof (sciAgreg)))) == NULL)
2577     return (sciPointObj *) NULL;
2578
2579   /* get the pointer on features */
2580   ppCompound = pAGREG_FEATURE (pobj) ;
2581
2582   if (sciAddNewHandle (pobj) == -1)
2583     {
2584       sciprint("no handle to allocate\n");
2585       return (sciPointObj *) NULL;
2586     }
2587
2588   /* the parent of the Compound will be the parent of the sons entities */
2589   if (!(sciAddThisToItsParent (pobj, (sciPointObj *)sciGetParent(
2590                                  sciGetPointerFromHandle((long) handelsvalue[0])))))
2591     return NULL;
2592
2593   sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2594   ppCompound->user_data = (int *) NULL;
2595   ppCompound->size_of_user_data = 0;
2596   ppCompound->relationship.psons = (sciSons *) NULL;
2597
2598   ppCompound->callback = (char *)NULL;
2599   ppCompound->callbacklen = 0;
2600   ppCompound->visible = sciGetVisibility(sciGetParentSubwin(pobj));
2601
2602   /* sonsnext = (sciSons *) NULL */
2603
2604   /* initialisation with the first son */
2605   xtmp = (long) handelsvalue[0];
2606   for ( i = 0 ; i < number ; i++ )
2607     {
2608       /* if ((sons = MALLOC ((sizeof (sciSons)))) == NULL) */
2609 /*      return (sciPointObj *)NULL; */
2610       /* if (i == 0) */
2611 /*         ppCompound->relationship.plastsons = (sciSons *)sons; */
2612
2613       /* xtmp = handelsvalue[i]; */
2614       /* sons->pointobj = sciGetPointerFromHandle(xtmp); */
2615
2616       /* Nous changeons le parent de l'entite qui devient alors l'Compound */
2617       /* if (sons->pointobj != NULL) */
2618 /*      { */
2619 /*        sciDelThisToItsParent (sons->pointobj, sciGetParent(temp)); */
2620 /*        sciAddThisToItsParent (sons->pointobj, pobj); */
2621 /*      } */
2622
2623       /* sons->pprev         = (sciSons *)NULL; */
2624 /*       sons->pnext         = sonsnext; */
2625
2626 /*       if (sonsnext != NULL ) */
2627 /*       { */
2628 /*         sonsnext->pprev = sons; */
2629 /*       } */
2630
2631 /*       sonsnext            = sons; */
2632
2633
2634       /* jb Silvy 10/01/06 */
2635       /* the handle id moved from the current parent (ex axis) to the compund */
2636       sciPointObj * movedObject ;
2637       xtmp = handelsvalue[i] ;
2638       movedObject = sciGetPointerFromHandle(xtmp) ;
2639       if ( movedObject != NULL )
2640       {
2641         sciDelThisToItsParent( movedObject, sciGetParent(movedObject) ) ;
2642         sciAddThisToItsParent( movedObject, pobj ) ;
2643       }
2644     }
2645
2646  /*  ppCompound->relationship.psons = sons; */
2647   ppCompound->isselected = TRUE;
2648
2649   return (sciPointObj *)pobj;
2650 }
2651
2652 /**sciConstructCompoundSeq
2653  * @memo constructes an Compound of with the last n entities created in the current subwindow
2654  on entry subwin children list is
2655  null->s1->s2->...->sn->sn+1->...->null
2656  on exit it is
2657  null->A->sn+1->...->null
2658  with A an Compound whose children list is:
2659  null->s1->s2->...->sn->null
2660 */
2661 sciPointObj *
2662 ConstructCompoundSeq (int number) 
2663 {
2664   sciSons *sons, *lastsons;
2665   sciPointObj *pobj;
2666   int i;
2667
2668   sciPointObj *psubwin;
2669   sciSubWindow *ppsubwin;
2670   sciAgreg     *ppagr;
2671   
2672   psubwin = (sciPointObj *)sciGetSelectedSubWin (sciGetCurrentFigure ());
2673   ppsubwin=pSUBWIN_FEATURE(psubwin);
2674
2675   /* initialize the A Compound data structure */
2676   if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2677     return (sciPointObj *) NULL;
2678
2679   sciSetEntityType (pobj, SCI_AGREG);
2680   if ((pobj->pfeatures = MALLOC ((sizeof (sciAgreg)))) == NULL)
2681     return (sciPointObj *) NULL;
2682   ppagr=pAGREG_FEATURE(pobj);
2683
2684   if (sciAddNewHandle (pobj) == -1)
2685     {
2686       sciprint("no handle to allocate\n");
2687       FREE(pobj->pfeatures);FREE(pobj);
2688       return (sciPointObj *) NULL;
2689     }
2690
2691
2692   sons=ppsubwin->relationship.psons;
2693   /* check if s1 predecessor is null*/
2694   if (sons->pprev != (sciSons *)NULL) {
2695     sciprint("Unexpected case, please report\n");
2696     FREE(pobj->pfeatures);FREE(pobj);
2697     return (sciPointObj *) NULL;
2698   }
2699
2700   /* change parent of all sons s1,...,sn*/
2701   lastsons=sons;
2702
2703   
2704   /*   sciprint("debut\n"); */
2705   
2706   for (i=0;i<number;i++) {
2707    
2708     /*     sciprint("%8x %8x %8x  |  %8x\n",lastsons->pprev,lastsons->pointobj,lastsons->pnext, */
2709     /*       sciGetRelationship (lastsons->pointobj)->pparent); */
2710     
2711     (sciGetRelationship (lastsons->pointobj))->pparent=pobj;
2712     lastsons=lastsons->pnext;
2713   }
2714
2715   lastsons=lastsons->pprev; /* lastsons is sn */
2716
2717   /* disconnect chain s1->s2->...->sn out of subwin children list */
2718   ppsubwin->relationship.psons = lastsons->pnext;
2719   ppsubwin->relationship.psons->pprev = (sciSons *)NULL;
2720   /* attach the Compound to the current subwin */
2721   /* the subwin children list is now null->A->sn+1->...->null */
2722   if (!(sciAddThisToItsParent (pobj, (sciPointObj *)psubwin))) {
2723     FREE(pobj->pfeatures);FREE(pobj);
2724     return (sciPointObj *) NULL;
2725   }
2726   sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2727   /* the subwin children list is now null->A->sn+1->...->null */
2728
2729   /* set Compound properties*/
2730   ppagr->user_data = (int *) NULL; /* add missing init. 29.06.05 */
2731   ppagr->size_of_user_data = 0;
2732   ppagr->callback = (char *)NULL;
2733   ppagr->callbacklen = 0;
2734   ppagr->visible = sciGetVisibility (sciGetParentFigure(pobj));
2735
2736   ppagr->isselected = TRUE;
2737  
2738   /* re chain A sons lists */
2739   ppagr->relationship.psons = sons;
2740   
2741   ppagr->relationship.plastsons = lastsons;
2742   ppagr->relationship.plastsons->pnext = (sciSons *)NULL;
2743   ppagr->relationship.psons->pprev = (sciSons *)NULL; /* this should do nothing*/
2744   /* the Compound children list is now  null->s1->s2->...->sn->null*/
2745
2746
2747   return (sciPointObj *)pobj;
2748 }
2749
2750
2751
2752 /**ConstructLabel
2753  * This function creates Label structure used for x,y,z labels and for the Title.
2754  * @param  sciPointObj *pparentsubwin
2755  * @param  char text[] : intial text string.
2756  * @param  int type to get info. on the type of label
2757  * @return  : pointer sciPointObj if ok , NULL if not
2758  */
2759 sciPointObj *
2760 ConstructLabel (sciPointObj * pparentsubwin, char *text, int type)
2761 {
2762   sciPointObj * pobj = NULL;
2763   /* get a pointer on the feature */
2764   sciLabel    * ppLabel ;
2765   char * emptyString = "" ;
2766   int defaultColor = 0 ;
2767   
2768   if (sciGetEntityType (pparentsubwin) == SCI_SUBWIN)
2769   {
2770     if ((pobj = MALLOC (sizeof (sciPointObj))) == NULL)
2771     {
2772       return (sciPointObj *) NULL;
2773     }
2774
2775     sciSetEntityType (pobj, SCI_LABEL);
2776     if ((pobj->pfeatures = MALLOC ((sizeof (sciLabel)))) == NULL)
2777     {
2778       FREE(pobj);
2779       return (sciPointObj *) NULL;
2780     }
2781
2782     ppLabel =  pLABEL_FEATURE( pobj ) ;
2783
2784     ppLabel->text = allocateText( pparentsubwin, &emptyString, 1, 1,
2785                                   0.0, 0.0, TRUE, NULL, FALSE, &defaultColor, &defaultColor,
2786                                   FALSE, FALSE, FALSE, ALIGN_LEFT ) ;
2787
2788     if ( ppLabel->text == NULL )
2789     {
2790       FREE(ppLabel);
2791       FREE(pobj);
2792       return NULL ;
2793     }
2794     
2795     if (sciAddNewHandle (pobj) == -1)
2796     {
2797       deallocateText( ppLabel->text ) ;
2798       FREE(ppLabel);
2799       FREE(pobj);
2800       return NULL;
2801     }
2802     
2803     if (!(sciAddThisToItsParent (pobj, pparentsubwin)))
2804     {
2805       deallocateText( ppLabel->text ) ;
2806       sciDelHandle (pobj);
2807       FREE(ppLabel);
2808       FREE(pobj);
2809       return NULL;
2810     }
2811     
2812     sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2813     sciInitIsFilled(pobj,FALSE); /* by default a simple text is display (if existing) */
2814     
2815     sciInitIs3d( pobj, FALSE ) ; /* the text of labels is displayed using 2d scale */
2816
2817     ppLabel->ptype = type;
2818     ppLabel->auto_position = TRUE;
2819     ppLabel->auto_rotation = TRUE;
2820
2821     ppLabel->isselected = TRUE;
2822     if (sciInitFontContext (pobj) == -1)
2823     {
2824       DestroyLabel( pobj ) ;
2825       return (sciPointObj *) NULL;
2826     }
2827     
2828     return (sciPointObj *) pobj;
2829   }
2830   else
2831   {
2832     sciprint ("The parent has to be a SUBWIN \n");
2833     return (sciPointObj *) NULL;
2834   }
2835 }
2836
2837
2838 /**ConstructMenu
2839  * @memo This function creates Menu structure
2840  */
2841 sciPointObj *
2842 ConstructMenu (sciPointObj * pparentfigure, char plabel[], int n)
2843 {
2844   sciPointObj *pobj = (sciPointObj *) NULL;
2845
2846   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
2847     {
2848       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2849         return (sciPointObj *) NULL;
2850       sciSetEntityType (pobj, SCI_MENU);
2851       if ((pobj->pfeatures = MALLOC ((sizeof (sciMenu)))) == NULL)
2852         {
2853           FREE(pobj);
2854           return (sciPointObj *) NULL;
2855         }
2856       if (sciAddNewHandle (pobj) == -1)
2857         {
2858           FREE(pMENU_FEATURE (pobj));
2859           FREE(pobj);
2860           return (sciPointObj *) NULL;
2861         }
2862       /*sciSetParent (pobj, pparentfigure);*/
2863       if (!(sciAddThisToItsParent (pobj, pparentfigure)))
2864         {
2865           sciDelHandle (pobj);
2866           FREE(pMENU_FEATURE (pobj));
2867           FREE(pobj);
2868           return (sciPointObj *) NULL;
2869         }
2870       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2871       pMENU_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
2872       pMENU_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
2873
2874       if (sciAddLabelMenu (pobj, plabel, n) == -1)
2875         {
2876           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2877           sciDelHandle (pobj);
2878           FREE(pMENU_FEATURE (pobj));
2879           FREE(pobj);
2880           return (sciPointObj *) NULL;
2881         }
2882
2883       if (sciInitGraphicContext (pobj) == -1)
2884         {
2885           sciDelLabelsMenu (pobj);
2886           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2887           sciDelHandle (pobj);
2888           FREE(pMENU_FEATURE (pobj));
2889           FREE(pobj);
2890           return (sciPointObj *) NULL;
2891         }
2892       sciInitFontContext (pobj);
2893
2894       return (sciPointObj *) pobj;
2895     }
2896   else
2897     {
2898       sciprint ("The parent has to be a SUBWIN \n");
2899       return (sciPointObj *) NULL;
2900     }
2901 }
2902
2903
2904 /**ConstructMenuContext
2905  * @memo This function creates MenuContext structure only for tests on Widows system during developpement.
2906  * @memo ths function may be not incuded in the final version
2907  * pour obtenir un menu de contexe vide pour chacune des entites. L'utilisateur specifie avec un addlabel les label et callback necessaire ensuite.
2908  * @param  sciPointObj * pparentfigure: the parent entity
2909  */
2910 sciPointObj *
2911 ConstructMenuContext (sciPointObj * pparentfigure)
2912 {
2913   sciPointObj *pobj = (sciPointObj *) NULL;
2914
2915   if (sciGetEntityType (pparentfigure) == SCI_FIGURE)
2916     {
2917       if ((pobj = MALLOC ((sizeof (sciPointObj)))) == NULL)
2918         return (sciPointObj *) NULL;
2919       sciSetEntityType (pobj, SCI_MENUCONTEXT);
2920       if ((pobj->pfeatures = MALLOC ((sizeof (sciMenuContext)))) == NULL)
2921         {
2922           FREE(pobj);
2923           return (sciPointObj *) NULL;
2924         }
2925       if (sciAddNewHandle (pobj) == -1)
2926         {
2927           FREE(pMENUCONTEXT_FEATURE (pobj));
2928           FREE(pobj);
2929           return (sciPointObj *) NULL;
2930         }
2931       /*sciSetParent (pobj, pparentfigure);*/
2932       if (!(sciAddThisToItsParent (pobj, pparentfigure)))
2933         {
2934           sciDelHandle (pobj);
2935           FREE(pMENUCONTEXT_FEATURE (pobj));
2936           FREE(pobj);
2937           return (sciPointObj *) NULL;
2938         }
2939       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
2940       /*if (sciAddLabelMenu (pobj, plabel, n) == -1)
2941         return (sciPointObj *) NULL;*/
2942       pMENUCONTEXT_FEATURE (pobj)->relationship.psons = (sciSons *) NULL;
2943       pMENUCONTEXT_FEATURE (pobj)->relationship.plastsons = (sciSons *) NULL;
2944
2945       if (sciInitGraphicContext (pobj) == -1)
2946         {
2947           sciDelThisToItsParent (pobj, sciGetParent (pobj));
2948           sciDelHandle (pobj);
2949           FREE(pMENUCONTEXT_FEATURE (pobj));
2950           FREE(pobj);
2951           return (sciPointObj *) NULL;
2952         }
2953       sciInitFontContext (pobj);
2954
2955       /* windows dependant*/
2956       /*     if ((pMENUCONTEXT_FEATURE(pobj)->hPopMenu = CreatePopupMenu ()) == NULL) 
2957              {
2958              sciprint ("Scilab can't have more menu \n");
2959              FREE ((sciGetFontContext(pobj))->pfontname);
2960              sciDelThisToItsParent (pobj, sciGetParent (pobj));
2961              sciDelHandle (pobj);
2962              FREE(pMENUCONTEXT_FEATURE (pobj));
2963              FREE(pobj);
2964              return (sciPointObj *) NULL;
2965              }
2966              AppendMenu (pMENUCONTEXT_FEATURE(pobj)->hPopMenu, MF_SEPARATOR , 0, NULL);*/
2967       /*AppendMenu (sciGethPopMenu (pobj), MF_STRING, 4401, plabel);*/
2968
2969       return (sciPointObj *) pobj;
2970     }
2971   else
2972     {
2973       sciprint ("The parent has to be a SUBWIN \n");
2974       return (sciPointObj *) NULL;
2975     }
2976 }
2977
2978
2979
2980 /**sciAddLabelMenu
2981  * @memo This function add one label to this menu
2982  * @param sciPointObj * pthis: the pointer to the entity
2983  * @return 0 if ok, -1 if not
2984  */
2985 int
2986 sciAddLabelMenu (sciPointObj * pthis, char plabel[], int n)
2987 {
2988   sciLabelMenu *pscilabelmenutmp;
2989
2990   switch (sciGetEntityType (pthis))
2991     {
2992     case SCI_MENU:
2993       pscilabelmenutmp = (sciLabelMenu *) (pMENU_FEATURE (pthis)->plabelmenu);
2994       break;
2995     case SCI_MENUCONTEXT:
2996       pscilabelmenutmp =
2997         (sciLabelMenu *) (pMENUCONTEXT_FEATURE (pthis)->plabelmenu);
2998       break;
2999     case SCI_AGREG:
3000     default:
3001       return -1;
3002       break;
3003     }
3004   while (pscilabelmenutmp != (sciLabelMenu *) NULL)
3005     pscilabelmenutmp = (sciLabelMenu *) pscilabelmenutmp->pnextlabelmenu;
3006   if ((pscilabelmenutmp = MALLOC (sizeof (sciLabelMenu))) == NULL)
3007     return -1;
3008   if ((pscilabelmenutmp->plabel = CALLOC (n+1, sizeof (char))) == NULL)
3009     {
3010       sciprint("\nNo more place to allocates text string, try a shorter string\n");
3011       return -1;
3012     }
3013   strncpy (pscilabelmenutmp->plabel, plabel, n);
3014   pscilabelmenutmp->pnextlabelmenu = (sciLabelMenu *) NULL;
3015   return 0;
3016 }
3017
3018
3019 /*sciAttachPopMenu
3020  * This function sets the handle of the menu associated with this object
3021  * @param sciPointObj * pthis: the pointer to the entity
3022  */
3023 int
3024 sciAttachPopMenu (sciPointObj *pthis, sciPointObj *pPopMenu)
3025 {
3026   /*  HWND hwnd_window_pointed;*/     /* structure BCG periWIN ! winuser.h "Window */
3027    
3028   if (sciGetEntityType(pPopMenu) == SCI_MENUCONTEXT) /* verification of the validate type */
3029     {
3030       /* On cherche le handle de la fenetre selectionnnee */
3031       /* hwnd_window_pointed = WindowFromPoint(Point);    */
3032       switch(sciGetEntityType(pthis)) {
3033       case SCI_SUBWIN:
3034         pSUBWIN_FEATURE (pthis)->pPopMenu = pPopMenu;
3035         return 0;
3036         break;
3037       case SCI_MENUCONTEXT:
3038       case SCI_FIGURE:
3039       case SCI_TEXT:
3040       case SCI_TITLE:
3041       case SCI_LEGEND:
3042       case SCI_ARC:
3043       case SCI_SEGS: 
3044       case SCI_FEC:
3045       case SCI_GRAYPLOT: 
3046       case SCI_POLYLINE:
3047       case SCI_RECTANGLE:
3048       case SCI_SURFACE: 
3049       case SCI_LIGHT:
3050       case SCI_AXES:
3051       case SCI_PANNER:
3052       case SCI_SBH:
3053       case SCI_SBV:
3054       case SCI_MENU:
3055       case SCI_STATUSB:
3056       case SCI_AGREG:
3057       case SCI_LABEL: /* F.Leray 28.05.04 */
3058       default: 
3059         return -1;
3060         break;
3061       }
3062     }
3063   sciprint("Your second entity is not a popup menu !\n");
3064   return -1;
3065 }
3066
3067 /**ConstructUimenu
3068  * @memo This function creates Uimenu structure.
3069  * @param  sciPointObj *pparentfigure
3070  * @param  char label[] : intial label string.
3071  * @param  char callback[] : intial text callback string .
3072  * @param  BOOL handle_visible : handle visibility in child list .
3073  * @return  : pointer sciPointObj if ok , NULL if not
3074  */
3075 sciPointObj * ConstructUimenu (sciPointObj * pparent, char *label,char *callback,BOOL handle_visible)
3076 {
3077   sciPointObj *pobj = (sciPointObj *) NULL;
3078   sciUimenu *ppobj=NULL;
3079
3080   if ( (sciGetEntityType (pparent) == SCI_FIGURE) || (sciGetEntityType (pparent) == SCI_UIMENU) )
3081     {
3082       if ((pobj = MALLOC (sizeof (sciPointObj))) == NULL)       return (sciPointObj *) NULL;
3083
3084       sciSetEntityType (pobj, SCI_UIMENU);
3085
3086       if ((pobj->pfeatures = MALLOC ((sizeof (sciUimenu)))) == NULL)
3087         {
3088           FREE(pobj);
3089           return (sciPointObj *) NULL;
3090         }
3091       ppobj=pUIMENU_FEATURE (pobj);
3092       if (sciAddNewHandle (pobj) == -1)
3093         {
3094           FREE(pobj->pfeatures);
3095           FREE(pobj);
3096           return (sciPointObj *) NULL;
3097         }
3098       /*  sciSetParent (pobj, pparentsubwin); */
3099       if (!(sciAddThisToItsParent (pobj, pparent)))
3100         {
3101           sciDelHandle (pobj);
3102           FREE(pobj->pfeatures);
3103           FREE(pobj);
3104           return (sciPointObj *) NULL;
3105         }
3106
3107       sciSetCurrentSon (pobj, (sciPointObj *) NULL);
3108                 
3109       pUIMENU_FEATURE (pobj)->label.relationship.psons = (sciSons *) NULL;
3110       pUIMENU_FEATURE (pobj)->label.relationship.plastsons = (sciSons *) NULL;
3111
3112       if ((pUIMENU_FEATURE (pobj)->label.callback = CALLOC(strlen(callback)+1,sizeof(char))) == NULL )
3113         {
3114           sciprint("No more place to allocates text string, try a shorter string");
3115           return (sciPointObj *) NULL;
3116         }
3117
3118       strcpy(pUIMENU_FEATURE (pobj)->label.callback,callback);
3119       pUIMENU_FEATURE (pobj)->label.callbacklen = strlen(callback); 
3120
3121       pUIMENU_FEATURE (pobj)->visible = TRUE; /* A changer */ 
3122
3123       pUIMENU_FEATURE (pobj)->label.pStrings = newFullStringMatrix( &label, 1 , 1 ) ;
3124
3125       if ( pUIMENU_FEATURE (pobj)->label.pStrings == NULL)
3126         {
3127           sciprint("No more place to allocates label string, try a shorter string");
3128           sciDelThisToItsParent (pobj, sciGetParent (pobj));
3129           sciDelHandle (pobj);
3130           FREE(pUIMENU_FEATURE(pobj));
3131           FREE(pobj);
3132           return (sciPointObj *) NULL;
3133         }
3134       
3135       pUIMENU_FEATURE (pobj)->handle_visible=handle_visible;
3136       pUIMENU_FEATURE (pobj)->MenuPosition=0;
3137       pUIMENU_FEATURE (pobj)->CallbackType=0;
3138       pUIMENU_FEATURE (pobj)->Enable=TRUE;
3139
3140       return (sciPointObj *) pobj;
3141     }
3142   else
3143     {
3144       sciprint ("The parent has to be a FIGURE or a UIMENU\n");
3145       return (sciPointObj *) NULL;
3146     }
3147 }
3148