1 /* ATK - The Accessibility Toolkit for GTK+
2 * Copyright 2001 Sun Microsystems Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "atkmarshal.h"
29 struct _AtkTextIfaceClass
34 typedef struct _AtkTextIfaceClass AtkTextIfaceClass;
36 static void atk_text_base_init (gpointer *g_class);
38 static guint atk_text_signals[LAST_SIGNAL] = { 0 };
43 static GType type = 0;
47 static const GTypeInfo tinfo =
49 sizeof (AtkTextIface),
50 (GBaseInitFunc) atk_text_base_init,
51 (GBaseFinalizeFunc) NULL,
52 (GClassInitFunc) NULL /* atk_text_interface_init */ ,
53 (GClassFinalizeFunc) NULL,
57 type = g_type_register_static (G_TYPE_INTERFACE, "AtkText", &tinfo, 0);
64 atk_text_base_init (gpointer *g_class)
66 static gboolean initialized = FALSE;
71 * Note that text_changed signal supports details "insert", "delete",
75 atk_text_signals[TEXT_CHANGED] =
76 g_signal_new ("text_changed",
78 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
79 G_STRUCT_OFFSET (AtkTextIface, text_changed),
80 (GSignalAccumulator) NULL, NULL,
81 atk_marshal_VOID__INT_INT,
83 2, G_TYPE_INT, G_TYPE_INT);
85 atk_text_signals[CARET_MOVED] =
86 g_signal_new ("text_caret_moved",
89 G_STRUCT_OFFSET (AtkTextIface, caret_changed),
90 (GSignalAccumulator) NULL, NULL,
91 g_cclosure_marshal_VOID__INT,
102 * @start_offset: start position
103 * @end_offset: end position
105 * Gets the specified text.
107 * Returns: the text from @start_offset up to, but not including @end_offset.
110 atk_text_get_text (AtkText *text,
116 g_return_val_if_fail (text != NULL, NULL);
117 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
119 iface = ATK_TEXT_GET_IFACE (text);
122 return (*(iface->get_text)) (text, start_offset, end_offset);
128 * atk_text_get_character_at_offset:
132 * Gets the specified text.
134 * Returns: the character at @offset.
137 atk_text_get_character_at_offset (AtkText *text,
142 g_return_val_if_fail (text != NULL, (gunichar) 0);
143 g_return_val_if_fail (ATK_IS_TEXT (text), (gunichar) 0);
145 iface = ATK_TEXT_GET_IFACE (text);
147 if (iface->get_character_at_offset)
148 return (*(iface->get_character_at_offset)) (text, offset);
154 * atk_text_get_text_after_offset:
157 * @boundary_type: An #AtkTextBoundary
158 * @startOffset: the start offset of the returned string.
159 * @endOffset: the end offset of the returned string.
161 * Gets the specified text.
162 * If the boundary type is ATK_TEXT_BOUNDARY_WORD_START or
163 * ATK_TEXT_BOUNDARY_WORD_END part of a word may be returned.
164 * If the boundary type is ATK_TEXT_BOUNDARY_SENTENCE_START the start point
165 * will be the offset and will continue to the start of the next sentence.
166 * The first word may not be a complete word. Similarly for
167 * ATK_TEXT_BOUNDARY_SENTENCE_END, ATK_TEXT_BOUNDARY_LINE_START and
168 * ATK_TEXT_BOUNDARY_LINE_END
170 * Returns: the text after @offset up to the specified @boundary_type.
173 atk_text_get_text_after_offset (AtkText *text,
175 AtkTextBoundary boundary_type,
181 g_return_val_if_fail (text != NULL, NULL);
182 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
184 iface = ATK_TEXT_GET_IFACE (text);
186 if (iface->get_text_after_offset)
187 return (*(iface->get_text_after_offset)) (text, offset, boundary_type, startOffset, endOffset);
193 * atk_text_get_text_at_offset:
196 * @boundary_type: An #AtkTextBoundary
197 * @startOffset: the start offset of the returned string.
198 * @endOffset: the end offset of the returned string.
200 * Gets the specified text.
201 * If the boundary_type is ATK_TEXT_BOUNDARY_WORD_START or
202 * ATK_TEXT_BOUNDARY_WORD_END a complete word is returned;
203 * if the boundary type is ATK_TEXT_BOUNDARY_SENTENCE_START or
204 * ATK_TEXT_BOUNDARY_SENTENCE_END a complete sentence
205 * is returned; if the boundary type is ATK_TEXT_BOUNDARY_LINE_START or
206 * ATK_TEXT_BOUNDARY_LINE_END a complete line is returned.
208 * Returns: the text at @offset up to the specified @boundary_type.
211 atk_text_get_text_at_offset (AtkText *text,
213 AtkTextBoundary boundary_type,
219 g_return_val_if_fail (text != NULL, NULL);
220 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
222 iface = ATK_TEXT_GET_IFACE (text);
224 if (iface->get_text_at_offset)
225 return (*(iface->get_text_at_offset)) (text, offset, boundary_type, startOffset, endOffset);
231 * atk_text_get_text_before_offset:
234 * @boundary_type: An #AtkTextBoundary
235 * @startOffset: the start offset of the returned string.
236 * @endOffset: the end offset of the returned string.
238 * Gets the specified text.
239 * If the boundary type is ATK_TEXT_BOUNDARY_WORD_START or
240 * ATK_TEXT_BOUNDARY_WORD_END part of a word may be returned.
241 * If the boundary type is ATK_TEXT_BOUNDARY_SENTENCE_START the start point
242 * will be at the start of the sentence, and will continue to the offset.
243 * The last word may not be a complete word. Similarly for
244 * ATK_TEXT_BOUNDARY_SENTENCE_END, ATK_TEXT_BOUNDARY_LINE_START and
245 * ATK_TEXT_BOUNDARY_LINE_END
247 * Returns: the text before @offset starting from the specified @boundary_type.
250 atk_text_get_text_before_offset (AtkText *text,
252 AtkTextBoundary boundary_type,
258 g_return_val_if_fail (text != NULL, NULL);
259 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
261 iface = ATK_TEXT_GET_IFACE (text);
263 if (iface->get_text_before_offset)
264 return (*(iface->get_text_before_offset)) (text, offset, boundary_type, startOffset, endOffset);
270 * atk_text_get_caret_offset:
273 * Gets the offset position of the caret (cursor).
275 * Returns: the offset position of the caret (cursor).
278 atk_text_get_caret_offset (AtkText *text)
282 g_return_val_if_fail (text != NULL, -1);
283 g_return_val_if_fail (ATK_IS_TEXT (text), -1);
285 iface = ATK_TEXT_GET_IFACE (text);
287 if (iface->get_caret_offset)
288 return (*(iface->get_caret_offset)) (text);
294 * atk_text_get_character_extents:
297 * @x: x-position of character
298 * @y: y-position of character
299 * @length: length of character
300 * @width: width of character
301 * @coords: specify whether coordinates are relative to the screen or widget window
303 * Given an @offset, the @x, @y, @length, and @width values are filled
307 atk_text_get_character_extents (AtkText *text,
317 g_return_if_fail (text != NULL);
318 g_return_if_fail (ATK_IS_TEXT (text));
320 iface = ATK_TEXT_GET_IFACE (text);
322 if (iface->get_character_extents)
323 (*(iface->get_character_extents)) (text, offset, x, y, length, width, coords);
334 *atk_text_ref_run_attributes:
336 *@offset: the offset at which to get the attributes
337 *@start_offset: the address to put the start offset of the range
338 *@end_offset: the address to put the end offset of the range
340 *Creates an #AtkAttributeSet which consists of the attributes explicitly
341 *set at the position @offset in the text. @start_offset and @end_offset are
342 *set to the start and end of the range around @offset where the attributes are
343 *invariant. See the ATK_ATTRIBUTE macros, such as #ATK_ATTRIBUTE_LEFT_MARGIN
344 *for types of text attributes that can be returned. Note that other
345 *attributes that do not have corresponding macros may also be returned.
347 *Returns: an #AtkAttributeSet which contains the attributes explicitly set
350 AtkAttributeSet* atk_text_ref_run_attributes (AtkText *text,
357 g_return_val_if_fail (text != NULL, NULL);
358 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
360 iface = ATK_TEXT_GET_IFACE (text);
362 if (iface->ref_run_attributes)
363 return (*(iface->ref_run_attributes)) (text, offset, start_offset, end_offset);
369 * atk_text_get_character_count:
372 * Gets the character count.
374 * Returns: the number of characters.
377 atk_text_get_character_count (AtkText *text)
381 g_return_val_if_fail (text != NULL, -1);
382 g_return_val_if_fail (ATK_IS_TEXT (text), -1);
384 iface = ATK_TEXT_GET_IFACE (text);
386 if (iface->get_character_count)
387 return (*(iface->get_character_count)) (text);
393 * atk_text_get_offset_at_point:
395 * @x: screen x-position of character
396 * @y: screen y-position of character
397 * @coords: specify whether coordinates are relative to the screen or
400 * Gets the offset of the character located at coordinates @x and @y. @x and @y
401 * are interpreted as being relative to the screen or this widget's window
402 * depending on @coords.
404 * Returns: the offset to the character which is located at
405 * the specified @x and @y coordinates.
408 atk_text_get_offset_at_point (AtkText *text,
415 g_return_val_if_fail (text != NULL, -1);
416 g_return_val_if_fail (ATK_IS_TEXT (text), -1);
418 iface = ATK_TEXT_GET_IFACE (text);
420 if (iface->get_offset_at_point)
421 return (*(iface->get_offset_at_point)) (text, x, y, coords);
427 * atk_text_get_n_selections:
430 * Gets the number of selected regions.
432 * Returns: The number of selected regions, or -1 if a failure
436 atk_text_get_n_selections (AtkText *text)
440 g_return_val_if_fail (text != NULL, -1);
441 g_return_val_if_fail (ATK_IS_TEXT (text), -1);
443 iface = ATK_TEXT_GET_IFACE (text);
445 if (iface->get_n_selections)
446 return (*(iface->get_n_selections)) (text);
452 * atk_text_get_selection:
454 * @selection_num: The selection number. The selected regions are
455 * assigned numbers that correspond to how far the region is from the
456 * start of the text. The selected region closest to the beginning
457 * of the text region is assigned the number 0, etc. Note that adding,
458 * moving or deleting a selected region can change the numbering.
459 * @start_offset: passes back the start position of the selected region
460 * @end_offset: passes back the end position of the selected region
462 * Gets the text from the specified selection.
464 * Returns: the selected text.
467 atk_text_get_selection (AtkText *text, gint selection_num,
468 gint *start_offset, gint *end_offset)
472 g_return_val_if_fail (text != NULL, NULL);
473 g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
475 iface = ATK_TEXT_GET_IFACE (text);
477 if (iface->get_selection)
479 return (*(iface->get_selection)) (text, selection_num,
480 start_offset, end_offset);
487 * atk_text_add_selection:
489 * @start_offset: the start position of the selected region
490 * @end_offset: the end position of the selected region
492 * Adds a selection bounded by the specified offsets.
494 * Returns: %TRUE if success, %FALSE otherwise
497 atk_text_add_selection (AtkText *text, gint start_offset,
502 g_return_val_if_fail (text != NULL, FALSE);
503 g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
505 iface = ATK_TEXT_GET_IFACE (text);
507 if (iface->add_selection)
508 return (*(iface->add_selection)) (text, start_offset, end_offset);
514 * atk_text_remove_selection:
516 * @selection_num: The selection number. The selected regions are
517 * assigned numbers that correspond to how far the region is from the
518 * start of the text. The selected region closest to the beginning
519 * of the text region is assigned the number 0, etc. Note that adding,
520 * moving or deleting a selected region can change the numbering.
522 * Removes the specified selection.
524 * Returns: %TRUE if success, %FALSE otherwise
527 atk_text_remove_selection (AtkText *text, gint selection_num)
531 g_return_val_if_fail (text != NULL, FALSE);
532 g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
534 iface = ATK_TEXT_GET_IFACE (text);
536 if (iface->remove_selection)
537 return (*(iface->remove_selection)) (text, selection_num);
543 * atk_text_set_selection:
545 * @selection_num: The selection number. The selected regions are
546 * assigned numbers that correspond to how far the region is from the
547 * start of the text. The selected region closest to the beginning
548 * of the text region is assigned the number 0, etc. Note that adding,
549 * moving or deleting a selected region can change the numbering.
550 * @start_offset: the new start position of the selection
551 * @end_offset: the new end position of the selection
553 * Changes the start and end offset of the specified selection.
555 * Returns: %TRUE if success, %FALSE otherwise
558 atk_text_set_selection (AtkText *text, gint selection_num,
559 gint start_offset, gint end_offset)
563 g_return_val_if_fail (text != NULL, FALSE);
564 g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
566 iface = ATK_TEXT_GET_IFACE (text);
568 if (iface->set_selection)
570 return (*(iface->set_selection)) (text, selection_num,
571 start_offset, end_offset);
578 * atk_text_set_caret_offset:
582 * Sets the caret (cursor) position to the specified @offset.
584 * Returns: %TRUE if success, %FALSE otherwise.
587 atk_text_set_caret_offset (AtkText *text,
592 g_return_val_if_fail (text != NULL, FALSE);
593 g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
595 iface = ATK_TEXT_GET_IFACE (text);
597 if (iface->set_caret_offset)
599 return (*(iface->set_caret_offset)) (text, offset);
608 * AtkAttributeSet_free:
609 * @attrib_set: The #AtkAttributeSet to free
611 * Frees the memory used by an #AtkAttributeSet, including all its
615 AtkAttributeSet_free(AtkAttributeSet *attrib_set)
619 if (attrib_set == NULL)
622 for (index = 0; index < g_slist_length(attrib_set); index++)
624 g_free(((AtkAttribute*) (g_slist_nth(attrib_set,index)->data))->name);
625 g_free(((AtkAttribute*) (g_slist_nth(attrib_set,index)->data))->value);
627 g_slist_free(attrib_set);