X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e58dab20ce995856303154a367bcca904066525c..9f7948af90ec2e3b907944e7d979f0863910c5c8:/src/os2/frame.cpp?ds=sidebyside diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 4b5e439c6a..96743fc979 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -67,7 +67,6 @@ extern void wxAssociateWinWithHandle( HWND hWnd // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) - EVT_ACTIVATE(wxFrame::OnActivate) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() @@ -101,7 +100,6 @@ void wxFrame::Init() m_nFsToolBarHeight = 0; m_hWndToolTip = 0L; m_bWasMinimized = FALSE; - m_pWinLastFocused = NULL; m_frameMenuBar = NULL; @@ -210,21 +208,6 @@ void wxFrame::Raise() ); } -// generate an artificial resize event -void wxFrame::SendSizeEvent() -{ - if (!m_bIconized) - { - RECTL vRect = wxGetWindowRect(GetHwnd()); - - (void)::WinPostMsg( m_hFrame - ,WM_SIZE - ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom) - ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom) - ); - } -} - #if wxUSE_STATUSBAR wxStatusBar* wxFrame::OnCreateStatusBar( int nNumber @@ -328,13 +311,36 @@ void wxFrame::PositionStatusBar() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for StautsBar. Error: %s\n", sError); + wxLogError("Error setting parent for StautsBar. Error: %s\n", sError.c_str()); return; } } } // end of wxFrame::PositionStatusBar #endif // wxUSE_STATUSBAR +#if wxUSE_TOOLBAR +wxToolBar* wxFrame::OnCreateToolBar( + long lStyle +, wxWindowID vId +, const wxString& rsName +) +{ + wxToolBar* pToolBar = wxFrameBase::OnCreateToolBar( lStyle + ,vId + ,rsName + ); + + ::WinSetParent( pToolBar->GetHWND() + ,m_hFrame + ,FALSE + ); + ::WinSetOwner( pToolBar->GetHWND() + ,m_hFrame + ); + return pToolBar; +} // end of WinGuiBase_CFrame::OnCreateToolBar +#endif + #if wxUSE_MENUS_NATIVE void wxFrame::DetachMenuBar() { @@ -448,14 +454,14 @@ void wxFrame::InternalSetMenuBar() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for submenu. Error: %s\n", sError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str()); } if (!::WinSetOwner(m_hMenu, m_hFrame)) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for submenu. Error: %s\n", sError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str()); } ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0); } // end of wxFrame::InternalSetMenuBar @@ -673,70 +679,13 @@ bool wxFrame::ShowFullScreen( ,m_vFsOldSize.height ,SWP_SIZE | SWP_SHOW ); - return TRUE; } + return wxFrameBase::ShowFullScreen(bShow, lStyle); } // end of wxFrame::ShowFullScreen // // Frame window // -// -// Default activation behaviour - set the focus for the first child -// subwindow found. -// -void wxFrame::OnActivate( - wxActivateEvent& rEvent -) -{ - 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 - { - // - // Remember the last focused child if it is our child - // - m_pWinLastFocused = FindFocus(); - - 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? - - // restore focus - wxWindow* pChild = pNode->GetData(); - - if (!pChild->IsTopLevel() -#if wxUSE_TOOLBAR - && !wxDynamicCast(pChild, wxToolBar) -#endif // wxUSE_TOOLBAR -#if wxUSE_STATUSBAR - && !wxDynamicCast(pChild, wxStatusBar) -#endif // wxUSE_STATUSBAR - ) - { - pChild->SetFocus(); - return; - } - } - } -} // end of wxFrame::OnActivate - // ---------------------------------------------------------------------------- // 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 @@ -746,29 +695,13 @@ void wxFrame::OnActivate( // Checks if there is a toolbar, and returns the first free client position wxPoint wxFrame::GetClientAreaOrigin() const { - wxPoint vPoint(0, 0); - -#if wxUSE_TOOLBAR - if (GetToolBar()) - { - int nWidth; - int nHeight; - - GetToolBar()->GetSize( &nWidth - ,&nHeight - ); + wxPoint vPoint = wxTopLevelWindow::GetClientAreaOrigin(); - if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL) - { - vPoint.x += nWidth; - } - else - { - // PM is backwards from windows - vPoint.y += nHeight; - } - } -#endif //wxUSE_TOOLBAR + // + // In OS/2 the toolbar and statusbar are frame extensions so there is no + // adjustment. The client is supposedly resized for a toolbar in OS/2 + // as it is for the status bar. + // return vPoint; } // end of wxFrame::GetClientAreaOrigin @@ -796,53 +729,59 @@ wxToolBar* wxFrame::CreateToolBar( void wxFrame::PositionToolBar() { + wxToolBar* pToolBar = GetToolBar(); + wxCoord vWidth; + wxCoord vHeight; + wxCoord vTWidth; + wxCoord vTHeight; + + if (!pToolBar) + return; + HWND hWndClient; RECTL vRect; + RECTL vFRect; + SWP vSwp; + wxPoint vPos; - ::WinQueryWindowRect(GetHwnd(), &vRect); + ::WinQueryWindowRect(m_hFrame, &vRect); + vPos.y = (wxCoord)vRect.yTop; + ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2); + vFRect = vRect; + ::WinCalcFrameRect(m_hFrame, &vRect, TRUE); -#if wxUSE_STATUSBAR - if (GetStatusBar()) - { - int nStatusX; - int nStatusY; + vPos.y = (wxCoord)(vFRect.yTop - vRect.yTop); + pToolBar->GetSize( &vTWidth + ,&vTHeight + ); - GetStatusBar()->GetClientSize( &nStatusX - ,&nStatusY - ); - // PM is backwards from windows - vRect.yBottom += nStatusY; + if (pToolBar->GetWindowStyleFlag() & wxTB_HORIZONTAL) + { + vWidth = (wxCoord)(vRect.xRight - vRect.xLeft); + pToolBar->SetSize( vRect.xLeft - vFRect.xLeft + ,vPos.y + ,vWidth + ,vTHeight + ); } -#endif // wxUSE_STATUSBAR - - if ( m_frameToolBar ) + else { - int nToolbarWidth; - int nToolbarHeight; - - m_frameToolBar->GetSize( &nToolbarWidth - ,&nToolbarHeight - ); - - if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL) - { - nToolbarHeight = vRect.yBottom; - } - else - { - nToolbarWidth = vRect.xRight; - } + wxCoord vSwidth = 0; + wxCoord vSheight = 0; - // - // Use the 'real' PM position here - // - GetToolBar()->SetSize( 0 - ,0 - ,nToolbarWidth - ,nToolbarHeight - ,wxSIZE_NO_ADJUSTMENTS - ); + if (m_frameStatusBar) + m_frameStatusBar->GetSize( &vSwidth + ,&vSheight + ); + vHeight = (wxCoord)(vRect.yTop - vRect.yBottom); + pToolBar->SetSize( vRect.xLeft - vFRect.xLeft + ,vPos.y + ,vTWidth + ,vHeight - vSheight + ); } + if( ::WinIsWindowShowing(m_hFrame) ) + ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); } // end of wxFrame::PositionToolBar #endif // wxUSE_TOOLBAR @@ -938,9 +877,10 @@ bool wxFrame::HandlePaint() // // Icons in PM are the same as "pointers" // + const wxIcon& vIcon = GetIcon(); HPOINTER hIcon; - if (m_icon.Ok()) + if (vIcon.Ok()) hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L); else hIcon = (HPOINTER)m_hDefaultIcon; @@ -1086,15 +1026,10 @@ bool wxFrame::HandleSize( PositionToolBar(); #endif // wxUSE_TOOLBAR - wxSizeEvent vEvent( wxSize( nX - ,nY - ) - ,m_windowId - ); - - vEvent.SetEventObject(this); - bProcessed = GetEventHandler()->ProcessEvent(vEvent); - AlterChildPos(); + bProcessed = wxWindow::HandleSize( nX + ,nY + ,nId + ); } return bProcessed; } // end of wxFrame::HandleSize @@ -1165,6 +1100,11 @@ bool wxFrame::HandleMenuSelect( vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); // return value would be ignored by PM } + else + { + DoGiveHelp(wxEmptyString, FALSE); + return FALSE; + } } return TRUE; } // end of wxFrame::HandleMenuSelect @@ -1206,10 +1146,12 @@ MRESULT EXPENTRY wxFrameMainWndProc( int nItemCount; int i; PSWP pSWP = NULL; - SWP vSwpStb; RECTL vRectl; RECTL vRstb; - int nHeight=0; + RECTL vRtlb; + int nHeight = 0; + int nHeight2 = 0; + int nWidth = 0; pSWP = (PSWP)PVOIDFROMMP(wParam); nItemCount = SHORT1FROMMR(pWnd->m_fnOldWndProc(hWnd, ulMsg, wParam, lParam)); @@ -1217,18 +1159,11 @@ MRESULT EXPENTRY wxFrameMainWndProc( { ::WinQueryWindowRect(pWnd->m_frameStatusBar->GetHWND(), &vRstb); pWnd->m_frameStatusBar->GetSize(NULL, &nHeight); - ::WinQueryWindowRect(pWnd->m_hFrame, &vRectl); - ::WinMapWindowPoints(pWnd->m_hFrame, HWND_DESKTOP, (PPOINTL)&vRectl, 2); - vRstb = vRectl; - ::WinCalcFrameRect(pWnd->m_hFrame, &vRectl, TRUE); - - vSwpStb.x = vRectl.xLeft - vRstb.xLeft; - vSwpStb.y = vRectl.yBottom - vRstb.yBottom; - vSwpStb.cx = vRectl.xRight - vRectl.xLeft - 1; //?? -1 ?? - vSwpStb.cy = nHeight; - vSwpStb.fl = SWP_SIZE |SWP_MOVE | SWP_SHOW; - vSwpStb.hwnd = pWnd->m_frameStatusBar->GetHWND(); - vSwpStb.hwndInsertBehind = HWND_TOP; + } + if(pWnd->m_frameToolBar) + { + ::WinQueryWindowRect(pWnd->m_frameToolBar->GetHWND(), &vRtlb); + pWnd->m_frameToolBar->GetSize(&nWidth, &nHeight2); } ::WinQueryWindowRect(pWnd->m_hFrame, &vRectl); ::WinMapWindowPoints(pWnd->m_hFrame, HWND_DESKTOP, (PPOINTL)&vRectl, 2); @@ -1238,10 +1173,20 @@ MRESULT EXPENTRY wxFrameMainWndProc( { if(pWnd->m_hWnd && pSWP[i].hwnd == pWnd->m_hWnd) { - pSWP[i].x = vRectl.xLeft; - pSWP[i].y = vRectl.yBottom + nHeight; - pSWP[i].cx = vRectl.xRight - vRectl.xLeft; - pSWP[i].cy = vRectl.yTop - vRectl.yBottom - nHeight; + if (pWnd->m_frameToolBar && pWnd->m_frameToolBar->GetWindowStyleFlag() & wxTB_HORIZONTAL) + { + pSWP[i].x = vRectl.xLeft; + pSWP[i].y = vRectl.yBottom + nHeight; + pSWP[i].cx = vRectl.xRight - vRectl.xLeft; + pSWP[i].cy = vRectl.yTop - vRectl.yBottom - (nHeight + nHeight2); + } + else + { + pSWP[i].x = vRectl.xLeft + nWidth; + pSWP[i].y = vRectl.yBottom + nHeight; + pSWP[i].cx = vRectl.xRight - (vRectl.xLeft + nWidth); + pSWP[i].cy = vRectl.yTop - vRectl.yBottom - nHeight; + } pSWP[i].fl = SWP_SIZE | SWP_MOVE | SWP_SHOW; pSWP[i].hwndInsertBehind = HWND_TOP; } @@ -1395,9 +1340,10 @@ MRESULT wxFrame::OS2WindowProc( case CM_QUERYDRAGIMAGE: { + const wxIcon& vIcon = GetIcon(); HPOINTER hIcon; - if (m_icon.Ok()) + if (vIcon.Ok()) hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L); else hIcon = (HPOINTER)m_hDefaultIcon; @@ -1474,3 +1420,22 @@ wxWindow* wxFrame::GetClient() { return wxFindWinFromHandle((WXHWND)::WinWindowFromID(m_hFrame, FID_CLIENT)); } + +void wxFrame::SendSizeEvent() +{ + if (!m_bIconized) + { + RECTL vRect = wxGetWindowRect(GetHwnd()); + + ::WinPostMsg( GetHwnd() + ,WM_SIZE + ,MPFROM2SHORT( vRect.xRight - vRect.xLeft + ,vRect.xRight - vRect.xLeft + ) + ,MPFROM2SHORT( vRect.yTop - vRect.yBottom + ,vRect.yTop - vRect.yBottom + ) + ); + } +} +