d40902644ac3114d1bbec8688a0437dc2a5d6b52
[scilab.git] / scilab / modules / graphics / src / c / CurrentObjectsManagement.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) 2007 - INRIA - Jean-Baptiste Silvy
5  * Copyright (C) 2010 - DIGITEO - Manuel Juliachs
6  *
7  *
8  * This file must be used under the terms of the CeCILL.
9  * This source file is licensed as described in the file COPYING, which
10  * you should have received as part of this distribution.  The terms
11  * are also available at
12  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
13  *
14  */
15
16 /*------------------------------------------------------------------------*/
17 /* file: CurrentObjectsManagement.c                                        */
18 /* desc : Set of functions to retrieve the currents objects               */
19 /*------------------------------------------------------------------------*/
20
21 #include "CurrentObjectsManagement.h"
22 #include "BuildObjects.h"
23 #include "ObjectSelection.h"
24 #include "WindowList.h"
25 #include "HandleManagement.h"
26 #include "InitObjects.h"
27 #include "MALLOC.h"
28 #include "CloneObjects.h"
29
30 #include "setGraphicObjectProperty.h"
31 #include "getGraphicObjectProperty.h"
32 #include "graphicObjectProperties.h"
33 #include "callJoGLView.h"
34
35 /*----------------------------------------------------------------------------------*/
36 /* root of the graphic hierarchy */
37 /* singleton, there is only one screen */
38 static sciPointObj * sciCurrentObject  = NULL ;
39 static sciPointObj * sciCurrentFigure  = NULL ;
40 /*----------------------------------------------------------------------------------*/
41 static sciPointObj * getCurrentPointedFigure(void);
42 /*----------------------------------------------------------------------------------*/
43 static sciPointObj * getCurrentPointedFigure(void)
44 {
45   return sciCurrentFigure;
46 }
47 /*----------------------------------------------------------------------------------*/
48 sciPointObj * sciGetCurrentFigure( void )
49 {
50   /* debug F.Leray 22.07.04 */
51   sciPointObj * pFigure = getCurrentPointedFigure();
52   sciPointObj* newaxes = NULL;
53
54   if( !sciHasFigures() )
55   {
56     /* it would mean that we have change the driver to GIF,Pos or PPM and perform a xinit F.Leray 22.07.04 */
57     /* for now, no higher entities than figure */
58       int iZero = 0;
59       pFigure = sciCloneObj(getFigureModel());
60       setGraphicObjectProperty(pFigure->UID, __GO_ID__, &iZero, jni_int, 1);
61       createJoGLView(pFigure->UID);
62
63       /*
64        * Clones a new Axes object using the Axes model which is then
65        * attached to the newly created Figure.
66        */
67       newaxes = sciCloneObj(getAxesModel());
68
69       /* Sets the parent-child relationship within the MVC */
70       setGraphicObjectRelationship(pFigure->UID, newaxes->UID);
71
72       /* Sets the newly created Axes as the Figure's current selected child */
73       setGraphicObjectProperty(pFigure->UID, __GO_SELECTED_CHILD__, newaxes->UID, jni_string, 1);
74
75       /*
76        * Added back to avoid creating a new Figure each time gcf() is executed.
77        * This was previously done in ConstructFigure, called by createFullFigure
78        * which has been replaced by the Figure model clone call above.
79        */
80       addNewFigureToList(pFigure);
81
82       sciSetCurrentFigure(pFigure);
83
84       // Register handle to Scilab.
85       sciAddNewHandle(pFigure);
86
87       /*
88        * Registers the Axes' handle and sets the Axes as the current object.
89        * This was previously done in ConstructSubWin, called by createFirstSubwin
90        * which was also called by createFullFigure.
91        */
92       sciAddNewHandle(newaxes);
93       sciSetCurrentObj(newaxes);
94   }
95
96   return pFigure;
97 }
98 /*----------------------------------------------------------------------------------*/
99 BOOL sciIsCurrentFigure(sciPointObj * pFigure)
100 {
101   return (   pFigure != getFigureModel()
102           && sciHasFigures()
103           && (pFigure == sciGetCurrentFigure()));
104 }
105 /*----------------------------------------------------------------------------------*/
106 int sciInitCurrentFigure( sciPointObj * mafigure )
107 {
108   sciCurrentFigure = mafigure ;
109   return 0 ;
110 }
111 /*----------------------------------------------------------------------------------*/
112 int sciSetCurrentFigure ( sciPointObj * mafigure )
113 {
114   if ( sciGetCurrentFigure() == mafigure )
115   {
116     /* nothing to do */
117     return 1 ;
118   }
119   return sciInitCurrentFigure( mafigure ) ;
120 }
121 /*----------------------------------------------------------------------------------*/
122 sciPointObj * sciGetCurrentObj( void )
123 {
124   return sciCurrentObject ;
125 }
126 /*----------------------------------------------------------------------------------*/
127 void sciSetCurrentObj( sciPointObj * pobj )
128 {
129   sciCurrentObject = pobj ;
130 }
131 /*----------------------------------------------------------------------------------*/
132 BOOL sciIsCurrentObject(sciPointObj * pobj)
133 {
134         return (pobj == sciGetCurrentObj());
135 }
136 /*----------------------------------------------------------------------------------*/
137 long sciGetCurrentHandle( void )
138 {
139   return sciGetHandle( sciGetCurrentObj() );
140 }
141 /*-----------------------------------------------------------------------------*/
142 sciPointObj * sciGetCurrentSubWin( void )
143 {
144   sciPointObj * currentFigure = sciGetCurrentFigure();
145   sciPointObj * currentSubwin = NULL;
146   int iNbChildren = 0;
147   int *piNbChildren = &iNbChildren;
148   char* selectedChild;
149
150   if ( currentFigure == NULL ) { return NULL ; }
151
152   getGraphicObjectProperty(currentFigure->UID, __GO_CHILDREN_COUNT__, jni_int, &piNbChildren);
153
154   if (iNbChildren == 0)
155   {
156     return NULL;
157   }
158
159   /* The figure's current selected child corresponds to the current subwindow */
160   getGraphicObjectProperty(currentFigure->UID, __GO_SELECTED_CHILD__, jni_string, &selectedChild);
161
162   currentSubwin = MALLOC(sizeof(sciPointObj));
163
164   currentSubwin->UID = selectedChild;
165   sciAddNewHandle(currentSubwin);
166
167   /*
168    * Former way to get the Figure's current selected Axes.
169    * To be deleted
170    */
171 #if 0
172   currentSubwin = sciGetFirstTypedSelectedSon( currentFigure, SCI_SUBWIN ) ;
173 #endif
174
175   return currentSubwin;
176 }
177 /*-----------------------------------------------------------------------------*/
178