Make radiobutton tab behaviour the same on MSW

as in standard MSW app, i.e. tab into the
    activated, not necessarily the first radio
    button.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29258 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2004-09-22 14:51:31 +00:00
parent d775fa8235
commit c932709d31

View File

@ -40,6 +40,10 @@
#include "wx/scrolbar.h" #include "wx/scrolbar.h"
#endif #endif
#ifdef __WXMSW__
#include "wx/radiobut.h"
#endif
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@ -287,13 +291,46 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
wxWindow *child = node->GetData(); wxWindow *child = node->GetData();
if ( child->AcceptsFocusFromKeyboard() ) #ifdef __WXMSW__
bool is_not_msw_rb = ! wxIsKindOf(m_winLastFocused,wxRadioButton);
#else
bool is_not_msw_rb = true;
#endif
if ( child->AcceptsFocusFromKeyboard() && is_not_msw_rb)
{ {
// 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
// and instead give it to the first/last child depending from which // and instead give it to the first/last child depending from which
// direction we're coming // direction we're coming
event.SetEventObject(m_winParent); event.SetEventObject(m_winParent);
#ifdef __WXMSW__
// we need to hop to the next activated
// radio button, not just the next radio
// button under MSW
if (wxIsKindOf(child,wxRadioButton))
{
wxRadioButton *rb = (wxRadioButton*) child;
if (!rb->GetValue())
{
for (;;)
{
wxWindowList::compatibility_iterator node = children.Find( child );
if (forward)
node = node->GetNext();
else
node = node->GetPrevious();
if (!node) return; // this would probably an error
child = node->GetData();
if (!wxIsKindOf(child,wxRadioButton)) continue;
rb = (wxRadioButton*) child;
if (rb->GetValue()) break;
}
}
}
#endif
// 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);