X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb83aca503d1d34532288b73fe85b9857a677e88..43ef6d9ec748053bd32d5e7c01084de3b09ea8af:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 18fc488fd0..457b712767 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -243,6 +243,13 @@ void wxFrame::DoGetClientSize( { RECTL vRect; ::WinQueryWindowRect(GetHwnd(), &vRect); + + // + // No need to use statusbar code as in WIN32 as the FORMATFRAME + // window procedure ensures PM knows about the new frame client + // size internally. A ::WinQueryWindowRect is all that is needed! + // + if (pX) *pX = vRect.xRight - vRect.xLeft; if (pY) @@ -1053,31 +1060,64 @@ void wxFrame::OnActivate( wxActivateEvent& rEvent ) { - for (wxWindowList::Node* pNode = GetChildren().GetFirst(); - pNode; - pNode = pNode->GetNext()) + if ( rEvent.GetActive() ) + { + // restore focus to the child which was last focused + wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd); + + wxWindow* pParent = m_pWinLastFocused ? m_pWinLastFocused->GetParent() + : NULL; + if (!pParent) + { + pParent = this; + } + + wxSetFocusToChild( pParent + ,&m_pWinLastFocused + ); + } + else // deactivating { - // FIXME all this is totally bogus - we need to do the same as wxPanel, - // but how to do it without duplicating the code? + // + // Remember the last focused child if it is our child + // + m_pWinLastFocused = FindFocus(); - // restore focus - wxWindow* pChild = pNode->GetData(); + for (wxWindowList::Node* pNode = GetChildren().GetFirst(); + pNode; + pNode = pNode->GetNext()) + { + // FIXME all this is totally bogus - we need to do the same as wxPanel, + // but how to do it without duplicating the code? - if (!pChild->IsTopLevel() + // restore focus + wxWindow* pChild = pNode->GetData(); + + if (!pChild->IsTopLevel() #if wxUSE_TOOLBAR - && !wxDynamicCast(pChild, wxToolBar) + && !wxDynamicCast(pChild, wxToolBar) #endif // wxUSE_TOOLBAR #if wxUSE_STATUSBAR - && !wxDynamicCast(pChild, wxStatusBar) + && !wxDynamicCast(pChild, wxStatusBar) #endif // wxUSE_STATUSBAR - ) - { - pChild->SetFocus(); - return; + ) + { + pChild->SetFocus(); + return; + } } } } // end of wxFrame::OnActivate +void wxFrame::RemoveChild( + wxWindowBase* pChild +) +{ + if (pChild == m_pWinLastFocused) + m_pWinLastFocused = NULL; + wxFrameBase::RemoveChild(pChild); +} // end of wxFrame::RemoveChild + // ---------------------------------------------------------------------------- // wxFrame size management: we exclude the areas taken by menu/status/toolbars // from the client area, so the client area is what's really available for the @@ -1156,12 +1196,12 @@ void wxFrame::PositionToolBar() } #endif // wxUSE_STATUSBAR - if ( GetToolBar() ) + if ( m_frameToolBar ) { int nToolbarWidth; int nToolbarHeight; - GetToolBar()->GetSize( &nToolbarWidth + m_frameToolBar->GetSize( &nToolbarWidth ,&nToolbarHeight );