X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/afd7bf26f1cf319020fc789f3afcdcb98c9b549b..6f45066bd8f45e15d645d0f46a29f81aed8c020e:/src/common/containr.cpp diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 42aa660a50..84be03d146 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -24,13 +24,18 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/containr.h" +#endif + +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/event.h" #include "wx/window.h" #include "wx/scrolbar.h" #include "wx/radiobut.h" - #include "wx/containr.h" #endif //WX_PRECOMP // trace mask for focus messages @@ -49,45 +54,39 @@ wxControlContainer::wxControlContainer(wxWindow *winParent) bool wxControlContainer::AcceptsFocus() const { - // if we're not shown or disabled, we can't accept focus - if ( m_winParent->IsShown() && m_winParent->IsEnabled() ) - { - // otherwise we can accept focus either if we have no children at all - // (in this case we're probably not used as a container) or only when - // at least one child will accept focus - wxWindowList::compatibility_iterator node = m_winParent->GetChildren().GetFirst(); - if ( !node ) - return true; + // we can accept focus either if we have no children at all (in this case + // we're probably not used as a container) or only when at least one child + // accepts focus + wxWindowList::compatibility_iterator node = m_winParent->GetChildren().GetFirst(); + if ( !node ) + 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 ; + // 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(); - node = node->GetNext(); + while ( node ) + { + wxWindow *child = node->GetData(); + node = node->GetNext(); #ifdef __WXMAC__ - wxScrollBar *sb = wxDynamicCast( child , wxScrollBar ) ; - if ( sb == NULL || !m_winParent->MacIsWindowScrollbar( sb ) ) - hasRealChildren = true ; - if ( sb && m_winParent->MacIsWindowScrollbar( sb ) ) - continue; + if ( m_winParent->MacIsWindowScrollbar( child ) ) + continue; + hasRealChildren = true ; #endif - if ( child->AcceptsFocus() ) - { - return true; - } + if ( child->CanAcceptFocus() ) + { + return true; } + } #ifdef __WXMAC__ - if ( !hasRealChildren ) - return true ; + if ( !hasRealChildren ) + return true ; #endif - } return false; } @@ -309,8 +308,15 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) } } - if ( bookctrl && bookctrl->GetEventHandler()->ProcessEvent(event) ) - return; + if ( bookctrl ) + { + // make sure that we don't bubble up the event again from the book + // control resulting in infinite recursion + wxNavigationKeyEvent eventCopy(event); + eventCopy.SetEventObject(m_winParent); + if ( bookctrl->GetEventHandler()->ProcessEvent(eventCopy) ) + return; + } } // there is not much to do if we don't have children and we're not @@ -499,7 +505,7 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event ) } #endif // __WXMSW__ - if ( child->AcceptsFocusFromKeyboard() ) + if ( child->CanAcceptFocusFromKeyboard() ) { // 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 @@ -641,12 +647,11 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) node = node->GetNext(); #ifdef __WXMAC__ - wxScrollBar *sb = wxDynamicCast( child , wxScrollBar ) ; - if ( sb && child->GetParent()->MacIsWindowScrollbar( sb ) ) + if ( child->GetParent()->MacIsWindowScrollbar( child ) ) continue; #endif - if ( child->AcceptsFocusFromKeyboard() && !child->IsTopLevel() ) + if ( child->CanAcceptFocusFromKeyboard() && !child->IsTopLevel() ) { #ifdef __WXMSW__ // If a radiobutton is the first focusable child, search for the @@ -672,3 +677,5 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) return false; } + +#endif // !wxHAS_NATIVE_TAB_TRAVERSAL