+ else
+ {
+ //
+ // We get this event in 2 cases
+ //
+ // a) one of our pages might have generated it because the user TABbed
+ // out from it in which case we should propagate the event upwards and
+ // our parent will take care of setting the focus to prev/next sibling
+ //
+ // or
+ //
+ // b) the parent panel wants to give the focus to us so that we
+ // forward it to our selected page. We can't deal with this in
+ // OnSetFocus() because we don't know which direction the focus came
+ // from in this case and so can't choose between setting the focus to
+ // first or last panel child
+ //
+ wxWindow* pParent = GetParent();
+
+ if (rEvent.GetEventObject() == pParent)
+ {
+ //
+ // No, it doesn't come from child, case (b): forward to a page
+ //
+ if (m_nSelection != -1)
+ {
+ //
+ // So that the page knows that the event comes from it's parent
+ // and is being propagated downwards
+ //
+ rEvent.SetEventObject(this);
+
+ wxWindow* pPage = m_pages[m_nSelection];
+
+ if (!pPage->GetEventHandler()->ProcessEvent(rEvent))
+ {
+ pPage->SetFocus();
+ }
+ //else: page manages focus inside it itself
+ }
+ else
+ {
+ //
+ // We have no pages - still have to give focus to _something_
+ //
+ SetFocus();
+ }
+ }
+ else
+ {
+ //
+ // It comes from our child, case (a), pass to the parent
+ //
+ if (pParent)
+ {
+ rEvent.SetCurrentFocus(this);
+ pParent->GetEventHandler()->ProcessEvent(rEvent);
+ }