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