git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@310 
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
 // set focus to the next child which accepts it (or first/last if node == NULL)
 bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward)
 {
 // set focus to the next child which accepts it (or first/last if node == NULL)
 bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward)
 {
-       // Added by JACS since this seems to cause an infinite loop.
-       return FALSE;
-
   // @@ using typed list would be better...
   #define WIN(node) ((wxWindow *)(node->Data()))
 
   // @@ using typed list would be better...
   #define WIN(node) ((wxWindow *)(node->Data()))
 
 
     bFound = WIN(node)->AcceptsFocus();
   }
 
     bFound = WIN(node)->AcceptsFocus();
   }
+#if 0 // to restore when it will really work (now it's triggered all the time)
   else {
     // just to be sure it's the right one
     wxASSERT( WIN(node)->AcceptsFocus() );
   }
   else {
     // just to be sure it's the right one
     wxASSERT( WIN(node)->AcceptsFocus() );
   }
 
   // find the next child which accepts focus
 
   // find the next child which accepts focus
+  bool bParentWantsIt = TRUE;
   while ( !bFound ) {
     node = bForward ? node->Next() : node->Previous();
     if ( node == NULL ) {
   while ( !bFound ) {
     node = bForward ? node->Next() : node->Previous();
     if ( node == NULL ) {
+      if ( !bParentWantsIt ) {
+        // we've already been here which means that we've done a whole
+        // cycle without success - get out from the infinite loop
+        return FALSE;
+      }
+
       // ask parent if he doesn't want to advance focus to the next panel
       if ( GetParent() != NULL ) {
         wxNavigationKeyEvent event;
       // ask parent if he doesn't want to advance focus to the next panel
       if ( GetParent() != NULL ) {
         wxNavigationKeyEvent event;
+      // a sentinel to avoid infinite loops
+      bParentWantsIt = FALSE;
+
       // wrap around
       node = bForward ? children->First() : children->Last();
     }
       // wrap around
       node = bForward ? children->First() : children->Last();
     }