Blob Blame History Raw
/*
 * 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 <atk/atk.h>
#include <glib.h>
#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,
                                          "<init>",
                                          "(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);
}