]> Pileus Git - ~andy/gtk/blob - modules/other/gail/gailhtmlboxtext.c
Use G_DEFINE_TYPE[_WITH_CODE] instead of hand-coding the get_type functions. Bug...
[~andy/gtk] / modules / other / gail / gailhtmlboxtext.c
1 /* GAIL - The GNOME Accessibility Implementation Library
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 Lesser 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  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser 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 "gailhtmlboxtext.h"
21
22 static void           gail_html_box_text_class_init          (GailHtmlBoxTextClass *klass);
23 static void           gail_html_box_text_text_interface_init (AtkTextIface        *iface);
24 static gchar*         gail_html_box_text_get_text            (AtkText             *text,
25                                                               gint                start_offset,
26                                                               gint                end_offset);
27 static gchar*         gail_html_box_text_get_text_after_offset 
28                                                              (AtkText             *text,
29                                                               gint                offset,
30                                                               AtkTextBoundary     boundary_type,
31                                                               gint                *start_offset,
32                                                               gint                *end_offset);
33 static gchar*         gail_html_box_text_get_text_at_offset  (AtkText             *text,
34                                                               gint                offset,
35                                                               AtkTextBoundary     boundary_type,
36                                                               gint                *start_offset,
37                                                               gint                *end_offset);
38 static gchar*         gail_html_box_text_get_text_before_offset 
39                                                              (AtkText             *text,
40                                                               gint                offset,
41                                                               AtkTextBoundary     boundary_type,
42                                                               gint                *start_offset,
43                                                               gint                *end_offset);
44 static gunichar       gail_html_box_text_get_character_at_offset 
45                                                               (AtkText            *text,
46                                                                gint               offset);
47 static gint           gail_html_box_text_get_character_count  (AtkText            *text);
48 static gint           gail_html_box_text_get_caret_offset     (AtkText            *text);
49 static gboolean       gail_html_box_text_set_caret_offset     (AtkText            *text,
50                                                                gint               offset);
51 static gint           gail_html_box_text_get_offset_at_point  (AtkText            *text,
52                                                                gint               x,
53                                                                gint               y,
54                                                                AtkCoordType       coords);
55 static void           gail_html_box_text_get_character_extents (AtkText           *text,
56                                                                 gint              offset,
57                                                                 gint              *x,
58                                                                 gint              *y,
59                                                                 gint              *width,
60                                                                 gint              *height,
61                                                                 AtkCoordType      coords);
62 static AtkAttributeSet* 
63                       gail_html_box_text_get_run_attributes    (AtkText           *text,
64                                                                 gint              offset,
65                                                                 gint              *start_offset,
66                                                                 gint              *end_offset);
67 static AtkAttributeSet* 
68                       gail_html_box_text_get_default_attributes (AtkText          *text);
69 static gint           gail_html_box_text_get_n_selections      (AtkText           *text);
70 static gchar*         gail_html_box_text_get_selection         (AtkText           *text,
71                                                                 gint              selection_num,
72                                                                 gint              *start_pos,
73                                                                 gint              *end_pos);
74 static gboolean       gail_html_box_text_add_selection         (AtkText           *text,
75                                                                 gint              start_pos,
76                                                                 gint              end_pos);
77 static gboolean       gail_html_box_text_remove_selection      (AtkText           *text,
78                                                                 gint              selection_num);
79 static gboolean       gail_html_box_text_set_selection         (AtkText           *text,
80                                                                 gint              selection_num,
81                                                                 gint              start_pos,
82                                                                 gint              end_pos);
83 static AtkAttributeSet*
84                       add_to_attr_set                          (AtkAttributeSet   *attrib_set,
85                                                                 GtkTextAttributes *attrs,
86                                                                 AtkTextAttribute  attr);
87 static gchar*         get_text_near_offset                     (AtkText           *text,
88                                                                 GailOffsetType    function,
89                                                                 AtkTextBoundary   boundary_type,
90                                                                 gint              offset,
91                                                                 gint              *start_offset,
92                                                                 gint              *end_offset);
93
94 G_DEFINE_TYPE_WITH_CODE (GailHtmlBoxText, gail_html_box_text, GAIL_TYPE_HTML_BOX,
95                          G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, gail_html_box_text_text_interface_init))
96
97 AtkObject*
98 gail_html_box_text_new (GObject *obj)
99 {
100   gpointer object;
101   AtkObject *atk_object;
102   GailHtmlBoxText *gail_text;
103
104   g_return_val_if_fail (HTML_IS_BOX_TEXT (obj), NULL);
105   object = g_object_new (GAIL_TYPE_HTML_BOX_TEXT, NULL);
106   atk_object = ATK_OBJECT (object);
107   gail_text = GAIL_HTML_BOX_TEXT (object);
108
109   atk_object_initialize (atk_object, obj);
110   gail_text->texthelper = gail_text_helper_new ();
111 #if 0
112   gail_text_helper_text_setup (gail_text->texthelper,
113                                HTML_BOX_TEXT (obj)->master->text);
114 #endif
115
116   atk_object->role =  ATK_ROLE_TEXT;
117   return atk_object;
118 }
119
120 static void
121 gail_html_box_text_class_init (GailHtmlBoxTextClass *klass)
122 {
123 }
124
125 static void
126 gail_html_box_text_text_interface_init (AtkTextIface *iface)
127 {
128   iface->get_text = gail_html_box_text_get_text;
129   iface->get_text_after_offset = gail_html_box_text_get_text_after_offset;
130   iface->get_text_at_offset = gail_html_box_text_get_text_at_offset;
131   iface->get_text_before_offset = gail_html_box_text_get_text_before_offset;
132   iface->get_character_at_offset = gail_html_box_text_get_character_at_offset;
133   iface->get_character_count = gail_html_box_text_get_character_count;
134   iface->get_caret_offset = gail_html_box_text_get_caret_offset;
135   iface->set_caret_offset = gail_html_box_text_set_caret_offset;
136   iface->get_offset_at_point = gail_html_box_text_get_offset_at_point;
137   iface->get_character_extents = gail_html_box_text_get_character_extents;
138   iface->get_n_selections = gail_html_box_text_get_n_selections;
139   iface->get_selection = gail_html_box_text_get_selection;
140   iface->add_selection = gail_html_box_text_add_selection;
141   iface->remove_selection = gail_html_box_text_remove_selection;
142   iface->set_selection = gail_html_box_text_set_selection;
143   iface->get_run_attributes = gail_html_box_text_get_run_attributes;
144   iface->get_default_attributes = gail_html_box_text_get_default_attributes;
145 }
146
147 static gchar*
148 gail_html_box_text_get_text (AtkText *text,
149                              gint    start_offset,
150                              gint    end_offset)
151 {
152   GailHtmlBoxText *gail_text;
153   GtkTextBuffer *buffer;
154   GtkTextIter start, end;
155
156   g_return_val_if_fail (GAIL_IS_HTML_BOX_TEXT (text), NULL);
157   gail_text = GAIL_HTML_BOX_TEXT (text);
158   g_return_val_if_fail (gail_text->texthelper, NULL);
159
160   buffer = gail_text->texthelper->buffer;
161   gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
162   gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
163
164   return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
165 }
166
167 static gchar*
168 gail_html_box_text_get_text_after_offset (AtkText         *text,
169                                           gint            offset,
170                                           AtkTextBoundary boundary_type,
171                                           gint            *start_offset,
172                                           gint            *end_offset)
173 {
174   return get_text_near_offset (text, GAIL_AFTER_OFFSET,
175                                boundary_type, offset, 
176                                start_offset, end_offset);
177 }
178
179 static gchar*
180 gail_html_box_text_get_text_at_offset (AtkText         *text,
181                                        gint            offset,
182                                        AtkTextBoundary boundary_type,
183                                        gint            *start_offset,
184                                        gint            *end_offset)
185 {
186   return get_text_near_offset (text, GAIL_AT_OFFSET,
187                                boundary_type, offset, 
188                                start_offset, end_offset);
189 }
190
191 static gchar*
192 gail_html_box_text_get_text_before_offset (AtkText         *text,
193                                            gint            offset,
194                                            AtkTextBoundary boundary_type,
195                                            gint            *start_offset,
196                                            gint            *end_offset)
197 {
198   return get_text_near_offset (text, GAIL_BEFORE_OFFSET,
199                                boundary_type, offset, 
200                                start_offset, end_offset);
201 }
202
203 static gunichar
204 gail_html_box_text_get_character_at_offset (AtkText *text,
205                                             gint    offset)
206 {
207   GailHtmlBoxText *gail_item;
208   GtkTextIter start, end;
209   GtkTextBuffer *buffer;
210   gchar *string;
211   gchar *index;
212
213   g_return_val_if_fail (GAIL_IS_HTML_BOX_TEXT (text), 0);
214   gail_item = GAIL_HTML_BOX_TEXT (text);
215   buffer = gail_item->texthelper->buffer;
216   gtk_text_buffer_get_start_iter (buffer, &start);
217   gtk_text_buffer_get_end_iter (buffer, &end);
218   string = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
219   index = g_utf8_offset_to_pointer (string, offset);
220   g_free (string);
221
222   return g_utf8_get_char (index);
223 }
224
225 static gint
226 gail_html_box_text_get_character_count (AtkText *text)
227 {
228   GtkTextBuffer *buffer;
229   GailHtmlBoxText *gail_text;
230
231   g_return_val_if_fail (GAIL_IS_HTML_BOX_TEXT (text), 0);
232   gail_text = GAIL_HTML_BOX_TEXT (text);
233   g_return_val_if_fail (gail_text->texthelper, 0);
234   buffer = gail_text->texthelper->buffer;
235   return gtk_text_buffer_get_char_count (buffer);
236 }
237
238 static gint
239 gail_html_box_text_get_caret_offset (AtkText *text)
240 {
241   GailHtmlBoxText *gail_text;
242   GtkTextBuffer *buffer;
243   GtkTextMark *cursor_mark;
244   GtkTextIter cursor_itr;
245
246   g_return_val_if_fail (GAIL_IS_HTML_BOX_TEXT (text), 0);
247   gail_text = GAIL_HTML_BOX_TEXT (text);
248   g_return_val_if_fail (gail_text->texthelper, 0);
249   buffer = gail_text->texthelper->buffer;
250   cursor_mark = gtk_text_buffer_get_insert (buffer);
251   gtk_text_buffer_get_iter_at_mark (buffer, &cursor_itr, cursor_mark);
252   return gtk_text_iter_get_offset (&cursor_itr);
253 }
254
255 static gboolean
256 gail_html_box_text_set_caret_offset (AtkText *text,
257                                      gint    offset)
258 {
259   GailHtmlBoxText *gail_text;
260   GtkTextBuffer *buffer;
261   GtkTextIter pos_itr;
262
263   g_return_val_if_fail (GAIL_IS_HTML_BOX_TEXT (text), FALSE);
264   gail_text = GAIL_HTML_BOX_TEXT (text);
265   g_return_val_if_fail (gail_text->texthelper, FALSE);
266   buffer = gail_text->texthelper->buffer;
267   gtk_text_buffer_get_iter_at_offset (buffer,  &pos_itr, offset);
268   gtk_text_buffer_move_mark_by_name (buffer, "insert", &pos_itr);
269   return TRUE;
270 }
271
272 static gint
273 gail_html_box_text_get_offset_at_point (AtkText      *text,
274                                         gint         x,
275                                         gint         y,
276                                         AtkCoordType coords)
277 {
278   return -1;
279 }
280
281 static void
282 gail_html_box_text_get_character_extents (AtkText      *text,
283                                           gint         offset,
284                                           gint         *x,
285                                           gint         *y,
286                                           gint         *width,
287                                           gint         *height,
288                                           AtkCoordType coords)
289 {
290   return;
291 }
292
293 static AtkAttributeSet*
294 gail_html_box_text_get_run_attributes (AtkText *text,
295                                        gint    offset,
296                                        gint    *start_offset,
297                                        gint    *end_offset)
298 {
299   return NULL;
300 }
301
302 static AtkAttributeSet*
303 gail_html_box_text_get_default_attributes (AtkText *text)
304 {
305   return NULL;
306 }
307
308 static gint
309 gail_html_box_text_get_n_selections (AtkText *text)
310 {
311   return 0;
312 }
313
314 static gchar*
315 gail_html_box_text_get_selection (AtkText *text,
316                                   gint    selection_num,
317                                   gint    *start_pos,
318                                   gint    *end_pos)
319 {
320   return NULL;
321 }
322
323 static gboolean
324 gail_html_box_text_add_selection (AtkText *text,
325                                 gint    start_pos,
326                                 gint    end_pos)
327 {
328   return FALSE;
329 }
330
331 static gboolean
332 gail_html_box_text_remove_selection (AtkText *text,
333                                  gint    selection_num)
334 {
335   return FALSE;
336 }
337
338 static gboolean
339 gail_html_box_text_set_selection (AtkText *text,
340                                   gint    selection_num,
341                                   gint    start_pos,
342                                   gint    end_pos)
343 {
344   return FALSE;
345 }
346
347 static AtkAttributeSet*
348 add_to_attr_set (AtkAttributeSet   *attrib_set,
349                  GtkTextAttributes *attrs,
350                  AtkTextAttribute  attr)
351 {
352   gchar *value;
353
354   switch (attr)
355     {
356     case ATK_TEXT_ATTR_LEFT_MARGIN:
357       value = g_strdup_printf ("%i", attrs->left_margin);
358       break;
359     case ATK_TEXT_ATTR_RIGHT_MARGIN:
360       value = g_strdup_printf ("%i", attrs->right_margin);
361       break;
362     case ATK_TEXT_ATTR_INDENT:
363       value = g_strdup_printf ("%i", attrs->indent);
364       break;
365     case ATK_TEXT_ATTR_INVISIBLE:
366       value = g_strdup (atk_text_attribute_get_value (attr, attrs->invisible));
367       break;
368     case ATK_TEXT_ATTR_EDITABLE:
369       value = g_strdup (atk_text_attribute_get_value (attr, attrs->editable));
370       break;
371     case ATK_TEXT_ATTR_PIXELS_ABOVE_LINES:
372       value = g_strdup_printf ("%i", attrs->pixels_above_lines);
373       break;
374     case ATK_TEXT_ATTR_PIXELS_BELOW_LINES:
375       value = g_strdup_printf ("%i", attrs->pixels_below_lines);
376       break;
377     case ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP:
378       value = g_strdup_printf ("%i", attrs->pixels_inside_wrap);
379       break;
380     case ATK_TEXT_ATTR_BG_FULL_HEIGHT:
381       value = g_strdup (atk_text_attribute_get_value (attr, attrs->bg_full_height));
382       break;
383     case ATK_TEXT_ATTR_RISE:
384       value = g_strdup_printf ("%i", attrs->appearance.rise);
385       break;
386     case ATK_TEXT_ATTR_UNDERLINE:
387       value = g_strdup (atk_text_attribute_get_value (attr, attrs->appearance.underline));
388       break;
389     case ATK_TEXT_ATTR_STRIKETHROUGH:
390       value = g_strdup (atk_text_attribute_get_value (attr, attrs->appearance.strikethrough));
391       break;
392     case ATK_TEXT_ATTR_SIZE:
393       value = g_strdup_printf ("%i", 
394                               pango_font_description_get_size (attrs->font));
395       break;
396     case ATK_TEXT_ATTR_SCALE:
397       value = g_strdup_printf ("%g", attrs->font_scale);
398       break;
399     case ATK_TEXT_ATTR_WEIGHT:
400       value = g_strdup_printf ("%d", 
401                               pango_font_description_get_weight (attrs->font));
402       break;
403     case ATK_TEXT_ATTR_LANGUAGE:
404       value = g_strdup ((gchar *)(attrs->language));
405       break;
406     case ATK_TEXT_ATTR_FAMILY_NAME:
407       value = g_strdup (pango_font_description_get_family (attrs->font));
408       break;
409     case ATK_TEXT_ATTR_BG_COLOR:
410       value = g_strdup_printf ("%u,%u,%u",
411                                attrs->appearance.bg_color.red,
412                                attrs->appearance.bg_color.green,
413                                attrs->appearance.bg_color.blue);
414       break;
415     case ATK_TEXT_ATTR_FG_COLOR:
416       value = g_strdup_printf ("%u,%u,%u",
417                                attrs->appearance.fg_color.red,
418                                attrs->appearance.fg_color.green,
419                                attrs->appearance.fg_color.blue);
420       break;
421     case ATK_TEXT_ATTR_BG_STIPPLE:
422       value = g_strdup (atk_text_attribute_get_value (attr, attrs->appearance.bg_stipple ? 1 : 0));
423       break;
424     case ATK_TEXT_ATTR_FG_STIPPLE:
425       value = g_strdup (atk_text_attribute_get_value (attr, attrs->appearance.fg_stipple ? 1 : 0));
426       break;
427     case ATK_TEXT_ATTR_WRAP_MODE:
428       value = g_strdup (atk_text_attribute_get_value (attr, attrs->wrap_mode));
429       break;
430     case ATK_TEXT_ATTR_DIRECTION:
431       value = g_strdup (atk_text_attribute_get_value (attr, attrs->direction));
432       break;
433     case ATK_TEXT_ATTR_JUSTIFICATION:
434       value = g_strdup (atk_text_attribute_get_value (attr, attrs->justification));
435       break;
436     case ATK_TEXT_ATTR_STRETCH:
437       value = g_strdup (atk_text_attribute_get_value (attr, 
438                         pango_font_description_get_stretch (attrs->font)));
439       break;
440     case ATK_TEXT_ATTR_VARIANT:
441       value = g_strdup (atk_text_attribute_get_value (attr, 
442                         pango_font_description_get_variant (attrs->font)));
443       break;
444     case ATK_TEXT_ATTR_STYLE:
445       value = g_strdup (atk_text_attribute_get_value (attr, 
446                         pango_font_description_get_style (attrs->font)));
447       break;
448     default:
449       value = NULL;
450       break;
451     }
452   return gail_text_helper_add_attribute (attrib_set, 
453                                          attr,
454                                          value);
455 }
456
457 static gchar*
458 get_text_near_offset (AtkText          *text,
459                       GailOffsetType   function,
460                       AtkTextBoundary  boundary_type,
461                       gint             offset,
462                       gint             *start_offset,
463                       gint             *end_offset)
464 {
465   return gail_text_helper_get_text (GAIL_HTML_BOX_TEXT (text)->texthelper, NULL,
466                                     function, boundary_type, offset, 
467                                     start_offset, end_offset);
468 }