X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/402e2f7cf8f05f93846258f658865d780342925a..1f3943e0276719ed5fc94bb93765df69f91ba10c:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index ce16cbc0c7..94d3060d5e 100644 --- a/src/os2/window.cpp +++ b/src/os2/window.cpp @@ -329,6 +329,7 @@ bool wxWindow::Create( ) { HWND hParent = NULLHANDLE; + wxPoint vPos = rPos; // The OS/2 position wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent")); @@ -346,9 +347,19 @@ bool wxWindow::Create( { pParent->AddChild(this); hParent = GetWinHwnd(pParent); + // + // OS2 uses normal coordinates, no bassackwards Windows ones + // + vPos.y = pParent->GetSize().y - (vPos.y + rSize.y); } else - hParent = HWND_DESKTOP; + { + RECTL vRect; + + ::WinQueryWindowRect(HWND_DESKTOP, &vRect); + hParent = HWND_DESKTOP; + vPos.y = vRect.yTop - (vPos.y + rSize.y); + } ULONG ulCreateFlags = 0L; @@ -382,8 +393,8 @@ bool wxWindow::Create( ,(PSZ)wxCanvasClassName ,rName.c_str() ,ulCreateFlags - ,rPos.x - ,rPos.y + ,vPos.x + ,vPos.y ,WidthDefault(rSize.x) ,HeightDefault(rSize.y) ,NULLHANDLE @@ -1983,15 +1994,16 @@ MRESULT wxWindow::OS2WindowProc( case WM_DRAWITEM: case WM_MEASUREITEM: { - int idCtrl = (UINT)wParam; + int nIdCtrl = (UINT)wParam; + if ( uMsg == WM_DRAWITEM ) { - bProcessed = OS2OnDrawItem(idCtrl, + bProcessed = OS2OnDrawItem(nIdCtrl, (WXDRAWITEMSTRUCT *)lParam); } else { - bProcessed = OS2OnMeasureItem(idCtrl, + bProcessed = OS2OnMeasureItem(nIdCtrl, (WXMEASUREITEMSTRUCT *)lParam); } @@ -2656,55 +2668,135 @@ bool wxWindow::OS2OnDrawItem( { wxDC vDc; +#if wxUSE_OWNER_DRAWN // // Is it a menu item? // if (vId == 0) { - -#if wxUSE_OWNER_DRAWN + ERRORID vError; + wxString sError; POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; - wxMenuItem vMenuItem; + wxFrame* pFrame = (wxFrame*)this; + wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem); HDC hDC = ::GpiQueryDevice(pMeasureStruct->hps); - + wxRect vRect( pMeasureStruct->rclItem.xLeft + ,pMeasureStruct->rclItem.yBottom + ,pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft + ,pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom + ); vDc.SetHDC( hDC ,FALSE ); vDc.SetHPS(pMeasureStruct->hps); - // - // We stored the CMenuItem itself into the menuitem text field so now - // we need to extract it. + // Load the wxWindows Pallete and set to RGB mode // - ::WinSendMsg( pMeasureStruct->hItem - ,MM_QUERYITEMTEXT - ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem - ,(SHORT)(sizeof(wxMenuItem)) - ) - ,(PSZ)&vMenuItem - ); + if (!::GpiCreateLogColorTable( pMeasureStruct->hps + ,0L + ,LCOLF_CONSECRGB + ,0L + ,(LONG)wxTheColourDatabase->m_nSize + ,(PLONG)wxTheColourDatabase->m_palTable + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Unable to set current color table. Error: %s\n", sError); + } + // + // Set the color table to RGB mode + // + if (!::GpiCreateLogColorTable( pMeasureStruct->hps + ,0L + ,LCOLF_RGB + ,0L + ,0L + ,NULL + )) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError("Unable to set current color table. Error: %s\n", sError); + } - wxRect vRect( pMeasureStruct->rclItem.xLeft - ,pMeasureStruct->rclItem.yTop - ,pMeasureStruct->rclItem.xRight - ,pMeasureStruct->rclItem.yBottom - ); + wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); - wxOwnerDrawn::wxODAction eAction; - // - // Attribute applies to menuitems, fsState to listbox and other controls - // + int eAction = 0; + int eStatus = 0; + if (pMeasureStruct->fsAttribute == pMeasureStruct->fsAttributeOld) + { + // + // Entire Item needs to be redrawn (either it has reappeared from + // behind another window or is being displayed for the first time + // eAction = wxOwnerDrawn::wxODDrawAll; - else - eAction = wxOwnerDrawn::wxODSelectChanged; - return(vMenuItem.OnDrawItem( vDc - ,vRect - ,eAction - ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute - )); + if (pMeasureStruct->fsAttribute & MIA_HILITED) + { + // + // If it is currently selected we let the system handle it + // + eStatus |= wxOwnerDrawn::wxODSelected; + } + if (pMeasureStruct->fsAttribute & MIA_CHECKED) + { + // + // If it is currently checked we draw our own + // + eStatus |= wxOwnerDrawn::wxODChecked; + pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_CHECKED; + } + if (pMeasureStruct->fsAttribute & MIA_DISABLED) + { + // + // If it is currently disabled we let the system handle it + // + eStatus |= wxOwnerDrawn::wxODDisabled; + } + // + // Don't really care about framed (indicationg focus) or NoDismiss + // + } + else + { + if (pMeasureStruct->fsAttribute & MIA_HILITED) + { + eAction = wxOwnerDrawn::wxODDrawAll; + eStatus |= wxOwnerDrawn::wxODSelected; + // + // Keep the system from trying to highlight with its bogus colors + // + pMeasureStruct->fsAttributeOld = pMeasureStruct->fsAttribute &= ~MIA_HILITED; + } + else if (!(pMeasureStruct->fsAttribute & MIA_HILITED)) + { + eAction = wxOwnerDrawn::wxODDrawAll; + eStatus = 0; + // + // Keep the system from trying to highlight with its bogus colors + // + pMeasureStruct->fsAttribute = pMeasureStruct->fsAttributeOld &= ~MIA_HILITED; + } + else + { + // + // For now we don't care about anything else + // just ignore the entire message! + // + return TRUE; + } + } + // + // Now redraw the item + // + return(pMenuItem->OnDrawItem( vDc + ,vRect + ,(wxOwnerDrawn::wxODAction)eAction + ,(wxOwnerDrawn::wxODStatus)eStatus + )); // // leave the fsAttribute and fsOldAttribute unchanged. If different, // the system will do the highlight or fraeming or disabling for us, @@ -2730,32 +2822,33 @@ bool wxWindow::OS2OnMeasureItem( // // Is it a menu item? // - if (lId == 0) + if (lId == 65536) // I really don't like this...has to be a better indicator { - POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; - wxMenuItem vMenuItem; - - // - // We stored the CMenuItem itself into the menuitem text field so now - // we need to extract it. - // - ::WinSendMsg( pMeasureStruct->hItem - ,MM_QUERYITEMTEXT - ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem - ,(SHORT)(sizeof(wxMenuItem)) - ) - ,(PSZ)&vMenuItem - ); - wxCHECK(vMenuItem.IsKindOf(CLASSINFO(wxMenuItem)), FALSE); - - size_t lWidth = (size_t)(pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft); - size_t lHeight = (size_t)(pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom); - - return(vMenuItem.OnMeasureItem( &lWidth - ,&lHeight - )); + if (IsKindOf(CLASSINFO(wxFrame))) // we'll assume if Frame then a menu + { + size_t nWidth; + size_t nHeight; + POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; + wxFrame* pFrame = (wxFrame*)this; + wxMenuItem* pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem); + + wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); + nWidth = 0L; + nHeight = 0L; + if (pMenuItem->OnMeasureItem( &nWidth + ,&nHeight + )) + { + pMeasureStruct->rclItem.xRight = nWidth; + pMeasureStruct->rclItem.xLeft = 0L; + pMeasureStruct->rclItem.yTop = nHeight; + pMeasureStruct->rclItem.yBottom = 0L; + return TRUE; + } + return FALSE; + } } - wxWindow* pItem = FindItem(id); + wxWindow* pItem = FindItem(lId); if (pItem && pItem->IsKindOf(CLASSINFO(wxControl))) {