- GSList *range_list = NULL;
- SpiTextRect clip;
- int startOffset = 0, endOffset = atk_text_get_character_count (text);
- int curr_offset;
- gint minLineStart, minLineEnd, maxLineStart, maxLineEnd;
- long bounds_min_offset;
- long bounds_max_offset;
-
- clip.x = x;
- clip.y = y;
- clip.w = width;
- clip.h = height;
-
- /* for horizontal text layouts, at least, the following check helps. */
- bounds_min_offset = atk_text_get_offset_at_point (text, x, y,
- (AtkCoordType) coordType);
- bounds_max_offset = atk_text_get_offset_at_point (text, x + width, y + height,
- (AtkCoordType) coordType);
- atk_text_get_text_at_offset (text, bounds_min_offset,
- ATK_TEXT_BOUNDARY_LINE_START,
- &minLineStart, &minLineEnd);
- atk_text_get_text_at_offset (text, bounds_max_offset,
- ATK_TEXT_BOUNDARY_LINE_START,
- &maxLineStart, &maxLineEnd);
- startOffset = MIN (minLineStart, maxLineStart);
- endOffset = MAX (minLineEnd, maxLineEnd);
-
- curr_offset = startOffset;
-
- while (curr_offset < endOffset)
- {
- int offset = startOffset;
- SpiTextRect cbounds;
- while (curr_offset < endOffset)
- {
- atk_text_get_character_extents (text, curr_offset,
- &cbounds.x, &cbounds.y,
- &cbounds.w, &cbounds.h,
- (AtkCoordType) coordType);
- if (!_spi_bounds_contain (&clip, &cbounds, xClipType, yClipType))
- break;
- curr_offset++;
- }
- /* add the range to our list */
- if (curr_offset > offset)
- {
- Accessibility_Text_Range *range = g_malloc (sizeof (Accessibility_Text_Range));
- char *s;
- range->startOffset = offset;
- range->endOffset = curr_offset;
- s = atk_text_get_text (text, offset, curr_offset);
- range->content = CORBA_string_dup (s ? s : "");
- range_list = g_slist_append (range_list, range);
- offset = curr_offset;
- }
- offset++;
- }
- return _spi_text_range_seq_from_gslist (range_list); /* frees the GSList too */
+ 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;