Make AtkRelation and AtkRelationSet into GObjects.
[platform/upstream/atk.git] / atk / atktext.c
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 #include "atktext.h"
21
22 struct _AtkTextIfaceClass
23 {
24   GObjectClass parent;
25 };
26
27 typedef struct _AtkTextIfaceClass AtkTextIfaceClass;
28
29
30 GType
31 atk_text_get_type ()
32 {
33   static GType type = 0;
34
35   if (!type) {
36     static const GTypeInfo tinfo =
37     {
38       sizeof (AtkTextIface),
39       NULL,
40       NULL,
41
42     };
43
44     type = g_type_register_static (G_TYPE_INTERFACE, "AtkText", &tinfo, 0);
45   }
46
47   return type;
48 }
49
50 gchar*
51 atk_text_get_text (AtkText      *text,
52                    gint         start_offset,
53                    gint         end_offset)
54 {
55   AtkTextIface *iface;
56
57   g_return_val_if_fail (text != NULL, NULL);
58   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
59
60   iface = ATK_TEXT_GET_IFACE (text);
61
62   if (iface->get_text)
63     return (*(iface->get_text)) (text, start_offset, end_offset);
64   else
65     return NULL;
66 }
67
68 gunichar
69 atk_text_get_character_at_offset (AtkText      *text,
70                                   gint         offset)
71 {
72   AtkTextIface *iface;
73
74   g_return_val_if_fail (text != NULL, (gunichar) 0);
75   g_return_val_if_fail (ATK_IS_TEXT (text), (gunichar) 0);
76
77   iface = ATK_TEXT_GET_IFACE (text);
78
79   if (iface->get_character_at_offset)
80     return (*(iface->get_character_at_offset)) (text, offset);
81   else
82     return (gunichar) 0;
83 }
84
85 gchar*
86 atk_text_get_text_after_offset (AtkText          *text,
87                                 gint             offset,
88                                 AtkTextBoundary  boundary_type)
89 {
90   AtkTextIface *iface;
91
92   g_return_val_if_fail (text != NULL, NULL);
93   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
94
95   iface = ATK_TEXT_GET_IFACE (text);
96
97   if (iface->get_text_after_offset)
98     return (*(iface->get_text_after_offset)) (text, offset, boundary_type);
99   else
100     return NULL;
101 }
102
103 gchar*
104 atk_text_get_text_at_offset (AtkText          *text,
105                              gint             offset,
106                              AtkTextBoundary  boundary_type)
107 {
108   AtkTextIface *iface;
109
110   g_return_val_if_fail (text != NULL, NULL);
111   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
112
113   iface = ATK_TEXT_GET_IFACE (text);
114
115   if (iface->get_text_at_offset)
116     return (*(iface->get_text_at_offset)) (text, offset, boundary_type);
117   else
118     return NULL;
119 }
120
121 gchar*
122 atk_text_get_text_before_offset (AtkText          *text,
123                                  gint             offset,
124                                  AtkTextBoundary  boundary_type)
125 {
126   AtkTextIface *iface;
127
128   g_return_val_if_fail (text != NULL, NULL);
129   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
130
131   iface = ATK_TEXT_GET_IFACE (text);
132
133   if (iface->get_text_before_offset)
134     return (*(iface->get_text_before_offset)) (text, offset, boundary_type);
135   else
136     return NULL;
137 }
138
139 gint
140 atk_text_get_caret_offset (AtkText *text)
141 {
142   AtkTextIface *iface;
143
144   g_return_val_if_fail (text != NULL, -1);
145   g_return_val_if_fail (ATK_IS_TEXT (text), -1);
146
147   iface = ATK_TEXT_GET_IFACE (text);
148
149   if (iface->get_caret_offset)
150     return (*(iface->get_caret_offset)) (text);
151   else
152     return -1;
153 }
154
155 void
156 atk_text_get_row_col_at_offset (AtkText *text,
157                                 gint offset,
158                                 gint *row,
159                                 gint *col)
160 {
161   AtkTextIface *iface;
162
163   g_return_if_fail (text != NULL);
164   g_return_if_fail (ATK_IS_TEXT (text));
165
166   iface = ATK_TEXT_GET_IFACE (text);
167
168   if (iface->get_row_col_at_offset)
169     (*(iface->get_row_col_at_offset)) (text, offset, row, col);
170   else
171     {
172       *row = 0;
173       *col = 0;
174     }
175 }
176
177 PangoAttrList*
178 atk_text_get_range_attributes (AtkText *text,
179                                gint start_offset,
180                                gint end_offset)
181 {
182   AtkTextIface *iface;
183
184   g_return_val_if_fail (text != NULL, NULL);
185   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
186
187   iface = ATK_TEXT_GET_IFACE (text);
188
189   if (iface->get_range_attributes)
190     return (*(iface->get_range_attributes)) (text, start_offset, end_offset);
191   else
192     return NULL;
193 }
194
195 void
196 atk_text_get_character_extents (AtkText *text,
197                                 gint offset,
198                                 gint *x,
199                                 gint *y,
200                                 gint *length,
201                                 gint *width)
202 {
203   AtkTextIface *iface;
204
205   g_return_if_fail (text != NULL);
206   g_return_if_fail (ATK_IS_TEXT (text));
207
208   iface = ATK_TEXT_GET_IFACE (text);
209
210   if (iface->get_character_extents)
211     (*(iface->get_character_extents)) (text, offset, x, y, length, width);
212   else
213     {
214       *x = 0;
215       *x = 0;
216       *length = 0;
217       *width = 0;
218     }
219 }
220
221 gint
222 atk_text_get_character_count (AtkText *text)
223 {
224   AtkTextIface *iface;
225
226   g_return_val_if_fail (text != NULL, -1);
227   g_return_val_if_fail (ATK_IS_TEXT (text), -1);
228
229   iface = ATK_TEXT_GET_IFACE (text);
230
231   if (iface->get_character_count)
232     return (*(iface->get_character_count)) (text);
233   else
234     return -1;
235 }
236
237 gint
238 atk_text_get_offset_at_point (AtkText *text,
239                               gint x,
240                               gint y)
241 {
242   AtkTextIface *iface;
243
244   g_return_val_if_fail (text != NULL, -1);
245   g_return_val_if_fail (ATK_IS_TEXT (text), -1);
246
247   iface = ATK_TEXT_GET_IFACE (text);
248
249   if (iface->get_offset_at_point)
250     return (*(iface->get_offset_at_point)) (text, x, y);
251   else
252     return -1;
253 }
254
255 gchar*
256 atk_text_get_selected_text (AtkText *text)
257 {
258   AtkTextIface *iface;
259
260   g_return_val_if_fail (text != NULL, NULL);
261   g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
262
263   iface = ATK_TEXT_GET_IFACE (text);
264
265   if (iface->get_selected_text)
266     return (*(iface->get_selected_text)) (text);
267   else
268     return NULL;
269 }
270
271 void
272 atk_text_get_selection_bounds (AtkText *text,
273                                gint    *start_offset,
274                                gint    *end_offset)
275 {
276   AtkTextIface *iface;
277
278   g_return_if_fail (text != NULL);
279   g_return_if_fail (ATK_IS_TEXT (text));
280
281   iface = ATK_TEXT_GET_IFACE (text);
282
283   if (iface->get_selection_bounds)
284     (*(iface->get_selection_bounds)) (text, start_offset, end_offset);
285   else
286   {
287     *start_offset = 0;
288     *end_offset = 0;
289   }
290 }
291
292 gboolean
293 atk_text_set_selection_bounds (AtkText *text,
294                                gint    start_offset,
295                                gint    end_offset)
296 {
297   AtkTextIface *iface;
298
299   g_return_val_if_fail (text != NULL, FALSE);
300   g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
301
302   iface = ATK_TEXT_GET_IFACE (text);
303
304   if (iface->set_selection_bounds)
305     {
306       return (*(iface->set_selection_bounds)) (text, start_offset, end_offset);
307     }
308   else
309     {
310       return FALSE;
311     }
312 }
313
314 gboolean
315 atk_text_set_caret_offset (AtkText *text,
316                            gint    offset)
317 {
318   AtkTextIface *iface;
319
320   g_return_val_if_fail (text != NULL, FALSE);
321   g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
322
323   iface = ATK_TEXT_GET_IFACE (text);
324
325   if (iface->set_caret_offset)
326     {
327       return (*(iface->set_caret_offset)) (text, offset);
328     }
329   else
330     {
331       return FALSE;
332     }
333 }