1 /* ATK - The Accessibility Toolkit for GTK+
2  * Copyright 2001 Sun Microsystems Inc.
3  *
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.
8  *
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.
13  *
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.
18  */
19 
20 #ifndef __ATK_TEXT_H__
21 #define __ATK_TEXT_H__
22 
23 #if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined (__ATK_H_INSIDE__) && !defined (ATK_COMPILATION)
24 #error "Only <atk/atk.h> can be included directly."
25 #endif
26 
27 #include <glib-object.h>
28 #include <atk/atkobject.h>
29 #include <atk/atkutil.h>
30 #include <atk/atkcomponent.h>
31 
32 G_BEGIN_DECLS
33 
34 /**
35  *AtkTextAttribute:
36  *@ATK_TEXT_ATTR_INVALID: Invalid attribute, like bad spelling or grammar.
37  *@ATK_TEXT_ATTR_LEFT_MARGIN: The pixel width of the left margin
38  *@ATK_TEXT_ATTR_RIGHT_MARGIN: The pixel width of the right margin
39  *@ATK_TEXT_ATTR_INDENT: The number of pixels that the text is indented
40  *@ATK_TEXT_ATTR_INVISIBLE: Either "true" or "false" indicating whether text is visible or not
41  *@ATK_TEXT_ATTR_EDITABLE: Either "true" or "false" indicating whether text is editable or not
42  *@ATK_TEXT_ATTR_PIXELS_ABOVE_LINES: Pixels of blank space to leave above each newline-terminated line.
43  *@ATK_TEXT_ATTR_PIXELS_BELOW_LINES: Pixels of blank space to leave below each newline-terminated line.
44  *@ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP: Pixels of blank space to leave between wrapped lines inside the same newline-terminated line (paragraph).
45  *@ATK_TEXT_ATTR_BG_FULL_HEIGHT: "true" or "false" whether to make the background color for each character the height of the highest font used on the current line, or the height of the font used for the current character.
46  *@ATK_TEXT_ATTR_RISE: Number of pixels that the characters are risen above the baseline. See also ATK_TEXT_ATTR_TEXT_POSITION.
47  *@ATK_TEXT_ATTR_UNDERLINE: "none", "single", "double", "low", or "error"
48  *@ATK_TEXT_ATTR_STRIKETHROUGH: "true" or "false" whether the text is strikethrough
49  *@ATK_TEXT_ATTR_SIZE: The size of the characters in points. eg: 10
50  *@ATK_TEXT_ATTR_SCALE: The scale of the characters. The value is a string representation of a double
51  *@ATK_TEXT_ATTR_WEIGHT: The weight of the characters.
52  *@ATK_TEXT_ATTR_LANGUAGE: The language used
53  *@ATK_TEXT_ATTR_FAMILY_NAME: The font family name
54  *@ATK_TEXT_ATTR_BG_COLOR: The background color. The value is an RGB value of the format "%u,%u,%u"
55  *@ATK_TEXT_ATTR_FG_COLOR:The foreground color. The value is an RGB value of the format "%u,%u,%u"
56  *@ATK_TEXT_ATTR_BG_STIPPLE: "true" if a #GdkBitmap is set for stippling the background color.
57  *@ATK_TEXT_ATTR_FG_STIPPLE: "true" if a #GdkBitmap is set for stippling the foreground color.
58  *@ATK_TEXT_ATTR_WRAP_MODE: The wrap mode of the text, if any. Values are "none", "char", "word", or "word_char".
59  *@ATK_TEXT_ATTR_DIRECTION: The direction of the text, if set. Values are "none", "ltr" or "rtl"
60  *@ATK_TEXT_ATTR_JUSTIFICATION: The justification of the text, if set. Values are "left", "right", "center" or "fill"
61  *@ATK_TEXT_ATTR_STRETCH: The stretch of the text, if set. Values are "ultra_condensed", "extra_condensed", "condensed", "semi_condensed", "normal", "semi_expanded", "expanded", "extra_expanded" or "ultra_expanded"
62  *@ATK_TEXT_ATTR_VARIANT: The capitalization variant of the text, if set. Values are "normal" or "small_caps"
63  *@ATK_TEXT_ATTR_STYLE: The slant style of the text, if set. Values are "normal", "oblique" or "italic"
64  *@ATK_TEXT_ATTR_TEXT_POSITION: The vertical position with respect to the baseline. Values are "baseline", "super", or "sub". Note that a super or sub text attribute refers to position with respect to the baseline of the prior character.
65  *@ATK_TEXT_ATTR_LAST_DEFINED: not a valid text attribute, used for finding end of enumeration
66  *
67  * Describes the text attributes supported
68  **/
69 typedef enum
70 {
71   ATK_TEXT_ATTR_INVALID = 0,
72   ATK_TEXT_ATTR_LEFT_MARGIN,
73   ATK_TEXT_ATTR_RIGHT_MARGIN,
74   ATK_TEXT_ATTR_INDENT,
75   ATK_TEXT_ATTR_INVISIBLE,
76   ATK_TEXT_ATTR_EDITABLE,
77   ATK_TEXT_ATTR_PIXELS_ABOVE_LINES,
78   ATK_TEXT_ATTR_PIXELS_BELOW_LINES,
79   ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP,
80   ATK_TEXT_ATTR_BG_FULL_HEIGHT,
81   ATK_TEXT_ATTR_RISE,
82   ATK_TEXT_ATTR_UNDERLINE,
83   ATK_TEXT_ATTR_STRIKETHROUGH,
84   ATK_TEXT_ATTR_SIZE,
85   ATK_TEXT_ATTR_SCALE,
86   ATK_TEXT_ATTR_WEIGHT,
87   ATK_TEXT_ATTR_LANGUAGE,
88   ATK_TEXT_ATTR_FAMILY_NAME,
89   ATK_TEXT_ATTR_BG_COLOR,
90   ATK_TEXT_ATTR_FG_COLOR,
91   ATK_TEXT_ATTR_BG_STIPPLE,
92   ATK_TEXT_ATTR_FG_STIPPLE,
93   ATK_TEXT_ATTR_WRAP_MODE,
94   ATK_TEXT_ATTR_DIRECTION,
95   ATK_TEXT_ATTR_JUSTIFICATION,
96   ATK_TEXT_ATTR_STRETCH,
97   ATK_TEXT_ATTR_VARIANT,
98   ATK_TEXT_ATTR_STYLE,
99   ATK_TEXT_ATTR_TEXT_POSITION,
100   ATK_TEXT_ATTR_LAST_DEFINED
101 } AtkTextAttribute;
102 
103 ATK_AVAILABLE_IN_ALL
104 AtkTextAttribute         atk_text_attribute_register   (const gchar *name);
105 
106 
107 #define ATK_TYPE_TEXT                    (atk_text_get_type ())
108 #define ATK_IS_TEXT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_TEXT)
109 #define ATK_TEXT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_TEXT, AtkText)
110 #define ATK_TEXT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_TEXT, AtkTextIface))
111 
112 #ifndef _TYPEDEF_ATK_TEXT_
113 #define _TYPEDEF_ATK_TEXT_
114 typedef struct _AtkText AtkText;
115 #endif
116 typedef struct _AtkTextIface AtkTextIface;
117 
118 
119 /**
120  *AtkTextBoundary:
121  *@ATK_TEXT_BOUNDARY_CHAR: Boundary is the boundary between characters
122  * (including non-printing characters)
123  *@ATK_TEXT_BOUNDARY_WORD_START: Boundary is the start (i.e. first character) of a word.
124  *@ATK_TEXT_BOUNDARY_WORD_END: Boundary is the end (i.e. last
125  * character) of a word.
126  *@ATK_TEXT_BOUNDARY_SENTENCE_START: Boundary is the first character in a sentence.
127  *@ATK_TEXT_BOUNDARY_SENTENCE_END: Boundary is the last (terminal)
128  * character in a sentence; in languages which use "sentence stop"
129  * punctuation such as English, the boundary is thus the '.', '?', or
130  * similar terminal punctuation character.
131  *@ATK_TEXT_BOUNDARY_LINE_START: Boundary is the initial character of the content or a
132  * character immediately following a newline, linefeed, or return character.
133  *@ATK_TEXT_BOUNDARY_LINE_END: Boundary is the linefeed, or return
134  * character.
135  *
136  * Text boundary types used for specifying boundaries for regions of text.
137  * This enumeration is deprecated since 2.9.4 and should not be used. Use
138  * AtkTextGranularity with #atk_text_get_string_at_offset instead.
139  **/
140 typedef enum {
141   ATK_TEXT_BOUNDARY_CHAR,
142   ATK_TEXT_BOUNDARY_WORD_START,
143   ATK_TEXT_BOUNDARY_WORD_END,
144   ATK_TEXT_BOUNDARY_SENTENCE_START,
145   ATK_TEXT_BOUNDARY_SENTENCE_END,
146   ATK_TEXT_BOUNDARY_LINE_START,
147   ATK_TEXT_BOUNDARY_LINE_END
148 } AtkTextBoundary;
149 
150 /**
151  *AtkTextGranularity:
152  *@ATK_TEXT_GRANULARITY_CHAR: Granularity is defined by the boundaries between characters
153  * (including non-printing characters)
154  *@ATK_TEXT_GRANULARITY_WORD: Granularity is defined by the boundaries of a word,
155  * starting at the beginning of the current word and finishing at the beginning of
156  * the following one, if present.
157  *@ATK_TEXT_GRANULARITY_SENTENCE: Granularity is defined by the boundaries of a sentence,
158  * starting at the beginning of the current sentence and finishing at the beginning of
159  * the following one, if present.
160  *@ATK_TEXT_GRANULARITY_LINE: Granularity is defined by the boundaries of a line,
161  * starting at the beginning of the current line and finishing at the beginning of
162  * the following one, if present.
163  *@ATK_TEXT_GRANULARITY_PARAGRAPH: Granularity is defined by the boundaries of a paragraph,
164  * starting at the beginning of the current paragraph and finishing at the beginning of
165  * the following one, if present.
166  *
167  * Text granularity types used for specifying the granularity of the region of
168  * text we are interested in.
169  **/
170 typedef enum {
171   ATK_TEXT_GRANULARITY_CHAR,
172   ATK_TEXT_GRANULARITY_WORD,
173   ATK_TEXT_GRANULARITY_SENTENCE,
174   ATK_TEXT_GRANULARITY_LINE,
175   ATK_TEXT_GRANULARITY_PARAGRAPH
176 } AtkTextGranularity;
177 
178 /**
179  * AtkTextRectangle:
180  * @x: The horizontal coordinate of a rectangle
181  * @y: The vertical coordinate of a rectangle
182  * @width: The width of a rectangle
183  * @height: The height of a rectangle
184  *
185  * A structure used to store a rectangle used by AtkText.
186  **/
187 
188 typedef struct _AtkTextRectangle AtkTextRectangle;
189 
190 struct _AtkTextRectangle {
191   gint x;
192   gint y;
193   gint width;
194   gint height;
195 };
196 
197 /**
198  * AtkTextRange:
199  * @bounds: A rectangle giving the bounds of the text range
200  * @start_offset: The start offset of a AtkTextRange
201  * @end_offset: The end offset of a AtkTextRange
202  * @content: The text in the text range
203  *
204  * A structure used to describe a text range.
205  **/
206 typedef struct _AtkTextRange AtkTextRange;
207 
208 struct _AtkTextRange {
209   AtkTextRectangle bounds;
210   gint start_offset;
211   gint end_offset;
212   gchar* content;
213 };
214 
215 ATK_AVAILABLE_IN_ALL
216 GType atk_text_range_get_type (void);
217 
218 /**
219  *AtkTextClipType:
220  *@ATK_TEXT_CLIP_NONE: No clipping to be done
221  *@ATK_TEXT_CLIP_MIN: Text clipped by min coordinate is omitted
222  *@ATK_TEXT_CLIP_MAX: Text clipped by max coordinate is omitted
223  *@ATK_TEXT_CLIP_BOTH: Only text fully within mix/max bound is retained
224  *
225  *Describes the type of clipping required.
226  **/
227 typedef enum {
228     ATK_TEXT_CLIP_NONE,
229     ATK_TEXT_CLIP_MIN,
230     ATK_TEXT_CLIP_MAX,
231     ATK_TEXT_CLIP_BOTH
232 } AtkTextClipType;
233 
234 /**
235  * AtkTextIface:
236  * @get_text_after_offset: Gets specified text. This virtual function
237  *   is deprecated and it should not be overridden.
238  * @get_text_at_offset: Gets specified text. This virtual function
239  *   is deprecated and it should not be overridden.
240  * @get_text_before_offset: Gets specified text. This virtual function
241  *   is deprecated and it should not be overridden.
242  * @get_string_at_offset: Gets a portion of the text exposed through
243  *   an AtkText according to a given offset and a specific
244  *   granularity, along with the start and end offsets defining the
245  *   boundaries of such a portion of text.
246  * @text_changed: the signal handler which is executed when there is a
247  *   text change. This virtual function is deprecated sice 2.9.4 and
248  *   it should not be overriden.
249  */
250 struct _AtkTextIface
251 {
252   GTypeInterface parent;
253 
254   gchar*         (* get_text)                     (AtkText          *text,
255                                                    gint             start_offset,
256                                                    gint             end_offset);
257   gchar*         (* get_text_after_offset)        (AtkText          *text,
258                                                    gint             offset,
259                                                    AtkTextBoundary  boundary_type,
260 						   gint             *start_offset,
261 						   gint             *end_offset);
262   gchar*         (* get_text_at_offset)           (AtkText          *text,
263                                                    gint             offset,
264                                                    AtkTextBoundary  boundary_type,
265 						   gint             *start_offset,
266 						   gint             *end_offset);
267   gunichar       (* get_character_at_offset)      (AtkText          *text,
268                                                    gint             offset);
269   gchar*         (* get_text_before_offset)       (AtkText          *text,
270                                                    gint             offset,
271                                                    AtkTextBoundary  boundary_type,
272  						   gint             *start_offset,
273 						   gint             *end_offset);
274   gint           (* get_caret_offset)             (AtkText          *text);
275   AtkAttributeSet* (* get_run_attributes)         (AtkText	    *text,
276 						   gint	  	    offset,
277 						   gint             *start_offset,
278 						   gint	 	    *end_offset);
279   AtkAttributeSet* (* get_default_attributes)     (AtkText	    *text);
280   void           (* get_character_extents)        (AtkText          *text,
281                                                    gint             offset,
282                                                    gint             *x,
283                                                    gint             *y,
284                                                    gint             *width,
285                                                    gint             *height,
286                                                    AtkCoordType	    coords);
287   gint           (* get_character_count)          (AtkText          *text);
288   gint           (* get_offset_at_point)          (AtkText          *text,
289                                                    gint             x,
290                                                    gint             y,
291                                                    AtkCoordType	    coords);
292   gint		 (* get_n_selections)		  (AtkText          *text);
293   gchar*         (* get_selection)	          (AtkText          *text,
294 						   gint		    selection_num,
295 						   gint		    *start_offset,
296 						   gint		    *end_offset);
297   gboolean       (* add_selection)		  (AtkText          *text,
298 						   gint		    start_offset,
299 						   gint		    end_offset);
300   gboolean       (* remove_selection)		  (AtkText          *text,
301 						   gint             selection_num);
302   gboolean       (* set_selection)		  (AtkText          *text,
303 						   gint		    selection_num,
304 						   gint		    start_offset,
305 						   gint		    end_offset);
306   gboolean       (* set_caret_offset)             (AtkText          *text,
307                                                    gint             offset);
308 
309   /*
310    * signal handlers
311    */
312   void		 (* text_changed)                 (AtkText          *text,
313                                                    gint             position,
314                                                    gint             length);
315   void           (* text_caret_moved)             (AtkText          *text,
316                                                    gint             location);
317   void           (* text_selection_changed)       (AtkText          *text);
318 
319   void           (* text_attributes_changed)      (AtkText          *text);
320 
321 
322   void           (* get_range_extents)            (AtkText          *text,
323                                                    gint             start_offset,
324                                                    gint             end_offset,
325                                                    AtkCoordType     coord_type,
326                                                    AtkTextRectangle *rect);
327 
328   AtkTextRange** (* get_bounded_ranges)           (AtkText          *text,
329                                                    AtkTextRectangle *rect,
330                                                    AtkCoordType     coord_type,
331                                                    AtkTextClipType  x_clip_type,
332                                                    AtkTextClipType  y_clip_type);
333 
334   gchar*         (* get_string_at_offset)         (AtkText            *text,
335                                                    gint               offset,
336                                                    AtkTextGranularity granularity,
337                                                    gint               *start_offset,
338                                                    gint               *end_offset);
339   /*
340    * Scrolls this text range so it becomes visible on the screen.
341    *
342    * scroll_substring_to lets the implementation compute an appropriate target
343    * position on the screen, with type used as a positioning hint.
344    *
345    * scroll_substring_to_point lets the client specify a precise target position
346    * on the screen for the top-left of the substring.
347    *
348    * Since ATK 2.32
349    */
350   gboolean       (* scroll_substring_to)          (AtkText          *text,
351                                                    gint             start_offset,
352                                                    gint             end_offset,
353                                                    AtkScrollType    type);
354   gboolean       (* scroll_substring_to_point)    (AtkText          *text,
355                                                    gint             start_offset,
356                                                    gint             end_offset,
357                                                    AtkCoordType     coords,
358                                                    gint             x,
359                                                    gint             y);
360 };
361 
362 ATK_AVAILABLE_IN_ALL
363 GType            atk_text_get_type (void);
364 
365 
366 /*
367  * Additional AtkObject properties used by AtkText:
368  *    "accessible_text" (accessible text has changed)
369  *    "accessible_caret" (accessible text cursor position changed:
370  *                         editable text only)
371  */
372 
373 ATK_AVAILABLE_IN_ALL
374 gchar*        atk_text_get_text                           (AtkText          *text,
375                                                            gint             start_offset,
376                                                            gint             end_offset);
377 ATK_AVAILABLE_IN_ALL
378 gunichar      atk_text_get_character_at_offset            (AtkText          *text,
379                                                            gint             offset);
380 ATK_DEPRECATED_IN_2_10_FOR(atk_text_get_string_at_offset)
381 gchar*        atk_text_get_text_after_offset              (AtkText          *text,
382                                                            gint             offset,
383                                                            AtkTextBoundary  boundary_type,
384 							   gint             *start_offset,
385 							   gint	            *end_offset);
386 ATK_DEPRECATED_IN_2_10_FOR(atk_text_get_string_at_offset)
387 gchar*        atk_text_get_text_at_offset                 (AtkText          *text,
388                                                            gint             offset,
389                                                            AtkTextBoundary  boundary_type,
390 							   gint             *start_offset,
391 							   gint             *end_offset);
392 ATK_DEPRECATED_IN_2_10_FOR(atk_text_get_string_at_offset)
393 gchar*        atk_text_get_text_before_offset             (AtkText          *text,
394                                                            gint             offset,
395                                                            AtkTextBoundary  boundary_type,
396 							   gint             *start_offset,
397 							   gint	            *end_offset);
398 ATK_AVAILABLE_IN_2_10
399 gchar*        atk_text_get_string_at_offset               (AtkText            *text,
400                                                            gint               offset,
401                                                            AtkTextGranularity granularity,
402                                                            gint               *start_offset,
403                                                            gint               *end_offset);
404 ATK_AVAILABLE_IN_ALL
405 gint          atk_text_get_caret_offset                   (AtkText          *text);
406 ATK_AVAILABLE_IN_ALL
407 void          atk_text_get_character_extents              (AtkText          *text,
408                                                            gint             offset,
409                                                            gint             *x,
410                                                            gint             *y,
411                                                            gint             *width,
412                                                            gint             *height,
413                                                            AtkCoordType	    coords);
414 ATK_AVAILABLE_IN_ALL
415 AtkAttributeSet* atk_text_get_run_attributes              (AtkText	    *text,
416 						           gint	  	    offset,
417 						           gint             *start_offset,
418 						           gint	 	    *end_offset);
419 ATK_AVAILABLE_IN_ALL
420 AtkAttributeSet* atk_text_get_default_attributes          (AtkText	    *text);
421 ATK_AVAILABLE_IN_ALL
422 gint          atk_text_get_character_count                (AtkText          *text);
423 ATK_AVAILABLE_IN_ALL
424 gint          atk_text_get_offset_at_point                (AtkText          *text,
425                                                            gint             x,
426                                                            gint             y,
427                                                            AtkCoordType	    coords);
428 ATK_AVAILABLE_IN_ALL
429 gint          atk_text_get_n_selections			  (AtkText          *text);
430 ATK_AVAILABLE_IN_ALL
431 gchar*        atk_text_get_selection			  (AtkText          *text,
432 							   gint		    selection_num,
433 							   gint             *start_offset,
434 							   gint             *end_offset);
435 ATK_AVAILABLE_IN_ALL
436 gboolean      atk_text_add_selection                      (AtkText          *text,
437 							   gint             start_offset,
438 							   gint             end_offset);
439 ATK_AVAILABLE_IN_ALL
440 gboolean      atk_text_remove_selection                   (AtkText          *text,
441 							   gint		    selection_num);
442 ATK_AVAILABLE_IN_ALL
443 gboolean      atk_text_set_selection                      (AtkText          *text,
444 							   gint		    selection_num,
445 							   gint             start_offset,
446 							   gint             end_offset);
447 ATK_AVAILABLE_IN_ALL
448 gboolean      atk_text_set_caret_offset                   (AtkText          *text,
449                                                            gint             offset);
450 ATK_AVAILABLE_IN_ALL
451 void          atk_text_get_range_extents                  (AtkText          *text,
452 
453                                                            gint             start_offset,
454                                                            gint             end_offset,
455                                                            AtkCoordType     coord_type,
456                                                            AtkTextRectangle *rect);
457 ATK_AVAILABLE_IN_ALL
458 AtkTextRange**  atk_text_get_bounded_ranges               (AtkText          *text,
459                                                            AtkTextRectangle *rect,
460                                                            AtkCoordType     coord_type,
461                                                            AtkTextClipType  x_clip_type,
462                                                            AtkTextClipType  y_clip_type);
463 ATK_AVAILABLE_IN_ALL
464 void          atk_text_free_ranges                        (AtkTextRange     **ranges);
465 ATK_AVAILABLE_IN_ALL
466 void 	      atk_attribute_set_free                      (AtkAttributeSet  *attrib_set);
467 ATK_AVAILABLE_IN_ALL
468 const gchar*  atk_text_attribute_get_name                 (AtkTextAttribute attr);
469 ATK_AVAILABLE_IN_ALL
470 AtkTextAttribute       atk_text_attribute_for_name        (const gchar      *name);
471 ATK_AVAILABLE_IN_ALL
472 const gchar*  atk_text_attribute_get_value                (AtkTextAttribute attr,
473                                                            gint             index_);
474 
475 ATK_AVAILABLE_IN_ALL
476 gboolean      atk_text_scroll_substring_to                (AtkText          *text,
477                                                            gint             start_offset,
478                                                            gint             end_offset,
479                                                            AtkScrollType    type);
480 
481 ATK_AVAILABLE_IN_ALL
482 gboolean      atk_text_scroll_substring_to_point          (AtkText          *text,
483                                                            gint             start_offset,
484                                                            gint             end_offset,
485                                                            AtkCoordType     coords,
486                                                            gint             x,
487                                                            gint             y);
488 
489 G_END_DECLS
490 
491 #endif /* __ATK_TEXT_H__ */
492