]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/containr.cpp
compilation fix for !wxUSE_BUTTON
[wxWidgets.git] / src / common / containr.cpp
index 55b6109a9b29e768fc260c092c7c319338b2b124..4f05ea60f21daa85073a1d12608426c69fc5c9dc 100644 (file)
     #include "wx/log.h"
     #include "wx/event.h"
     #include "wx/window.h"
-#endif //WX_PRECOMP
-
-#include "wx/containr.h"
-
-#ifdef __WXMAC__
     #include "wx/scrolbar.h"
-#endif
-
-#ifdef __WXMSW__
     #include "wx/radiobut.h"
-#endif
+    #include "wx/containr.h"
+#endif //WX_PRECOMP
 
 // trace mask for focus messages
 #define TRACE_FOCUS _T("focus")
 wxControlContainer::wxControlContainer(wxWindow *winParent)
 {
     m_winParent = winParent;
-
-    m_winLastFocused =
-    m_winTmpDefault =
-    m_winDefault = NULL;
+    m_winLastFocused = NULL;
     m_inSetFocus = false;
 }
 
@@ -286,6 +276,42 @@ 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 && bookctrl->GetEventHandler()->ProcessEvent(event) )
+            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() )
@@ -369,12 +395,18 @@ void wxControlContainer::HandleOnNavigationKey( wxNavigationKeyEvent& event )
     for ( ;; )
     {
         // don't go into infinite loop
-        if ( start_node && node == start_node )
+        if ( start_node && node && node == start_node )
             break;
 
         // Have we come to the last or first item on the panel?
         if ( !node )
         {
+            if ( !start_node )
+            {
+                // exit now as otherwise we'd loop forever
+                break;
+            }
+
             if ( !goingDown )
             {
                 // Check if our (maybe grand) parent is another panel: if this
@@ -505,12 +537,6 @@ void wxControlContainer::HandleOnWindowDestroy(wxWindowBase *child)
 {
     if ( child == m_winLastFocused )
         m_winLastFocused = NULL;
-
-    if ( child == m_winDefault )
-        m_winDefault = NULL;
-
-    if ( child == m_winTmpDefault )
-        m_winTmpDefault = NULL;
 }
 
 // ----------------------------------------------------------------------------
@@ -640,4 +666,3 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
 
     return false;
 }
-