X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d9506e775853406953c4b3ecd6f57b85abdafdfd..5438a5665e35ee6286c5af73747873df9daed252:/src/generic/panelg.cpp?ds=inline

diff --git a/src/generic/panelg.cpp b/src/generic/panelg.cpp
index e586d96323..73a7a04cf3 100644
--- a/src/generic/panelg.cpp
+++ b/src/generic/panelg.cpp
@@ -62,7 +62,9 @@ END_EVENT_TABLE()
 void wxPanel::Init()
 {
     m_winLastFocused = (wxWindow *)NULL;
+#if wxUSE_BUTTON
     m_btnDefault = (wxButton *)NULL;
+#endif // wxUSE_BUTTON
 }
 
 bool wxPanel::Create(wxWindow *parent, wxWindowID id,
@@ -71,15 +73,7 @@ bool wxPanel::Create(wxWindow *parent, wxWindowID id,
                      long style,
                      const wxString& name)
 {
-    bool ret = wxWindow::Create(parent, id, pos, size, style, name);
-
-    if ( ret )
-    {
-        SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
-        SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
-    }
-
-    return ret;
+    return wxWindow::Create(parent, id, pos, size, style, name);
 }
 
 // ----------------------------------------------------------------------------
@@ -121,12 +115,20 @@ void wxPanel::OnSize(wxSizeEvent& WXUNUSED(event))
 
 void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
 {
-    // there is not much to do if we have only one child (or not at all) and
-    // we're not interested in "notebook page change" events here
-    if ( (GetChildren().GetCount() < 2) || event.IsWindowChange() )
+    // the event is propagated downwards if the event emitter was our parent
+    bool goingDown = event.GetEventObject() == GetParent();
+
+    const wxWindowList& children = GetChildren();
+
+    // 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() )
     {
+        // let the parent process it unless it already comes from our parent
+        // of we don't have any
         wxWindow *parent = GetParent();
-        if ( !parent || !parent->GetEventHandler()->ProcessEvent(event) )
+        if ( goingDown ||
+             !parent || !parent->GetEventHandler()->ProcessEvent(event) )
         {
             event.Skip();
         }
@@ -141,11 +143,6 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
     // next acceptable child
     wxWindowList::Node *node, *start_node;
 
-    // the event is propagated downwards if the event emitter was our parent
-    bool goingDown = event.GetEventObject() == GetParent();
-
-    const wxWindowList& children = GetChildren();
-
     // we should start from the first/last control and not from the one which
     // had focus the last time if we're propagating the event downwards because
     // for our parent we look like a single control
@@ -227,14 +224,9 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
                     if ( focussed_child_of_parent->IsTopLevel() )
                         break;
 
-                    // is the parent a panel?
-                    wxPanel *panel = wxDynamicCast(parent, wxPanel);
-                    if (panel)
-                    {
-                        event.SetCurrentFocus( focussed_child_of_parent );
-                        if (parent->GetEventHandler()->ProcessEvent( event ))
-                            return;
-                    }
+                    event.SetCurrentFocus( focussed_child_of_parent );
+                    if (parent->GetEventHandler()->ProcessEvent( event ))
+                        return;
 
                     focussed_child_of_parent = parent;
                 }
@@ -250,7 +242,7 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
 
         wxWindow *child = node->GetData();
 
-        if ( child->AcceptsFocus() )
+        if ( child->AcceptsFocusFromKeyboard() )
         {
             m_winLastFocused = child;  // should be redundant, but it is not
 
@@ -279,6 +271,7 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
             }
             //else: the child manages its focus itself
 
+            event.Skip( FALSE );
             return;
         }
 
@@ -290,6 +283,13 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event )
     event.Skip();
 }
 
+void wxPanel::RemoveChild(wxWindowBase *child)
+{
+    if ( child == m_winLastFocused )
+        m_winLastFocused = NULL;
+    wxWindow::RemoveChild(child);
+}
+
 void wxPanel::SetFocus()
 {
     wxLogTrace(_T("focus"), _T("SetFocus on wxPanel 0x%08x."), GetHandle());
@@ -318,10 +318,8 @@ void wxPanel::SetFocus()
     //     think my addition to OnNavigationKey() above takes care of it.
     //     Keeping #ifdef __WXGTK__ for now, but please try removing it and see
     //     what happens.
-
-#ifdef __WXGTK__
-    m_winLastFocused = (wxWindow *)NULL;
-#endif // 0
+    //
+    // RR: Removed for now. Let's see what happens..
 
     if ( !SetFocusToChild() )
     {
@@ -331,7 +329,7 @@ void wxPanel::SetFocus()
 
 void wxPanel::OnFocus(wxFocusEvent& event)
 {
-    wxLogTrace(_T("focus"), _T("OnFocus on wxPanel 0x%08x."), GetHandle());
+    wxLogTrace(_T("focus"), _T("OnFocus on wxPanel 0x%08x, name: %s"), GetHandle(), GetName().c_str() );
 
     // If the panel gets the focus *by way of getting clicked on*
     // we move the focus to either the last window that had the
@@ -343,39 +341,52 @@ void wxPanel::OnFocus(wxFocusEvent& event)
 
 bool wxPanel::SetFocusToChild()
 {
-    if ( m_winLastFocused )
+    return wxSetFocusToChild(this, &m_winLastFocused);
+}
+
+// ----------------------------------------------------------------------------
+// SetFocusToChild(): this function is used by wxPanel but also by wxFrame in
+// wxMSW, this is why it is outside of wxPanel class
+// ----------------------------------------------------------------------------
+
+bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
+{
+    wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") );
+
+    if ( *childLastFocused )
     {
         // It might happen that the window got reparented or no longer accepts
         // the focus.
-        if ( (m_winLastFocused->GetParent() == this) &&
-             m_winLastFocused->AcceptsFocus() )
+        if ( (*childLastFocused)->GetParent() == win &&
+             (*childLastFocused)->AcceptsFocusFromKeyboard() )
         {
             wxLogTrace(_T("focus"),
                        _T("SetFocusToChild() => last child (0x%08x)."),
-                       m_winLastFocused->GetHandle());
+                       (*childLastFocused)->GetHandle());
 
-            m_winLastFocused->SetFocus();
+            (*childLastFocused)->SetFocus();
             return TRUE;
         }
         else
         {
             // it doesn't count as such any more
-            m_winLastFocused = (wxWindow *)NULL;
+            *childLastFocused = (wxWindow *)NULL;
         }
     }
 
     // set the focus to the first child who wants it
-    wxWindowList::Node *node = GetChildren().GetFirst();
+    wxWindowList::Node *node = win->GetChildren().GetFirst();
     while ( node )
     {
         wxWindow *child = node->GetData();
-        if ( child->AcceptsFocus() )
+
+        if ( child->AcceptsFocusFromKeyboard() && !child->IsTopLevel() )
         {
             wxLogTrace(_T("focus"),
                        _T("SetFocusToChild() => first child (0x%08x)."),
                        child->GetHandle());
 
-            m_winLastFocused = child;  // should be redundant, but it is not
+            *childLastFocused = child;  // should be redundant, but it is not
             child->SetFocus();
             return TRUE;
         }