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