X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45bedfdd737b5d707dce277cc664018e9f566994..a0b1b91fe6ea9ee743ca658cb427d64052a8f57b:/src/os2/window.cpp diff --git a/src/os2/window.cpp b/src/os2/window.cpp index d62b0942dc..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 @@ -1984,17 +1995,9 @@ MRESULT wxWindow::OS2WindowProc( case WM_MEASUREITEM: { int nIdCtrl = (UINT)wParam; - char zMsg[128]; if ( uMsg == WM_DRAWITEM ) { - // DEBUG - sprintf(zMsg, "In OS2OnDrawItem, id: %d", nIdCtrl); - (void)wxMessageBox( "wxWindows Menu sample" - ,zMsg - ,wxICON_INFORMATION - ); - // end DEBUG bProcessed = OS2OnDrawItem(nIdCtrl, (WXDRAWITEMSTRUCT *)lParam); } @@ -2671,49 +2674,129 @@ bool wxWindow::OS2OnDrawItem( // if (vId == 0) { + ERRORID vError; + wxString sError; POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; - BYTE* pData; - wxMenuItem* pMenuItem; + 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); -#if 0 // - // 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)pData - ); - wxRect vRect( pMeasureStruct->rclItem.xLeft - ,pMeasureStruct->rclItem.yTop - ,pMeasureStruct->rclItem.xRight - ,pMeasureStruct->rclItem.yBottom - ); - - wxOwnerDrawn::wxODAction eAction; - + 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); + } // - // Attribute applies to menuitems, fsState to listbox and other controls + // 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); + } + + wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE ); + + + 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; + + 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 - eAction = wxOwnerDrawn::wxODSelectChanged; - pMenuItem = (wxMenuItem*)pData; + { + 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 - ,eAction - ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute + ,(wxOwnerDrawn::wxODAction)eAction + ,(wxOwnerDrawn::wxODStatus)eStatus )); -#endif // // leave the fsAttribute and fsOldAttribute unchanged. If different, // the system will do the highlight or fraeming or disabling for us, @@ -2741,21 +2824,31 @@ bool wxWindow::OS2OnMeasureItem( // if (lId == 65536) // I really don't like this...has to be a better indicator { - POWNERITEM pMeasureStruct = (POWNERITEM)pItemStruct; - char zData[sizeof(wxMenuItem)]; - - char zMsg[128]; - - if (IsKindOf(CLASSINFO(wxFrame))) + 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 ); - return(pMenuItem->OnMeasureItem(&pMeasureStruct->rclItem)); + 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))) {