X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..d2ebf0b7303be387d2d5a55ea0cd672fdf0c4f25:/src/common/containr.cpp diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 6df39ca62c..a17f646fe5 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -6,7 +6,7 @@ // Created: 06.08.01 // RCS-ID: $Id$ // Copyright: (c) 2001 Vadim Zeitlin -// License: wxWidgets licence +// License: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -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,46 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) 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 // 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); + +#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 // bounce back to us. wxPropagationDisabler disableProp(event); @@ -308,7 +345,7 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) } //else: the child manages its focus itself - event.Skip( FALSE ); + event.Skip( false ); return; } @@ -345,8 +382,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 +392,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 +405,9 @@ bool wxControlContainer::DoSetFocus() win = win->GetParent(); } + // protect against infinite recursion: + m_inSetFocus = true; + bool ret = SetFocusToChild(); m_inSetFocus = false; @@ -400,8 +438,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 +454,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 +477,12 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) *childLastFocused = child; child->SetFocusFromKbd(); - return TRUE; + return true; } node = node->GetNext(); } - return FALSE; + return false; }