Current axes now update figure even if not direct parent
[scilab.git] / scilab / modules / graphics / src / c / getHandleProperty / set_current_axes_property.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2004-2006 - INRIA - Fabrice Leray
4  * Copyright (C) 2006 - INRIA - Allan Cornet
5  * Copyright (C) 2006 - INRIA - Jean-Baptiste Silvy
6  * Copyright (C) 2009 - DIGITEO - Pierre Lando
7  * Copyright (C) 2011 - DIGITEO - Manuel Juliachs
8  *
9  * This file must be used under the terms of the CeCILL.
10  * This source file is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution.  The terms
12  * are also available at
13  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
14  *
15  */
16
17 /*------------------------------------------------------------------------*/
18 /* file: set_current_axes_property.c                                      */
19 /* desc : function to modify in Scilab the current_axes field of          */
20 /*        a handle                                                        */
21 /*------------------------------------------------------------------------*/
22
23 #include <string.h>
24
25 #include "setHandleProperty.h"
26 #include "getPropertyAssignedValue.h"
27 #include "Scierror.h"
28 #include "localization.h"
29 #include "SetPropertyStatus.h"
30 #include "HandleManagement.h"
31 #include "sci_types.h"
32
33 #include "getGraphicObjectProperty.h"
34 #include "setGraphicObjectProperty.h"
35 #include "graphicObjectProperties.h"
36 #include "CurrentFigure.h"
37 #include "CurrentSubwin.h"
38
39 /*------------------------------------------------------------------------*/
40 int set_current_axes_property(void* _pvCtx, int iObjUID, void* _pvData, int valueType, int nbRow, int nbCol)
41 {
42     int iCurAxesUID = 0;
43     int iCurChildUID = 0;
44     int iParentFigureUID = -1;
45     int* piParentFigureUID = &iParentFigureUID;
46     int type = -1;
47     int *piType = &type;
48
49     if (iObjUID != 0)
50     {
51         /* This property should not be called on a handle */
52         Scierror(999, _("'%s' property does not exist for this handle.\n"), "current_axes");
53         return SET_PROPERTY_ERROR;
54     }
55
56     if (valueType != sci_handles)
57     {
58         Scierror(999, _("Wrong type for '%s' property: Handle expected.\n"), "current_axes");
59         return SET_PROPERTY_ERROR;
60     }
61
62     iCurAxesUID = getObjectFromHandle((long)((long long*)_pvData)[0]);
63
64     if (iCurAxesUID == 0)
65     {
66         Scierror(999, _("Wrong value for '%s' property: Must be a valid handle.\n"), "current_entity");
67         return SET_PROPERTY_ERROR;
68     }
69
70     getGraphicObjectProperty(iCurAxesUID, __GO_TYPE__, jni_int, (void **)&piType);
71
72     if (type != __GO_AXES__)
73     {
74         Scierror(999, _("Wrong value for '%s' property: Must be a handle on axes.\n"), "current_axes");
75         return SET_PROPERTY_ERROR;
76     }
77
78     setCurrentSubWin(iCurAxesUID);
79
80
81     // Look for top level figure
82     type = -1;
83     iCurChildUID = iCurAxesUID;
84     do {
85         iParentFigureUID = getParentObject(iCurChildUID);
86         getGraphicObjectProperty(iParentFigureUID, __GO_TYPE__, jni_int, (void **)&piType);
87         iCurChildUID = iParentFigureUID;
88     } while (iParentFigureUID != -1 && type != __GO_FIGURE__);
89
90     /* The current Axes' parent Figure's selected child property must be updated */
91     setGraphicObjectProperty(iParentFigureUID, __GO_SELECTED_CHILD__, &iCurAxesUID, jni_int, 1);
92
93     /* F.Leray 11.02.05 : if the new selected subwin is not inside the current figure, */
94     /* we must also set the current figure to the subwin's parent */
95     if (!isCurrentFigure(iParentFigureUID))
96     {
97         setCurrentFigure(iParentFigureUID);
98     }
99
100     return SET_PROPERTY_SUCCEED;
101 }
102 /*------------------------------------------------------------------------*/