X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5f28de16f324fa833666ff02e274f7843a3fdd77..7708a267207473783f88cae047b78adaecf83675:/src/common/containr.cpp diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 3333232ec5..bbc5d48b61 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -24,13 +24,16 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/containr.h" +#endif + #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 @@ -40,54 +43,60 @@ // implementation // ============================================================================ -wxControlContainer::wxControlContainer(wxWindow *winParent) +// ---------------------------------------------------------------------------- +// wxControlContainerBase +// ---------------------------------------------------------------------------- + +void wxControlContainerBase::SetCanFocus(bool acceptsFocus) { - m_winParent = winParent; - m_winLastFocused = NULL; - m_inSetFocus = false; + if ( acceptsFocus == m_acceptsFocus ) + return; + + m_acceptsFocus = acceptsFocus; + + m_winParent->SetCanFocus(m_acceptsFocus); } -bool wxControlContainer::AcceptsFocus() const +// if the window has a focusable child, it shouldn't be focusable itself (think +// of wxPanel used for grouping different controls) but if it doesn't have any +// (focusable) children, then it should be possible to give it focus (think of +// wxGrid or generic wxListCtrl) +bool wxControlContainerBase::ShouldAcceptFocus() const { - // if we're not shown or disabled, we can't accept focus - if ( m_winParent->IsShown() && m_winParent->IsEnabled() ) + // 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; + + while ( node ) { - // 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; + wxWindow *child = node->GetData(); + node = node->GetNext(); #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 ; + if ( m_winParent->MacIsWindowScrollbar( child ) ) + continue; #endif - while ( node ) - { - wxWindow *child = node->GetData(); - node = node->GetNext(); + if ( child->CanAcceptFocus() ) + return false; + } -#ifdef __WXMAC__ - if ( m_winParent->MacIsWindowScrollbar( child ) ) - continue; - hasRealChildren = true ; -#endif - if ( child->AcceptsFocus() ) - { - return true; - } - } + return true; +} -#ifdef __WXMAC__ - if ( !hasRealChildren ) - return true ; -#endif - } +#ifndef wxHAS_NATIVE_TAB_TRAVERSAL - return false; +// ---------------------------------------------------------------------------- +// generic wxControlContainer +// ---------------------------------------------------------------------------- + +wxControlContainer::wxControlContainer() +{ + m_winLastFocused = NULL; + m_inSetFocus = false; } void wxControlContainer::SetLastFocus(wxWindow *win) @@ -504,7 +513,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 @@ -650,7 +659,7 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) 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 @@ -676,3 +685,5 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) return false; } + +#endif // !wxHAS_NATIVE_TAB_TRAVERSAL