]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/textctrl.cpp
1. made compilation with WXWIN_COMPATIBILITY_EVENT_TYPES really work
[wxWidgets.git] / src / gtk1 / textctrl.cpp
index 0f8df9de994744b2fb27480606b62d1c6697d46f..6194b622bc2d71c3efd0df4bc4708587bd13aeb1 100644 (file)
@@ -14,6 +14,7 @@
 #include "wx/textctrl.h"
 #include "wx/utils.h"
 #include "wx/intl.h"
 #include "wx/textctrl.h"
 #include "wx/utils.h"
 #include "wx/intl.h"
+#include "wx/log.h"
 #include "wx/settings.h"
 
 #include <sys/types.h>
 #include "wx/settings.h"
 
 #include <sys/types.h>
@@ -51,6 +52,7 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win )
         wxapp_install_idle_handler();
 
     win->SetModified();
         wxapp_install_idle_handler();
 
     win->SetModified();
+    win->UpdateFontIfNeeded();
 
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
     event.SetString( win->GetValue() );
 
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
     event.SetString( win->GetValue() );
@@ -95,9 +97,12 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
     EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
 
     EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
 END_EVENT_TABLE()
 
-wxTextCtrl::wxTextCtrl()
+void wxTextCtrl::Init()
 {
     m_modified = FALSE;
 {
     m_modified = FALSE;
+    m_updateFont = FALSE;
+    m_text =
+    m_vScrollbar = (GtkWidget *)NULL;
 }
 
 wxTextCtrl::wxTextCtrl( wxWindow *parent,
 }
 
 wxTextCtrl::wxTextCtrl( wxWindow *parent,
@@ -109,7 +114,8 @@ wxTextCtrl::wxTextCtrl( wxWindow *parent,
                         const wxValidator& validator,
                         const wxString &name )
 {
                         const wxValidator& validator,
                         const wxString &name )
 {
-    m_modified = FALSE;
+    Init();
+
     Create( parent, id, value, pos, size, style, validator, name );
 }
 
     Create( parent, id, value, pos, size, style, validator, name );
 }
 
@@ -319,24 +325,29 @@ void wxTextCtrl::SetValue( const wxString &value )
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
-    wxString tmp = wxT("");
-    if (!value.IsNull()) tmp = value;
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gint len = gtk_text_get_length( GTK_TEXT(m_text) );
         gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
         len = 0;
 #if wxUSE_UNICODE
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gint len = gtk_text_get_length( GTK_TEXT(m_text) );
         gtk_editable_delete_text( GTK_EDITABLE(m_text), 0, len );
         len = 0;
 #if wxUSE_UNICODE
-        wxWX2MBbuf tmpbuf = tmp.mbc_str();
+        wxWX2MBbuf tmpbuf = value.mbc_str();
         gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
 #else
         gtk_editable_insert_text( GTK_EDITABLE(m_text), tmpbuf, strlen(tmpbuf), &len );
 #else
-        gtk_editable_insert_text( GTK_EDITABLE(m_text), tmp.mbc_str(), tmp.Length(), &len );
+        gtk_editable_insert_text( GTK_EDITABLE(m_text), value.mbc_str(), value.Length(), &len );
 #endif
     }
     else
     {
 #endif
     }
     else
     {
-        gtk_entry_set_text( GTK_ENTRY(m_text), tmp.mbc_str() );
+        gtk_entry_set_text( GTK_ENTRY(m_text), value.mbc_str() );
     }
     }
+
+    // GRG, Jun/2000: Changed this after a lot of discussion in
+    //   the lists. wxWindows 2.2 will have a set of flags to
+    //   customize this behaviour.
+    SetInsertionPoint(0);
+
+    m_modified = FALSE;
 }
 
 void wxTextCtrl::WriteText( const wxString &text )
 }
 
 void wxTextCtrl::WriteText( const wxString &text )
@@ -614,7 +625,7 @@ bool wxTextCtrl::Enable( bool enable )
         // nothing to do
         return FALSE;
     }
         // nothing to do
         return FALSE;
     }
-    
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gtk_text_set_editable( GTK_TEXT(m_text), enable );
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gtk_text_set_editable( GTK_TEXT(m_text), enable );
@@ -636,6 +647,14 @@ void wxTextCtrl::SetSelection( long from, long to )
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
+    if ( (m_windowStyle & wxTE_MULTILINE) &&
+         !GTK_TEXT(m_text)->line_start_cache )
+    {
+        // tell the programmer that it didn't work
+        wxLogDebug(_T("Can't call SetSelection() before realizing the control"));
+        return;
+    }
+
     gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
 }
 
     gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
 }
 
@@ -735,7 +754,7 @@ bool wxTextCtrl::CanCut() const
     // Can cut if there's a selection
     long from, to;
     GetSelection(& from, & to);
     // Can cut if there's a selection
     long from, to;
     GetSelection(& from, & to);
-    return (from != to) ;
+    return (from != to) && (IsEditable());
 }
 
 bool wxTextCtrl::CanPaste() const
 }
 
 bool wxTextCtrl::CanPaste() const
@@ -778,8 +797,9 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
 
     if (!(GTK_EDITABLE(m_text)->has_selection))
     {
 
     if (!(GTK_EDITABLE(m_text)->has_selection))
     {
-        if (from) *from = 0;
-        if (to)   *to = 0;
+        long i = GetInsertionPoint();
+        if (from) *from = i;
+        if (to)   *to = i;
         return;
     }
 
         return;
     }
 
@@ -812,6 +832,7 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event )
     {
         wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
         event.SetEventObject(this);
     {
         wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
         event.SetEventObject(this);
+        event.SetString(GetValue());
         if (GetEventHandler()->ProcessEvent(event)) return;
     }
 
         if (GetEventHandler()->ProcessEvent(event)) return;
     }
 
@@ -858,20 +879,37 @@ bool wxTextCtrl::SetFont( const wxFont &font )
 
     if ( m_windowStyle & wxTE_MULTILINE )
     {
 
     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();
+        m_updateFont = TRUE;
 
 
-            AppendText(value);
-        }
+        ChangeFontGlobally();
     }
 
     return TRUE;
 }
 
     }
 
     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.IsEmpty() )
+    {
+        Clear();
+        AppendText(value);
+
+        m_updateFont = FALSE;
+    }
+}
+
+void wxTextCtrl::UpdateFontIfNeeded()
+{
+    if ( m_updateFont )
+        ChangeFontGlobally();
+}
+
 bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )
 {
     wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )
 {
     wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );