X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce2f50e34a191c323781d4a86aa333b9571b8d76..e4315700228573d42a9afb1498fec4ee7b95ccb0:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 468f7262a2..2cb16ddea1 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -52,6 +52,9 @@ gtk_insert_text_callback(GtkEditable *editable, gint *position, wxTextCtrl *win) { + if (g_isIdle) + wxapp_install_idle_handler(); + // we should only be called if we have a max len limit at all GtkEntry *entry = GTK_ENTRY (editable); @@ -83,7 +86,7 @@ gtk_insert_text_callback(GtkEditable *editable, //----------------------------------------------------------------------------- static void -gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) +gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) { if ( win->IgnoreTextUpdate() ) return; @@ -117,111 +120,6 @@ gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) win->CalculateScrollbar(); } -//----------------------------------------------------------------------------- -// "focus_in_event" -//----------------------------------------------------------------------------- - -extern wxWindow *g_focusWindow; -extern bool g_blockEventsOnDrag; -// extern bool g_isIdle; - -static gint gtk_text_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) -{ - // Necessary? -#if 0 - if (g_isIdle) - wxapp_install_idle_handler(); -#endif - if (!win->m_hasVMT) return FALSE; - if (g_blockEventsOnDrag) return FALSE; - - g_focusWindow = win; - - // notify the parent that we got the focus - wxChildFocusEvent eventFocus(win); - (void)win->GetEventHandler()->ProcessEvent(eventFocus); - -#ifdef HAVE_XIM - if (win->m_ic) - gdk_im_begin(win->m_ic, win->m_wxwindow->window); -#endif - -#if 0 -#ifdef wxUSE_CARET - // caret needs to be informed about focus change - wxCaret *caret = win->GetCaret(); - if ( caret ) - { - caret->OnSetFocus(); - } -#endif // wxUSE_CARET -#endif - - wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); - event.SetEventObject( win ); - - if (win->GetEventHandler()->ProcessEvent( event )) - { - return TRUE; - } - - return FALSE; -} - -//----------------------------------------------------------------------------- -// "focus_out_event" -//----------------------------------------------------------------------------- - -static gint gtk_text_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) -{ -#if 0 - if (g_isIdle) - wxapp_install_idle_handler(); -#endif - - if (!win->m_hasVMT) return FALSE; - if (g_blockEventsOnDrag) return FALSE; - -#if 0 - // if the focus goes out of our app alltogether, OnIdle() will send - // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset - // g_sendActivateEvent to -1 - g_sendActivateEvent = 0; -#endif - - wxWindow *winFocus = wxFindFocusedChild(win); - if ( winFocus ) - win = winFocus; - - g_focusWindow = (wxWindow *)NULL; - -#ifdef HAVE_XIM - if (win->m_ic) - gdk_im_end(); -#endif - -#if 0 -#ifdef wxUSE_CARET - // caret needs to be informed about focus change - wxCaret *caret = win->GetCaret(); - if ( caret ) - { - caret->OnKillFocus(); - } -#endif // wxUSE_CARET -#endif - - wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); - event.SetEventObject( win ); - - if (win->GetEventHandler()->ProcessEvent( event )) - { - return TRUE; - } - - return FALSE; -} - //----------------------------------------------------------------------------- // wxTextCtrl //----------------------------------------------------------------------------- @@ -347,6 +245,8 @@ bool wxTextCtrl::Create( wxWindow *parent, } m_parent->DoAddChild( this ); + + m_focusWidget = m_text; PostCreation(); @@ -368,20 +268,6 @@ bool wxTextCtrl::Create( wxWindow *parent, { gtk_signal_connect(GTK_OBJECT(GTK_TEXT(m_text)->vadj), "changed", (GtkSignalFunc) gtk_scrollbar_changed_callback, (gpointer) this ); - - gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_in_event", - GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); - - gtk_signal_connect( GTK_OBJECT(GTK_TEXT(m_text)), "focus_out_event", - GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); - } - else - { - gtk_signal_connect( GTK_OBJECT(m_text), "focus_in_event", - GTK_SIGNAL_FUNC(gtk_text_focus_in_callback), (gpointer)this ); - - gtk_signal_connect( GTK_OBJECT(m_text), "focus_out_event", - GTK_SIGNAL_FUNC(gtk_text_focus_out_callback), (gpointer)this ); } if (!value.IsEmpty()) @@ -439,10 +325,7 @@ bool wxTextCtrl::Create( wxWindow *parent, m_cursor = wxCursor( wxCURSOR_IBEAM ); - // FIXME: is the bg colour correct here? - wxTextAttr attrDef( colFg, - wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW), - parent->GetFont() ); + wxTextAttr attrDef( colFg, m_backgroundColour, parent->GetFont() ); SetDefaultStyle( attrDef ); Show( TRUE ); @@ -540,9 +423,9 @@ void wxTextCtrl::WriteText( const wxString &text ) if ( m_windowStyle & wxTE_MULTILINE ) { - /* this moves the cursor pos to behind the inserted text */ - gint len = GTK_EDITABLE(m_text)->current_pos; - + // After cursor movements, gtk_text_get_point() is wrong by one. + gtk_text_set_point( GTK_TEXT(m_text), GTK_EDITABLE(m_text)->current_pos ); + // if we have any special style, use it if ( !m_defaultStyle.IsDefault() ) { @@ -558,113 +441,73 @@ void wxTextCtrl::WriteText( const wxString &text ) ? m_defaultStyle.GetBackgroundColour().GetColor() : NULL; - gtk_text_insert( GTK_TEXT(m_text), font, colFg, colBg, txt, txtlen ); + GetInsertionPoint(); + gtk_text_insert( GTK_TEXT(m_text), font, colFg, colBg, txt, -1 ); } else // no style { + gint len = GTK_EDITABLE(m_text)->current_pos; gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len ); } - - /* bring editable's cursor uptodate. bug in GTK. */ + + // Bring editable's cursor back uptodate. GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) ); } else // single line { - /* this moves the cursor pos to behind the inserted text */ + // This moves the cursor pos to behind the inserted text. gint len = GTK_EDITABLE(m_text)->current_pos; gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len ); - /* bring editable's cursor uptodate. bug in GTK. */ + // Bring editable's cursor uptodate. GTK_EDITABLE(m_text)->current_pos += text.Len(); - /* bring entry's cursor uptodate. bug in GTK. */ + // Bring entry's cursor uptodate. gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos ); } + + m_modified = TRUE; } void wxTextCtrl::AppendText( const wxString &text ) { - wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); - - if ( text.empty() ) - return; - -#if wxUSE_UNICODE - wxWX2MBbuf buf = text.mbc_str(); - const char *txt = buf; - size_t txtlen = strlen(buf); -#else - const char *txt = text; - size_t txtlen = text.length(); -#endif + SetInsertionPointEnd(); + WriteText( text ); +} +wxString wxTextCtrl::GetLineText( long lineNo ) const +{ if (m_windowStyle & wxTE_MULTILINE) { - if ( !m_defaultStyle.IsDefault() ) - { - wxFont font = m_defaultStyle.HasFont() ? m_defaultStyle.GetFont() - : m_font; - GdkFont *fnt = font.Ok() ? font.GetInternalFont() : NULL; - - wxColour col = m_defaultStyle.HasTextColour() - ? m_defaultStyle.GetTextColour() - : m_foregroundColour; - GdkColor *colFg = col.Ok() ? col.GetColor() : NULL; + gint len = gtk_text_get_length( GTK_TEXT(m_text) ); + char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); - col = m_defaultStyle.HasBackgroundColour() - ? m_defaultStyle.GetBackgroundColour() - : m_backgroundColour; - GdkColor *colBg = col.Ok() ? col.GetColor() : NULL; + if (text) + { + wxString buf(wxT("")); + long i; + int currentLine = 0; + for (i = 0; currentLine != lineNo && text[i]; i++ ) + if (text[i] == '\n') + currentLine++; + // Now get the text + int j; + for (j = 0; text[i] && text[i] != '\n'; i++, j++ ) + buf += text[i]; - gtk_text_insert( GTK_TEXT(m_text), fnt, colFg, colBg, txt, txtlen ); + g_free( text ); + return buf; } - else // no style + else { - /* we'll insert at the last position */ - gint len = gtk_text_get_length( GTK_TEXT(m_text) ); - gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len ); + return wxEmptyString; } - - /* bring editable's cursor uptodate. bug in GTK. */ - GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) ); - } - else // single line - { - gtk_entry_append_text( GTK_ENTRY(m_text), txt ); } -} - -wxString wxTextCtrl::GetLineText( long lineNo ) const -{ - if (m_windowStyle & wxTE_MULTILINE) - { - gint len = gtk_text_get_length( GTK_TEXT(m_text) ); - char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); - - if (text) + else { - wxString buf(wxT("")); - long i; - int currentLine = 0; - for (i = 0; currentLine != lineNo && text[i]; i++ ) - if (text[i] == '\n') - currentLine++; - // Now get the text - int j; - for (j = 0; text[i] && text[i] != '\n'; i++, j++ ) - buf += text[i]; - - g_free( text ); - return buf; + if (lineNo == 0) return GetValue(); + return wxEmptyString; } - else - return wxEmptyString; - } - else - { - if (lineNo == 0) return GetValue(); - return wxEmptyString; - } } void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) )