X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ee1741f75d443ac816cd90d5d0941d33fdd0698..2985ad5deecdcb48611ea71ac43e3c2f256c4c08:/src/generic/panelg.cpp diff --git a/src/generic/panelg.cpp b/src/generic/panelg.cpp index 4c58bd15a1..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); } // ---------------------------------------------------------------------------- @@ -124,11 +118,17 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event ) // the event is propagated downwards if the event emitter was our parent bool goingDown = event.GetEventObject() == GetParent(); - // we're not interested in "notebook page change" events here - if ( event.IsWindowChange() ) + 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(); } @@ -143,8 +143,6 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event ) // next acceptable child wxWindowList::Node *node, *start_node; - 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 @@ -244,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 @@ -273,6 +271,7 @@ void wxPanel::OnNavigationKey( wxNavigationKeyEvent& event ) } //else: the child manages its focus itself + event.Skip( FALSE ); return; } @@ -284,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()); @@ -335,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; }