X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f29a481a66ab2da4424a3127be0c17c3e660e16d..0aaa804e7019b8187e2d35dffba133b43af79533:/src/gtk1/textctrl.cpp diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 878b9d06ee..9f5e5be54f 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -55,12 +55,13 @@ static void wxGtkOnRemoveTag(GtkTextBuffer *buffer, GtkTextTag *tag, GtkTextIter *start, GtkTextIter *end, - gpointer user_data) + char *prefix) { gchar *name; g_object_get (tag, "name", &name, NULL); - if (!name || strncmp(name, "WX", 2)) // anonymous tag or not starting with "WX" + if (!name || strncmp(name, prefix, strlen(prefix))) + // anonymous tag or not starting with prefix - don't remove g_signal_stop_emission_by_name(buffer, "remove_tag"); g_free(name); @@ -77,7 +78,7 @@ static void wxGtkTextApplyTagsFromAttr(GtkTextBuffer *text_buffer, GtkTextTag *tag; gulong remove_handler_id = g_signal_connect( text_buffer, "remove_tag", - G_CALLBACK(wxGtkOnRemoveTag), NULL); + G_CALLBACK(wxGtkOnRemoveTag), gpointer("WX")); gtk_text_buffer_remove_all_tags(text_buffer, start, end); g_signal_handler_disconnect( text_buffer, remove_handler_id ); @@ -122,6 +123,44 @@ static void wxGtkTextApplyTagsFromAttr(GtkTextBuffer *text_buffer, "background-gdk", colBg, NULL ); gtk_text_buffer_apply_tag (text_buffer, tag, start, end); } + + if (attr.HasAlignment()) + { + GtkTextIter para_start, para_end = *end; + gtk_text_buffer_get_iter_at_line( text_buffer, + ¶_start, + gtk_text_iter_get_line(start) ); + gtk_text_iter_forward_line(¶_end); + + remove_handler_id = g_signal_connect( text_buffer, "remove_tag", + G_CALLBACK(wxGtkOnRemoveTag), + gpointer("WXALIGNMENT")); + gtk_text_buffer_remove_all_tags( text_buffer, ¶_start, ¶_end ); + g_signal_handler_disconnect( text_buffer, remove_handler_id ); + + GtkJustification align; + switch (attr.GetAlignment()) + { + default: + align = GTK_JUSTIFY_LEFT; + break; + case wxTEXT_ALIGNMENT_RIGHT: + align = GTK_JUSTIFY_RIGHT; + break; + case wxTEXT_ALIGNMENT_CENTER: + align = GTK_JUSTIFY_CENTER; + break; + // gtk+ doesn't support justify as of gtk+-2.7.4 + } + + g_snprintf(buf, sizeof(buf), "WXALIGNMENT %d", align); + tag = gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table( text_buffer ), + buf ); + if (!tag) + tag = gtk_text_buffer_create_tag( text_buffer, buf, + "justification", align, NULL ); + gtk_text_buffer_apply_tag( text_buffer, tag, ¶_start, ¶_end ); + } } } @@ -1171,8 +1210,14 @@ long wxTextCtrl::XYToPosition(long x, long y ) const #ifdef __WXGTK20__ GtkTextIter iter; - gtk_text_buffer_get_iter_at_line_offset(m_buffer, &iter, y, x); - return gtk_text_iter_get_offset(&iter); + if (y >= gtk_text_buffer_get_line_count (m_buffer)) + return -1; + + gtk_text_buffer_get_iter_at_line(m_buffer, &iter, y); + if (x >= gtk_text_iter_get_chars_in_line (&iter)) + return -1; + + return gtk_text_iter_get_offset(&iter) + x; #else long pos=0; for( int i=0; i