Blame jni/src/jawtext.c

Packit ffe0d2
/*
Packit ffe0d2
 * Java ATK Wrapper for GNOME
Packit ffe0d2
 * Copyright (C) 2009 Sun Microsystems Inc.
Packit ffe0d2
 *
Packit ffe0d2
 * This library is free software; you can redistribute it and/or
Packit ffe0d2
 * modify it under the terms of the GNU Lesser General Public
Packit ffe0d2
 * License as published by the Free Software Foundation; either
Packit ffe0d2
 * version 2.1 of the License, or (at your option) any later version.
Packit ffe0d2
 *
Packit ffe0d2
 * This library is distributed in the hope that it will be useful,
Packit ffe0d2
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ffe0d2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ffe0d2
 * Lesser General Public License for more details.
Packit ffe0d2
 *
Packit ffe0d2
 * You should have received a copy of the GNU Lesser General Public
Packit ffe0d2
 * License along with this library; if not, write to the Free Software
Packit ffe0d2
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit ffe0d2
 */
Packit ffe0d2
Packit ffe0d2
#include <atk/atk.h>
Packit ffe0d2
#include <glib.h>
Packit ffe0d2
#include "jawimpl.h"
Packit ffe0d2
#include "jawutil.h"
Packit ffe0d2
Packit ffe0d2
extern void jaw_text_interface_init(AtkTextIface*);
Packit ffe0d2
extern gpointer jaw_text_data_init(jobject);
Packit ffe0d2
extern void jaw_text_data_finalize(gpointer);
Packit ffe0d2
Packit ffe0d2
static gchar* jaw_text_get_text(AtkText *text,
Packit ffe0d2
                                gint start_offset,
Packit ffe0d2
                                gint end_offset);
Packit ffe0d2
Packit ffe0d2
static gunichar jaw_text_get_character_at_offset(AtkText *text, gint offset);
Packit ffe0d2
Packit ffe0d2
static gchar* jaw_text_get_text_after_offset(AtkText *text,
Packit ffe0d2
                                             gint offset,
Packit ffe0d2
                                             AtkTextBoundary boundary_type,
Packit ffe0d2
                                             gint *start_offset,
Packit ffe0d2
                                             gint *end_offset);
Packit ffe0d2
Packit ffe0d2
static gchar* jaw_text_get_text_at_offset(AtkText *text,
Packit ffe0d2
                                          gint offset,
Packit ffe0d2
                                          AtkTextBoundary boundary_type,
Packit ffe0d2
                                          gint *start_offset,
Packit ffe0d2
                                          gint *end_offset);
Packit ffe0d2
Packit ffe0d2
static gchar* jaw_text_get_text_before_offset(AtkText *text,
Packit ffe0d2
                                              gint offset,
Packit ffe0d2
                                              AtkTextBoundary boundary_type,
Packit ffe0d2
                                              gint *start_offset,
Packit ffe0d2
                                              gint *end_offset);
Packit ffe0d2
static gint jaw_text_get_caret_offset(AtkText *text);
Packit ffe0d2
Packit ffe0d2
static void jaw_text_get_character_extents(AtkText *text,
Packit ffe0d2
                                            gint offset,
Packit ffe0d2
                                            gint *x,
Packit ffe0d2
                                            gint *y,
Packit ffe0d2
                                            gint *width,
Packit ffe0d2
                                            gint *height,
Packit ffe0d2
                                            AtkCoordType coords);
Packit ffe0d2
Packit ffe0d2
static gint jaw_text_get_character_count(AtkText *text);
Packit ffe0d2
Packit ffe0d2
static gint jaw_text_get_offset_at_point(AtkText *text,
Packit ffe0d2
                                          gint x,
Packit ffe0d2
                                          gint y,
Packit ffe0d2
                                          AtkCoordType coords);
Packit ffe0d2
static void jaw_text_get_range_extents(AtkText *text,
Packit ffe0d2
                                        gint start_offset,
Packit ffe0d2
                                        gint end_offset,
Packit ffe0d2
                                        AtkCoordType coord_type,
Packit ffe0d2
                                        AtkTextRectangle *rect);
Packit ffe0d2
Packit ffe0d2
static gint jaw_text_get_n_selections(AtkText *text);
Packit ffe0d2
Packit ffe0d2
static gchar* jaw_text_get_selection(AtkText *text,
Packit ffe0d2
                                     gint selection_num,
Packit ffe0d2
                                     gint *start_offset,
Packit ffe0d2
                                     gint *end_offset);
Packit ffe0d2
Packit ffe0d2
static gboolean jaw_text_add_selection(AtkText *text,
Packit ffe0d2
                                       gint start_offset,
Packit ffe0d2
                                       gint end_offset);
Packit ffe0d2
Packit ffe0d2
static gboolean jaw_text_remove_selection(AtkText *text, gint selection_num);
Packit ffe0d2
Packit ffe0d2
static gboolean jaw_text_set_selection(AtkText *text,
Packit ffe0d2
                                       gint selection_num,
Packit ffe0d2
                                       gint start_offset,
Packit ffe0d2
                                       gint end_offset);
Packit ffe0d2
Packit ffe0d2
static gboolean jaw_text_set_caret_offset(AtkText *text, gint offset);
Packit ffe0d2
Packit ffe0d2
typedef struct _TextData {
Packit ffe0d2
  jobject atk_text;
Packit ffe0d2
  gchar* text;
Packit ffe0d2
  jstring jstrText;
Packit ffe0d2
}TextData;
Packit ffe0d2
Packit ffe0d2
void
Packit ffe0d2
jaw_text_interface_init (AtkTextIface *iface)
Packit ffe0d2
{
Packit ffe0d2
  iface->get_text = jaw_text_get_text;
Packit ffe0d2
  iface->get_character_at_offset = jaw_text_get_character_at_offset;
Packit ffe0d2
  iface->get_text_after_offset = jaw_text_get_text_after_offset;
Packit ffe0d2
  iface->get_text_at_offset = jaw_text_get_text_at_offset;
Packit ffe0d2
  iface->get_text_before_offset = jaw_text_get_text_before_offset;
Packit ffe0d2
  iface->get_caret_offset = jaw_text_get_caret_offset;
Packit ffe0d2
  iface->get_character_extents = jaw_text_get_character_extents;
Packit ffe0d2
  iface->get_character_count = jaw_text_get_character_count;
Packit ffe0d2
  iface->get_offset_at_point = jaw_text_get_offset_at_point;
Packit ffe0d2
  iface->get_range_extents = jaw_text_get_range_extents;
Packit ffe0d2
  iface->get_n_selections = jaw_text_get_n_selections;
Packit ffe0d2
  iface->get_selection = jaw_text_get_selection;
Packit ffe0d2
  iface->add_selection = jaw_text_add_selection;
Packit ffe0d2
  iface->remove_selection = jaw_text_remove_selection;
Packit ffe0d2
  iface->set_selection = jaw_text_set_selection;
Packit ffe0d2
  iface->set_caret_offset = jaw_text_set_caret_offset;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
gpointer
Packit ffe0d2
jaw_text_data_init (jobject ac)
Packit ffe0d2
{
Packit ffe0d2
  TextData *data = g_new0(TextData, 1);
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                          "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classText,
Packit ffe0d2
                                          "<init>",
Packit ffe0d2
                                          "(Ljavax/accessibility/AccessibleContext;)V");
Packit ffe0d2
  jobject jatk_text = (*jniEnv)->NewObject(jniEnv, classText, jmid, ac);
Packit ffe0d2
  data->atk_text = (*jniEnv)->NewGlobalRef(jniEnv, jatk_text);
Packit ffe0d2
Packit ffe0d2
  return data;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
void
Packit ffe0d2
jaw_text_data_finalize (gpointer p)
Packit ffe0d2
{
Packit ffe0d2
  TextData *data = (TextData*)p;
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
Packit ffe0d2
  if (data && data->atk_text)
Packit ffe0d2
  {
Packit ffe0d2
    if (data->text != NULL)
Packit ffe0d2
    {
Packit ffe0d2
      (*jniEnv)->ReleaseStringUTFChars(jniEnv, data->jstrText, data->text);
Packit ffe0d2
      (*jniEnv)->DeleteGlobalRef(jniEnv, data->jstrText);
Packit ffe0d2
      data->jstrText = NULL;
Packit ffe0d2
      data->text = NULL;
Packit ffe0d2
    }
Packit ffe0d2
Packit ffe0d2
    (*jniEnv)->DeleteGlobalRef(jniEnv, data->atk_text);
Packit ffe0d2
    data->atk_text = NULL;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_gtext_from_jstr (JNIEnv *jniEnv, TextData *data, jstring jstr)
Packit ffe0d2
{
Packit ffe0d2
  if (jstr == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return NULL;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  gchar* tmp_text = (gchar*)(*jniEnv)->GetStringUTFChars(jniEnv, jstr, NULL);
Packit ffe0d2
  gchar* text = g_strdup(tmp_text);
Packit ffe0d2
  (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, tmp_text);
Packit ffe0d2
Packit ffe0d2
  return text;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_text (AtkText *text, gint start_offset, gint end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_text",
Packit ffe0d2
                                          "(II)Ljava/lang/String;");
Packit ffe0d2
Packit ffe0d2
  jstring jstr = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                             atk_text,
Packit ffe0d2
                                             jmid,
Packit ffe0d2
                                             (jint)start_offset,
Packit ffe0d2
                                             (jint)end_offset );
Packit ffe0d2
Packit ffe0d2
  return jaw_text_get_gtext_from_jstr(jniEnv, data, jstr);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gunichar
Packit ffe0d2
jaw_text_get_character_at_offset (AtkText *text, gint offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_character_at_offset", "(I)C");
Packit ffe0d2
  jchar jcharacter = (*jniEnv)->CallCharMethod(jniEnv,
Packit ffe0d2
                                               atk_text,
Packit ffe0d2
                                               jmid,
Packit ffe0d2
                                               (jint)offset );
Packit ffe0d2
Packit ffe0d2
  return (gunichar)jcharacter;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_text_after_offset (AtkText *text,
Packit ffe0d2
                                gint offset,
Packit ffe0d2
                                AtkTextBoundary boundary_type,
Packit ffe0d2
                                gint *start_offset,
Packit ffe0d2
                                gint *end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_text_after_offset",
Packit ffe0d2
                                          "(II)Lorg/GNOME/Accessibility/AtkText$StringSequence;");
Packit ffe0d2
  jobject jStrSeq = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                                atk_text,
Packit ffe0d2
                                                jmid,
Packit ffe0d2
                                                (jint)offset,
Packit ffe0d2
                                                (jint)boundary_type );
Packit ffe0d2
Packit ffe0d2
  if (jStrSeq == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return NULL;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jclass classStringSeq = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                               "org/GNOME/Accessibility/AtkText$StringSequence");
Packit ffe0d2
  jfieldID jfidStr = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "str",
Packit ffe0d2
                                           "Ljava/lang/String;");
Packit ffe0d2
  jfieldID jfidStart = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                             classStringSeq,
Packit ffe0d2
                                             "start_offset",
Packit ffe0d2
                                             "I");
Packit ffe0d2
  jfieldID jfidEnd = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "end_offset",
Packit ffe0d2
                                           "I");
Packit ffe0d2
Packit ffe0d2
  jstring jStr = (*jniEnv)->GetObjectField(jniEnv, jStrSeq, jfidStr);
Packit ffe0d2
  jint jStart = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidStart);
Packit ffe0d2
  jint jEnd = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidEnd);
Packit ffe0d2
Packit ffe0d2
  (*start_offset) = (gint)jStart;
Packit ffe0d2
  (*end_offset) = (gint)jEnd;
Packit ffe0d2
Packit ffe0d2
  return jaw_text_get_gtext_from_jstr(jniEnv, data, jStr);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_text_at_offset (AtkText *text,
Packit ffe0d2
                             gint offset,
Packit ffe0d2
                             AtkTextBoundary boundary_type,
Packit ffe0d2
                             gint *start_offset, gint *end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_text_at_offset",
Packit ffe0d2
                                          "(II)Lorg/GNOME/Accessibility/AtkText$StringSequence;");
Packit ffe0d2
  jobject jStrSeq = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                                atk_text,
Packit ffe0d2
                                                jmid,
Packit ffe0d2
                                                (jint)offset,
Packit ffe0d2
                                                (jint)boundary_type );
Packit ffe0d2
Packit ffe0d2
  if (jStrSeq == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return NULL;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jclass classStringSeq = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                               "org/GNOME/Accessibility/AtkText$StringSequence");
Packit ffe0d2
  jfieldID jfidStr = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "str",
Packit ffe0d2
                                           "Ljava/lang/String;");
Packit ffe0d2
  jfieldID jfidStart = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                             classStringSeq,
Packit ffe0d2
                                             "start_offset",
Packit ffe0d2
                                             "I");
Packit ffe0d2
  jfieldID jfidEnd = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "end_offset",
Packit ffe0d2
                                           "I");
Packit ffe0d2
Packit ffe0d2
  jstring jStr = (*jniEnv)->GetObjectField(jniEnv, jStrSeq, jfidStr);
Packit ffe0d2
  jint jStart = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidStart);
Packit ffe0d2
  jint jEnd = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidEnd);
Packit ffe0d2
Packit ffe0d2
  (*start_offset) = (gint)jStart;
Packit ffe0d2
  (*end_offset) = (gint)jEnd;
Packit ffe0d2
Packit ffe0d2
  return jaw_text_get_gtext_from_jstr(jniEnv, data, jStr);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_text_before_offset(AtkText *text,
Packit ffe0d2
                                gint offset,
Packit ffe0d2
                                AtkTextBoundary boundary_type,
Packit ffe0d2
                                gint *start_offset,
Packit ffe0d2
                                gint *end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_text_before_offset",
Packit ffe0d2
                                          "(II)Lorg/GNOME/Accessibility/AtkText$StringSequence;");
Packit ffe0d2
  jobject jStrSeq = (*jniEnv)->CallObjectMethod( jniEnv,
Packit ffe0d2
                                                 atk_text,
Packit ffe0d2
                                                 jmid,
Packit ffe0d2
                                                 (jint)offset,
Packit ffe0d2
                                                 (jint)boundary_type );
Packit ffe0d2
Packit ffe0d2
  if (jStrSeq == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return NULL;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jclass classStringSeq = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                               "org/GNOME/Accessibility/AtkText$StringSequence");
Packit ffe0d2
  jfieldID jfidStr = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "str",
Packit ffe0d2
                                           "Ljava/lang/String;");
Packit ffe0d2
  jfieldID jfidStart = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                             classStringSeq,
Packit ffe0d2
                                             "start_offset",
Packit ffe0d2
                                             "I");
Packit ffe0d2
  jfieldID jfidEnd = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "end_offset",
Packit ffe0d2
                                           "I");
Packit ffe0d2
Packit ffe0d2
  jstring jStr = (*jniEnv)->GetObjectField(jniEnv, jStrSeq, jfidStr);
Packit ffe0d2
  jint jStart = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidStart);
Packit ffe0d2
  jint jEnd = (*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidEnd);
Packit ffe0d2
Packit ffe0d2
  (*start_offset) = (gint)jStart;
Packit ffe0d2
  (*end_offset) = (gint)jEnd;
Packit ffe0d2
Packit ffe0d2
  return jaw_text_get_gtext_from_jstr(jniEnv, data, jStr);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gint
Packit ffe0d2
jaw_text_get_caret_offset (AtkText *text)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_caret_offset",
Packit ffe0d2
                                          "()I");
Packit ffe0d2
  jint joffset = (*jniEnv)->CallIntMethod(jniEnv, atk_text, jmid);
Packit ffe0d2
Packit ffe0d2
  return (gint)joffset;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
jaw_text_get_character_extents (AtkText *text,
Packit ffe0d2
                                gint offset, gint *x, gint *y,
Packit ffe0d2
                                gint *width, gint *height,
Packit ffe0d2
                                AtkCoordType coords)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_character_extents",
Packit ffe0d2
                                          "(II)Ljava/awt/Rectangle;");
Packit ffe0d2
  jobject jrect = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                              atk_text,
Packit ffe0d2
                                              jmid,
Packit ffe0d2
                                              (jint)offset,
Packit ffe0d2
                                              (jint)coords);
Packit ffe0d2
Packit ffe0d2
  if (jrect == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jaw_util_get_rect_info(jniEnv, jrect, x, y, width, height);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gint
Packit ffe0d2
jaw_text_get_character_count (AtkText *text)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_character_count",
Packit ffe0d2
                                          "()I");
Packit ffe0d2
  jint jcount = (*jniEnv)->CallIntMethod(jniEnv, atk_text, jmid);
Packit ffe0d2
Packit ffe0d2
  return (gint)jcount;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gint
Packit ffe0d2
jaw_text_get_offset_at_point (AtkText *text, gint x, gint y, AtkCoordType coords)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_offset_at_point",
Packit ffe0d2
                                          "(III)I");
Packit ffe0d2
  jint joffset = (*jniEnv)->CallIntMethod(jniEnv,
Packit ffe0d2
                                          atk_text,
Packit ffe0d2
                                          jmid,
Packit ffe0d2
                                          (jint)x,
Packit ffe0d2
                                          (jint)y,
Packit ffe0d2
                                          (jint)coords);
Packit ffe0d2
Packit ffe0d2
  return (gint)joffset;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
jaw_text_get_range_extents (AtkText *text,
Packit ffe0d2
                            gint start_offset,
Packit ffe0d2
                            gint end_offset,
Packit ffe0d2
                            AtkCoordType coord_type,
Packit ffe0d2
                            AtkTextRectangle *rect)
Packit ffe0d2
{
Packit ffe0d2
  if (rect == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_range_extents",
Packit ffe0d2
                                          "(III)Ljava/awt/Rectangle;");
Packit ffe0d2
  jobject jrect = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                              atk_text,
Packit ffe0d2
                                              jmid,
Packit ffe0d2
                                              (jint)start_offset,
Packit ffe0d2
                                              (jint)end_offset,
Packit ffe0d2
                                              (jint)coord_type);
Packit ffe0d2
Packit ffe0d2
  if (!jrect)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jaw_util_get_rect_info(jniEnv, jrect, &(rect->x), &(rect->y), &(rect->width), &(rect->height));
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gint
Packit ffe0d2
jaw_text_get_n_selections (AtkText *text)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_n_selections",
Packit ffe0d2
                                          "()I");
Packit ffe0d2
  jint jselections = (*jniEnv)->CallIntMethod(jniEnv, atk_text, jmid);
Packit ffe0d2
Packit ffe0d2
  return (gint)jselections;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gchar*
Packit ffe0d2
jaw_text_get_selection (AtkText *text, gint selection_num, gint *start_offset, gint *end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "get_selection",
Packit ffe0d2
                                          "()Lorg/GNOME/Accessibility/AtkText$StringSequence;");
Packit ffe0d2
  jobject jStrSeq = (*jniEnv)->CallObjectMethod(jniEnv, atk_text, jmid);
Packit ffe0d2
Packit ffe0d2
  if (jStrSeq == NULL)
Packit ffe0d2
  {
Packit ffe0d2
    return NULL;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  jclass classStringSeq = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                               "org/GNOME/Accessibility/AtkText$StringSequence");
Packit ffe0d2
  jfieldID jfidStr = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "str",
Packit ffe0d2
                                           "Ljava/lang/String;");
Packit ffe0d2
  jfieldID jfidStart = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                             classStringSeq,
Packit ffe0d2
                                             "start_offset",
Packit ffe0d2
                                             "I");
Packit ffe0d2
  jfieldID jfidEnd = (*jniEnv)->GetFieldID(jniEnv,
Packit ffe0d2
                                           classStringSeq,
Packit ffe0d2
                                           "end_offset",
Packit ffe0d2
                                           "I");
Packit ffe0d2
Packit ffe0d2
  jstring jStr = (*jniEnv)->GetObjectField(jniEnv, jStrSeq, jfidStr);
Packit ffe0d2
  *start_offset = (gint)(*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidStart);
Packit ffe0d2
  *end_offset = (gint)(*jniEnv)->GetIntField(jniEnv, jStrSeq, jfidEnd);
Packit ffe0d2
Packit ffe0d2
  return jaw_text_get_gtext_from_jstr(jniEnv, data, jStr);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gboolean
Packit ffe0d2
jaw_text_add_selection (AtkText *text, gint start_offset, gint end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                         classAtkText,
Packit ffe0d2
                                         "add_selection",
Packit ffe0d2
                                         "(II)Z");
Packit ffe0d2
  jboolean jresult = (*jniEnv)->CallBooleanMethod(jniEnv,
Packit ffe0d2
                                                  atk_text,
Packit ffe0d2
                                                  jmid,
Packit ffe0d2
                                                  (jint)start_offset,
Packit ffe0d2
                                                  (jint)end_offset);
Packit ffe0d2
Packit ffe0d2
  if (jresult == JNI_TRUE)
Packit ffe0d2
  {
Packit ffe0d2
    return TRUE;
Packit ffe0d2
  } else {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gboolean
Packit ffe0d2
jaw_text_remove_selection (AtkText *text, gint selection_num)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "remove_selection",
Packit ffe0d2
                                          "(I)Z");
Packit ffe0d2
  jboolean jresult = (*jniEnv)->CallBooleanMethod(jniEnv,
Packit ffe0d2
                                                  atk_text,
Packit ffe0d2
                                                  jmid,
Packit ffe0d2
                                                  (jint)selection_num);
Packit ffe0d2
Packit ffe0d2
  if (jresult == JNI_TRUE)
Packit ffe0d2
  {
Packit ffe0d2
    return TRUE;
Packit ffe0d2
  } else {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gboolean
Packit ffe0d2
jaw_text_set_selection (AtkText *text, gint selection_num, gint start_offset, gint end_offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv, "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv, classAtkText, "set_selection", "(III)Z");
Packit ffe0d2
  jboolean jresult = (*jniEnv)->CallBooleanMethod(jniEnv,
Packit ffe0d2
                                                  atk_text,
Packit ffe0d2
                                                  jmid,
Packit ffe0d2
                                                  (jint)selection_num,
Packit ffe0d2
                                                  (jint)start_offset,
Packit ffe0d2
                                                  (jint)end_offset);
Packit ffe0d2
Packit ffe0d2
  if (jresult == JNI_TRUE) {
Packit ffe0d2
    return TRUE;
Packit ffe0d2
  } else {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gboolean
Packit ffe0d2
jaw_text_set_caret_offset (AtkText *text, gint offset)
Packit ffe0d2
{
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(text);
Packit ffe0d2
  TextData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_TEXT);
Packit ffe0d2
  jobject atk_text = data->atk_text;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkText = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                             "org/GNOME/Accessibility/AtkText");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkText,
Packit ffe0d2
                                          "set_caret_offset",
Packit ffe0d2
                                          "(I)Z");
Packit ffe0d2
  jboolean jresult = (*jniEnv)->CallBooleanMethod(jniEnv,
Packit ffe0d2
                                                  atk_text,
Packit ffe0d2
                                                  jmid,
Packit ffe0d2
                                                  (jint)offset);
Packit ffe0d2
Packit ffe0d2
  if (jresult == JNI_TRUE)
Packit ffe0d2
  {
Packit ffe0d2
    return TRUE;
Packit ffe0d2
  } else {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2