+ wxCHECK_MSG( m_text != NULL, false, wxT("invalid text ctrl") );
+
+ if ( !wxTextCtrlBase::SetFont(font) )
+ {
+ // font didn't change, nothing to do
+ return false;
+ }
+
+ if ( m_windowStyle & wxTE_MULTILINE )
+ {
+ SetUpdateFont(true);
+
+ m_defaultStyle.SetFont(font);
+
+ ChangeFontGlobally();
+ }
+
+ return true;
+}
+
+void wxTextCtrl::ChangeFontGlobally()
+{
+ // this method is very inefficient and hence should be called as rarely as
+ // possible!
+ wxASSERT_MSG( (m_windowStyle & wxTE_MULTILINE) && m_updateFont,
+
+ _T("shouldn't be called for single line controls") );
+
+ wxString value = GetValue();
+ if ( !value.empty() )
+ {
+ SetUpdateFont(false);
+
+ Clear();
+ AppendText(value);
+ }
+}
+
+void wxTextCtrl::UpdateFontIfNeeded()
+{
+ if ( m_updateFont )
+ ChangeFontGlobally();
+}
+
+bool wxTextCtrl::SetForegroundColour(const wxColour& colour)
+{
+ if ( !wxControl::SetForegroundColour(colour) )
+ return false;
+
+ // update default fg colour too
+ m_defaultStyle.SetTextColour(colour);
+
+ return true;
+}
+
+bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
+{
+ wxCHECK_MSG( m_text != NULL, false, wxT("invalid text ctrl") );
+
+ if ( !wxControl::SetBackgroundColour( colour ) )
+ return false;
+
+ if (!m_widget->window)
+ return false;
+
+ if (!m_backgroundColour.Ok())
+ return false;
+
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ GdkWindow *window = GTK_TEXT(m_text)->text_area;
+ if (!window)
+ return false;
+ m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
+ gdk_window_set_background( window, m_backgroundColour.GetColor() );
+ gdk_window_clear( window );
+ }
+
+ // change active background color too
+ m_defaultStyle.SetBackgroundColour( colour );
+
+ return true;
+}
+
+bool wxTextCtrl::SetStyle( long start, long end, const wxTextAttr& style )
+{
+ if ( m_windowStyle & wxTE_MULTILINE )
+ {
+ if ( style.IsDefault() )
+ {
+ // nothing to do
+ return true;
+ }
+
+ // VERY dirty way to do that - removes the required text and re-adds it
+ // with styling (FIXME)
+
+ gint l = gtk_text_get_length( GTK_TEXT(m_text) );
+
+ wxCHECK_MSG( start >= 0 && end <= l, false,
+ _T("invalid range in wxTextCtrl::SetStyle") );
+
+ gint old_pos = gtk_editable_get_position( GTK_EDITABLE(m_text) );
+ char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), start, end );
+ wxString tmp(text,*wxConvCurrent);
+ g_free( text );
+
+ gtk_editable_delete_text( GTK_EDITABLE(m_text), start, end );
+ gtk_editable_set_position( GTK_EDITABLE(m_text), start );
+
+ #if wxUSE_UNICODE
+ wxWX2MBbuf buf = tmp.mbc_str();
+ const char *txt = buf;
+ size_t txtlen = strlen(buf);
+ #else
+ const char *txt = tmp;
+ size_t txtlen = tmp.length();
+ #endif
+
+ // use the attributes from style which are set in it and fall back
+ // first to the default style and then to the text control default
+ // colours for the others
+ wxGtkTextInsert(m_text,
+ wxTextAttr::Combine(style, m_defaultStyle, this),
+ txt,
+ txtlen);
+
+ /* does not seem to help under GTK+ 1.2 !!!
+ gtk_editable_set_position( GTK_EDITABLE(m_text), old_pos ); */
+ SetInsertionPoint( old_pos );
+
+ return true;
+ }
+
+ // else single line
+ // cannot do this for GTK+'s Entry widget
+ return false;