X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/22a35096a0a9c3fe4d3d32b8d68a361126ef9677..89fad939ec0d423961d8e93b2a0927f5b77bf256:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index cb1ae22dfc..deeff9218a 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -53,7 +53,7 @@ #define BMP_BUTTON_MARGIN 4 -#define DEFAULT_POPUP_HEIGHT 200 +#define DEFAULT_POPUP_HEIGHT 400 #define DEFAULT_TEXT_INDENT 3 @@ -638,6 +638,7 @@ void wxComboCtrlBase::Init() m_btnState = 0; m_btnWidDefault = 0; m_blankButtonBg = false; + m_ignoreEvtText = 0; m_btnWid = m_btnHei = -1; m_btnSide = wxRIGHT; m_btnSpacingX = 0; @@ -646,7 +647,6 @@ void wxComboCtrlBase::Init() m_extRight = 0; m_absIndent = -1; m_iFlags = 0; - m_downReceived = false; m_timeCanAcceptClick = 0; } @@ -710,6 +710,14 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator) if ( HasFlag(wxTE_PROCESS_ENTER) ) style |= wxTE_PROCESS_ENTER; + // Ignore EVT_TEXT generated by the constructor (but only + // if the event redirector already exists) + // NB: This must be " = 1" instead of "++"; + if ( m_textEvtHandler ) + m_ignoreEvtText = 1; + else + m_ignoreEvtText = 0; + m_text = new wxTextCtrl(this, wxID_ANY, m_valueString, wxDefaultPosition, wxDefaultSize, style, validator); @@ -1249,6 +1257,15 @@ wxBitmap& wxComboCtrlBase::GetBufferBitmap( const wxSize& sz ) const void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) { + if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + { + if ( m_ignoreEvtText > 0 ) + { + m_ignoreEvtText--; + return; + } + } + // Change event id, object and string before relaying it forward event.SetId(GetId()); wxString s = event.GetString(); @@ -1346,11 +1363,9 @@ bool wxComboCtrlBase::HandleButtonMouseEvent( wxMouseEvent& event, return true; } -// Conversion to double-clicks and some basic filtering // returns true if event was consumed or filtered -//bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, bool isOnButtonArea ) bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, - int flags ) + int WXUNUSED(flags) ) { wxLongLong t = ::wxGetLocalTimeMillis(); int evtType = event.GetEventType(); @@ -1364,48 +1379,6 @@ bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, } #endif - // - // Generate our own double-clicks - // (to allow on-focus dc-event on double-clicks instead of triple-clicks) - if ( (m_windowStyle & wxCC_SPECIAL_DCLICK) && - !m_isPopupShown && - //!(handlerFlags & wxCC_MF_ON_BUTTON) ) - !(flags & wxCC_MF_ON_BUTTON) ) - { - if ( evtType == wxEVT_LEFT_DOWN ) - { - // Set value to avoid up-events without corresponding downs - m_downReceived = true; - } - else if ( evtType == wxEVT_LEFT_DCLICK ) - { - // We'll make our own double-clicks - //evtType = 0; - event.SetEventType(0); - return true; - } - else if ( evtType == wxEVT_LEFT_UP ) - { - if ( m_downReceived || m_timeLastMouseUp == 1 ) - { - wxLongLong timeFromLastUp = (t-m_timeLastMouseUp); - - if ( timeFromLastUp < DOUBLE_CLICK_CONVERSION_TRESHOLD ) - { - //type = wxEVT_LEFT_DCLICK; - event.SetEventType(wxEVT_LEFT_DCLICK); - m_timeLastMouseUp = 1; - } - else - { - m_timeLastMouseUp = t; - } - - //m_downReceived = false; - } - } - } - // Filter out clicks on button immediately after popup dismiss (Windows like behaviour) if ( evtType == wxEVT_LEFT_DOWN && t < m_timeCanAcceptClick ) { @@ -1511,12 +1484,6 @@ void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { if ( event.GetEventType() == wxEVT_SET_FOCUS ) { - // First click is the first part of double-click - // Some platforms don't generate down-less mouse up-event - // (Windows does, GTK+2 doesn't), so that's why we have - // to do this. - m_timeLastMouseUp = ::wxGetLocalTimeMillis(); - if ( m_text && m_text != ::wxWindow::FindFocus() ) m_text->SetFocus(); } @@ -1975,10 +1942,13 @@ wxString wxComboCtrlBase::GetValue() const return m_valueString; } -void wxComboCtrlBase::SetValue(const wxString& value) +void wxComboCtrlBase::SetValueWithEvent(const wxString& value, bool withEvent) { if ( m_text ) { + if ( !withEvent ) + m_ignoreEvtText++; + m_text->SetValue(value); if ( !(m_iFlags & wxCC_NO_TEXT_AUTO_SELECT) ) m_text->SelectAll(); @@ -1996,6 +1966,11 @@ void wxComboCtrlBase::SetValue(const wxString& value) } } +void wxComboCtrlBase::SetValue(const wxString& value) +{ + SetValueWithEvent(value, false); +} + // In this SetValue variant wxComboPopup::SetStringValue is not called void wxComboCtrlBase::SetText(const wxString& value) { @@ -2005,6 +1980,12 @@ void wxComboCtrlBase::SetText(const wxString& value) m_valueString = value; + if ( m_text ) + { + m_ignoreEvtText++; + m_text->SetValue( value ); + } + Refresh(); }