- if (!node)
- {
-/*
- if (GetParent() != NULL)
- {
- wxNavigationKeyEvent new_event;
- new_event.SetDirection( event.GetDirection() );
- new_event.SetWindowChange(FALSE);
- new_event.SetCurrentFocus( this );
-
- if (GetParent()->GetEventHandler()->ProcessEvent(new_event))
- {
- return;
- }
+ // Have we come to the last or first item on the panel?
+ if ( !node )
+ {
+ if ( !goingDown )
+ {
+ // Check if our (may be grand) parent is another panel: if this
+ // is the case, they will know what to do with this navigation
+ // key and so give them the chance to process it instead of
+ // looping inside this panel (normally, the focus will go to
+ // the next/previous item after this panel in the parent
+ // panel).
+ wxWindow *focussed_child_of_parent = this;
+ for ( wxWindow *parent = GetParent();
+ parent;
+ parent = parent->GetParent() )
+ {
+ // we don't want to tab into a different dialog or frame
+ if ( focussed_child_of_parent->IsTopLevel() )
+ break;
+
+ event.SetCurrentFocus( focussed_child_of_parent );
+ if (parent->GetEventHandler()->ProcessEvent( event ))
+ return;
+
+ focussed_child_of_parent = parent;
+ }
+ }
+ //else: as the focus came from our parent, we definitely don't want
+ // to send it back to it!
+
+ // no, we are not inside another panel so process this ourself
+ node = forward ? children.GetFirst() : children.GetLast();
+
+ continue;
+ }
+
+ wxWindow *child = node->GetData();
+
+ if ( child->AcceptsFocus() )
+ {
+ m_winLastFocused = child; // should be redundant, but it is not
+
+ // 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
+ // and instead give it to the first/last child depending from which
+ // direction we're coming
+ wxPanel *subpanel = wxDynamicCast(child, wxPanel);
+ if ( subpanel )
+ {
+ // trick the panel into thinking that it got the navigation
+ // event - instead of duplicating all the code here
+ //
+ // make sure that we do trick it by setting all the parameters
+ // correctly (consistently with the code in this very function
+ // above) and that it starts from the very beginning/end by
+ // using SetLastFocus(NULL)
+ subpanel->SetLastFocus((wxWindow *)NULL);