e60e3df5653b82ef9f376f163f2f10144a1bafe8
[scilab.git] / scilab / modules / graphics / src / c / InitObjects.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2001-2002 - INRIA - Mathieu Philipe
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) 2008-2008 - INRIA - Bruno JOFRET
8  * Copyright (C) 2010 - DIGITEO - Bruno JOFRET
9  * Copyright (C) 2010-2011 - 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 Init or Re-Init the window
24  *    (Figure and/or Subwin) to the default graphics properties.
25  --------------------------------------------------------------------------*/
26
27 #include <stdio.h>
28 #include <string.h>
29
30 #ifdef _MSC_VER
31 #include "strdup_Windows.h"
32 #endif
33
34 #include "InitObjects.h"
35 #include "SetProperty.h"
36 #include "GetProperty.h"
37 #include "DestroyObjects.h"
38 #include "CloneObjects.h"
39 #include "BuildObjects.h"
40 #include "sciprint.h"
41 #include "HandleManagement.h"
42 #include "BasicAlgos.h"
43
44 #include "MALLOC.h"             /* MALLOC */
45 #include "localization.h"
46
47 #include "createGraphicObject.h"
48 #include "deleteGraphicObject.h"
49 #include "graphicObjectProperties.h"
50 #include "getGraphicObjectProperty.h"
51 #include "setGraphicObjectProperty.h"
52
53 #include "AxesModel.h"
54 #include "FigureModel.h"
55
56 #define LABEL_BUFFER_LENGTH     128
57
58 static char error_message[70];  /* DJ.A 08/01/04 */
59
60 unsigned short defcolors[] =
61 {
62     0, 0, 0,                    /* Black: DEFAULTBLACK */
63     0, 0, 255,                  /* Blue */
64     0, 255, 0,                  /* Green */
65     0, 255, 255,                /* Cyan */
66     255, 0, 0,                  /* Red */
67     255, 0, 255,                /* Magenta */
68     255, 255, 0,                /* Yellow */
69     255, 255, 255,              /* White: DEFAULTWHITE */
70     0, 0, 144,                  /* Blue4 */
71     0, 0, 176,                  /* Blue3 */
72     0, 0, 208,                  /* Blue2 */
73     135, 206, 255,              /* LtBlue */
74     0, 144, 0,                  /* Green4 */
75     0, 176, 0,                  /* Green3 */
76     0, 208, 0,                  /* Green2 */
77     0, 144, 144,                /* Cyan4 */
78     0, 176, 176,                /* Cyan3 */
79     0, 208, 208,                /* Cyan2 */
80     144, 0, 0,                  /* Red4 */
81     176, 0, 0,                  /* Red3 */
82     208, 0, 0,                  /* Red2 */
83     144, 0, 144,                /* Magenta4 */
84     176, 0, 176,                /* Magenta3 */
85     208, 0, 208,                /* Magenta2 */
86     128, 48, 0,                 /* Brown4 */
87     160, 64, 0,                 /* Brown3 */
88     192, 96, 0,                 /* Brown2 */
89     255, 128, 128,              /* Pink4 */
90     255, 160, 160,              /* Pink3 */
91     255, 192, 192,              /* Pink2 */
92     255, 224, 224,              /* Pink */
93     255, 215, 0                 /* Gold */
94 };
95
96 void InitFigureModel(char *pfiguremdlUID)
97 {
98     int iZero = 0;
99     BOOL bTrue = TRUE;
100     BOOL bFalse = FALSE;
101
102     int defaultBackground = -2;
103     int m = NUMCOLORS_SCI;
104     int i = 0;
105     double *pdblColorMap = MALLOC(m * 3 * sizeof(double));
106
107     int piFigurePosition[2] = { 200, 200 };
108     int piFigureSize[2] = { 620, 590 };
109     int piAxesSize[2] = { 610, 460 };
110
111     // FIXME : inline this function here ...
112
113     sciInitGraphicMode(pfiguremdlUID);
114     // Name
115     setGraphicObjectProperty(pfiguremdlUID, __GO_NAME__, _("Graphic window number %d"), jni_string, 1);
116
117     // Id
118     setGraphicObjectProperty(pfiguremdlUID, __GO_ID__, &iZero, jni_int, 1);
119     // pModelData
120     // isselected ?? (No more used)
121     // rotstyle = unary (0)
122     setGraphicObjectProperty(pfiguremdlUID, __GO_ROTATION_TYPE__, &iZero, jni_int, 1);
123
124     // visible
125     setGraphicObjectProperty(pfiguremdlUID, __GO_VISIBLE__, &bTrue, jni_bool, 1);
126     // immediateDrawingMode
127     setGraphicObjectProperty(pfiguremdlUID, __GO_IMMEDIATE_DRAWING__, &bTrue, jni_bool, 1);
128     // background
129     setGraphicObjectProperty(pfiguremdlUID, __GO_BACKGROUND__, &defaultBackground, jni_int, 1);
130     // position
131     setGraphicObjectProperty(pfiguremdlUID, __GO_POSITION__, piFigurePosition, jni_int_vector, 2);
132     // size
133     setGraphicObjectProperty(pfiguremdlUID, __GO_SIZE__, piFigureSize, jni_int_vector, 2);
134
135     // auto_resize
136     setGraphicObjectProperty(pfiguremdlUID, __GO_AUTORESIZE__, &bTrue, jni_bool, 1);
137     // axes_size
138     setGraphicObjectProperty(pfiguremdlUID, __GO_AXES_SIZE__, piAxesSize, jni_int_vector, 2);
139
140     /*
141      * user data
142      * NULL has been replaced by the empty string as the third argument in order to
143      * avoid a crash due to giws 1.2.4
144      */
145     //setGraphicObjectProperty(pfiguremdlUID, __GO_USER_DATA__, "", jni_string, 0);
146     // Size of user data
147     //setGraphicObjectProperty(pfiguremdlUID, __GO_USER_DATA_SIZE__, &iZero, jni_int, 1);
148     // Pixmap Mode
149     setGraphicObjectProperty(pfiguremdlUID, __GO_PIXMAP__, &bFalse, jni_bool, 1);
150     // Info Message
151     setGraphicObjectProperty(pfiguremdlUID, __GO_INFO_MESSAGE__, "", jni_string, 1);
152     // Event Handler
153     setGraphicObjectProperty(pfiguremdlUID, __GO_EVENTHANDLER__, "", jni_string, 1);
154     // Event Handler Enable
155     setGraphicObjectProperty(pfiguremdlUID, __GO_EVENTHANDLER_ENABLE__, &bFalse, jni_bool, 1);
156     // Tag
157     setGraphicObjectProperty(pfiguremdlUID, __GO_TAG__, "", jni_string, 1);
158
159     if (pdblColorMap == NULL)
160     {
161         sprintf(error_message, _("%s: No more memory.\n"), "InitFigureModel");
162         return;
163     }
164
165     for (i = 0; i < m; i++)
166     {
167         pdblColorMap[i] = (double)(defcolors[3 * i] / 255.0);
168         pdblColorMap[i + m] = (double)(defcolors[3 * i + 1] / 255.0);
169         pdblColorMap[i + 2 * m] = (double)(defcolors[3 * i + 2] / 255.0);
170     }
171     // ColorMap
172     setGraphicObjectProperty(pfiguremdlUID, __GO_COLORMAP__, pdblColorMap, jni_double_vector, 3 * m);
173
174     // Parent
175     setGraphicObjectProperty(pfiguremdlUID, __GO_PARENT__, "", jni_string, 1);
176
177     // Default menus
178     buildFigureMenuBar(pfiguremdlUID);
179 }
180
181 /* DJ.A 08/01/04 */
182 int C2F(graphicsmodels) (void)
183 {
184     double margins[4];
185     double clipRegion[4];
186     int clipRegionSet = 0;
187     int firstPlot = 0;
188     int result = 0;
189
190     char *pfiguremdlUID = NULL;
191     char *paxesmdlUID = NULL;
192
193     /*
194      ** Init Figure Model
195      */
196
197     // Create default figure by Asking MVC a new one.
198     pfiguremdlUID = createGraphicObject(__GO_FIGUREMODEL__);
199     setFigureModel(pfiguremdlUID);
200     InitFigureModel(pfiguremdlUID);
201
202     sciInitGraphicMode(pfiguremdlUID);
203
204     /*
205      ** Init Axes Model
206      */
207
208     // Create default Axes by Asking MVC a new one.
209     paxesmdlUID = createGraphicObject(__GO_AXESMODEL__);
210     setAxesModel(paxesmdlUID);
211
212     /* Sets the parent-child relationship between the default Figure and Axes */
213     setGraphicObjectRelationship(pfiguremdlUID, paxesmdlUID);
214
215     /* Axes Model properties */
216
217     result = InitAxesModel();
218
219     if (result < 0)
220     {
221         strcpy(error_message, _("Default axes cannot be created.\n"));
222         return 0;
223     }
224
225     /* Margins and clip region */
226
227     margins[0] = 0.125;
228     margins[1] = 0.125;
229     margins[2] = 0.125;
230     margins[3] = 0.125;
231
232     setGraphicObjectProperty(paxesmdlUID, __GO_MARGINS__, margins, jni_double_vector, 4);
233
234     clipRegion[0] = 0.0;
235     clipRegion[1] = 0.0;
236     clipRegion[2] = 0.0;
237     clipRegion[3] = 0.0;
238
239     setGraphicObjectProperty(paxesmdlUID, __GO_CLIP_BOX__, clipRegion, jni_double_vector, 4);
240
241     clipRegionSet = 0;
242     setGraphicObjectProperty(paxesmdlUID, __GO_CLIP_BOX_SET__, &clipRegionSet, jni_bool, 1);
243
244     /*
245      * Specifies that no high-level drawing function has been called yet.
246      */
247     firstPlot = 1;
248     setGraphicObjectProperty(paxesmdlUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
249
250 #if 0
251     ppaxesmdl->FirstPlot = TRUE;
252 #endif
253
254     return 1;
255 }
256
257 /*
258  * This function has been adapted to the MVC framework, using the
259  * MVC's property set/get calls.
260  */
261
262 int InitAxesModel()
263 {
264     int cubeScaling = 0;
265     int logFlag = 0;
266     int ticksColor = 0;
267     int axisLocation = 0;
268     int boxType = 0;
269     int filled = 0;
270     int gridColor = 0;
271     int gridPosition = 0;
272     int view = 0;
273     int axisReverse = 0;
274     int axisVisible = 0;
275     int defaultNumberTicks = 0;
276     int autoTicks = 0;
277     int autoSubticks = 0;
278     int nbSubticks = 0;
279     int hiddenAxisColor = 0;
280     int hiddenColor = 0;
281     int isoview = 0;
282     int visible = 0;
283     int *piVisible = &visible;
284     int clipState = 0;
285     int tightLimits = 0;
286     int arcDrawingMethod = 0;
287     int labelsFontStyle = 6;
288     int labelsFontColor = -1;
289     int i = 0;
290     double labelsFontSize = 1;
291     double axesBounds[4];
292     double dataBounds[6];
293     double rotationAngles[2];
294     double tab[] = { 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. }; /* graduations init. tmptab */
295     /* z-axis initial ticks locations */
296     double tabZTicksLocations[] = { -1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 };
297     char labelBuffer[LABEL_BUFFER_LENGTH];
298     char **stringVector = NULL;
299
300     int lineColor = -1;
301     int background = -2;
302     int foreground = -1;
303     double lineWidth = 1.0;
304
305     /* 0: solid */
306     int lineStyle = 0;
307
308     int markMode = 0;
309     int lineMode = 1;
310     int fillMode = 1;
311     int markStyle = 0;
312     int markSize = 0;
313
314     /* 0: point, 1: tabulated */
315     int markSizeUnit = 1;
316
317     char *labelUID = NULL;
318
319     char *pfiguremdlUID = (char*)getFigureModel();
320     char *paxesmdlUID = (char*)getAxesModel();
321
322     sciInitGraphicMode(paxesmdlUID);
323
324     setGraphicObjectProperty(paxesmdlUID, __GO_BACKGROUND__, &background, jni_int, 1);
325     setGraphicObjectProperty(paxesmdlUID, __GO_LINE_COLOR__, &foreground, jni_int, 1);
326
327     setGraphicObjectProperty(paxesmdlUID, __GO_FONT_SIZE__, &labelsFontSize, jni_double, 1);
328     setGraphicObjectProperty(paxesmdlUID, __GO_FONT_COLOR__, &labelsFontColor, jni_int, 1);
329     setGraphicObjectProperty(paxesmdlUID, __GO_FONT_STYLE__, &labelsFontStyle, jni_int, 1);
330
331     setGraphicObjectProperty(paxesmdlUID, __GO_LINE_THICKNESS__, &lineWidth, jni_double, 1);
332     setGraphicObjectProperty(paxesmdlUID, __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
333
334     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_MODE__, &markMode, jni_bool, 1);
335     setGraphicObjectProperty(paxesmdlUID, __GO_LINE_MODE__, &lineMode, jni_bool, 1);
336     setGraphicObjectProperty(paxesmdlUID, __GO_FILL_MODE__, &fillMode, jni_bool, 1);
337
338     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_STYLE__, &markStyle, jni_int, 1);
339     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_SIZE__, &markSize, jni_int, 1);
340     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_SIZE_UNIT__, &markSizeUnit, jni_int, 1);
341
342     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_BACKGROUND__, &background, jni_int, 1);
343     setGraphicObjectProperty(paxesmdlUID, __GO_MARK_FOREGROUND__, &foreground, jni_int, 1);
344
345     cubeScaling = 0;
346     setGraphicObjectProperty(paxesmdlUID, __GO_CUBE_SCALING__, &cubeScaling, jni_bool, 1);
347
348     /* Log flags set to linear for the 3 axes */
349     logFlag = 0;
350
351     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_LOG_FLAG__, &logFlag, jni_bool, 1);
352     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_LOG_FLAG__, &logFlag, jni_bool, 1);
353     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_LOG_FLAG__, &logFlag, jni_bool, 1);
354
355     ticksColor = -1;
356     setGraphicObjectProperty(paxesmdlUID, __GO_TICKS_COLOR__, &ticksColor, jni_int, 1);
357
358     nbSubticks = 1;
359     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
360     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
361     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
362
363     /* 0 corresponds to bottom position */
364     axisLocation = 0;
365     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_LOCATION__, &axisLocation, jni_int, 1);
366
367     /* 4 corresponds to left position */
368     axisLocation = 4;
369     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_LOCATION__, &axisLocation, jni_int, 1);
370
371     /* 0 corresponds to OFF */
372     boxType = 0;
373     setGraphicObjectProperty(paxesmdlUID, __GO_BOX_TYPE__, &boxType, jni_int, 1);
374
375     filled = 1;
376     setGraphicObjectProperty(paxesmdlUID, __GO_FILLED__, &filled, jni_bool, 1);
377
378     gridColor = -1;
379     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_GRID_COLOR__, &gridColor, jni_int, 1);
380     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_GRID_COLOR__, &gridColor, jni_int, 1);
381     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_GRID_COLOR__, &gridColor, jni_int, 1);
382
383     /* 0: background */
384     setGraphicObjectProperty(paxesmdlUID, __GO_LINE_COLOR__, &lineColor, jni_int, 1);
385     setGraphicObjectProperty(paxesmdlUID, __GO_BACKGROUND__, &background, jni_int, 1);
386
387     gridPosition = 0;
388
389     setGraphicObjectProperty(paxesmdlUID, __GO_GRID_POSITION__, &gridPosition, jni_int, 1);
390
391     rotationAngles[0] = 0.0;
392     rotationAngles[1] = 270.0;
393
394     setGraphicObjectProperty(paxesmdlUID, __GO_ROTATION_ANGLES__, rotationAngles, jni_double_vector, 2);
395
396     /* 0: 2D view */
397     view = 0;
398     setGraphicObjectProperty(paxesmdlUID, __GO_VIEW__, &view, jni_int, 1);
399
400     /* Must be set after VIEW, since setting VIEW to 2D overwrites the 3D rotation angles */
401     rotationAngles[0] = 45.0;
402     rotationAngles[1] = 215.0;
403
404     setGraphicObjectProperty(paxesmdlUID, __GO_ROTATION_ANGLES_3D__, rotationAngles, jni_double_vector, 2);
405
406     axisVisible = 0;
407     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
408     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
409     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_VISIBLE__, &axisVisible, jni_bool, 1);
410
411     axisReverse = 0;
412     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_REVERSE__, &axisReverse, jni_bool, 1);
413     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_REVERSE__, &axisReverse, jni_bool, 1);
414     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_REVERSE__, &axisReverse, jni_bool, 1);
415
416     /* Corresponds to the MVC AUTO_SUBTICKS property (!flagNax is equivalent to AUTO_SUBTICKS) */
417 #if 0
418     ppaxesmdl->flagNax = FALSE;
419 #endif
420
421     autoSubticks = 1;
422     setGraphicObjectProperty(paxesmdlUID, __GO_AUTO_SUBTICKS__, &autoSubticks, jni_bool, 1);
423
424     /* To be corrected when the equivalent of flagnax is implemented within the MVC */
425     nbSubticks = 1;
426     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
427     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
428     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_SUBTICKS__, &nbSubticks, jni_int, 1);
429
430     /*
431      * The code creating default ticks labels and positions should be put
432      * into the Model. Ticks positions and locations should be computed using the default data bounds
433      * instead of using pre-defined values.
434      * Note that the pre-MVC ticks labels creation code is implemented in the C++ Renderer module
435      * and should be moved to the Java Model's relevant parts (TicksProperty).
436      */
437
438     /*
439      * Automatic ticks computation must be activated for the 3 axes before setting ticks values to
440      * ensure that the ticks values set are the automatic ticks' ones.
441      */
442     autoTicks = 1;
443     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
444     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
445     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_AUTO_TICKS__, &autoTicks, jni_bool, 1);
446
447     defaultNumberTicks = 11;
448
449     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_TICKS_LOCATIONS__, tab, jni_double_vector, defaultNumberTicks);
450     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_TICKS_LOCATIONS__, tab, jni_double_vector, defaultNumberTicks);
451
452     stringVector = createStringArray(defaultNumberTicks);
453
454     if (stringVector == NULL)
455     {
456         return -1;
457     }
458
459     /*
460      * A proper format should be used (ChoixFormatE function)
461      */
462     for (i = 0; i < defaultNumberTicks; i++)
463     {
464         sprintf(labelBuffer, "%.1f", tab[i]);
465         stringVector[i] = strdup(labelBuffer);
466
467         if (stringVector[i] == NULL)
468         {
469             return -1;
470         }
471     }
472
473     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_TICKS_LABELS__, stringVector, jni_string_vector, defaultNumberTicks);
474     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_TICKS_LABELS__, stringVector, jni_string_vector, defaultNumberTicks);
475
476     /*
477      * The same number of ticks is used now for the x,y and z axes.
478      * Previously, the z-axis contained only 3 ticks (-1, 0, 1). However, the renderer module was
479      * overriding this default number (3) by creating an 11-tick z-axis when required (3D view).
480      * Ticks locations and labels are however different for the z-axis (from -1 to +1 instead of 0 to 1).
481      */
482     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_TICKS_LOCATIONS__, tabZTicksLocations, jni_double_vector, defaultNumberTicks);
483
484     /* ChoixFormatE should be used */
485     for (i = 0; i < defaultNumberTicks; i++)
486     {
487         FREE(stringVector[i]);
488
489         sprintf(labelBuffer, "%.1f", tabZTicksLocations[i]);
490         stringVector[i] = strdup(labelBuffer);
491
492         if (stringVector[i] == NULL)
493         {
494             return -1;
495         }
496     }
497
498     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_TICKS_LABELS__, stringVector, jni_string_vector, defaultNumberTicks);
499
500     destroyStringArray(stringVector, defaultNumberTicks);
501
502     /*
503      * Indicates the direction of projection (0 for the axis corresponding to the direction,
504      * 1 for the others).
505      * To be implemented within the MVC if determined to be useful.
506      */
507 #if 0
508     ppaxesmdl->project[0] = 1;
509     ppaxesmdl->project[1] = 1;
510     ppaxesmdl->project[2] = 0;
511 #endif
512
513     hiddenAxisColor = 4;
514     setGraphicObjectProperty(paxesmdlUID, __GO_HIDDEN_AXIS_COLOR__, &hiddenAxisColor, jni_int, 1);
515
516     hiddenColor = 4;
517     setGraphicObjectProperty(paxesmdlUID, __GO_HIDDEN_COLOR__, &hiddenColor, jni_int, 1);
518
519     isoview = 0;
520     setGraphicObjectProperty(paxesmdlUID, __GO_ISOVIEW__, &isoview, jni_bool, 1);
521
522     /* Axes bounds set to fill the whole drawing area */
523     axesBounds[0] = 0.0;
524     axesBounds[1] = 0.0;
525     axesBounds[2] = 1.0;
526     axesBounds[3] = 1.0;
527     setGraphicObjectProperty(paxesmdlUID, __GO_AXES_BOUNDS__, axesBounds, jni_double_vector, 4);
528
529     /* xmin, xmax */
530     dataBounds[0] = 0.0;
531     dataBounds[1] = 1.0;
532     /* ymin, ymax */
533     dataBounds[2] = 0.0;
534     dataBounds[3] = 1.0;
535     /* zmin, zmax */
536     dataBounds[4] = -1.0;
537     dataBounds[5] = 1.0;
538
539     setGraphicObjectProperty(paxesmdlUID, __GO_DATA_BOUNDS__, dataBounds, jni_double_vector, 6);
540
541     /* visible */
542     getGraphicObjectProperty(pfiguremdlUID, __GO_VISIBLE__, jni_bool, (void**)&piVisible);
543     setGraphicObjectProperty(paxesmdlUID, __GO_VISIBLE__, &visible, jni_bool, 1);
544
545     /* 0: clipping off */
546     clipState = 0;
547     setGraphicObjectProperty(paxesmdlUID, __GO_CLIP_STATE__, &clipState, jni_int, 1);
548
549     /* "real data bounds" and "data bounds" are initially the same */
550     setGraphicObjectProperty(paxesmdlUID, __GO_REAL_DATA_BOUNDS__, dataBounds, jni_double_vector, 6);
551
552     tightLimits = 0;
553     setGraphicObjectProperty(paxesmdlUID, __GO_TIGHT_LIMITS__, &tightLimits, jni_bool, 1);
554
555     /* Sets the default arc drawing method to lines (1), which is faster */
556     arcDrawingMethod = 1;
557     setGraphicObjectProperty(paxesmdlUID, __GO_ARC_DRAWING_METHOD__, &arcDrawingMethod, jni_int, 1);
558
559     /* Creates the Axes model's labels and sets the model as their parent */
560     labelUID = initLabel(paxesmdlUID);
561     setGraphicObjectProperty(paxesmdlUID, __GO_TITLE__, labelUID, jni_string, 1);
562
563     labelUID = initLabel(paxesmdlUID);
564     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_LABEL__, labelUID, jni_string, 1);
565
566     labelUID = initLabel(paxesmdlUID);
567     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_LABEL__, labelUID, jni_string, 1);
568
569     labelUID = initLabel(paxesmdlUID);
570     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_LABEL__, labelUID, jni_string, 1);
571
572     return 0;
573 }
574
575 /*
576  * This function has been adapted to the MVC framework.
577  * Its code ought to be moved to the Java Model implementation,
578  * either within the relevant constructor or an initialization method.
579  */
580
581 /**sciInitGraphicMode
582  * Inits the graphic mode of this object with the default value
583  */
584 int sciInitGraphicMode(char *pobjUID)
585 {
586     int iType = -1;
587     int *piType = &iType;
588
589     getGraphicObjectProperty(pobjUID, __GO_TYPE__, jni_int, (void **)&piType);
590
591     /*
592      * The GO_FIGURE block is never reached as InitFigureModel
593      * is not called at all (was previously called by
594      * the graphicsmodels function).
595      */
596     if (iType == __GO_FIGURE__)
597     {
598         /* 3: copy pixel drawing mode */
599         int xormode = 3;
600
601         if (isFigureModel(pobjUID))
602         {
603             /*
604              * These 3 properties are not used by the Figure object proper, but
605              * rather serve to initialize its children Axes' ones.
606              */
607             setGraphicObjectProperty(pobjUID, __GO_PIXEL_DRAWING_MODE__, &xormode, jni_int, 1);
608         }
609     }
610     else if (iType == __GO_AXES__)
611     {
612         /*
613          * Same values as the ones from the Figure model. These values were copied from the parent
614          * Figure but are for now set using the values below.
615          */
616
617         /* autoClear is the logical not of addPlot (autoClear == 0 corresponds to addPlot == TRUE) */
618         int autoClear = 0;
619         int autoScale = 1;
620         int zoom = 0;
621
622         /* 3: copy */
623         int xormode = 3;
624
625         if (isAxesModel(pobjUID))
626         {
627             setGraphicObjectProperty(pobjUID, __GO_AUTO_CLEAR__, &autoClear, jni_bool, 1);
628             setGraphicObjectProperty(pobjUID, __GO_AUTO_SCALE__, &autoScale, jni_bool, 1);
629             setGraphicObjectProperty(pobjUID, __GO_ZOOM_ENABLED__, &zoom, jni_bool, 1);
630
631             /*
632              * Internal state: was possibly used to avoid accessing the parent Figure's pixel drawing mode
633              * or may be entirely useless, as pixel drawing mode is associated to the whole Figure.
634              * As it has no corresponding MVC property, this call will not set anything.
635              */
636             setGraphicObjectProperty(pobjUID, __GO_PIXEL_DRAWING_MODE__, &xormode, jni_int, 1);
637         }
638         /*
639          * This block is never reached at all since since the Axes model
640          * is now cloned within the MVC via a C call.
641          */
642         else
643         {
644             int iTmp = 0;
645             int *piTmp = &iTmp;
646             char *paxesmdlUID = (char*)getAxesModel();
647
648             getGraphicObjectProperty(paxesmdlUID, __GO_AUTO_CLEAR__, jni_bool, (void **)&piTmp);
649             autoClear = iTmp;
650             getGraphicObjectProperty(paxesmdlUID, __GO_AUTO_SCALE__, jni_bool, (void **)&piTmp);
651             autoScale = iTmp;
652             getGraphicObjectProperty(paxesmdlUID, __GO_ZOOM_ENABLED__, jni_bool, (void **)&piTmp);
653             zoom = iTmp;
654
655             setGraphicObjectProperty(pobjUID, __GO_AUTO_CLEAR__, &autoClear, jni_bool, 1);
656             setGraphicObjectProperty(pobjUID, __GO_AUTO_SCALE__, &autoScale, jni_bool, 1);
657             setGraphicObjectProperty(pobjUID, __GO_ZOOM_ENABLED__, &zoom, jni_bool, 1);
658
659             /*
660              * Internal state: used to avoid accessing the parent's pixel drawing mode
661              * obsolete ? Not implemented yet within the MVC
662              */
663
664             getGraphicObjectProperty(paxesmdlUID, __GO_PIXEL_DRAWING_MODE__, jni_bool, (void **)&piTmp);
665             xormode = iTmp;
666
667             setGraphicObjectProperty(pobjUID, __GO_PIXEL_DRAWING_MODE__, &xormode, jni_int, 1);
668         }
669     }
670
671     /* Deactivated */
672 #if 0
673 case SCI_TEXT:
674 case SCI_LEGEND:
675 case SCI_ARC:
676 case SCI_SEGS:
677 case SCI_FEC:
678 case SCI_GRAYPLOT:
679 case SCI_POLYLINE:
680 case SCI_RECTANGLE:
681 case SCI_SURFACE:
682 case SCI_AXES:
683 case SCI_AGREG:
684 case SCI_LABEL:                /* F.Leray 28.05.04 */
685 case SCI_UIMENU:
686 default:
687     sciprint(_("This object has not any graphic mode\n"));
688     return -1;
689     break;
690 #endif
691
692     return 0;
693 }
694
695 /*---------------------------------------------------------------------------------*/
696 /* allocate and set a new label to default values */
697 char *initLabel(char *parentObjUID)
698 {
699     char *newLabel = NULL;
700     int iHidden = 1;
701     int autoPosition = 1;
702
703     newLabel = createGraphicObject(__GO_LABEL__);
704
705     /* Hide Label as they are non explicit children */
706     setGraphicObjectProperty(newLabel, __GO_HIDDEN__, &iHidden, jni_bool, 1);
707     setGraphicObjectProperty(newLabel, __GO_AUTO_POSITION__, &autoPosition, jni_bool, 1);
708     setGraphicObjectProperty(newLabel, __GO_AUTO_ROTATION__, &autoPosition, jni_bool, 1);
709
710     /* Sets the label's parent */
711     setGraphicObjectRelationship(parentObjUID, newLabel);
712
713     cloneGraphicContext(parentObjUID, newLabel);
714     cloneFontContext(parentObjUID, newLabel);
715
716     return newLabel;
717 }
718 /*---------------------------------------------------------------------------------*/