void wxPanel::Init()
{
m_winLastFocused = (wxWindow *)NULL;
+#if wxUSE_BUTTON
m_btnDefault = (wxButton *)NULL;
+#endif // wxUSE_BUTTON
}
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);
}
// ----------------------------------------------------------------------------
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();
}
// 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
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;
}
wxWindow *child = node->GetData();
- if ( child->AcceptsFocus() )
+ if ( child->AcceptsFocusFromKeyboard() )
{
m_winLastFocused = child; // should be redundant, but it is not
}
//else: the child manages its focus itself
+ event.Skip( FALSE );
return;
}
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());
// 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() )
{
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
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;
}