X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..a353dc9852cc44fcffd339895ba3024d0eebbad7:/src/common/containr.cpp diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 69b8fa56ae..a08c3b16ae 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -40,6 +40,10 @@ #include "wx/scrolbar.h" #endif +#ifdef __WXMSW__ + #include "wx/radiobut.h" +#endif + // ============================================================================ // implementation // ============================================================================ @@ -64,21 +68,21 @@ bool wxControlContainer::AcceptsFocus() const // at least one child will accept focus wxWindowList::compatibility_iterator node = m_winParent->GetChildren().GetFirst(); if ( !node ) - return TRUE; + return true; #ifdef __WXMAC__ // wxMac has eventually the two scrollbars as children, they don't count // as real children in the algorithm mentioned above bool hasRealChildren = false ; #endif - + while ( node ) { wxWindow *child = node->GetData(); if ( child->AcceptsFocus() ) { - return TRUE; + return true; } #ifdef __WXMAC__ @@ -88,14 +92,14 @@ bool wxControlContainer::AcceptsFocus() const #endif node = node->GetNext(); } - + #ifdef __WXMAC__ if ( !hasRealChildren ) - return TRUE ; + return true ; #endif } - return FALSE; + return false; } void wxControlContainer::SetLastFocus(wxWindow *win) @@ -287,13 +291,50 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) wxWindow *child = node->GetData(); - if ( child->AcceptsFocusFromKeyboard() ) +#if defined(__WXMSW__) + bool is_not_msw_rb = !m_winLastFocused || + !wxIsKindOf(m_winLastFocused,wxRadioButton); +#else + static const 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 // 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 // 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)) + { + 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 // __WXMSW__ + // disable propagation for this call as otherwise the event might // bounce back to us. wxPropagationDisabler disableProp(event); @@ -308,7 +349,7 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) } //else: the child manages its focus itself - event.Skip( FALSE ); + event.Skip( false ); return; } @@ -345,8 +386,6 @@ bool wxControlContainer::DoSetFocus() if (m_inSetFocus) return true; - m_inSetFocus = true; - // when the panel gets the focus we move the focus to either the last // window that had the focus or the first one that can get it unless the // focus had been already set to some other child @@ -357,7 +396,7 @@ bool wxControlContainer::DoSetFocus() if ( win == m_winParent ) { // our child already has focus, don't take it away from it - return TRUE; + return true; } if ( win->IsTopLevel() ) @@ -370,6 +409,9 @@ bool wxControlContainer::DoSetFocus() win = win->GetParent(); } + // protect against infinite recursion: + m_inSetFocus = true; + bool ret = SetFocusToChild(); m_inSetFocus = false; @@ -400,8 +442,8 @@ bool wxControlContainer::SetFocusToChild() bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) { - wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") ); - wxCHECK_MSG( childLastFocused, FALSE, + wxCHECK_MSG( win, false, _T("wxSetFocusToChild(): invalid window") ); + wxCHECK_MSG( childLastFocused, false, _T("wxSetFocusToChild(): NULL child poonter") ); if ( *childLastFocused ) @@ -416,7 +458,7 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) // not SetFocusFromKbd(): we're restoring focus back to the old // window and not setting it as the result of a kbd action (*childLastFocused)->SetFocus(); - return TRUE; + return true; } else { @@ -439,12 +481,12 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) *childLastFocused = child; child->SetFocusFromKbd(); - return TRUE; + return true; } node = node->GetNext(); } - return FALSE; + return false; }