684b6fb89f77d6c402e68007761d8ee166875a07
[scilab.git] / scilab / modules / graphics / src / c / Interaction.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) 2012 - DIGITEO - Manuel Juliachs
8  *
9  * Copyright (C) 2012 - 2016 - Scilab Enterprises
10  *
11  * This file is hereby licensed under the terms of the GNU GPL v2.0,
12  * pursuant to article 5.3.4 of the CeCILL v.2.1.
13  * This file was originally licensed under the terms of the CeCILL v2.1,
14  * and continues to be available under such terms.
15  * For more information, see the COPYING file which you should have received
16  * along with this program.
17  *
18  */
19
20 /*------------------------------------------------------------------------
21  *    Graphic library
22  *    Comment:
23  *    This file contains all functions used to INTERACT with the graphic
24  *    window (zoom by pressing button, callbacks...)
25  --------------------------------------------------------------------------*/
26 #include <string.h>
27 #include "Interaction.h"
28 #include "SetProperty.h"
29 #include "GetProperty.h"
30 #include "Scierror.h"
31 #include "sci_malloc.h" /* MALLOC */
32 #include "localization.h"
33 #include "JavaInteraction.h"
34 #include "axesScale.h"
35 #include "math_graphics.h"
36 #include "HandleManagement.h"
37
38 #include "graphicObjectProperties.h"
39 #include "setGraphicObjectProperty.h"
40 #include "getGraphicObjectProperty.h"
41
42 /*----------------------------------------------------------------------------------------*/
43 /* Objmove                                                                                         */
44 /* move a handle in the graphic window                                                             */
45 /*----------------------------------------------------------------------------------------*/
46
47 static int moveObj(int iObjUID, double displacement[], int displacementSize)
48 {
49     int i = 0;
50     double x = displacement[0];
51     double y = displacement[1];
52     double z = (displacementSize == 3 ? displacement[2] : 0.0);
53
54     int iNum = 0;
55     int *piNum = &iNum;
56     double* pdblData = NULL;
57     double* pdblDataY = NULL;
58     double* pdblDataZ = NULL;
59     int iType = -1;
60     int* piType = &iType;
61
62     double* dataX = NULL;
63     double* dataY = NULL;
64     double* dataZ = NULL;
65
66     int iNumX = 0;
67     int iNumY = 0;
68     int iNumZ = 0;
69     int *piNumX = &iNumX;
70     int *piNumY = &iNumY;
71     int *piNumZ = &iNumZ;
72
73     int iChildrenCount = 0;
74     int *piChildrenCount = &iChildrenCount;
75     int* piChildrenUID = 0;
76
77     // Get type
78     getGraphicObjectProperty(iObjUID, __GO_TYPE__, jni_int, (void **)&piType);
79
80     // If a Figure, neither the object nor its children are moved.
81     if (iType == __GO_FIGURE__)
82     {
83         Scierror(999, _("This object can not be moved.\n"));
84         return -1;
85     }
86
87     // Iterate on children.
88     getGraphicObjectProperty(iObjUID, __GO_CHILDREN_COUNT__, jni_int, (void**)&piChildrenCount);
89
90     if (iChildrenCount != 0)
91     {
92         getGraphicObjectProperty(iObjUID, __GO_CHILDREN__, jni_int_vector, (void **) &piChildrenUID);
93         for (i = 0 ; i < iChildrenCount ; ++i)
94         {
95             moveObj(piChildrenUID[i], displacement, displacementSize);
96         }
97     }
98
99     // Arc.
100     if (iType == __GO_ARC__)
101     {
102         getGraphicObjectProperty(iObjUID, __GO_UPPER_LEFT_POINT__, jni_double_vector, (void **)&pdblData);
103         pdblData[0] += x;
104         pdblData[1] += y;
105         pdblData[2] += z;
106         setGraphicObjectProperty(iObjUID, __GO_UPPER_LEFT_POINT__, pdblData, jni_double_vector, 3);
107
108         return 0;
109     }
110     // Fac3d.
111     else if (iType == __GO_FAC3D__)
112     {
113         int iNumVPG = 0;
114         int* piNumVPG = &iNumVPG;
115
116         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_VERTICES_PER_GON__, jni_int, (void**)&piNumVPG);
117         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_GONS__, jni_int, (void**)&piNum);
118
119         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
120         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
121         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
122
123         for (i = 0; i < iNumVPG * iNum; i++)
124         {
125             dataX[i] += x;
126             dataY[i] += y;
127             dataZ[i] += z;
128         }
129
130         /* Model data has been updated by direct pointer access, trigger update within the renderer. */
131         setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, dataZ, jni_double_vector, iNumVPG * iNum);
132
133         return 0;
134     }
135     // Fec.
136     else if (iType == __GO_FEC__)
137     {
138         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_VERTICES__, jni_int, (void**)&piNum);
139         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_COORDINATES__, jni_double_vector, (void **)&pdblData);
140
141         for (i = 0; i < iNum; i++)
142         {
143             pdblData[3 * i] += x;
144             pdblData[3 * i + 1] += y;
145             pdblData[3 * i + 2] += z;
146         }
147
148         setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_COORDINATES__, pdblData, jni_double_vector, 3 * iNum);
149
150         return 0;
151     }
152     // Grayplot.
153     else if (iType == __GO_GRAYPLOT__)
154     {
155         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void**)&piNumX);
156         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**)&piNumY);
157
158         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
159         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
160
161         for (i = 0; i < iNumX; i++)
162         {
163             dataX[i] += x;
164         }
165
166         for (i = 0; i < iNumY; i++)
167         {
168             dataY[i] += y;
169         }
170
171         if (displacementSize == 3)
172         {
173             double zShift = 0.0;
174             double* pdZshift = &zShift;
175
176             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z_COORDINATES_SHIFT__, jni_int, (void**)&pdZshift);
177             zShift += z;
178             setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z_COORDINATES_SHIFT__, &zShift, jni_double, 1);
179         }
180         else
181         {
182             setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, dataY, jni_double_vector, iNumY);
183         }
184
185         return 0;
186     }
187     // Matplot.
188     else if (iType == __GO_MATPLOT__)
189     {
190         double zShift = 0.0;
191         double* pdZShift = &zShift;
192         //double* bounds = NULL;
193         int type;
194         int* itype = &type;
195
196         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_MATPLOT_TYPE__, jni_int, (void**)&itype);
197
198         /* Only type 1 Matplot objects can be moved. */
199         if (type == 1)
200         {
201             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void**)&piNumX);
202             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**)&piNumY);
203
204             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
205             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
206
207             for (i = 0; i < iNumX; i++)
208             {
209                 dataX[i] += x;
210             }
211
212             for (i = 0; i < iNumY; i++)
213             {
214                 dataY[i] += y;
215             }
216
217             /* Bounds must be updated. */
218             //getGraphicObjectProperty(iObjUID, __GO_MATPLOT_BOUNDS__, jni_double_vector, (void **)&bounds);
219
220             //bounds[0] += x;
221             //bounds[1] += x;
222             //bounds[2] += y;
223             //bounds[3] += y;
224
225             if (displacementSize == 3)
226             {
227                 getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z_COORDINATES_SHIFT__, jni_int, (void**)&pdZShift);
228                 zShift += z;
229                 setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z_COORDINATES_SHIFT__, &zShift, jni_double, 1);
230             }
231             else
232             {
233                 setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, dataY, jni_double_vector, iNumY);
234             }
235
236             return 0;
237         }
238     }
239     // Polyline.
240     else if (iType == __GO_POLYLINE__)
241     {
242         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_VERTICES_PER_GON__, jni_int, (void**)&piNum);
243
244         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
245         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
246
247         for (i = 0; i < iNum; i++)
248         {
249             dataX[i] += x;
250             dataY[i] += y;
251         }
252
253         if (displacementSize == 3)
254         {
255             int zCoordinatesSet = 1;
256
257             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
258
259             for (i = 0; i < iNum; i++)
260             {
261                 dataZ[i] += z;
262             }
263
264             /* The z coordinates flag must be set explicitely for now. */
265             setGraphicObjectPropertyAndNoWarn(iObjUID, __GO_DATA_MODEL_Z_COORDINATES_SET__, &zCoordinatesSet, jni_int, 1);
266
267             /* Model data has been updated by direct pointer access, trigger update within the renderer. */
268             setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, dataZ, jni_double_vector, iNum);
269         }
270         else
271         {
272             /* Trigger update, see above. */
273             setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, dataY, jni_double_vector, iNum);
274         }
275
276         return 0;
277     }
278     // Plot3d.
279     else if (iType == __GO_PLOT3D__)
280     {
281         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void**)&piNumX);
282         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**)&piNumY);
283         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Z__, jni_int, (void**)&piNumZ);
284
285         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
286         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
287         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
288
289         for (i = 0; i < iNumX; i++)
290         {
291             dataX[i] += x;
292         }
293
294         for (i = 0; i < iNumY; i++)
295         {
296             dataY[i] += y;
297         }
298
299         for (i = 0; i < iNumZ; i++)
300         {
301             dataZ[i] += z;
302         }
303
304         /*
305          * Perform only one set call to trigger geometry data update within the renderer module.
306          * Model data has been updated above by direct pointer access.
307          */
308         setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, dataZ, jni_double_vector, iNumZ);
309         return 0;
310     }
311     // Champ.
312     else if (iType == __GO_CHAMP__)
313     {
314         int *champDimensions = NULL;
315
316         getGraphicObjectProperty(iObjUID, __GO_CHAMP_DIMENSIONS__, jni_int_vector, (void **)&champDimensions);
317
318         getGraphicObjectProperty(iObjUID, __GO_BASE_X__, jni_double_vector, (void **)&pdblData);
319         getGraphicObjectProperty(iObjUID, __GO_BASE_Y__, jni_double_vector, (void **)&pdblDataY);
320
321         for (i = 0; i < champDimensions[0]; i++)
322         {
323             pdblData[i] += x;
324         }
325
326         for (i = 0; i < champDimensions[1]; i++)
327         {
328             pdblDataY[i] += y;
329         }
330
331         setGraphicObjectProperty(iObjUID, __GO_BASE_X__, pdblData, jni_double_vector, champDimensions[0]);
332         setGraphicObjectProperty(iObjUID, __GO_BASE_Y__, pdblDataY, jni_double_vector, champDimensions[1]);
333
334         if (displacementSize == 3)
335         {
336             getGraphicObjectProperty(iObjUID, __GO_BASE_Z__, jni_double_vector, (void **)&pdblDataZ);
337
338             for (i = 0; i < champDimensions[0]*champDimensions[1]; i++)
339             {
340                 pdblDataZ[i] += z;
341             }
342
343             setGraphicObjectProperty(iObjUID, __GO_BASE_Z__, pdblDataZ, jni_double_vector, champDimensions[0]*champDimensions[1]);
344         }
345         return 0;
346     }
347     // Label.
348     else if (iType == __GO_LABEL__)
349     {
350         getGraphicObjectProperty(iObjUID, __GO_POSITION__, jni_double_vector, (void **)&pdblData);
351         pdblData[0] += x;
352         pdblData[1] += y;
353         pdblData[2] += z;
354         setGraphicObjectProperty(iObjUID, __GO_POSITION__, pdblData, jni_double_vector, 3);
355
356         return 0;
357     }
358     // Rectangle.
359     else if (iType == __GO_RECTANGLE__)
360     {
361         getGraphicObjectProperty(iObjUID, __GO_UPPER_LEFT_POINT__, jni_double_vector, (void **)&pdblData);
362         pdblData[0] += x;
363         pdblData[1] += y;
364         pdblData[2] += z;
365         setGraphicObjectProperty(iObjUID, __GO_UPPER_LEFT_POINT__, pdblData, jni_double_vector, 3);
366
367         return 0;
368     }
369     // Segs.
370     else if (iType == __GO_SEGS__)
371     {
372         double* pdblDirection = NULL;
373
374         getGraphicObjectProperty(iObjUID, __GO_NUMBER_ARROWS__, jni_int, (void**)&piNum);
375         getGraphicObjectProperty(iObjUID, __GO_BASE__, jni_double_vector, (void **)&pdblData);
376         getGraphicObjectProperty(iObjUID, __GO_DIRECTION__, jni_double_vector, (void **)&pdblDirection);
377
378         for (i = 0; i < iNum; i++)
379         {
380             pdblData[3 * i] += x;
381             pdblData[3 * i + 1] += y;
382             pdblData[3 * i + 2] += z;
383         }
384
385         for (i = 0; i < iNum; i++)
386         {
387             pdblDirection[3 * i] += x;
388             pdblDirection[3 * i + 1] += y;
389             pdblDirection[3 * i + 2] += z;
390         }
391
392         setGraphicObjectProperty(iObjUID, __GO_BASE__, pdblData, jni_double_vector, 3 * iNum);
393         setGraphicObjectProperty(iObjUID, __GO_DIRECTION__, pdblDirection, jni_double_vector, 3 * iNum);
394
395         return 0;
396     }
397     // Text.
398     else if (iType == __GO_TEXT__)
399     {
400         getGraphicObjectProperty(iObjUID, __GO_POSITION__, jni_double_vector, (void **)&pdblData);
401         pdblData[0] += x;
402         pdblData[1] += y;
403         pdblData[2] += z;
404         setGraphicObjectProperty(iObjUID, __GO_POSITION__, pdblData, jni_double_vector, 3);
405
406         return 0;
407     }
408
409     if (iType == __GO_AXES__ || iType == __GO_COMPOUND__)
410     {
411         // Children already moved: Done.
412         return 0;
413     }
414
415     // Default error.
416     Scierror(999, _("This object can not be moved.\n"));
417     return -1;
418     /*
419         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_X__, jni_int, (void**)&piNumX);
420         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Y__, jni_int, (void**)&piNumY);
421
422         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, jni_double_vector, (void **)&dataX);
423         getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, jni_double_vector, (void **)&dataY);
424
425         // X
426         for (i = 0 ; i < iNumX ; ++i)
427         {
428             dataX[i] += x;
429         }
430         setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_X__, dataX, jni_double_vector, iNumX);
431
432         // Y
433         for (i = 0 ; i < iNumY ; ++i)
434         {
435             dataY[i] += y;
436         }
437         setGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Y__, dataY, jni_double_vector, iNumY);
438
439         // Z if needed
440         if (displacementSize == 3)
441         {
442             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_NUM_Z__, jni_int, (void**)&piNumZ);
443             getGraphicObjectProperty(iObjUID, __GO_DATA_MODEL_Z__, jni_double_vector, (void **)&dataZ);
444             for (i = 0 ; i < iNumZ ; ++i)
445             {
446                 dataZ[i] += z;
447             }
448         }
449
450         return 0;
451     */
452
453     return 0;
454 }
455
456 int Objmove (int iObjUID, double d[], int m, BOOL opt)
457 {
458     return moveObj(iObjUID, d, m);
459 }
460
461 /*---------------------------------------------------------------------------------*/
462 void showWindow(int iFigureUID)
463 {
464     // @TODO: Call SwingView to raise window.
465 }
466