X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/52ca4ec419e41f800bc8e7a7c4f78f6079c603a6..0a9c5e3564ed35162bb8cab5af62a98405364fb8:/src/msw/radiobox.cpp diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 53c5efce54..634d598476 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -74,10 +74,7 @@ wxBEGIN_FLAGS( wxRadioBoxStyle ) wxFLAGS_MEMBER(wxHSCROLL) wxFLAGS_MEMBER(wxRA_SPECIFY_COLS) - wxFLAGS_MEMBER(wxRA_HORIZONTAL) wxFLAGS_MEMBER(wxRA_SPECIFY_ROWS) - wxFLAGS_MEMBER(wxRA_VERTICAL) - wxEND_FLAGS( wxRadioBoxStyle ) IMPLEMENT_DYNAMIC_CLASS_XTI(wxRadioBox, wxControl,"wx/radiobox.h") @@ -129,7 +126,7 @@ void wxRadioBox::Init() { m_selectedButton = wxNOT_FOUND; m_radioButtons = NULL; - m_dummyButton = NULL; + m_dummyHwnd = NULL; m_radioWidth = NULL; m_radioHeight = NULL; } @@ -150,6 +147,11 @@ bool wxRadioBox::Create(wxWindow *parent, if ( !wxStaticBox::Create(parent, id, title, pos, size, style, name) ) return false; + // the code elsewhere in this file supposes that either wxRA_SPECIFY_COLS + // or wxRA_SPECIFY_ROWS is set, ensure that this is indeed the case + if ( !(style & (wxRA_SPECIFY_ROWS | wxRA_SPECIFY_COLS)) ) + style |= wxRA_SPECIFY_COLS; + #if wxUSE_VALIDATORS SetValidator(val); #else @@ -164,8 +166,6 @@ bool wxRadioBox::Create(wxWindow *parent, // For instance, we don't want the bounding box of the radio // buttons to include the dummy button m_radioButtons = new wxSubwindows(n); - m_dummyButton = new wxSubwindows(1); - m_radioWidth = new int[n]; m_radioHeight = new int[n]; @@ -180,12 +180,12 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowIDRef subid = NewControlId(); - HWND hwndBtn = ::CreateWindow(_T("BUTTON"), + HWND hwndBtn = ::CreateWindow(wxT("BUTTON"), choices[i].wx_str(), styleBtn, 0, 0, 0, 0, // will be set in SetSize() GetHwndOf(parent), - (HMENU)subid.GetValue(), + (HMENU)wxUIntToPtr(subid.GetValue()), wxGetInstance(), NULL); @@ -206,19 +206,15 @@ bool wxRadioBox::Create(wxWindow *parent, } // Create a dummy radio control to end the group. - wxWindowIDRef subid = NewControlId(); + m_dummyId = NewControlId(); - HWND dummy = ::CreateWindow(_T("BUTTON"), + m_dummyHwnd = (WXHWND)::CreateWindow(wxT("BUTTON"), wxEmptyString, WS_GROUP | BS_AUTORADIOBUTTON | WS_CHILD, 0, 0, 0, 0, GetHwndOf(parent), - (HMENU)subid.GetValue(), wxGetInstance(), NULL); + (HMENU)wxUIntToPtr(m_dummyId.GetValue()), + wxGetInstance(), NULL); - // Keep track of the subwindow so it will be destroyed when the radio - // box is and it's id will be freed. - // Also, do we need to consider this dummy item a subcontrol and add it - // to m_subControls - m_dummyButton->Set(0, dummy, subid); m_radioButtons->SetFont(GetFont()); @@ -255,10 +251,11 @@ bool wxRadioBox::Create(wxWindow *parent, wxRadioBox::~wxRadioBox() { - m_isBeingDeleted = true; + SendDestroyEvent(); delete m_radioButtons; - delete m_dummyButton; + if ( m_dummyHwnd ) + DestroyWindow((HWND)m_dummyHwnd); delete[] m_radioWidth; delete[] m_radioHeight; } @@ -406,7 +403,7 @@ bool wxRadioBox::Enable(unsigned int item, bool enable) wxCHECK_MSG( IsValid(item), false, wxT("invalid item in wxRadioBox::Enable()") ); - BOOL ret = ::EnableWindow((*m_radioButtons)[item], enable); + BOOL ret = MSWEnableHWND((*m_radioButtons)[item], enable); return (ret == 0) != enable; } @@ -462,11 +459,32 @@ void wxRadioBox::DoSetItemToolTip(unsigned int item, wxToolTip *tooltip) if ( tooltip != NULL ) tooltip->Add(hwndRbtn); else // unset the tooltip - wxToolTip::Remove(hwndRbtn); + wxToolTip::Remove(hwndRbtn, 0, wxRect(0,0,0,0)); + // the second parameter can be zero since it's ignored by Remove() + // as we pass a rect for which wxRect::IsEmpty()==true... } #endif // wxUSE_TOOLTIPS +bool wxRadioBox::Reparent(wxWindowBase *newParent) +{ + if ( !wxStaticBox::Reparent(newParent) ) + { + return false; + } + + HWND hwndParent = GetHwndOf(GetParent()); + for ( size_t item = 0; item < m_radioButtons->GetCount(); item++ ) + { + ::SetParent((*m_radioButtons)[item], hwndParent); + } +#ifdef __WXWINCE__ + // put static box under the buttons in the Z-order + SetWindowPos(GetHwnd(), HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); +#endif + return true; +} + WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(wxRadioBox, wxStaticBox, m_radioButtons) // ---------------------------------------------------------------------------- @@ -546,57 +564,34 @@ wxSize wxRadioBox::DoGetBestSize() const return best; } -// Restored old code. void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - int currentX, currentY; - GetPosition(¤tX, ¤tY); - int widthOld, heightOld; - GetSize(&widthOld, &heightOld); + if ( (width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH)) || + (height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT)) ) + { + // Attempt to have a look coherent with other platforms: We compute the + // biggest toggle dim, then we align all items according this value. + const wxSize totSize = GetTotalButtonSize(GetMaxButtonSize()); - int xx = x; - int yy = y; + // only change our width/height if asked for + if ( width == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_WIDTH) ) + width = totSize.x; - if (x == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - xx = currentX; - if (y == wxDefaultCoord && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - yy = currentY; + if ( height == wxDefaultCoord && (sizeFlags & wxSIZE_AUTO_HEIGHT) ) + height = totSize.y; + } - int y_offset = yy; - int x_offset = xx; + wxStaticBox::DoSetSize(x, y, width, height); +} - int cx1, cy1; - wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont()); +void wxRadioBox::DoMoveWindow(int x, int y, int width, int height) +{ + wxStaticBox::DoMoveWindow(x, y, width, height); - // Attempt to have a look coherent with other platforms: We compute the - // biggest toggle dim, then we align all items according this value. wxSize maxSize = GetMaxButtonSize(); int maxWidth = maxSize.x, maxHeight = maxSize.y; - wxSize totSize = GetTotalButtonSize(maxSize); - int totWidth = totSize.x, - totHeight = totSize.y; - - // only change our width/height if asked for - if ( width == wxDefaultCoord ) - { - if ( sizeFlags & wxSIZE_AUTO_WIDTH ) - width = totWidth; - else - width = widthOld; - } - - if ( height == wxDefaultCoord ) - { - if ( sizeFlags & wxSIZE_AUTO_HEIGHT ) - height = totHeight; - else - height = heightOld; - } - - DoMoveWindow(xx, yy, width, height); - // Now position all the buttons: the current button will be put at // wxPoint(x_offset, y_offset) and the new row/column will start at // startX/startY. The size of all buttons will be the same wxSize(maxWidth, @@ -608,8 +603,11 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) // wxRA_SPECIFY_ROWS means that the buttons are arranged top to bottom and // GetMajorDim() is the number of rows. - x_offset += cx1; - y_offset += cy1; + int cx1, cy1; + wxGetCharSize(m_hWnd, &cx1, &cy1, GetFont()); + + int x_offset = x + cx1; + int y_offset = y + cy1; // Add extra space under the label, if it exists. if (!wxControl::GetLabel().empty())