Remove graphics.h file.
[scilab.git] / scilab / modules / graphics / src / c / DestroyObjects.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, INRIA 2005-xxxx
9  *    Comment:
10  *    This file contains all functions used to BUILD new objects : 
11  - break the binding between the deleted object and its parent in the 
12  existing hierarchy
13  - freeing memory
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 #include "DestroyObjects.h"
24 #include "GetProperty.h"
25 #include "DrawObjects.h"
26 #include "SetProperty.h"
27 #include "Interaction.h" /* for callback funtions */
28 #include "StringMatrix.h"
29 #include "Xcall1.h"
30 #include "WindowList.h"
31 #include "PloEch.h"
32 #include "sciprint.h"
33
34 #ifdef WITH_TK
35 #include "../../../tclsci/includes/GedManagement.h"
36 #endif
37
38 #include "MALLOC.h" /* MALLOC */
39
40
41 /*----------------------------------------------------------------------------*/
42
43 /********************* modifie le 01/02/2002 ************************
44  * On detruit pas la sous fenetre, elle est initialiser avec la figure
45  * pour cette version, on considere qu'il y'a 1 seule sous fenetre et 
46  * elle suit la fenetre principale (voir xbasc() ), la fenetre n'est pas 
47  * consideree comme un des fils.  
48  **DestroyAllGraphicsSons
49  * This function destroies childs and pthis
50  * @param sciPointObj * pthis: the pointer to the entity
51  */
52 int
53 DestroyAllGraphicsSons (sciPointObj * pthis)
54 {
55   /* to destroy only the sons put the while into the switch !*/
56   sciSons *toto = NULL;
57  
58   toto = sciGetSons (pthis);
59   while ((toto != (sciSons *) NULL) &&
60          (toto->pointobj != (sciPointObj *) NULL))
61     {
62       DestroyAllGraphicsSons (toto->pointobj);
63       toto = sciGetSons (pthis);
64     }
65   switch (sciGetEntityType (pthis))
66     {
67
68     case SCI_FIGURE:
69       return 0;
70       break;
71     case SCI_SUBWIN:
72       DestroySubWin (pthis);
73       return 0;
74       break;
75     case SCI_TEXT:
76       DestroyText (pthis);
77       return 0;
78       break;
79     case SCI_TITLE:
80       DestroyTitle (pthis);
81       return 0;
82       break;
83     case SCI_LEGEND:
84       DestroyLegend (pthis);
85       return 0;
86       break;
87     case SCI_ARC:
88       DestroyArc (pthis);
89       return 0; 
90       break;
91     case SCI_SEGS:
92       DestroySegs (pthis);
93       return 0;
94       break;  
95     case SCI_FEC:  
96       DestroyFec (pthis);
97       return 0;
98       break; 
99     case SCI_GRAYPLOT: 
100       DestroyGrayplot (pthis);
101       return 0;
102       break; 
103     case SCI_POLYLINE:
104       DestroyPolyline (pthis);
105       return 0;
106       break;
107     case SCI_RECTANGLE:
108       DestroyRectangle (pthis);
109       return 0;
110       break;
111     case SCI_SURFACE:
112       DestroySurface (pthis);
113       return 0;
114       break;
115     case SCI_LIGHT:
116       break;
117     case SCI_AXES:
118       DestroyAxes (pthis);
119       return 0;
120       break;
121     case SCI_PANNER:
122       break;
123     case SCI_SBH:
124       DestroyScrollH (pthis);
125       return 0;
126       break;
127     case SCI_SBV:
128       DestroyScrollV (pthis);
129       return 0;
130       break;
131     case SCI_MENU:
132       DestroySciMenu (pthis);
133       return 0;
134       break;
135     case SCI_MENUCONTEXT:
136       DestroyMenuContext (pthis);
137       return 0;
138       break;
139     case SCI_STATUSB:
140       DestroyStatusBar (pthis);
141       return 0;
142       break;
143     case SCI_AGREG:
144       DestroyCompound (pthis);
145       return 0;
146       break; 
147     case SCI_MERGE:
148       DestroyMerge (pthis);
149       return 0;
150       break;
151     case SCI_LABEL: /* F.Leray 28.05.04 */
152       DestroyLabel (pthis);
153       return 0;
154       break;
155     case SCI_UIMENU:
156       DestroyUimenu (pthis);
157       return 0;
158       break;
159     default:
160       sciprint ("Entity with type %d cannot be destroyed\n",sciGetEntityType (pthis));
161       return -1;
162       break;
163     }
164
165   return 0;
166 }
167
168
169
170 /**sciDelGraphicObj
171  * This function delete only users graphics object and its dependency limited to 
172  * SCI_TITLE SCI_LEGEND SCI_ARC SCI_POLYLINE SCI_RECTANGLE SCI_SURFACE 
173  * SCI_AXIS SCI_MENU SCI_MENUCONTEXT SCI_SUBWIN
174  * @param sciPointObj * pthis: the pointer to the entity
175  */
176 int
177 sciDelGraphicObj (sciPointObj * pthis)
178 {
179   switch (sciGetEntityType (pthis))
180     {
181     case SCI_TITLE:
182     case SCI_LEGEND:
183     case SCI_ARC:
184     case SCI_SEGS: 
185     case SCI_FEC: 
186     case SCI_GRAYPLOT: 
187     case SCI_POLYLINE:
188     case SCI_RECTANGLE:
189     case SCI_SURFACE:
190
191     case SCI_AXES:
192     case SCI_MENU:
193     case SCI_MENUCONTEXT:
194     case SCI_AGREG:
195     case SCI_TEXT:
196     case SCI_MERGE: 
197     case SCI_LABEL:
198     case SCI_UIMENU:
199       DestroyAllGraphicsSons (pthis);
200       return 0;
201       break;
202     case SCI_SUBWIN:
203       if (sciGetAxes (sciGetParent(pthis),pthis) == (sciPointObj *) NULL)
204         sciXbasc();
205       else
206         DestroyAllGraphicsSons (pthis);
207       return 0;
208       break;         
209     case SCI_FIGURE:
210     case SCI_LIGHT:
211     case SCI_PANNER:
212     case SCI_SBH:
213     case SCI_SBV:
214     case SCI_STATUSB:
215     default:
216       sciprint ("This object cannot be deleted\n");
217       return -1;
218       break;
219     }
220
221   return 0;
222 }
223
224 /*-----------------------------------------------------------------------------*/
225 /**
226  * erase a graphic window if necessary.
227  */
228 int C2F(scigerase)( void )
229 {
230   integer verb=0,lstr,v,na,win;
231   double dv;
232   char str[4];
233   C2F(xgetg)("auto clear",str,&lstr,11L,4L);
234   if (strcmp(str,"on") == 0) {
235     C2F(dr1)("xget","window",&verb,&win,&na,&v,&v,&v,&dv,&dv,&dv,&dv,5L,7L);
236     C2F(dr1)("xclear",C2F(cha1).buf,&v,&v,&v,&v,&v,&v,&dv,&dv,&dv,&dv,7L,bsiz);
237     C2F(dr1)("xstart",C2F(cha1).buf,&win,&v,&v,&v,&v,&v,&dv,&dv,&dv,&dv,7L,bsiz);
238   }
239   return 0;
240
241 /*-----------------------------------------------------------------------------*/
242
243 /**DestroyFigure
244  * This function destroies the parents window (manager) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
245  * @param sciPointObj * pthis: the pointer to the entity
246  */
247 int
248 DestroyFigure (sciPointObj * pthis)
249 {
250   /* there is no needed for 
251    * sciDelThisToItsParent(pthis, );
252    */
253   if (sciDelHandle (pthis) == -1)
254     return -1;
255   /* This code has to be validated on all systems
256    * because sciGetPointerToFeature returns a void
257    */
258   FREE ((sciGetFontContext(pthis))->pfontname);
259   FREE(pFIGURE_FEATURE(pthis)->pcolormap);
260   FREE(pFIGURE_FEATURE(pthis)->user_data);
261   pFIGURE_FEATURE(pthis)->size_of_user_data = 0;
262   FREE (sciGetPointerToFeature (pthis));
263   FREE (pthis);
264   /* delete windows() */
265   return 0;
266 }
267
268
269
270 /**DestroyStatusBar
271  * @memo This function destroies the StatusBar of Figure and the elementaries structures and returns pthis with NULL pointer and only this to destroy all sons use DelGraphicsSon
272  * @param sciPointObj * pthis: the pointer to the entity
273  */
274 int
275 DestroyStatusBar (sciPointObj * pthis)
276 {
277   sciDelThisToItsParent (pthis, sciGetParent (pthis));
278   if (sciDelHandle (pthis) == -1)
279     return -1;
280   FREE ((sciGetFontContext(pthis))->pfontname);
281   FREE (sciGetPointerToFeature (pthis));
282   FREE (pthis);
283   /* on peut alors destroyer la figure parente */
284   return 0;
285 }
286
287
288
289 /**DestroySubWin
290  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
291  * @param sciPointObj * pthis: the pointer to the entity
292  */
293 int
294 DestroySubWin (sciPointObj * pthis)
295
296   /* Add. grads arrays */ /* F.Leray 11.10.04 */
297   /* specific user arrays */
298   sciSubWindow * ppsubwin = pSUBWIN_FEATURE (pthis);
299
300
301   FREE( ppsubwin->axes.u_xgrads); ppsubwin->axes.u_xgrads = (double *) NULL;
302   FREE( ppsubwin->axes.u_ygrads); ppsubwin->axes.u_ygrads = (double *) NULL;
303   FREE( ppsubwin->axes.u_zgrads); ppsubwin->axes.u_zgrads = (double *) NULL;
304   ppsubwin->axes.u_xlabels = FreeUserLabels(ppsubwin->axes.u_xlabels, &ppsubwin->axes.u_nxgrads);
305   ppsubwin->axes.u_ylabels = FreeUserLabels(ppsubwin->axes.u_ylabels, &ppsubwin->axes.u_nygrads);
306   ppsubwin->axes.u_zlabels = FreeUserLabels(ppsubwin->axes.u_zlabels, &ppsubwin->axes.u_nzgrads);
307
308   ppsubwin->axes.u_xlabels = NULL;
309   ppsubwin->axes.u_ylabels = NULL;
310   ppsubwin->axes.u_zlabels = NULL;
311
312   ppsubwin->axes.u_nxgrads = 0;
313   ppsubwin->axes.u_nygrads = 0;
314   ppsubwin->axes.u_nzgrads = 0;
315  
316  
317   /* auto (computed) arrays are defined with max. length == 20 */
318   ppsubwin->axes.nxgrads = 0;
319   ppsubwin->axes.nygrads = 0;
320   ppsubwin->axes.nzgrads = 0;
321
322   FREE(ppsubwin->user_data);
323   ppsubwin->size_of_user_data = 0;
324
325   sciDelThisToItsParent (pthis, sciGetParent (pthis));
326   if (sciDelHandle (pthis) == -1)
327     return -1;
328   if ( sciGetCallback(pthis) != (char *)NULL)
329     FREE(sciGetCallback(pthis));
330
331   FREE ((sciGetFontContext(pthis))->pfontname);
332   FREE (sciGetPointerToFeature (pthis));
333   FREE (pthis); 
334   return 0;
335 }
336
337
338
339 /**DestroyScrollV
340  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
341  * @param sciPointObj * pthis: the pointer to the entity
342  */
343 int
344 DestroyScrollV (sciPointObj * pthis)
345 {
346   sciDelThisToItsParent (pthis, sciGetParent (pthis));
347   if (sciDelHandle (pthis) == -1)
348     return -1;
349   FREE (sciGetPointerToFeature (pthis));
350   FREE (pthis);
351   /* on peut alors destroyer la figure parente */
352   return 0;
353 }
354
355
356
357 /**DestroyScrollH
358  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
359  * @param sciPointObj * pthis: the pointer to the entity
360  */
361 int
362 DestroyScrollH (sciPointObj * pthis)
363 {
364   sciDelThisToItsParent (pthis, sciGetParent (pthis));
365   if (sciDelHandle (pthis) == -1)
366     return -1;
367   FREE (sciGetPointerToFeature (pthis));
368   FREE (pthis);
369   /* on peut alors destroyer la figure parente */
370   return 0;
371 }
372
373 /**
374  * free the structure used by the text object but does not remove the relationship links.
375  */
376 int deallocateText( sciPointObj * pthis )
377 {
378   deleteMatrix( pTEXT_FEATURE(pthis)->pStrings ) ;
379   FREE (pTEXT_FEATURE (pthis)->user_data);
380   pTEXT_FEATURE (pthis)->size_of_user_data = 0;
381
382   FREE (sciGetFontContext(pthis)->pfontname);
383   FREE (sciGetPointerToFeature (pthis));
384   FREE (pthis);
385
386   return 0;
387 }
388
389 /**DestroyText
390  * This function destroies Text structure and only this to destroy all sons use DelGraphicsSon
391  * @param sciPointObj * pthis: the pointer to the entity
392  */
393 int
394 DestroyText (sciPointObj * pthis)
395 {
396   deleteMatrix( pTEXT_FEATURE(pthis)->pStrings ) ;
397   FREE (pTEXT_FEATURE (pthis)->user_data);
398   pTEXT_FEATURE (pthis)->size_of_user_data = 0;
399   
400   sciDelThisToItsParent (pthis, sciGetParent (pthis));
401   if (sciDelHandle (pthis) == -1)
402     return -1;
403   FREE ((sciGetFontContext(pthis))->pfontname);
404   FREE (sciGetPointerToFeature (pthis));
405   FREE (pthis);
406   /* on peut alors destroyer le parent */
407   return 0;
408 }
409
410
411
412
413 /**DestroyTitle
414  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
415  * @param sciPointObj * pthis: the pointer to the entity
416  */
417 int
418 DestroyTitle (sciPointObj * pthis)
419 {
420   deleteMatrix( pTITLE_FEATURE (pthis)->text.pStrings ) ;
421   sciDelThisToItsParent (pthis, sciGetParent (pthis));
422   if (sciDelHandle (pthis) == -1)
423     return -1;
424   FREE ((sciGetFontContext(pthis))->pfontname);
425   FREE (sciGetPointerToFeature (pthis));
426   FREE (pthis);
427   /* on peut alors destroyer le parent */
428   return 0;
429 }
430
431
432
433
434 /**DestroyLegend
435  * @memo This function destroies legend and the elementaries structures and only this to destroy all sons use DelGraphicsSon
436  * @param sciPointObj * pthis: the pointer to the entity
437  */
438 int
439 DestroyLegend (sciPointObj * pthis)
440 {
441   sciLegend * ppLegend = pLEGEND_FEATURE (pthis) ;
442   FREE ( ppLegend->pptabofpointobj );
443   FREE ( ppLegend->pstyle ) ;
444   deleteMatrix( ppLegend->text.pStrings ) ;
445   FREE ( ppLegend->user_data);
446   ppLegend->size_of_user_data = 0;
447
448   sciDelThisToItsParent (pthis, sciGetParent (pthis));
449   if (sciDelHandle (pthis) == -1)
450     return -1;
451   FREE ((sciGetFontContext(pthis))->pfontname);
452   FREE (sciGetPointerToFeature (pthis));
453   FREE (pthis);
454   /* on peut alors destroyer le parent */
455   return 0;
456 }
457
458
459
460 /**DestroyPolyline
461  * @memo This function destroies Polyline and the elementaries structures and only this to destroy all sons use DelGraphicsSon
462  * @param sciPointObj * pthis: the pointer to the entity
463  */
464 int
465 DestroyPolyline (sciPointObj * pthis)
466 {
467   FREE (pPOLYLINE_FEATURE (pthis)->pvx);
468   FREE (pPOLYLINE_FEATURE (pthis)->pvy);
469   FREE (pPOLYLINE_FEATURE (pthis)->user_data);
470   pPOLYLINE_FEATURE (pthis)->size_of_user_data = 0;
471
472   if (pPOLYLINE_FEATURE (pthis)->pvz != NULL) /**DJ.Abdemouche 2003**/
473     FREE (pPOLYLINE_FEATURE (pthis)->pvz);
474   sciDelThisToItsParent (pthis, sciGetParent (pthis));
475   if (sciDelHandle (pthis) == -1)
476     return -1;
477   FREE (sciGetPointerToFeature (pthis));
478   FREE (pthis);
479   /* on peut alors destroyer le parent */
480   return 0;
481 }
482
483
484 /**DestroyArc
485  * @memo This function destroies Pacthc and the elementaries structures and only this to destroy all sons use DelGraphicsSon
486  * @param sciPointObj * pthis: the pointer to the entity
487  */
488 int
489 DestroyArc (sciPointObj * pthis)
490 {
491   FREE (pARC_FEATURE (pthis)->user_data);
492   pARC_FEATURE (pthis)->size_of_user_data = 0;
493   sciDelThisToItsParent (pthis, sciGetParent (pthis));
494   if (sciDelHandle (pthis) == -1)
495     return -1;
496   FREE(pARC_FEATURE (pthis)->callback);
497   FREE (sciGetPointerToFeature (pthis));
498   FREE (pthis);
499   /* on peut alors destroyer le parent */
500   return 0;
501 }
502
503
504
505 /**DestroyRectangle
506  * @memo This function destroies Rectangle and the elementaries structures and only this to destroy all sons use DelGraphicsSon
507  * @param sciPointObj * pthis: the pointer to the entity
508  */
509 int
510 DestroyRectangle (sciPointObj * pthis)
511 {
512   FREE (pRECTANGLE_FEATURE (pthis)->user_data);
513   pRECTANGLE_FEATURE (pthis)->size_of_user_data = 0;
514   sciDelThisToItsParent (pthis, sciGetParent (pthis));
515   if (sciDelHandle (pthis) == -1)
516     return -1;
517   FREE (sciGetPointerToFeature (pthis));
518   FREE (pthis);
519   /* on peut alors destroyer le parent */
520   return 0;
521 }
522
523
524
525 /**DestroySurface
526  * @memo This function destroies surface and the elementaries structures and only this to destroy all sons use DelGraphicsSon
527  * @param sciPointObj * pthis: the pointer to the entity
528  */
529 int
530 DestroySurface (sciPointObj * pthis)
531 {
532   sciPointObj * psubwin ;
533   sciSubWindow * ppSubWin ;
534   sciSurface * ppSurface = pSURFACE_FEATURE (pthis) ;
535   
536   psubwin  = sciGetParentSubwin(pthis) ;
537   ppSubWin = pSUBWIN_FEATURE ( psubwin ) ;
538
539   FREE (ppSurface->user_data);
540   ppSurface->size_of_user_data = 0;
541
542   FREE(ppSurface->pvecz);
543   FREE(ppSurface->pvecy);
544   FREE(ppSurface->pvecx);
545   FREE(ppSurface->inputCMoV); /* Adding F.Leray 24.03.04*/
546   FREE(ppSurface->color); /* Adding F.Leray 18.03.05 */
547   
548   if ( ppSurface->izcol != 0 )
549   { 
550     FREE(ppSurface->zcol);
551   }
552   ppSubWin->surfcounter-- ;
553   /* DJ.A 2003 */
554   sciDelThisToItsParent (pthis, sciGetParent (pthis));
555   if (sciDelHandle (pthis) == -1)
556   {
557     return -1;
558   }
559   FREE (sciGetPointerToFeature (pthis));
560   FREE (pthis);
561
562   /* delete the merge object if needed */
563   /* Jb Silvy 07/2006 */
564   updateMerge( psubwin ) ;
565
566   return 0;
567 }
568
569
570 int DestroyMerge (sciPointObj * pthis)
571 {
572   pSUBWIN_FEATURE (sciGetParentSubwin(pthis))->facetmerge = FALSE;
573   FREE (pMERGE_FEATURE (pthis)->user_data);
574   pMERGE_FEATURE (pthis)->size_of_user_data = 0;
575   FREE(pMERGE_FEATURE (pthis)->index_in_entity);
576   FREE(pMERGE_FEATURE (pthis)->from_entity);
577   sciDelThisToItsParent (pthis, sciGetParent (pthis));
578   if (sciDelHandle (pthis) == -1)
579     return -1;
580   FREE (sciGetPointerToFeature (pthis));
581   FREE (pthis);
582   return 0;
583 }
584
585
586
587 /**DestroyGrayplot
588  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
589  * @param sciPointObj * pthis: the pointer to the entity
590  * Djalel ABDEMOUCHE
591  */
592 int
593 DestroyGrayplot (sciPointObj * pthis)
594 {
595   FREE (pGRAYPLOT_FEATURE (pthis)->pvecx);
596   FREE (pGRAYPLOT_FEATURE (pthis)->user_data);
597   pGRAYPLOT_FEATURE (pthis)->size_of_user_data = 0;
598   if (pGRAYPLOT_FEATURE (pthis)->type != 2)
599     FREE (pGRAYPLOT_FEATURE (pthis)->pvecy);
600   FREE (pGRAYPLOT_FEATURE (pthis)->pvecz);
601   sciDelThisToItsParent (pthis, sciGetParent (pthis));
602   if (sciDelHandle (pthis) == -1)
603     return -1;
604   FREE (sciGetPointerToFeature (pthis));
605   FREE (pthis);
606   /* on peut alors destroyer le parent */
607   return 0;
608 }
609
610
611 /**DestroyAxes
612  * @memo This function destroies axes and the elementaries structures and only this to destroy all sons use DelGraphicsSon
613  */
614 int
615 DestroyAxes (sciPointObj * pthis)
616 {
617   int i;
618   char **str;
619
620   FREE (pAXES_FEATURE (pthis)->user_data);
621   pAXES_FEATURE (pthis)->size_of_user_data = 0;
622   
623   sciDelThisToItsParent (pthis, sciGetParent (pthis));
624   if (sciDelHandle (pthis) == -1)
625     return -1;
626   FREE (pAXES_FEATURE(pthis)->vx);
627   FREE (pAXES_FEATURE(pthis)->vy);
628   str=pAXES_FEATURE(pthis)->str;
629   for (i=Max(pAXES_FEATURE(pthis)->nx,pAXES_FEATURE(pthis)->ny)-1;i<0;i--) 
630     FREE (pAXES_FEATURE(pthis)->str); 
631   FREE (pAXES_FEATURE(pthis)->str);
632   FREE (sciGetPointerToFeature (pthis));
633   FREE (pthis);
634   /* on peut alors destroyer le parent, le vecteur 3d et 2d */
635   return 0;
636 }
637
638 /**DestroyGrayplot
639  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
640  * @param sciPointObj * pthis: the pointer to the entity
641  * @author Djalel ABDEMOUCHE
642  * @version 0.1
643  * @see 
644  */
645 int
646 DestroyFec (sciPointObj * pthis)
647 {
648   FREE (pFEC_FEATURE (pthis)->user_data);
649   pFEC_FEATURE (pthis)->size_of_user_data = 0;
650   FREE (pFEC_FEATURE (pthis)->pvecx);
651   FREE (pFEC_FEATURE (pthis)->pvecy);
652   FREE (pFEC_FEATURE (pthis)->pnoeud); 
653   FREE (pFEC_FEATURE (pthis)->pfun); 
654   FREE (pFEC_FEATURE (pthis)->zminmax);  
655   FREE (pFEC_FEATURE (pthis)->colminmax);
656   FREE (pFEC_FEATURE (pthis)->colout);
657   sciDelThisToItsParent (pthis, sciGetParent (pthis));
658   if (sciDelHandle (pthis) == -1)
659     return -1;
660   FREE (sciGetPointerToFeature (pthis));
661   FREE (pthis);
662   /* on peut alors destroyer le parent */
663   return 0;
664 }
665
666
667 /**DestroySegments
668  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
669  * @param sciPointObj * pthis: the pointer to the entity
670  * @author Djalel ABDEMOUCHE
671  * @version 0.1
672  * @see 
673  */
674 int
675 DestroySegs (sciPointObj * pthis)
676 {  
677   
678   FREE (pSEGS_FEATURE (pthis)->user_data);
679   pSEGS_FEATURE (pthis)->size_of_user_data = 0;
680   FREE (pSEGS_FEATURE (pthis)->vx);
681   FREE (pSEGS_FEATURE (pthis)->vy); 
682   if (pSEGS_FEATURE (pthis)->vz != (double *)NULL) 
683     FREE (pSEGS_FEATURE (pthis)->vz);  
684   if (pSEGS_FEATURE (pthis)->ptype <=0) 
685     {
686       FREE(pSEGS_FEATURE (pthis)->pstyle);
687     } 
688   else 
689     {
690       FREE(pSEGS_FEATURE (pthis)->vfx); pSEGS_FEATURE (pthis)->vfx = NULL;
691       FREE(pSEGS_FEATURE (pthis)->vfy); pSEGS_FEATURE (pthis)->vfy = NULL;
692       FREE(pSEGS_FEATURE (pthis)->vfz); pSEGS_FEATURE (pthis)->vfz = NULL;
693     } 
694   sciDelThisToItsParent (pthis, sciGetParent (pthis)); 
695   if (sciDelHandle (pthis) == -1)
696     return -1;
697   FREE (sciGetPointerToFeature (pthis));
698   FREE (pthis);
699   /* on peut alors destroyer le parent */
700   return 0;
701 }
702
703 /**DestroyCompound
704  * @memo This function destroies the Compound and the elementaries structures and only this to destroy all sons use DelGraphicsSon
705  */
706 int
707 DestroyCompound (sciPointObj * pthis)
708 {
709   sciAgreg * ppagreg = pAGREG_FEATURE (pthis);
710
711   FREE (ppagreg->user_data);
712   pAGREG_FEATURE (pthis)->size_of_user_data = 0;
713
714   sciDelThisToItsParent (pthis, sciGetParent (pthis));
715   if (sciDelHandle (pthis) == -1) return -1;
716   FREE (sciGetPointerToFeature (pthis));
717   FREE (pthis);
718   return 0;
719 }
720
721 void DeleteObjs(integer win_num)
722 {
723   sciPointObj *figure;
724   struct BCG *Xgc;
725
726   figure = (sciPointObj *)  sciIsExistingFigure(&win_num);
727   if (  figure != (sciPointObj *) NULL )
728     {
729       Xgc = (struct BCG *) pFIGURE_FEATURE(figure)->pScilabXgc;
730       
731       DestroyAllGraphicsSons (figure);
732 #ifdef WITH_TK
733             /* close ged to prevent errors when using it */
734             sciDestroyGed( sciGetNum(figure) ) ;
735 #endif
736       DestroyFigure (figure);
737       Xgc->mafigure = (sciPointObj *) NULL;
738     }
739 }
740
741
742 /**sciUnCompound
743  * @memo This function destroies the Compound and  and unpackes the elementaries structures to associates them to its parent
744  */
745 int
746 sciUnCompound (sciPointObj * pobj)
747 {
748   sciPointObj *pparent, *pobjson;
749   sciSons *psons = (sciSons *)NULL;
750         
751   if (sciGetEntityType(pobj) != SCI_AGREG)
752     return -1;
753
754   psons = sciGetLastSons(pobj);
755   pobjson = psons->pointobj;
756   pparent = sciGetParent(pobj);
757   while ((psons != (sciSons *) NULL) && (pobjson != (sciPointObj *) NULL))
758     {
759       /* we delete this son to this */ 
760       pobjson = psons->pointobj;
761       /* take the previous sons before the current is freed */
762       psons = psons->pprev;
763       sciDelThisToItsParent (pobjson, pobj);
764       /* and link to its old parent */
765       sciAddThisToItsParent (pobjson, pparent);
766     }
767
768   sciSetCurrentObj(pparent); /* pparent is the new current object */
769
770   DestroyCompound(pobj);
771   return 0;
772 }
773
774
775 /**DestroyTitle
776  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
777  * @param sciPointObj * pthis: the pointer to the entity
778  */
779 int DestroyLabel (sciPointObj * pthis)
780 {
781   sciLabel * ppLabel = pLABEL_FEATURE (pthis);
782   int textStatus = -1 ;
783  
784   sciDelThisToItsParent (pthis, sciGetParent (pthis));
785   if (sciDelHandle (pthis) == -1) { return -1 ; }
786   textStatus = deallocateText( ppLabel->text ) ;
787   if ( textStatus != 0 )
788   {
789     return textStatus ;
790   }
791   FREE (sciGetPointerToFeature (pthis));
792   FREE (pthis);
793   
794   return 0;
795 }
796
797 int DestroyUimenu (sciPointObj * pthis)
798 {
799   deleteMatrix( pUIMENU_FEATURE (pthis)->label.pStrings ) ;
800   FREE (pUIMENU_FEATURE (pthis)->label.callback);
801
802   sciDelThisToItsParent (pthis, sciGetParent (pthis));
803   if (sciDelHandle (pthis) == -1) return -1;
804   FREE (sciGetPointerToFeature (pthis));
805   FREE (pthis);
806   /* on peut alors destroyer le parent */
807   return 0;
808 }
809
810
811
812 /**del sciDelLabelsMenu
813  * @memo This function destroies ALL LABELS menu and the elementaries structures
814  * @param sciPointObj * pthis: the pointer to the entity
815  */
816 int
817 sciDelLabelsMenu (sciPointObj * pthis)
818 {
819   sciLabelMenu *pscilabelmenutmp;
820   sciLabelMenu *pscilabelmenutofree;
821
822   switch (sciGetEntityType (pthis))
823     {
824     case SCI_MENU:
825       pscilabelmenutmp = (sciLabelMenu *) (pMENU_FEATURE (pthis)->plabelmenu);
826       break;
827     case SCI_MENUCONTEXT:
828       pscilabelmenutmp =
829         (sciLabelMenu *) (pMENUCONTEXT_FEATURE (pthis)->plabelmenu);
830       break;
831     default:
832     case SCI_AGREG:
833       return -1;
834       break;
835     }
836   while (pscilabelmenutmp != (sciLabelMenu *) NULL)
837     {
838       /* Il faut retirer tous les menus lies par la liste aussi */
839       pscilabelmenutofree = pscilabelmenutmp;
840       pscilabelmenutmp = pscilabelmenutmp->pnextlabelmenu;
841       FREE (pscilabelmenutofree->plabel);
842       FREE (pscilabelmenutofree);
843     }
844   return 0;
845 }
846
847
848
849 /**DestroyMenuContext
850  * @memo This function destroies menu context and the elementaries structures and only this to destroy all sons use DelGraphicsSon
851  * @param sciPointObj * pthis: the pointer to the entity
852  */
853 int
854 DestroyMenuContext (sciPointObj * pthis)
855 {
856   sciDelLabelsMenu (pthis);
857   sciDelThisToItsParent (pthis, sciGetParent (pthis));
858   if (sciDelHandle (pthis) == -1)
859     return -1;
860   FREE ((sciGetFontContext(pthis))->pfontname);
861   FREE (sciGetPointerToFeature (pthis));
862   FREE (pthis);
863   /* on peut alors destroyer le parent, le vecteur 3d et 2d */
864   return 0;
865 }
866
867
868
869 /**DestroySciMenu
870  * @memo This function destroies menu and the elementaries structures and only this to destroy all sons use DelGraphicsSon
871  * @param sciPointObj * pthis: the pointer to the entity
872  */
873 int
874 DestroySciMenu (sciPointObj * pthis)
875 {
876   sciDelLabelsMenu (pthis);
877   sciDelThisToItsParent (pthis, sciGetParent (pthis));
878   if (sciDelHandle (pthis) == -1)
879     return -1;
880   FREE ((sciGetFontContext(pthis))->pfontname);
881   FREE (sciGetPointerToFeature (pthis));
882   FREE (pthis);
883   /* on peut alors destroyer le parent, le vecteur 3d et 2d */
884   return 0;
885 }
886
887
888
889 /**delete_sgwin_entities(int win_num)
890  * @memo This function is to be called after window deletion 
891  */
892 void delete_sgwin_entities( int win_num )
893 {
894   double dv=0;
895   double *XGC;
896   struct BCG *CurrentScilabXgc; 
897   int v=0;
898   /* Need to reset the new current figure returned by sciGetCurrentFigure */
899   sciHandleTab *hdl = NULL;
900   sciPointObj  *pobj= NULL;
901
902   C2F(dr)("xget","gc",&v,&v,&v,&v,&v,&v,(double *)&XGC,&dv,&dv,&dv,5L,10L); /* ajout cast ???*/
903   CurrentScilabXgc=(struct BCG *)XGC;
904
905
906   hdl = sciGetpendofhandletab();
907
908   if(CurrentScilabXgc != NULL)
909     while (hdl != NULL)
910     {
911       pobj=(sciPointObj *) sciGetPointerFromHandle (hdl->index);
912       if (sciGetEntityType(pobj) == SCI_FIGURE && sciGetNum(pobj) == CurrentScilabXgc->CurWindow ) /* Adding F.Leray 19.04.04 */
913       {
914         sciSetCurrentFigure(pobj);
915         sciSetCurrentObj(pobj); /* The current object will always be the figure too. */
916         break;
917
918       }
919       hdl = hdl->pprev;
920     }
921 }
922
923 /*------------------------------------------------------------------------------------*/
924 /* free the user_data */
925 void clearUserData( sciPointObj * pObj )
926 {
927   int ** pUserData ;
928   int *  pSizeUD   ;
929   sciGetPointerToUserData( pObj, &pUserData, &pSizeUD ) ;
930   FREE( *pUserData ) ;
931   *pUserData = NULL ;
932   *pSizeUD = 0 ;
933 }
934 /*------------------------------------------------------------------------------------*/
935 extern int C2F(deletewin)(integer *number);
936 /**
937  * Close the figure with number winNum.
938  */
939 void sciDeleteWindow( int winNum )
940 {
941   C2F(deletewin)( &winNum ) ;
942 }
943 /*------------------------------------------------------------------------------------*/
944 /**
945  * Update the merge object of a subwindow. If there is not anymore surface in the descendants
946  * then object is cleared. Otherwise a new merge3d is created. This function should be called
947  * after a modifications of the graphic hierarchy related with surfaces.
948  * @return 0 if the call was successful, -1 otherwise.
949  */
950 int updateMerge( sciPointObj * pSubwin )
951 {
952   if ( sciGetSubwinNbSurf( pSubwin ) == 0 )
953   {
954     sciPointObj * merge = sciGetMerge( pSubwin ) ;
955     if ( merge != NULL )
956     {
957       DestroyMerge( merge ) ;
958     }
959     pSUBWIN_FEATURE( pSubwin )->facetmerge = FALSE ;
960   }
961   else
962   {
963     /* the merge 3d is updated */
964     Merge3d( pSubwin ) ;
965   }
966   return 0 ;
967 }
968 /*-----------------------------------------------------------------------------------------*/
969 void AllGraphWinDelete( void )
970 {
971
972   integer iflag=0,num=0;
973   int *ArrayWGraph=NULL;
974
975   sciGetIdFigure (ArrayWGraph,&num,&iflag);
976
977   if (num > 0)
978   {
979     int i=0;
980     ArrayWGraph=(int*)MALLOC(sizeof(int)*num);
981
982     iflag = 1;
983     sciGetIdFigure (ArrayWGraph,&num,&iflag);
984
985     for (i=0;i<num;i++)
986     {
987       C2F (deletewin) (&ArrayWGraph[i]);
988       FREE (ArrayWGraph);
989     }
990     ArrayWGraph=NULL;
991   }
992 }
993 /*-----------------------------------------------------------------------------------------*/
994 void CleanPlots(char *unused, integer *winnumber, integer *v3, integer *v4, integer *v5, integer *v6, integer *v7, double *dx1, double *dx2, double *dx3, double *dx4)
995 {
996   
997   /* we remove scales in window number i */
998   del_window_scale(*winnumber);
999   /* if *winnumber is also the current window we reset Cscale to default value */
1000   if ( *winnumber == sciGetNum(sciGetCurrentFigure()) ) 
1001   {
1002     Cscale2default();
1003   }
1004   else
1005   {
1006     set_window_scale_with_default(*winnumber);
1007   }
1008 }
1009
1010 /*-----------------------------------------------------------------------------------------*/