X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8fd38e3369aa4494ca7c2429d5010b5c44471338..77c8efc8c37da6d6a5e2e8022d21d1cd7d76371d:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index afd9a7e4f8..ac476a5add 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -489,9 +489,8 @@ bool wxComboPopupWindow::Show( bool show ) m_inShow++; - wxASSERT( IsKindOf(CLASSINFO(wxPopupTransientWindow)) ); - - wxPopupTransientWindow* ptw = (wxPopupTransientWindow*) this; + wxPopupTransientWindow* const + ptw = static_cast(this); if ( show != ptw->IsShown() ) { @@ -518,7 +517,7 @@ bool wxComboPopupWindow::ProcessLeftDown(wxMouseEvent& event) void wxComboPopupWindow::OnDismiss() { wxComboCtrlBase* combo = (wxComboCtrlBase*) GetParent(); - wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), + wxASSERT_MSG( wxDynamicCast(combo, wxComboCtrlBase), wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); combo->OnPopupDismiss(true); @@ -766,7 +765,7 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event) if ( m_combo->GetTextCtrl() ) m_combo->GetTextCtrl()->SelectAll(); else - m_combo->SetSelection(-1,-1); + m_combo->SelectAll(); } // Send focus indication to parent. @@ -960,7 +959,6 @@ public: BEGIN_EVENT_TABLE(wxComboCtrlBase, wxControl) - EVT_TEXT(wxID_ANY,wxComboCtrlBase::OnTextCtrlEvent) EVT_SIZE(wxComboCtrlBase::OnSizeEvent) EVT_SET_FOCUS(wxComboCtrlBase::OnFocusEvent) EVT_KILL_FOCUS(wxComboCtrlBase::OnFocusEvent) @@ -968,7 +966,6 @@ BEGIN_EVENT_TABLE(wxComboCtrlBase, wxControl) //EVT_BUTTON(wxID_ANY,wxComboCtrlBase::OnButtonClickEvent) EVT_KEY_DOWN(wxComboCtrlBase::OnKeyEvent) EVT_CHAR(wxComboCtrlBase::OnCharEvent) - EVT_TEXT_ENTER(wxID_ANY,wxComboCtrlBase::OnTextCtrlEvent) EVT_SYS_COLOUR_CHANGED(wxComboCtrlBase::OnSysColourChanged) END_EVENT_TABLE() @@ -1046,10 +1043,11 @@ bool wxComboCtrlBase::Create(wxWindow *parent, m_iFlags |= wxCC_IFLAG_CREATED; // If x and y indicate valid size, wxSizeEvent won't be - // emitted automatically, so we need to add artifical one. + // emitted automatically, so we need to add artificial one. if ( size.x > 0 && size.y > 0 ) { wxSizeEvent evt(size,GetId()); + evt.SetEventObject(this); GetEventHandler()->AddPendingEvent(evt); } @@ -1094,6 +1092,16 @@ wxComboCtrlBase::CreateTextCtrl(int style) m_text->Create(this, wxID_ANY, m_valueString, wxDefaultPosition, wxSize(10,-1), style); + + // Connecting the events is currently the most reliable way + wxWindowID id = m_text->GetId(); + m_text->Connect(id, wxEVT_COMMAND_TEXT_UPDATED, + wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), + NULL, this); + m_text->Connect(id, wxEVT_COMMAND_TEXT_ENTER, + wxCommandEventHandler(wxComboCtrlBase::OnTextCtrlEvent), + NULL, this); + m_text->SetHint(m_hintText); } } @@ -1163,7 +1171,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) // its platform default or bitmap+pushbutton background is used, but not if // there is vertical size adjustment or horizontal spacing. if ( ( (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) || - (m_bmpNormal.Ok() && m_blankButtonBg) ) && + (m_bmpNormal.IsOk() && m_blankButtonBg) ) && m_btnSpacingX == 0 && m_btnHei <= 0 ) { @@ -1171,7 +1179,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) btnBorder = 0; } else if ( (m_iFlags & wxCC_BUTTON_COVERS_BORDER) && - m_btnSpacingX == 0 && !m_bmpNormal.Ok() ) + m_btnSpacingX == 0 && !m_bmpNormal.IsOk() ) { m_iFlags &= ~(wxCC_IFLAG_BUTTON_OUTSIDE); btnBorder = 0; @@ -1228,7 +1236,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) // It is larger // OR // button width is set to default and blank button bg is not drawn - if ( m_bmpNormal.Ok() ) + if ( m_bmpNormal.IsOk() ) { int bmpReqWidth = m_bmpNormal.GetWidth(); int bmpReqHeight = m_bmpNormal.GetHeight(); @@ -1250,7 +1258,7 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth ) { int newY = butHeight+(customBorder*2); SetClientSize(wxDefaultCoord,newY); - if ( m_bmpNormal.Ok() || m_btnArea.width != butWidth || m_btnArea.height != butHeight ) + if ( m_bmpNormal.IsOk() || m_btnArea.width != butWidth || m_btnArea.height != butHeight ) m_iFlags |= wxCC_IFLAG_HAS_NONSTANDARD_BUTTON; else m_iFlags &= ~wxCC_IFLAG_HAS_NONSTANDARD_BUTTON; @@ -1351,24 +1359,38 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust wxSize wxComboCtrlBase::DoGetBestSize() const { - wxSize sizeText(150,0); + int width = m_text ? m_text->GetBestSize().x : 80; - if ( m_text ) - sizeText = m_text->GetBestSize(); + return GetSizeFromTextSize(width); +} - // TODO: Better method to calculate close-to-native control height. +wxSize wxComboCtrlBase::DoGetSizeFromTextSize(int xlen, int ylen) const +{ + // Calculate close-to-native control height int fhei; - if ( m_font.Ok() ) + +#if wxUSE_COMBOBOX && (defined(__WXMSW__) || defined(__WXGTK__)) \ + && !defined(__WXUNIVERSAL__) + wxComboBox* cb = new wxComboBox; + cb->Hide(); + cb->Create(const_cast(this), wxID_ANY); + if ( m_font.IsOk() ) + cb->SetFont(m_font); + fhei = cb->GetBestSize().y; + cb->Destroy(); +#else + if ( m_font.IsOk() ) fhei = (m_font.GetPointSize()*2) + 5; - else if ( wxNORMAL_FONT->Ok() ) + else if ( wxNORMAL_FONT->IsOk() ) fhei = (wxNORMAL_FONT->GetPointSize()*2) + 5; else - fhei = sizeText.y + 4; + fhei = 22; +#endif // only for wxComboBox on MSW or GTK - // Need to force height to accomodate bitmap? + // Need to force height to accommodate bitmap? int btnSizeY = m_btnSize.y; - if ( m_bmpNormal.Ok() && fhei < btnSizeY ) + if ( m_bmpNormal.IsOk() && fhei < btnSizeY ) fhei = btnSizeY; // Control height doesn't depend on border @@ -1384,11 +1406,6 @@ wxSize wxComboCtrlBase::DoGetBestSize() const fhei += 4; */ - // Final adjustments -#ifdef __WXGTK__ - fhei += 1; -#endif - #ifdef __WXMAC__ // these are the numbers from the HIG: switch ( m_windowVariant ) @@ -1407,11 +1424,19 @@ wxSize wxComboCtrlBase::DoGetBestSize() const #endif fhei += 2 * FOCUS_RING; - int width = sizeText.x + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH; - wxSize ret(width, fhei); - CacheBestSize(ret); - return ret; + // Calculate width + int fwid = xlen + FOCUS_RING + COMBO_MARGIN + DEFAULT_DROPBUTTON_WIDTH; + + // Add the margins we have previously set + wxPoint marg( GetMargins() ); + fwid += wxMax(0, marg.x); + fhei += wxMax(0, marg.y); + + if ( ylen > 0 ) + fhei += ylen - GetCharHeight(); + + return wxSize(fwid, fhei); } void wxComboCtrlBase::OnSizeEvent( wxSizeEvent& event ) @@ -1693,7 +1718,7 @@ void wxComboCtrlBase::DrawButton( wxDC& dc, const wxRect& rect, int flags ) dc.DrawRectangle(rect); } - if ( !m_bmpNormal.Ok() ) + if ( !m_bmpNormal.IsOk() ) { if ( flags & Button_BitmapOnly ) return; @@ -1743,6 +1768,7 @@ void wxComboCtrlBase::RecalcAndRefresh() if ( IsCreated() ) { wxSizeEvent evt(GetSize(),GetId()); + evt.SetEventObject(this); GetEventHandler()->ProcessEvent(evt); Refresh(); } @@ -1770,13 +1796,13 @@ void wxComboCtrlBase::OnTextCtrlEvent(wxCommandEvent& event) } } - event.StopPropagation(); - // For safety, completely re-create a new wxCommandEvent - wxCommandEvent evt2(event.GetEventType(), GetId()); + wxCommandEvent evt2(event); + evt2.SetId(GetId()); evt2.SetEventObject(this); - evt2.SetString(event.GetString()); HandleWindowEvent(evt2); + + event.StopPropagation(); } // call if cursor is on button area or mouse is captured for the button @@ -2024,6 +2050,8 @@ void wxComboCtrlBase::OnCharEvent(wxKeyEvent& event) void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { +// On Mac, this leads to infinite recursion and eventually a crash +#ifndef __WXMAC__ if ( event.GetEventType() == wxEVT_SET_FOCUS ) { wxWindow* tc = GetTextCtrl(); @@ -2034,6 +2062,7 @@ void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) } Refresh(); +#endif } void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) ) @@ -2554,17 +2583,17 @@ void wxComboCtrlBase::SetButtonBitmaps( const wxBitmap& bmpNormal, m_bmpNormal = bmpNormal; m_blankButtonBg = blankButtonBg; - if ( bmpPressed.Ok() ) + if ( bmpPressed.IsOk() ) m_bmpPressed = bmpPressed; else m_bmpPressed = bmpNormal; - if ( bmpHover.Ok() ) + if ( bmpHover.IsOk() ) m_bmpHover = bmpHover; else m_bmpHover = bmpNormal; - if ( bmpDisabled.Ok() ) + if ( bmpDisabled.IsOk() ) m_bmpDisabled = bmpDisabled; else m_bmpDisabled = bmpNormal;