]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/containr.cpp
Fix centering of top-level children of wxMDIParentFrame on Mac
[wxWidgets.git] / src / common / containr.cpp
index 69b8fa56aea7a6864958e2de5655947781a61942..5bfc812f78726e1ca91a3d7b2499191c7d657803 100644 (file)
     #include "wx/scrolbar.h"
 #endif
 
+#ifdef __WXMSW__
+    #include "wx/radiobut.h"
+#endif
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -64,21 +68,21 @@ bool wxControlContainer::AcceptsFocus() const
         // at least one child will accept focus
         wxWindowList::compatibility_iterator node = m_winParent->GetChildren().GetFirst();
         if ( !node )
-            return TRUE;
+            return true;
 
 #ifdef __WXMAC__
         // wxMac has eventually the two scrollbars as children, they don't count
         // as real children in the algorithm mentioned above
         bool hasRealChildren = false ;
 #endif
-        
+
         while ( node )
         {
             wxWindow *child = node->GetData();
 
             if ( child->AcceptsFocus() )
             {
-                return TRUE;
+                return true;
             }
 
 #ifdef __WXMAC__
@@ -88,14 +92,14 @@ bool wxControlContainer::AcceptsFocus() const
 #endif
             node = node->GetNext();
         }
-        
+
 #ifdef __WXMAC__
         if ( !hasRealChildren )
-            return TRUE ;
+            return true ;
 #endif
     }
 
-    return FALSE;
+    return false;
 }
 
 void wxControlContainer::SetLastFocus(wxWindow *win)
@@ -287,13 +291,50 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
 
         wxWindow *child = node->GetData();
 
-        if ( child->AcceptsFocusFromKeyboard() )
+#if defined(__WXMSW__) && !defined(__PALMOS__)
+        bool is_not_msw_rb = !m_winLastFocused ||
+                                !wxIsKindOf(m_winLastFocused,wxRadioButton);
+#else
+        static const bool is_not_msw_rb = true;
+#endif
+
+        if ( child->AcceptsFocusFromKeyboard() && is_not_msw_rb )
         {
             // 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
             event.SetEventObject(m_winParent);
+
+#if defined(__WXMSW__) && !defined(__PALMOS__)
+            // we need to hop to the next activated
+            // radio button, not just the next radio
+            // button under MSW
+            if (wxIsKindOf(child,wxRadioButton))
+            {
+                wxRadioButton *rb = (wxRadioButton*) child;
+                if (!rb->GetValue())
+                {
+                    for (;;)
+                    {
+                        wxWindowList::compatibility_iterator node = children.Find( child );
+                        if (forward)
+                            node = node->GetNext();
+                        else
+                            node = node->GetPrevious();
+                        if (!node)
+                            return; // this would probably an error
+                        child = node->GetData();
+                        if (!wxIsKindOf(child,wxRadioButton))
+                            continue;
+                        rb = (wxRadioButton*) child;
+                        if (rb->GetValue())
+                            break;
+                    }
+                }
+            }
+#endif // __WXMSW__
+
             // disable propagation for this call as otherwise the event might
             // bounce back to us.
             wxPropagationDisabler disableProp(event);
@@ -308,7 +349,7 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
             }
             //else: the child manages its focus itself
 
-            event.Skip( FALSE );
+            event.Skip( false );
 
             return;
         }
@@ -345,8 +386,6 @@ bool wxControlContainer::DoSetFocus()
     if (m_inSetFocus)
         return true;
 
-    m_inSetFocus = true;
-    
     // when the panel gets the focus we move the focus to either the last
     // window that had the focus or the first one that can get it unless the
     // focus had been already set to some other child
@@ -357,7 +396,7 @@ bool wxControlContainer::DoSetFocus()
         if ( win == m_winParent )
         {
             // our child already has focus, don't take it away from it
-            return TRUE;
+            return true;
         }
 
         if ( win->IsTopLevel() )
@@ -370,6 +409,9 @@ bool wxControlContainer::DoSetFocus()
         win = win->GetParent();
     }
 
+    // protect against infinite recursion:
+    m_inSetFocus = true;
+
     bool ret = SetFocusToChild();
 
     m_inSetFocus = false;
@@ -400,8 +442,8 @@ bool wxControlContainer::SetFocusToChild()
 
 bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
 {
-    wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") );
-    wxCHECK_MSG( childLastFocused, FALSE,
+    wxCHECK_MSG( win, false, _T("wxSetFocusToChild(): invalid window") );
+    wxCHECK_MSG( childLastFocused, false,
                  _T("wxSetFocusToChild(): NULL child poonter") );
 
     if ( *childLastFocused )
@@ -416,7 +458,7 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
             // not SetFocusFromKbd(): we're restoring focus back to the old
             // window and not setting it as the result of a kbd action
             (*childLastFocused)->SetFocus();
-            return TRUE;
+            return true;
         }
         else
         {
@@ -439,12 +481,12 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
 
             *childLastFocused = child;
             child->SetFocusFromKbd();
-            return TRUE;
+            return true;
         }
 
         node = node->GetNext();
     }
 
-    return FALSE;
+    return false;
 }