aaca5dbc5fdff937b19e9043085fcb9565940e58
[scilab.git] / scilab / modules / gui / src / jni / LookAndFeelManager.cpp
1 #include "LookAndFeelManager.hxx"\r
2 /* Generated by GIWS (version 1.0) */\r
3 /*\r
4 \r
5 Copyright 2007 INRIA\r
6 \r
7 Author : Sylvestre Ledru\r
8 \r
9 This software is a computer program whose purpose is to hide the complexity\r
10 of accessing Java objects/methods from C++ code.\r
11 \r
12 This software is governed by the CeCILL-B license under French law and\r
13 abiding by the rules of distribution of free software.  You can  use, \r
14 modify and/ or redistribute the software under the terms of the CeCILL-B\r
15 license as circulated by CEA, CNRS and INRIA at the following URL\r
16 "http://www.cecill.info". \r
17 \r
18 As a counterpart to the access to the source code and  rights to copy,\r
19 modify and redistribute granted by the license, users are provided only\r
20 with a limited warranty  and the software's author,  the holder of the\r
21 economic rights,  and the successive licensors  have only  limited\r
22 liability. \r
23 \r
24 In this respect, the user's attention is drawn to the risks associated\r
25 with loading,  using,  modifying and/or developing or reproducing the\r
26 software by the user in light of its specific status of free software,\r
27 that may mean  that it is complicated to manipulate,  and  that  also\r
28 therefore means  that it is reserved for developers  and  experienced\r
29 professionals having in-depth computer knowledge. Users are therefore\r
30 encouraged to load and test the software's suitability as regards their\r
31 requirements in conditions enabling the security of their systems and/or \r
32 data to be ensured and,  more generally, to use and operate it in the \r
33 same conditions as regards security. \r
34 \r
35 The fact that you are presently reading this means that you have had\r
36 knowledge of the CeCILL-B license and that you accept its terms.\r
37 */\r
38 \r
39 namespace org_scilab_modules_gui_utils {\r
40 \r
41 // Returns the current env\r
42 \r
43 JNIEnv * LookAndFeelManager::getCurrentEnv() {\r
44 JNIEnv * curEnv = NULL;\r
45 this->jvm->AttachCurrentThread((void **) &curEnv, NULL);\r
46 return curEnv;\r
47 }\r
48 // Destructor\r
49 \r
50 LookAndFeelManager::~LookAndFeelManager() {\r
51 JNIEnv * curEnv = NULL;\r
52 this->jvm->AttachCurrentThread((void **) &curEnv, NULL);\r
53 \r
54 curEnv->DeleteGlobalRef(this->instance);\r
55 curEnv->DeleteGlobalRef(this->instanceClass);\r
56 }\r
57 // Constructors\r
58 \r
59 LookAndFeelManager::LookAndFeelManager(JavaVM * jvm_) {\r
60 jmethodID constructObject = NULL ;\r
61 jobject localInstance ;\r
62 jclass localClass ;\r
63 const std::string construct="<init>";\r
64 const std::string param="()V";\r
65 jvm=jvm_;\r
66 \r
67 JNIEnv * curEnv = getCurrentEnv();\r
68 \r
69 localClass = curEnv->FindClass( this->className().c_str() ) ;\r
70 if (localClass == NULL) {\r
71 std::cerr << "Could not get the Class " << this->className() <<  std::endl;\r
72 exit(EXIT_FAILURE);\r
73 }\r
74 \r
75 this->instanceClass = (jclass) curEnv->NewGlobalRef(localClass) ;\r
76 if (this->instanceClass == NULL) {\r
77 std::cerr << "Could not create a Global Ref of " << this->className() <<  std::endl;\r
78 exit(EXIT_FAILURE);\r
79 }\r
80 \r
81 /* localClass is not needed anymore */\r
82 curEnv->DeleteLocalRef(localClass);\r
83 \r
84 constructObject = curEnv->GetMethodID( this->instanceClass, construct.c_str() , param.c_str() ) ;\r
85 if(constructObject == NULL){\r
86 std::cerr << "Could not retrieve the constructor of the class " << this->className() << " with the profile : " << construct << param << std::endl;\r
87 exit(EXIT_FAILURE);\r
88 }\r
89 \r
90 localInstance = curEnv->NewObject( this->instanceClass, constructObject ) ;\r
91 if(localInstance == NULL){\r
92 std::cerr << "Could not instantiate the object " << this->className() << " with the constructor : " << construct << param << std::endl;\r
93 exit(EXIT_FAILURE);\r
94 }\r
95  \r
96 this->instance = curEnv->NewGlobalRef(localInstance) ;\r
97 if(this->instance == NULL){\r
98 std::cerr << "Could not create a new global ref of " << this->className() << std::endl;\r
99 exit(EXIT_FAILURE);\r
100 }\r
101 /* localInstance not needed anymore */\r
102 curEnv->DeleteLocalRef(localInstance);\r
103 \r
104                 /* Methods ID set to NULL */\r
105 jbooleanisSupportedLookAndFeeljstringID=NULL; \r
106 jstringgetCurrentLookAndFeelID=NULL; \r
107 jbooleansetLookAndFeeljstringID=NULL; \r
108 jbooleansetSystemLookAndFeelID=NULL; \r
109 jobjectArraygetInstalledLookAndFeelsID=NULL; \r
110 jintnumbersOfInstalledLookAndFeelsID=NULL; \r
111 \r
112 \r
113 }\r
114 \r
115 LookAndFeelManager::LookAndFeelManager(JavaVM * jvm_, jobject JObj) {\r
116         jvm=jvm_;\r
117 \r
118         JNIEnv * curEnv = getCurrentEnv();\r
119 \r
120 jclass localClass = curEnv->GetObjectClass(JObj);\r
121         this->instanceClass = (jclass) curEnv->NewGlobalRef(localClass);\r
122         curEnv->DeleteLocalRef(localClass);\r
123 \r
124         if (this->instanceClass == NULL) {\r
125                std::cerr << "Could not create a Global Ref of " << this->instanceClass <<  std::endl;\r
126                exit(EXIT_FAILURE);\r
127    \r
128         }\r
129 \r
130         this->instance = curEnv->NewGlobalRef(JObj) ;\r
131         if(this->instance == NULL){\r
132                std::cerr << "Could not create a new global ref of " << this->instanceClass << std::endl;\r
133                exit(EXIT_FAILURE);\r
134         }\r
135         /* Methods ID set to NULL */\r
136         jbooleanisSupportedLookAndFeeljstringID=NULL; \r
137 jstringgetCurrentLookAndFeelID=NULL; \r
138 jbooleansetLookAndFeeljstringID=NULL; \r
139 jbooleansetSystemLookAndFeelID=NULL; \r
140 jobjectArraygetInstalledLookAndFeelsID=NULL; \r
141 jintnumbersOfInstalledLookAndFeelsID=NULL; \r
142 \r
143 \r
144 }\r
145 \r
146 // Generic methods\r
147 \r
148 \r
149 void LookAndFeelManager::synchronize() {\r
150 if (getCurrentEnv()->MonitorEnter(instance) != JNI_OK) {\r
151 std::cerr << "Fail to enter monitor." << std::endl;\r
152 exit(EXIT_FAILURE);\r
153 }\r
154 }\r
155 \r
156 \r
157 void LookAndFeelManager::endSynchronize() {\r
158 if ( getCurrentEnv()->MonitorExit(instance) != JNI_OK) {\r
159 std::cerr << "Fail to exit monitor." << std::endl;\r
160 exit(EXIT_FAILURE);\r
161 }\r
162 }\r
163 \r
164 // Method(s)\r
165 \r
166 bool LookAndFeelManager::isSupportedLookAndFeel (char * lookandfeel){\r
167 \r
168 JNIEnv * curEnv = getCurrentEnv();\r
169 \r
170 if (jbooleanisSupportedLookAndFeeljstringID==NULL) { /* Use the cache Luke */ jbooleanisSupportedLookAndFeeljstringID = curEnv->GetMethodID(this->instanceClass, "isSupportedLookAndFeel", "(Ljava/lang/String;)Z" ) ;\r
171 if (jbooleanisSupportedLookAndFeeljstringID == NULL) {\r
172 std::cerr << "Could not access to the method " << "isSupportedLookAndFeel" << std::endl;\r
173 exit(EXIT_FAILURE);\r
174 }\r
175 }\r
176 jstring lookandfeel_ = curEnv->NewStringUTF( lookandfeel );\r
177 \r
178                         jboolean res =  (jboolean) curEnv->CallBooleanMethod( this->instance, jbooleanisSupportedLookAndFeeljstringID ,lookandfeel_);\r
179                         \r
180 if (curEnv->ExceptionOccurred()) {\r
181 curEnv->ExceptionDescribe() ;\r
182 }\r
183 \r
184                         \r
185 return (res == JNI_TRUE);\r
186 \r
187 }\r
188 \r
189 char * LookAndFeelManager::getCurrentLookAndFeel (){\r
190 \r
191 JNIEnv * curEnv = getCurrentEnv();\r
192 \r
193 if (jstringgetCurrentLookAndFeelID==NULL) { /* Use the cache Luke */ jstringgetCurrentLookAndFeelID = curEnv->GetMethodID(this->instanceClass, "getCurrentLookAndFeel", "()Ljava/lang/String;" ) ;\r
194 if (jstringgetCurrentLookAndFeelID == NULL) {\r
195 std::cerr << "Could not access to the method " << "getCurrentLookAndFeel" << std::endl;\r
196 exit(EXIT_FAILURE);\r
197 }\r
198 }\r
199                         jstring res =  (jstring) curEnv->CallObjectMethod( this->instance, jstringgetCurrentLookAndFeelID );\r
200                         \r
201 if (curEnv->ExceptionOccurred()) {\r
202 curEnv->ExceptionDescribe() ;\r
203 }\r
204 \r
205                         \r
206 const char *tempString = curEnv->GetStringUTFChars(res, 0);\r
207 char * myStringBuffer= (char*)malloc (strlen(tempString)*sizeof(char)+1);\r
208 strcpy(myStringBuffer, tempString);\r
209 curEnv->ReleaseStringUTFChars(res, tempString);\r
210 \r
211 return myStringBuffer;\r
212 \r
213 }\r
214 \r
215 bool LookAndFeelManager::setLookAndFeel (char * lookandfeel){\r
216 \r
217 JNIEnv * curEnv = getCurrentEnv();\r
218 \r
219 if (jbooleansetLookAndFeeljstringID==NULL) { /* Use the cache Luke */ jbooleansetLookAndFeeljstringID = curEnv->GetMethodID(this->instanceClass, "setLookAndFeel", "(Ljava/lang/String;)Z" ) ;\r
220 if (jbooleansetLookAndFeeljstringID == NULL) {\r
221 std::cerr << "Could not access to the method " << "setLookAndFeel" << std::endl;\r
222 exit(EXIT_FAILURE);\r
223 }\r
224 }\r
225 jstring lookandfeel_ = curEnv->NewStringUTF( lookandfeel );\r
226 \r
227                         jboolean res =  (jboolean) curEnv->CallBooleanMethod( this->instance, jbooleansetLookAndFeeljstringID ,lookandfeel_);\r
228                         \r
229 if (curEnv->ExceptionOccurred()) {\r
230 curEnv->ExceptionDescribe() ;\r
231 }\r
232 \r
233                         \r
234 return (res == JNI_TRUE);\r
235 \r
236 }\r
237 \r
238 bool LookAndFeelManager::setSystemLookAndFeel (){\r
239 \r
240 JNIEnv * curEnv = getCurrentEnv();\r
241 \r
242 if (jbooleansetSystemLookAndFeelID==NULL) { /* Use the cache Luke */ jbooleansetSystemLookAndFeelID = curEnv->GetMethodID(this->instanceClass, "setSystemLookAndFeel", "()Z" ) ;\r
243 if (jbooleansetSystemLookAndFeelID == NULL) {\r
244 std::cerr << "Could not access to the method " << "setSystemLookAndFeel" << std::endl;\r
245 exit(EXIT_FAILURE);\r
246 }\r
247 }\r
248                         jboolean res =  (jboolean) curEnv->CallBooleanMethod( this->instance, jbooleansetSystemLookAndFeelID );\r
249                         \r
250 if (curEnv->ExceptionOccurred()) {\r
251 curEnv->ExceptionDescribe() ;\r
252 }\r
253 \r
254                         \r
255 return (res == JNI_TRUE);\r
256 \r
257 }\r
258 \r
259 char ** LookAndFeelManager::getInstalledLookAndFeels (){\r
260 \r
261 JNIEnv * curEnv = getCurrentEnv();\r
262 \r
263 if (jobjectArraygetInstalledLookAndFeelsID==NULL) { /* Use the cache Luke */ jobjectArraygetInstalledLookAndFeelsID = curEnv->GetMethodID(this->instanceClass, "getInstalledLookAndFeels", "()[Ljava/lang/String;" ) ;\r
264 if (jobjectArraygetInstalledLookAndFeelsID == NULL) {\r
265 std::cerr << "Could not access to the method " << "getInstalledLookAndFeels" << std::endl;\r
266 exit(EXIT_FAILURE);\r
267 }\r
268 }\r
269                         jobjectArray res =  (jobjectArray) curEnv->CallObjectMethod( this->instance, jobjectArraygetInstalledLookAndFeelsID );\r
270                         \r
271 if (curEnv->ExceptionOccurred()) {\r
272 curEnv->ExceptionDescribe() ;\r
273 }\r
274 \r
275                         \r
276 jsize len = curEnv->GetArrayLength(res);\r
277 char **arrayOfString;\r
278                         arrayOfString= (char**)malloc ((len+1)*sizeof(char*));\r
279 for (jsize i = 0; i < len; i++){\r
280 jstring resString = (jstring)curEnv->GetObjectArrayElement(res, i);\r
281 const char *tempString = curEnv->GetStringUTFChars(resString, 0);\r
282 arrayOfString[i]= (char*)malloc ((strlen(tempString)+1)*sizeof(char));\r
283 strcpy(arrayOfString[i], tempString);\r
284 curEnv->ReleaseStringUTFChars(resString, tempString);\r
285 }\r
286 \r
287 return arrayOfString;\r
288 \r
289 }\r
290 \r
291 long LookAndFeelManager::numbersOfInstalledLookAndFeels (){\r
292 \r
293 JNIEnv * curEnv = getCurrentEnv();\r
294 \r
295 if (jintnumbersOfInstalledLookAndFeelsID==NULL) { /* Use the cache Luke */ jintnumbersOfInstalledLookAndFeelsID = curEnv->GetMethodID(this->instanceClass, "numbersOfInstalledLookAndFeels", "()I" ) ;\r
296 if (jintnumbersOfInstalledLookAndFeelsID == NULL) {\r
297 std::cerr << "Could not access to the method " << "numbersOfInstalledLookAndFeels" << std::endl;\r
298 exit(EXIT_FAILURE);\r
299 }\r
300 }\r
301                         jint res =  (jint) curEnv->CallIntMethod( this->instance, jintnumbersOfInstalledLookAndFeelsID );\r
302                         \r
303 if (curEnv->ExceptionOccurred()) {\r
304 curEnv->ExceptionDescribe() ;\r
305 }\r
306 \r
307                         \r
308 return res;\r
309 \r
310 }\r
311 \r
312 }\r