]> git.saurik.com Git - wxWidgets.git/commitdiff
implement changing wxChoice and wxComboBox height
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 1 May 2009 21:49:43 +0000 (21:49 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 1 May 2009 21:49:43 +0000 (21:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60461 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/msw/choice.h
src/msw/choice.cpp

index 7d0825aa3bb925d0e29e441b15bc37433589d7fe..34fded9b03a0e90ea7b1059fcef4d578ac475290 100644 (file)
@@ -332,6 +332,10 @@ All (GUI):
 - wxGrid: add possibility to prevent resizing of individual rows/columns.
 - wxHTML: add support for table borders width (Laurent Humbertclaude).
 
 - wxGrid: add possibility to prevent resizing of individual rows/columns.
 - wxHTML: add support for table borders width (Laurent Humbertclaude).
 
+MSW:
+
+- Allow changing the height of wxChoice and wxComboBox.
+
 i18n:
 
 - Korean translations added (Sungkee Jung).
 i18n:
 
 - Korean translations added (Sungkee Jung).
index 4f28ec07c2397fd9d481e3ff98f2f63d7021aeaa..e069ec2a48a20a502c18b21d28b4b763698b8439 100644 (file)
@@ -92,7 +92,11 @@ protected:
     virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
 
     // common part of all ctors
     virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
 
     // common part of all ctors
-    void Init() { m_lastAcceptedSelection = wxID_NONE; }
+    void Init()
+    {
+        m_lastAcceptedSelection = wxID_NONE;
+        m_heightOwn = wxDefaultCoord;
+    }
 
     virtual void DoDeleteOneItem(unsigned int n);
     virtual void DoClear();
 
     virtual void DoDeleteOneItem(unsigned int n);
     virtual void DoClear();
@@ -114,7 +118,10 @@ protected:
 
     // update the height of the drop down list to fit the number of items we
     // have (without changing the visible height)
 
     // update the height of the drop down list to fit the number of items we
     // have (without changing the visible height)
-    void UpdateVisibleHeight();
+    void MSWUpdateDropDownHeight();
+
+    // set the height of the visible part of the control to m_heightOwn
+    void MSWUpdateVisibleHeight();
 
     // create and initialize the control
     bool CreateAndInit(wxWindow *parent, wxWindowID id,
 
     // create and initialize the control
     bool CreateAndInit(wxWindow *parent, wxWindowID id,
@@ -128,12 +135,18 @@ protected:
     // free all memory we have (used by Clear() and dtor)
     void Free();
 
     // free all memory we have (used by Clear() and dtor)
     void Free();
 
+#if wxUSE_DEFERRED_SIZING
+    virtual void MSWEndDeferWindowPos();
+#endif // wxUSE_DEFERRED_SIZING
 
     // last "completed" selection, i.e. not the transient one while the user is
     // browsing the popup list: this is only used when != wxID_NONE which is
     // the case while the drop down is opened
     int m_lastAcceptedSelection;
 
 
     // last "completed" selection, i.e. not the transient one while the user is
     // browsing the popup list: this is only used when != wxID_NONE which is
     // the case while the drop down is opened
     int m_lastAcceptedSelection;
 
+    // the height of the control itself if it was set explicitly or
+    // wxDefaultCoord if it hadn't
+    int m_heightOwn;
 
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoice)
 };
 
     DECLARE_DYNAMIC_CLASS_NO_COPY(wxChoice)
 };
index cf5b4e6ef0720c18c4e65ab40d558596ed44a995..6fc0e4cb3e9cc555d0bd36497b98aade65e4f25e 100644 (file)
@@ -265,7 +265,7 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter& items,
     // we need to refresh our size in order to have enough space for the
     // newly added items
     if ( !IsFrozen() )
     // we need to refresh our size in order to have enough space for the
     // newly added items
     if ( !IsFrozen() )
-        UpdateVisibleHeight();
+        MSWUpdateDropDownHeight();
 
     InvalidateBestSize();
 
 
     InvalidateBestSize();
 
@@ -279,7 +279,7 @@ void wxChoice::DoDeleteOneItem(unsigned int n)
     SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
 
     if ( !IsFrozen() )
     SendMessage(GetHwnd(), CB_DELETESTRING, n, 0);
 
     if ( !IsFrozen() )
-        UpdateVisibleHeight();
+        MSWUpdateDropDownHeight();
 
     InvalidateBestSize();
 }
 
     InvalidateBestSize();
 }
@@ -289,7 +289,7 @@ void wxChoice::DoClear()
     SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0);
 
     if ( !IsFrozen() )
     SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0);
 
     if ( !IsFrozen() )
-        UpdateVisibleHeight();
+        MSWUpdateDropDownHeight();
 
     InvalidateBestSize();
 }
 
     InvalidateBestSize();
 }
@@ -448,13 +448,31 @@ void* wxChoice::DoGetItemClientData(unsigned int n) const
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
-// wxMSW specific helpers
+// wxMSW-specific geometry management
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 
-void wxChoice::UpdateVisibleHeight()
+void wxChoice::MSWUpdateVisibleHeight()
+{
+    if ( m_heightOwn != wxDefaultCoord )
+        ::SendMessage(GetHwnd(), CB_SETITEMHEIGHT, (WPARAM)-1, m_heightOwn);
+}
+
+#if wxUSE_DEFERRED_SIZING
+void wxChoice::MSWEndDeferWindowPos()
+{
+    // we can only set the height of the choice itself now as it is reset to
+    // default every time the control is resized
+    MSWUpdateVisibleHeight();
+
+    wxChoiceBase::MSWEndDeferWindowPos();
+}
+#endif // wxUSE_DEFERRED_SIZING
+
+void wxChoice::MSWUpdateDropDownHeight()
 {
     // be careful to not change the width here
 {
     // be careful to not change the width here
-    DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, GetSize().y, wxSIZE_USE_EXISTING);
+    DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, GetSize().y,
+              wxSIZE_USE_EXISTING);
 }
 
 void wxChoice::DoMoveWindow(int x, int y, int width, int height)
 }
 
 void wxChoice::DoMoveWindow(int x, int y, int width, int height)
@@ -488,20 +506,28 @@ void wxChoice::DoSetSize(int x, int y,
                          int width, int height,
                          int sizeFlags)
 {
                          int width, int height,
                          int sizeFlags)
 {
-    int heightOrig = height;
+    const int heightOrig = height;
 
     // the height which we must pass to Windows should be the total height of
     // the control including the drop down list while the height given to us
     // is, of course, just the height of the permanently visible part of it
     if ( height != wxDefaultCoord )
     {
 
     // the height which we must pass to Windows should be the total height of
     // the control including the drop down list while the height given to us
     // is, of course, just the height of the permanently visible part of it
     if ( height != wxDefaultCoord )
     {
-        // don't make the drop down list too tall, arbitrarily limit it to 40
-        // items max and also don't leave it empty
+        // set our new own height but be careful not to make it too big: the
+        // native control apparently stores it as a single byte and so setting
+        // own height to 256 pixels results in default height being used (255
+        // is still ok)
+        if ( height > UCHAR_MAX )
+            height = UCHAR_MAX;
+        m_heightOwn = height;
+
+        // don't make the drop down list too tall, arbitrarily limit it to 30
+        // items max and also don't make it too small if it's currently empty
         size_t nItems = GetCount();
         if ( !nItems )
             nItems = 9;
         size_t nItems = GetCount();
         if ( !nItems )
             nItems = 9;
-        else if ( nItems > 24 )
-            nItems = 24;
+        else if ( nItems > 30 )
+            nItems = 30;
 
         // add space for the drop down list
         const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0);
 
         // add space for the drop down list
         const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0);
@@ -527,10 +553,27 @@ void wxChoice::DoSetSize(int x, int y,
 
     wxControl::DoSetSize(x, y, width, height, sizeFlags);
 
 
     wxControl::DoSetSize(x, y, width, height, sizeFlags);
 
-    // If we're storing a pending size, make sure we store
-    // the original size for reporting back to the app.
-    if (m_pendingSize != wxDefaultSize)
+    // make the control itself of the requested height: notice that this
+    // must be done after changing its size or it has no effect (apparently
+    // the height is reset to default during the control layout) and that it's
+    // useless to to do it when using the deferred sizing -- in this case it
+    // will be done from MSWEndDeferWindowPos()
+#if wxUSE_DEFERRED_SIZING
+    if ( m_pendingSize == wxDefaultSize )
+    {
+        // not using deferred sizing, update it immediately
+        MSWUpdateVisibleHeight();
+    }
+    else // in the middle of deferred sizing
+    {
+        // we need to report the size of the visible part of the control back
+        // in GetSize() and not height stored by DoSetSize() in m_pendingSize
         m_pendingSize = wxSize(width, heightOrig);
         m_pendingSize = wxSize(width, heightOrig);
+    }
+#else // !wxUSE_DEFERRED_SIZING
+    // always update the visible height immediately
+    MSWUpdateVisibleHeight();
+#endif // wxUSE_DEFERRED_SIZING
 }
 
 wxSize wxChoice::DoGetBestSize() const
 }
 
 wxSize wxChoice::DoGetBestSize() const
@@ -559,6 +602,10 @@ wxSize wxChoice::DoGetBestSize() const
     return best;
 }
 
     return best;
 }
 
+// ----------------------------------------------------------------------------
+// MSW message handlers
+// ----------------------------------------------------------------------------
+
 WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
     switch ( nMsg )
 WXLRESULT wxChoice::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 {
     switch ( nMsg )