From 361189d912c82801b9ed23d75e04cdf277b79e77 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 2 Aug 2000 21:55:41 +0000 Subject: [PATCH] fixed bug with radiobox size being miscalculated if the label was too long git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7920 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/radiobox.h | 8 ++ src/msw/radiobox.cpp | 172 +++++++++++++++++++++++--------------- 2 files changed, 111 insertions(+), 69 deletions(-) diff --git a/include/wx/msw/radiobox.h b/include/wx/msw/radiobox.h index 8a98bb0a88..471ca12608 100644 --- a/include/wx/msw/radiobox.h +++ b/include/wx/msw/radiobox.h @@ -100,8 +100,15 @@ public: #endif // WXWIN_COMPATIBILITY protected: + // subclass one radio button void SubclassRadioButton(WXHWND hWndBtn); + // get the max size of radio buttons + wxSize GetMaxButtonSize() const; + + // get the total size occupied by the radio box buttons + wxSize GetTotalButtonSize(const wxSize& sizeBtn) const; + WXHWND * m_radioButtons; int m_majorDim; int * m_radioWidth; // for bitmaps @@ -114,6 +121,7 @@ protected: virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); + virtual wxSize DoGetBestSize() const; }; #endif diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 08a5e32134..0d73aabe6a 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -201,7 +201,7 @@ bool wxRadioBox::Create(wxWindow *parent, m_selectedButton = -1; m_noItems = 0; - m_majorDim = majorDim == 0 ? n : majorDim; + m_majorDim = majorDim == 0 ? n : majorDim; m_noRowsOrCols = majorDim; // common initialization @@ -366,6 +366,75 @@ wxString wxRadioBox::GetString(int N) const return wxGetWindowText(m_radioButtons[N]); } +// ---------------------------------------------------------------------------- +// size calculations +// ---------------------------------------------------------------------------- + +wxSize wxRadioBox::GetMaxButtonSize() const +{ + // calculate the max button size + int widthMax = 0, + heightMax = 0; + for ( int i = 0 ; i < m_noItems; i++ ) + { + int width, height; + if ( m_radioWidth[i] < 0 ) + { + GetTextExtent(wxGetWindowText(m_radioButtons[i]), &width, &height); + + // adjust the size to take into account the radio box itself + // FIXME this is totally bogus! + width += RADIO_SIZE; + height *= 3; + height /= 2; + } + else + { + width = m_radioWidth[i]; + height = m_radioHeight[i]; + } + + if ( widthMax < width ) + widthMax = width; + if ( heightMax < height ) + heightMax = height; + } + + return wxSize(widthMax, heightMax); +} + +wxSize wxRadioBox::GetTotalButtonSize(const wxSize& sizeBtn) const +{ + // the radiobox should be big enough for its buttons + int cx1, cy1; + wxGetCharSize(m_hWnd, &cx1, &cy1, &GetFont()); + + int extraHeight = cy1; + +#if defined(CTL3D) && !CTL3D + // Requires a bigger group box in plain Windows + extraHeight *= 3; + extraHeight /= 2; +#endif + + int height = GetNumVer() * sizeBtn.y + cy1/2 + extraHeight; + int width = GetNumHor() * (sizeBtn.x + cx1) + cx1; + + // and also wide enough for its label + int widthLabel; + GetTextExtent(GetTitle(), &widthLabel, NULL); + widthLabel += RADIO_SIZE; // FIXME this is bogus too + if ( widthLabel > width ) + width = widthLabel; + + return wxSize(width, height); +} + +wxSize wxRadioBox::DoGetBestSize() const +{ + return GetTotalButtonSize(GetMaxButtonSize()); +} + // Restored old code. void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { @@ -397,81 +466,36 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) // Attempt to have a look coherent with other platforms: We compute the // biggest toggle dim, then we align all items according this value. - int maxWidth = -1; - int maxHeight = -1; + wxSize maxSize = GetMaxButtonSize(); + int maxWidth = maxSize.x, + maxHeight = maxSize.y; - int i; - for (i = 0 ; i < m_noItems; i++) + wxSize totSize = GetTotalButtonSize(maxSize); + int totWidth = totSize.x, + totHeight = totSize.y; + + // only change our width/height if asked for + if ( width == -1 ) { - int eachWidth; - int eachHeight; - if (m_radioWidth[i]<0) - { - // It's a labelled toggle - GetTextExtent(wxGetWindowText(m_radioButtons[i]), - ¤t_width, &cyf); - eachWidth = (int)(current_width + RADIO_SIZE); - eachHeight = (int)((3*cyf)/2); - } + if ( sizeFlags & wxSIZE_AUTO_WIDTH ) + width = totWidth; else - { - eachWidth = m_radioWidth[i]; - eachHeight = m_radioHeight[i]; - } - - if (maxWidth