From 50aee613a3d3235f24a68e6d4a4d2420225643fd Mon Sep 17 00:00:00 2001 From: Mart Raudsepp Date: Thu, 4 Aug 2005 14:57:10 +0000 Subject: [PATCH] [wxGTK2] wxTextCtrl: Implemented support for wxTEXT_ALIGNMENT_{LEFT,RIGHT,CENTRE} attributes. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35095 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 2 ++ src/gtk/textctrl.cpp | 45 ++++++++++++++++++++++++++++++++++++++++--- src/gtk1/textctrl.cpp | 45 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 86 insertions(+), 6 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 20946da1c0..3d51eb2e59 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -46,6 +46,8 @@ wxGTK: - Base library is now binary compatible when built with wxGTK and wxMotif. - wxTextCtrl::XYToPosition, PositionToXY and GetLineLength calls are now instantaneous in case of GTK+2 multi-line controls (Mart Raudsepp) +- Added support for left, centre and right text alignment attributes under + GTK+2 multi-line text controls (Mart Raudsepp) wxOS2 diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 878b9d06ee..9d6379854d 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/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 ); + } } } diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 878b9d06ee..9d6379854d 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 ); + } } } -- 2.47.2