X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/859e65deb544f039ff4a889da0a8047a0b8c9ca2..912c192f7b15090c6ab160c6400b9fb01118187c:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index 61e1e63601..feea40e3c5 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -303,8 +303,11 @@ void wxWindowOS2::Init() m_hWndScrollBarHorz = 0L; m_hWndScrollBarVert = 0L; + memset(&m_vWinSwp, '\0', sizeof (SWP)); + // // Pass WM_GETDLGCODE to DefWindowProc() + // m_lDlgCode = 0; m_nXThumbSize = 0; @@ -846,26 +849,31 @@ void wxWindowOS2::SetScrollbar( // owner in terms of the parent frame. // The horz bar is the same width as the owner and 20 pels high. // - ::WinSetWindowPos( m_hWndScrollBarHorz - ,HWND_TOP - ,vSwp.x + vSwpOwner.x - ,(vSwp.y + vSwpOwner.y) - 20 - ,vSwpOwner.cx - ,20 - ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER - ); - ::WinSendMsg( m_hWndScrollBarHorz - ,SBM_SETSCROLLBAR - ,(MPARAM)nPos - ,MPFROM2SHORT(0, (SHORT)nRange1) - ); - ::WinSendMsg( m_hWndScrollBarHorz - ,SBM_SETTHUMBSIZE - ,MPFROM2SHORT( (SHORT)nThumbVisible - ,(SHORT)nRange1 - ) - ,(MPARAM)0 - ); + if (nRange1 >= nThumbVisible) + { + ::WinSetWindowPos( m_hWndScrollBarHorz + ,HWND_TOP + ,vSwp.x + vSwpOwner.x + ,(vSwp.y + vSwpOwner.y) - 20 + ,vSwpOwner.cx + ,20 + ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER + ); + ::WinSendMsg( m_hWndScrollBarHorz + ,SBM_SETSCROLLBAR + ,(MPARAM)nPos + ,MPFROM2SHORT(0, (SHORT)nRange1) + ); + ::WinSendMsg( m_hWndScrollBarHorz + ,SBM_SETTHUMBSIZE + ,MPFROM2SHORT( (SHORT)nThumbVisible + ,(SHORT)nRange1 + ) + ,(MPARAM)0 + ); + } + else + ::WinShowWindow(m_hWndScrollBarHorz, FALSE); } } else @@ -902,7 +910,6 @@ void wxWindowOS2::SetScrollbar( } else { - ::WinQueryWindowPos(hWnd, &vSwpOwner); // // The owner (the scrolled window) is a child of the Frame's // client window, usually. The scrollbars are children of the @@ -918,26 +925,31 @@ void wxWindowOS2::SetScrollbar( // owner window). // It is 20 pels wide and the same height as the owner. // - ::WinSetWindowPos( m_hWndScrollBarVert - ,HWND_TOP - ,vSwp.x + vSwpOwner.x + vSwpOwner.cx - ,vSwp.y + vSwpOwner.y - ,20 - ,vSwpOwner.cy - ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW - ); - ::WinSendMsg( m_hWndScrollBarVert - ,SBM_SETSCROLLBAR - ,(MPARAM)nPos - ,MPFROM2SHORT(0, (SHORT)nRange1) - ); - ::WinSendMsg( m_hWndScrollBarVert - ,SBM_SETTHUMBSIZE - ,MPFROM2SHORT( (SHORT)nThumbVisible - ,(SHORT)nRange1 - ) - ,(MPARAM)0 - ); + if (nRange1 >= nThumbVisible) + { + ::WinSetWindowPos( m_hWndScrollBarVert + ,HWND_TOP + ,vSwp.x + vSwpOwner.x + vSwpOwner.cx + ,vSwp.y + vSwpOwner.y + ,20 + ,vSwpOwner.cy + ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW + ); + ::WinSendMsg( m_hWndScrollBarVert + ,SBM_SETSCROLLBAR + ,(MPARAM)nPos + ,MPFROM2SHORT(0, (SHORT)nRange1) + ); + ::WinSendMsg( m_hWndScrollBarVert + ,SBM_SETTHUMBSIZE + ,MPFROM2SHORT( (SHORT)nThumbVisible + ,(SHORT)nRange1 + ) + ,(MPARAM)0 + ); + } + else + ::WinShowWindow(m_hWndScrollBarVert, FALSE); } m_nYThumbSize = nThumbVisible; } @@ -975,6 +987,7 @@ void wxWindowOS2::ScrollWindow( ,NULL ,SW_SCROLLCHILDREN | SW_INVALIDATERGN ); + Refresh(); } // end of wxWindowOS2::ScrollWindow // --------------------------------------------------------------------------- @@ -1598,17 +1611,23 @@ void wxWindowOS2::DoMoveWindow( // which will cause the scrollbars to be displayed via the SetScrollbar // call in CWindow. // - if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) || - pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) + if ( IsKindOf(CLASSINFO(wxGenericScrolledWindow)) || + IsKindOf(CLASSINFO(wxScrolledWindow)) ) { int nAdjustWidth = 0; int nAdjustHeight = 0; SWP vSwpScroll; - if (GetScrollBarHorz() != NULLHANDLE) + if (GetScrollBarHorz() == NULLHANDLE || + !WinIsWindowShowing(GetScrollBarHorz())) + nAdjustHeight = 0L; + else nAdjustHeight = 20L; - if (GetScrollBarVert() != NULLHANDLE) + if (GetScrollBarVert() == NULLHANDLE || + !WinIsWindowShowing(GetScrollBarVert())) + nAdjustWidth = 0L; + else nAdjustWidth = 20L; ::WinQueryWindowPos(GetHWND(), &vSwpScroll); ::WinSetWindowPos( GetHWND() @@ -1619,7 +1638,7 @@ void wxWindowOS2::DoMoveWindow( ,vSwpScroll.cy - nAdjustHeight ,SWP_MOVE | SWP_SIZE ); - nYDiff += 20; + nYDiff += nAdjustHeight; } MoveChildren(nYDiff); ::WinQueryWindowPos(GetHwnd(), &m_vWinSwp); @@ -3045,37 +3064,6 @@ bool wxWindowOS2::OS2Create( { sClassName += wxT("NR"); } - - // - // If the window being created is a Frame's Statusbar we need to use - // the actual Frame's size, not its client - // - if (pParent) - { - if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) || - pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) - ) - { - if (IsKindOf(CLASSINFO(wxStatusBar)) && - pParent->IsKindOf(CLASSINFO(wxFrame))) - { - RECTL vRect; - wxFrame* pFrame = wxDynamicCast(pParent, wxFrame); - - ::WinQueryWindowRect((HWND)pFrame->GetFrame(), &vRect); - nY = vRect.yTop - (nY + nHeight); - } - else - nY = pParent->GetSize().y - (nY + nHeight); - } - } - else - { - RECTL vRect; - - ::WinQueryWindowRect(HWND_DESKTOP, &vRect); - nY = vRect.yTop - (nY + nHeight); - } m_hWnd = (WXHWND)::WinCreateWindow( (HWND)hParent ,(PSZ)sClassName.c_str() ,(PSZ)zTitle ? zTitle : "" @@ -3098,6 +3086,22 @@ bool wxWindowOS2::OS2Create( } SubclassWin(m_hWnd); SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); + + m_backgroundColour.Set(wxString("GREY")); + + LONG lColor = (LONG)m_backgroundColour.GetPixel(); + + if (!::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Error creating frame. Error: %s\n", sError); + return FALSE; + } SetSize( nX ,nY ,nWidth @@ -3586,7 +3590,71 @@ bool wxWindowOS2::HandlePaint() vEvent.SetEventObject(this); bProcessed = GetEventHandler()->ProcessEvent(vEvent); - return GetEventHandler()->ProcessEvent(vEvent); //bProcessed; + if (!bProcessed && + IsKindOf(CLASSINFO(wxPanel)) && + GetChildren().GetCount() == 0 + ) + { + // + // OS/2 needs to process this right here, not by the default proc + // Window's default proc correctly paints everything, OS/2 does not! + // + HPS hPS; + RECTL vRect; + wxFrame* pFrame; + wxWindow* pParent; + + 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()); + if (m_dwExStyle) + { + LINEBUNDLE vLineBundle; + + vLineBundle.lColor = 0x00000000; // Black + vLineBundle.usMixMode = FM_OVERPAINT; + vLineBundle.fxWidth = 1; + vLineBundle.lGeomWidth = 1; + vLineBundle.usType = LINETYPE_SOLID; + vLineBundle.usEnd = 0; + vLineBundle.usJoin = 0; + ::GpiSetAttrs( hPS + ,PRIM_LINE + ,LBB_COLOR | LBB_MIX_MODE | LBB_WIDTH | LBB_GEOM_WIDTH | LBB_TYPE + ,0L + ,&vLineBundle + ); + ::WinQueryWindowRect(GetHwnd(), &vRect); + wxDrawBorder( hPS + ,vRect + ,m_dwExStyle + ); + } + ::WinEndPaint(hPS); + } + bProcessed = TRUE; + } + + return bProcessed; } // end of wxWindowOS2::HandlePaint bool wxWindowOS2::HandleEraseBkgnd( @@ -4112,12 +4180,12 @@ void wxWindowOS2::MoveChildren( vSwp.x -= pCtrl->GetXComp(); } ::WinSetWindowPos( GetHwndOf(pWin) - ,HWND_BOTTOM + ,HWND_TOP ,vSwp.x ,vSwp.y - nDiff ,vSwp.cx ,vSwp.cy - ,SWP_MOVE | SWP_ZORDER + ,SWP_MOVE | SWP_SHOW | SWP_ZORDER ); ::WinQueryWindowPos(GetHwndOf(pWin), pWin->GetSwp()); if (pWin->IsKindOf(CLASSINFO(wxRadioBox))) @@ -4145,6 +4213,7 @@ void wxWindowOS2::MoveChildren( ); } } + Refresh(); } // end of wxWindowOS2::MoveChildren // @@ -4207,41 +4276,14 @@ int wxWindowOS2::GetOS2ParentHeight( return(pParent->GetClientSize().y); } // - // Case 3a -- One of many Frame children. Will be positioned normally - // - else if (pParent->GetChildren().GetCount() > 1) - return(pParent->GetClientSize().y); - // - // Case 3b -- 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. + // Case -- 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(pParent->GetClientSize().y); } return(0L); } // end of wxWindowOS2::GetOS2ParentHeight