Applied patch [ 1310416 ] [wxMSW] Fix radio button traversal

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35990 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 2005-10-23 10:59:01 +00:00
parent 1ca78aa1dc
commit 3d3afaecfb

View File

@ -185,8 +185,8 @@ wxRadioButton* wxGetPreviousButtonInGroup(wxRadioButton *btn)
// no more buttons in group
return NULL;
}
else
return prevBtn;
return prevBtn;
}
wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
@ -215,8 +215,8 @@ wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
// no more buttons or the first button of the next group
return NULL;
}
else
return nextBtn;
return nextBtn;
}
wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn)
@ -231,6 +231,18 @@ wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn)
}
}
wxRadioButton* wxGetLastButtonInGroup(wxRadioButton *btn)
{
while (true)
{
wxRadioButton* nextBtn = wxGetNextButtonInGroup(btn);
if (!nextBtn)
return btn;
btn = nextBtn;
}
}
wxRadioButton* wxGetSelectedButtonInGroup(wxRadioButton *btn)
{
// Find currently selected button
@ -402,39 +414,62 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
wxWindow *child = node->GetData();
#ifdef __WXMSW__
bool canSelectRadioButton = true;
if (!event.IsFromTab())
if ( event.IsFromTab() )
{
// If navigating using cursor keys, make sure not to navigate out of a radio button group.
if (m_winLastFocused && wxIsKindOf(m_winLastFocused, wxRadioButton))
if ( wxIsKindOf(child, wxRadioButton) )
{
if (!wxIsKindOf(child, wxRadioButton))
// only radio buttons with either wxRB_GROUP or wxRB_SINGLE
// can be tabbed to
if ( child->HasFlag(wxRB_GROUP) )
{
child = forward ?
wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused) :
wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused);
if (!child)
{
event.Skip(false);
return;
}
// need to tab into the active button within a group
wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
if ( rb )
child = rb;
}
else if ( !child->HasFlag(wxRB_SINGLE) )
{
node = forward ? node->GetNext() : node->GetPrevious();
continue;
}
}
}
else
else if ( m_winLastFocused &&
wxIsKindOf(m_winLastFocused, wxRadioButton) &&
!m_winLastFocused->HasFlag(wxRB_SINGLE) )
{
// If navigating using tabs, skip all but the first radio button in a group.
if (wxIsKindOf(child, wxRadioButton))
// cursor keys don't navigate out of a radio button group so
// find the correct radio button to focus
if ( forward )
{
if (wxGetPreviousButtonInGroup((wxRadioButton*)child))
canSelectRadioButton = false;
child = wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused);
if ( !child )
{
// no next button in group, set it to the first button
child = wxGetFirstButtonInGroup((wxRadioButton*)m_winLastFocused);
}
}
else
{
child = wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused);
if ( !child )
{
// no previous button in group, set it to the last button
child = wxGetLastButtonInGroup((wxRadioButton*)m_winLastFocused);
}
}
if ( child == m_winLastFocused )
{
// must be a group consisting of only one button therefore
// no need to send a navigation event
event.Skip(false);
return;
}
}
#else
static bool canSelectRadioButton = true;
#endif
#endif // __WXMSW__
if ( child->AcceptsFocusFromKeyboard() && canSelectRadioButton )
if ( child->AcceptsFocusFromKeyboard() )
{
// if we're setting the focus to a child panel we should prevent it
// from giving it to the child which had the focus the last time
@ -442,18 +477,6 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
// direction we're coming
event.SetEventObject(m_winParent);
#if defined(__WXMSW__)
// we need to hop to the next activated
// radio button, not just the next radio
// button under MSW
if (wxIsKindOf(child, wxRadioButton) && event.IsFromTab())
{
wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
if (rb)
child = rb;
}
#endif // __WXMSW__
// disable propagation for this call as otherwise the event might
// bounce back to us.
wxPropagationDisabler disableProp(event);