X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a66954a67378a1deb5ab6c4299503c82a1e65b62..9f4de6b2cf06f53a98b28f53640f3b9ec8cf4182:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 8dff685433..487926fefc 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -23,9 +23,13 @@ #include #include // for fabs -#include "gdk/gdk.h" -#include "gtk/gtk.h" -#include "gdk/gdkkeysyms.h" +// TODO: reimplement wxTextCtrl using GtkTextView +#ifdef __WXGTK20__ + #define GTK_ENABLE_BROKEN // need this to get GtkText at all +#endif // __WXGTK20__ + +#include "wx/gtk/private.h" +#include //----------------------------------------------------------------------------- // idle system @@ -40,6 +44,7 @@ extern bool g_isIdle; extern bool g_blockEventsOnDrag; extern wxCursor g_globalCursor; +extern wxWindowGTK *g_delayedFocus; // ---------------------------------------------------------------------------- // helpers @@ -212,7 +217,7 @@ bool wxTextCtrl::Create( wxWindow *parent, bool multi_line = (style & wxTE_MULTILINE) != 0; if (multi_line) { -#if (GTK_MINOR_VERSION > 2) +#ifdef __WXGTK13__ /* a multi-line edit control: create a vertical scrollbar by default and horizontal if requested */ bool bHasHScrollbar = (style & wxHSCROLL) != 0; @@ -234,7 +239,7 @@ bool wxTextCtrl::Create( wxWindow *parent, /* always wrap words */ gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); -#if (GTK_MINOR_VERSION > 2) +#ifdef __WXGTK13__ /* put the horizontal scrollbar in the lower left hand corner */ if (bHasHScrollbar) { @@ -296,7 +301,7 @@ bool wxTextCtrl::Create( wxWindow *parent, { gint tmp = 0; -#if GTK_MINOR_VERSION == 0 +#if !GTK_CHECK_VERSION(1, 2, 0) // if we don't realize it, GTK 1.0.6 dies with a SIGSEGV in // gtk_editable_insert_text() gtk_widget_realize(m_text); @@ -312,8 +317,7 @@ bool wxTextCtrl::Create( wxWindow *parent, if (multi_line) { /* bring editable's cursor uptodate. bug in GTK. */ - - GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) ); + SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); } } @@ -446,35 +450,27 @@ void wxTextCtrl::WriteText( const wxString &text ) if ( m_windowStyle & wxTE_MULTILINE ) { // 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() ) - { - GetInsertionPoint(); + gtk_text_set_point( GTK_TEXT(m_text), GET_EDITABLE_POS(m_text) ); - wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); - } - else // no style - { - gint len = GTK_EDITABLE(m_text)->current_pos; - gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len ); - } + // always use m_defaultStyle, even if it is empty as otherwise + // resetting the style and appending some more text wouldn't work: if + // we don't specify the style explicitly, the old style would be used + wxGtkTextInsert(m_text, m_defaultStyle, txt, txtlen); // Bring editable's cursor back uptodate. - GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) ); + SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); } else // single line { // This moves the cursor pos to behind the inserted text. - gint len = GTK_EDITABLE(m_text)->current_pos; + gint len = GET_EDITABLE_POS(m_text); gtk_editable_insert_text( GTK_EDITABLE(m_text), txt, txtlen, &len ); // Bring editable's cursor uptodate. - GTK_EDITABLE(m_text)->current_pos += text.Len(); + len += text.Len(); // Bring entry's cursor uptodate. - gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos ); + gtk_entry_set_position( GTK_ENTRY(m_text), len ); } m_modified = TRUE; @@ -643,7 +639,7 @@ void wxTextCtrl::SetInsertionPoint( long pos ) /* bring editable's cursor uptodate. another bug in GTK. */ - GTK_EDITABLE(m_text)->current_pos = gtk_text_get_point( GTK_TEXT(m_text) ); + SET_EDITABLE_POS(m_text, gtk_text_get_point( GTK_TEXT(m_text) )); } else { @@ -651,7 +647,7 @@ void wxTextCtrl::SetInsertionPoint( long pos ) /* bring editable's cursor uptodate. bug in GTK. */ - GTK_EDITABLE(m_text)->current_pos = (guint32)pos; + SET_EDITABLE_POS(m_text, (guint32)pos); } } @@ -791,16 +787,26 @@ void wxTextCtrl::SetSelection( long from, long to ) gtk_editable_select_region( GTK_EDITABLE(m_text), (gint)from, (gint)to ); } -void wxTextCtrl::ShowPosition( long WXUNUSED(pos) ) +void wxTextCtrl::ShowPosition( long pos ) { -// SetInsertionPoint( pos ); + if (m_windowStyle & wxTE_MULTILINE) + { + GtkAdjustment *vp = GTK_TEXT(m_text)->vadj; + float totalLines = (float) GetNumberOfLines(); + long posX; + long posY; + PositionToXY(pos, &posX, &posY); + float posLine = (float) posY; + float p = (posLine/totalLines)*(vp->upper - vp->lower) + vp->lower; + gtk_adjustment_set_value(GTK_TEXT(m_text)->vadj, p); + } } long wxTextCtrl::GetInsertionPoint() const { wxCHECK_MSG( m_text != NULL, 0, wxT("invalid text ctrl") ); - return (long) GTK_EDITABLE(m_text)->current_pos; + return (long) GET_EDITABLE_POS(m_text); } long wxTextCtrl::GetLastPosition() const @@ -845,33 +851,21 @@ void wxTextCtrl::Cut() { 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_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); } void wxTextCtrl::Copy() { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); -#if (GTK_MINOR_VERSION > 0) - gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) ); -#else - gtk_editable_copy_clipboard( GTK_EDITABLE(m_text), 0 ); -#endif + gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); } void wxTextCtrl::Paste() { 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_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG ); } // Undo/redo @@ -907,21 +901,27 @@ void wxTextCtrl::GetSelection(long* fromOut, long* toOut) const { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); - long from, to; + gint from, to; +#ifdef __WXGTK20__ + if ( !gtk_editable_get_selection_bounds(GTK_EDITABLE(m_text), &from, &to) ) +#else if ( !(GTK_EDITABLE(m_text)->has_selection) ) +#endif { from = to = GetInsertionPoint(); } else // got selection { +#ifndef __WXGTK20__ from = (long) GTK_EDITABLE(m_text)->selection_start_pos; to = (long) GTK_EDITABLE(m_text)->selection_end_pos; +#endif if ( from > to ) { // exchange them to be compatible with wxMSW - long tmp = from; + gint tmp = from; from = to; to = tmp; } @@ -937,7 +937,11 @@ bool wxTextCtrl::IsEditable() const { wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") ); +#ifdef __WXGTK20__ + return gtk_editable_get_editable(GTK_EDITABLE(m_text)); +#else return GTK_EDITABLE(m_text)->editable; +#endif } bool wxTextCtrl::IsModified() const @@ -1234,6 +1238,15 @@ void wxTextCtrl::OnInternalIdle() gdk_window_set_cursor( window, cursor.GetCursor() ); } + if (g_delayedFocus == this) + { + if (GTK_WIDGET_REALIZED(m_widget)) + { + gtk_widget_grab_focus( m_widget ); + g_delayedFocus = NULL; + } + } + UpdateWindowUI(); }