/* * Java ATK Wrapper for GNOME * Copyright (C) 2009 Sun Microsystems Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include "jawimpl.h" #include "jawutil.h" extern void jaw_editable_text_interface_init(AtkEditableTextIface*); extern gpointer jaw_editable_text_data_init(jobject); extern void jaw_editable_text_data_finalize(gpointer); static void jaw_editable_text_set_text_contents(AtkEditableText *text, const gchar *string); static void jaw_editable_text_insert_text(AtkEditableText *text, const gchar *string, gint length, gint *position); static void jaw_editable_text_copy_text(AtkEditableText *text, gint start_pos, gint end_pos); static void jaw_editable_text_cut_text(AtkEditableText *text, gint start_pos, gint end_pos); static void jaw_editable_text_delete_text(AtkEditableText *text, gint start_pos, gint end_pos); static void jaw_editable_text_paste_text(AtkEditableText *text, gint position); typedef struct _EditableTextData { jobject atk_editable_text; }EditableTextData; void jaw_editable_text_interface_init (AtkEditableTextIface *iface) { iface->set_text_contents = jaw_editable_text_set_text_contents; iface->insert_text = jaw_editable_text_insert_text; iface->copy_text = jaw_editable_text_copy_text; iface->cut_text = jaw_editable_text_cut_text; iface->delete_text = jaw_editable_text_delete_text; iface->paste_text = jaw_editable_text_paste_text; } gpointer jaw_editable_text_data_init (jobject ac) { EditableTextData *data = g_new0(EditableTextData, 1); JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classEditableText, "", "(Ljavax/accessibility/AccessibleContext;)V"); jobject jatk_editable_text = (*jniEnv)->NewObject(jniEnv, classEditableText, jmid, ac); data->atk_editable_text = (*jniEnv)->NewGlobalRef(jniEnv, jatk_editable_text); return data; } void jaw_editable_text_data_finalize (gpointer p) { EditableTextData *data = (EditableTextData*)p; JNIEnv *jniEnv = jaw_util_get_jni_env(); if (data && data->atk_editable_text) { (*jniEnv)->DeleteGlobalRef(jniEnv, data->atk_editable_text); data->atk_editable_text = NULL; } } void jaw_editable_text_set_text_contents (AtkEditableText *text, const gchar *string) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "set_text_contents", "(Ljava/lang/String;)V"); jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, string); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, jstr); } void jaw_editable_text_insert_text (AtkEditableText *text, const gchar *string, gint length, gint *position) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "insert_text", "(Ljava/lang/String;I)V"); jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, string); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, jstr, (jint)*position); *position = *position + length; atk_text_set_caret_offset(ATK_TEXT(jaw_obj), *position); } void jaw_editable_text_copy_text (AtkEditableText *text, gint start_pos, gint end_pos) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "copy_text", "(II)V"); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, (jint)start_pos, (jint)end_pos); } void jaw_editable_text_cut_text (AtkEditableText *text, gint start_pos, gint end_pos) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "cut_text", "(II)V"); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, (jint)start_pos, (jint)end_pos); } void jaw_editable_text_delete_text (AtkEditableText *text, gint start_pos, gint end_pos) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "delete_text", "(II)V"); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, (jint)start_pos, (jint)end_pos); } void jaw_editable_text_paste_text (AtkEditableText *text, gint position) { JawObject *jaw_obj = JAW_OBJECT(text); EditableTextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_EDITABLE_TEXT); jobject atk_editable_text = data->atk_editable_text; JNIEnv *jniEnv = jaw_util_get_jni_env(); jclass classAtkEditableText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkEditableText"); jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkEditableText, "paste_text", "(I)V"); (*jniEnv)->CallVoidMethod(jniEnv, atk_editable_text, jmid, (jint)position); }