]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement wxComboCtrl::GetSizeFromTextSize().
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Nov 2012 13:48:23 +0000 (13:48 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Nov 2012 13:48:23 +0000 (13:48 +0000)
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
include/wx/odcombo.h
src/common/combocmn.cpp
src/generic/combog.cpp
src/generic/odcombo.cpp
src/msw/textctrl.cpp

index 3806ca1a8ad867a2c13e1bc10e234f788d7c52f5..76bf25f53276dc221cad2efcd72ba838a7ce81ec 100644 (file)
@@ -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);
index 26415e8d246cf7c02044869a7cfb1fe71728614a..2d5439f1861bc6aea48bdada9cccb79a94fe5147 100644 (file)
@@ -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;
index 438a3e27908f7731749cf243e8bea4669f7e8dd1..ac476a5addc1005245937e3a8e7ff86daed3fd6b 100644 (file)
@@ -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<wxComboCtrlBase*>(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 )
     {
index fdba8bc50af30f7f3f8a5d56086de2e826e0508e..615106085c867a398baeebc34a36d0c861e94030 100644 (file)
@@ -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);
index 01118eafb7b347b42d860d002ad8c435b1370db9..451026384fbe233fc56a5b3dec8c43d8be5e87bc 100644 (file)
@@ -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<n; i++ )
@@ -1171,6 +1173,22 @@ wxCoord wxOwnerDrawnComboBox::OnMeasureItemWidth( size_t WXUNUSED(item) ) const
     return -1;
 }
 
+wxSize wxOwnerDrawnComboBox::DoGetBestSize() const
+{
+    wxSize best( wxComboCtrlBase::DoGetBestSize() );
+
+    if ( GetCount() > 0 )
+    {
+        wxOwnerDrawnComboBox* odc = const_cast<wxOwnerDrawnComboBox*>(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),
index 4dbf35d08ea9d8f2580012eae8145a12666011da..66473a3e26fcaa872d4ded89285a0d1b40e1ee8e 100644 (file)
 
 #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__)