Don't set focus to hidden window in wxSetFocusToChild().

The window that had focus previously could be hidden now, but its parent could
be hidden as well so it's not enough to set focus to it but we need to loop
until we find a visible ancestor.

Closes #14230.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71227 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-04-18 09:23:05 +00:00
parent 34a9a3528f
commit 6ca243fc75

View File

@ -653,17 +653,27 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
// It might happen that the window got reparented
if ( (*childLastFocused)->GetParent() == win )
{
// And it also could have become hidden in the meanwhile, in this
// case focus its parent instead.
while ( !(*childLastFocused)->IsShown() )
// And it also could have become hidden in the meanwhile
// We want to focus on the deepest widget visible
wxWindow *deepestVisibleWindow = NULL;
while ( *childLastFocused )
{
if ( (*childLastFocused)->IsShown() )
{
if ( !deepestVisibleWindow )
deepestVisibleWindow = *childLastFocused;
}
else
deepestVisibleWindow = NULL;
*childLastFocused = (*childLastFocused)->GetParent();
if ( !*childLastFocused )
break;
}
if ( *childLastFocused )
if ( deepestVisibleWindow )
{
*childLastFocused = deepestVisibleWindow;
wxLogTrace(TRACE_FOCUS,
wxT("SetFocusToChild() => last child (0x%p)."),
(*childLastFocused)->GetHandle());