X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Ftext.c;h=103e719c706a47afc81c29cf81bb2ee2db5d9e9d;hb=d8761880c8bd6c1c2b48749f57bab780900c274b;hp=8e870792b25d71b53640f44b1e95d081091493cf;hpb=e5a9e644107d0a366d8f4036fc8d363a4ff82255;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/text.c b/libspi/text.c index 8e87079..103e719 100644 --- a/libspi/text.c +++ b/libspi/text.c @@ -2,7 +2,8 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2001 Sun Microsystems Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -20,228 +21,49 @@ * Boston, MA 02111-1307, USA. */ -/* - * component.c : bonobo wrapper for accessible component implementation - * - */ -#include -#include +/* text.c : implements the Text interface */ +#include #include #include - -/* - * This pulls the CORBA definitions for the "Accessibility::Accessible" server - */ -#include - -/* - * This pulls the definition of the Text bonobo object - */ -#include "text.h" - -/* - * Static function declarations - */ - -static void -text_class_init (TextClass *klass); -static void -text_init (Text *text); -static void -text_finalize (GObject *obj); -static CORBA_string -impl_getText (PortableServer_Servant _servant, - const CORBA_long startOffset, - const CORBA_long endOffset, - CORBA_Environment * ev); -CORBA_string -impl_getTextAfterOffset (PortableServer_Servant _servant, - const CORBA_long offset, - const - Accessibility_TEXT_BOUNDARY_TYPE - type, CORBA_long * startOffset, - CORBA_long * endOffset, - CORBA_Environment * ev); -static CORBA_string -impl_getTextAtOffset (PortableServer_Servant _servant, - const CORBA_long offset, - const Accessibility_TEXT_BOUNDARY_TYPE type, - CORBA_long * startOffset, - CORBA_long * endOffset, - CORBA_Environment * ev); -static CORBA_wchar -impl_getCharacterAtOffset (PortableServer_Servant _servant, - const CORBA_long offset, - CORBA_Environment * ev); -static CORBA_string -impl_getTextBeforeOffset (PortableServer_Servant _servant, - const CORBA_long offset, - const - Accessibility_TEXT_BOUNDARY_TYPE - type, CORBA_long * startOffset, - CORBA_long * endOffset, - CORBA_Environment * ev); -static CORBA_long -impl__get_caretOffset (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_string -impl_getAttributes (PortableServer_Servant _servant, - const CORBA_long offset, - CORBA_long * startOffset, - CORBA_long * endOffset, - CORBA_Environment * ev); -static void -impl_getCharacterExtents (PortableServer_Servant _servant, - const CORBA_long offset, CORBA_long * x, - CORBA_long * y, CORBA_long * width, - CORBA_long * height, - const CORBA_short coordType, - CORBA_Environment * ev); -static CORBA_long -impl__get_characterCount (PortableServer_Servant _servant, - CORBA_Environment * ev); -static CORBA_long -impl_getOffsetAtPoint (PortableServer_Servant _servant, - const CORBA_long x, const CORBA_long y, - const CORBA_short coordType, - CORBA_Environment * ev); -static CORBA_long -impl_getNSelections (PortableServer_Servant _servant, - CORBA_Environment * ev); -static void -impl_getSelection (PortableServer_Servant _servant, - const CORBA_long selectionNum, - CORBA_long * startOffset, CORBA_long * endOffset, - CORBA_Environment * ev); -static CORBA_boolean -impl_addSelection (PortableServer_Servant _servant, - const CORBA_long startOffset, - const CORBA_long endOffset, - CORBA_Environment * ev); -static CORBA_boolean -impl_removeSelection (PortableServer_Servant _servant, - const CORBA_long selectionNum, - CORBA_Environment * ev); -static CORBA_boolean -impl_setSelection (PortableServer_Servant _servant, - const CORBA_long selectionNum, - const CORBA_long startOffset, - const CORBA_long endOffset, - CORBA_Environment * ev); -static CORBA_boolean -impl_setCaretOffset (PortableServer_Servant _servant, - const CORBA_long value, - CORBA_Environment * ev); - - - -static GObjectClass *parent_class; - -GType -text_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo tinfo = { - sizeof (TextClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) text_class_init, - (GClassFinalizeFunc) NULL, - NULL, /* class data */ - sizeof (Text), - 0, /* n preallocs */ - (GInstanceInitFunc) text_init, - NULL /* value table */ - }; - - /* - * Bonobo_type_unique auto-generates a load of - * CORBA structures for us. All derived types must - * use bonobo_type_unique. - */ - type = bonobo_type_unique ( - BONOBO_OBJECT_TYPE, - POA_Accessibility_Text__init, - NULL, - G_STRUCT_OFFSET (TextClass, epv), - &tinfo, - "AccessibleText"); - } - - return type; -} - -static void -text_class_init (TextClass *klass) -{ - GObjectClass * object_class = (GObjectClass *) klass; - POA_Accessibility_Text__epv *epv = &klass->epv; - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = text_finalize; - - - /* Initialize epv table */ - - epv->getText = impl_getText; - epv->getTextAfterOffset = impl_getTextAfterOffset; - epv->getCharacterAtOffset = impl_getCharacterAtOffset; - epv->getTextAtOffset = impl_getTextAtOffset; - epv->getTextBeforeOffset = impl_getTextBeforeOffset; - epv->_get_caretOffset = impl__get_caretOffset; - epv->getAttributes = impl_getAttributes; - epv->getCharacterExtents = impl_getCharacterExtents; - epv->_get_characterCount = impl__get_characterCount; - epv->getOffsetAtPoint = impl_getOffsetAtPoint; - epv->getNSelections = impl_getNSelections; - epv->getSelection = impl_getSelection; - epv->addSelection = impl_addSelection; - epv->removeSelection = impl_removeSelection; - epv->setSelection = impl_setSelection; - epv->setCaretOffset = impl_setCaretOffset; -} - -static void -text_init (Text *text) -{ -} - -static void -text_finalize (GObject *obj) +#include +#include +#include +#include + +/* Our parent Gtk object type */ +#define PARENT_TYPE SPI_TYPE_BASE + +typedef struct { + gint x; + gint y; + gint w; + gint h; +} SpiTextRect; + +static AtkText * +get_text_from_servant (PortableServer_Servant servant) { - Text *text = TEXT (obj); - g_object_unref (text->atko); - text->atko = NULL; - parent_class->finalize (obj); -} + SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant)); -Text * -text_interface_new (AtkObject *obj) -{ - Text *new_text = - TEXT(g_object_new (TEXT_TYPE, NULL)); - new_text->atko = obj; - g_object_ref (obj); - return new_text; + g_return_val_if_fail (object, NULL); + g_return_val_if_fail (ATK_IS_OBJECT(object->gobj), NULL); + return ATK_TEXT (object->gobj); } - - static CORBA_string -impl_getText (PortableServer_Servant _servant, - const CORBA_long startOffset, - const CORBA_long endOffset, - CORBA_Environment * ev) +impl_getText (PortableServer_Servant servant, + const CORBA_long startOffset, + const CORBA_long endOffset, + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); gchar *txt; - CORBA_char *rv; + CORBA_string rv; + AtkText *text = get_text_from_servant (servant); - txt = atk_text_get_text (ATK_TEXT(text->atko), - (gint) startOffset, (gint) endOffset); + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + txt = atk_text_get_text (text, startOffset, endOffset); if (txt) { rv = CORBA_string_dup (txt); @@ -249,64 +71,67 @@ impl_getText (PortableServer_Servant _servant, } else rv = CORBA_string_dup (""); + return rv; } - -CORBA_string -impl_getTextAfterOffset (PortableServer_Servant _servant, +static CORBA_string +impl_getTextAfterOffset (PortableServer_Servant servant, const CORBA_long offset, const Accessibility_TEXT_BOUNDARY_TYPE type, CORBA_long * startOffset, CORBA_long * endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); gchar *txt; CORBA_char *rv; + gint intStartOffset, intEndOffset; + AtkText *text = get_text_from_servant (servant); + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + txt = atk_text_get_text_after_offset (text, + offset, (AtkTextBoundary) type, + &intStartOffset, &intEndOffset); + *startOffset = intStartOffset; + *endOffset = intEndOffset; - txt = atk_text_get_text_after_offset (ATK_TEXT(text->atko), - (gint) offset, (AtkTextBoundary) type, - (gint *) startOffset, (gint *) endOffset); if (txt) { rv = CORBA_string_dup (txt); g_free (txt); - } + } else rv = CORBA_string_dup (""); + return rv; } - static CORBA_string -impl_getTextAtOffset (PortableServer_Servant _servant, +impl_getTextAtOffset (PortableServer_Servant servant, const CORBA_long offset, const Accessibility_TEXT_BOUNDARY_TYPE type, CORBA_long * startOffset, CORBA_long * endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text; - CORBA_char *txt; + gchar *txt; CORBA_char *rv; gint intStartOffset, intEndOffset; + AtkText *text = get_text_from_servant (servant); - BonoboObject *obj; - fprintf (stderr, "getting bonobo-object from text servant\n"); - obj = (bonobo_object_from_servant (_servant)); - - g_return_val_if_fail (IS_TEXT (bonobo_object_from_servant (_servant)), (CORBA_char *)""); - g_return_val_if_fail (ATK_IS_TEXT (text->atko), (CORBA_char *)""); - txt = (CORBA_char *) atk_text_get_text_at_offset (ATK_TEXT (text->atko), - (gint) offset, (AtkTextBoundary) type, - &intStartOffset, &intEndOffset); - *startOffset = (CORBA_long) intStartOffset; - *endOffset = (CORBA_long) intEndOffset; + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + txt = atk_text_get_text_at_offset ( + text, + offset, (AtkTextBoundary) type, + &intStartOffset, &intEndOffset); + + *startOffset = intStartOffset; + *endOffset = intEndOffset; if (txt) { @@ -320,34 +145,42 @@ impl_getTextAtOffset (PortableServer_Servant _servant, } - -static CORBA_wchar -impl_getCharacterAtOffset (PortableServer_Servant _servant, +static CORBA_unsigned_long +impl_getCharacterAtOffset (PortableServer_Servant servant, const CORBA_long offset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_wchar) - atk_text_get_character_at_offset (ATK_TEXT(text->atko), (gint) offset); + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, 0); + + return atk_text_get_character_at_offset (text, offset); } static CORBA_string -impl_getTextBeforeOffset (PortableServer_Servant _servant, +impl_getTextBeforeOffset (PortableServer_Servant servant, const CORBA_long offset, const Accessibility_TEXT_BOUNDARY_TYPE type, CORBA_long * startOffset, CORBA_long * endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); gchar *txt; CORBA_char *rv; + gint intStartOffset, intEndOffset; + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + txt = atk_text_get_text_before_offset (text, + offset, (AtkTextBoundary) type, + &intStartOffset, &intEndOffset); + + *startOffset = intStartOffset; + *endOffset = intEndOffset; - txt = atk_text_get_text_before_offset (ATK_TEXT(text->atko), - (gint) offset, (AtkTextBoundary) type, - (gint *) startOffset, (gint *) endOffset); if (txt) { rv = CORBA_string_dup (txt); @@ -355,157 +188,499 @@ impl_getTextBeforeOffset (PortableServer_Servant _servant, } else rv = CORBA_string_dup (""); + return rv; } static CORBA_long -impl__get_caretOffset (PortableServer_Servant _servant, - CORBA_Environment * ev) +impl__get_caretOffset (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, -1); + + return atk_text_get_caret_offset (text); +} + + +static CORBA_char * +_string_from_attribute_set (AtkAttributeSet *set) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_long) - atk_text_get_caret_offset (ATK_TEXT(text->atko)); + gchar *attributes, *tmp, *tmp2; + CORBA_char *rv; + GSList *cur_attr; + AtkAttribute *at; + + attributes = g_strdup (""); + cur_attr = (GSList *) set; + while (cur_attr) + { + at = (AtkAttribute *) cur_attr->data; + tmp = g_strdup_printf ("%s%s:%s%s", + ((GSList *)(set) == cur_attr) ? "" : " ", + at->name, at->value, + (cur_attr->next) ? ";" : ""); + tmp2 = g_strconcat (attributes, tmp, NULL); + g_free (tmp); + g_free (attributes); + attributes = tmp2; + cur_attr = cur_attr->next; + } + rv = CORBA_string_dup (attributes); + g_free (attributes); + return rv; } static CORBA_string -impl_getAttributes (PortableServer_Servant _servant, - const CORBA_long offset, - CORBA_long * startOffset, - CORBA_long * endOffset, - CORBA_Environment * ev) +impl_getAttributes (PortableServer_Servant servant, + const CORBA_long offset, + CORBA_long * startOffset, + CORBA_long * endOffset, + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - g_print ("getAttributes not implemented.\n"); + AtkAttributeSet *set; + gint intstart_offset, intend_offset; + CORBA_char *rv; + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + set = atk_text_get_run_attributes (text, offset, + &intstart_offset, &intend_offset); + *startOffset = intstart_offset; + *endOffset = intend_offset; + rv = _string_from_attribute_set (set); + atk_attribute_set_free (set); + return rv; } +static CORBA_string +impl_getAttributeValue (PortableServer_Servant servant, + const CORBA_long offset, + const CORBA_char *attributename, + CORBA_long * startOffset, + CORBA_long * endOffset, + CORBA_boolean * defined, + CORBA_Environment *ev) +{ + AtkAttributeSet *set; + gint intstart_offset, intend_offset; + GSList *cur_attr; + CORBA_string rv = NULL; + AtkText *text = get_text_from_servant (servant); + AtkAttribute *at; + + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + set = atk_text_get_run_attributes (text, offset, + &intstart_offset, &intend_offset); + *startOffset = intstart_offset; + *endOffset = intend_offset; + *defined = FALSE; + cur_attr = (GSList *) set; + while (cur_attr) + { + at = (AtkAttribute *) cur_attr->data; + if (!strcmp (at->name, attributename)) + { + rv = CORBA_string_dup (at->value); + *defined = TRUE; + break; + } + cur_attr = cur_attr->next; + } + atk_attribute_set_free (set); + return (rv ? rv : CORBA_string_dup ("")); +} +static CORBA_string +impl_getDefaultAttributes (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + AtkAttributeSet *set; + CORBA_char *rv; + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, CORBA_string_dup ("")); + + set = atk_text_get_default_attributes (text); + + rv = _string_from_attribute_set (set); + atk_attribute_set_free (set); + return rv; +} static void -impl_getCharacterExtents (PortableServer_Servant _servant, +impl_getCharacterExtents (PortableServer_Servant servant, const CORBA_long offset, CORBA_long * x, CORBA_long * y, CORBA_long * width, CORBA_long * height, const CORBA_short coordType, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - atk_text_get_character_extents (ATK_TEXT(text->atko), (gint) offset, - (gint *) x, (gint *) y, (gint *) width, (gint *) height, - (AtkCoordType) coordType); + AtkText *text = get_text_from_servant (servant); + gint ix, iy, iw, ih; + + g_return_if_fail (text != NULL); + + atk_text_get_character_extents ( + text, offset, + &ix, &iy, &iw, &ih, + (AtkCoordType) coordType); + *x = ix; + *y = iy; + *width = iw; + *height = ih; } - static CORBA_long -impl__get_characterCount (PortableServer_Servant _servant, - CORBA_Environment * ev) +impl__get_characterCount (PortableServer_Servant servant, + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_long) - atk_text_get_character_count (ATK_TEXT(text->atko)); -} + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, 0); + return atk_text_get_character_count (text); +} static CORBA_long -impl_getOffsetAtPoint (PortableServer_Servant _servant, +impl_getOffsetAtPoint (PortableServer_Servant servant, const CORBA_long x, const CORBA_long y, const CORBA_short coordType, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_long) - atk_text_get_offset_at_point (ATK_TEXT(text->atko), - (gint) x, (gint) y, (AtkCoordType) coordType); -} + AtkText *text = get_text_from_servant (servant); + g_return_val_if_fail (text != NULL, -1); + + return atk_text_get_offset_at_point (text, + x, y, + (AtkCoordType) coordType); +} static CORBA_long -impl_getNSelections (PortableServer_Servant _servant, - CORBA_Environment * ev) +impl_getNSelections (PortableServer_Servant servant, + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_long) - atk_text_get_n_selections (ATK_TEXT(text->atko)); -} + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, 0); + return atk_text_get_n_selections (text); +} static void -impl_getSelection (PortableServer_Servant _servant, +impl_getSelection (PortableServer_Servant servant, const CORBA_long selectionNum, CORBA_long * startOffset, CORBA_long * endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - atk_text_get_selection (ATK_TEXT(text->atko), (gint) selectionNum, - (gint *) startOffset, (gint *) endOffset); -} + AtkText *text = get_text_from_servant (servant); + gint intStartOffset, intEndOffset; + + g_return_if_fail (text != NULL); + /* atk_text_get_selection returns gchar* which we discard */ + g_free (atk_text_get_selection (text, selectionNum, + &intStartOffset, &intEndOffset)); + + *startOffset = intStartOffset; + *endOffset = intEndOffset; +} static CORBA_boolean -impl_addSelection (PortableServer_Servant _servant, +impl_addSelection (PortableServer_Servant servant, const CORBA_long startOffset, const CORBA_long endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_boolean) - atk_text_add_selection (ATK_TEXT(text->atko), - (gint) startOffset, (gint) endOffset); -} + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, FALSE); + return atk_text_add_selection (text, + startOffset, endOffset); +} static CORBA_boolean -impl_removeSelection (PortableServer_Servant _servant, +impl_removeSelection (PortableServer_Servant servant, const CORBA_long selectionNum, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_boolean) - atk_text_remove_selection (ATK_TEXT(text->atko), (gint) selectionNum); -} + AtkText *text = get_text_from_servant (servant); + g_return_val_if_fail (text != NULL, FALSE); + + return atk_text_remove_selection (text, selectionNum); +} static CORBA_boolean -impl_setSelection (PortableServer_Servant _servant, +impl_setSelection (PortableServer_Servant servant, const CORBA_long selectionNum, const CORBA_long startOffset, const CORBA_long endOffset, - CORBA_Environment * ev) + CORBA_Environment *ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_boolean) - atk_text_set_selection (ATK_TEXT(text->atko), - (gint) selectionNum, (gint) startOffset, (gint) endOffset); -} + AtkText *text = get_text_from_servant (servant); + g_return_val_if_fail (text != NULL, FALSE); + + return atk_text_set_selection (text, + selectionNum, startOffset, endOffset); +} static CORBA_boolean -impl_setCaretOffset (PortableServer_Servant _servant, +impl_setCaretOffset (PortableServer_Servant servant, const CORBA_long value, + CORBA_Environment *ev) +{ + AtkText *text = get_text_from_servant (servant); + + g_return_val_if_fail (text != NULL, FALSE); + + return atk_text_set_caret_offset (text, value); +} + +static void +impl_getRangeExtents(PortableServer_Servant servant, + const CORBA_long startOffset, + const CORBA_long endOffset, + CORBA_long * x, CORBA_long * y, + CORBA_long * width, + CORBA_long * height, + const CORBA_short coordType, CORBA_Environment * ev) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); - return (CORBA_boolean) - atk_text_set_caret_offset (ATK_TEXT(text->atko), (gint) value); + AtkText *text = get_text_from_servant (servant); + AtkTextRectangle rect; + + g_return_if_fail (text != NULL); + + atk_text_get_range_extents (text, (gint) startOffset, (gint) endOffset, + (AtkCoordType) coordType, &rect); + *x = rect.x; + *y = rect.y; + *width = rect.width; + *height = rect.height; } +#define MAXRANGELEN 512 +static Accessibility_Text_RangeList * +_spi_text_range_seq_from_atkrangelist (AtkTextRange **range_list) +{ + Accessibility_Text_RangeList *rangeList = + Accessibility_Text_RangeList__alloc (); + int i, len; -static void -impl_getRowColAtOffset (PortableServer_Servant _servant, - const CORBA_long offset, CORBA_long * row, - CORBA_long * column, CORBA_Environment * ev) + for (len = 0; len < MAXRANGELEN && range_list[len]; ++len); + + rangeList->_length = len; + rangeList->_buffer = Accessibility_Text_RangeList_allocbuf (len); + for (i = 0; i < len; ++i) + { + rangeList->_buffer[i].startOffset = range_list[i]->start_offset; + rangeList->_buffer[i].endOffset = range_list[i]->end_offset; + rangeList->_buffer[i].content = CORBA_string_dup (range_list[i]->content); + } + + return rangeList; +} + +static Accessibility_Text_RangeList * +impl_getBoundedRanges(PortableServer_Servant servant, + const CORBA_long x, + const CORBA_long y, + const CORBA_long width, + const CORBA_long height, + const CORBA_short coordType, + const Accessibility_TEXT_CLIP_TYPE xClipType, + const Accessibility_TEXT_CLIP_TYPE yClipType, + CORBA_Environment * ev) +{ + AtkText *text = get_text_from_servant (servant); + AtkTextRange **range_list = NULL; + AtkTextRectangle rect; + + rect.x = x; + rect.y = y; + rect.width = width; + rect.height = height; + + range_list = atk_text_get_bounded_ranges (text, &rect, + (AtkCoordType) coordType, + (AtkTextClipType) xClipType, + (AtkTextClipType) yClipType); + + return _spi_text_range_seq_from_atkrangelist (range_list); +} + + + +static Accessibility_AttributeSet * +impl_getAttributeRun (PortableServer_Servant servant, + const CORBA_long offset, + CORBA_long *startOffset, CORBA_long *endOffset, + const CORBA_boolean includeDefaults, + CORBA_Environment *ev){ + + AtkAttributeSet *attributes, *default_attributes = NULL; + AtkAttribute *attr = NULL; + gint intstart_offset, intend_offset; + Accessibility_AttributeSet *retval = NULL; + AtkText *text = get_text_from_servant (servant); + gint n_attributes = 0, total_attributes = 0, n_default_attributes = 0; + gint i, j; + + g_return_val_if_fail (text != NULL, NULL); + + attributes = atk_text_get_run_attributes (text, offset, + &intstart_offset, &intend_offset); + + if (attributes) total_attributes = n_attributes = g_slist_length (attributes); + + if (includeDefaults) + { + default_attributes = atk_text_get_default_attributes (text); + if (default_attributes) + n_default_attributes = g_slist_length (default_attributes); + total_attributes += n_default_attributes; + } + + *startOffset = intstart_offset; + *endOffset = intend_offset; + + retval = CORBA_sequence_CORBA_string__alloc (); + retval->_length = retval->_maximum = total_attributes; + retval->_buffer = CORBA_sequence_CORBA_string_allocbuf (total_attributes); + CORBA_sequence_set_release (retval, CORBA_TRUE); + + if (total_attributes) + { + for (i = 0; i < n_attributes; ++i) + { + attr = g_slist_nth_data (attributes, i); + retval->_buffer[i] = CORBA_string_dup (g_strconcat (attr->name, ":", attr->value, NULL)); + } + + for (j = 0; j < n_default_attributes; ++i, ++j) + { + attr = g_slist_nth_data (default_attributes, j); + retval->_buffer[i] = CORBA_string_dup (g_strconcat (attr->name, ":", attr->value, NULL)); + } + + atk_attribute_set_free (attributes); + if (default_attributes) + atk_attribute_set_free (default_attributes); + } + return retval; +} + +static Accessibility_AttributeSet * +impl_getDefaultAttributeSet (PortableServer_Servant servant, + CORBA_Environment *ev){ + AtkAttributeSet *attributes; + AtkAttribute *attr = NULL; + Accessibility_AttributeSet *retval = NULL; + AtkText *text = get_text_from_servant (servant); + gint n_attributes = 0; + gint i; + + g_return_val_if_fail (text != NULL, NULL); + + attributes = atk_text_get_default_attributes (text); + + if (attributes) + { + n_attributes = g_slist_length (attributes); + + retval = CORBA_sequence_CORBA_string__alloc (); + retval->_length = retval->_maximum = n_attributes; + retval->_buffer = CORBA_sequence_CORBA_string_allocbuf (n_attributes); + CORBA_sequence_set_release (retval, CORBA_TRUE); + + for (i = 0; i < n_attributes; ++i) + { + attr = g_slist_nth_data (attributes, i); + retval->_buffer [i] = CORBA_string_dup (g_strconcat (attr->name, ":", attr->value, NULL)); + } + atk_attribute_set_free (attributes); + } + return retval; +} + + +static void +spi_text_class_init (SpiTextClass *klass) +{ + POA_Accessibility_Text__epv *epv = &klass->epv; + + /* Initialize epv table */ + + epv->getText = impl_getText; + epv->getTextAfterOffset = impl_getTextAfterOffset; + epv->getCharacterAtOffset = impl_getCharacterAtOffset; + epv->getTextAtOffset = impl_getTextAtOffset; + epv->getTextBeforeOffset = impl_getTextBeforeOffset; + epv->_get_caretOffset = impl__get_caretOffset; + epv->getAttributes = impl_getAttributes; + epv->getDefaultAttributes = impl_getDefaultAttributes; + epv->getCharacterExtents = impl_getCharacterExtents; + epv->_get_characterCount = impl__get_characterCount; + epv->getOffsetAtPoint = impl_getOffsetAtPoint; + epv->getNSelections = impl_getNSelections; + epv->getSelection = impl_getSelection; + epv->addSelection = impl_addSelection; + epv->removeSelection = impl_removeSelection; + epv->setSelection = impl_setSelection; + epv->setCaretOffset = impl_setCaretOffset; + epv->getRangeExtents = impl_getRangeExtents; + epv->getBoundedRanges = impl_getBoundedRanges; + epv->getAttributeValue = impl_getAttributeValue; + epv->getAttributeRun = impl_getAttributeRun; + epv->getDefaultAttributeSet = impl_getDefaultAttributeSet; +} + +static void +spi_text_init (SpiText *text) +{ +} + +BONOBO_TYPE_FUNC_FULL (SpiText, + Accessibility_Text, + PARENT_TYPE, + spi_text) + +void +spi_text_construct (SpiText *text, AtkObject *obj) { - Text *text = TEXT (bonobo_object_from_servant (_servant)); + spi_base_construct (SPI_BASE (text), G_OBJECT(obj)); } + +SpiText * +spi_text_interface_new (AtkObject *obj) +{ + SpiText *retval; + + g_return_val_if_fail (ATK_IS_TEXT (obj), NULL); + + retval = g_object_new (SPI_TEXT_TYPE, NULL); + + spi_text_construct (retval, obj); + + return retval; +}