[java-atk-wrapper/wip] JNI: Create jaw_object_ref_relation_set
- From: Magdalen Berns <mberns src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [java-atk-wrapper/wip] JNI: Create jaw_object_ref_relation_set
- Date: Thu, 25 Jun 2015 18:05:15 +0000 (UTC)
commit fe3cbcf53fd5da0ebaaae763a9ca91e5fb20570e
Author: Magdalen Berns <m berns thismagpie com>
Date: Thu Jun 25 19:03:49 2015 +0100
JNI: Create jaw_object_ref_relation_set
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=750641
jni/src/jawimpl.c | 6 ++++
jni/src/jawimpl.h | 1 +
jni/src/jawobject.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 88 insertions(+), 0 deletions(-)
---
diff --git a/jni/src/jawimpl.c b/jni/src/jawimpl.c
index 6eede1d..d63e689 100644
--- a/jni/src/jawimpl.c
+++ b/jni/src/jawimpl.c
@@ -729,6 +729,12 @@ get_atk_relation_type_from_java_key (JNIEnv *jniEnv, jstring jrel_key)
return ATK_RELATION_NULL;
}
+AtkRelationType
+jaw_impl_get_atk_relation_type(JNIEnv *env, jstring jrel_key)
+{
+ return get_atk_relation_type_from_java_key(env, jrel_key);
+}
+
static AtkRelationSet*
jaw_impl_ref_relation_set (AtkObject *atk_obj)
{
diff --git a/jni/src/jawimpl.h b/jni/src/jawimpl.h
index fdd4900..8c801a1 100644
--- a/jni/src/jawimpl.h
+++ b/jni/src/jawimpl.h
@@ -54,6 +54,7 @@ JawImpl* jaw_impl_find_instance(JNIEnv*, jobject);
GHashTable* jaw_impl_get_object_hash_table(void);
GType jaw_impl_get_type (guint);
+AtkRelationType jaw_impl_get_atk_relation_type(JNIEnv *jniEnv, jstring jrel_key);
struct _JawImplClass
{
diff --git a/jni/src/jawobject.c b/jni/src/jawobject.c
index 4be733e..b64e5f2 100644
--- a/jni/src/jawobject.c
+++ b/jni/src/jawobject.c
@@ -52,6 +52,7 @@ static void jaw_object_set_description (AtkObject *atk_obj, const gchar *descrip
static void jaw_object_set_parent(AtkObject *atk_obj, AtkObject *parent);
static void jaw_object_set_role (AtkObject *atk_obj, AtkRole role);
static const gchar *jaw_object_get_object_locale (AtkObject *atk_obj);
+static AtkRelationSet *jaw_object_ref_relation_set (AtkObject *atk_obj);
static gpointer parent_class = NULL;
static GHashTable *object_table = NULL;
@@ -108,6 +109,7 @@ jaw_object_class_init (JawObjectClass *klass)
atk_class->set_parent = jaw_object_set_parent;
atk_class->set_role = jaw_object_set_role;
atk_class->get_object_locale = jaw_object_get_object_locale;
+ atk_class->ref_relation_set= jaw_object_ref_relation_set;
atk_class->ref_state_set = jaw_object_ref_state_set;
atk_class->initialize = jaw_object_initialize;
@@ -531,6 +533,85 @@ static const gchar *jaw_object_get_object_locale (AtkObject *atk_obj)
return atk_object_get_object_locale((AtkObject*) target_obj);
}
+static AtkRelationSet*
+jaw_object_ref_relation_set (AtkObject *atk_obj)
+{
+ if (atk_obj->relation_set)
+ g_object_unref(G_OBJECT(atk_obj->relation_set));
+ atk_obj->relation_set = atk_relation_set_new();
+ if(atk_obj == NULL)
+ return NULL;
+
+ JawObject *jaw_obj = JAW_OBJECT(atk_obj);
+ jobject ac = jaw_obj->acc_context;
+ JNIEnv *jniEnv = jaw_util_get_jni_env();
+
+ jclass classAccessibleContext = (*jniEnv)->FindClass(jniEnv,
+ "javax/accessibility/AccessibleContext" );
+ jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
+ classAccessibleContext,
+ "getAccessibleRelationSet",
+ "()Ljavax/accessibility/AccessibleRelationSet;" );
+ jobject jrel_set = (*jniEnv)->CallObjectMethod( jniEnv, ac, jmid );
+
+ jclass classAccessibleRelationSet = (*jniEnv)->FindClass( jniEnv,
+ "javax/accessibility/AccessibleRelationSet");
+ jmid = (*jniEnv)->GetMethodID(jniEnv,
+ classAccessibleRelationSet,
+ "toArray",
+ "()[Ljavax/accessibility/AccessibleRelation;");
+ jobjectArray jrel_arr = (*jniEnv)->CallObjectMethod(jniEnv, jrel_set, jmid);
+ jsize jarr_size = (*jniEnv)->GetArrayLength(jniEnv, jrel_arr);
+
+ jsize i;
+ for (i = 0; i < jarr_size; i++)
+ {
+ jobject jrel = (*jniEnv)->GetObjectArrayElement(jniEnv, jrel_arr, i);
+ jclass classAccessibleRelation = (*jniEnv)->FindClass(jniEnv,
+ "javax/accessibility/AccessibleRelation");
+ jmid = (*jniEnv)->GetMethodID(jniEnv,
+ classAccessibleRelation,
+ "getKey",
+ "()Ljava/lang/String;");
+ jstring jrel_key = (*jniEnv)->CallObjectMethod( jniEnv, jrel, jmid );
+ AtkRelationType rel_type = jaw_impl_get_atk_relation_type(jniEnv, jrel_key);
+
+ jmid = (*jniEnv)->GetMethodID(jniEnv,
+ classAccessibleRelation,
+ "getTarget",
+ "()[Ljava/lang/Object;");
+ jobjectArray jtarget_arr = (*jniEnv)->CallObjectMethod(jniEnv, jrel, jmid);
+ jsize jtarget_size = (*jniEnv)->GetArrayLength(jniEnv, jtarget_arr);
+
+ jsize j;
+ for (j = 0; j < jtarget_size; j++)
+ {
+ jobject jtarget = (*jniEnv)->GetObjectArrayElement(jniEnv, jtarget_arr, j);
+ jclass classAccessible = (*jniEnv)->FindClass( jniEnv,
+ "javax/accessibility/Accessible");
+ if ((*jniEnv)->IsInstanceOf(jniEnv, jtarget, classAccessible))
+ {
+ jmid = (*jniEnv)->GetMethodID(jniEnv,
+ classAccessible,
+ "getAccessibleContext",
+ "()Ljavax/accessibility/AccessibleContext;");
+ jobject target_ac = (*jniEnv)->CallObjectMethod(jniEnv, jtarget, jmid);
+
+ JawImpl *target_obj = jaw_impl_get_instance(jniEnv, target_ac);
+ if(target_obj == NULL)
+ return NULL;
+ atk_object_add_relationship(atk_obj, rel_type, ATK_OBJECT(target_obj));
+ }
+ }
+ }
+ if(atk_obj->relation_set == NULL)
+ return NULL;
+ if (G_OBJECT(atk_obj->relation_set) != NULL)
+ g_object_ref (atk_obj->relation_set);
+
+ return atk_obj->relation_set;
+}
+
static JawObject*
jaw_object_table_lookup (JNIEnv *jniEnv, jobject ac)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]