fix an infinite loop in HandleOnNavigationKey() when wxUSE_STL==1 and start_node is NULL

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38239 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-03-21 12:53:28 +00:00
parent 4b3feaa75d
commit edc0a395c6

View File

@@ -302,7 +302,7 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
} }
// where are we going? // where are we going?
bool forward = event.GetDirection(); const bool forward = event.GetDirection();
// the node of the children list from which we should start looking for the // the node of the children list from which we should start looking for the
// next acceptable child // next acceptable child
@@ -319,11 +319,8 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
// start from first or last depending on where we're going // start from first or last depending on where we're going
node = forward ? children.GetFirst() : children.GetLast(); node = forward ? children.GetFirst() : children.GetLast();
// we want to cycle over all nodes
start_node = wxWindowList::compatibility_iterator();
} }
else else // going up
{ {
// try to find the child which has the focus currently // try to find the child which has the focus currently
@@ -349,10 +346,6 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
// ok, we found the focus - now is it our child? // ok, we found the focus - now is it our child?
start_node = children.Find( winFocus ); start_node = children.Find( winFocus );
} }
else
{
start_node = wxWindowList::compatibility_iterator();
}
if ( !start_node && m_winLastFocused ) if ( !start_node && m_winLastFocused )
{ {
@@ -373,14 +366,18 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
} }
// we want to cycle over all elements passing by NULL // we want to cycle over all elements passing by NULL
while ( node != start_node ) for ( ;; )
{ {
// don't go into infinite loop
if ( start_node && node == start_node )
break;
// Have we come to the last or first item on the panel? // Have we come to the last or first item on the panel?
if ( !node ) if ( !node )
{ {
if ( !goingDown ) if ( !goingDown )
{ {
// Check if our (may be grand) parent is another panel: if this // Check if our (maybe grand) parent is another panel: if this
// is the case, they will know what to do with this navigation // is the case, they will know what to do with this navigation
// key and so give them the chance to process it instead of // key and so give them the chance to process it instead of
// looping inside this panel (normally, the focus will go to // looping inside this panel (normally, the focus will go to