fixes to radio menu items

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14759 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-03-24 01:24:16 +00:00
parent e00fab7aea
commit be15b995df
3 changed files with 108 additions and 39 deletions

View File

@@ -112,8 +112,8 @@ wxMenuItem::wxMenuItem(wxMenu *parentMenu,
void wxMenuItem::Init()
{
m_startRadioGroup =
m_endRadioGroup = -1;
m_radioGroup.start = -1;
m_isRadioGroupStart = FALSE;
#if wxUSE_OWNER_DRAWN
// set default menu colors
@@ -161,6 +161,30 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
return wxStripMenuCodes(text);
}
// radio group stuff
// -----------------
void wxMenuItem::SetAsRadioGroupStart()
{
m_isRadioGroupStart = TRUE;
}
void wxMenuItem::SetRadioGroupStart(int start)
{
wxASSERT_MSG( !m_isRadioGroupStart,
_T("should only be called for the next radio items") );
m_radioGroup.start = start;
}
void wxMenuItem::SetRadioGroupEnd(int end)
{
wxASSERT_MSG( m_isRadioGroupStart,
_T("should only be called for the first radio item") );
m_radioGroup.end = end;
}
// change item state
// -----------------
@@ -197,16 +221,40 @@ void wxMenuItem::Check(bool check)
if ( !check )
return;
// get the index of this item in the menu
const wxMenuItemList& items = m_parentMenu->GetMenuItems();
int pos = items.IndexOf(this);
wxCHECK_RET( pos != wxNOT_FOUND,
_T("menuitem not found in the menu items list?") );
// get the radio group range
int start,
end;
if ( m_isRadioGroupStart )
{
// we already have all information we need
start = pos;
end = m_radioGroup.end;
}
else // next radio group item
{
// get the radio group end from the start item
start = m_radioGroup.start;
end = items.Item(start)->GetData()->m_radioGroup.end;
}
#ifdef __WIN32__
// calling CheckMenuRadioItem() with such parameters hangs my system
// (NT4 SP6) and I suspect this could happen to the others as well - so
// don't do it!
wxCHECK_RET( start != -1 && end != -1,
_T("invalid ::CheckMenuRadioItem() parameter(s)") );
if ( !::CheckMenuRadioItem(hmenu,
m_startRadioGroup, // first group item
m_endRadioGroup, // last one
pos, // the one to check
start, // the first radio group item
end, // the last one
pos, // the one to check
MF_BYPOSITION | flags) )
{
wxLogLastError(_T("CheckMenuRadioItem"));
@@ -214,8 +262,8 @@ void wxMenuItem::Check(bool check)
#endif // __WIN32__
// also uncheck all the other items in this radio group
wxMenuItemList::Node *node = items.Item(m_startRadioGroup);
for ( int n = m_startRadioGroup; n <= m_endRadioGroup && node; n++ )
wxMenuItemList::Node *node = items.Item(start);
for ( int n = start; n <= end && node; n++ )
{
if ( n != pos )
{