X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d53fc3442b92a52dd24a40fee6a201c1b931987..8c23ed4e210434ceea7edaa45382fd749a0256db:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index e948ffeaf3..bc13037ef5 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -108,6 +108,7 @@ void wxFrame::Init() m_nFsStatusBarHeight = 0; m_nFsToolBarHeight = 0; m_bFsIsMaximized = FALSE; + m_bWasMinimized = FALSE; m_bFsIsShowing = FALSE; m_bIsShown = FALSE; m_pWinLastFocused = (wxWindow *)NULL; @@ -236,6 +237,53 @@ wxFrame::~wxFrame() } } // end of wxFrame::~wxFrame +// +// IF we have child controls in the Frame's client we need to alter +// the y position, because, OS/2 controls are positioned relative to +// wxWindows orgin (top left) not the OS/2 origin (bottom left) +void wxFrame::AlterChildPos() +{ + // + // OS/2 is the only OS concerned about this + // + wxWindow* pChild = NULL; + wxControl* pCtrl = NULL; + RECTL vRect; + SWP vSwp; + + ::WinQueryWindowRect(GetHwnd(), &vRect); + for (wxWindowList::Node* pNode = GetChildren().GetFirst(); + pNode; + pNode = pNode->GetNext()) + { + wxWindow* pChild = pNode->GetData(); + + ::WinQueryWindowPos(pChild->GetHWND(), &vSwp); + vSwp.y += (vRect.yTop - m_vSwpClient.cy); + if (pChild->IsKindOf(CLASSINFO(wxControl))) + { + pCtrl = wxDynamicCast(pChild, wxControl); + // + // Must deal with controls that have margins like ENTRYFIELD. The SWP + // struct of such a control will have and origin offset from its intended + // position by the width of the margins. + // + vSwp.y -= pCtrl->GetYComp(); + vSwp.x -= pCtrl->GetXComp(); + } + ::WinSetWindowPos( pChild->GetHWND() + ,HWND_TOP + ,vSwp.x + ,vSwp.y + ,vSwp.cx + ,vSwp.cy + ,SWP_MOVE + ); + ::WinQueryWindowPos(pChild->GetHWND(), &vSwp); + pChild = NULL; + } +} // end of wxFrame::AlterChildPos + // // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. // @@ -280,25 +328,23 @@ void wxFrame::DoSetClientSize( // and the client area; add this to the new client size to move the // window. Remember OS/2's backwards y coord system! // - int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth; - int nActualHeight = vRect2.yTop + vRect2.yTop - vRect.yTop + nHeight; + int nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight; + int nActualHeight = vRect2.yTop + vRect2.yTop - vRect.yTop; #if wxUSE_STATUSBAR - if ( GetStatusBar() ) - { - int nStatusX; - int nStatusY; + wxStatusBar* pStatusBar = GetStatusBar(); - GetStatusBar()->GetClientSize( &nStatusX - ,&nStatusY - ); - nActualHeight += nStatusY; + if (pStatusBar && pStatusBar->IsShown()) + { + nActualHeight += pStatusBar->GetSize().y; } + #endif // wxUSE_STATUSBAR wxPoint vPoint(GetClientAreaOrigin()); - nActualWidth += vPoint.y; - nActualHeight += vPoint.x; + + nActualWidth += vPoint.x; + nActualHeight += vPoint.y; POINTL vPointl; @@ -365,9 +411,19 @@ bool wxFrame::Show( bool bShow ) { + int nShowCmd; SWP vSwp; - DoShowWindow((int)bShow); + if (bShow) + { + nShowCmd = SWP_SHOW; + } + else // hide + { + nShowCmd = SWP_HIDE; + } + + DoShowWindow(nShowCmd); if (bShow) { @@ -375,6 +431,7 @@ bool wxFrame::Show( ::WinQueryWindowPos(m_hFrame, &vSwp); m_bIconized = vSwp.fl & SWP_MINIMIZE; + ::WinQueryWindowPos(m_hWnd, &m_vSwpClient); ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0); ::WinEnableWindow(m_hFrame, TRUE); vEvent.SetEventObject(this); @@ -518,6 +575,7 @@ void wxFrame::PositionStatusBar() if (m_frameStatusBar) { int nWidth; + int nY; int nStatbarWidth; int nStatbarHeight; HWND hWndClient; @@ -525,21 +583,24 @@ void wxFrame::PositionStatusBar() RECTL vFRect; ::WinQueryWindowRect(m_hFrame, &vRect); + nY = vRect.yTop; ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2); vFRect = vRect; ::WinCalcFrameRect(m_hFrame, &vRect, TRUE); nWidth = vRect.xRight - vRect.xLeft; + nY = nY - (vRect.yBottom - vFRect.yBottom); m_frameStatusBar->GetSize( &nStatbarWidth ,&nStatbarHeight ); + nY= nY - nStatbarHeight; // // Since we wish the status bar to be directly under the client area, // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS. // m_frameStatusBar->SetSize( vRect.xLeft - vFRect.xLeft - ,vRect.yBottom - vFRect.yBottom + ,nY ,nWidth ,nStatbarHeight ); @@ -1056,6 +1117,17 @@ bool wxFrame::OS2Create( // Now size everything. If adding a menu the client will need to be resized. // + if (pParent) + { + nY = pParent->GetSize().y - (nY + nHeight); + } + else + { + RECTL vRect; + + ::WinQueryWindowRect(HWND_DESKTOP, &vRect); + nY = vRect.yTop - (nY + nHeight); + } if (!::WinSetWindowPos( m_hFrame ,HWND_TOP ,nX @@ -1070,23 +1142,6 @@ bool wxFrame::OS2Create( wxLogError("Error sizing frame. Error: %s\n", sError); return FALSE; } - // - // We may have to be smarter here when variable sized toolbars are added! - // - if (!::WinSetWindowPos( m_hWnd - ,HWND_TOP - ,nX // + 20 - ,nY // + 20 - ,nWidth // - 60 - ,nHeight // - 60 - ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER - )) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - wxLogError("Error sizing client. Error: %s\n", sError); - return FALSE; - } return TRUE; } // end of wxFrame::OS2Create @@ -1274,10 +1329,30 @@ void wxFrame::IconizeChildFrames( pNode = pNode->GetNext() ) { wxWindow* pWin = pNode->GetData(); + wxFrame* pFrame = wxDynamicCast(pWin, wxFrame); - if (pWin->IsKindOf(CLASSINFO(wxFrame)) ) + if ( pFrame +#if wxUSE_MDI_ARCHITECTURE + && !wxDynamicCast(pFrame, wxMDIChildFrame) +#endif // wxUSE_MDI_ARCHITECTURE + ) { - ((wxFrame *)pWin)->Iconize(bIconize); + // + // We don't want to restore the child frames which had been + // iconized even before we were iconized, so save the child frame + // status when iconizing the parent frame and check it when + // restoring it. + // + if (bIconize) + { + pFrame->m_bWasMinimized = pFrame->IsIconized(); + } + + // + // This test works for both iconizing and restoring + // + if (!pFrame->m_bWasMinimized) + pFrame->Iconize(bIconize); } } } // end of wxFrame::IconizeChildFrames @@ -1361,7 +1436,40 @@ bool wxFrame::HandlePaint() } else { - return(wxWindow::HandlePaint()); + if (!wxWindow::HandlePaint()) + { + HPS hPS; + RECTL vRect; + + hPS = ::WinBeginPaint( GetHwnd() + ,NULLHANDLE + ,&vRect + ); + if(hPS) + { + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + ); + ::GpiCreateLogColorTable( hPS + ,0L + ,LCOLF_RGB + ,0L + ,0L + ,NULL + ); + + ::WinFillRect( hPS + ,&vRect + ,GetBackgroundColour().GetPixel() + ); + ::WinEndPaint(hPS); + } + } + return TRUE; } } else @@ -1446,6 +1554,7 @@ bool wxFrame::HandleSize( vEvent.SetEventObject(this); bProcessed = GetEventHandler()->ProcessEvent(vEvent); + AlterChildPos(); } return bProcessed; } // end of wxFrame::HandleSize