]> git.saurik.com Git - wxWidgets.git/commitdiff
call SetHorizontalExtent() from SetString(); also simplified/cleaned up the former...
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 12 Jul 2006 21:44:34 +0000 (21:44 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 12 Jul 2006 21:44:34 +0000 (21:44 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40077 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/msw/listbox.h
src/msw/listbox.cpp

index bd32aa84017f6cb9e58af8e8a207832023d83055..afe5f34d1e8d513ec34ac754a42a663ac7e32b0e 100644 (file)
@@ -105,9 +105,10 @@ public:
     int GetItemIndex(wxOwnerDrawn *item) const { return m_aItems.Index(item); }
 #endif // wxUSE_OWNER_DRAWN
 
-    // Windows-specific code to set the horizontal extent of the listbox, if
-    // necessary. If s is non-NULL, it's used to calculate the horizontal
-    // extent. Otherwise, all strings are used.
+    // Windows-specific code to update the horizontal extent of the listbox, if
+    // necessary. If s is non-empty, the horizontal extent is increased to the
+    // length of this string if it's currently too short, otherwise the maximum
+    // extent of all strings is used. In any case calls InvalidateBestSize()
     virtual void SetHorizontalExtent(const wxString& s = wxEmptyString);
 
     // Windows callbacks
index 0801c0fc799166b8ee8358546e02498b9db65278..bc989f5d32e3f200e42db7d364acf596063f50e7 100644 (file)
@@ -275,8 +275,6 @@ void wxListBox::Delete(unsigned int n)
     m_noItems--;
 
     SetHorizontalExtent(wxEmptyString);
-
-    InvalidateBestSize();
 }
 
 int wxListBox::DoAppend(const wxString& item)
@@ -296,7 +294,6 @@ int wxListBox::DoAppend(const wxString& item)
 
     SetHorizontalExtent(item);
 
-    InvalidateBestSize();
     return index;
 }
 
@@ -344,8 +341,6 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
         // show the listbox back if we hid it
         ShowWindow(GetHwnd(), SW_SHOW);
     }
-
-    InvalidateBestSize();
 }
 
 int wxListBox::FindString(const wxString& s, bool bCase) const
@@ -369,8 +364,6 @@ void wxListBox::Clear()
 
     m_noItems = 0;
     SetHorizontalExtent();
-
-    InvalidateBestSize();
 }
 
 void wxListBox::Free()
@@ -547,8 +540,6 @@ wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
     m_noItems += nItems;
 
     SetHorizontalExtent();
-
-    InvalidateBestSize();
 }
 
 int wxListBox::DoListHitTest(const wxPoint& point) const
@@ -606,7 +597,7 @@ void wxListBox::SetString(unsigned int n, const wxString& s)
     if ( wasSelected )
         Select(n);
 
-    InvalidateBestSize();
+    SetHorizontalExtent();
 }
 
 unsigned int wxListBox::GetCount() const
@@ -615,64 +606,56 @@ unsigned int wxListBox::GetCount() const
 }
 
 // ----------------------------------------------------------------------------
-// helpers
+// size-related stuff
 // ----------------------------------------------------------------------------
 
-// Windows-specific code to set the horizontal extent of the listbox, if
-// necessary. If s is non-NULL, it's used to calculate the horizontal extent.
-// Otherwise, all strings are used.
 void wxListBox::SetHorizontalExtent(const wxString& s)
 {
-    // Only necessary if we want a horizontal scrollbar
-    if (!(m_windowStyle & wxHSCROLL))
+    // in any case, our best size could have changed
+    InvalidateBestSize();
+
+    // the rest is only necessary if we want a horizontal scrollbar
+    if ( !HasFlag(wxHSCROLL) )
         return;
-    TEXTMETRIC lpTextMetric;
 
-    if ( !s.empty() )
-    {
-        int existingExtent = (int)SendMessage(GetHwnd(), LB_GETHORIZONTALEXTENT, 0, 0L);
-        HDC dc = GetWindowDC(GetHwnd());
-        HFONT oldFont = 0;
-        if (GetFont().Ok() && GetFont().GetResourceHandle() != 0)
-            oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle());
-
-        GetTextMetrics(dc, &lpTextMetric);
-        SIZE extentXY;
-        ::GetTextExtentPoint32(dc, (LPTSTR) (const wxChar *)s, s.length(), &extentXY);
-        int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth);
 
-        if (oldFont)
-            ::SelectObject(dc, oldFont);
+    WindowHDC dc(GetHwnd());
+    SelectInHDC selFont(dc, GetHfontOf(GetFont()));
 
-        ReleaseDC(GetHwnd(), dc);
-        if (extentX > existingExtent)
-            SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(extentX), 0L);
-    }
-    else
-    {
-        int largestExtent = 0;
-        HDC dc = GetWindowDC(GetHwnd());
-        HFONT oldFont = 0;
-        if (GetFont().Ok() && GetFont().GetResourceHandle() != 0)
-            oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle());
+    TEXTMETRIC lpTextMetric;
+    ::GetTextMetrics(dc, &lpTextMetric);
 
-        GetTextMetrics(dc, &lpTextMetric);
+    int largestExtent = 0;
+    SIZE extentXY;
 
-        for (unsigned int i = 0; i < m_noItems; i++)
+    if ( s.empty() )
+    {
+        // set extent to the max length of all strings
+        for ( unsigned int i = 0; i < m_noItems; i++ )
         {
-            wxString str = GetString(i);
-            SIZE extentXY;
+            const wxString str = GetString(i);
             ::GetTextExtentPoint32(dc, str.c_str(), str.length(), &extentXY);
+
             int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth);
-            if (extentX > largestExtent)
+            if ( extentX > largestExtent )
                 largestExtent = extentX;
         }
-        if (oldFont)
-            ::SelectObject(dc, oldFont);
+    }
+    else // just increase the extent to the length of this string
+    {
+        int existingExtent = (int)SendMessage(GetHwnd(),
+                                              LB_GETHORIZONTALEXTENT, 0, 0L);
 
-        ReleaseDC(GetHwnd(), dc);
-        SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(largestExtent), 0L);
+        ::GetTextExtentPoint32(dc, s.c_str(), s.length(), &extentXY);
+
+        int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth);
+        if ( extentX > existingExtent )
+            largestExtent = extentX;
     }
+
+    if ( largestExtent )
+        SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(largestExtent), 0L);
+    //else: it shouldn't change
 }
 
 wxSize wxListBox::DoGetBestSize() const