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