X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fa11y%2Fgtktextviewaccessible.c;h=8931754b86a80117a710b853ebcb28c4073d5170;hb=9d0febc9a64a5bfb0fcfc3a88de4757f6c1ff090;hp=439e286eec09d8a1af98357a7fc9533c2ef3f7fc;hpb=52711beba57239aadde460d49d492ef6951f9335;p=~andy%2Fgtk diff --git a/gtk/a11y/gtktextviewaccessible.c b/gtk/a11y/gtktextviewaccessible.c index 439e286ee..8931754b8 100644 --- a/gtk/a11y/gtktextviewaccessible.c +++ b/gtk/a11y/gtktextviewaccessible.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -31,9 +29,9 @@ #include #include #include "gtktextviewaccessible.h" +#include "gtk/gtkwidgetprivate.h" -static void setup_buffer (GtkTextView *view,GtkTextViewAccessible *accessible); static void insert_text_cb (GtkTextBuffer *buffer, GtkTextIter *arg1, gchar *arg2, @@ -65,8 +63,6 @@ gtk_text_view_accessible_initialize (AtkObject *obj, { ATK_OBJECT_CLASS (_gtk_text_view_accessible_parent_class)->initialize (obj, data); - setup_buffer (GTK_TEXT_VIEW (data), GTK_TEXT_VIEW_ACCESSIBLE (obj)); - obj->role = ATK_ROLE_TEXT; } @@ -85,10 +81,6 @@ gtk_text_view_accessible_notify_gtk (GObject *obj, editable = gtk_text_view_get_editable (GTK_TEXT_VIEW (obj)); atk_object_notify_state_change (atk_obj, ATK_STATE_EDITABLE, editable); } - else if (!strcmp (pspec->name, "buffer")) - { - setup_buffer (GTK_TEXT_VIEW (obj), GTK_TEXT_VIEW_ACCESSIBLE (atk_obj)); - } else GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_text_view_accessible_parent_class)->notify_gtk (obj, pspec); } @@ -112,12 +104,50 @@ gtk_text_view_accessible_ref_state_set (AtkObject *accessible) return state_set; } +static void +gtk_text_view_accessible_change_buffer (GtkTextViewAccessible *accessible, + GtkTextBuffer *old_buffer, + GtkTextBuffer *new_buffer) +{ + if (old_buffer) + { + g_signal_handlers_disconnect_matched (old_buffer, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, accessible); + } + + if (new_buffer) + { + g_signal_connect_after (new_buffer, "insert-text", G_CALLBACK (insert_text_cb), accessible); + g_signal_connect (new_buffer, "delete-range", G_CALLBACK (delete_range_cb), accessible); + g_signal_connect_after (new_buffer, "mark-set", G_CALLBACK (mark_set_cb), accessible); + } +} + +static void +gtk_text_view_accessible_widget_set (GtkAccessible *accessible) +{ + gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible), + NULL, + gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible)))); +} + +static void +gtk_text_view_accessible_widget_unset (GtkAccessible *accessible) +{ + gtk_text_view_accessible_change_buffer (GTK_TEXT_VIEW_ACCESSIBLE (accessible), + gtk_text_view_get_buffer (GTK_TEXT_VIEW (gtk_accessible_get_widget (accessible))), + NULL); +} + static void _gtk_text_view_accessible_class_init (GtkTextViewAccessibleClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); + GtkAccessibleClass *accessible_class = GTK_ACCESSIBLE_CLASS (klass); GtkWidgetAccessibleClass *widget_class = (GtkWidgetAccessibleClass*)klass; + accessible_class->widget_set = gtk_text_view_accessible_widget_set; + accessible_class->widget_unset = gtk_text_view_accessible_widget_unset; + class->ref_state_set = gtk_text_view_accessible_ref_state_set; class->initialize = gtk_text_view_accessible_initialize; @@ -129,20 +159,6 @@ _gtk_text_view_accessible_init (GtkTextViewAccessible *accessible) { } -static void -setup_buffer (GtkTextView *view, - GtkTextViewAccessible *accessible) -{ - GtkTextBuffer *buffer; - - buffer = gtk_text_view_get_buffer (view); - - /* Set up signal callbacks */ - g_signal_connect_after (buffer, "insert-text", G_CALLBACK (insert_text_cb), view); - g_signal_connect (buffer, "delete-range", G_CALLBACK (delete_range_cb), view); - g_signal_connect_after (buffer, "mark-set", G_CALLBACK (mark_set_cb), view); -} - static gchar * gtk_text_view_accessible_get_text (AtkText *text, gint start_offset, @@ -173,6 +189,7 @@ gtk_text_view_accessible_get_text_after_offset (AtkText *text, gint *end_offset) { GtkWidget *widget; + GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter pos; GtkTextIter start, end; @@ -181,12 +198,29 @@ gtk_text_view_accessible_get_text_after_offset (AtkText *text, if (widget == NULL) return NULL; - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); + view = GTK_TEXT_VIEW (widget); + buffer = gtk_text_view_get_buffer (view); gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset); - _gtk_text_buffer_get_text_after (buffer, boundary_type, - &pos, &start, &end); + start = end = pos; + if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START) + { + gtk_text_view_forward_display_line (view, &end); + start = end; + gtk_text_view_forward_display_line (view, &end); + } + else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END) + { + gtk_text_view_forward_display_line_end (view, &end); + start = end; + gtk_text_view_forward_display_line (view, &end); + gtk_text_view_forward_display_line_end (view, &end); + } + else + _gtk_text_buffer_get_text_after (buffer, boundary_type, &pos, &start, &end); + *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); + return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE); } @@ -198,6 +232,7 @@ gtk_text_view_accessible_get_text_at_offset (AtkText *text, gint *end_offset) { GtkWidget *widget; + GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter pos; GtkTextIter start, end; @@ -206,12 +241,31 @@ gtk_text_view_accessible_get_text_at_offset (AtkText *text, if (widget == NULL) return NULL; - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); + view = GTK_TEXT_VIEW (widget); + buffer = gtk_text_view_get_buffer (view); gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset); - _gtk_text_buffer_get_text_at (buffer, boundary_type, - &pos, &start, &end); + start = end = pos; + if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START) + { + gtk_text_view_backward_display_line_start (view, &start); + gtk_text_view_forward_display_line (view, &end); + } + else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END) + { + gtk_text_view_backward_display_line_start (view, &start); + if (!gtk_text_iter_is_start (&start)) + { + gtk_text_view_backward_display_line (view, &start); + gtk_text_view_forward_display_line_end (view, &start); + } + gtk_text_view_forward_display_line_end (view, &end); + } + else + _gtk_text_buffer_get_text_at (buffer, boundary_type, &pos, &start, &end); + *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); + return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE); } @@ -223,6 +277,7 @@ gtk_text_view_accessible_get_text_before_offset (AtkText *text, gint *end_offset) { GtkWidget *widget; + GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter pos; GtkTextIter start, end; @@ -231,12 +286,43 @@ gtk_text_view_accessible_get_text_before_offset (AtkText *text, if (widget == NULL) return NULL; - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); + view = GTK_TEXT_VIEW (widget); + buffer = gtk_text_view_get_buffer (view); gtk_text_buffer_get_iter_at_offset (buffer, &pos, offset); - _gtk_text_buffer_get_text_before (buffer, boundary_type, - &pos, &start, &end); + start = end = pos; + + if (boundary_type == ATK_TEXT_BOUNDARY_LINE_START) + { + gtk_text_view_backward_display_line_start (view, &start); + end = start; + gtk_text_view_backward_display_line (view, &start); + gtk_text_view_backward_display_line_start (view, &start); + } + else if (boundary_type == ATK_TEXT_BOUNDARY_LINE_END) + { + gtk_text_view_backward_display_line_start (view, &start); + if (!gtk_text_iter_is_start (&start)) + { + gtk_text_view_backward_display_line (view, &start); + end = start; + gtk_text_view_forward_display_line_end (view, &end); + if (!gtk_text_iter_is_start (&start)) + { + if (gtk_text_view_backward_display_line (view, &start)) + gtk_text_view_forward_display_line_end (view, &start); + else + gtk_text_iter_set_offset (&start, 0); + } + } + else + end = start; + } + else + _gtk_text_buffer_get_text_before (buffer, boundary_type, &pos, &start, &end); + *start_offset = gtk_text_iter_get_offset (&start); *end_offset = gtk_text_iter_get_offset (&end); + return gtk_text_buffer_get_slice (buffer, &start, &end, FALSE); } @@ -1657,13 +1743,10 @@ insert_text_cb (GtkTextBuffer *buffer, gint len, gpointer data) { - GtkTextView *view = data; - GtkTextViewAccessible *accessible; + GtkTextViewAccessible *accessible = data; gint position; gint length; - accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (view))); - position = gtk_text_iter_get_offset (iter); length = g_utf8_strlen (text, len); @@ -1678,12 +1761,9 @@ delete_range_cb (GtkTextBuffer *buffer, GtkTextIter *end, gpointer data) { - GtkTextView *view = data; - GtkTextViewAccessible *accessible; + GtkTextViewAccessible *accessible = data; gint offset, length; - accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (view))); - offset = gtk_text_iter_get_offset (start); length = gtk_text_iter_get_offset (end) - offset; @@ -1701,10 +1781,7 @@ mark_set_cb (GtkTextBuffer *buffer, GtkTextMark *mark, gpointer data) { - GtkTextView *text = data; - GtkTextViewAccessible *accessible; - - accessible = GTK_TEXT_VIEW_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (text))); + GtkTextViewAccessible *accessible = data; /* * Only generate the signal for the "insert" mark, which @@ -1859,3 +1936,22 @@ atk_streamable_content_interface_init (AtkStreamableContentIface *iface) iface->get_mime_type = gail_streamable_content_get_mime_type; iface->get_stream = gail_streamable_content_get_stream; } + +void +_gtk_text_view_accessible_set_buffer (GtkTextView *textview, + GtkTextBuffer *old_buffer) +{ + GtkTextViewAccessible *accessible; + + g_return_if_fail (GTK_IS_TEXT_VIEW (textview)); + g_return_if_fail (old_buffer == NULL || GTK_IS_TEXT_BUFFER (old_buffer)); + + accessible = GTK_TEXT_VIEW_ACCESSIBLE (_gtk_widget_peek_accessible (GTK_WIDGET (textview))); + if (accessible == NULL) + return; + + gtk_text_view_accessible_change_buffer (accessible, + old_buffer, + gtk_text_view_get_buffer (textview)); +} +