]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/textctrl.cpp
debug check for infinite loop in InitializeClasses() added
[wxWidgets.git] / src / gtk / textctrl.cpp
index 9739c45681107e156f27c2c07e0fae9a6be427d8..3fc3e5386ce14438534d97153cbcf765512dbc2f 100644 (file)
@@ -35,7 +35,8 @@ extern bool g_isIdle;
 // data
 //-----------------------------------------------------------------------------
 
-extern bool   g_blockEventsOnDrag;
+extern bool       g_blockEventsOnDrag;
+extern wxCursor   g_globalCursor;
 
 //-----------------------------------------------------------------------------
 //  "changed"
@@ -114,11 +115,13 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
     m_needParent = TRUE;
     m_acceptsFocus = TRUE;
 
-    PreCreation( parent, id, pos, size, style, name );
+    if (!PreCreation( parent, pos, size ) ||
+        !CreateBase( parent, id, pos, size, style, validator, name ))
+    {
+        wxFAIL_MSG( wxT("wxTextCtrl creation failed") );
+       return FALSE;
+    }
 
-#if wxUSE_VALIDATORS
-    SetValidator( validator );
-#endif // wxUSE_VALIDATORS
 
     m_vScrollbarVisible = FALSE;
 
@@ -179,10 +182,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
           m_text = gtk_entry_new();
     }
 
-    wxSize newSize = size;
-    if (newSize.x == -1) newSize.x = 80;
-    if (newSize.y == -1) newSize.y = 26;
-    SetSize( newSize.x, newSize.y );
+    SetSizeOrDefault( size );
 
     m_parent->DoAddChild( this );
 
@@ -246,6 +246,8 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value,
     SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) );
     SetForegroundColour( parent->GetForegroundColour() );
 
+    m_cursor = wxCursor( wxCURSOR_IBEAM );
+    
     Show( TRUE );
 
     return TRUE;
@@ -277,7 +279,7 @@ void wxTextCtrl::CalculateScrollbar()
 
 wxString wxTextCtrl::GetValue() const
 {
-    wxCHECK_MSG( m_text != NULL, _T(""), _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, wxT(""), wxT("invalid text ctrl") );
 
     wxString tmp;
     if (m_windowStyle & wxTE_MULTILINE)
@@ -296,12 +298,9 @@ wxString wxTextCtrl::GetValue() const
 
 void wxTextCtrl::SetValue( 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);
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
-    wxString tmp = _T("");
+    wxString tmp = wxT("");
     if (!value.IsNull()) tmp = value;
     if (m_windowStyle & wxTE_MULTILINE)
     {
@@ -319,20 +318,14 @@ 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);
 }
 
 void wxTextCtrl::WriteText( const wxString &text )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("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)
     {
         /* this moves the cursor pos to behind the inserted text */
@@ -365,20 +358,14 @@ 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);
 }
 
 void wxTextCtrl::AppendText( const wxString &text )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("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)
     {
         bool hasSpecialAttributes = m_font.Ok() ||
@@ -412,9 +399,6 @@ 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);
 }
 
 wxString wxTextCtrl::GetLineText( long lineNo ) const
@@ -426,7 +410,7 @@ wxString wxTextCtrl::GetLineText( long lineNo ) const
 
     if (text)
     {
-        wxString buf(_T(""));
+        wxString buf(wxT(""));
         long i;
         int currentLine = 0;
         for (i = 0; currentLine != lineNo && text[i]; i++ )
@@ -454,7 +438,7 @@ void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )
 {
   /* If you implement this, don't forget to update the documentation!
    * (file docs/latex/wx/text.tex) */
-    wxFAIL_MSG( _T("wxTextCtrl::OnDropFiles not implemented") );
+    wxFAIL_MSG( wxT("wxTextCtrl::OnDropFiles not implemented") );
 }
 
 bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
@@ -473,7 +457,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
         const wxChar* stop = text.c_str() + pos;
         for ( const wxChar *p = text.c_str(); p < stop; p++ )
         {
-            if (*p == _T('\n'))
+            if (*p == wxT('\n'))
             {
                 (*y)++;
                 *x=0;
@@ -549,7 +533,7 @@ int wxTextCtrl::GetNumberOfLines() const
 
 void wxTextCtrl::SetInsertionPoint( long pos )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     if (m_windowStyle & wxTE_MULTILINE)
     {
@@ -580,13 +564,13 @@ void wxTextCtrl::SetInsertionPoint( long pos )
 
         /* bring editable's cursor uptodate. bug in GTK. */
 
-        GTK_EDITABLE(m_text)->current_pos = pos;
+        GTK_EDITABLE(m_text)->current_pos = (guint32)pos;
     }
 }
 
 void wxTextCtrl::SetInsertionPointEnd()
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     if (m_windowStyle & wxTE_MULTILINE)
         SetInsertionPoint(gtk_text_get_length(GTK_TEXT(m_text)));
@@ -596,7 +580,7 @@ void wxTextCtrl::SetInsertionPointEnd()
 
 void wxTextCtrl::SetEditable( bool editable )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     if (m_windowStyle & wxTE_MULTILINE)
         gtk_text_set_editable( GTK_TEXT(m_text), editable );
@@ -611,7 +595,7 @@ void wxTextCtrl::DiscardEdits()
 
 void wxTextCtrl::SetSelection( long from, long to )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to );
 }
@@ -623,14 +607,14 @@ void wxTextCtrl::ShowPosition( long WXUNUSED(pos) )
 
 long wxTextCtrl::GetInsertionPoint() const
 {
-    wxCHECK_MSG( m_text != NULL, 0, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
 
     return (long) GTK_EDITABLE(m_text)->current_pos;
 }
 
 long wxTextCtrl::GetLastPosition() const
 {
-    wxCHECK_MSG( m_text != NULL, 0, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") );
 
     int pos = 0;
     if (m_windowStyle & wxTE_MULTILINE)
@@ -643,23 +627,14 @@ long wxTextCtrl::GetLastPosition() const
 
 void wxTextCtrl::Remove( long from, long to )
 {
-    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);
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     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);
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to );
 
@@ -673,31 +648,22 @@ 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);
 }
 
 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);
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 #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") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 #if (GTK_MINOR_VERSION > 0)
     gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) );
@@ -708,19 +674,13 @@ void wxTextCtrl::Copy()
 
 void wxTextCtrl::Paste()
 {
-    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);
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 #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
@@ -748,26 +708,26 @@ bool wxTextCtrl::CanPaste() const
 void wxTextCtrl::Undo()
 {
     // TODO
-    wxFAIL_MSG( _T("wxTextCtrl::Undo not implemented") );
+    wxFAIL_MSG( wxT("wxTextCtrl::Undo not implemented") );
 }
 
 void wxTextCtrl::Redo()
 {
     // TODO
-    wxFAIL_MSG( _T("wxTextCtrl::Redo not implemented") );
+    wxFAIL_MSG( wxT("wxTextCtrl::Redo not implemented") );
 }
 
 bool wxTextCtrl::CanUndo() const
 {
     // TODO
-    wxFAIL_MSG( _T("wxTextCtrl::CanUndo not implemented") );
+    wxFAIL_MSG( wxT("wxTextCtrl::CanUndo not implemented") );
     return FALSE;
 }
 
 bool wxTextCtrl::CanRedo() const
 {
     // TODO
-    wxFAIL_MSG( _T("wxTextCtrl::CanRedo not implemented") );
+    wxFAIL_MSG( wxT("wxTextCtrl::CanRedo not implemented") );
     return FALSE;
 }
 
@@ -775,7 +735,7 @@ bool wxTextCtrl::CanRedo() const
 // selection.
 void wxTextCtrl::GetSelection(long* from, long* to) const
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     if (!(GTK_EDITABLE(m_text)->has_selection))
     {
@@ -790,7 +750,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
 
 bool wxTextCtrl::IsEditable() const
 {
-    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 
     return GTK_EDITABLE(m_text)->editable;
 }
@@ -802,12 +762,12 @@ bool wxTextCtrl::IsModified() const
 
 void wxTextCtrl::Clear()
 {
-    SetValue( _T("") );
+    SetValue( wxT("") );
 }
 
 void wxTextCtrl::OnChar( wxKeyEvent &key_event )
 {
-    wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") );
+    wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
     if ((key_event.KeyCode() == WXK_RETURN) && (m_windowStyle & wxPROCESS_ENTER))
     {
@@ -816,6 +776,20 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event )
         if (GetEventHandler()->ProcessEvent(event)) return;
     }
 
+    if ((key_event.KeyCode() == WXK_RETURN) && !(m_windowStyle & wxTE_MULTILINE))
+    {
+        wxWindow *top_frame = m_parent;
+        while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
+            top_frame = top_frame->GetParent();
+       GtkWindow *window = GTK_WINDOW(top_frame->m_widget);
+       
+       if (window->default_widget)
+        {
+            gtk_widget_activate (window->default_widget);
+           return;
+       }
+    }
+
     key_event.Skip();
 }
 
@@ -835,7 +809,7 @@ bool wxTextCtrl::IsOwnGtkWindow( GdkWindow *window )
 // the font will change for subsequent text insertiongs
 bool wxTextCtrl::SetFont( const wxFont &font )
 {
-    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 
     if ( !wxWindowBase::SetFont(font) )
     {
@@ -861,7 +835,7 @@ bool wxTextCtrl::SetFont( const wxFont &font )
 
 bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )
 {
-    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 
     // doesn't work
     return FALSE;
@@ -869,7 +843,7 @@ bool wxTextCtrl::SetForegroundColour( const wxColour &WXUNUSED(colour) )
 
 bool wxTextCtrl::SetBackgroundColour( const wxColour &colour )
 {
-    wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") );
+    wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
 
     wxControl::SetBackgroundColour( colour );
 
@@ -962,3 +936,36 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
 {
     event.Enable( CanRedo() );
 }
+
+void wxTextCtrl::OnInternalIdle()
+{
+    wxCursor cursor = m_cursor;
+    if (g_globalCursor.Ok()) cursor = g_globalCursor;
+
+    if (cursor.Ok())
+    {
+        GdkWindow *window = (GdkWindow*) NULL;
+       if (HasFlag(wxTE_MULTILINE))
+            window = GTK_TEXT(m_text)->text_area;
+        else
+            window = GTK_ENTRY(m_text)->text_area;
+           
+        if (window)
+            gdk_window_set_cursor( window, cursor.GetCursor() );
+
+        if (!g_globalCursor.Ok())
+            cursor = *wxSTANDARD_CURSOR;
+
+        window = m_widget->window;
+        if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget)))
+            gdk_window_set_cursor( window, cursor.GetCursor() );
+    }
+
+    UpdateWindowUI();
+}
+
+wxSize wxTextCtrl::DoGetBestSize() const
+{
+    // FIXME should be different for multi-line controls...
+    return wxSize(80, 26);
+}