2bb1cb39a67fa292d5e14e1bbad3795ed3557bd5
[scilab.git] / scilab / modules / graphics / src / c / DestroyObjects.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2001-2002 - INRIA - Mathieu Philippe
4  * Copyright (C) 2002-2004 - INRIA - Djalel Abdemouche
5  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
6  * Copyright (C) 2005 - INRIA - Jean-Baptiste Silvy
7  * Copyright (C) 2010 - DIGITEO - Manuel Juliachs
8  *
9  * This file must be used under the terms of the CeCILL.
10  * This source file is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution.  The terms
12  * are also available at
13  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
14  *
15  */
16
17 /*------------------------------------------------------------------------
18  *    Graphic library
19  *    newGraph Library header
20  *    Comment:
21  *    This file contains all functions used to BUILD new objects :
22  - break the binding between the deleted object and its parent in the
23  existing hierarchy
24  - freeing memory
25  --------------------------------------------------------------------------*/
26
27 #include "math_graphics.h"
28 #include "DestroyObjects.h"
29 #include "DestroyUicontrol.h"
30 #include "DestroyUimenu.h"
31 #include "GetProperty.h"
32 #include "DrawObjects.h"
33 #include "SetProperty.h"
34 #include "Interaction.h" /* for callback funtions */
35 #include "StringMatrix.h"
36 #include "WindowList.h"
37 #include "sciprint.h"
38 #include "InitObjects.h"
39 #include "CurrentObjectsManagement.h"
40 #include "ObjectSelection.h"
41 #include "BuildDrawingObserver.h"
42 #include "DrawingBridge.h"
43 #include "GraphicSynchronizerInterface.h"
44 #include "get_ticks_utils.h"
45 #include "BuildObjects.h"
46 #include "HandleManagement.h"
47 #include "freeArrayOfString.h"
48 #include "Scierror.h"
49
50 //#include "../../../tclsci/includes/GedManagement.h"
51
52 #include "MALLOC.h" /* MALLOC */
53 #include "localization.h"
54
55 #include "deleteGraphicObject.h"
56
57 /*----------------------------------------------------------------------------*/
58
59 /**
60  * Destroy only the sons of an object.
61  * Does not delete the object itself.
62  */
63 int destroyGraphicsSons(sciPointObj * pthis)
64 {
65   /* to destroy only the sons put the while into the switch !*/
66   sciSons * toto = NULL;
67
68   toto = sciGetSons (pthis);
69   while ((toto != NULL) && (toto->pointobj != NULL))
70   {
71     destroyGraphicHierarchy(toto->pointobj);
72     toto = sciGetSons(pthis);
73   }
74   return 0;
75 }
76
77 /********************* modifie le 01/02/2002 ************************
78  * On detruit pas la sous fenetre, elle est initialiser avec la figure
79  * pour cette version, on considere qu'il y'a 1 seule sous fenetre et
80  * elle suit la fenetre principale (voir clf() ), la fenetre n'est pas
81  * consideree comme un des fils.
82  */
83  /**
84   * This function destroies childs and pthis
85   * @param sciPointObj * pthis: the pointer to the entity
86   */
87 int destroyGraphicHierarchy(sciPointObj * pthis)
88 {
89     deleteGraphicObject(pthis->UID);
90
91     return 0;
92
93 #ifdef __OLD_IMPLEMENTATION__
94   destroyGraphicsSons(pthis);
95   switch (sciGetEntityType (pthis))
96     {
97
98     case SCI_FIGURE:
99       DestroyFigure(pthis);
100       return 0;
101       break;
102     case SCI_SUBWIN:
103       DestroySubWin (pthis);
104       return 0;
105       break;
106     case SCI_TEXT:
107       DestroyText (pthis);
108       return 0;
109       break;
110     case SCI_LEGEND:
111       DestroyLegend (pthis);
112       return 0;
113       break;
114     case SCI_ARC:
115       DestroyArc (pthis);
116       return 0;
117       break;
118     case SCI_SEGS:
119       DestroySegs (pthis);
120       return 0;
121       break;
122     case SCI_FEC:
123       DestroyFec (pthis);
124       return 0;
125       break;
126     case SCI_GRAYPLOT:
127       DestroyGrayplot (pthis);
128       return 0;
129       break;
130     case SCI_POLYLINE:
131       DestroyPolyline (pthis);
132       return 0;
133       break;
134     case SCI_RECTANGLE:
135       DestroyRectangle (pthis);
136       return 0;
137       break;
138     case SCI_SURFACE:
139       DestroySurface (pthis);
140       return 0;
141       break;
142     case SCI_AXES:
143       DestroyAxes (pthis);
144       return 0;
145       break;
146     case SCI_AGREG:
147       DestroyCompound (pthis);
148       return 0;
149       break;
150     case SCI_LABEL: /* F.Leray 28.05.04 */
151       DestroyLabel (pthis);
152       return 0;
153       break;
154     case SCI_UIMENU:
155       DestroyUimenu (pthis);
156       return 0;
157       break;
158     case SCI_UICONTROL:
159       DestroyUicontrol (pthis);
160       return 0;
161       break;
162     default:
163       sciprint (_("Entity with type %d cannot be destroyed.\n"),sciGetEntityType (pthis));
164       return -1;
165       break;
166     }
167
168   return 0;
169 #endif
170 }
171
172
173
174 /**sciDelGraphicObj
175  * This function deletes only users graphics object and its dependency limited to
176  * SCI_LEGEND SCI_ARC SCI_SEGS SCI_FEC SCI_GRAYPLOT SCI_POLYLINE SCI_RECTANGLE SCI_SURFACE
177  * SCI_AXES SCI_AGREG SCI_TEXT SCI_FIGURE SCI_SUBWIN
178  * @param sciPointObj * pthis: the pointer to the entity
179  */
180 int
181 sciDelGraphicObj (sciPointObj * pthis)
182 {
183      deleteGraphicObject(pthis->UID);
184
185     return 0;
186
187 #ifdef __OLD_IMPLEMENTATION__
188   switch (sciGetEntityType (pthis))
189     {
190     case SCI_LABEL:
191       Scierror(999, _("A Label object cannot be deleted.\n"));
192       return -1;
193     case SCI_LEGEND:
194     case SCI_ARC:
195     case SCI_SEGS:
196     case SCI_FEC:
197     case SCI_GRAYPLOT:
198     case SCI_POLYLINE:
199     case SCI_RECTANGLE:
200     case SCI_SURFACE:
201     case SCI_AXES:
202     case SCI_AGREG:
203     case SCI_TEXT:
204     case SCI_FIGURE:
205                         destroyGraphicHierarchy (pthis);
206       return 0;
207                 case SCI_SUBWIN:
208                         {
209                                 /* Special case here since for now there should be always one subwindow */
210                                 /* Inside a figure */
211                                 sciPointObj * parentFigure = sciGetParentFigure(pthis);
212                                 destroyGraphicHierarchy (pthis);
213
214                                 createFirstSubwin(parentFigure);
215                                 return 0;
216                         }
217     default:
218       Scierror(999, _("This object cannot be deleted.\n"));
219       return -1;
220     }
221 #endif
222 }
223
224 /*-----------------------------------------------------------------------------*/
225 /**
226  * erase a graphic window if necessary.
227  */
228 int C2F(scigerase)( void )
229 {
230   if ( sciGetIsAutoDrawable(sciGetCurrentFigure()) )
231   {
232     sciClearFigure(sciGetCurrentFigure());
233   }
234   return 0;
235 }
236 /*-----------------------------------------------------------------------------*/
237
238 /**DestroyFigure
239  * This function destroys the parents window (manager) and the elementary structures and only this to destroy all sons use DelGraphicsSon
240  * @param sciPointObj * pthis: the pointer to the entity
241  */
242 int DestroyFigure (sciPointObj * pthis)
243 {
244   // remove the figure if it is in the list
245   removeFigureFromList(pthis);
246
247   if (sciIsCurrentFigure(pthis) )
248   {
249
250     /* destroyed figure is current one */
251     sciSetCurrentFigure(getFirstFigure()) ;
252   }
253
254   sciSetIsEventHandlerEnable(pthis, FALSE ) ;
255
256   if (pFIGURE_FEATURE(pthis)->eventHandler != NULL)
257   {
258     FREE( pFIGURE_FEATURE(pthis)->eventHandler ) ;
259   }
260
261   if (pFIGURE_FEATURE(pthis)->name != NULL)
262   {
263     FREE( pFIGURE_FEATURE(pthis)->name ) ;
264   }
265
266   destroyFigureModelData(pFIGURE_FEATURE(pthis)->pModelData) ;
267   pFIGURE_FEATURE(pthis)->pModelData = NULL;
268   sciStandardDestroyOperations(pthis) ;
269   return 0;
270 }
271
272
273
274 /**DestroySubWin
275  * @memo This function destroies the Subwindow (the Axes) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
276  * @param sciPointObj * pthis: the pointer to the entity
277  */
278 int
279 DestroySubWin (sciPointObj * pthis)
280 {
281   /* Add. grads arrays */ /* F.Leray 11.10.04 */
282   /* specific user arrays */
283   sciSubWindow * ppsubwin = pSUBWIN_FEATURE (pthis);
284
285   FREE( ppsubwin->axes.u_xgrads); ppsubwin->axes.u_xgrads = (double *) NULL;
286   FREE( ppsubwin->axes.u_ygrads); ppsubwin->axes.u_ygrads = (double *) NULL;
287   FREE( ppsubwin->axes.u_zgrads); ppsubwin->axes.u_zgrads = (double *) NULL;
288   ppsubwin->axes.u_xlabels = FreeUserLabels(ppsubwin->axes.u_xlabels, &ppsubwin->axes.u_nxgrads);
289   ppsubwin->axes.u_ylabels = FreeUserLabels(ppsubwin->axes.u_ylabels, &ppsubwin->axes.u_nygrads);
290   ppsubwin->axes.u_zlabels = FreeUserLabels(ppsubwin->axes.u_zlabels, &ppsubwin->axes.u_nzgrads);
291
292   ppsubwin->axes.u_xlabels = NULL;
293   ppsubwin->axes.u_ylabels = NULL;
294   ppsubwin->axes.u_zlabels = NULL;
295
296   ppsubwin->axes.u_nxgrads = 0;
297   ppsubwin->axes.u_nygrads = 0;
298   ppsubwin->axes.u_nzgrads = 0;
299
300
301   /* auto (computed) arrays are defined with max. length == 20 */
302   ppsubwin->axes.nxgrads = 0;
303   ppsubwin->axes.nygrads = 0;
304   ppsubwin->axes.nzgrads = 0;
305
306   if ( sciGetCallback(pthis) != (char *)NULL)
307         {
308     FREE(sciGetCallback(pthis));
309         }
310
311         return sciStandardDestroyOperations(pthis) ;
312
313 }
314
315
316
317
318
319
320 /**
321  * free the structure used by the text object but does not remove the relationship links.
322  */
323 int deallocateText( sciPointObj * pthis )
324 {
325   deleteMatrix( pTEXT_FEATURE(pthis)->pStrings ) ;
326   FREE (pTEXT_FEATURE (pthis)->user_data);
327   pTEXT_FEATURE (pthis)->size_of_user_data = 0;
328   destroyHandleDrawer(pthis);
329
330         destroyRelationShip(pthis);
331   FREE (sciGetPointerToFeature (pthis));
332   FREE (pthis);
333
334   return 0;
335 }
336
337 /**DestroyText
338  * This function destroies Text structure and only this to destroy all sons use DelGraphicsSon
339  * @param sciPointObj * pthis: the pointer to the entity
340  */
341 int DestroyText (sciPointObj * pthis)
342 {
343   deleteMatrix( pTEXT_FEATURE(pthis)->pStrings ) ;
344   return sciStandardDestroyOperations(pthis) ;
345 }
346
347
348 /**DestroyLegend
349  * @memo This function destroies legend and the elementaries structures and only this to destroy all sons use DelGraphicsSon
350  * @param sciPointObj * pthis: the pointer to the entity
351  */
352 int
353 DestroyLegend (sciPointObj * pthis)
354 {
355   sciLegend * ppLegend = pLEGEND_FEATURE (pthis) ;
356   FREE ( ppLegend->tabofhandles );
357   deleteMatrix( ppLegend->text.pStrings ) ;
358
359   return sciStandardDestroyOperations(pthis) ;
360   /* on peut alors destroyer le parent */
361 }
362
363 int deallocatePolyline (sciPointObj * pthis)
364 {
365   FREE (pPOLYLINE_FEATURE (pthis)->pvx);
366   FREE (pPOLYLINE_FEATURE (pthis)->pvy);
367
368   if (pPOLYLINE_FEATURE (pthis)->pvz != NULL) /**DJ.Abdemouche 2003**/
369   {
370     FREE (pPOLYLINE_FEATURE (pthis)->pvz);
371   }
372   FREE (pPOLYLINE_FEATURE (pthis)->user_data);
373   pPOLYLINE_FEATURE (pthis)->size_of_user_data = 0;
374   destroyHandleDrawer(pthis);
375
376         destroyRelationShip(pthis);
377   FREE (sciGetPointerToFeature (pthis));
378   FREE (pthis);
379   return 0;
380 }
381
382 /**DestroyPolyline
383  * @memo This function destroies Polyline and the elementaries structures and only this to destroy all sons use DelGraphicsSon
384  * @param sciPointObj * pthis: the pointer to the entity
385  */
386 int
387 DestroyPolyline (sciPointObj * pthis)
388 {
389   FREE (pPOLYLINE_FEATURE (pthis)->pvx);
390   FREE (pPOLYLINE_FEATURE (pthis)->pvy);
391
392   if (pPOLYLINE_FEATURE (pthis)->pvz != NULL) /**DJ.Abdemouche 2003**/
393     FREE (pPOLYLINE_FEATURE (pthis)->pvz);
394   return sciStandardDestroyOperations(pthis) ;
395 }
396
397
398 /**DestroyArc
399  * @memo This function destroies Pacthc and the elementaries structures and only this to destroy all sons use DelGraphicsSon
400  * @param sciPointObj * pthis: the pointer to the entity
401  */
402 int
403 DestroyArc (sciPointObj * pthis)
404 {
405   FREE(pARC_FEATURE (pthis)->callback);
406   return sciStandardDestroyOperations(pthis) ;
407 }
408
409
410
411 /**DestroyRectangle
412  * @memo This function destroies Rectangle and the elementaries structures and only this to destroy all sons use DelGraphicsSon
413  * @param sciPointObj * pthis: the pointer to the entity
414  */
415 int
416 DestroyRectangle (sciPointObj * pthis)
417 {
418   return sciStandardDestroyOperations(pthis) ;
419 }
420
421
422
423 /**DestroySurface
424  * @memo This function destroies surface and the elementaries structures and only this to destroy all sons use DelGraphicsSon
425  * @param sciPointObj * pthis: the pointer to the entity
426  */
427 int
428 DestroySurface (sciPointObj * pthis)
429 {
430   sciPointObj * psubwin ;
431   sciSubWindow * ppSubWin ;
432   sciSurface * ppSurface = pSURFACE_FEATURE (pthis) ;
433   int res = -1 ;
434
435   psubwin  = sciGetParentSubwin(pthis) ;
436   ppSubWin = pSUBWIN_FEATURE ( psubwin ) ;
437
438   FREE(ppSurface->pvecz);
439   FREE(ppSurface->pvecy);
440   FREE(ppSurface->pvecx);
441   FREE(ppSurface->inputCMoV); /* Adding F.Leray 24.03.04*/
442   FREE(ppSurface->color); /* Adding F.Leray 18.03.05 */
443
444   if ( ppSurface->izcol != 0 )
445   {
446     FREE(ppSurface->zcol);
447   }
448   /* DJ.A 2003 */
449   res = sciStandardDestroyOperations(pthis) ;
450
451
452   return res;
453 }
454
455 /**DestroyGrayplot
456  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
457  * @param sciPointObj * pthis: the pointer to the entity
458  * Djalel ABDEMOUCHE
459  */
460 int
461 DestroyGrayplot (sciPointObj * pthis)
462 {
463   FREE (pGRAYPLOT_FEATURE (pthis)->pvecx);
464   if (pGRAYPLOT_FEATURE (pthis)->type != 2)
465     FREE (pGRAYPLOT_FEATURE (pthis)->pvecy);
466   FREE (pGRAYPLOT_FEATURE (pthis)->pvecz);
467   return sciStandardDestroyOperations(pthis) ;
468
469 }
470
471
472 /**DestroyAxes
473  * @memo This function destroies axes and the elementaries structures and only this to destroy all sons use DelGraphicsSon
474  */
475 int
476 DestroyAxes (sciPointObj * pthis)
477 {
478   int i;
479   char **str;
480
481   FREE (pAXES_FEATURE(pthis)->vx);
482   FREE (pAXES_FEATURE(pthis)->vy);
483   str=pAXES_FEATURE(pthis)->str;
484   for (i=Max(pAXES_FEATURE(pthis)->nx,pAXES_FEATURE(pthis)->ny)-1;i<0;i--)
485     FREE (pAXES_FEATURE(pthis)->str);
486   FREE (pAXES_FEATURE(pthis)->str);
487   return sciStandardDestroyOperations(pthis) ;
488 }
489
490 /**DestroyGrayplot
491  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
492  * @param sciPointObj * pthis: the pointer to the entity
493  * @author Djalel ABDEMOUCHE
494  * @version 0.1
495  * @see
496  */
497 int
498 DestroyFec (sciPointObj * pthis)
499 {
500   FREE (pFEC_FEATURE (pthis)->pvecx);
501   FREE (pFEC_FEATURE (pthis)->pvecy);
502   FREE (pFEC_FEATURE (pthis)->pnoeud);
503   FREE (pFEC_FEATURE (pthis)->pfun);
504   return sciStandardDestroyOperations(pthis) ;
505 }
506
507
508 /**DestroySegments
509  * @memo This function destroies Grayplot and the elementaries structures and only this to destroy all sons use DelGraphicsSon
510  * @param sciPointObj * pthis: the pointer to the entity
511  * @author Djalel ABDEMOUCHE
512  * @version 0.1
513  * @see
514  */
515 int
516 DestroySegs (sciPointObj * pthis)
517 {
518   FREE (pSEGS_FEATURE (pthis)->vx);
519   FREE (pSEGS_FEATURE (pthis)->vy);
520   if (pSEGS_FEATURE (pthis)->vz != (double *)NULL)
521     FREE (pSEGS_FEATURE (pthis)->vz);
522   if (pSEGS_FEATURE (pthis)->ptype <=0)
523     {
524       FREE(pSEGS_FEATURE (pthis)->pstyle);
525     }
526   else
527     {
528       FREE(pSEGS_FEATURE (pthis)->vfx); pSEGS_FEATURE (pthis)->vfx = NULL;
529       FREE(pSEGS_FEATURE (pthis)->vfy); pSEGS_FEATURE (pthis)->vfy = NULL;
530       FREE(pSEGS_FEATURE (pthis)->vfz); pSEGS_FEATURE (pthis)->vfz = NULL;
531     }
532   return sciStandardDestroyOperations(pthis) ;
533 }
534
535 /**DestroyCompound
536  * @memo This function destroy the Compound and the elementaries structures and only this to destroy all sons use DelGraphicsSon
537  */
538 int DestroyCompound (sciPointObj * pthis)
539 {
540   return sciStandardDestroyOperations(pthis) ;
541 }
542
543 /**sciUnCompound
544  * @memo This function destroies the Compound and  and unpackes the elementaries structures to associates them to its parent
545  */
546 int
547 sciUnCompound (sciPointObj * pobj)
548 {
549   sciPointObj *pparent, *pobjson;
550   sciSons *psons = (sciSons *)NULL;
551
552   if (sciGetEntityType(pobj) != SCI_AGREG)
553     return -1;
554
555   psons = sciGetLastSons(pobj);
556   pobjson = psons->pointobj;
557   pparent = sciGetParent(pobj);
558   while ((psons != (sciSons *) NULL) && (pobjson != (sciPointObj *) NULL))
559     {
560       /* we delete this son to this */
561       pobjson = psons->pointobj;
562       /* take the previous sons before the current is freed */
563       psons = psons->pprev;
564       sciDelThisToItsParent (pobjson, pobj);
565       /* and link to its old parent */
566       sciAddThisToItsParent (pobjson, pparent);
567     }
568
569   sciSetCurrentObj(pparent); /* pparent is the new current object */
570
571   DestroyCompound(pobj);
572   return 0;
573 }
574
575
576 /**DestroyTitle
577  * @memo This function destroies the Subwindow (the Axe) and the elementaries structures and only this to destroy all sons use DelGraphicsSon
578  * @param sciPointObj * pthis: the pointer to the entity
579  */
580 int DestroyLabel (sciPointObj * pthis)
581 {
582   sciLabel * ppLabel = pLABEL_FEATURE (pthis);
583   int textStatus = -1 ;
584   deleteObservers( pthis ) ;
585   destroyHandleDrawer( pthis ) ;
586   sciUnselectSons( pthis ) ;
587   sciDelThisToItsParent( pthis, sciGetParent(pthis) ) ;
588   if ( sciDelHandle(pthis) == -1 ) { return -1 ; }
589   textStatus = deallocateText( ppLabel->text ) ;
590   if ( textStatus != 0 )
591   {
592     return textStatus ;
593   }
594   ppLabel->text = NULL ;
595         destroyRelationShip(pthis);
596   FREE(ppLabel) ;
597   FREE(pthis) ;
598   return 0 ;
599 }
600
601 /*---------------------------------------------------------------------------*/
602 /* free the user_data */
603 void clearUserData( sciPointObj * pObj )
604 {
605   int ** pUserData ;
606   int *  pSizeUD   ;
607   sciGetPointerToUserData( pObj, &pUserData, &pSizeUD ) ;
608   if ( pUserData != NULL && *pUserData != NULL )
609   {
610     FREE( *pUserData ) ;
611     *pUserData = NULL ;
612     *pSizeUD = 0 ;
613   }
614 }
615 /*---------------------------------------------------------------------------*/
616 /**
617  * Close the figure with number winNum.
618  */
619 void sciDeleteWindow( int winNum )
620 {
621   sciPointObj * deletedFig = getFigureFromIndex(winNum);
622   startGraphicDataWriting();
623   sciDelGraphicObj(deletedFig);
624   endGraphicDataWriting();
625 }
626 /*--------------------------------------------------------------------------------*/
627 void AllGraphWinDelete( void )
628 {
629
630   int num = sciGetNbFigure() ;
631   int *ArrayWGraph = NULL ;
632
633   /* sciGetIdFigure (ArrayWGraph,&num,&iflag); */
634
635   if (num > 0)
636   {
637     int i=0;
638     ArrayWGraph=(int*)MALLOC(sizeof(int)*num);
639
640     sciGetFiguresId( ArrayWGraph ) ;
641
642     for (i=0;i<num;i++)
643     {
644       sciDeleteWindow(ArrayWGraph[i]);
645     }
646     FREE (ArrayWGraph);
647     ArrayWGraph=NULL;
648   }
649 }
650 /*--------------------------------------------------------------------------------*/
651 /**
652  * Recurrent destroying actions for objects
653  */
654 int sciStandardDestroyOperations( sciPointObj * pThis )
655 {
656   int res = 0 ;
657
658   /* Update current object if needed */
659   if (pThis == sciGetCurrentObj())
660   {
661     if (sciGetParent(pThis) != NULL)
662     {
663       sciSetCurrentObj(sciGetParent(pThis));
664     }
665     else if (getFirstFigure() != NULL)
666     {
667       sciSetCurrentObj(sciGetCurrentSubWin());
668     }
669     else
670     {
671       /* no more object */
672       sciSetCurrentObj(NULL);
673     }
674   }
675
676   deleteObservers( pThis ) ;
677   destroyHandleDrawer( pThis ) ;
678   clearUserData( pThis ) ;
679   sciUnselectSons( pThis ) ;
680   sciDelThisToItsParent( pThis, sciGetParent(pThis) ) ;
681   if ( sciDelHandle(pThis) == -1 ) { res = -1 ; }
682         destroyRelationShip(pThis);
683   FREE( pThis->pfeatures ) ;
684   FREE( pThis ) ;
685   return res ;
686 }
687 /*--------------------------------------------------------------------------------*/
688 /**
689  * destroy a pointer or array allocated by MALLOC
690  * This function was created since cpp does not
691  * seems to allow the use of MALLOC or FREE
692  */
693 void destroyGraphicPointer(void * pointer)
694 {
695   FREE(pointer);
696 }
697 /*--------------------------------------------------------------------------------*/
698 /**
699  * destroy an array of C strings.
700  * This function was created since cpp does not
701  * seems to allow the use of MALLOC or FREE
702  */
703 void destroyGraphicStringArray(char ** strArray, int nbStrings)
704 {
705         freeArrayOfString(strArray,nbStrings);
706 }
707 /*--------------------------------------------------------------------------------*/
708 void destroyRelationShip(sciPointObj * pObj)
709 {
710         /* Don't destroy relationShip for labels since the relationShip of a label
711         is contained in (and destroyed with) its text attribute (see ConstructLabel) */
712         if (pObj->relationShip != NULL && sciGetEntityType(pObj) != SCI_LABEL)
713         {
714                 FREE(pObj->relationShip);
715                 pObj->relationShip = NULL;
716         }
717 }
718 /*--------------------------------------------------------------------------------*/