]> git.saurik.com Git - wxWidgets.git/commitdiff
1. wxTextControl::SetFont() does something (good or bad - for you to judge)
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 12 Jul 1999 14:02:01 +0000 (14:02 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 12 Jul 1999 14:02:01 +0000 (14:02 +0000)
2. tip dialog modified slightly to look a bit prettier under GTK
3. notebook test demonstrates the wxGTK radiobox-in-notebook-pages-constraints
bug

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2989 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/notebook/test.cpp
samples/text/controls.cpp
src/gtk/textctrl.cpp
src/gtk1/textctrl.cpp

index e9d6088176c04bee7c15fa7744bbd41c2bfdc32f..37306e8e3ad0c463391718b213090771a15c62e4 100644 (file)
@@ -96,22 +96,26 @@ void MyApp::InitTabView(wxNotebook* notebook, wxWindow* window)
   panel2->SetBackgroundColour(wxColour("BLUE"));
 
   wxString animals[] = { "Fox", "Hare", "Rabbit", "Sabre-toothed tiger", "T Rex" };
-  wxListBox *listbox = new wxListBox(panel2, -1, wxPoint(5, 5), wxSize(170, 80), 5, animals);
+  wxRadioBox *radiobox = new wxRadioBox(panel2, -1, "Choose one",
+                                        wxDefaultPosition, wxDefaultSize, 5, animals);
 
   c = new wxLayoutConstraints;
   c->left.SameAs(panel2, wxLeft, 4);
   c->top.SameAs(panel2, wxTop, 4);
   c->height.PercentOf(panel2, wxHeight, 50);
   c->right.SameAs(panel2, wxRight, 4);
-  listbox->SetConstraints(c);
+  radiobox->SetConstraints(c);
 
-  wxTextCtrl *text = new wxTextCtrl(panel2, -1, "Some notes about the animals in this house", wxPoint(5, 100), wxSize(170, 100), wxTE_MULTILINE);
+  wxRadioBox *radiobox2 = new wxRadioBox(panel2, -1, "Choose one",
+                                         wxDefaultPosition, wxDefaultSize,
+                                         5, animals,
+                                         2, wxRA_SPECIFY_ROWS);
   c = new wxLayoutConstraints;
-  c->left.SameAs(panel2, wxLeft, 4);
-  c->bottom.SameAs(panel2, wxBottom, 4);
-  c->top.Below(listbox, 4);
-  c->right.SameAs(panel2, wxRight, 4);
-  text->SetConstraints(c);
+  c->left.SameAs(radiobox, wxLeft);
+  c->height.AsIs();
+  c->top.Below(radiobox, 4);
+  c->right.SameAs(radiobox, wxRight);
+  radiobox2->SetConstraints(c);
 
   notebook->AddPage(panel2, "Dog");
 
@@ -170,7 +174,7 @@ void MyDialog::Init(void)
   SetAutoLayout(TRUE);
   Layout();
 
-  this->Centre(wxBOTH);
+  Centre(wxBOTH);
 }
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
index b9e3bf477702e3fdf9e9e733c2f622466b5717d6..a27af06ebb52be6c6056317416588b1ea32845c9 100644 (file)
@@ -82,7 +82,7 @@ public:
     MyTextCtrl    *m_tab;
     MyTextCtrl    *m_entertab;
     MyTextCtrl    *m_readonly;
-    
+
     MyTextCtrl    *m_multitext;
     MyTextCtrl    *m_horizontal;
     MyTextCtrl    *m_multitab;
@@ -387,37 +387,38 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 
     // single line text controls
 
-    m_text = new MyTextCtrl( this, -1, "Single line.", 
+    m_text = new MyTextCtrl( this, -1, "Single line.",
       wxPoint(10,10), wxSize(140,-1), 0);
     (*m_text) << " Appended.";
     m_text->SetInsertionPoint(0);
     m_text->WriteText( "Prepended. " );
-    
-    m_password = new MyTextCtrl( this, -1, "", 
+
+    m_password = new MyTextCtrl( this, -1, "",
       wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD );
-    
-    m_readonly = new MyTextCtrl( this, -1, "Read only", 
+
+    m_readonly = new MyTextCtrl( this, -1, "Read only",
       wxPoint(10,90), wxSize(140,-1), wxTE_READONLY );
-    
+
     // multi line text controls
 
-    m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.", 
-      wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL ); 
-    
-    m_multitext = new MyTextCtrl( this, ID_TEXT, "Multi line.", 
+    m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
+      wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL );
+    m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxBOLD));
+
+    m_multitext = new MyTextCtrl( this, ID_TEXT, "Multi line.",
       wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE );
     (*m_multitext) << " Appended.";
     m_multitext->SetInsertionPoint(0);
     m_multitext->WriteText( "Prepended. " );
-    
+
 #if wxUSE_TOOLTIPS
     m_multitext->SetToolTip("Press F1 here.");
 #endif
 
-    m_tab = new MyTextCtrl( this, -1, "Multiline, allow <TAB> processing.", 
+    m_tab = new MyTextCtrl( this, -1, "Multiline, allow <TAB> processing.",
       wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE |  wxTE_PROCESS_TAB );
 
-    m_enter = new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.", 
+    m_enter = new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.",
       wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE |  wxTE_PROCESS_ENTER );
 
     wxButton *button;
@@ -431,7 +432,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 #if wxUSE_TOOLTIPS
     button->SetToolTip("Move cursor in multi-line text control to end of first line.");
 #endif
-    
+
     (void)new wxStaticBox( this, -1, "wx&Clipboard", wxPoint(445,130), wxSize(160,100) );
     button = new wxButton( this, ID_COPY_TEXT, "C&opy line 1", wxPoint(470,150), wxSize(110,30) );
 #if wxUSE_TOOLTIPS
@@ -581,11 +582,11 @@ void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
     wxBeginBusyCursor();
 
     wxMessageDialog dialog(this, "This is a text control sample. It demonstrates the many different text control\n"
-                                 "styles, the use of the clipboard, setting and handling tooltips and intercepting\n" 
-                                "key and char events.\n"
-                                "\n"
-                                "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin", 
-                                "About Text Controls", wxOK );
+                                 "styles, the use of the clipboard, setting and handling tooltips and intercepting\n"
+                                 "key and char events.\n"
+                                 "\n"
+                                 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
+                                 "About Text Controls", wxOK );
     dialog.ShowModal();
 
     wxEndBusyCursor();
@@ -600,9 +601,9 @@ void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
     delay.Printf( _T("%ld"), s_delay);
 
     delay = wxGetTextFromUser("Enter delay (in milliseconds)",
-            "Set tooltip delay",
-            delay,
-            this);
+                              "Set tooltip delay",
+                              delay,
+                              this);
     if ( !delay )
         return; // cancelled
 
index 7e283a82d95bede15bc2c9bf535a3f4813031c80..3d426e1668e685c6904ed1326ec6438fc084e598 100644 (file)
@@ -46,7 +46,7 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
     if (!win->m_hasVMT) return;
 
-    if (g_isIdle) 
+    if (g_isIdle)
         wxapp_install_idle_handler();
 
     win->SetModified();
@@ -65,8 +65,8 @@ static void
 gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
     if (!win->m_hasVMT) return;
-    
-    if (g_isIdle) 
+
+    if (g_isIdle)
         wxapp_install_idle_handler();
 
     win->CalculateScrollbar();
@@ -160,10 +160,10 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
                       (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
                       (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
                        0, 0);
-                      
+
         /* always wrap words */
         gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE );
-       
+
         /* put the horizontal scrollbar in the lower left hand corner */
         if (bHasHScrollbar)
         {
@@ -180,7 +180,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
             gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
 #endif
         }
-       
+
         /* finally, put the vertical scrollbar in the upper right corner */
         m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
         GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
@@ -317,7 +317,7 @@ void wxTextCtrl::SetValue( const wxString &value )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     wxString tmp = _T("");
     if (!value.IsNull()) tmp = value;
     if (m_windowStyle & wxTE_MULTILINE)
@@ -336,7 +336,7 @@ void wxTextCtrl::SetValue( const wxString &value )
     {
         gtk_entry_set_text( GTK_ENTRY(m_text), tmp.mbc_str() );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -349,7 +349,7 @@ void wxTextCtrl::WriteText( const wxString &text )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
         /* this moves the cursor pos to behind the inserted text */
@@ -382,7 +382,7 @@ void wxTextCtrl::WriteText( const wxString &text )
         /* bring entry's cursor uptodate. bug in GTK. */
         gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -395,17 +395,32 @@ void wxTextCtrl::AppendText( const wxString &text )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
-        /* we'll insert at the last position */
-        gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        bool hasSpecialAttributes = m_font.Ok() ||
+                                    m_foregroundColour.Ok() ||
+                                    m_backgroundColour.Ok();
+        if ( hasSpecialAttributes )
+        {
+             gtk_text_insert( GTK_TEXT(m_text),
+                              m_font.GetInternalFont(),
+                              m_foregroundColour.GetColor(),
+                              m_backgroundColour.GetColor(),
+                              text, text.length());
+
+        }
+        else
+        {
+            /* we'll insert at the last position */
+            gint len = gtk_text_get_length( GTK_TEXT(m_text) );
 #if wxUSE_UNICODE
-        wxWX2MBbuf buf = text.mbc_str();
-        gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
+            wxWX2MBbuf buf = text.mbc_str();
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
 #else
-        gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
 #endif
+        }
 
         /* bring editable's cursor uptodate. bug in GTK. */
         GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
@@ -414,7 +429,7 @@ void wxTextCtrl::AppendText( const wxString &text )
     {
         gtk_entry_append_text( GTK_ENTRY(m_text), text.mbc_str() );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -453,7 +468,7 @@ bool wxTextCtrl::LoadFile( const wxString &file )
 
         gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
           GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
         if (m_windowStyle & wxTE_MULTILINE)
         {
             gint pos = 0;
@@ -463,10 +478,10 @@ bool wxTextCtrl::LoadFile( const wxString &file )
         {
             gtk_entry_set_text( GTK_ENTRY(m_text), text );
         }
-    
+
         gtk_signal_connect( GTK_OBJECT(m_text), "changed",
           GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
         free (text);
         m_modified = FALSE;
         return TRUE;
@@ -746,9 +761,9 @@ void wxTextCtrl::Remove( long from, long to )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -759,9 +774,9 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
-    
+
     if (!value.IsEmpty())
     {
         gint pos = (gint)from;
@@ -772,7 +787,7 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
         gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
 #endif
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -783,13 +798,13 @@ void wxTextCtrl::Cut()
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
 #if (GTK_MINOR_VERSION > 0)
     gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) );
 #else
     gtk_editable_cut_clipboard( GTK_EDITABLE(m_text), 0 );
 #endif
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -811,13 +826,13 @@ void wxTextCtrl::Paste()
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
 #if (GTK_MINOR_VERSION > 0)
     gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) );
 #else
     gtk_editable_paste_clipboard( GTK_EDITABLE(m_text), 0 );
 #endif
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -875,14 +890,14 @@ bool wxTextCtrl::CanRedo() const
 void wxTextCtrl::GetSelection(long* from, long* to) const
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
-    
+
     if (!(GTK_EDITABLE(m_text)->has_selection))
     {
         if (from) *from = 0;
-       if (to)   *to = 0;
-       return;
+        if (to)   *to = 0;
+        return;
     }
-    
+
     if (from) *from = (long) GTK_EDITABLE(m_text)->selection_start_pos;
     if (to)   *to = (long) GTK_EDITABLE(m_text)->selection_end_pos;
 }
@@ -1005,12 +1020,31 @@ bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
         return (window == GTK_ENTRY(m_text)->text_area);
 }
 
-bool wxTextCtrl::SetFont( const wxFont &WXUNUSED(font) )
+// the font will change for subsequent text insertiongs
+bool wxTextCtrl::SetFont( const wxFont &font )
 {
     wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-    // doesn't work
-    return FALSE;
+    if ( !wxWindowBase::SetFont(font) )
+    {
+        // font didn't change, nothing to do
+        return FALSE;
+    }
+
+    if ( m_windowStyle & wxTE_MULTILINE )
+    {
+        // for compatibility with other ports: the font is a global controls
+        // characteristic, so change the font globally
+        wxString value = GetValue();
+        if ( !value.IsEmpty() )
+        {
+            Clear();
+
+            AppendText(value);
+        }
+    }
+
+    return TRUE;
 }
 
 bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )
index 7e283a82d95bede15bc2c9bf535a3f4813031c80..3d426e1668e685c6904ed1326ec6438fc084e598 100644 (file)
@@ -46,7 +46,7 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
     if (!win->m_hasVMT) return;
 
-    if (g_isIdle) 
+    if (g_isIdle)
         wxapp_install_idle_handler();
 
     win->SetModified();
@@ -65,8 +65,8 @@ static void
 gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
 {
     if (!win->m_hasVMT) return;
-    
-    if (g_isIdle) 
+
+    if (g_isIdle)
         wxapp_install_idle_handler();
 
     win->CalculateScrollbar();
@@ -160,10 +160,10 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
                       (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
                       (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK),
                        0, 0);
-                      
+
         /* always wrap words */
         gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE );
-       
+
         /* put the horizontal scrollbar in the lower left hand corner */
         if (bHasHScrollbar)
         {
@@ -180,7 +180,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
             gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE );
 #endif
         }
-       
+
         /* finally, put the vertical scrollbar in the upper right corner */
         m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj );
         GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS );
@@ -317,7 +317,7 @@ void wxTextCtrl::SetValue( const wxString &value )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     wxString tmp = _T("");
     if (!value.IsNull()) tmp = value;
     if (m_windowStyle & wxTE_MULTILINE)
@@ -336,7 +336,7 @@ void wxTextCtrl::SetValue( const wxString &value )
     {
         gtk_entry_set_text( GTK_ENTRY(m_text), tmp.mbc_str() );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -349,7 +349,7 @@ void wxTextCtrl::WriteText( const wxString &text )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
         /* this moves the cursor pos to behind the inserted text */
@@ -382,7 +382,7 @@ void wxTextCtrl::WriteText( const wxString &text )
         /* bring entry's cursor uptodate. bug in GTK. */
         gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -395,17 +395,32 @@ void wxTextCtrl::AppendText( const wxString &text )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
-        /* we'll insert at the last position */
-        gint len = gtk_text_get_length( GTK_TEXT(m_text) );
+        bool hasSpecialAttributes = m_font.Ok() ||
+                                    m_foregroundColour.Ok() ||
+                                    m_backgroundColour.Ok();
+        if ( hasSpecialAttributes )
+        {
+             gtk_text_insert( GTK_TEXT(m_text),
+                              m_font.GetInternalFont(),
+                              m_foregroundColour.GetColor(),
+                              m_backgroundColour.GetColor(),
+                              text, text.length());
+
+        }
+        else
+        {
+            /* we'll insert at the last position */
+            gint len = gtk_text_get_length( GTK_TEXT(m_text) );
 #if wxUSE_UNICODE
-        wxWX2MBbuf buf = text.mbc_str();
-        gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
+            wxWX2MBbuf buf = text.mbc_str();
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &len );
 #else
-        gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), text, text.Length(), &len );
 #endif
+        }
 
         /* bring editable's cursor uptodate. bug in GTK. */
         GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) );
@@ -414,7 +429,7 @@ void wxTextCtrl::AppendText( const wxString &text )
     {
         gtk_entry_append_text( GTK_ENTRY(m_text), text.mbc_str() );
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -453,7 +468,7 @@ bool wxTextCtrl::LoadFile( const wxString &file )
 
         gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
           GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
         if (m_windowStyle & wxTE_MULTILINE)
         {
             gint pos = 0;
@@ -463,10 +478,10 @@ bool wxTextCtrl::LoadFile( const wxString &file )
         {
             gtk_entry_set_text( GTK_ENTRY(m_text), text );
         }
-    
+
         gtk_signal_connect( GTK_OBJECT(m_text), "changed",
           GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
         free (text);
         m_modified = FALSE;
         return TRUE;
@@ -746,9 +761,9 @@ void wxTextCtrl::Remove( long from, long to )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -759,9 +774,9 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
     gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
-    
+
     if (!value.IsEmpty())
     {
         gint pos = (gint)from;
@@ -772,7 +787,7 @@ void wxTextCtrl::Replace( long from, long to, const wxString &value )
         gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
 #endif
     }
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -783,13 +798,13 @@ void wxTextCtrl::Cut()
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
 #if (GTK_MINOR_VERSION > 0)
     gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) );
 #else
     gtk_editable_cut_clipboard( GTK_EDITABLE(m_text), 0 );
 #endif
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -811,13 +826,13 @@ void wxTextCtrl::Paste()
 
     gtk_signal_disconnect_by_func( GTK_OBJECT(m_text),
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
+
 #if (GTK_MINOR_VERSION > 0)
     gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) );
 #else
     gtk_editable_paste_clipboard( GTK_EDITABLE(m_text), 0 );
 #endif
-    
+
     gtk_signal_connect( GTK_OBJECT(m_text), "changed",
       GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
 }
@@ -875,14 +890,14 @@ bool wxTextCtrl::CanRedo() const
 void wxTextCtrl::GetSelection(long* from, long* to) const
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
-    
+
     if (!(GTK_EDITABLE(m_text)->has_selection))
     {
         if (from) *from = 0;
-       if (to)   *to = 0;
-       return;
+        if (to)   *to = 0;
+        return;
     }
-    
+
     if (from) *from = (long) GTK_EDITABLE(m_text)->selection_start_pos;
     if (to)   *to = (long) GTK_EDITABLE(m_text)->selection_end_pos;
 }
@@ -1005,12 +1020,31 @@ bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
         return (window == GTK_ENTRY(m_text)->text_area);
 }
 
-bool wxTextCtrl::SetFont( const wxFont &WXUNUSED(font) )
+// the font will change for subsequent text insertiongs
+bool wxTextCtrl::SetFont( const wxFont &font )
 {
     wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-    // doesn't work
-    return FALSE;
+    if ( !wxWindowBase::SetFont(font) )
+    {
+        // font didn't change, nothing to do
+        return FALSE;
+    }
+
+    if ( m_windowStyle & wxTE_MULTILINE )
+    {
+        // for compatibility with other ports: the font is a global controls
+        // characteristic, so change the font globally
+        wxString value = GetValue();
+        if ( !value.IsEmpty() )
+        {
+            Clear();
+
+            AppendText(value);
+        }
+    }
+
+    return TRUE;
 }
 
 bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )