X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8e609c82594a57104ff5e0d4044b2e2697a4b576..3e1924dd5f5744c3e2a8973de9b3e4f372b7fd85:/src/gtk1/textctrl.cpp diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 69f4970990..ea289a657e 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -17,17 +17,16 @@ #include "wx/log.h" #include "wx/utils.h" #include "wx/panel.h" + #include "wx/settings.h" + #include "wx/math.h" #endif -#include "wx/math.h" -#include "wx/settings.h" #include "wx/strconv.h" #include "wx/fontutil.h" // for wxNativeFontInfo (GetNativeFontInfo()) #include #include #include -#include "wx/math.h" #include "wx/gtk1/private.h" #include @@ -56,8 +55,21 @@ static void wxGtkTextInsert(GtkWidget *text, const char *txt, size_t len) { - GdkFont *font = attr.HasFont() ? attr.GetFont().GetInternalFont() - : NULL; + wxFont tmpFont; + GdkFont *font; + if (attr.HasFont()) + { + tmpFont = attr.GetFont(); + + // FIXME: if this crashes because tmpFont goes out of scope and the GdkFont is + // deleted, then we need to call gdk_font_ref on font. + // This is because attr.GetFont() now returns a temporary font since wxTextAttr + // no longer stores a wxFont object, for efficiency. + + font = tmpFont.GetInternalFont(); + } + else + font = NULL; GdkColor *colFg = attr.HasTextColour() ? attr.GetTextColour().GetColor() : NULL; @@ -77,9 +89,9 @@ static void wxGtkTextInsert(GtkWidget *text, extern "C" { static void gtk_insert_text_callback(GtkEditable *editable, - const gchar *new_text, - gint new_text_length, - gint *position, + const gchar *WXUNUSED(new_text), + gint WXUNUSED(new_text_length), + gint *WXUNUSED(position), wxTextCtrl *win) { if (g_isIdle) @@ -107,7 +119,7 @@ gtk_insert_text_callback(GtkEditable *editable, wxCommandEvent event(wxEVT_COMMAND_TEXT_MAXLEN, win->GetId()); event.SetEventObject(win); event.SetString(win->GetValue()); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } } @@ -118,7 +130,7 @@ gtk_insert_text_callback(GtkEditable *editable, extern "C" { static void -gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) +gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { if ( win->IgnoreTextUpdate() ) return; @@ -133,7 +145,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } @@ -188,9 +200,9 @@ static void wxgtk_text_draw( GtkWidget *widget, GdkRectangle *rect) // wxTextCtrl //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) -BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) +BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_CHAR(wxTextCtrl::OnChar) EVT_MENU(wxID_CUT, wxTextCtrl::OnCut) @@ -413,10 +425,16 @@ wxString wxTextCtrl::GetValue() const return tmp; } -void wxTextCtrl::SetValue( const wxString &value ) +void wxTextCtrl::DoSetValue( const wxString &value, int flags ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); + if ( !(flags & SetValue_SendEvent) ) + { + // do not generate events + IgnoreNextTextUpdate(); + } + if (m_windowStyle & wxTE_MULTILINE) { gint len = gtk_text_get_length( GTK_TEXT(m_text) ); @@ -458,7 +476,7 @@ void wxTextCtrl::WriteText( const wxString &text ) // 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 gtk_editable_delete_selection( GTK_EDITABLE(m_text) ); - wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.Len()); + wxGtkTextInsert(m_text, m_defaultStyle, text.c_str(), text.length()); // we called wxGtkTextInsert with correct font, no need to do anything // in UpdateFontIfNeeded() any longer @@ -478,7 +496,7 @@ void wxTextCtrl::WriteText( const wxString &text ) // This moves the cursor pos to behind the inserted text. gint len = GET_EDITABLE_POS(m_text); - gtk_editable_insert_text( GTK_EDITABLE(m_text), text.c_str(), text.Len(), &len ); + gtk_editable_insert_text( GTK_EDITABLE(m_text), text.c_str(), text.length(), &len ); // Bring entry's cursor uptodate. gtk_entry_set_position( GTK_ENTRY(m_text), len ); @@ -542,7 +560,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const wxString text = GetValue(); // cast to prevent warning. But pos really should've been unsigned. - if( (unsigned long)pos > text.Len() ) + if( (unsigned long)pos > text.length() ) return false; *x=0; // First Col @@ -685,32 +703,26 @@ void wxTextCtrl::SetEditable( bool editable ) } } -bool wxTextCtrl::Enable( bool enable ) +void wxTextCtrl::DoEnable( bool enable ) { - if (!wxWindowBase::Enable(enable)) - { - // nothing to do - return false; - } - if (m_windowStyle & wxTE_MULTILINE) { gtk_text_set_editable( GTK_TEXT(m_text), enable ); - OnParentEnable(enable); } else { gtk_widget_set_sensitive( m_text, enable ); } - - return true; } // wxGTK-specific: called recursively by Enable, // to give widgets an oppprtunity to correct their colours after they // have been changed by Enable -void wxTextCtrl::OnParentEnable( bool enable ) +void wxTextCtrl::OnEnabled( bool WXUNUSED(enable) ) { + if ( IsSingleLine() ) + return; + // If we have a custom background colour, we use this colour in both // disabled and enabled mode, or we end up with a different colour under the // text. @@ -987,7 +999,7 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event ) wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); event.SetEventObject(this); event.SetString(GetValue()); - if (GetEventHandler()->ProcessEvent(event)) return; + if (HandleWindowEvent(event)) return; } if ((key_event.GetKeyCode() == WXK_RETURN) && !(m_windowStyle & wxTE_MULTILINE)) @@ -1278,7 +1290,7 @@ wxSize wxTextCtrl::DoGetBestSize() const // freeze/thaw // ---------------------------------------------------------------------------- -void wxTextCtrl::Freeze() +void wxTextCtrl::DoFreeze() { if ( HasFlag(wxTE_MULTILINE) ) { @@ -1286,7 +1298,7 @@ void wxTextCtrl::Freeze() } } -void wxTextCtrl::Thaw() +void wxTextCtrl::DoThaw() { if ( HasFlag(wxTE_MULTILINE) ) {