1 /* GAIL - The GNOME Accessibility Implementation Library
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, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
22 #include <sys/types.h>
30 #include <glib-object.h>
31 #include <glib/gstdio.h>
33 #include "gtktextviewaccessible.h"
36 static void setup_buffer (GtkTextView *view,GtkTextViewAccessible *accessible);
37 static void insert_text_cb (GtkTextBuffer *buffer,
42 static void delete_range_cb (GtkTextBuffer *buffer,
46 static void mark_set_cb (GtkTextBuffer *buffer,
52 static void atk_editable_text_interface_init (AtkEditableTextIface *iface);
53 static void atk_text_interface_init (AtkTextIface *iface);
54 static void atk_streamable_content_interface_init (AtkStreamableContentIface *iface);
56 G_DEFINE_TYPE_WITH_CODE (GtkTextViewAccessible, _gtk_text_view_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
57 G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, atk_editable_text_interface_init)
58 G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, atk_text_interface_init)
59 G_IMPLEMENT_INTERFACE (ATK_TYPE_STREAMABLE_CONTENT, atk_streamable_content_interface_init))
63 gtk_text_view_accessible_initialize (AtkObject *obj,
66 ATK_OBJECT_CLASS (_gtk_text_view_accessible_parent_class)->initialize (obj, data);
68 setup_buffer (GTK_TEXT_VIEW (data), GTK_TEXT_VIEW_ACCESSIBLE (obj));
70 obj->role = ATK_ROLE_TEXT;
74 gtk_text_view_accessible_notify_gtk (GObject *obj,
79 atk_obj = gtk_widget_get_accessible (GTK_WIDGET (obj));
81 if (!strcmp (pspec->name, "editable"))
85 editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (obj));
86 atk_object_notify_state_change (atk_obj, ATK_STATE_EDITABLE, editable);
88 else if (!strcmp (pspec->name, "buffer"))
90 setup_buffer (GTK_TEXT_VIEW (obj), GTK_TEXT_VIEW_ACCESSIBLE (atk_obj));
93 GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_text_view_accessible_parent_class)->notify_gtk (obj, pspec);
97 gtk_text_view_accessible_ref_state_set (AtkObject *accessible)
99 AtkStateSet *state_set;
102 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible));
106 state_set = ATK_OBJECT_CLASS (_gtk_text_view_accessible_parent_class)->ref_state_set (accessible);
108 if (gtk_text_view_get_editable (GTK_TEXT_VIEW (widget)))
109 atk_state_set_add_state (state_set, ATK_STATE_EDITABLE);
110 atk_state_set_add_state (state_set, ATK_STATE_MULTI_LINE);
116 _gtk_text_view_accessible_class_init (GtkTextViewAccessibleClass *klass)
118 AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
119 GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass;
121 class->ref_state_set = gtk_text_view_accessible_ref_state_set;
122 class->initialize = gtk_text_view_accessible_initialize;
124 widget_class->notify_gtk = gtk_text_view_accessible_notify_gtk;
128 _gtk_text_view_accessible_init (GtkTextViewAccessible *accessible)
133 setup_buffer (GtkTextView *view,
134 GtkTextViewAccessible *accessible)
136 GtkTextBuffer *buffer;
138 buffer = gtk_text_view_get_buffer (view);
140 /* Set up signal callbacks */
141 g_signal_connect_after (buffer, "insert-text", G_CALLBACK (insert_text_cb), view);
142 g_signal_connect (buffer, "delete-range", G_CALLBACK (delete_range_cb), view);
143 g_signal_connect_after (buffer, "mark-set", G_CALLBACK (mark_set_cb), view);
147 gtk_text_view_accessible_get_text (AtkText *text,
152 GtkTextBuffer *buffer;
153 GtkTextIter start, end;
156 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
160 view = GTK_TEXT_VIEW (widget);
161 buffer = gtk_text_view_get_buffer (view);
162 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
163 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
165 return gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
169 gtk_text_view_accessible_get_text_after_offset (AtkText *text,
171 AtkTextBoundary boundary_type,
177 GtkTextBuffer *buffer;
179 GtkTextIter start, end;
181 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
185 view = GTK_TEXT_VIEW (widget);
186 buffer = gtk_text_view_get_buffer (view);
187 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
189 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
191 gtk_text_view_forward_display_line (view, &end);
193 gtk_text_view_forward_display_line (view, &end);
195 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
197 gtk_text_view_forward_display_line_end (view, &end);
199 gtk_text_view_forward_display_line (view, &end);
200 gtk_text_view_forward_display_line_end (view, &end);
203 _gtk_text_buffer_get_text_after (buffer, boundary_type, &pos, &start, &end);
205 *start_offset = gtk_text_iter_get_offset (&start);
206 *end_offset = gtk_text_iter_get_offset (&end);
208 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
212 gtk_text_view_accessible_get_text_at_offset (AtkText *text,
214 AtkTextBoundary boundary_type,
220 GtkTextBuffer *buffer;
222 GtkTextIter start, end;
224 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
228 view = GTK_TEXT_VIEW (widget);
229 buffer = gtk_text_view_get_buffer (view);
230 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
232 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
234 gtk_text_view_backward_display_line_start (view, &start);
235 gtk_text_view_forward_display_line (view, &end);
237 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
239 gtk_text_view_backward_display_line_start (view, &start);
240 if (!gtk_text_iter_is_start (&start))
242 gtk_text_view_backward_display_line (view, &start);
243 gtk_text_view_forward_display_line_end (view, &start);
245 gtk_text_view_forward_display_line_end (view, &end);
248 _gtk_text_buffer_get_text_at (buffer, boundary_type, &pos, &start, &end);
250 *start_offset = gtk_text_iter_get_offset (&start);
251 *end_offset = gtk_text_iter_get_offset (&end);
253 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
257 gtk_text_view_accessible_get_text_before_offset (AtkText *text,
259 AtkTextBoundary boundary_type,
265 GtkTextBuffer *buffer;
267 GtkTextIter start, end;
269 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
273 view = GTK_TEXT_VIEW (widget);
274 buffer = gtk_text_view_get_buffer (view);
275 gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset);
278 if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START)
280 gtk_text_view_backward_display_line_start (view, &start);
282 gtk_text_view_backward_display_line (view, &start);
283 gtk_text_view_backward_display_line_start (view, &start);
285 else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END)
287 gtk_text_view_backward_display_line_start (view, &start);
288 if (!gtk_text_iter_is_start (&start))
290 gtk_text_view_backward_display_line (view, &start);
292 gtk_text_view_forward_display_line_end (view, &end);
293 if (!gtk_text_iter_is_start (&start))
295 if (gtk_text_view_backward_display_line (view, &start))
296 gtk_text_view_forward_display_line_end (view, &start);
298 gtk_text_iter_set_offset (&start, 0);
305 _gtk_text_buffer_get_text_before (buffer, boundary_type, &pos, &start, &end);
307 *start_offset = gtk_text_iter_get_offset (&start);
308 *end_offset = gtk_text_iter_get_offset (&end);
310 return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
314 gtk_text_view_accessible_get_character_at_offset (AtkText *text,
318 GtkTextIter start, end;
319 GtkTextBuffer *buffer;
323 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
327 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
328 if (offset >= gtk_text_buffer_get_char_count (buffer))
331 gtk_text_buffer_get_iter_at_offset (buffer, &start, offset);
333 gtk_text_iter_forward_char (&end);
334 string = gtk_text_buffer_get_slice (buffer, &start, &end, FALSE);
335 unichar = g_utf8_get_char (string);
342 gtk_text_view_accessible_get_character_count (AtkText *text)
345 GtkTextBuffer *buffer;
347 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
351 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
352 return gtk_text_buffer_get_char_count (buffer);
356 get_insert_offset (GtkTextBuffer *buffer)
361 insert = gtk_text_buffer_get_insert (buffer);
362 gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
363 return gtk_text_iter_get_offset (&iter);
367 gtk_text_view_accessible_get_caret_offset (AtkText *text)
370 GtkTextBuffer *buffer;
372 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
376 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
377 return get_insert_offset (buffer);
381 gtk_text_view_accessible_set_caret_offset (AtkText *text,
386 GtkTextBuffer *buffer;
389 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
393 view = GTK_TEXT_VIEW (widget);
394 buffer = gtk_text_view_get_buffer (view);
396 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
397 gtk_text_buffer_place_cursor (buffer, &iter);
398 gtk_text_view_scroll_to_iter (view, &iter, 0, FALSE, 0, 0);
404 gtk_text_view_accessible_get_offset_at_point (AtkText *text,
411 gint x_widget, y_widget, x_window, y_window, buff_x, buff_y;
416 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
420 view = GTK_TEXT_VIEW (widget);
421 window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_WIDGET);
422 gdk_window_get_origin (window, &x_widget, &y_widget);
424 if (coords == ATK_XY_SCREEN)
429 else if (coords == ATK_XY_WINDOW)
431 window = gdk_window_get_toplevel (window);
432 gdk_window_get_origin (window, &x_window, &y_window);
434 x = x - x_widget + x_window;
435 y = y - y_widget + y_window;
440 gtk_text_view_window_to_buffer_coords (view, GTK_TEXT_WINDOW_WIDGET,
441 x, y, &buff_x, &buff_y);
442 gtk_text_view_get_visible_rect (view, &rect);
444 /* Clamp point to visible rectangle */
445 buff_x = CLAMP (buff_x, rect.x, rect.x + rect.width - 1);
446 buff_y = CLAMP (buff_y, rect.y, rect.y + rect.height - 1);
448 gtk_text_view_get_iter_at_location (view, &iter, buff_x, buff_y);
450 /* The iter at a location sometimes points to the next character.
451 * See bug 111031. We work around that
453 gtk_text_view_get_iter_location (view, &iter, &rect);
455 gtk_text_iter_backward_char (&iter);
456 return gtk_text_iter_get_offset (&iter);
460 gtk_text_view_accessible_get_character_extents (AtkText *text,
469 GtkTextBuffer *buffer;
472 GdkRectangle rectangle;
474 gint x_widget, y_widget, x_window, y_window;
476 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
480 view = GTK_TEXT_VIEW (widget);
481 buffer = gtk_text_view_get_buffer (view);
482 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
483 gtk_text_view_get_iter_location (view, &iter, &rectangle);
485 window = gtk_text_view_get_window (view, GTK_TEXT_WINDOW_WIDGET);
486 gdk_window_get_origin (window, &x_widget, &y_widget);
488 *height = rectangle.height;
489 *width = rectangle.width;
491 gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_WIDGET,
492 rectangle.x, rectangle.y, x, y);
493 if (coords == ATK_XY_WINDOW)
495 window = gdk_window_get_toplevel (window);
496 gdk_window_get_origin (window, &x_window, &y_window);
497 *x += x_widget - x_window;
498 *y += y_widget - y_window;
500 else if (coords == ATK_XY_SCREEN)
514 static AtkAttributeSet *
515 add_text_attribute (AtkAttributeSet *attributes,
516 AtkTextAttribute attr,
521 at = g_new (AtkAttribute, 1);
522 at->name = g_strdup (atk_text_attribute_get_name (attr));
525 return g_slist_prepend (attributes, at);
528 static AtkAttributeSet *
529 add_text_int_attribute (AtkAttributeSet *attributes,
530 AtkTextAttribute attr,
536 value = g_strdup (atk_text_attribute_get_value (attr, i));
538 return add_text_attribute (attributes, attr, value);
541 static AtkAttributeSet *
542 gtk_text_view_accessible_get_run_attributes (AtkText *text,
548 GtkTextBuffer *buffer;
551 AtkAttributeSet *attrib_set = NULL;
552 GSList *tags, *temp_tags;
554 gboolean val_set = FALSE;
557 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
561 view = GTK_TEXT_VIEW (widget);
562 buffer = gtk_text_view_get_buffer (view);
564 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
566 gtk_text_iter_forward_to_tag_toggle (&iter, NULL);
567 *end_offset = gtk_text_iter_get_offset (&iter);
569 gtk_text_iter_backward_to_tag_toggle (&iter, NULL);
570 *start_offset = gtk_text_iter_get_offset (&iter);
572 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
574 tags = gtk_text_iter_get_tags (&iter);
575 tags = g_slist_reverse (tags);
578 while (temp_tags && !val_set)
580 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
582 g_object_get (tag, "style-set", &val_set, NULL);
586 g_object_get (tag, "style", &style, NULL);
587 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STYLE, style);
589 temp_tags = temp_tags->next;
594 while (temp_tags && !val_set)
596 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
598 g_object_get (tag, "variant-set", &val_set, NULL);
601 PangoVariant variant;
602 g_object_get (tag, "variant", &variant, NULL);
603 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_VARIANT, variant);
605 temp_tags = temp_tags->next;
610 while (temp_tags && !val_set)
612 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
614 g_object_get (tag, "stretch-set", &val_set, NULL);
617 PangoStretch stretch;
618 g_object_get (tag, "stretch", &stretch, NULL);
619 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRETCH, stretch);
621 temp_tags = temp_tags->next;
626 while (temp_tags && !val_set)
628 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
630 g_object_get (tag, "justification-set", &val_set, NULL);
633 GtkJustification justification;
634 g_object_get (tag, "justification", &justification, NULL);
635 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_JUSTIFICATION, justification);
637 temp_tags = temp_tags->next;
642 while (temp_tags && !val_set)
644 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
645 GtkTextDirection direction;
647 g_object_get (tag, "direction", &direction, NULL);
649 if (direction != GTK_TEXT_DIR_NONE)
652 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_DIRECTION, direction);
654 temp_tags = temp_tags->next;
659 while (temp_tags && !val_set)
661 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
663 g_object_get (tag, "wrap-mode-set", &val_set, NULL);
666 GtkWrapMode wrap_mode;
667 g_object_get (tag, "wrap-mode", &wrap_mode, NULL);
668 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_WRAP_MODE, wrap_mode);
670 temp_tags = temp_tags->next;
675 while (temp_tags && !val_set)
677 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
679 g_object_get (tag, "foreground-set", &val_set, NULL);
685 g_object_get (tag, "foreground-rgba", &rgba, NULL);
686 value = g_strdup_printf ("%u,%u,%u",
687 (guint) rgba->red * 65535,
688 (guint) rgba->green * 65535,
689 (guint) rgba->blue * 65535);
690 gdk_rgba_free (rgba);
691 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FG_COLOR, value);
693 temp_tags = temp_tags->next;
698 while (temp_tags && !val_set)
700 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
702 g_object_get (tag, "background-set", &val_set, NULL);
708 g_object_get (tag, "background-rgba", &rgba, NULL);
709 value = g_strdup_printf ("%u,%u,%u",
710 (guint) rgba->red * 65535,
711 (guint) rgba->green * 65535,
712 (guint) rgba->blue * 65535);
713 gdk_rgba_free (rgba);
714 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_BG_COLOR, value);
716 temp_tags = temp_tags->next;
721 while (temp_tags && !val_set)
723 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
725 g_object_get (tag, "family-set", &val_set, NULL);
730 g_object_get (tag, "family", &value, NULL);
731 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_FAMILY_NAME, value);
733 temp_tags = temp_tags->next;
738 while (temp_tags && !val_set)
740 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
742 g_object_get (tag, "language-set", &val_set, NULL);
747 g_object_get (tag, "language", &value, NULL);
748 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LANGUAGE, value);
750 temp_tags = temp_tags->next;
755 while (temp_tags && !val_set)
757 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
759 g_object_get (tag, "weight-set", &val_set, NULL);
765 g_object_get (tag, "weight", &weight, NULL);
766 value = g_strdup_printf ("%d", weight);
767 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_WEIGHT, value);
769 temp_tags = temp_tags->next;
773 /* scale is special as the effective value is the product
774 * of all specified values
779 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
782 g_object_get (tag, "scale-set", &scale_set, NULL);
786 g_object_get (tag, "scale", &font_scale, NULL);
790 temp_tags = temp_tags->next;
795 value = g_strdup_printf ("%g", scale);
796 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SCALE, value);
801 while (temp_tags && !val_set)
803 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
805 g_object_get (tag, "size-set", &val_set, NULL);
810 g_object_get (tag, "size", &size, NULL);
811 value = g_strdup_printf ("%i", size);
812 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_SIZE, value);
814 temp_tags = temp_tags->next;
819 while (temp_tags && !val_set)
821 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
823 g_object_get (tag, "strikethrough-set", &val_set, NULL);
826 gboolean strikethrough;
827 g_object_get (tag, "strikethrough", &strikethrough, NULL);
828 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_STRIKETHROUGH, strikethrough);
830 temp_tags = temp_tags->next;
835 while (temp_tags && !val_set)
837 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
839 g_object_get (tag, "underline-set", &val_set, NULL);
842 PangoUnderline underline;
843 g_object_get (tag, "underline", &underline, NULL);
844 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_UNDERLINE, underline);
846 temp_tags = temp_tags->next;
851 while (temp_tags && !val_set)
853 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
855 g_object_get (tag, "rise-set", &val_set, NULL);
860 g_object_get (tag, "rise", &rise, NULL);
861 value = g_strdup_printf ("%i", rise);
862 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RISE, value);
864 temp_tags = temp_tags->next;
869 while (temp_tags && !val_set)
871 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
873 g_object_get (tag, "background-full-height-set", &val_set, NULL);
876 gboolean bg_full_height;
877 g_object_get (tag, "background-full-height", &bg_full_height, NULL);
878 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_BG_FULL_HEIGHT, bg_full_height);
880 temp_tags = temp_tags->next;
885 while (temp_tags && !val_set)
887 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
889 g_object_get (tag, "pixels-inside-wrap-set", &val_set, NULL);
894 g_object_get (tag, "pixels-inside-wrap", &pixels, NULL);
895 value = g_strdup_printf ("%i", pixels);
896 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
898 temp_tags = temp_tags->next;
903 while (temp_tags && !val_set)
905 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
907 g_object_get (tag, "pixels-below-lines-set", &val_set, NULL);
912 g_object_get (tag, "pixels-below-lines", &pixels, NULL);
913 value = g_strdup_printf ("%i", pixels);
914 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
916 temp_tags = temp_tags->next;
921 while (temp_tags && !val_set)
923 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
925 g_object_get (tag, "pixels-above-lines-set", &val_set, NULL);
930 g_object_get (tag, "pixels-above-lines", &pixels, NULL);
931 value = g_strdup_printf ("%i", pixels);
932 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
934 temp_tags = temp_tags->next;
939 while (temp_tags && !val_set)
941 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
943 g_object_get (tag, "editable-set", &val_set, NULL);
947 g_object_get (tag, "editable", &editable, NULL);
948 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_EDITABLE, editable);
950 temp_tags = temp_tags->next;
955 while (temp_tags && !val_set)
957 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
959 g_object_get (tag, "invisible-set", &val_set, NULL);
963 g_object_get (tag, "invisible", &invisible, NULL);
964 attrib_set = add_text_int_attribute (attrib_set, ATK_TEXT_ATTR_INVISIBLE, invisible);
966 temp_tags = temp_tags->next;
971 while (temp_tags && !val_set)
973 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
975 g_object_get (tag, "indent-set", &val_set, NULL);
980 g_object_get (tag, "indent", &indent, NULL);
981 value = g_strdup_printf ("%i", indent);
982 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_INDENT, value);
984 temp_tags = temp_tags->next;
989 while (temp_tags && !val_set)
991 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
993 g_object_get (tag, "right-margin-set", &val_set, NULL);
998 g_object_get (tag, "right-margin", &margin, NULL);
999 value = g_strdup_printf ("%i", margin);
1000 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
1002 temp_tags = temp_tags->next;
1007 while (temp_tags && !val_set)
1009 GtkTextTag *tag = GTK_TEXT_TAG (temp_tags->data);
1011 g_object_get (tag, "left-margin-set", &val_set, NULL);
1016 g_object_get (tag, "left-margin", &margin, NULL);
1017 value = g_strdup_printf ("%i", margin);
1018 attrib_set = add_text_attribute (attrib_set, ATK_TEXT_ATTR_LEFT_MARGIN, value);
1020 temp_tags = temp_tags->next;
1024 g_slist_free (tags);
1028 static AtkAttributeSet *
1029 gtk_text_view_accessible_get_default_attributes (AtkText *text)
1033 GtkTextAttributes *text_attrs;
1034 AtkAttributeSet *attributes;
1035 PangoFontDescription *font;
1038 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1042 view = GTK_TEXT_VIEW (widget);
1043 text_attrs = gtk_text_view_get_default_attributes (view);
1047 font = text_attrs->font;
1051 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STYLE,
1052 pango_font_description_get_style (font));
1054 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_VARIANT,
1055 pango_font_description_get_variant (font));
1057 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRETCH,
1058 pango_font_description_get_stretch (font));
1060 value = g_strdup (pango_font_description_get_family (font));
1061 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FAMILY_NAME, value);
1063 value = g_strdup_printf ("%d", pango_font_description_get_weight (font));
1064 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_WEIGHT, value);
1066 value = g_strdup_printf ("%i", pango_font_description_get_size (font) / PANGO_SCALE);
1067 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SIZE, value);
1070 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_JUSTIFICATION, text_attrs->justification);
1071 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_DIRECTION, text_attrs->direction);
1072 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_WRAP_MODE, text_attrs->wrap_mode);
1073 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_EDITABLE, text_attrs->editable);
1074 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_INVISIBLE, text_attrs->invisible);
1075 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_BG_FULL_HEIGHT, text_attrs->bg_full_height);
1077 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_STRIKETHROUGH,
1078 text_attrs->appearance.strikethrough);
1079 attributes = add_text_int_attribute (attributes, ATK_TEXT_ATTR_UNDERLINE,
1080 text_attrs->appearance.underline);
1082 value = g_strdup_printf ("%u,%u,%u",
1083 text_attrs->appearance.bg_color.red,
1084 text_attrs->appearance.bg_color.green,
1085 text_attrs->appearance.bg_color.blue);
1086 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_BG_COLOR, value);
1088 value = g_strdup_printf ("%u,%u,%u",
1089 text_attrs->appearance.fg_color.red,
1090 text_attrs->appearance.fg_color.green,
1091 text_attrs->appearance.fg_color.blue);
1092 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_FG_COLOR, value);
1094 value = g_strdup_printf ("%g", text_attrs->font_scale);
1095 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_SCALE, value);
1097 value = g_strdup ((gchar *)(text_attrs->language));
1098 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LANGUAGE, value);
1100 value = g_strdup_printf ("%i", text_attrs->appearance.rise);
1101 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RISE, value);
1103 value = g_strdup_printf ("%i", text_attrs->pixels_inside_wrap);
1104 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP, value);
1106 value = g_strdup_printf ("%i", text_attrs->pixels_below_lines);
1107 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_BELOW_LINES, value);
1109 value = g_strdup_printf ("%i", text_attrs->pixels_above_lines);
1110 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_PIXELS_ABOVE_LINES, value);
1112 value = g_strdup_printf ("%i", text_attrs->indent);
1113 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_INDENT, value);
1115 value = g_strdup_printf ("%i", text_attrs->left_margin);
1116 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_LEFT_MARGIN, value);
1118 value = g_strdup_printf ("%i", text_attrs->right_margin);
1119 attributes = add_text_attribute (attributes, ATK_TEXT_ATTR_RIGHT_MARGIN, value);
1121 gtk_text_attributes_unref (text_attrs);
1126 gtk_text_view_accessible_get_n_selections (AtkText *text)
1129 GtkTextBuffer *buffer;
1131 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1135 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1136 if (gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
1143 gtk_text_view_accessible_get_selection (AtkText *atk_text,
1150 GtkTextBuffer *buffer;
1151 GtkTextIter start, end;
1154 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (atk_text));
1158 if (selection_num != 0)
1161 view = GTK_TEXT_VIEW (widget);
1162 buffer = gtk_text_view_get_buffer (view);
1164 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1165 text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1169 *start_pos = gtk_text_iter_get_offset (&start);
1170 *end_pos = gtk_text_iter_get_offset (&end);
1176 gtk_text_view_accessible_add_selection (AtkText *text,
1181 GtkTextBuffer *buffer;
1182 GtkTextIter start, end;
1184 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1188 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1190 if (!gtk_text_buffer_get_selection_bounds (buffer, NULL, NULL))
1192 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1193 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1194 gtk_text_buffer_select_range (buffer, &end, &start);
1203 gtk_text_view_accessible_remove_selection (AtkText *text,
1207 GtkTextBuffer *buffer;
1208 GtkTextMark *insert;
1210 GtkTextIter start, end;
1212 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1216 if (selection_num != 0)
1219 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1221 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1223 insert = gtk_text_buffer_get_insert (buffer);
1224 gtk_text_buffer_get_iter_at_mark (buffer, &iter, insert);
1225 gtk_text_buffer_place_cursor (buffer, &iter);
1233 gtk_text_view_accessible_set_selection (AtkText *text,
1239 GtkTextBuffer *buffer;
1240 GtkTextIter start, end;
1242 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1246 if (selection_num != 0)
1249 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1251 if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
1253 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1254 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1255 gtk_text_buffer_select_range (buffer, &end, &start);
1264 atk_text_interface_init (AtkTextIface *iface)
1266 iface->get_text = gtk_text_view_accessible_get_text;
1267 iface->get_text_after_offset = gtk_text_view_accessible_get_text_after_offset;
1268 iface->get_text_at_offset = gtk_text_view_accessible_get_text_at_offset;
1269 iface->get_text_before_offset = gtk_text_view_accessible_get_text_before_offset;
1270 iface->get_character_at_offset = gtk_text_view_accessible_get_character_at_offset;
1271 iface->get_character_count = gtk_text_view_accessible_get_character_count;
1272 iface->get_caret_offset = gtk_text_view_accessible_get_caret_offset;
1273 iface->set_caret_offset = gtk_text_view_accessible_set_caret_offset;
1274 iface->get_offset_at_point = gtk_text_view_accessible_get_offset_at_point;
1275 iface->get_character_extents = gtk_text_view_accessible_get_character_extents;
1276 iface->get_n_selections = gtk_text_view_accessible_get_n_selections;
1277 iface->get_selection = gtk_text_view_accessible_get_selection;
1278 iface->add_selection = gtk_text_view_accessible_add_selection;
1279 iface->remove_selection = gtk_text_view_accessible_remove_selection;
1280 iface->set_selection = gtk_text_view_accessible_set_selection;
1281 iface->get_run_attributes = gtk_text_view_accessible_get_run_attributes;
1282 iface->get_default_attributes = gtk_text_view_accessible_get_default_attributes;
1285 /* atkeditabletext.h */
1288 gtk_text_view_accessible_set_run_attributes (AtkEditableText *text,
1289 AtkAttributeSet *attributes,
1294 GtkTextBuffer *buffer;
1304 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1308 view = GTK_TEXT_VIEW (widget);
1309 if (!gtk_text_view_get_editable (view))
1312 buffer = gtk_text_view_get_buffer (view);
1314 if (attributes == NULL)
1317 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_offset);
1318 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_offset);
1320 tag = gtk_text_buffer_create_tag (buffer, NULL, NULL);
1322 for (l = attributes; l; l = l->next)
1333 if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LEFT_MARGIN)))
1334 g_object_set (G_OBJECT (tag), "left-margin", atoi (value), NULL);
1336 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RIGHT_MARGIN)))
1337 g_object_set (G_OBJECT (tag), "right-margin", atoi (value), NULL);
1339 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INDENT)))
1340 g_object_set (G_OBJECT (tag), "indent", atoi (value), NULL);
1342 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_ABOVE_LINES)))
1343 g_object_set (G_OBJECT (tag), "pixels-above-lines", atoi (value), NULL);
1345 else if (!strcmp(name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_BELOW_LINES)))
1346 g_object_set (G_OBJECT (tag), "pixels-below-lines", atoi (value), NULL);
1348 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP)))
1349 g_object_set (G_OBJECT (tag), "pixels-inside-wrap", atoi (value), NULL);
1351 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_SIZE)))
1352 g_object_set (G_OBJECT (tag), "size", atoi (value), NULL);
1354 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_RISE)))
1355 g_object_set (G_OBJECT (tag), "rise", atoi (value), NULL);
1357 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WEIGHT)))
1358 g_object_set (G_OBJECT (tag), "weight", atoi (value), NULL);
1360 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_FULL_HEIGHT)))
1362 g_object_set (G_OBJECT (tag), "bg-full-height",
1363 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_BG_FULL_HEIGHT, 0))),
1367 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_LANGUAGE)))
1368 g_object_set (G_OBJECT (tag), "language", value, NULL);
1370 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FAMILY_NAME)))
1371 g_object_set (G_OBJECT (tag), "family", value, NULL);
1373 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_EDITABLE)))
1375 g_object_set (G_OBJECT (tag), "editable",
1376 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
1380 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_INVISIBLE)))
1382 g_object_set (G_OBJECT (tag), "invisible",
1383 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_EDITABLE, 0))),
1387 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_UNDERLINE)))
1389 for (j = 0; j < 3; j++)
1391 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_UNDERLINE, j)))
1393 g_object_set (G_OBJECT (tag), "underline", j, NULL);
1399 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRIKETHROUGH)))
1401 g_object_set (G_OBJECT (tag), "strikethrough",
1402 (strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRIKETHROUGH, 0))),
1406 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_COLOR)))
1408 RGB_vals = g_strsplit (value, ",", 3);
1409 color = g_malloc (sizeof (GdkColor));
1410 color->red = atoi (RGB_vals[0]);
1411 color->green = atoi (RGB_vals[1]);
1412 color->blue = atoi (RGB_vals[2]);
1413 g_object_set (G_OBJECT (tag), "background-gdk", color, NULL);
1416 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_FG_COLOR)))
1418 RGB_vals = g_strsplit (value, ",", 3);
1419 color = g_malloc (sizeof (GdkColor));
1420 color->red = atoi (RGB_vals[0]);
1421 color->green = atoi (RGB_vals[1]);
1422 color->blue = atoi (RGB_vals[2]);
1423 g_object_set (G_OBJECT (tag), "foreground-gdk", color, NULL);
1426 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STRETCH)))
1428 for (j = 0; j < 9; j++)
1430 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STRETCH, j)))
1432 g_object_set (G_OBJECT (tag), "stretch", j, NULL);
1438 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_JUSTIFICATION)))
1440 for (j = 0; j < 4; j++)
1442 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_JUSTIFICATION, j)))
1444 g_object_set (G_OBJECT (tag), "justification", j, NULL);
1450 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_DIRECTION)))
1452 for (j = 0; j < 3; j++)
1454 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_DIRECTION, j)))
1456 g_object_set (G_OBJECT (tag), "direction", j, NULL);
1462 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_VARIANT)))
1464 for (j = 0; j < 2; j++)
1466 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_VARIANT, j)))
1468 g_object_set (G_OBJECT (tag), "variant", j, NULL);
1474 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_WRAP_MODE)))
1476 for (j = 0; j < 3; j++)
1478 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_WRAP_MODE, j)))
1480 g_object_set (G_OBJECT (tag), "wrap-mode", j, NULL);
1486 else if (!strcmp (name, atk_text_attribute_get_name (ATK_TEXT_ATTR_STYLE)))
1488 for (j = 0; j < 3; j++)
1490 if (!strcmp (value, atk_text_attribute_get_value (ATK_TEXT_ATTR_STYLE, j)))
1492 g_object_set (G_OBJECT (tag), "style", j, NULL);
1502 gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
1508 gtk_text_view_accessible_set_text_contents (AtkEditableText *text,
1509 const gchar *string)
1513 GtkTextBuffer *buffer;
1515 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1519 view = GTK_TEXT_VIEW (widget);
1520 if (!gtk_text_view_get_editable (view))
1523 buffer = gtk_text_view_get_buffer (view);
1524 gtk_text_buffer_set_text (buffer, string, -1);
1528 gtk_text_view_accessible_insert_text (AtkEditableText *text,
1529 const gchar *string,
1535 GtkTextBuffer *buffer;
1538 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1542 view = GTK_TEXT_VIEW (widget);
1543 if (!gtk_text_view_get_editable (view))
1546 buffer = gtk_text_view_get_buffer (view);
1547 gtk_text_buffer_get_iter_at_offset (buffer, &iter, *position);
1548 gtk_text_buffer_insert (buffer, &iter, string, length);
1552 gtk_text_view_accessible_copy_text (AtkEditableText *text,
1557 GtkTextBuffer *buffer;
1558 GtkTextIter start, end;
1560 GtkClipboard *clipboard;
1562 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1566 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1568 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1569 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1570 str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1572 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1573 gtk_clipboard_set_text (clipboard, str, -1);
1577 gtk_text_view_accessible_cut_text (AtkEditableText *text,
1583 GtkTextBuffer *buffer;
1584 GtkTextIter start, end;
1586 GtkClipboard *clipboard;
1588 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1592 view = GTK_TEXT_VIEW (widget);
1593 if (!gtk_text_view_get_editable (view))
1595 buffer = gtk_text_view_get_buffer (view);
1597 gtk_text_buffer_get_iter_at_offset (buffer, &start, start_pos);
1598 gtk_text_buffer_get_iter_at_offset (buffer, &end, end_pos);
1599 str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1600 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1601 gtk_clipboard_set_text (clipboard, str, -1);
1602 gtk_text_buffer_delete (buffer, &start, &end);
1606 gtk_text_view_accessible_delete_text (AtkEditableText *text,
1612 GtkTextBuffer *buffer;
1613 GtkTextIter start_itr;
1614 GtkTextIter end_itr;
1616 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1620 view = GTK_TEXT_VIEW (widget);
1621 if (!gtk_text_view_get_editable (view))
1623 buffer = gtk_text_view_get_buffer (view);
1625 gtk_text_buffer_get_iter_at_offset (buffer, &start_itr, start_pos);
1626 gtk_text_buffer_get_iter_at_offset (buffer, &end_itr, end_pos);
1627 gtk_text_buffer_delete (buffer, &start_itr, &end_itr);
1632 GtkTextBuffer* buffer;
1637 paste_received (GtkClipboard *clipboard,
1641 PasteData* paste = data;
1642 GtkTextIter pos_itr;
1646 gtk_text_buffer_get_iter_at_offset (paste->buffer, &pos_itr, paste->position);
1647 gtk_text_buffer_insert (paste->buffer, &pos_itr, text, -1);
1650 g_object_unref (paste->buffer);
1654 gtk_text_view_accessible_paste_text (AtkEditableText *text,
1659 GtkTextBuffer *buffer;
1661 GtkClipboard *clipboard;
1663 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (text));
1667 view = GTK_TEXT_VIEW (widget);
1668 if (!gtk_text_view_get_editable (view))
1670 buffer = gtk_text_view_get_buffer (view);
1672 paste.buffer = buffer;
1673 paste.position = position;
1675 g_object_ref (paste.buffer);
1676 clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_CLIPBOARD);
1677 gtk_clipboard_request_text (clipboard, paste_received, &paste);
1681 atk_editable_text_interface_init (AtkEditableTextIface *iface)
1683 iface->set_text_contents = gtk_text_view_accessible_set_text_contents;
1684 iface->insert_text = gtk_text_view_accessible_insert_text;
1685 iface->copy_text = gtk_text_view_accessible_copy_text;
1686 iface->cut_text = gtk_text_view_accessible_cut_text;
1687 iface->delete_text = gtk_text_view_accessible_delete_text;
1688 iface->paste_text = gtk_text_view_accessible_paste_text;
1689 iface->set_run_attributes = gtk_text_view_accessible_set_run_attributes;
1695 gtk_text_view_accessible_update_cursor (GtkTextViewAccessible *accessible,
1696 GtkTextBuffer * buffer)
1698 int prev_insert_offset, prev_selection_bound;
1699 int insert_offset, selection_bound;
1702 prev_insert_offset = accessible->insert_offset;
1703 prev_selection_bound = accessible->selection_bound;
1705 gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_insert (buffer));
1706 insert_offset = gtk_text_iter_get_offset (&iter);
1707 gtk_text_buffer_get_iter_at_mark (buffer, &iter, gtk_text_buffer_get_selection_bound (buffer));
1708 selection_bound = gtk_text_iter_get_offset (&iter);
1710 if (prev_insert_offset == insert_offset && prev_selection_bound == selection_bound)
1713 accessible->insert_offset = insert_offset;
1714 accessible->selection_bound = selection_bound;
1716 if (prev_insert_offset != insert_offset)
1717 g_signal_emit_by_name (accessible, "text-caret-moved", insert_offset);
1719 if (prev_insert_offset != prev_selection_bound || insert_offset != selection_bound)
1720 g_signal_emit_by_name (accessible, "text-selection-changed");
1724 insert_text_cb (GtkTextBuffer *buffer,
1730 GtkTextView *view = data;
1731 GtkTextViewAccessible *accessible;
1735 accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (view)));
1737 position = gtk_text_iter_get_offset (iter);
1738 length = g_utf8_strlen (text, len);
1740 g_signal_emit_by_name (accessible, "text-changed::insert", position - length, length);
1742 gtk_text_view_accessible_update_cursor (accessible, buffer);
1746 delete_range_cb (GtkTextBuffer *buffer,
1751 GtkTextView *view = data;
1752 GtkTextViewAccessible *accessible;
1753 gint offset, length;
1755 accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (view)));
1757 offset = gtk_text_iter_get_offset (start);
1758 length = gtk_text_iter_get_offset (end) - offset;
1760 g_signal_emit_by_name (accessible,
1761 "text-changed::delete",
1765 gtk_text_view_accessible_update_cursor (accessible, buffer);
1769 mark_set_cb (GtkTextBuffer *buffer,
1770 GtkTextIter *location,
1774 GtkTextView *text = data;
1775 GtkTextViewAccessible *accessible;
1777 accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (text)));
1780 * Only generate the signal for the "insert" mark, which
1781 * represents the cursor.
1783 if (mark == gtk_text_buffer_get_insert (buffer))
1785 gtk_text_view_accessible_update_cursor (accessible, buffer);
1787 else if (mark == gtk_text_buffer_get_selection_bound (buffer))
1789 gtk_text_view_accessible_update_cursor (accessible, buffer);
1794 gail_streamable_content_get_n_mime_types (AtkStreamableContent *streamable)
1797 GtkTextBuffer *buffer;
1798 gint n_mime_types = 0;
1800 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1804 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1808 gboolean advertises_plaintext = FALSE;
1811 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1812 for (i = 0; i < n_mime_types-1; ++i)
1813 if (!strcmp ("text/plain", gdk_atom_name (atoms[i])))
1814 advertises_plaintext = TRUE;
1815 if (!advertises_plaintext)
1819 return n_mime_types;
1822 static const gchar *
1823 gail_streamable_content_get_mime_type (AtkStreamableContent *streamable,
1827 GtkTextBuffer *buffer;
1829 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1833 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1836 gint n_mime_types = 0;
1839 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1840 if (i < n_mime_types)
1841 return gdk_atom_name (atoms [i]);
1842 else if (i == n_mime_types)
1843 return "text/plain";
1850 gail_streamable_content_get_stream (AtkStreamableContent *streamable,
1851 const gchar *mime_type)
1854 GtkTextBuffer *buffer;
1855 gint i, n_mime_types = 0;
1858 widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (streamable));
1862 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
1866 atoms = gtk_text_buffer_get_serialize_formats (buffer, &n_mime_types);
1868 for (i = 0; i < n_mime_types; ++i)
1870 if (!strcmp ("text/plain", mime_type) ||
1871 !strcmp (gdk_atom_name (atoms[i]), mime_type))
1877 GtkTextIter start, end;
1878 GIOChannel *gio = NULL;
1881 gtk_text_buffer_get_iter_at_offset (buffer, &start, 0);
1882 gtk_text_buffer_get_iter_at_offset (buffer, &end, -1);
1883 if (!strcmp ("text/plain", mime_type))
1885 cbuf = (guint8*) gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
1886 len = strlen ((const char *) cbuf);
1890 cbuf = gtk_text_buffer_serialize (buffer, buffer, atoms[i], &start, &end, &len);
1892 g_snprintf (tname, 20, "streamXXXXXX");
1893 fd = g_mkstemp (tname);
1894 gio = g_io_channel_unix_new (fd);
1895 g_io_channel_set_encoding (gio, NULL, &err);
1897 g_io_channel_write_chars (gio, (const char *) cbuf, (gssize) len, &written, &err);
1899 g_message ("%s", err->message);
1901 g_io_channel_seek_position (gio, 0, G_SEEK_SET, &err);
1903 g_message ("%s", err->message);
1905 g_io_channel_flush (gio, &err);
1907 g_message ("%s", err->message);
1910 g_message ("<error writing to stream [%s]>", tname);
1913 /* make sure the file is removed on unref of the giochannel */
1926 atk_streamable_content_interface_init (AtkStreamableContentIface *iface)
1928 iface->get_n_mime_types = gail_streamable_content_get_n_mime_types;
1929 iface->get_mime_type = gail_streamable_content_get_mime_type;
1930 iface->get_stream = gail_streamable_content_get_stream;