#pragma interface "docmdi.h"
 #endif
 
+#include "wx/defs.h"
+
+#if wxUSE_MDI_ARCHITECTURE
+
 #include "wx/docview.h"
 #include "wx/mdi.h"
 
 
 };
 
+#endif
+    // wxUSE_MDI_ARCHITECTURE
+    
 #endif
     // _WX_DOCMDI_H_
 
 #include "wx/object.h"
 #include "wx/control.h"
 #include "wx/bitmap.h"
+#include "wx/icon.h"
 
 //-----------------------------------------------------------------------------
 // classes
     const wxBitmap& GetBitmap() const { return m_bitmap; }
 
     // for compatibility with wxMSW
-    wxIcon& GetIcon()
-        { return *(wxDynamicCast(&m_bitmap, wxIcon)); }
+    wxIcon& GetIcon();
 
 private:
     wxBitmap   m_bitmap;
 
 #include "wx/object.h"
 #include "wx/control.h"
 #include "wx/bitmap.h"
+#include "wx/icon.h"
 
 //-----------------------------------------------------------------------------
 // classes
     const wxBitmap& GetBitmap() const { return m_bitmap; }
 
     // for compatibility with wxMSW
-    wxIcon& GetIcon()
-        { return *(wxDynamicCast(&m_bitmap, wxIcon)); }
+    wxIcon& GetIcon();
 
 private:
     wxBitmap   m_bitmap;
 
 // Copyright:   (c) 1997, 1998 Guilhem Lavaux
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
+
 #ifndef _WX_NETWORK_ADDRESS_H
 #define _WX_NETWORK_ADDRESS_H
 
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "wx/defs.h"
+
+#if wxUSE_SOCKETS
+
 #if defined(__WINDOWS__) && defined(WXSOCK_INTERNAL)
 #include <winsock.h>
 
 #include <netinet/in.h>
 #endif
 
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#ifdef WXPREC
-#include <wx/wxprec.h>
-#else
-#include <wx/wx.h>
-#endif
+#include "wx/string.h"
 
 class WXDLLEXPORT wxSockAddress : public wxObject {
   DECLARE_ABSTRACT_CLASS(wxSockAddress)
   inline int Type() { return wxSockAddress::UNIX; }
 };
 #endif
+  // __UNIX__
 
 #endif
+  // wxUSE_SOCKETS
+  
+#endif
+  // _WX_NETWORK_ADDRESS_H
 
 #pragma interface
 #endif
 
+#include "wx/defs.h"
+
 #if wxUSE_SOCKETS
 
-#include <wx/object.h>
-#include <wx/list.h>
-#include <wx/socket.h>
-#include <wx/thread.h>
+#include "wx/object.h"
+#include "wx/list.h"
+#include "wx/socket.h"
+#include "wx/thread.h"
 
 // Socket state
 class SocketState
 
   #pragma hdrstop
 #endif  //__BORLANDC__
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_CONFIG && ((wxUSE_FILE && wxUSE_TEXTFILE) || defined(wxCONFIG_WIN32_NATIVE))
 
 #include "wx/app.h"
 
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_TIMEDATE
 
 #include "wx/date.h"
 
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_STREAMS
 
 #include "wx/datstrm.h"
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
-#include "wx/defs.h"
+  #pragma hdrstop
 #endif
 
 #if wxUSE_DOC_VIEW_ARCHITECTURE
 
-#ifndef WX_PRECOMP
-#include "wx/wx.h"
-#endif
-
 #include "wx/docmdi.h"
 
 /*
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-    #pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
-    #include "wx/defs.h"
+  #pragma hdrstop
 #endif
 
 #if wxUSE_DOC_VIEW_ARCHITECTURE
 
 
 #include  "wx/wxprec.h"
 
-#ifdef    __BORLANDC__
-#   pragma hdrstop
-#endif  //__BORLANDC__
+#ifdef __BORLANDC__
+  #pragma hdrstop
+#endif
 
 #if wxUSE_DYNLIB_CLASS
 
 
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_FILE
 
 // standard
 
 #pragma implementation "fileconf.h"
 #endif
 
-// ============================================================================
-// declarations
-// ============================================================================
-
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
 
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "ftp.h"
+  #pragma implementation "ftp.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #if wxUSE_SOCKETS
 
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "http.h"
+  #pragma implementation "http.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_SOCKETS
 
 #include <stdio.h>
 
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_STREAMS
 
 #include <stdlib.h>
 
   #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-  #include "wx/defs.h"
-#endif
-
 #if wxUSE_SERIAL && wxUSE_STREAMS
 
 #include "wx/object.h"
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #if wxUSE_SOCKETS
 
-#ifndef WX_PRECOMP
-#include <wx/wx.h>
-#endif
-
 #include "wx/protocol/protocol.h"
 #include "wx/url.h"
 #include "wx/module.h"
 
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "sckaddr.h"
+  #pragma implementation "sckaddr.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #if wxUSE_SOCKETS
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+  #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+  #include "wx/utils.h"
+  #include "wx/dcclient.h"
+  #include "wx/dcmemory.h"
+  #include "wx/textctrl.h"
 #endif
 
 #include <string.h>
 
     }
 }
 
+wxIcon& wxStaticBitmap::GetIcon()
+{
+    wxIcon *icon = wxDynamicCast(&m_bitmap, wxIcon);
+    
+    if (!icon) return wxNullIcon;
+    
+    return *icon;
+}
+
 #endif
 
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
-    if (text.IsNull()) return;
+    if (text.IsEmpty()) return;
 
+    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 */
         /* 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);
 }
 
 void wxTextCtrl::AppendText( const wxString &text )
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    if (text.IsEmpty()) return;
+
+    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 */
     {
         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);
 }
 
 bool wxTextCtrl::LoadFile( const wxString &file )
 {
-  wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-  if (!wxFileExists(file)) return FALSE;
+    if (!wxFileExists(file)) return FALSE;
 
-  Clear();
+    Clear();
 
-  FILE *fp = (FILE*) NULL;
-  struct stat statb;
+    FILE *fp = (FILE*) NULL;
+    struct stat statb;
 
-  if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
-      !(fp = fopen (FNSTRINGCAST file.fn_str(), "r")))
-  {
-      return FALSE;
-  }
-  else
-  {
-    gint len = statb.st_size;
-    char *text;
-    if (!(text = (char*)malloc ((unsigned) (len + 1))))
+    if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
+        !(fp = fopen (FNSTRINGCAST file.fn_str(), "r")))
     {
-      fclose (fp);
-      return FALSE;
+        return FALSE;
     }
-    if (fread (text, sizeof (char), len, fp) != (size_t) len)
+    else
     {
-    }
-    fclose (fp);
+        gint len = statb.st_size;
+        char *text;
+        if (!(text = (char*)malloc ((unsigned) (len + 1))))
+        {
+            fclose (fp);
+            return FALSE;
+        }
+        if (fread (text, sizeof (char), len, fp) != (size_t) len)
+        {
+        }
+        fclose (fp);
 
-    text[len] = 0;
+        text[len] = 0;
 
-    if (m_windowStyle & wxTE_MULTILINE)
-    {
-      gint pos = 0;
-      gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos );
-    }
-    else
-    {
-      gtk_entry_set_text( GTK_ENTRY(m_text), text );
+        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;
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos );
+        }
+        else
+        {
+            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;
     }
-
-    free (text);
-    m_modified = FALSE;
-    return TRUE;
-  }
-  return FALSE;
+    return FALSE;
 }
 
 bool wxTextCtrl::SaveFile( const wxString &file )
 {
-  wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-  if (file == _T("")) return FALSE;
+    if (file == _T("")) return FALSE;
 
-  FILE *fp;
+    FILE *fp;
 
-  if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w")))
+    if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w")))
     {
-      return FALSE;
+        return FALSE;
     }
-  else
+    else
     {
       char *text = (char*) NULL;
       gint len = 0;
 
       if (m_windowStyle & wxTE_MULTILINE)
       {
-        len = gtk_text_get_length( GTK_TEXT(m_text) );
-        text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
+          len = gtk_text_get_length( GTK_TEXT(m_text) );
+          text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
       }
       else
       {
-        text = gtk_entry_get_text( GTK_ENTRY(m_text) );
+          text = gtk_entry_get_text( GTK_ENTRY(m_text) );
       }
 
       if (fwrite (text, sizeof (char), len, fp) != (size_t) len)
       return TRUE;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 wxString wxTextCtrl::GetLineText( long lineNo ) const
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 void wxTextCtrl::Replace( long from, long to, const wxString &value )
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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.IsNull()) return;
-    gint pos = (gint)from;
+    
+    if (!value.IsEmpty())
+    {
+        gint pos = (gint)from;
 #if wxUSE_UNICODE
-    wxWX2MBbuf buf = value.mbc_str();
-    gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos );
+        wxWX2MBbuf buf = value.mbc_str();
+        gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos );
 #else
-    gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
+        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);
 }
 
 void wxTextCtrl::Cut()
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 void wxTextCtrl::Copy()
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 bool wxTextCtrl::CanCopy() const
 
     }
 }
 
+wxIcon& wxStaticBitmap::GetIcon()
+{
+    wxIcon *icon = wxDynamicCast(&m_bitmap, wxIcon);
+    
+    if (!icon) return wxNullIcon;
+    
+    return *icon;
+}
+
 #endif
 
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
-    if (text.IsNull()) return;
+    if (text.IsEmpty()) return;
 
+    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 */
         /* 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);
 }
 
 void wxTextCtrl::AppendText( const wxString &text )
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    if (text.IsEmpty()) return;
+
+    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 */
     {
         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);
 }
 
 bool wxTextCtrl::LoadFile( const wxString &file )
 {
-  wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-  if (!wxFileExists(file)) return FALSE;
+    if (!wxFileExists(file)) return FALSE;
 
-  Clear();
+    Clear();
 
-  FILE *fp = (FILE*) NULL;
-  struct stat statb;
+    FILE *fp = (FILE*) NULL;
+    struct stat statb;
 
-  if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
-      !(fp = fopen (FNSTRINGCAST file.fn_str(), "r")))
-  {
-      return FALSE;
-  }
-  else
-  {
-    gint len = statb.st_size;
-    char *text;
-    if (!(text = (char*)malloc ((unsigned) (len + 1))))
+    if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG ||
+        !(fp = fopen (FNSTRINGCAST file.fn_str(), "r")))
     {
-      fclose (fp);
-      return FALSE;
+        return FALSE;
     }
-    if (fread (text, sizeof (char), len, fp) != (size_t) len)
+    else
     {
-    }
-    fclose (fp);
+        gint len = statb.st_size;
+        char *text;
+        if (!(text = (char*)malloc ((unsigned) (len + 1))))
+        {
+            fclose (fp);
+            return FALSE;
+        }
+        if (fread (text, sizeof (char), len, fp) != (size_t) len)
+        {
+        }
+        fclose (fp);
 
-    text[len] = 0;
+        text[len] = 0;
 
-    if (m_windowStyle & wxTE_MULTILINE)
-    {
-      gint pos = 0;
-      gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos );
-    }
-    else
-    {
-      gtk_entry_set_text( GTK_ENTRY(m_text), text );
+        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;
+            gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos );
+        }
+        else
+        {
+            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;
     }
-
-    free (text);
-    m_modified = FALSE;
-    return TRUE;
-  }
-  return FALSE;
+    return FALSE;
 }
 
 bool wxTextCtrl::SaveFile( const wxString &file )
 {
-  wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
 
-  if (file == _T("")) return FALSE;
+    if (file == _T("")) return FALSE;
 
-  FILE *fp;
+    FILE *fp;
 
-  if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w")))
+    if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w")))
     {
-      return FALSE;
+        return FALSE;
     }
-  else
+    else
     {
       char *text = (char*) NULL;
       gint len = 0;
 
       if (m_windowStyle & wxTE_MULTILINE)
       {
-        len = gtk_text_get_length( GTK_TEXT(m_text) );
-        text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
+          len = gtk_text_get_length( GTK_TEXT(m_text) );
+          text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len );
       }
       else
       {
-        text = gtk_entry_get_text( GTK_ENTRY(m_text) );
+          text = gtk_entry_get_text( GTK_ENTRY(m_text) );
       }
 
       if (fwrite (text, sizeof (char), len, fp) != (size_t) len)
       return TRUE;
     }
 
-  return TRUE;
+    return TRUE;
 }
 
 wxString wxTextCtrl::GetLineText( long lineNo ) const
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 void wxTextCtrl::Replace( long from, long to, const wxString &value )
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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.IsNull()) return;
-    gint pos = (gint)from;
+    
+    if (!value.IsEmpty())
+    {
+        gint pos = (gint)from;
 #if wxUSE_UNICODE
-    wxWX2MBbuf buf = value.mbc_str();
-    gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos );
+        wxWX2MBbuf buf = value.mbc_str();
+        gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos );
 #else
-    gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
+        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);
 }
 
 void wxTextCtrl::Cut()
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 void wxTextCtrl::Copy()
 {
     wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
 
+    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);
 }
 
 bool wxTextCtrl::CanCopy() const