]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement DoGetSizeFromTextSize() for wxMSW wx{Choice,Combobox,TextCtrl}.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Nov 2012 13:47:59 +0000 (13:47 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 14 Nov 2012 13:47:59 +0000 (13:47 +0000)
Refactor and improve the existing DoGetBestSize() implementations to use
DoGetBestSize().

Closes #14816.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72954 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/choice.h
include/wx/msw/combobox.h
include/wx/msw/textctrl.h
interface/wx/control.h
src/msw/choice.cpp
src/msw/combobox.cpp
src/msw/textctrl.cpp

index c124543d1535164cd934ef85d51700493d763cf0..496c20f9f6b6bb4430a48fe4b837550f8a598a12 100644 (file)
@@ -127,6 +127,7 @@ protected:
     virtual void DoSetSize(int x, int y,
                            int width, int height,
                            int sizeFlags = wxSIZE_AUTO);
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
 
     // Show or hide the popup part of the control.
     void MSWDoPopupOrDismiss(bool show);
index aa10c8dd937ee76e07744547d5e1fa2b8afdb881..ac803c17edd0a2b36fc88cb0dade56499d517377 100644 (file)
@@ -132,6 +132,8 @@ protected:
     virtual void DoSetToolTip(wxToolTip *tip);
 #endif
 
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
+
     // this is the implementation of GetEditHWND() which can also be used when
     // we don't have the edit control, it simply returns NULL then
     //
index f8fdf1f1a87fc017b1965b8d4977f380346bd44e..c56bcae45aad84d51edb206d6de3da67e0746896 100644 (file)
@@ -236,6 +236,7 @@ protected:
     bool SendUpdateEvent();
 
     virtual wxSize DoGetBestSize() const;
+    virtual wxSize DoGetSizeFromTextSize(int xlen, int ylen = -1) const;
 
 #if wxUSE_RICHEDIT
     // Apply the character-related parts of wxTextAttr to the given selection
index 88d17800d0ab96b27bfbaeaf5e9f24d76821c507..2fd28f3c917163527fc52b5c156433f47d37a7fa 100644 (file)
@@ -172,7 +172,7 @@ public:
         @endcode
 
         Currently this method is only implemented for wxTextCtrl, wxComboBox
-        and wxChoice in wxGTK.
+        and wxChoice in wxMSW and wxGTK.
 
         @param xlen The horizontal extent of the area to leave for text, in
             pixels.
index e408eb89ada65493712377b3e698d661e2f03356..1cb3bd93869e414b56f3dc2775c68885e5203fa0 100644 (file)
@@ -612,18 +612,7 @@ void wxChoice::DoSetSize(int x, int y,
 wxSize wxChoice::DoGetBestSize() const
 {
     // The base version returns the size of the largest string
-    wxSize best( wxChoiceBase::DoGetBestSize() );
-
-    // We just need to adjust it to account for the arrow width.
-    best.x += 5*GetCharWidth();
-
-    // set height on our own
-    if( HasFlag( wxCB_SIMPLE ) )
-        best.y = SetHeightSimpleComboBox(GetCount());
-    else
-        best.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight());
-
-    return best;
+    return GetSizeFromTextSize(wxChoiceBase::DoGetBestSize().x);
 }
 
 int wxChoice::SetHeightSimpleComboBox(int nItems) const
@@ -634,6 +623,38 @@ int wxChoice::SetHeightSimpleComboBox(int nItems) const
     return EDIT_HEIGHT_FROM_CHAR_HEIGHT( cy ) * wxMin( wxMax( nItems, 3 ), 6 ) + hItem - 1;
 }
 
+wxSize wxChoice::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+    int cHeight = GetCharHeight();
+
+    // We are interested in the difference of sizes between the whole control
+    // and its child part. I.e. arrow, separators, etc.
+    wxSize tsize(xlen, 0);
+
+    WinStruct<COMBOBOXINFO> info;
+    if ( MSWGetComboBoxInfo(&info) )
+    {
+        tsize.x += info.rcItem.left + info.rcButton.right - info.rcItem.right
+                    + info.rcItem.left + 3; // right and extra margins
+    }
+    else // Just use some rough approximation.
+    {
+        tsize.x += 4*cHeight;
+    }
+
+    // set height on our own
+    if( HasFlag( wxCB_SIMPLE ) )
+        tsize.y = SetHeightSimpleComboBox(GetCount());
+    else
+        tsize.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cHeight);
+
+    // Perhaps the user wants something different from CharHeight
+    if ( ylen > 0 )
+        tsize.IncBy(0, ylen - cHeight);
+
+    return tsize;
+}
+
 // ----------------------------------------------------------------------------
 // Popup operations
 // ----------------------------------------------------------------------------
index 076f3689ec61707b0fde1648bf4da1c647e0b6bc..578e110be3e3d2b741e4800cbeb53024806cb1a2 100644 (file)
@@ -661,4 +661,20 @@ bool wxComboBox::SetHint(const wxString& hintOrig)
 
 #endif // wxUSE_UXTHEME
 
+wxSize wxComboBox::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+    wxSize tsize( wxChoice::DoGetSizeFromTextSize(xlen, ylen) );
+
+    if ( !HasFlag(wxCB_READONLY) )
+    {
+        // Add the margins we have previously set
+        wxPoint marg( GetMargins() );
+        marg.x = wxMax(0, marg.x);
+        marg.y = wxMax(0, marg.y);
+        tsize.IncBy( marg );
+    }
+
+    return tsize;
+}
+
 #endif // wxUSE_COMBOBOX
index b4f5be57eff93106e608b876e8b3fc9a469d329e..4dbf35d08ea9d8f2580012eae8145a12666011da 100644 (file)
@@ -2106,18 +2106,42 @@ bool wxTextCtrl::AcceptsFocusFromKeyboard() const
 }
 
 wxSize wxTextCtrl::DoGetBestSize() const
+{
+    return DoGetSizeFromTextSize( DEFAULT_ITEM_WIDTH );
+}
+
+wxSize wxTextCtrl::DoGetSizeFromTextSize(int xlen, int ylen) const
 {
     int cx, cy;
     wxGetCharSize(GetHWND(), &cx, &cy, GetFont());
 
-    int wText = DEFAULT_ITEM_WIDTH;
+    DWORD wText = 1;
+    ::SystemParametersInfo(SPI_GETCARETWIDTH, 0, &wText, 0);
+    wText += xlen;
 
     int hText = cy;
     if ( m_windowStyle & wxTE_MULTILINE )
     {
-        hText *= wxMax(wxMin(GetNumberOfLines(), 10), 2);
+        // add space for vertical scrollbar
+        if ( !(m_windowStyle & wxTE_NO_VSCROLL) )
+            wText += ::GetSystemMetrics(SM_CXVSCROLL);
+
+        if ( ylen <= 0 )
+        {
+            hText *= wxMax(wxMin(GetNumberOfLines(), 10), 2);
+            // add space for horizontal scrollbar
+            if ( m_windowStyle & wxHSCROLL )
+                hText += ::GetSystemMetrics(SM_CYHSCROLL);
+        }
+    }
+    // for single line control cy (height + external leading) is ok
+    else
+    {
+        // Add the margins we have previously set
+        wxPoint marg( GetMargins() );
+        wText += wxMax(0, marg.x);
+        hText += wxMax(0, marg.y);
     }
-    //else: for single line control everything is ok
 
     // Text controls without border are special and have the same height as
     // static labels (they also have the same appearance when they're disable
@@ -2126,11 +2150,18 @@ wxSize wxTextCtrl::DoGetBestSize() const
     // stand out).
     if ( !HasFlag(wxBORDER_NONE) )
     {
+        wText += 9; // borders and inner margins
+
         // we have to add the adjustments for the control height only once, not
         // once per line, so do it after multiplication above
         hText += EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy) - cy;
     }
 
+    // Perhaps the user wants something different from CharHeight, or ylen
+    // is used as the height of a multiline text.
+    if ( ylen > 0 )
+        hText += ylen - GetCharHeight();
+
     return wxSize(wText, hText);
 }