X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c299c3ab663257429983c24e6fb71450f3cf9f1..8c23ed4e210434ceea7edaa45382fd749a0256db:/src/os2/window.cpp?ds=sidebyside diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 2c16e35794..e06c94650c 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -147,6 +147,9 @@ static void TranslateKbdEventToMouse( wxWindow* pWin // static inline bool IsShiftDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000) != 0; } static inline bool IsCtrlDown() { return (::WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) != 0; } + +static wxWindow* gpWinBeingCreated = NULL; + // --------------------------------------------------------------------------- // event tables // --------------------------------------------------------------------------- @@ -1305,6 +1308,27 @@ void wxWindowOS2::Clear() vDc.Clear(); } // end of wxWindowOS2::Clear +void wxWindowOS2::Update() +{ + ::WinUpdateWindow(GetHwnd()); +} // end of wxWindowOS2::Update + +void wxWindowOS2::Freeze() +{ + ::WinSendMsg(GetHwnd(), WM_VRNDISABLED, (MPARAM)0, (MPARAM)0); +} // end of wxWindowOS2::Freeze + +void wxWindowOS2::Thaw() +{ + ::WinSendMsg(GetHwnd(), WM_VRNENABLED, (MPARAM)TRUE, (MPARAM)0); + + // + // We need to refresh everything or otherwise he invalidated area is not + // repainted. + // + Refresh(); +} // end of wxWindowOS2::Thaw + void wxWindowOS2::Refresh( bool bEraseBack , const wxRect* pRect @@ -1521,19 +1545,9 @@ void wxWindowOS2::DoMoveWindow( if (pParent) { - hParent = GetWinHwnd(pParent); - if (pParent->IsKindOf(CLASSINFO(wxFrame))) - { - if (IsKindOf(CLASSINFO(wxStatusBar)) || - IsKindOf(CLASSINFO(wxMenuBar)) || - IsKindOf(CLASSINFO(wxToolBar)) - ) - nY = pParent->GetSize().y - (nY + nHeight); - else - nY = pParent->GetClientSize().y - (nY + nHeight); - } - else - nY = pParent->GetSize().y - (nY + nHeight); + int nOS2Height = GetOS2ParentHeight(pParent); + + nY = nOS2Height - (nY + nHeight); } else { @@ -1812,6 +1826,26 @@ void wxWindowOS2::GetTextExtent( ::WinReleasePS(hPS); } // end of wxWindow::GetTextExtent +bool wxWindowOS2::IsMouseInWindow() const +{ + // + // Get the mouse position + POINTL vPt; + + ::WinQueryPointerPos(HWND_DESKTOP, &vPt); + + // + // Find the window which currently has the cursor and go up the window + // chain until we find this window - or exhaust it + // + HWND hWnd = ::WinWindowFromPoint(HWND_DESKTOP, &vPt, TRUE); + + while (hWnd && (hWnd != GetHwnd())) + hWnd = ::WinQueryWindow(hWnd, QW_PARENT); + + return hWnd != NULL; +} // end of wxWindowOS2::IsMouseInWindow + #if wxUSE_CARET && WXWIN_COMPATIBILITY // --------------------------------------------------------------------------- // Caret manipulation @@ -2785,6 +2819,46 @@ void wxWindowOS2::OS2DetachWindowMenu() #endif // __WXUNIVERSAL__ } // end of wxWindowOS2::OS2DetachWindowMenu +bool wxWindowOS2::OS2GetCreateWindowCoords( + const wxPoint& rPos +, const wxSize& rSize +, int& rnX +, int& rnY +, int& rnWidth +, int& rnHeight +) const +{ + bool bNonDefault = FALSE; + + if (rPos.x == -1) + { + // + // If set x to CW_USEDEFAULT, y parameter is ignored anyhow so we can + // just as well set it to CW_USEDEFAULT as well + rnX = rnY = CW_USEDEFAULT; + } + else + { + rnX = rPos.x; + rnY = rPos.y == -1 ? CW_USEDEFAULT : rPos.y; + bNonDefault = TRUE; + } + if (rSize.x == -1) + { + // + // As abobe, h is not used at all in this case anyhow + // + rnWidth = rnHeight = CW_USEDEFAULT; + } + else + { + rnWidth = rSize.x; + rnHeight = rSize.y == -1 ? CW_USEDEFAULT : rSize.y; + bNonDefault = TRUE; + } + return bNonDefault; +} // end of wxWindowOS2::OS2GetCreateWindowCoords + bool wxWindowOS2::OS2Create( WXHWND hParent , PSZ zClass @@ -3899,6 +3973,174 @@ bool wxWindowOS2::OS2OnScroll( return GetEventHandler()->ProcessEvent(vEvent); } // end of wxWindowOS2::OS2OnScroll +void wxWindowOS2::MoveChildren( + int nDiff +) +{ + SWP vSwp; + + for (wxWindowList::Node* pNode = GetChildren().GetFirst(); + pNode; + pNode = pNode->GetNext()) + { + wxWindow* pWin = pNode->GetData(); + + ::WinQueryWindowPos( GetHwndOf(pWin) + ,&vSwp + ); + if (pWin->IsKindOf(CLASSINFO(wxControl))) + { + wxControl* pCtrl; + + // + // 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. + // + pCtrl = wxDynamicCast(pWin, wxControl); + vSwp.y -= pCtrl->GetYComp(); + vSwp.x -= pCtrl->GetXComp(); + } + ::WinSetWindowPos( GetHwndOf(pWin) + ,HWND_TOP + ,vSwp.x + ,vSwp.y - nDiff + ,vSwp.cx + ,vSwp.cy + ,SWP_MOVE + ); + if (pWin->IsKindOf(CLASSINFO(wxRadioBox))) + { + wxRadioBox* pRadioBox; + + pRadioBox = wxDynamicCast(pWin, wxRadioBox); + pRadioBox->AdjustButtons( (int)vSwp.x + ,(int)vSwp.y - nDiff + ,(int)vSwp.cx + ,(int)vSwp.cy + ,pRadioBox->GetSizeFlags() + ); + } + if (pWin->IsKindOf(CLASSINFO(wxSlider))) + { + wxSlider* pSlider; + + pSlider = wxDynamicCast(pWin, wxSlider); + pSlider->AdjustSubControls( (int)vSwp.x + ,(int)vSwp.y - nDiff + ,(int)vSwp.cx + ,(int)vSwp.cy + ,(int)pSlider->GetSizeFlags() + ); + } + } +} // end of wxWindowOS2::MoveChildren + +// +// Getting the Y position for a window, like a control, is a real +// pain. There are three sitatuions we must deal with in determining +// the OS2 to wxWindows Y coordinate. +// +// 1) The controls are created in a dialog. +// This is the easiest since a dialog is created with its original +// size so the standard: Y = ParentHeight - (Y + ControlHeight); +// +// 2) The controls are direct children of a frame +// In this instance the controls are actually children of the Frame's +// client. During creation the frame's client resizes several times +// during creation of the status bar and toolbars. The CFrame class +// will take care of this using its AlterChildPos proc. +// +// 3) The controls are children of a panel, which in turn is a child of +// a frame. +// This is the nastiest case. A panel is created as the only child of +// the frame and as such, when a frame has only one child, the child is +// expanded to fit the entire client area of the frame. Because the +// controls are created BEFORE this occurs their positions are totally +// whacked and any call to WinQueryWindowPos will return invalid +// coordinates. So for this situation we have to compare the size of +// the panel at control creation time with that of the frame client. If +// they are the same we can use the standard Y position equation. If +// not, then we must use the Frame Client's dimensions to position them +// as that will be the eventual size of the panel after the frame resizes +// it! +// +int wxWindowOS2::GetOS2ParentHeight( + wxWindowOS2* pParent +) +{ + wxWindowOS2* pGrandParent = NULL; + + // + // Case 1 + // + if (pParent->IsKindOf(CLASSINFO(wxDialog))) + return(pParent->GetSize().y); + + // + // Case 2 -- if we are one of the separately built standard Frame + // children, like a statusbar, menubar, or toolbar we want to + // use the frame, itself, for positioning. Otherwise we are + // child window and want to use the Frame's client. + // + else if (pParent->IsKindOf(CLASSINFO(wxFrame))) + { + if (IsKindOf(CLASSINFO(wxStatusBar)) || + IsKindOf(CLASSINFO(wxMenuBar)) || + IsKindOf(CLASSINFO(wxToolBar)) + ) + return(pParent->GetSize().y); + else + return(pParent->GetClientSize().y); + } + + // + // Case 3 -- this is for any window that is the sole child of a Frame. + // The grandparent must exist and it must be of type CFrame + // and it's height must be different. Otherwise the standard + // applies. + // + else + { + pGrandParent = pParent->GetParent(); + if (pGrandParent && + pGrandParent->IsKindOf(CLASSINFO(wxFrame)) && + pGrandParent->GetClientSize().y != pParent->GetSize().y + ) + { + int nParentHeight = 0L; + int nStatusBarHeight = 0L; + wxFrame* pFrame = wxDynamicCast(pGrandParent, wxFrame); + wxStatusBar* pStatbar = pFrame->GetStatusBar(); + + nParentHeight = pGrandParent->GetClientSize().y; + if (pStatbar) + nStatusBarHeight = pStatbar->GetSize().y; + nParentHeight -= nStatusBarHeight; + return(nParentHeight); + } + else + // + // Panel is a child of some other kind of window so we'll + // just use it's original size + // + return(pParent->GetClientSize().y); + } + return(0L); +} // end of wxWindowOS2::GetOS2ParentHeight + +wxWindowCreationHook::wxWindowCreationHook( + wxWindow* pWinBeingCreated +) +{ + gpWinBeingCreated = pWinBeingCreated; +} // end of wxWindowCreationHook::wxWindowCreationHook + +wxWindowCreationHook::~wxWindowCreationHook() +{ + gpWinBeingCreated = NULL; +} // end of wxWindowCreationHook::~wxWindowCreationHook + // =========================================================================== // global functions // ===========================================================================