Initial step :
[scilab.git] / scilab / modules / graphic_objects / src / cpp / ScilabView.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include <iostream>
14 #include <map>
15 #include <cstring>
16
17 #include "ScilabView.hxx"
18 #include "CallGraphicController.hxx"
19
20 extern "C"
21 {
22 #include "getGraphicObjectProperty.h"
23 #include "graphicObjectProperties.h"
24 #include "getScilabJavaVM.h"
25 }
26
27 /**
28  * C Wrapping functions
29  * \{
30  */
31 void ScilabNativeView__createObject(char* pstId)
32 {
33     ScilabView::createObject(pstId);
34 }
35
36 void ScilabNativeView__deleteObject(char* pstId)
37 {
38     ScilabView::deleteObject(pstId);
39 }
40
41 void ScilabNativeView__updateObject(char* pstId, char* pstProperty)
42 {
43     ScilabView::updateObject(pstId, pstProperty);
44 }
45
46 /**
47  * \}
48  */
49
50 bool ScilabView::isEmptyFigureList()
51 {
52     return m_figureList.empty();
53 }
54
55 char *ScilabView::getFigureFromIndex(int figNum)
56 {
57     __figureList_iterator it;
58
59     for(it = m_figureList.begin() ; it != m_figureList.end() ; ++it)
60     {
61         if (it->second == figNum)
62         {
63             return it->first;
64         }
65     }
66     return NULL;
67 }
68
69 bool ScilabView::existsFigureId(int id)
70 {
71     __figureList_iterator it;
72
73     for(it = m_figureList.begin() ; it != m_figureList.end() ; ++it)
74     {
75         if (it->second == id)
76         {
77             return true;
78         }
79     }
80     return false;
81 }
82
83 void ScilabView::getFiguresId(int ids[])
84 {
85     __figureList_iterator it;
86     int i = 0;
87
88     for(it = m_figureList.begin() ; it != m_figureList.end() ; ++it, ++i)
89     {
90         //std::cerr << "[ScilabView] DEBUG " << it->first << " <-> " << it->second << std::endl;
91         ids[i] = it->second;
92     }
93 }
94
95 int ScilabView::getNbFigure(void)
96 {
97     return m_figureList.size();
98 }
99
100 void ScilabView::createObject(char* pstId)
101 {
102     std::cerr << "[ScilabView] ++ createObject UID=" << pstId << std::endl;
103     char *pstType;
104
105     getGraphicObjectProperty(pstId, __GO_TYPE__, jni_string, (void**) &pstType);
106     if(pstType != NULL && strcmp(pstType, __GO_FIGURE__) == 0)
107     {
108         m_figureList[strdup(pstId)] = -1;
109         setCurrentFigure(strdup(pstId));
110     }
111
112     // Register objct handle.
113     getObjectHandle(pstId);
114 }
115
116 void ScilabView::deleteObject(char* pstId)
117 {
118     //std::cerr << "[ScilabView] -- deleteObject UID=" << pstId << std::endl;
119     char *pstType;
120
121     getGraphicObjectProperty(pstId, __GO_TYPE__, jni_string, (void**) &pstType);
122     if(pstType != NULL && strcmp(pstType, __GO_FIGURE__) == 0)
123     {
124         m_figureList.erase(pstId);
125     }
126 }
127
128 void ScilabView::updateObject(char* pstId, char* pstProperty)
129 {
130     //std::cerr << "[ScilabView] == updateObject UID=" << pstId << " PROPERTY=" << pstProperty << std::endl;
131
132     /*
133     ** Take care of update if the value update is ID and object type is a Figure I manage.
134     */
135     if (strcmp(pstProperty, __GO_ID__) == 0
136         && m_figureList.find(pstId) != m_figureList.end())
137     {
138         int iNewId = 0;
139         int *piNewId = &iNewId;
140
141         getGraphicObjectProperty(pstId, __GO_ID__, jni_int, (void**) &piNewId);
142
143         m_figureList[strdup(pstId)] = iNewId;
144         //std::cerr << "### [ScilabView] updateMap UID=" << pstId << " id=" << iNewId << std::endl;
145     }
146 }
147
148 /*
149 ** Register ScilabView to Controller.
150 ** Must be done after Graphics models are created.
151 */
152 void ScilabView::registerToController(void)
153 {
154     org_scilab_modules_graphic_objects::CallGraphicController::registerScilabView(getScilabJavaVM());
155 }
156
157 /*
158 ** Set Current Figure UID
159 */
160 void ScilabView::setCurrentFigure(char* UID)
161 {
162     m_currentFigure = strdup(UID);
163 }
164
165 /*
166 ** Get Current Figure UID
167 */
168 char *ScilabView::getCurrentFigure()
169 {
170     std::cerr << "[ScilaView] currentFigure = " << (m_currentFigure == NULL ? "NULL !!" : m_currentFigure) << std::endl;
171     return m_currentFigure;
172 }
173
174 /*
175 ** Set Current Object UID
176 */
177 void ScilabView::setCurrentObject(char* UID)
178 {
179     m_currentObject = strdup(UID);
180 }
181
182 /*
183 ** Get Current Figure UID
184 */
185 char *ScilabView::getCurrentObject()
186 {
187     std::cerr << "[ScilaView] currentObject = " << m_currentObject << std::endl;
188     return m_currentObject;
189 }
190
191 /*
192 ** Set Current SubWin UID
193 */
194 void ScilabView::setCurrentSubWin(char* UID)
195 {
196     m_currentSubWin = strdup(UID);
197 }
198
199 /*
200 ** Get Current Figure UID
201 */
202 char *ScilabView::getCurrentSubWin()
203 {
204     std::cerr << "[ScilaView] currentSubWin = " << m_currentSubWin << std::endl;
205     return m_currentSubWin;
206 }
207
208 /*
209 ** Scilab only can store long as handle
210 */
211 long ScilabView::getObjectHandle(char *UID)
212 {
213     if (UID != NULL)
214     {
215         std::cerr << "UID = " << UID << std::endl;
216     }
217     else
218     {
219         std::cerr << "UID is null :-S" << std::endl;
220     }
221     __handleList_iterator it2;
222     std::cerr << "[DEBUG] +++ handleMap +++" << std::endl;
223     for (it2 = m_handleList.begin() ; it2 != m_handleList.end() ; ++it2)
224     {
225         std::cerr << "UID " << it2->first << " <-> handle " << it2->second << std::endl;
226     }
227     std::cerr << "[DEBUG] +++ handleMap +++" << std::endl;
228
229     __handleList_iterator it = m_handleList.find(UID);
230
231     if (it != m_handleList.end())
232     {
233         return it->second;
234     }
235
236     // increase maximum value
237     // register new handle and return it.
238     m_topHandleValue++;
239     m_handleList[strdup(UID)] = m_topHandleValue;
240
241     return m_topHandleValue;
242 }
243
244 char *ScilabView::getObjectFromHandle(long handle)
245 {
246    __handleList_iterator it;
247    for (it = m_handleList.begin() ; it != m_handleList.end() ; ++it)
248    {
249        if (it->second == handle)
250        {
251            return it->first;
252        }
253    }
254    return NULL;
255 }
256
257 void ScilabView::swapHandles(long firstHandle, long secondHandle)
258 {
259     char *firstUID = getObjectFromHandle(firstHandle);
260     char *secondUID = getObjectFromHandle(secondHandle);
261
262     m_handleList[firstUID] = secondHandle;
263     m_handleList[secondUID] = firstHandle;
264 }
265
266 char *ScilabView::getFigureModel(void)
267 {
268     std::cerr << "[ScilabView] getFigureModel = " << (m_figureModel == NULL ? "!! NULL !!" : m_figureModel) << std::endl;
269     return m_figureModel;
270 }
271
272 void  ScilabView::setFigureModel(char *UID)
273 {
274     m_figureModel = strdup(UID);
275 }
276
277 char *ScilabView::getAxesModel(void)
278 {
279     std::cerr << "[ScilabView] getAxesModel = " << (m_axesModel == NULL ? "!! NULL !!" : m_axesModel) << std::endl;
280     return m_axesModel;
281 }
282
283 void  ScilabView::setAxesModel(char *UID)
284 {
285     m_axesModel = strdup(UID);
286 }
287
288
289
290 /*
291 ** Allocate static class variable.
292 */
293 ScilabView::__figureList    ScilabView::m_figureList = *new __figureList();
294 ScilabView::__handleList    ScilabView::m_handleList = *new __handleList();
295 long                        ScilabView::m_topHandleValue = 0;
296 char *                      ScilabView::m_currentFigure = NULL;
297 char *                      ScilabView::m_currentObject = NULL;
298 char *                      ScilabView::m_currentSubWin = NULL;
299 char *                      ScilabView::m_figureModel = NULL;
300 char *                      ScilabView::m_axesModel = NULL;