summaryrefslogtreecommitdiffstats
path: root/qtjava/javalib/qtjava/QtSupport.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit90825e2392b2d70e43c7a25b8a3752299a933894 (patch)
treee33aa27f02b74604afbfd0ea4f1cfca8833d882a /qtjava/javalib/qtjava/QtSupport.cpp
downloadtdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.tar.gz
tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'qtjava/javalib/qtjava/QtSupport.cpp')
-rw-r--r--qtjava/javalib/qtjava/QtSupport.cpp1825
1 files changed, 1825 insertions, 0 deletions
diff --git a/qtjava/javalib/qtjava/QtSupport.cpp b/qtjava/javalib/qtjava/QtSupport.cpp
new file mode 100644
index 00000000..bcbd5084
--- /dev/null
+++ b/qtjava/javalib/qtjava/QtSupport.cpp
@@ -0,0 +1,1825 @@
+/***************************************************************************
+ QtSupport.cpp - description
+ -------------------
+ begin : Fri Oct 20 13:46:55 2000
+ copyright : (C) 2000 Lost Highway Ltd
+ email : Richard_Dale@tipitina.demon.co.uk
+ generated by : duke@tipitina on Fri Oct 20 13:46:55 2000, using kdoc $.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <qmetaobject.h>
+
+#include <qtjava/QtSupport.h>
+#include <qtjava/QObject.h>
+#include <qtjava/JavaSlot.h>
+
+static JavaVM * _jvm;
+
+
+jmethodID QtSupport::MID_String_init;
+jmethodID QtSupport::MID_String_getBytes;
+bool QtSupport::_bigEndianUnicode;
+
+void
+QtSupport::registerJVM(JNIEnv * env)
+{
+ jstring testString;
+ const jchar * _jchar_str;
+
+ env->GetJavaVM((JavaVM **) &_jvm);
+
+ // Cache commonly used method id's and classes.
+ MID_String_init = env->GetMethodID(env->FindClass("java/lang/String"), "<init>", "([B)V");
+ MID_String_getBytes = env->GetMethodID(env->FindClass("java/lang/String"), "getBytes", "()[B");
+
+ // Test for the endianess of the unicode string returned by GetStringChars()
+ testString = env->NewStringUTF("A");
+ _jchar_str = env->GetStringChars(testString, 0);
+ QString temp((QChar*)_jchar_str, env->GetStringLength(testString));
+ env->ReleaseStringChars(testString, _jchar_str);
+ _bigEndianUnicode = strcmp((const char *) temp, "A") == 0;
+ env->DeleteLocalRef(testString);
+
+ return;
+}
+
+JNIEnv *
+QtSupport::GetEnv()
+{
+ JNIEnv * env;
+
+ _jvm->GetEnv((void **) &env, JNI_VERSION_1_2);
+ return env;
+}
+
+const char *
+QtSupport::eventTypeToEventClassName(QEvent::Type eventType)
+{
+ switch (eventType) {
+ case QEvent::ChildInserted:
+ case QEvent::ChildRemoved:
+ return "org.kde.qt.QChildEvent";
+ case QEvent::Close:
+ return "org.kde.qt.QCloseEvent";
+ case QEvent::ContextMenu:
+ return "org.kde.qt.QContextMenuEvent";
+ case QEvent::User:
+ return "org.kde.qt.QCustomEvent";
+ case QEvent::DragEnter:
+ return "org.kde.qt.QDragEnterEvent";
+ case QEvent::DragLeave:
+ return "org.kde.qt.QDragLeaveEvent";
+ case QEvent::DragMove:
+ return "org.kde.qt.QDragMoveEvent";
+ case QEvent::DragResponse:
+ return "org.kde.qt.QDragResponseEvent";
+ case QEvent::Drop:
+ return "org.kde.qt.QDropEvent";
+ case QEvent::FocusIn:
+ case QEvent::FocusOut:
+ return "org.kde.qt.QFocusEvent";
+ case QEvent::Hide:
+ return "org.kde.qt.QHideEvent";
+ case QEvent::KeyPress:
+ case QEvent::KeyRelease:
+ return "org.kde.qt.QKeyEvent";
+ case QEvent::IMStart:
+ case QEvent::IMCompose:
+ case QEvent::IMEnd:
+ return "org.kde.qt.QIMEvent";
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseButtonRelease:
+ case QEvent::MouseButtonDblClick:
+ case QEvent::MouseMove:
+ return "org.kde.qt.QMouseEvent";
+ case QEvent::Move:
+ return "org.kde.qt.QMoveEvent";
+ case QEvent::Paint:
+ return "org.kde.qt.QPaintEvent";
+ case QEvent::Resize:
+ return "org.kde.qt.QResizeEvent";
+ case QEvent::Show:
+ return "org.kde.qt.QShowEvent";
+// case QEvent::Tablet:
+// return "org.kde.qt.QTabletEvent";
+ case QEvent::Timer:
+ return "org.kde.qt.QTimerEvent";
+ case QEvent::Wheel:
+ return "org.kde.qt.QWheelEvent";
+ default:
+ return "org.kde.qt.QEvent";
+ }
+}
+
+bool
+QtSupport::eventFilterDelegate(QObject * object, const char * objectType, QObject * filteredObject, QEvent * event)
+{
+ JNIEnv * env;
+ jclass cls;
+ jstring objectTypeString;
+ jstring eventNameString;
+ jstring eventMethodString;
+ jmethodID mid;
+
+ (void) objectType; // Not used at present, the event's Qt rtti is used instead
+
+ env = QtSupport::GetEnv();
+ if (env == 0) {
+ return FALSE;
+ }
+
+ cls = env->FindClass("org/kde/qt/Invocation");
+ if (cls == 0) {
+ return FALSE;
+ }
+
+ mid = env->GetStaticMethodID(cls, "invoke", "(JJLjava/lang/String;JLjava/lang/String;Ljava/lang/String;)Z");
+ if (mid == 0) {
+ return FALSE;
+ }
+
+ objectTypeString = env->NewStringUTF("org.kde.qt.QObject");
+ eventNameString = env->NewStringUTF(QtSupport::eventTypeToEventClassName(event->type()));
+ eventMethodString = env->NewStringUTF("eventFilter");
+
+ bool result = (bool) env->CallStaticBooleanMethod( cls, mid,
+ (jlong) object,
+ (jlong) filteredObject,
+ objectTypeString,
+ (jlong) event,
+ eventNameString,
+ eventMethodString );
+
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(objectTypeString);
+ env->DeleteLocalRef(eventNameString);
+ env->DeleteLocalRef(eventMethodString);
+ return result;
+}
+
+bool
+QtSupport::eventDelegate(QObject * object, const char * eventType, void * event, const char * eventName)
+{
+ JNIEnv * env;
+ jclass cls;
+ jstring eventNameString;
+ jstring eventTypeString;
+ jmethodID mid;
+
+ env = QtSupport::GetEnv();
+ if (env == 0) {
+ return FALSE;
+ }
+
+ cls = env->FindClass("org/kde/qt/Invocation");
+ if (cls == 0) {
+ return FALSE;
+ }
+
+ mid = env->GetStaticMethodID(cls, "invoke", "(JJLjava/lang/String;Ljava/lang/String;)Z");
+ if (mid == 0) {
+ return FALSE;
+ }
+
+ eventNameString = env->NewStringUTF(eventName);
+ eventTypeString = env->NewStringUTF(eventType);
+
+ bool result = (bool) env->CallStaticBooleanMethod( cls, mid,
+ (jlong) object,
+ (jlong) event,
+ eventNameString,
+ eventTypeString );
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(eventNameString);
+ env->DeleteLocalRef(eventTypeString);
+ return result;
+}
+
+bool
+QtSupport::voidDelegate(void * object, const char * className, const char * methodName)
+{
+ JNIEnv * env;
+ jclass cls;
+ jstring classNameString;
+ jstring methodNameString;
+ jmethodID mid;
+ env = QtSupport::GetEnv();
+ if (env == 0) {
+ return FALSE;
+ }
+
+ cls = env->FindClass("org/kde/qt/Invocation");
+ if (cls == 0) {
+ return FALSE;
+ }
+
+ mid = env->GetStaticMethodID(cls, "invoke", "(JLjava/lang/String;Ljava/lang/String;)Z");
+ if (mid == 0) {
+ return FALSE;
+ }
+
+ classNameString = env->NewStringUTF(className);
+ methodNameString = env->NewStringUTF(methodName);
+ bool result = (bool) env->CallStaticBooleanMethod( cls, mid,
+ (jlong) object,
+ classNameString,
+ methodNameString );
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(methodNameString);
+ env->DeleteLocalRef(classNameString);
+ return result;
+}
+
+bool
+QtSupport::booleanDelegate(QObject * object, const char * methodName)
+{
+ JNIEnv * env;
+ jclass cls;
+ jstring methodNameString;
+ jmethodID mid;
+
+ env = QtSupport::GetEnv();
+ if (env == 0) {
+ return FALSE;
+ }
+
+ cls = env->FindClass("org/kde/qt/Invocation");
+ if (cls == 0) {
+ return FALSE;
+ }
+
+ mid = env->GetStaticMethodID(cls, "booleanInvoke", "(JLjava/lang/String;)Z");
+ if (mid == 0) {
+ return FALSE;
+ }
+
+ methodNameString = env->NewStringUTF(methodName);
+ bool result = (bool) env->CallStaticBooleanMethod( cls, mid,
+ (jlong) object,
+ methodNameString );
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(methodNameString);
+ return result;
+}
+
+int
+QtSupport::validateDelegate(QValidator * object, QString & input, int & pos)
+{
+ JNIEnv * env;
+ jclass cls;
+ jmethodID mid;
+ jobject validator;
+ jstring inputString;
+ QString * inputPtr;
+ jstring resultString;
+ jobject buffer;
+ jmethodID bufferConstructor;
+ jclass bufferClass;
+ jintArray positionArray;
+ int result;
+ jmethodID bufferToString;
+
+ env = QtSupport::GetEnv();
+ env->PushLocalFrame(10);
+
+ // Allocate a java StringBuffer to hold the input string
+ inputString = QtSupport::fromQString(env, (QString *) &input);
+ bufferClass = env->FindClass("java/lang/StringBuffer");
+ bufferConstructor = env->GetMethodID(bufferClass, "<init>", "(Ljava/lang/String;)V");
+ if (bufferConstructor == 0) {
+ return 0;
+ }
+ buffer = env->NewObject(bufferClass, bufferConstructor, inputString);
+
+ // Get the cursor position and convert to type 'int[]'
+ positionArray = QtSupport::fromIntPtr(env, &pos);
+
+ // Obtain the validate() method id, and call the method
+ validator = (jobject) QtSupport::objectForQtKey(env, object, "org.kde.qt.QValidator");
+ cls = env->GetObjectClass(validator);
+ if (cls == 0) {
+ return 0;
+ }
+
+ mid = env->GetMethodID(cls, "validate", "(Ljava/lang/StringBuffer;[I)I");
+ if (mid == 0) {
+ return 0;
+ }
+ result = (int) env->CallIntMethod(validator, mid, buffer, positionArray);
+
+ // Copy the java result string back into the 'input' QString
+ bufferToString = env->GetMethodID(bufferClass, "toString", "()Ljava/lang/String;");
+ if (bufferToString == 0) {
+ env->PopLocalFrame(0);
+ return 0;
+ }
+ resultString = (jstring) env->CallObjectMethod(buffer, bufferToString);
+ inputPtr = &input;
+ QtSupport::toQString(env, resultString, &inputPtr);
+
+ pos = *(QtSupport::toIntPtr(env, positionArray));
+ env->PopLocalFrame(0);
+
+ return result;
+}
+
+void
+QtSupport::fixupDelegate(QValidator * object, QString & input)
+{
+ JNIEnv * env;
+ jclass cls;
+ jmethodID mid;
+ jobject fixer;
+ jstring inputString;
+ QString * inputPtr;
+ jstring resultString;
+ jobject buffer;
+ jmethodID bufferConstructor;
+ jclass bufferClass;
+ jmethodID bufferToString;
+
+ env = QtSupport::GetEnv();
+ env->PushLocalFrame(10);
+
+ // Allocate a java StringBuffer to hold the input string
+ inputString = QtSupport::fromQString(env, (QString *) &input);
+ bufferClass = env->FindClass("java/lang/StringBuffer");
+ bufferConstructor = env->GetMethodID(bufferClass, "<init>", "(Ljava/lang/String;)V");
+ if (bufferConstructor == 0) {
+ return;
+ }
+ buffer = env->NewObject(bufferClass, bufferConstructor, inputString);
+
+ // Obtain the fixup() method id and call the method
+ fixer = (jobject) QtSupport::objectForQtKey(env, object, "org.kde.qt.QValidator");
+ cls = env->GetObjectClass(fixer);
+ if (cls == 0) {
+ return;
+ }
+ mid = env->GetMethodID(cls, "fixup", "(Ljava/lang/StringBuffer;)V");
+ if (mid == 0) {
+ return;
+ }
+ env->CallVoidMethod(fixer, mid, buffer);
+
+ // Copy the java result string back into the 'input' QString
+ bufferToString = env->GetMethodID(bufferClass, "toString", "()Ljava/lang/String;");
+ if (bufferToString == 0) {
+ env->PopLocalFrame(0);
+ return;
+ }
+ resultString = (jstring) env->CallObjectMethod(buffer, bufferToString);
+ inputPtr = &input;
+ QtSupport::toQString(env, resultString, &inputPtr);
+ env->PopLocalFrame(0);
+
+ return;
+}
+
+bool
+QtSupport::allocatedInJavaWorld(JNIEnv * env, jobject obj)
+{
+ if (obj == 0) {
+ return FALSE;
+ }
+
+ jclass cls = env->GetObjectClass(obj);
+ bool result = (bool) env->GetBooleanField(obj, env->GetFieldID(cls, "_allocatedInJavaWorld", "Z"));
+ env->DeleteLocalRef(cls);
+ return result;
+}
+
+void
+QtSupport::setAllocatedInJavaWorld(JNIEnv * env, jobject obj, bool yn)
+{
+ jclass cls = env->GetObjectClass(obj);
+ env->SetBooleanField(obj, env->GetFieldID(cls, "_allocatedInJavaWorld", "Z"), (jboolean) yn);
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+void *
+QtSupport::getQt(JNIEnv * env, jobject obj)
+{
+ if (obj == 0) {
+ return 0;
+ }
+
+ jclass cls = env->GetObjectClass(obj);
+ void * result = (void *) env->GetLongField(obj, env->GetFieldID(cls, "_qt", "J"));
+ env->DeleteLocalRef(cls);
+ return result;
+}
+
+void
+QtSupport::setQt(JNIEnv * env, jobject obj, void * qt)
+{
+ jclass cls = env->GetObjectClass(obj);
+ env->SetLongField(obj, env->GetFieldID(cls, "_qt", "J"), (jlong) qt);
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+void
+QtSupport::setObjectForQtKey(JNIEnv * env, jobject obj, void * qt)
+{
+ jclass cls;
+ jmethodID mid;
+
+ cls = env->FindClass("org/kde/qt/qtjava");
+ if (cls == 0) {
+ return;
+ }
+
+ mid = env->GetStaticMethodID(cls, "setObjectForQtKey", "(Ljava/lang/Object;J)V");
+ if (mid == 0) {
+ return;
+ }
+
+ env->CallStaticVoidMethod(cls, mid, obj, (jlong) qt);
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+jobject
+QtSupport::objectForQtKey(JNIEnv * env, void * qt, const char * className, const bool allocatedInJavaWorld)
+{
+ jclass cls;
+ jmethodID mid;
+ jstring javaClassName;
+
+ if (qt == 0) {
+ return 0;
+ }
+
+ javaClassName = env->NewStringUTF(className);
+
+ cls = env->FindClass("org/kde/qt/qtjava");
+ if (cls == 0) {
+ return 0;
+ }
+
+ mid = env->GetStaticMethodID(cls, "objectForQtKey", "(JLjava/lang/String;Z)Ljava/lang/Object;");
+ if (mid == 0) {
+ return 0;
+ }
+
+ jobject result = env->CallStaticObjectMethod(cls, mid, (jlong) qt, javaClassName, (jboolean) allocatedInJavaWorld);
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(javaClassName);
+ return result;
+}
+
+void
+QtSupport::qtKeyDeleted(void * qt)
+{
+ JNIEnv * env;
+ jclass cls;
+ jmethodID mid;
+
+ env = QtSupport::GetEnv();
+ if (env == 0) {
+ return;
+ }
+
+ cls = env->FindClass("org/kde/qt/qtjava");
+ if (cls == 0) {
+ return;
+ }
+
+ mid = env->GetStaticMethodID(cls, "qtKeyDeleted", "(J)V");
+ if (mid == 0) {
+ return;
+ }
+
+ env->CallStaticVoidMethod(cls, mid, (jlong) qt);
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+jboolean
+QtSupport::connect(JNIEnv * env, jobject sender, jstring signal, jobject receiver, jstring slot)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, slot);
+ QMetaObject * smeta = ((QObject *) QtSupport::getQt(env, sender))->metaObject();
+ QString qtSignalName(javaSlot->javaToQtSignalName(env, signal, smeta));
+
+ // Attempt to connect from the signal on the underlying C++ object first,
+ // otherwise assume that the connection is for a Java signal.
+ if (!qtSignalName.isEmpty()) {
+ QMetaObject * smetaTarget = ((QObject *) QtSupport::getQt(env, receiver))->metaObject();
+ QString qtTargetSignalName(javaSlot->javaToQtSignalName(env, slot, smetaTarget));
+
+ if (!qtTargetSignalName.isEmpty()) {
+ // The sender is a C++ signal, and the target is also a C++ signal
+ return (jboolean) QObject::connect( (QObject*) QtSupport::getQt(env, sender),
+ (const char *) qtSignalName,
+ (QObject*) QtSupport::getQt(env, receiver),
+ (const char *) qtTargetSignalName );
+ } else {
+ // The sender is a C++ signal, and the target is a java slot
+ return (jboolean) QObject::connect( (QObject*) QtSupport::getQt(env, sender),
+ (const char *) qtSignalName,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, slot, qtSignalName) );
+ }
+ } else {
+ // The sender is a java signal, and the target is either a java slot or a java signal
+ // Java signals are always of type jobjectArray
+ return (jboolean) QObject::connect( QtSupport::signalForSender(env, QtSupport::getQt(env, sender), signal),
+ "2signalJava(jobjectArray)",
+ javaSlot,
+ "1invoke(jobjectArray)" );
+ }
+}
+
+jboolean
+QtSupport::disconnect(JNIEnv * env, jobject sender, jstring signal, jobject receiver, jstring slot)
+{
+ JavaSlot * javaSlot = QtSupport::slotForReceiver(env, receiver, slot);
+ QMetaObject * smeta = ((QObject *) QtSupport::getQt(env, sender))->metaObject();
+ QString qtSignalName(javaSlot->javaToQtSignalName(env, signal, smeta));
+
+ // Attempt to disconnect from the signal on the underlying C++ object first,
+ // otherwise assume that the connection is for a Java signal.
+ if (!qtSignalName.isEmpty()) {
+ QMetaObject * smetaTarget = ((QObject *) QtSupport::getQt(env, receiver))->metaObject();
+ QString qtTargetSignalName(javaSlot->javaToQtSignalName(env, slot, smetaTarget));
+
+ if (!qtTargetSignalName.isEmpty()) {
+ // The sender is a C++ signal, and the target is also a C++ signal
+ return (jboolean) QObject::disconnect( (QObject*) QtSupport::getQt(env, sender),
+ (const char *) qtSignalName,
+ (QObject*) QtSupport::getQt(env, receiver),
+ (const char *) qtTargetSignalName );
+ } else {
+ // The sender is a C++ signal, and the target is a java slot
+ return (jboolean) QObject::disconnect( (QObject*) QtSupport::getQt(env, sender),
+ (const char *) qtSignalName,
+ javaSlot,
+ javaSlot->javaToQtSlotName(env, slot, qtSignalName) );
+ }
+ } else {
+ // The sender is a java signal, and the target is either a java slot or a java signal
+ // Java signals are always of type jobjectArray
+ return (jboolean) QObject::disconnect( QtSupport::signalForSender(env, QtSupport::getQt(env, sender), signal),
+ "2signalJava(jobjectArray)",
+ javaSlot,
+ "1invoke(jobjectArray)" );
+ }
+}
+
+void
+QtSupport::emitJavaSignal(JNIEnv * env, jobject sender, jstring signal, jobjectArray args)
+{
+ JavaSignal * javaSignal = QtSupport::signalForSender(env, QtSupport::getQt(env, sender), signal);
+ javaSignal->emitArgs(args);
+}
+
+JavaSignal *
+QtSupport::signalForSender(JNIEnv * env, void * qt, jstring signal)
+{
+ jclass cls;
+ jmethodID mid;
+
+ cls = env->FindClass("org/kde/qt/qtjava");
+ mid = env->GetStaticMethodID(cls, "signalForSender", "(JLjava/lang/String;)J");
+ if (mid == 0) {
+ return 0;
+ }
+
+ JavaSignal * result = (JavaSignal *) env->CallStaticLongMethod(cls, mid, (jlong) qt, signal);
+ env->DeleteLocalRef(cls);
+ return result;
+}
+
+JavaSlot *
+QtSupport::slotForReceiver(JNIEnv * env, jobject receiver, jstring slot)
+{
+ jclass cls;
+ jmethodID mid;
+
+ cls = env->FindClass("org/kde/qt/qtjava");
+ mid = env->GetStaticMethodID(cls, "slotForReceiver", "(JLorg/kde/qt/QObject;Ljava/lang/String;)J");
+ if (mid == 0) {
+ return 0;
+ }
+
+ JavaSlot * result = (JavaSlot *) env->CallStaticLongMethod(cls, mid, (jlong) QtSupport::getQt(env, receiver), receiver, slot);
+ env->DeleteLocalRef(cls);
+ return result;
+}
+
+QPaintDevice *
+QtSupport::paintDevice(JNIEnv * env, jobject obj)
+{
+ jclass cls;
+ jmethodID mid;
+
+ cls = env->GetObjectClass(obj);
+ mid = env->GetMethodID(cls, "paintDevice", "()J");
+ if (mid == 0) {
+ return 0;
+ }
+
+ env->DeleteLocalRef(cls);
+ return (QPaintDevice *) env->CallLongMethod(obj, mid);
+}
+
+QMimeSource *
+QtSupport::mimeSource(JNIEnv * env, jobject obj)
+{
+ jclass cls;
+ jmethodID mid;
+
+ cls = env->GetObjectClass(obj);
+ mid = env->GetMethodID(cls, "mimeSource", "()J");
+ if (mid == 0) {
+ return 0;
+ }
+
+ env->DeleteLocalRef(cls);
+ return (QMimeSource *) env->CallLongMethod(obj, mid);
+}
+
+bool
+QtSupport::bigEndianUnicode()
+{
+ return _bigEndianUnicode;
+}
+
+bool *
+QtSupport::toBooleanPtr(JNIEnv * env, jbooleanArray obj)
+{
+ bool * result;
+ int length;
+
+ length = env->GetArrayLength(obj);
+ result = (bool *) calloc(length, sizeof(bool));
+ env->GetBooleanArrayRegion(obj, 0, length, (jboolean *) result);
+ return result;
+}
+
+int *
+QtSupport::toIntPtr(JNIEnv * env, jintArray obj)
+{
+ int * result;
+ int length;
+
+ length = env->GetArrayLength(obj);
+ result = (int *) calloc(length, sizeof(int));
+ env->GetIntArrayRegion(obj, 0, length, (jint *) result);
+ return result;
+}
+
+double *
+QtSupport::toDoublePtr(JNIEnv * env, jdoubleArray obj)
+{
+ double * result;
+ int length;
+
+ length = env->GetArrayLength(obj);
+ result = (double *) calloc(length, sizeof(double));
+ env->GetDoubleArrayRegion(obj, 0, length, (jdouble *) result);
+ return result;
+}
+
+short *
+QtSupport::toShortPtr(JNIEnv * env, jshortArray obj)
+{
+ short * result;
+ int length;
+
+ length = env->GetArrayLength(obj);
+ result = (short *) calloc(length, sizeof(short));
+ env->GetShortArrayRegion(obj, 0, length, (jshort *) result);
+ return result;
+}
+
+jbooleanArray
+QtSupport::fromBooleanPtr(JNIEnv * env, bool * arg)
+{
+ jbooleanArray result;
+
+ result = env->NewBooleanArray(1);
+ env->SetBooleanArrayRegion(result, 0, 1, (jboolean *) arg);
+ return (jbooleanArray) result;
+}
+
+jintArray
+QtSupport::fromIntPtr(JNIEnv * env, int * arg)
+{
+ jintArray result;
+
+ result = env->NewIntArray(1);
+ env->SetIntArrayRegion(result, 0, 1, (jint *) arg);
+ return (jintArray) result;
+}
+
+jdoubleArray
+QtSupport::fromDoublePtr(JNIEnv * env, double * arg)
+{
+ jdoubleArray result;
+
+ result = env->NewDoubleArray(1);
+ env->SetDoubleArrayRegion(result, 0, 1, (jdouble *) arg);
+ return (jdoubleArray) result;
+}
+
+jshortArray
+QtSupport::fromShortPtr(JNIEnv * env, short * arg)
+{
+ jshortArray result;
+
+ result = env->NewShortArray(1);
+ env->SetShortArrayRegion(result, 0, 1, (jshort *) arg);
+ return (jshortArray) result;
+}
+
+
+jobject QtSupport::fromQDateTime(JNIEnv * env, QDateTime* qdate)
+{
+ jclass cls;
+ jmethodID cid;
+ jobject date;
+
+ cls = env->FindClass("java/util/GregorianCalendar");
+ if (cls == 0) {
+ return 0;
+ }
+
+ cid = env->GetMethodID(cls, "<init>", "(IIIIII)V");
+ if (cid == 0) {
+ return 0;
+ }
+
+ date = env->NewObject( cls, cid,
+ (jint) qdate->date().year(), (jint) qdate->date().month() - 1, (jint) qdate->date().day(),
+ (jint) qdate->time().hour(), (jint) qdate->time().minute(), (jint) qdate->time().second() );
+ QtSupport::setObjectForQtKey(env, date, qdate);
+
+ env->DeleteLocalRef(cls);
+ return (jobject) date;
+}
+
+jobject
+QtSupport::fromQDate(JNIEnv * env, QDate* qdate)
+{
+ jclass cls;
+ jmethodID cid;
+ jobject date;
+
+ cls = env->FindClass("java/util/GregorianCalendar");
+ if (cls == 0) {
+ return 0;
+ }
+
+ cid = env->GetMethodID(cls, "<init>", "(III)V");
+ if (cid == 0) {
+ return 0;
+ }
+
+ date = env->NewObject(cls, cid, (jint) qdate->year(), (jint) qdate->month() - 1, (jint) qdate->day());
+ QtSupport::setObjectForQtKey(env, date, qdate);
+
+ env->DeleteLocalRef(cls);
+ return (jobject) date;
+}
+
+jobject
+QtSupport::fromQTime(JNIEnv * env, QTime* qtime)
+{
+ jclass cls;
+ jmethodID cid;
+ jobject time;
+ jmethodID mid;
+
+ cls = env->FindClass("java/util/Date");
+ if (cls == 0) {
+ return 0;
+ }
+
+ cid = env->GetMethodID(cls, "<init>", "()V");
+ if (cid == 0) {
+ return 0;
+ }
+
+ time = env->NewObject(cls, cid);
+ QtSupport::setObjectForQtKey(env, time, qtime);
+
+ mid = env->GetMethodID(cls, "setHours", "(I)V");
+ if (mid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(time, mid, qtime->hour());
+
+ mid = env->GetMethodID(cls, "setMinutes", "(I)V");
+ if (mid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(time, mid, qtime->minute());
+
+ mid = env->GetMethodID(cls, "setSeconds", "(I)V");
+ if (mid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(time, mid, qtime->second());
+
+ env->DeleteLocalRef(cls);
+ return (jobject) time;
+}
+
+
+QDateTime *
+QtSupport::toQDateTime(JNIEnv * env, jobject jdate, QDateTime** qdatetime)
+{
+static QDate * qdate = 0;
+static QTime * qtime = 0;
+
+ if (*qdatetime == 0) {
+ *qdatetime = new QDateTime();
+ qdate = new QDate();
+ qtime = new QTime();
+ }
+
+ QtSupport::toQDate(env, jdate, &qdate);
+ QtSupport::toQTime(env, jdate, &qtime);
+ (*qdatetime)->setDate(*qdate);
+ (*qdatetime)->setTime(*qtime);
+
+ return *qdatetime;
+}
+
+
+#define JAVA_YEAR 1
+#define JAVA_MONTH 2
+#define JAVA_DAY_OF_MONTH 5
+QDate *
+QtSupport::toQDate(JNIEnv * env, jobject jdate, QDate** qdate)
+{
+ jclass cls;
+ jmethodID mid;
+ jint year;
+ jint month;
+ jint day;
+
+ if (*qdate == 0) {
+ *qdate = new QDate();
+ }
+
+ cls = env->FindClass("java/util/Calendar");
+
+ mid = env->GetMethodID(cls, "get", "(I)I");
+ if (mid == 0) {
+ return 0;
+ }
+
+ year = env->CallIntMethod(jdate, mid, JAVA_YEAR);
+ month = env->CallIntMethod(jdate, mid, JAVA_MONTH);
+ day = env->CallIntMethod(jdate, mid, JAVA_DAY_OF_MONTH);
+
+ (*qdate)->setYMD((int) year, (int) month + 1, (int) day);
+
+ env->DeleteLocalRef(cls);
+ return *qdate;
+}
+
+QTime *
+QtSupport::toQTime(JNIEnv * env, jobject jtime, QTime** qtime)
+{
+ jclass cls;
+ jmethodID mid;
+ jint hour;
+ jint minute;
+ jint second;
+
+ if (*qtime == 0) {
+ *qtime = new QTime();
+ }
+
+ cls = env->FindClass("java/util/Date");
+
+ mid = env->GetMethodID(cls, "getHours", "()I");
+ if (mid == 0) {
+ return 0;
+ }
+
+ hour = env->CallIntMethod(jtime, mid);
+
+ mid = env->GetMethodID(cls, "getMinutes", "()I");
+ if (mid == 0) {
+ return 0;
+ }
+
+ minute = env->CallIntMethod(jtime, mid);
+
+ mid = env->GetMethodID(cls, "getSeconds", "()I");
+ if (mid == 0) {
+ return 0;
+ }
+
+ second = env->CallIntMethod(jtime, mid);
+
+ (*qtime)->setHMS((int) hour, (int) minute, (int) second);
+
+ env->DeleteLocalRef(cls);
+ return *qtime;
+}
+
+jstring
+QtSupport::fromQString(JNIEnv * env, QString * qstring)
+{
+ if (qstring == 0) {
+ return 0;
+ }
+
+ if (_bigEndianUnicode) {
+ return env->NewString((const jchar *) qstring->unicode(), (long) qstring->length());
+ } else {
+static QString * temp = 0L;
+
+ if (temp == 0L) {
+ temp = new QString();
+ }
+
+ // Hack to change the big endian unicode in 'qstring' to little endian in 'temp'.
+ temp->setUnicodeCodes((const ushort *) qstring->unicode(), (long) qstring->length());
+ return env->NewString((const jchar *) temp->unicode(), (long) temp->length());
+ }
+}
+
+jstring
+QtSupport::fromQCString(JNIEnv * env, QCString * qcstring)
+{
+ jstring result = 0;
+ jbyteArray bytes = 0;
+ int len;
+ jclass cls;
+
+ if (qcstring == 0) {
+ return 0;
+ }
+
+ len = qcstring->length();
+ bytes = env->NewByteArray(len);
+ env->SetByteArrayRegion(bytes, 0, len, (jbyte *) (const char *) *qcstring);
+ cls = env->FindClass("java/lang/String");
+ result = (jstring) env->NewObject(cls, QtSupport::MID_String_init, bytes);
+ env->DeleteLocalRef(cls);
+ env->DeleteLocalRef(bytes);
+ return result;
+}
+
+jstring
+QtSupport::fromCharString(JNIEnv * env, char * qcstring)
+{
+ jstring result = 0;
+ jbyteArray bytes = 0;
+ int len;
+
+ if (qcstring == 0) {
+ return 0;
+ }
+
+ len = strlen(qcstring);
+ bytes = env->NewByteArray(len);
+ env->SetByteArrayRegion(bytes, 0, len, (jbyte *) (const char *) qcstring);
+ jclass stringClass = env->FindClass("java/lang/String");
+ result = (jstring) env->NewObject(stringClass, QtSupport::MID_String_init, bytes);
+ env->DeleteLocalRef(stringClass);
+ env->DeleteLocalRef(bytes);
+ return result;
+}
+
+QString *
+QtSupport::toQString(JNIEnv * env, jstring str, QString ** qstring)
+{
+ const jchar * _jchar_str;
+
+ if (str == 0L) {
+ return (QString*) &QString::null;
+ }
+
+ if (*qstring == 0L) {
+ *qstring = new QString();
+ }
+
+ _jchar_str = env->GetStringChars(str, 0);
+
+ if (_bigEndianUnicode) {
+ (*qstring)->setUnicode((QChar *) _jchar_str, env->GetStringLength(str));
+ } else {
+ (*qstring)->setUnicodeCodes((const ushort *) _jchar_str, env->GetStringLength(str));
+ }
+
+ env->ReleaseStringChars(str, _jchar_str);
+ return *qstring;
+}
+
+QCString *
+QtSupport::toQCString(JNIEnv * env, jstring str, QCString ** qcstring)
+{
+ jbyteArray bytes = 0;
+ jthrowable exc;
+ jint len = 0;
+ char * data;
+
+ if (str == 0) {
+ return 0;
+ }
+
+ bytes = (jbyteArray) env->CallObjectMethod(str, QtSupport::MID_String_getBytes);
+ exc = env->ExceptionOccurred();
+
+ if (exc) {
+ env->DeleteLocalRef(exc);
+ return 0;
+ }
+
+ len = env->GetArrayLength(bytes);
+
+ if (*qcstring == 0) {
+ *qcstring = new QCString(len + 1);
+ } else {
+ (*qcstring)->resize(len + 1);
+ }
+
+ data = (*qcstring)->data();
+ env->GetByteArrayRegion(bytes, 0, len, (jbyte *) data);
+ data[len] = 0;
+ env->DeleteLocalRef(bytes);
+ return *qcstring;
+}
+
+char *
+QtSupport::toCharString(JNIEnv * env, jstring str, QCString ** qcstring)
+{
+ if (str == 0) {
+ return 0;
+ }
+
+ (void) QtSupport::toQCString(env, str, qcstring);
+ return (*qcstring)->data();
+}
+
+
+void
+QtSupport::fromQStringToStringBuffer(JNIEnv * env, QString * qstring, jobject buffer)
+{
+ jclass cls;
+ jmethodID mid;
+ jmethodID appendMid;
+
+ if (buffer == 0) {
+ return;
+ }
+
+ cls = env->FindClass("java/lang/StringBuffer");
+ if (cls == 0) {
+ return;
+ }
+
+ mid = env->GetMethodID(cls, "setLength", "(I)V");
+ if (mid == 0) {
+ return;
+ }
+
+ env->CallVoidMethod(buffer, mid, 0);
+
+ appendMid = env->GetMethodID(cls, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
+ if (appendMid == 0) {
+ return;
+ }
+
+ (void) env->CallObjectMethod(buffer, appendMid, QtSupport::fromQString(env, qstring));
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+QString *
+QtSupport::toQStringFromStringBuffer(JNIEnv * env, jobject buffer, QString ** qstring)
+{
+ jclass cls;
+ jmethodID mid;
+ jstring str;
+
+ if (buffer == 0) {
+ return 0;
+ }
+
+ cls = env->FindClass("java/lang/StringBuffer");
+ if (cls == 0) {
+ return 0;
+ }
+
+ mid = env->GetMethodID(cls, "toString", "()Ljava/lang/String;");
+ if (mid == 0) {
+ return 0;
+ }
+
+ str = (jstring) env->CallObjectMethod(buffer, mid);
+ env->DeleteLocalRef(cls);
+ return QtSupport::toQString(env, str, qstring);
+}
+void
+QtSupport::fromQCStringToStringBuffer(JNIEnv * env, QCString * qcstring, jobject buffer)
+{
+ jclass cls;
+ jmethodID mid;
+ jmethodID appendMid;
+
+ if (buffer == 0) {
+ return;
+ }
+
+ cls = env->FindClass("java/lang/StringBuffer");
+ if (cls == 0) {
+ return;
+ }
+
+ mid = env->GetMethodID(cls, "setLength", "(I)V");
+ if (mid == 0) {
+ return;
+ }
+
+ env->CallVoidMethod(buffer, mid, 0);
+
+ appendMid = env->GetMethodID(cls, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
+ if (appendMid == 0) {
+ return;
+ }
+
+ (void) env->CallObjectMethod(buffer, appendMid, QtSupport::fromQCString(env, qcstring));
+ env->DeleteLocalRef(cls);
+ return;
+}
+
+jchar
+QtSupport::fromQChar(JNIEnv * env, QChar * qchar)
+{
+ (void) env;
+ return (jchar) qchar->unicode();
+}
+
+QChar *
+QtSupport::toQChar(JNIEnv * env, jchar unichar, QChar ** qchar)
+{
+ (void) env;
+
+ if (*qchar != 0L) {
+ delete *qchar;
+ }
+
+ *qchar = new QChar((ushort) unichar);
+ return *qchar;
+}
+
+jbyteArray
+QtSupport::fromQByteArray(JNIEnv * env, QByteArray * qbyteArray)
+{
+ jbyteArray result = 0;
+ int len;
+
+ len = qbyteArray->size();
+ result = env->NewByteArray(len);
+ env->SetByteArrayRegion(result, 0, len, (jbyte *) (const char *) qbyteArray->data());
+ return result;
+}
+
+QByteArray *
+QtSupport::toQByteArray(JNIEnv * env, jbyteArray bytes, QByteArray ** qbyteArray)
+{
+ if (bytes == 0) {
+ return 0;
+ }
+
+ jsize len = env->GetArrayLength(bytes);
+ if (*qbyteArray == 0) {
+ *qbyteArray = new QByteArray(len);
+ } else {
+ (*qbyteArray)->resize(len);
+ }
+
+ jboolean isCopy;
+ (*qbyteArray)->duplicate((const char *)env->GetByteArrayElements(bytes, &isCopy), len);
+ return *qbyteArray;
+}
+
+uchar *
+QtSupport::toUcharArray(JNIEnv * env, jcharArray bytes, QByteArray ** qbyteArray)
+{
+ uchar * data;
+ unsigned short * ptr;
+
+ if (bytes == 0) {
+ return 0;
+ }
+
+ jsize len = env->GetArrayLength(bytes);
+ if (*qbyteArray == 0) {
+ *qbyteArray = new QByteArray(len*2);
+ } else {
+ (*qbyteArray)->resize(len*2);
+ }
+
+ jboolean isCopy;
+ (*qbyteArray)->duplicate((const char *)env->GetCharArrayElements(bytes, &isCopy), len*2);
+ data = (uchar *) (*qbyteArray)->data();
+ ptr = (unsigned short *) data;
+
+ /* Convert the array from 16 bit Java 'char[]' to 8 bit C++ 'char *' array */
+ for (int index = 0; index < len; index++) {
+ data[index] = (uchar) ptr[index];
+ }
+
+ (*qbyteArray)->resize(len);
+ return (uchar*) (*qbyteArray)->data();
+}
+
+QValueList<int>
+QtSupport::toQIntValueList(JNIEnv * env, jintArray ints, QValueList<int> ** qintArray)
+{
+ int len;
+ jint * carr;
+ int index;
+
+ (*qintArray)->clear();
+ len = env->GetArrayLength(ints);
+ carr = env->GetIntArrayElements(ints, 0);
+
+ for (index = 0; index < len; index++) {
+ (*qintArray)->append((int) carr[index]);
+ }
+
+ env->ReleaseIntArrayElements(ints, carr, 0);
+ return **qintArray;
+}
+
+jintArray
+QtSupport::fromQIntValueList(JNIEnv * env, QValueList<int> * qintArray)
+{
+ jintArray result = 0;
+ int len;
+ int index;
+
+ len = qintArray->size();
+ result = env->NewIntArray(len);
+ for (index = 0; index < len; index++) {
+ env->SetIntArrayRegion(result, index, 1, (jint *) &(*qintArray)[index]);
+ }
+
+ return result;
+}
+
+char **
+QtSupport::toArgv(JNIEnv * env, jobjectArray stringList)
+{
+ char ** argv;
+ int length;
+ int index;
+ jstring jstr;
+ const char * str;
+
+ if (stringList == NULL) {
+ return NULL;
+ }
+
+ length = env->GetArrayLength(stringList);
+ argv = (char **) calloc(length + 1, sizeof(char*));
+ /* Add a dummy first argument of 'java [interpreter-options] <main class>' to appear
+ in usage messages, in place of the usual executable name from argv[0]. */
+ argv[0] = strdup("java [interpreter-options] <main class>");
+
+ for (index = 0; index < length; index++) {
+ jstr = (jstring) env->GetObjectArrayElement(stringList, index);
+ str = env->GetStringUTFChars(jstr, NULL);
+ argv[index + 1] = strdup(str);
+ env->ReleaseStringUTFChars(jstr, str);
+ env->DeleteLocalRef(jstr);
+ }
+
+ return argv;
+}
+
+char **
+QtSupport::toStringArray(JNIEnv * env, jobjectArray stringList)
+{
+ char ** argv;
+ int length;
+ int index;
+ jstring jstr;
+ const char * str;
+
+ if (stringList == 0) {
+ return 0;
+ }
+
+ length = env->GetArrayLength(stringList);
+ argv = (char **) calloc(length, sizeof(char*));
+
+ for (index = 0; index < length; index++) {
+ jstr = (jstring) env->GetObjectArrayElement(stringList, index);
+ str = env->GetStringUTFChars(jstr, 0);
+ argv[index] = strdup(str);
+ env->ReleaseStringUTFChars(jstr, str);
+ env->DeleteLocalRef(jstr);
+ }
+
+ return argv;
+}
+
+QStrList *
+QtSupport::toQStrList(JNIEnv * env, jobjectArray stringList, QStrList ** qstringList)
+{
+ int length;
+ int index;
+ jstring jstr;
+static QString * _qstring_temp = 0;
+
+ if (*qstringList == 0) {
+ *qstringList = new QStrList();
+ }
+
+ (*qstringList)->clear();
+
+ if (stringList == 0) {
+ return *qstringList;
+ }
+
+ length = env->GetArrayLength(stringList);
+
+ for (index = 0; index < length; index++) {
+ jstr = (jstring) env->GetObjectArrayElement(stringList, index);
+ (*qstringList)->append((QString &) * (QString *) QtSupport::toQString(env, jstr, &_qstring_temp));
+ env->DeleteLocalRef(jstr);
+ }
+
+ return *qstringList;
+}
+
+QStringList *
+QtSupport::toQStringList(JNIEnv * env, jobjectArray stringList, QStringList ** qstringList)
+{
+ int length;
+ int index;
+ jstring jstr;
+static QString * _qstring_temp = 0;
+
+ if (*qstringList == 0) {
+ *qstringList = new QStringList();
+ }
+
+ (*qstringList)->clear();
+
+ if (stringList == 0) {
+ return *qstringList;
+ }
+
+ length = env->GetArrayLength(stringList);
+
+ for (index = 0; index < length; index++) {
+ jstr = (jstring) env->GetObjectArrayElement(stringList, index);
+ (*qstringList)->append((QString &) * (QString *) QtSupport::toQString(env, jstr, &_qstring_temp));
+ env->DeleteLocalRef(jstr);
+ }
+
+ return *qstringList;
+}
+
+
+jobject
+QtSupport::arrayWithQStrList(JNIEnv * env, QStrList * qstrList, jobject stringArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (stringArray == 0) {
+ stringArray = (jobject) QtSupport::objectForQtKey(env, qstrList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(stringArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(stringArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (unsigned int index = 0; index < qstrList->count(); index++) {
+ char * currentItem = (char *) qstrList->at(index);
+ jstring currentString = env->NewStringUTF(currentItem);
+
+ if (! env->CallBooleanMethod(stringArray, addMid, currentString)) {
+ return 0;
+ }
+ env->DeleteLocalRef(currentString);
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) stringArray;
+}
+
+jobject
+QtSupport::arrayWithQStringList(JNIEnv * env, QStringList * qstringList, jobject stringArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (stringArray == 0) {
+ stringArray = (jobject) QtSupport::objectForQtKey(env, qstringList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(stringArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(stringArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (QStringList::Iterator it = qstringList->begin(); it != qstringList->end(); ++it) {
+ if (! env->CallBooleanMethod( stringArray,
+ addMid,
+ QtSupport::fromQString(env, (QString *) &(*it)) ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) stringArray;
+}
+
+jobject
+QtSupport::arrayWithQWidgetList(JNIEnv * env, QWidgetList * widgetList, jobject widgetArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (widgetArray == 0) {
+ widgetArray = (jobject) QtSupport::objectForQtKey(env, widgetList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(widgetArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(widgetArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (unsigned int index = 0; index < widgetList->count(); index++) {
+ QWidget * currentWidget = (QWidget *) widgetList->at(index);
+ if (! env->CallBooleanMethod( widgetArray,
+ addMid,
+ QtSupport::objectForQtKey(env, currentWidget, "org.kde.qt.QWidget") ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) widgetArray;
+}
+
+jobject
+QtSupport::arrayWithQDomNodeList(JNIEnv * env, QDomNodeList * domNodeList, jobject domNodeArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (domNodeArray == 0) {
+ domNodeArray = (jobject) QtSupport::objectForQtKey(env, domNodeList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(domNodeArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(domNodeArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (unsigned int index = 0; index < domNodeList->count(); index++) {
+ QDomNode currentDomNode = (QDomNode) domNodeList->item(index);
+
+ if (! env->CallBooleanMethod( domNodeArray,
+ addMid,
+ QtSupport::objectForQtKey(env, &currentDomNode, "org.kde.qt.QDomNode") ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) domNodeArray;
+}
+
+jobject
+QtSupport::arrayWithQObjectList(JNIEnv * env, QObjectList * objectList, jobject objectArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (objectArray == 0) {
+ objectArray = (jobject) QtSupport::objectForQtKey(env, objectList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(objectArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(objectArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (unsigned int index = 0; index < objectList->count(); index++) {
+ QObject * currentObject = (QObject *) objectList->at(index);
+
+ if (! env->CallBooleanMethod( objectArray,
+ addMid,
+ QtSupport::objectForQtKey(env, currentObject, "org.kde.qt.QObject") ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) objectArray;
+}
+
+jobject
+QtSupport::arrayWithQCanvasItemList(JNIEnv * env, QCanvasItemList * itemList, jobject objectArray)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (objectArray == 0) {
+ objectArray = (jobject) QtSupport::objectForQtKey(env, itemList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(objectArray);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(objectArray, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (QCanvasItemList::Iterator it = itemList->begin(); it != itemList->end(); ++it) {
+ const char * classString;
+
+ switch ((*it)->rtti()) {
+ case QCanvasItem::Rtti_Item:
+ classString = "org.kde.qt.QCanvasItem";
+ break;
+ case QCanvasItem::Rtti_Ellipse:
+ classString = "org.kde.qt.QCanvasEllipse";
+ break;
+ case QCanvasItem::Rtti_Line:
+ classString = "org.kde.qt.QCanvasLine";
+ break;
+ case QCanvasItem::Rtti_Polygon:
+ classString = "org.kde.qt.QCanvasPolygon";
+ break;
+ case QCanvasItem::Rtti_PolygonalItem:
+ classString = "org.kde.qt.QCanvasPolygonalItem";
+ break;
+ case QCanvasItem::Rtti_Rectangle:
+ classString = "org.kde.qt.QCanvasRectangle";
+ break;
+ case QCanvasItem::Rtti_Spline:
+ classString = "org.kde.qt.QCanvasSpline";
+ break;
+ case QCanvasItem::Rtti_Sprite:
+ classString = "org.kde.qt.QCanvasSprite";
+ break;
+ case QCanvasItem::Rtti_Text:
+ classString = "org.kde.qt.QCanvasText";
+ break;
+ default:
+ classString = "org.kde.qt.QCanvasItem";
+ break;
+ }
+
+ if (! env->CallBooleanMethod( objectArray,
+ addMid,
+ QtSupport::objectForQtKey(env, *it, classString) ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) objectArray;
+}
+
+jobject
+QtSupport::arrayWithQListViewItemList(JNIEnv * env, QListViewItemIterator * iterator, jobject arrayList)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+ const char * className;
+
+ if (arrayList == 0) {
+ arrayList = (jobject) QtSupport::objectForQtKey(env, iterator, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(arrayList);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(arrayList, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for ( ; iterator->current(); ++(*iterator)) {
+ QListViewItem * currentItem = iterator->current();
+
+ /* rtti() is: 0 = QListViewItem, 1 = QCheckListItem */
+ className = (currentItem->rtti() == 1 ? "org.kde.qt.QCheckListItem" : "org.kde.qt.QListViewItem");
+ if (! env->CallBooleanMethod( arrayList,
+ addMid,
+ QtSupport::objectForQtKey(env, currentItem, className) ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) arrayList;
+}
+
+jobject
+QtSupport::arrayWithQRectList(JNIEnv * env, QMemArray<QRect> * rectList, jobject arrayList)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (arrayList == 0) {
+ arrayList = (jobject) QtSupport::objectForQtKey(env, rectList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(arrayList);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(arrayList, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (unsigned int index = 0; index < rectList->count(); index++) {
+ QRect currentRect = (QRect) rectList->at(index);
+ if (! env->CallBooleanMethod( arrayList,
+ addMid,
+ QtSupport::objectForQtKey( env,
+ new QRect(currentRect.topLeft(), currentRect.bottomRight()),
+ "org.kde.qt.QRect",
+ TRUE ) ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) arrayList;
+}
+
+jobject
+QtSupport::arrayWithQIconDragItemList(JNIEnv * env, QValueList<QIconDragItem> * dragItemList, jobject arrayList)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (arrayList == 0) {
+ arrayList = (jobject) QtSupport::objectForQtKey(env, dragItemList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(arrayList);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(arrayList, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (QValueList<QIconDragItem>::Iterator it = dragItemList->begin(); it != dragItemList->end(); ++it) {
+ QIconDragItem currentItem = (QIconDragItem) *it;
+ if (! env->CallBooleanMethod( arrayList,
+ addMid,
+ QtSupport::objectForQtKey(env, &currentItem, "org.kde.qt.QIconDragItem") ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) arrayList;
+}
+
+jobject
+QtSupport::arrayWithQUrlInfoList(JNIEnv * env, QValueList<QUrlInfo> * infoList, jobject arrayList)
+{
+ jclass cls;
+ jmethodID clearMid;
+ jmethodID addMid;
+
+ if (arrayList == 0) {
+ arrayList = (jobject) QtSupport::objectForQtKey(env, infoList, "java.util.ArrayList");
+ }
+
+ cls = env->GetObjectClass(arrayList);
+ clearMid = env->GetMethodID(cls, "clear", "()V");
+ if (clearMid == 0) {
+ return 0;
+ }
+
+ env->CallVoidMethod(arrayList, clearMid);
+
+ addMid = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z");
+ if (addMid == 0) {
+ return 0;
+ }
+
+ for (QValueList<QUrlInfo>::Iterator it = infoList->begin(); it != infoList->end(); ++it) {
+ QUrlInfo currentItem = (QUrlInfo) *it;
+ if (! env->CallBooleanMethod( arrayList,
+ addMid,
+ QtSupport::objectForQtKey(env, &currentItem, "org.kde.qt.QUrlInfo") ) )
+ {
+ return 0;
+ }
+ }
+
+ env->DeleteLocalRef(cls);
+ return (jobject) arrayList;
+}