X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1043456035b60331b7faed24e69f81e94bd2cf85..9f9305c0d2a0c4aa55470c882a13861c284f6af2:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 15c7981c77..10a90eaad7 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -461,6 +461,25 @@ au_check_range(GtkTextIter *s, //----------------------------------------------------------------------------- extern "C" { + +// Normal version used for detecting IME input and generating appropriate +// events for it. +void +wx_insert_text_callback(GtkTextBuffer* buffer, + GtkTextIter* WXUNUSED(end), + gchar *text, + gint WXUNUSED(len), + wxTextCtrl *win) +{ + if ( win->GTKOnInsertText(text) ) + { + // If we already handled the new text insertion, don't do it again. + g_signal_stop_emission_by_name (buffer, "insert_text"); + } +} + + +// And an "after" version used for detecting URLs in the text. static void au_insert_text_callback(GtkTextBuffer * WXUNUSED(buffer), GtkTextIter *end, @@ -546,8 +565,6 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) if ( win->IgnoreTextUpdate() ) return; - if (!win->m_hasVMT) return; - if ( win->MarkDirtyOnChange() ) win->MarkDirty(); @@ -607,12 +624,23 @@ void wxTextCtrl::Init() SetUpdateFont(false); m_text = NULL; + m_buffer = NULL; m_showPositionOnThaw = NULL; m_anonymousMarkList = NULL; } wxTextCtrl::~wxTextCtrl() { + if (m_text) + GTKDisconnect(m_text); + if (m_buffer) + GTKDisconnect(m_buffer); + + // this is also done by wxWindowGTK dtor, but has to be done here so our + // DoThaw() override is called + while (IsFrozen()) + Thaw(); + if (m_anonymousMarkList) g_slist_free(m_anonymousMarkList); } @@ -778,12 +806,19 @@ bool wxTextCtrl::Create( wxWindow *parent, gtk_text_buffer_get_end_iter(m_buffer, &end); au_check_range(&start, &end); } + + // Also connect a normal (not "after") signal handler for checking for + // the IME-generated input. + g_signal_connect(m_buffer, "insert_text", + G_CALLBACK(wx_insert_text_callback), this); } else // single line { // do the right thing with Enter presses depending on whether we have // wxTE_PROCESS_ENTER or not GTKSetActivatesDefault(); + + GTKConnectInsertTextSignal(GTK_ENTRY(m_text)); } @@ -806,6 +841,30 @@ GtkEntry *wxTextCtrl::GetEntry() const return GTK_ENTRY(m_text); } +int wxTextCtrl::GTKIMFilterKeypress(GdkEventKey* event) const +{ +#if GTK_CHECK_VERSION(2, 22, 0) + if ( gtk_check_version(2, 12, 0) == 0 ) + { + if ( IsSingleLine() ) + { + return wxTextEntry::GTKIMFilterKeypress(event); + } + else + { + return gtk_text_view_im_context_filter_keypress( + GTK_TEXT_VIEW(m_text), + event + ); + } + } +#else // GTK+ < 2.22 + wxUnusedVar(event); +#endif // GTK+ 2.22+ + + return FALSE; +} + // ---------------------------------------------------------------------------- // flags handling // ---------------------------------------------------------------------------- @@ -1282,26 +1341,6 @@ bool wxTextCtrl::Enable( bool enable ) return true; } -// wxGTK-specific: called recursively by Enable, -// to give widgets an opportunity to correct their colours after they -// have been changed by Enable -void wxTextCtrl::OnEnabled(bool WXUNUSED(enable)) -{ - // 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. - wxColour oldColour = GetBackgroundColour(); - if (oldColour.IsOk()) - { - // Need to set twice or it'll optimize the useful stuff out - if (oldColour == * wxWHITE) - SetBackgroundColour(*wxBLACK); - else - SetBackgroundColour(*wxWHITE); - SetBackgroundColour(oldColour); - } -} - void wxTextCtrl::MarkDirty() { m_modified = true; @@ -1579,7 +1618,7 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event ) { if ( HasFlag(wxTE_PROCESS_ENTER) ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId); + wxCommandEvent event(wxEVT_TEXT_ENTER, m_windowId); event.SetEventObject(this); event.SetString(GetValue()); if ( HandleWindowEvent(event) ) @@ -1811,13 +1850,71 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) wxSize wxTextCtrl::DoGetBestSize() const { - // FIXME should be different for multi-line controls... - wxSize ret( wxControl::DoGetBestSize() ); - wxSize best(80, ret.y); - CacheBestSize(best); - return best; + return DoGetSizeFromTextSize(80); } +wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + wxASSERT_MSG( m_widget, wxS("GetSizeFromTextSize called before creation") ); + + wxSize tsize(xlen, 0); + int cHeight = GetCharHeight(); + + if ( IsSingleLine() ) + { + if ( HasFlag(wxBORDER_NONE) ) + { + tsize.y = cHeight; +#ifdef __WXGTK3__ + tsize.IncBy(9, 0); +#else + tsize.IncBy(4, 0); +#endif // GTK3 + } + else + { + // default height + tsize.y = GTKGetPreferredSize(m_widget).y; + // Add the margins we have previously set, but only the horizontal border + // as vertical one has been taken account at GTKGetPreferredSize(). + // Also get other GTK+ margins. + tsize.IncBy( GTKGetEntryMargins(GetEntry()).x, 0); + } + } + + //multiline + else + { + // add space for vertical scrollbar + if ( m_scrollBar[1] && !(m_windowStyle & wxTE_NO_VSCROLL) ) + tsize.IncBy(GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[1])).x + 3, 0); + + // height + tsize.y = cHeight; + if ( ylen <= 0 ) + { + tsize.y = 1 + cHeight * wxMax(wxMin(GetNumberOfLines(), 10), 2); + // add space for horizontal scrollbar + if ( m_scrollBar[0] && (m_windowStyle & wxHSCROLL) ) + tsize.IncBy(0, GTKGetPreferredSize(GTK_WIDGET(m_scrollBar[0])).y + 3); + } + + if ( !HasFlag(wxBORDER_NONE) ) + { + // hardcode borders, margins, etc + tsize.IncBy(5, 4); + } + } + + // Perhaps the user wants something different from CharHeight, or ylen + // is used as the height of a multiline text. + if ( ylen > 0 ) + tsize.IncBy(0, ylen - cHeight); + + return tsize; +} + + // ---------------------------------------------------------------------------- // freeze/thaw // ---------------------------------------------------------------------------- @@ -1826,12 +1923,10 @@ void wxTextCtrl::DoFreeze() { wxCHECK_RET(m_text != NULL, wxT("invalid text ctrl")); - wxWindow::DoFreeze(); + GTKFreezeWidget(m_text); if ( HasFlag(wxTE_MULTILINE) ) { - GTKFreezeWidget(m_text); - // removing buffer dramatically speeds up insertion: g_object_ref(m_buffer); GtkTextBuffer* buf_new = gtk_text_buffer_new(NULL); @@ -1872,12 +1967,9 @@ void wxTextCtrl::DoThaw() GTK_TEXT_VIEW(m_text), m_showPositionOnThaw); m_showPositionOnThaw = NULL; } - - // and thaw the window - GTKThawWidget(m_text); } - wxWindow::DoThaw(); + GTKThawWidget(m_text); } // ---------------------------------------------------------------------------- @@ -1947,7 +2039,7 @@ bool wxTextCtrl::GTKProcessEvent(wxEvent& event) const wxVisualAttributes wxTextCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { - return GetDefaultAttributesFromGTKWidget(gtk_entry_new, true); + return GetDefaultAttributesFromGTKWidget(gtk_entry_new(), true); } #endif // wxUSE_TEXTCTRL