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 // no more buttons in group
return NULL; return NULL;
} }
else
return prevBtn; return prevBtn;
} }
wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn) wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
@ -215,8 +215,8 @@ wxRadioButton* wxGetNextButtonInGroup(wxRadioButton *btn)
// no more buttons or the first button of the next group // no more buttons or the first button of the next group
return NULL; return NULL;
} }
else
return nextBtn; return nextBtn;
} }
wxRadioButton* wxGetFirstButtonInGroup(wxRadioButton *btn) 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) wxRadioButton* wxGetSelectedButtonInGroup(wxRadioButton *btn)
{ {
// Find currently selected button // Find currently selected button
@ -402,39 +414,62 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
wxWindow *child = node->GetData(); wxWindow *child = node->GetData();
#ifdef __WXMSW__ #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 ( wxIsKindOf(child, wxRadioButton) )
if (m_winLastFocused && wxIsKindOf(m_winLastFocused, 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 ? // need to tab into the active button within a group
wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused) : wxRadioButton *rb = wxGetSelectedButtonInGroup((wxRadioButton*)child);
wxGetPreviousButtonInGroup((wxRadioButton*)m_winLastFocused); if ( rb )
if (!child) child = rb;
{ }
event.Skip(false); else if ( !child->HasFlag(wxRB_SINGLE) )
return; {
} 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. // cursor keys don't navigate out of a radio button group so
if (wxIsKindOf(child, wxRadioButton)) // find the correct radio button to focus
if ( forward )
{ {
if (wxGetPreviousButtonInGroup((wxRadioButton*)child)) child = wxGetNextButtonInGroup((wxRadioButton*)m_winLastFocused);
canSelectRadioButton = false; 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 #endif // __WXMSW__
static bool canSelectRadioButton = true;
#endif
if ( child->AcceptsFocusFromKeyboard() && canSelectRadioButton ) if ( child->AcceptsFocusFromKeyboard() )
{ {
// if we're setting the focus to a child panel we should prevent it // 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 // 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 // direction we're coming
event.SetEventObject(m_winParent); 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 // disable propagation for this call as otherwise the event might
// bounce back to us. // bounce back to us.
wxPropagationDisabler disableProp(event); wxPropagationDisabler disableProp(event);