1 /* GTK+ - accessibility implementations
2 * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
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.
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.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include <sys/types.h>
28 #include <glib-object.h>
29 #include <glib/gstdio.h>
31 #include "gtktextviewaccessibleprivate.h"
32 #include "gtk/gtkwidgetprivate.h"
34 struct _GtkTextViewAccessiblePrivate
40 static void insert_text_cb (GtkTextBuffer *buffer,
45 static void delete_range_cb (GtkTextBuffer *buffer,
49 static void mark_set_cb (GtkTextBuffer *buffer,
55 static void atk_editable_text_interface_init (AtkEditableTextIface *iface);
56 static void atk_text_interface_init (AtkTextIface *iface);
57 static void atk_streamable_content_interface_init (AtkStreamableContentIface *iface);
59 G_DEFINE_TYPE_WITH_CODE (GtkTextViewAccessible, gtk_text_view_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
60 G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init)
61 G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init)
62 G_IMPLEMENT_INTERFACE (ATK_TYPE_STREAMABLE_CONTENT, atk_streamable_content_interface_init))
66 gtk_text_view_accessible_initialize (AtkObject *obj,
69 ATK_OBJECT_CLASS (gtk_text_view_accessible_parent_class)->initialize (obj, data);
71 obj->role = ATK_ROLE_TEXT;
75 gtk_text_view_accessible_notify_gtk (GObject *obj,
80 atk_obj = gtk_widget_get_accessible (GTK_WIDGET (obj));
82 if (!strcmp (pspec->name, "editable"))
86 editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (obj));
87 atk_object_notify_state_change (atk_obj, ATK_STATE_EDITABLE, editable);
90 GTK_WIDGET_ACCESSIBLE_CLASS (gtk_text_view_accessible_parent_class)->notify_gtk (obj, pspec);
94 gtk_text_view_accessible_ref_state_set (AtkObject *accessible)
96 AtkStateSet *state_set;
99 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
103 state_set = ATK_OBJECT_CLASS (gtk_text_view_accessible_parent_class)->ref_state_set (accessible);
105 if (gtk_text_view_get_editable (GTK_TEXT_VIEW (widget)))
106 atk_state_set_add_state (state_set, ATK_STATE_EDITABLE);
107 atk_state_set_add_state (state_set, ATK_STATE_MULTI_LINE);
113 gtk_text_view_accessible_change_buffer (GtkTextViewAccessible *accessible,
114 GtkTextBuffer *old_buffer,
115 GtkTextBuffer *new_buffer)
119 g_signal_handlers_disconnect_matched (old_buffer, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, accessible);
121 g_signal_emit_by_name (accessible,
122 "text-changed::delete",
124 gtk_text_buffer_get_char_count (old_buffer));
129 g_signal_connect_after (new_buffer, "insert-text", G_CALLBACK (insert_text_cb), accessible);
130 g_signal_connect (new_buffer, "delete-range", G_CALLBACK (delete_range_cb), accessible);
131 g_signal_connect_after (new_buffer, "mark-set", G_CALLBACK (mark_set_cb), accessible);
133 g_signal_emit_by_name (accessible,
134 "text-changed::insert",
136 gtk_text_buffer_get_char_count (new_buffer));
141 gtk_text_view_accessible_widget_set (GtkAccessible *accessible)
143 gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible),
145 gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible))));
149 gtk_text_view_accessible_widget_unset (GtkAccessible *accessible)
151 gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible),
152 gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible))),
157 gtk_text_view_accessible_class_init (GtkTextViewAccessibleClass *klass)
159 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
160 GtkAccessibleClass *accessible_class = GTK_ACCESSIBLE_CLASS (klass);
161 GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
163 accessible_class->widget_set = gtk_text_view_accessible_widget_set;
164 accessible_class->widget_unset = gtk_text_view_accessible_widget_unset;
166 class->ref_state_set = gtk_text_view_accessible_ref_state_set;
167 class->initialize = gtk_text_view_accessible_initialize;
169 widget_class->notify_gtk = gtk_text_view_accessible_notify_gtk;
171 g_type_class_add_private (klass, sizeof (GtkTextViewAccessiblePrivate));
175 gtk_text_view_accessible_init (GtkTextViewAccessible *accessible)
177 accessible->priv = G_TYPE_INSTANCE_GET_PRIVATE (accessible,
178 GTK_TYPE_TEXT_VIEW_ACCESSIBLE,
179 GtkTextViewAccessiblePrivate);
183 gtk_text_view_accessible_get_text (AtkText *text,
188 GtkTextBuffer *buffer;
189 GtkTextIter start, end;
192 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
196 view = GTK_TEXT_VIEW (widget);
197 buffer = gtk_text_view_get_buffer (view);
198 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
199 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
201 return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
205 gtk_text_view_accessible_get_text_after_offset (AtkText *text,
207 AtkTextBoundary boundary_type,
213 GtkTextBuffer *buffer;
215 GtkTextIter start, end;
217 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
221 view = GTK_TEXT_VIEW (widget);
222 buffer = gtk_text_view_get_buffer (view);
223 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
225 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
227 gtk_text_view_forward_display_line (view, &end);
229 gtk_text_view_forward_display_line (view, &end);
231 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
233 gtk_text_view_forward_display_line_end (view, &end);
235 gtk_text_view_forward_display_line (view, &end);
236 gtk_text_view_forward_display_line_end (view, &end);
239 _gtk_text_buffer_get_text_after (buffer, boundary_type, &pos, &start, &end);
241 *start_offset = gtk_text_iter_get_offset (&start);
242 *end_offset = gtk_text_iter_get_offset (&end);
244 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
248 gtk_text_view_accessible_get_text_at_offset (AtkText *text,
250 AtkTextBoundary boundary_type,
256 GtkTextBuffer *buffer;
258 GtkTextIter start, end;
260 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
264 view = GTK_TEXT_VIEW (widget);
265 buffer = gtk_text_view_get_buffer (view);
266 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
268 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
270 gtk_text_view_backward_display_line_start (view, &start);
271 gtk_text_view_forward_display_line (view, &end);
273 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
275 gtk_text_view_backward_display_line_start (view, &start);
276 if (!gtk_text_iter_is_start (&start))
278 gtk_text_view_backward_display_line (view, &start);
279 gtk_text_view_forward_display_line_end (view, &start);
281 gtk_text_view_forward_display_line_end (view, &end);
284 _gtk_text_buffer_get_text_at (buffer, boundary_type, &pos, &start, &end);
286 *start_offset = gtk_text_iter_get_offset (&start);
287 *end_offset = gtk_text_iter_get_offset (&end);
289 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
293 gtk_text_view_accessible_get_text_before_offset (AtkText *text,
295 AtkTextBoundary boundary_type,
301 GtkTextBuffer *buffer;
303 GtkTextIter start, end;
305 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
309 view = GTK_TEXT_VIEW (widget);
310 buffer = gtk_text_view_get_buffer (view);
311 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
314 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
316 gtk_text_view_backward_display_line_start (view, &start);
318 gtk_text_view_backward_display_line (view, &start);
319 gtk_text_view_backward_display_line_start (view, &start);
321 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
323 gtk_text_view_backward_display_line_start (view, &start);
324 if (!gtk_text_iter_is_start (&start))
326 gtk_text_view_backward_display_line (view, &start);
328 gtk_text_view_forward_display_line_end (view, &end);
329 if (!gtk_text_iter_is_start (&start))
331 if (gtk_text_view_backward_display_line (view, &start))
332 gtk_text_view_forward_display_line_end (view, &start);
334 gtk_text_iter_set_offset (&start, 0);
341 _gtk_text_buffer_get_text_before (buffer, boundary_type, &pos, &start, &end);
343 *start_offset = gtk_text_iter_get_offset (&start);
344 *end_offset = gtk_text_iter_get_offset (&end);
346 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
350 gtk_text_view_accessible_get_character_at_offset (AtkText *text,
354 GtkTextIter start, end;
355 GtkTextBuffer *buffer;
359 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
363 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
364 if (offset >= gtk_text_buffer_get_char_count (buffer))
367 gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
369 gtk_text_iter_forward_char (&end);
370 string = gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
371 unichar = g_utf8_get_char (string);
378 gtk_text_view_accessible_get_character_count (AtkText *text)
381 GtkTextBuffer *buffer;
383 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
387 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
388 return gtk_text_buffer_get_char_count (buffer);
392 get_insert_offset (GtkTextBuffer *buffer)
397 insert = gtk_text_buffer_get_insert (buffer);
398 gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
399 return gtk_text_iter_get_offset (&iter);
403 gtk_text_view_accessible_get_caret_offset (AtkText *text)
406 GtkTextBuffer *buffer;
408 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
412 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
413 return get_insert_offset (buffer);
417 gtk_text_view_accessible_set_caret_offset (AtkText *text,
422 GtkTextBuffer *buffer;
425 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
429 view = GTK_TEXT_VIEW (widget);
430 buffer = gtk_text_view_get_buffer (view);
432 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
433 gtk_text_buffer_place_cursor (buffer, &iter);
434 gtk_text_view_scroll_to_iter (view, &iter, 0, FALSE, 0, 0);
440 gtk_text_view_accessible_get_offset_at_point (AtkText *text,
447 gint x_widget, y_widget, x_window, y_window, buff_x, buff_y;
452 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
456 view = GTK_TEXT_VIEW (widget);
457 window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_WIDGET);
458 gdk_window_get_origin (window, &x_widget, &y_widget);
460 if (coords == ATK_XY_SCREEN)
465 else if (coords == ATK_XY_WINDOW)
467 window = gdk_window_get_toplevel (window);
468 gdk_window_get_origin (window, &x_window, &y_window);
470 x = x - x_widget + x_window;
471 y = y - y_widget + y_window;
476 gtk_text_view_window_to_buffer_coords (view, GTK_TEXT_WINDOW_WIDGET,
477 x, y, &buff_x, &buff_y);
478 gtk_text_view_get_visible_rect (view, &rect);
480 /* Clamp point to visible rectangle */
481 buff_x = CLAMP (buff_x, rect.x, rect.x + rect.width - 1);
482 buff_y = CLAMP (buff_y, rect.y, rect.y + rect.height - 1);
484 gtk_text_view_get_iter_at_location (view, &iter, buff_x, buff_y);
486 /* The iter at a location sometimes points to the next character.
487 * See bug 111031. We work around that
489 gtk_text_view_get_iter_location (view, &iter, &rect);
491 gtk_text_iter_backward_char (&iter);
492 return gtk_text_iter_get_offset (&iter);
496 gtk_text_view_accessible_get_character_extents (AtkText *text,
505 GtkTextBuffer *buffer;
508 GdkRectangle rectangle;
510 gint x_widget, y_widget, x_window, y_window;
512 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
516 view = GTK_TEXT_VIEW (widget);
517 buffer = gtk_text_view_get_buffer (view);
518 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
519 gtk_text_view_get_iter_location (view, &iter, &rectangle);
521 window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_WIDGET);
522 gdk_window_get_origin (window, &x_widget, &y_widget);
524 *height = rectangle.height;
525 *width = rectangle.width;
527 gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_WIDGET,
528 rectangle.x, rectangle.y, x, y);
529 if (coords == ATK_XY_WINDOW)
531 window = gdk_window_get_toplevel (window);
532 gdk_window_get_origin (window, &x_window, &y_window);
533 *x += x_widget - x_window;
534 *y += y_widget - y_window;
536 else if (coords == ATK_XY_SCREEN)
550 static AtkAttributeSet *
551 add_text_attribute (AtkAttributeSet *attributes,
552 AtkTextAttribute attr,
557 at = g_new (AtkAttribute, 1);
558 at->name = g_strdup (atk_text_attribute_get_name (attr));
561 return g_slist_prepend (attributes, at);
564 static AtkAttributeSet *
565 add_text_int_attribute (AtkAttributeSet *attributes,
566 AtkTextAttribute attr,
572 value = g_strdup (atk_text_attribute_get_value (attr, i));
574 return add_text_attribute (attributes, attr, value);
577 static AtkAttributeSet *
578 gtk_text_view_accessible_get_run_attributes (AtkText *text,
584 GtkTextBuffer *buffer;
587 AtkAttributeSet *attrib_set = NULL;
588 GSList *tags, *temp_tags;
590 gboolean val_set = FALSE;
592 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
596 view = GTK_TEXT_VIEW (widget);
597 buffer = gtk_text_view_get_buffer (view);
599 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
601 gtk_text_iter_forward_to_tag_toggle (&iter, NULL);
602 *end_offset = gtk_text_iter_get_offset (&iter);
604 gtk_text_iter_backward_to_tag_toggle (&iter, NULL);
605 *start_offset = gtk_text_iter_get_offset (&iter);
607 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
609 tags = gtk_text_iter_get_tags (&iter);
610 tags = g_slist_reverse (tags);
613 while (temp_tags && !val_set)
615 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
617 g_object_get (tag, "style-set", &val_set, NULL);
621 g_object_get (tag, "style", &style, NULL);
622 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STYLE, style);
624 temp_tags = temp_tags->next;
629 while (temp_tags && !val_set)
631 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
633 g_object_get (tag, "variant-set", &val_set, NULL);
636 PangoVariant variant;
637 g_object_get (tag, "variant", &variant, NULL);
638 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_VARIANT, variant);
640 temp_tags = temp_tags->next;
645 while (temp_tags && !val_set)
647 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
649 g_object_get (tag, "stretch-set", &val_set, NULL);
652 PangoStretch stretch;
653 g_object_get (tag, "stretch", &stretch, NULL);
654 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRETCH, stretch);
656 temp_tags = temp_tags->next;
661 while (temp_tags && !val_set)
663 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
665 g_object_get (tag, "justification-set", &val_set, NULL);
668 GtkJustification justification;
669 g_object_get (tag, "justification", &justification, NULL);
670 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_JUSTIFICATION, justification);
672 temp_tags = temp_tags->next;
677 while (temp_tags && !val_set)
679 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
680 GtkTextDirection direction;
682 g_object_get (tag, "direction", &direction, NULL);
684 if (direction != GTK_TEXT_DIR_NONE)
687 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_DIRECTION, direction);
689 temp_tags = temp_tags->next;
694 while (temp_tags && !val_set)
696 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
698 g_object_get (tag, "wrap-mode-set", &val_set, NULL);
701 GtkWrapMode wrap_mode;
702 g_object_get (tag, "wrap-mode", &wrap_mode, NULL);
703 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_WRAP_MODE, wrap_mode);
705 temp_tags = temp_tags->next;
710 while (temp_tags && !val_set)
712 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
714 g_object_get (tag, "foreground-set", &val_set, NULL);
720 g_object_get (tag, "foreground-rgba", &rgba, NULL);
721 value = g_strdup_printf ("%u,%u,%u",
722 (guint) rgba->red * 65535,
723 (guint) rgba->green * 65535,
724 (guint) rgba->blue * 65535);
725 gdk_rgba_free (rgba);
726 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FG_COLOR, value);
728 temp_tags = temp_tags->next;
733 while (temp_tags && !val_set)
735 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
737 g_object_get (tag, "background-set", &val_set, NULL);
743 g_object_get (tag, "background-rgba", &rgba, NULL);
744 value = g_strdup_printf ("%u,%u,%u",
745 (guint) rgba->red * 65535,
746 (guint) rgba->green * 65535,
747 (guint) rgba->blue * 65535);
748 gdk_rgba_free (rgba);
749 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_BG_COLOR, value);
751 temp_tags = temp_tags->next;
756 while (temp_tags && !val_set)
758 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
760 g_object_get (tag, "family-set", &val_set, NULL);
765 g_object_get (tag, "family", &value, NULL);
766 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FAMILY_NAME, value);
768 temp_tags = temp_tags->next;
773 while (temp_tags && !val_set)
775 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
777 g_object_get (tag, "language-set", &val_set, NULL);
782 g_object_get (tag, "language", &value, NULL);
783 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LANGUAGE, value);
785 temp_tags = temp_tags->next;
790 while (temp_tags && !val_set)
792 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
794 g_object_get (tag, "weight-set", &val_set, NULL);
800 g_object_get (tag, "weight", &weight, NULL);
801 value = g_strdup_printf ("%d", weight);
802 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_WEIGHT, value);
804 temp_tags = temp_tags->next;
808 /* scale is special as the effective value is the product
809 * of all specified values
814 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
817 g_object_get (tag, "scale-set", &scale_set, NULL);
821 g_object_get (tag, "scale", &font_scale, NULL);
825 temp_tags = temp_tags->next;
830 value = g_strdup_printf ("%g", scale);
831 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SCALE, value);
836 while (temp_tags && !val_set)
838 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
840 g_object_get (tag, "size-set", &val_set, NULL);
845 g_object_get (tag, "size", &size, NULL);
846 value = g_strdup_printf ("%i", size);
847 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SIZE, value);
849 temp_tags = temp_tags->next;
854 while (temp_tags && !val_set)
856 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
858 g_object_get (tag, "strikethrough-set", &val_set, NULL);
861 gboolean strikethrough;
862 g_object_get (tag, "strikethrough", &strikethrough, NULL);
863 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRIKETHROUGH, strikethrough);
865 temp_tags = temp_tags->next;
870 while (temp_tags && !val_set)
872 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
874 g_object_get (tag, "underline-set", &val_set, NULL);
877 PangoUnderline underline;
878 g_object_get (tag, "underline", &underline, NULL);
879 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_UNDERLINE, underline);
881 temp_tags = temp_tags->next;
886 while (temp_tags && !val_set)
888 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
890 g_object_get (tag, "rise-set", &val_set, NULL);
895 g_object_get (tag, "rise", &rise, NULL);
896 value = g_strdup_printf ("%i", rise);
897 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RISE, value);
899 temp_tags = temp_tags->next;
904 while (temp_tags && !val_set)
906 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
908 g_object_get (tag, "background-full-height-set", &val_set, NULL);
911 gboolean bg_full_height;
912 g_object_get (tag, "background-full-height", &bg_full_height, NULL);
913 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_BG_FULL_HEIGHT, bg_full_height);
915 temp_tags = temp_tags->next;
920 while (temp_tags && !val_set)
922 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
924 g_object_get (tag, "pixels-inside-wrap-set", &val_set, NULL);
929 g_object_get (tag, "pixels-inside-wrap", &pixels, NULL);
930 value = g_strdup_printf ("%i", pixels);
931 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
933 temp_tags = temp_tags->next;
938 while (temp_tags && !val_set)
940 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
942 g_object_get (tag, "pixels-below-lines-set", &val_set, NULL);
947 g_object_get (tag, "pixels-below-lines", &pixels, NULL);
948 value = g_strdup_printf ("%i", pixels);
949 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
951 temp_tags = temp_tags->next;
956 while (temp_tags && !val_set)
958 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
960 g_object_get (tag, "pixels-above-lines-set", &val_set, NULL);
965 g_object_get (tag, "pixels-above-lines", &pixels, NULL);
966 value = g_strdup_printf ("%i", pixels);
967 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
969 temp_tags = temp_tags->next;
974 while (temp_tags && !val_set)
976 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
978 g_object_get (tag, "editable-set", &val_set, NULL);
982 g_object_get (tag, "editable", &editable, NULL);
983 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_EDITABLE, editable);
985 temp_tags = temp_tags->next;
990 while (temp_tags && !val_set)
992 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
994 g_object_get (tag, "invisible-set", &val_set, NULL);
998 g_object_get (tag, "invisible", &invisible, NULL);
999 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_INVISIBLE, invisible);
1001 temp_tags = temp_tags->next;
1006 while (temp_tags && !val_set)
1008 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
1010 g_object_get (tag, "indent-set", &val_set, NULL);
1015 g_object_get (tag, "indent", &indent, NULL);
1016 value = g_strdup_printf ("%i", indent);
1017 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_INDENT, value);
1019 temp_tags = temp_tags->next;
1024 while (temp_tags && !val_set)
1026 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
1028 g_object_get (tag, "right-margin-set", &val_set, NULL);
1033 g_object_get (tag, "right-margin", &margin, NULL);
1034 value = g_strdup_printf ("%i", margin);
1035 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
1037 temp_tags = temp_tags->next;
1042 while (temp_tags && !val_set)
1044 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
1046 g_object_get (tag, "left-margin-set", &val_set, NULL);
1051 g_object_get (tag, "left-margin", &margin, NULL);
1052 value = g_strdup_printf ("%i", margin);
1053 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LEFT_MARGIN, value);
1055 temp_tags = temp_tags->next;
1059 g_slist_free (tags);
1063 static AtkAttributeSet *
1064 gtk_text_view_accessible_get_default_attributes (AtkText *text)
1068 GtkTextAttributes *text_attrs;
1069 AtkAttributeSet *attributes;
1070 PangoFontDescription *font;
1073 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1077 view = GTK_TEXT_VIEW (widget);
1078 text_attrs = gtk_text_view_get_default_attributes (view);
1082 font = text_attrs->font;
1086 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STYLE,
1087 pango_font_description_get_style (font));
1089 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_VARIANT,
1090 pango_font_description_get_variant (font));
1092 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRETCH,
1093 pango_font_description_get_stretch (font));
1095 value = g_strdup (pango_font_description_get_family (font));
1096 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FAMILY_NAME, value);
1098 value = g_strdup_printf ("%d", pango_font_description_get_weight (font));
1099 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_WEIGHT, value);
1101 value = g_strdup_printf ("%i", pango_font_description_get_size (font) / PANGO_SCALE);
1102 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SIZE, value);
1105 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_JUSTIFICATION, text_attrs->justification);
1106 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_DIRECTION, text_attrs->direction);
1107 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_WRAP_MODE, text_attrs->wrap_mode);
1108 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_EDITABLE, text_attrs->editable);
1109 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_INVISIBLE, text_attrs->invisible);
1110 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_BG_FULL_HEIGHT, text_attrs->bg_full_height);
1112 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRIKETHROUGH,
1113 text_attrs->appearance.strikethrough);
1114 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_UNDERLINE,
1115 text_attrs->appearance.underline);
1117 value = g_strdup_printf ("%u,%u,%u",
1118 text_attrs->appearance.bg_color.red,
1119 text_attrs->appearance.bg_color.green,
1120 text_attrs->appearance.bg_color.blue);
1121 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_BG_COLOR, value);
1123 value = g_strdup_printf ("%u,%u,%u",
1124 text_attrs->appearance.fg_color.red,
1125 text_attrs->appearance.fg_color.green,
1126 text_attrs->appearance.fg_color.blue);
1127 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FG_COLOR, value);
1129 value = g_strdup_printf ("%g", text_attrs->font_scale);
1130 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SCALE, value);
1132 value = g_strdup ((gchar *)(text_attrs->language));
1133 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LANGUAGE, value);
1135 value = g_strdup_printf ("%i", text_attrs->appearance.rise);
1136 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RISE, value);
1138 value = g_strdup_printf ("%i", text_attrs->pixels_inside_wrap);
1139 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
1141 value = g_strdup_printf ("%i", text_attrs->pixels_below_lines);
1142 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
1144 value = g_strdup_printf ("%i", text_attrs->pixels_above_lines);
1145 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
1147 value = g_strdup_printf ("%i", text_attrs->indent);
1148 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_INDENT, value);
1150 value = g_strdup_printf ("%i", text_attrs->left_margin);
1151 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LEFT_MARGIN, value);
1153 value = g_strdup_printf ("%i", text_attrs->right_margin);
1154 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
1156 gtk_text_attributes_unref (text_attrs);
1161 gtk_text_view_accessible_get_n_selections (AtkText *text)
1164 GtkTextBuffer *buffer;
1166 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1170 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1171 if (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
1178 gtk_text_view_accessible_get_selection (AtkText *atk_text,
1185 GtkTextBuffer *buffer;
1186 GtkTextIter start, end;
1189 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
1193 if (selection_num != 0)
1196 view = GTK_TEXT_VIEW (widget);
1197 buffer = gtk_text_view_get_buffer (view);
1199 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1200 text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1204 *start_pos = gtk_text_iter_get_offset (&start);
1205 *end_pos = gtk_text_iter_get_offset (&end);
1211 gtk_text_view_accessible_add_selection (AtkText *text,
1216 GtkTextBuffer *buffer;
1217 GtkTextIter start, end;
1219 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1223 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1225 if (!gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
1227 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1228 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1229 gtk_text_buffer_select_range (buffer, &end, &start);
1238 gtk_text_view_accessible_remove_selection (AtkText *text,
1242 GtkTextBuffer *buffer;
1243 GtkTextMark *insert;
1245 GtkTextIter start, end;
1247 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1251 if (selection_num != 0)
1254 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1256 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1258 insert = gtk_text_buffer_get_insert (buffer);
1259 gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
1260 gtk_text_buffer_place_cursor (buffer, &iter);
1268 gtk_text_view_accessible_set_selection (AtkText *text,
1274 GtkTextBuffer *buffer;
1275 GtkTextIter start, end;
1277 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1281 if (selection_num != 0)
1284 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1286 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1288 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1289 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1290 gtk_text_buffer_select_range (buffer, &end, &start);
1299 atk_text_interface_init (AtkTextIface *iface)
1301 iface->get_text = gtk_text_view_accessible_get_text;
1302 iface->get_text_after_offset = gtk_text_view_accessible_get_text_after_offset;
1303 iface->get_text_at_offset = gtk_text_view_accessible_get_text_at_offset;
1304 iface->get_text_before_offset = gtk_text_view_accessible_get_text_before_offset;
1305 iface->get_character_at_offset = gtk_text_view_accessible_get_character_at_offset;
1306 iface->get_character_count = gtk_text_view_accessible_get_character_count;
1307 iface->get_caret_offset = gtk_text_view_accessible_get_caret_offset;
1308 iface->set_caret_offset = gtk_text_view_accessible_set_caret_offset;
1309 iface->get_offset_at_point = gtk_text_view_accessible_get_offset_at_point;
1310 iface->get_character_extents = gtk_text_view_accessible_get_character_extents;
1311 iface->get_n_selections = gtk_text_view_accessible_get_n_selections;
1312 iface->get_selection = gtk_text_view_accessible_get_selection;
1313 iface->add_selection = gtk_text_view_accessible_add_selection;
1314 iface->remove_selection = gtk_text_view_accessible_remove_selection;
1315 iface->set_selection = gtk_text_view_accessible_set_selection;
1316 iface->get_run_attributes = gtk_text_view_accessible_get_run_attributes;
1317 iface->get_default_attributes = gtk_text_view_accessible_get_default_attributes;
1320 /* atkeditabletext.h */
1323 gtk_text_view_accessible_set_run_attributes (AtkEditableText *text,
1324 AtkAttributeSet *attributes,
1329 GtkTextBuffer *buffer;
1339 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1343 view = GTK_TEXT_VIEW (widget);
1344 if (!gtk_text_view_get_editable (view))
1347 buffer = gtk_text_view_get_buffer (view);
1349 if (attributes == NULL)
1352 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
1353 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
1355 tag = gtk_text_buffer_create_tag (buffer, NULL, NULL);
1357 for (l = attributes; l; l = l->next)
1368 if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LEFT_MARGIN)))
1369 g_object_set (G_OBJECT (tag), "left-margin", atoi (value), NULL);
1371 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RIGHT_MARGIN)))
1372 g_object_set (G_OBJECT (tag), "right-margin", atoi (value), NULL);
1374 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INDENT)))
1375 g_object_set (G_OBJECT (tag), "indent", atoi (value), NULL);
1377 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_ABOVE_LINES)))
1378 g_object_set (G_OBJECT (tag), "pixels-above-lines", atoi (value), NULL);
1380 else if (!strcmp(name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_BELOW_LINES)))
1381 g_object_set (G_OBJECT (tag), "pixels-below-lines", atoi (value), NULL);
1383 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP)))
1384 g_object_set (G_OBJECT (tag), "pixels-inside-wrap", atoi (value), NULL);
1386 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_SIZE)))
1387 g_object_set (G_OBJECT (tag), "size", atoi (value), NULL);
1389 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RISE)))
1390 g_object_set (G_OBJECT (tag), "rise", atoi (value), NULL);
1392 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WEIGHT)))
1393 g_object_set (G_OBJECT (tag), "weight", atoi (value), NULL);
1395 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_FULL_HEIGHT)))
1397 g_object_set (G_OBJECT (tag), "bg-full-height",
1398 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_BG_FULL_HEIGHT, 0))),
1402 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LANGUAGE)))
1403 g_object_set (G_OBJECT (tag), "language", value, NULL);
1405 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FAMILY_NAME)))
1406 g_object_set (G_OBJECT (tag), "family", value, NULL);
1408 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_EDITABLE)))
1410 g_object_set (G_OBJECT (tag), "editable",
1411 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
1415 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INVISIBLE)))
1417 g_object_set (G_OBJECT (tag), "invisible",
1418 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
1422 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_UNDERLINE)))
1424 for (j = 0; j < 3; j++)
1426 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE, j)))
1428 g_object_set (G_OBJECT (tag), "underline", j, NULL);
1434 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRIKETHROUGH)))
1436 g_object_set (G_OBJECT (tag), "strikethrough",
1437 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRIKETHROUGH, 0))),
1441 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_COLOR)))
1443 RGB_vals = g_strsplit (value, ",", 3);
1444 color = g_malloc (sizeof (GdkColor));
1445 color->red = atoi (RGB_vals[0]);
1446 color->green = atoi (RGB_vals[1]);
1447 color->blue = atoi (RGB_vals[2]);
1448 g_object_set (G_OBJECT (tag), "background-gdk", color, NULL);
1451 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FG_COLOR)))
1453 RGB_vals = g_strsplit (value, ",", 3);
1454 color = g_malloc (sizeof (GdkColor));
1455 color->red = atoi (RGB_vals[0]);
1456 color->green = atoi (RGB_vals[1]);
1457 color->blue = atoi (RGB_vals[2]);
1458 g_object_set (G_OBJECT (tag), "foreground-gdk", color, NULL);
1461 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRETCH)))
1463 for (j = 0; j < 9; j++)
1465 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRETCH, j)))
1467 g_object_set (G_OBJECT (tag), "stretch", j, NULL);
1473 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_JUSTIFICATION)))
1475 for (j = 0; j < 4; j++)
1477 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_JUSTIFICATION, j)))
1479 g_object_set (G_OBJECT (tag), "justification", j, NULL);
1485 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_DIRECTION)))
1487 for (j = 0; j < 3; j++)
1489 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_DIRECTION, j)))
1491 g_object_set (G_OBJECT (tag), "direction", j, NULL);
1497 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_VARIANT)))
1499 for (j = 0; j < 2; j++)
1501 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_VARIANT, j)))
1503 g_object_set (G_OBJECT (tag), "variant", j, NULL);
1509 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WRAP_MODE)))
1511 for (j = 0; j < 3; j++)
1513 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_WRAP_MODE, j)))
1515 g_object_set (G_OBJECT (tag), "wrap-mode", j, NULL);
1521 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STYLE)))
1523 for (j = 0; j < 3; j++)
1525 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STYLE, j)))
1527 g_object_set (G_OBJECT (tag), "style", j, NULL);
1537 gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
1543 gtk_text_view_accessible_set_text_contents (AtkEditableText *text,
1544 const gchar *string)
1548 GtkTextBuffer *buffer;
1550 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1554 view = GTK_TEXT_VIEW (widget);
1555 if (!gtk_text_view_get_editable (view))
1558 buffer = gtk_text_view_get_buffer (view);
1559 gtk_text_buffer_set_text (buffer, string, -1);
1563 gtk_text_view_accessible_insert_text (AtkEditableText *text,
1564 const gchar *string,
1570 GtkTextBuffer *buffer;
1573 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1577 view = GTK_TEXT_VIEW (widget);
1578 if (!gtk_text_view_get_editable (view))
1581 buffer = gtk_text_view_get_buffer (view);
1582 gtk_text_buffer_get_iter_at_offset (buffer, &iter, *position);
1583 gtk_text_buffer_insert (buffer, &iter, string, length);
1587 gtk_text_view_accessible_copy_text (AtkEditableText *text,
1592 GtkTextBuffer *buffer;
1593 GtkTextIter start, end;
1595 GtkClipboard *clipboard;
1597 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1601 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1603 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1604 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1605 str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1607 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1608 gtk_clipboard_set_text (clipboard, str, -1);
1612 gtk_text_view_accessible_cut_text (AtkEditableText *text,
1618 GtkTextBuffer *buffer;
1619 GtkTextIter start, end;
1621 GtkClipboard *clipboard;
1623 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1627 view = GTK_TEXT_VIEW (widget);
1628 if (!gtk_text_view_get_editable (view))
1630 buffer = gtk_text_view_get_buffer (view);
1632 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1633 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1634 str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1635 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1636 gtk_clipboard_set_text (clipboard, str, -1);
1637 gtk_text_buffer_delete (buffer, &start, &end);
1641 gtk_text_view_accessible_delete_text (AtkEditableText *text,
1647 GtkTextBuffer *buffer;
1648 GtkTextIter start_itr;
1649 GtkTextIter end_itr;
1651 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1655 view = GTK_TEXT_VIEW (widget);
1656 if (!gtk_text_view_get_editable (view))
1658 buffer = gtk_text_view_get_buffer (view);
1660 gtk_text_buffer_get_iter_at_offset (buffer, &start_itr, start_pos);
1661 gtk_text_buffer_get_iter_at_offset (buffer, &end_itr, end_pos);
1662 gtk_text_buffer_delete (buffer, &start_itr, &end_itr);
1667 GtkTextBuffer* buffer;
1672 paste_received (GtkClipboard *clipboard,
1676 PasteData* paste = data;
1677 GtkTextIter pos_itr;
1681 gtk_text_buffer_get_iter_at_offset (paste->buffer, &pos_itr, paste->position);
1682 gtk_text_buffer_insert (paste->buffer, &pos_itr, text, -1);
1685 g_object_unref (paste->buffer);
1689 gtk_text_view_accessible_paste_text (AtkEditableText *text,
1694 GtkTextBuffer *buffer;
1696 GtkClipboard *clipboard;
1698 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1702 view = GTK_TEXT_VIEW (widget);
1703 if (!gtk_text_view_get_editable (view))
1705 buffer = gtk_text_view_get_buffer (view);
1707 paste.buffer = buffer;
1708 paste.position = position;
1710 g_object_ref (paste.buffer);
1711 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1712 gtk_clipboard_request_text (clipboard, paste_received, &paste);
1716 atk_editable_text_interface_init (AtkEditableTextIface *iface)
1718 iface->set_text_contents = gtk_text_view_accessible_set_text_contents;
1719 iface->insert_text = gtk_text_view_accessible_insert_text;
1720 iface->copy_text = gtk_text_view_accessible_copy_text;
1721 iface->cut_text = gtk_text_view_accessible_cut_text;
1722 iface->delete_text = gtk_text_view_accessible_delete_text;
1723 iface->paste_text = gtk_text_view_accessible_paste_text;
1724 iface->set_run_attributes = gtk_text_view_accessible_set_run_attributes;
1730 gtk_text_view_accessible_update_cursor (GtkTextViewAccessible *accessible,
1731 GtkTextBuffer * buffer)
1733 int prev_insert_offset, prev_selection_bound;
1734 int insert_offset, selection_bound;
1737 prev_insert_offset = accessible->priv->insert_offset;
1738 prev_selection_bound = accessible->priv->selection_bound;
1740 gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer));
1741 insert_offset = gtk_text_iter_get_offset (&iter);
1742 gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_selection_bound (buffer));
1743 selection_bound = gtk_text_iter_get_offset (&iter);
1745 if (prev_insert_offset == insert_offset && prev_selection_bound == selection_bound)
1748 accessible->priv->insert_offset = insert_offset;
1749 accessible->priv->selection_bound = selection_bound;
1751 if (prev_insert_offset != insert_offset)
1752 g_signal_emit_by_name (accessible, "text-caret-moved", insert_offset);
1754 if (prev_insert_offset != prev_selection_bound || insert_offset != selection_bound)
1755 g_signal_emit_by_name (accessible, "text-selection-changed");
1759 insert_text_cb (GtkTextBuffer *buffer,
1765 GtkTextViewAccessible *accessible = data;
1769 position = gtk_text_iter_get_offset (iter);
1770 length = g_utf8_strlen (text, len);
1772 g_signal_emit_by_name (accessible, "text-changed::insert", position - length, length);
1774 gtk_text_view_accessible_update_cursor (accessible, buffer);
1778 delete_range_cb (GtkTextBuffer *buffer,
1783 GtkTextViewAccessible *accessible = data;
1784 gint offset, length;
1786 offset = gtk_text_iter_get_offset (start);
1787 length = gtk_text_iter_get_offset (end) - offset;
1789 g_signal_emit_by_name (accessible,
1790 "text-changed::delete",
1794 gtk_text_view_accessible_update_cursor (accessible, buffer);
1798 mark_set_cb (GtkTextBuffer *buffer,
1799 GtkTextIter *location,
1803 GtkTextViewAccessible *accessible = data;
1806 * Only generate the signal for the "insert" mark, which
1807 * represents the cursor.
1809 if (mark == gtk_text_buffer_get_insert (buffer))
1811 gtk_text_view_accessible_update_cursor (accessible, buffer);
1813 else if (mark == gtk_text_buffer_get_selection_bound (buffer))
1815 gtk_text_view_accessible_update_cursor (accessible, buffer);
1820 gail_streamable_content_get_n_mime_types (AtkStreamableContent *streamable)
1823 GtkTextBuffer *buffer;
1824 gint n_mime_types = 0;
1826 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1830 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1834 gboolean advertises_plaintext = FALSE;
1837 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1838 for (i = 0; i < n_mime_types-1; ++i)
1839 if (!strcmp ("text/plain", gdk_atom_name (atoms[i])))
1840 advertises_plaintext = TRUE;
1841 if (!advertises_plaintext)
1845 return n_mime_types;
1848 static const gchar *
1849 gail_streamable_content_get_mime_type (AtkStreamableContent *streamable,
1853 GtkTextBuffer *buffer;
1855 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1859 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1862 gint n_mime_types = 0;
1865 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1866 if (i < n_mime_types)
1867 return gdk_atom_name (atoms [i]);
1868 else if (i == n_mime_types)
1869 return "text/plain";
1876 gail_streamable_content_get_stream (AtkStreamableContent *streamable,
1877 const gchar *mime_type)
1880 GtkTextBuffer *buffer;
1881 gint i, n_mime_types = 0;
1884 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1888 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1892 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1894 for (i = 0; i < n_mime_types; ++i)
1896 if (!strcmp ("text/plain", mime_type) ||
1897 !strcmp (gdk_atom_name (atoms[i]), mime_type))
1903 GtkTextIter start, end;
1904 GIOChannel *gio = NULL;
1907 gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
1908 gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
1909 if (!strcmp ("text/plain", mime_type))
1911 cbuf = (guint8*) gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1912 len = strlen ((const char *) cbuf);
1916 cbuf = gtk_text_buffer_serialize (buffer, buffer, atoms[i], &start, &end, &len);
1918 g_snprintf (tname, 20, "streamXXXXXX");
1919 fd = g_mkstemp (tname);
1920 gio = g_io_channel_unix_new (fd);
1921 g_io_channel_set_encoding (gio, NULL, &err);
1923 g_io_channel_write_chars (gio, (const char *) cbuf, (gssize) len, &written, &err);
1925 g_message ("%s", err->message);
1927 g_io_channel_seek_position (gio, 0, G_SEEK_SET, &err);
1929 g_message ("%s", err->message);
1931 g_io_channel_flush (gio, &err);
1933 g_message ("%s", err->message);
1936 g_message ("<error writing to stream [%s]>", tname);
1939 /* make sure the file is removed on unref of the giochannel */
1952 atk_streamable_content_interface_init (AtkStreamableContentIface *iface)
1954 iface->get_n_mime_types = gail_streamable_content_get_n_mime_types;
1955 iface->get_mime_type = gail_streamable_content_get_mime_type;
1956 iface->get_stream = gail_streamable_content_get_stream;
1960 _gtk_text_view_accessible_set_buffer (GtkTextView *textview,
1961 GtkTextBuffer *old_buffer)
1963 GtkTextViewAccessible *accessible;
1965 g_return_if_fail (GTK_IS_TEXT_VIEW (textview));
1966 g_return_if_fail (old_buffer == NULL || GTK_IS_TEXT_BUFFER (old_buffer));
1968 accessible = GTK_TEXT_VIEW_ACCESSIBLE (_gtk_widget_peek_accessible (GTK_WIDGET (textview)));
1969 if (accessible == NULL)
1972 gtk_text_view_accessible_change_buffer (accessible,
1974 gtk_text_view_get_buffer (textview));