X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4e0dd391cbed9ecff91f4d0a5d4441fff905c24..489bf4ae935a8cae19273ae1af22565fe7d94b61:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 56d2d05c1f..8d403c0228 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -10,6 +10,8 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_TEXTCTRL + #include "wx/textctrl.h" #ifndef WX_PRECOMP @@ -162,12 +164,12 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text, // gtk+ doesn't support justify before gtk+-2.11.0 with pango-1.17 being available // (but if new enough pango isn't available it's a mere gtk warning) #if GTK_CHECK_VERSION(2,11,0) - case wxTEXT_ALIGNMENT_JUSTIFIED: + case wxTEXT_ALIGNMENT_JUSTIFIED: if (!gtk_check_version(2,11,0)) - align = GTK_JUSTIFY_FILL; + align = GTK_JUSTIFY_FILL; else align = GTK_JUSTIFY_LEFT; - break; + break; #endif } @@ -249,10 +251,10 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text, for (size_t i = 0; i < tabs.GetCount(); i++) tagname += wxString::Format(_T(" %d"), tabs[i]); - const wxWX2MBbuf buf = tagname.mb_str(wxConvUTF8); + const wxWX2MBbuf buftag = tagname.utf8_str(); tag = gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table( text_buffer ), - buf ); + buftag ); if (!tag) { // Factor to convert from 1/10th of a mm into pixels @@ -268,7 +270,7 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text, PangoTabArray* tabArray = pango_tab_array_new(tabs.GetCount(), TRUE); for (size_t i = 0; i < tabs.GetCount(); i++) pango_tab_array_set_tab(tabArray, i, PANGO_TAB_LEFT, (gint)(tabs[i] * factor)); - tag = gtk_text_buffer_create_tag( text_buffer, buf, + tag = gtk_text_buffer_create_tag( text_buffer, buftag, "tabs", tabArray, NULL ); pango_tab_array_free(tabArray); } @@ -428,7 +430,7 @@ au_check_word( GtkTextIter *s, GtkTextIter *e ) gtk_text_iter_backward_find_char( &end, pred_nonpunct_or_slash, NULL, &start ); gtk_text_iter_forward_char(&end); - gchar* text = gtk_text_iter_get_text( &start, &end ); + wxGtkString text(gtk_text_iter_get_text( &start, &end )); size_t len = strlen(text), prefix_len; size_t n; @@ -757,6 +759,18 @@ bool wxTextCtrl::Create( wxWindow *parent, gtk_widget_show(m_text); } + // We want to be notified about text changes. + if (multi_line) + { + g_signal_connect (m_buffer, "changed", + G_CALLBACK (gtk_text_changed_callback), this); + } + else + { + g_signal_connect (m_text, "changed", + G_CALLBACK (gtk_text_changed_callback), this); + } + if (!value.empty()) { SetValue( value ); @@ -772,13 +786,9 @@ bool wxTextCtrl::Create( wxWindow *parent, if ( style & (wxTE_RIGHT | wxTE_CENTRE) ) GTKSetJustification(); - // We want to be notified about text changes. if (multi_line) { - g_signal_connect (m_buffer, "changed", - G_CALLBACK (gtk_text_changed_callback), this); - - // .. and handle URLs on multi-line controls with wxTE_AUTO_URL style + // Handle URLs on multi-line controls with wxTE_AUTO_URL style if (style & wxTE_AUTO_URL) { GtkTextIter start, end; @@ -814,12 +824,7 @@ bool wxTextCtrl::Create( wxWindow *parent, au_check_range(&start, &end); } } - else - { - g_signal_connect (m_text, "changed", - G_CALLBACK (gtk_text_changed_callback), this); - } - + g_signal_connect (m_text, "copy-clipboard", G_CALLBACK (gtk_copy_clipboard_callback), this); g_signal_connect (m_text, "cut-clipboard", @@ -946,7 +951,6 @@ wxString wxTextCtrl::GetValue() const { wxCHECK_MSG( m_text != NULL, wxEmptyString, wxT("invalid text ctrl") ); - wxString tmp; if ( IsMultiLine() ) { GtkTextIter start; @@ -955,19 +959,13 @@ wxString wxTextCtrl::GetValue() const gtk_text_buffer_get_end_iter( m_buffer, &end ); wxGtkString text(gtk_text_buffer_get_text(m_buffer, &start, &end, true)); - const wxWxCharBuffer buf = wxGTK_CONV_BACK(text); - if ( buf ) - tmp = buf; + return wxGTK_CONV_BACK(text); } else { const gchar *text = gtk_entry_get_text( GTK_ENTRY(m_text) ); - const wxWxCharBuffer buf = wxGTK_CONV_BACK( text ); - if ( buf ) - tmp = buf; + return wxGTK_CONV_BACK(text); } - - return tmp; } wxFontEncoding wxTextCtrl::GetTextEncoding() const @@ -1000,12 +998,7 @@ void wxTextCtrl::DoSetValue( const wxString &value, int flags ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); - // the control won't be modified any more as we programmatically replace - // all the existing text, so reset the flag and don't set it again (and do - // it now, before the text event handler is ran so that IsModified() called - // from there returns the expected value) m_modified = false; - DontMarkDirtyOnNextChange(); wxFontEncoding enc = m_defaultStyle.HasFont() ? m_defaultStyle.GetFont().GetEncoding() @@ -1022,19 +1015,16 @@ void wxTextCtrl::DoSetValue( const wxString &value, int flags ) return; } - // if the control is not empty, two "changed" signals are emitted, - // otherwise only one and we need to ignore either both or one of them - int ignore = flags & SetValue_SendEvent ? 0 : 1; - if ( !IsEmpty() ) - ignore++; - - if ( ignore ) - IgnoreNextTextUpdate(ignore); + if ( !(flags & SetValue_SendEvent) ) + { + g_signal_handlers_block_by_func(GetTextObject(), + (gpointer)gtk_text_changed_callback, this); + } if ( IsMultiLine() ) { gtk_text_buffer_set_text( m_buffer, buffer, strlen(buffer) ); - + if ( !m_defaultStyle.IsDefault() ) { GtkTextIter start, end; @@ -1048,15 +1038,13 @@ void wxTextCtrl::DoSetValue( const wxString &value, int flags ) gtk_entry_set_text( GTK_ENTRY(m_text), buffer ); } - // if, for whatever reason, the callback wasn't called the expected number - // of times, still reset the flags to the default values - m_dontMarkDirty = false; - m_countUpdatesToIgnore = 0; - - - // GRG, Jun/2000: Changed this after a lot of discussion in - // the lists. wxWidgets 2.2 will have a set of flags to - // customize this behaviour. + if ( !(flags & SetValue_SendEvent) ) + { + g_signal_handlers_unblock_by_func(GetTextObject(), + (gpointer)gtk_text_changed_callback, this); + } + + // This was added after discussion on the list SetInsertionPoint(0); } @@ -1297,14 +1285,7 @@ bool wxTextCtrl::Enable( bool enable ) return false; } - if ( IsMultiLine() ) - { - SetEditable( enable ); - } - else - { - gtk_widget_set_sensitive( m_text, enable ); - } + gtk_widget_set_sensitive( m_text, enable ); return true; } @@ -2014,3 +1995,5 @@ wxTextCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true); } + +#endif // wxUSE_TEXTCTRL