From e2ac737fba8f9ea33aa7ed8d0534b72cb64db1d7 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 14 Nov 2012 13:48:23 +0000 Subject: [PATCH] Implement wxComboCtrl::GetSizeFromTextSize(). Improve calculation of wxComboCtrl best size which doesn't work correctly for non-default fonts as shown by r72935. It is still not perfect but better now. Closes #14825. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72955 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/combo.h | 3 +++ include/wx/odcombo.h | 4 ++++ src/common/combocmn.cpp | 47 ++++++++++++++++++++++++++++------------- src/generic/combog.cpp | 2 +- src/generic/odcombo.cpp | 18 ++++++++++++++++ src/msw/textctrl.cpp | 4 ---- 6 files changed, 58 insertions(+), 20 deletions(-) diff --git a/include/wx/combo.h b/include/wx/combo.h index 3806ca1a8a..76bf25f532 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -541,7 +541,10 @@ protected: void DestroyPopup(); // override the base class virtuals involved in geometry calculations + // The common version only sets a default width, so the derived classes + // should override it and set the height and change the width as needed. virtual wxSize DoGetBestSize() const; + virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const; // also set the embedded wxTextCtrl colours virtual bool SetForegroundColour(const wxColour& colour); diff --git a/include/wx/odcombo.h b/include/wx/odcombo.h index 26415e8d24..2d5439f186 100644 --- a/include/wx/odcombo.h +++ b/include/wx/odcombo.h @@ -355,6 +355,10 @@ protected: // Callback for item width, or -1 for default/undetermined virtual wxCoord OnMeasureItemWidth( size_t item ) const; + // override base implementation so we can return the size for the + // largest item + virtual wxSize DoGetBestSize() const; + // Callback for background drawing. Flags are same as with // OnDrawItem. virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const; diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 438a3e2790..ac476a5add 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -1359,20 +1359,34 @@ 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 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->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 accommodate bitmap? int btnSizeY = m_btnSize.y; @@ -1392,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 ) @@ -1415,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 ) @@ -2033,7 +2050,7 @@ void wxComboCtrlBase::OnCharEvent(wxKeyEvent& event) void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { -// On Mac, this leads to infinite recursion and eventually a crash +// On Mac, this leads to infinite recursion and eventually a crash #ifndef __WXMAC__ if ( event.GetEventType() == wxEVT_SET_FOCUS ) { diff --git a/src/generic/combog.cpp b/src/generic/combog.cpp index fdba8bc50a..615106085c 100644 --- a/src/generic/combog.cpp +++ b/src/generic/combog.cpp @@ -259,7 +259,7 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) wxPen pen1( wxColour(133,133,133), customBorder, wxSOLID ); -#else +#else wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT), customBorder, wxPENSTYLE_SOLID); diff --git a/src/generic/odcombo.cpp b/src/generic/odcombo.cpp index 01118eafb7..451026384f 100644 --- a/src/generic/odcombo.cpp +++ b/src/generic/odcombo.cpp @@ -725,6 +725,8 @@ void wxVListBoxComboPopup::CalcWidths() // wxWindow::GetTextExtent (assuming same dc is used // for all calls, as we do here). wxClientDC dc(m_combo); + if ( !m_useFont.IsOk() ) + m_useFont = m_combo->GetFont(); dc.SetFont(m_useFont); for ( i=0; i 0 ) + { + wxOwnerDrawnComboBox* odc = const_cast(this); + best.x = odc->GetWidestItemWidth(); + // TODO: this class may also have GetHightestItemHeight() and + // GetHightestItem() methods, and so set the whole (edit part + arrow) + // control's height according with this max height, not only max width. + } + + return GetSizeFromTextSize(best.x); +} + void wxOwnerDrawnComboBox::OnDrawBackground(wxDC& dc, const wxRect& rect, int WXUNUSED(item), diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 4dbf35d08e..66473a3e26 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -64,10 +64,6 @@ #if wxUSE_RICHEDIT -#if wxUSE_INKEDIT -#include "wx/dynlib.h" -#endif - // old mingw32 has richedit stuff directly in windows.h and doesn't have // richedit.h at all #if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__) -- 2.45.2