]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/containr.cpp
added wxMemoryInputStream(wxInputStream&, size_t) ctor (modified patch 1680108)
[wxWidgets.git] / src / common / containr.cpp
index 0a034ba01e9d673fa28953d77653a2df9a9bf35b..3333232ec59e31e61aa101a4d06750037aff463a 100644 (file)
@@ -68,18 +68,17 @@ bool wxControlContainer::AcceptsFocus() const
         while ( node )
         {
             wxWindow *child = node->GetData();
+            node = node->GetNext();
 
+#ifdef __WXMAC__
+            if ( m_winParent->MacIsWindowScrollbar( child ) )
+                continue;
+            hasRealChildren = true ;
+#endif
             if ( child->AcceptsFocus() )
             {
                 return true;
             }
-
-#ifdef __WXMAC__
-            wxScrollBar *sb = wxDynamicCast( child , wxScrollBar ) ;
-            if ( sb == NULL || !m_winParent->MacIsWindowScrollbar( sb ) )
-                hasRealChildren = true ;
-#endif
-            node = node->GetNext();
         }
 
 #ifdef __WXMAC__
@@ -276,6 +275,49 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
 
     const wxWindowList& children = m_winParent->GetChildren();
 
+    // if we have exactly one notebook-like child window (actually it could be
+    // any window that returns true from its HasMultiplePages()), then
+    // [Shift-]Ctrl-Tab and Ctrl-PageUp/Down keys should iterate over its pages
+    // even if the focus is outside of the control because this is how the
+    // standard MSW properties dialogs behave and we do it under other platforms
+    // as well because it seems like a good idea -- but we can always put this
+    // block inside "#ifdef __WXMSW__" if it's not suitable there
+    if ( event.IsWindowChange() && !goingDown )
+    {
+        // check if we have a unique notebook-like child
+        wxWindow *bookctrl = NULL;
+        for ( wxWindowList::const_iterator i = children.begin(),
+                                         end = children.end();
+              i != end;
+              ++i )
+        {
+            wxWindow * const window = *i;
+            if ( window->HasMultiplePages() )
+            {
+                if ( bookctrl )
+                {
+                    // this is the second book-like control already so don't do
+                    // anything as we don't know which one should have its page
+                    // changed
+                    bookctrl = NULL;
+                    break;
+                }
+
+                bookctrl = window;
+            }
+        }
+
+        if ( bookctrl )
+        {
+            // make sure that we don't bubble up the event again from the book
+            // control resulting in infinite recursion
+            wxNavigationKeyEvent eventCopy(event);
+            eventCopy.SetEventObject(m_winParent);
+            if ( bookctrl->GetEventHandler()->ProcessEvent(eventCopy) )
+                return;
+        }
+    }
+
     // there is not much to do if we don't have children and we're not
     // interested in "notebook page change" events here
     if ( !children.GetCount() || event.IsWindowChange() )
@@ -601,7 +643,13 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
     while ( node )
     {
         wxWindow *child = node->GetData();
+        node = node->GetNext();
 
+#ifdef __WXMAC__
+        if ( child->GetParent()->MacIsWindowScrollbar( child ) )
+            continue;
+#endif
+        
         if ( child->AcceptsFocusFromKeyboard() && !child->IsTopLevel() )
         {
 #ifdef __WXMSW__
@@ -624,8 +672,6 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
             child->SetFocusFromKbd();
             return true;
         }
-
-        node = node->GetNext();
     }
 
     return false;