]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
fix for discrepancies between wxNotebookEvent and wxNotebook GetSelection() results
[wxWidgets.git] / src / os2 / window.cpp
index 654424d2e385d6fe0d630eadee3b9bab74ac071a..2aef2aaeffc9c47a94658318ce47d7e5c116d42d 100644 (file)
@@ -273,8 +273,10 @@ void wxWindow::Init()
     //
     // wxWnd
     //
     //
     // wxWnd
     //
-    m_hMenu = 0;
-    m_hWnd = 0;
+    m_hMenu             = 0L;
+    m_hWnd              = 0L;
+    m_hWndScrollBarHorz = 0L;
+    m_hWndScrollBarVert = 0L;
 
     //
     // Pass WM_GETDLGCODE to DefWindowProc()
 
     //
     // Pass WM_GETDLGCODE to DefWindowProc()
@@ -329,6 +331,8 @@ bool wxWindow::Create(
 )
 {
     HWND                            hParent = NULLHANDLE;
 )
 {
     HWND                            hParent = NULLHANDLE;
+    wxPoint                         vPos = rPos; // The OS/2 position
+    ULONG                           ulCreateFlags = 0L;
 
     wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
 
 
     wxCHECK_MSG(pParent, FALSE, wxT("can't create wxWindow without parent"));
 
@@ -344,14 +348,41 @@ bool wxWindow::Create(
 
     if (pParent)
     {
 
     if (pParent)
     {
+        int                         nTempy;
+
         pParent->AddChild(this);
         hParent = GetWinHwnd(pParent);
         pParent->AddChild(this);
         hParent = GetWinHwnd(pParent);
+        //
+        // OS2 uses normal coordinates, no bassackwards Windows ones
+        //
+        if (pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+            pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
+           )
+        {
+            wxWindow*               pGrandParent = NULL;
+
+            pGrandParent = pParent->GetParent();
+            if (pGrandParent)
+                nTempy = pGrandParent->GetSize().y - (vPos.y + rSize.y);
+            else
+                nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
+        }
+        else
+            nTempy = pParent->GetSize().y - (vPos.y + rSize.y);
+        vPos.y = nTempy;
+        if ( pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
+             pParent->IsKindOf(CLASSINFO(wxScrolledWindow))
+           )
+            ulCreateFlags |= WS_CLIPSIBLINGS;
     }
     else
     }
     else
-       hParent = HWND_DESKTOP;
-
-    ULONG                           ulCreateFlags = 0L;
+    {
+        RECTL                   vRect;
 
 
+        ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
+        hParent = HWND_DESKTOP;
+        vPos.y = vRect.yTop - (vPos.y + rSize.y);
+    }
 
     //
     // Most wxSTYLES are really PM Class specific styles and will be
 
     //
     // Most wxSTYLES are really PM Class specific styles and will be
@@ -361,7 +392,7 @@ bool wxWindow::Create(
     ulCreateFlags |=  WS_VISIBLE;
 
 
     ulCreateFlags |=  WS_VISIBLE;
 
 
-    if ( lStyle & wxCLIP_SIBLINGS )
+    if (lStyle & wxCLIP_SIBLINGS)
         ulCreateFlags |= WS_CLIPSIBLINGS;
 
     if (lStyle & wxCLIP_CHILDREN )
         ulCreateFlags |= WS_CLIPSIBLINGS;
 
     if (lStyle & wxCLIP_CHILDREN )
@@ -382,8 +413,8 @@ bool wxWindow::Create(
               ,(PSZ)wxCanvasClassName
               ,rName.c_str()
               ,ulCreateFlags
               ,(PSZ)wxCanvasClassName
               ,rName.c_str()
               ,ulCreateFlags
-              ,rPos.x
-              ,rPos.y
+              ,vPos.x
+              ,vPos.y
               ,WidthDefault(rSize.x)
               ,HeightDefault(rSize.y)
               ,NULLHANDLE
               ,WidthDefault(rSize.x)
               ,HeightDefault(rSize.y)
               ,NULLHANDLE
@@ -589,7 +620,24 @@ void wxWindow::SetScrollRange(
 , bool                              bRefresh
 )
 {
 , bool                              bRefresh
 )
 {
-    ::WinSendMsg(GetHwnd(), SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, nRange));
+    int                             nRange1 = nRange;
+    int                             nPageSize = GetScrollPage(nOrient);
+
+    if (nPpageSize > 1 && nRange > 0)
+    {
+        nRange1 += (nPageSize - 1);
+    }
+
+    if (nOrient == wxHORIZONTAL)
+    {
+        ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
+        ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
+    }
+    else
+    {
+        ::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, (SHORT)nRange1));
+        ::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
+    }
 } // end of wxWindow::SetScrollRange
 
 void wxWindow::SetScrollPage(
 } // end of wxWindow::SetScrollRange
 
 void wxWindow::SetScrollPage(
@@ -598,11 +646,11 @@ void wxWindow::SetScrollPage(
 , bool                              bRefresh
 )
 {
 , bool                              bRefresh
 )
 {
-    if ( orient == wxHORIZONTAL )
-        m_xThumbSize = page;
+    if (nOrient == wxHORIZONTAL )
+        m_nXThumbSize = nPage;
     else
     else
-        m_yThumbSize = page;
-}
+        m_nYThumbSize = nPage;
+} // end of wxWindow::SetScrollPage
 
 int wxWindow::OldGetScrollRange(
   int                               nOrient
 
 int wxWindow::OldGetScrollRange(
   int                               nOrient
@@ -634,7 +682,10 @@ int  wxWindow::GetScrollPos(
   int                               nOrient
 ) const
 {
   int                               nOrient
 ) const
 {
-    return((int)::WinSendMsg(GetHwnd(), SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL));
+    if (nOrient == wxHORIZONTAL)
+        return((int)::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL));
+    else
+        return((int)::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYPOS, (MPARAM)NULL, (MPARAM)NULL));
 } // end of wxWindow::GetScrollPos
 
 int wxWindow::GetScrollRange(
 } // end of wxWindow::GetScrollPos
 
 int wxWindow::GetScrollRange(
@@ -643,7 +694,10 @@ int wxWindow::GetScrollRange(
 {
     MRESULT                         mr;
 
 {
     MRESULT                         mr;
 
-    mr = ::WinSendMsg(GetHwnd(), SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL);
+    if (nOrient == wxHORIZONTAL)
+        mr = ::WinSendMsg(m_hWndScrollBarHorz, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL);
+    else
+        mr = ::WinSendMsg(m_hWndScrollBarVert, SBM_QUERYRANGE, (MPARAM)NULL, (MPARAM)NULL);
     return((int)SHORT2FROMMR(mr));
 } // end of wxWindow::GetScrollRange
 
     return((int)SHORT2FROMMR(mr));
 } // end of wxWindow::GetScrollRange
 
@@ -651,12 +705,10 @@ int wxWindow::GetScrollThumb(
   int                               nOrient
 ) const
 {
   int                               nOrient
 ) const
 {
-    WNDPARAMS                       vWndParams;
-    PSBCDATA                        pSbcd;
-
-    ::WinSendMsg(GetHwnd(), WM_QUERYWINDOWPARAMS, (MPARAM)&vWndParams, (MPARAM)NULL);
-    pSbcd = (PSBCDATA)vWndParams.pCtlData;
-    return((int)pSbcd->posThumb);
+    if (nOrient == wxHORIZONTAL )
+        return m_nXThumbSize;
+    else
+        return m_nYThumbSize;
 } // end of wxWindow::GetScrollThumb
 
 void wxWindow::SetScrollPos(
 } // end of wxWindow::GetScrollThumb
 
 void wxWindow::SetScrollPos(
@@ -665,7 +717,10 @@ void wxWindow::SetScrollPos(
 , bool                              bRefresh
 )
 {
 , bool                              bRefresh
 )
 {
-    ::WinSendMsg(GetHwnd(), SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL);
+    if (nOrient == wxHORIZONTAL )
+        ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL);
+    else
+        ::WinSendMsg(m_hWndScrollBarVert, SBM_SETPOS, (MPARAM)nPos, (MPARAM)NULL);
 } // end of wxWindow::SetScrollPos(
 
 void wxWindow::SetScrollbar(
 } // end of wxWindow::SetScrollPos(
 
 void wxWindow::SetScrollbar(
@@ -676,13 +731,129 @@ void wxWindow::SetScrollbar(
 , bool                              bRefresh
 )
 {
 , bool                              bRefresh
 )
 {
-    ::WinSendMsg(GetHwnd(), SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, nRange));
-    if (nOrient == wxHORIZONTAL)
+    int                             nOldRange = nRange - nThumbVisible;
+    int                             nRange1 = nOldRange;
+    int                             nPageSize = nThumbVisible;
+    SBCDATA                         vInfo;
+    HWND                            hWnd = GetHwnd();
+    ULONG                           ulStyle = WS_VISIBLE | WS_SYNCPAINT;
+    RECTL                           vRect;
+
+    ::WinQueryWindowRect(hWnd, &vRect);
+    if (nPageSize > 1 && nRange > 0)
     {
     {
-        m_nXThumbSize = nThumbVisible;
+        nRange1 += (nPageSize - 1);
+    }
+
+    vInfo.cb = sizeof(SBCDATA);
+    vInfo.posFirst = 0;
+    vInfo.posLast = (SHORT)nRange1;
+    vInfo.posThumb = nPos;
+
+    if (nOrient == wxHORIZONTAL )
+    {
+        ulStyle |= SBS_HORZ;
+        if (m_hWndScrollBarHorz == 0L)
+        {
+            //
+            // We create the scrollbars with the desktop so that they are not
+            // registered as child windows of the window in order that child
+            // windows may be scrolled without scrolling the scrollbars themselves!
+            //
+            m_hWndScrollBarHorz = ::WinCreateWindow( hWnd
+                                                    ,WC_SCROLLBAR
+                                                    ,(PSZ)NULL
+                                                    ,ulStyle
+                                                    ,vRect.xLeft
+                                                    ,vRect.yBottom
+                                                    ,vRect.xRight - vRect.xLeft
+                                                    ,20
+                                                    ,hWnd
+                                                    ,HWND_TOP
+                                                    ,FID_HORZSCROLL
+                                                    ,&vInfo
+                                                    ,NULL
+                                                   );
+        }
+        else
+        {
+            RECTL                   vRect2;
+
+            //
+            // Only want to resize the scrollbar if it changes, otherwise
+            // we'd probably end up in a recursive loop until we crash the call stack
+            // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
+            // generates those events.
+            //
+            ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect2);
+            if (!(vRect2.xLeft == vRect.xLeft     &&
+                  vRect2.xRight == vRect.xRight   &&
+                  vRect2.yBottom == vRect.yBottom &&
+                  vRect2.yTop == vRect.yTop
+                ) )
+            {
+                ::WinSetWindowPos( m_hWndScrollBarHorz
+                                  ,HWND_TOP
+                                  ,vRect.xLeft
+                                  ,vRect.yBottom
+                                  ,vRect.xRight - vRect.xLeft
+                                  ,20
+                                  ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
+                                 );
+            }
+            ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1));
+            ::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
+        }
     }
     else
     {
     }
     else
     {
+        ulStyle |= SBS_VERT;
+        if (m_hWndScrollBarVert == 0L)
+        {
+            m_hWndScrollBarVert = ::WinCreateWindow( hWnd
+                                                    ,WC_SCROLLBAR
+                                                    ,(PSZ)NULL
+                                                    ,ulStyle
+                                                    ,vRect.xRight - 20
+                                                    ,vRect.yBottom + 20
+                                                    ,20
+                                                    ,vRect.yTop - (vRect.yBottom + 20)
+                                                    ,hWnd
+                                                    ,HWND_TOP
+                                                    ,FID_VERTSCROLL
+                                                    ,&vInfo
+                                                    ,NULL
+                                                   );
+        }
+        else
+        {
+            RECTL                   vRect2;
+
+            //
+            // Only want to resize the scrollbar if it changes, otherwise
+            // we'd probably end up in a recursive loop until we crash the call stack
+            // because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
+            // generates those events.
+            //
+            ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect2);
+            if (!(vRect2.xLeft == vRect.xLeft     &&
+                  vRect2.xRight == vRect.xRight   &&
+                  vRect2.yBottom == vRect.yBottom &&
+                  vRect2.yTop == vRect.yTop
+                ) )
+            {
+                ::WinSetWindowPos( m_hWndScrollBarVert
+                                  ,HWND_TOP
+                                  ,vRect.xRight - 20
+                                  ,vRect.yBottom + 20
+                                  ,20
+                                  ,vRect.yTop - (vRect.yBottom + 20)
+                                  ,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);
+        }
         m_nYThumbSize = nThumbVisible;
     }
 } // end of wxWindow::SetScrollbar
         m_nYThumbSize = nThumbVisible;
     }
 } // end of wxWindow::SetScrollbar
@@ -693,20 +864,87 @@ void wxWindow::ScrollWindow(
 , const wxRect*                     pRect
 )
 {
 , const wxRect*                     pRect
 )
 {
+    RECTL                           vRect;
     RECTL                           vRect2;
 
     RECTL                           vRect2;
 
+    nDy *= -1; // flip the sign of Dy as OS/2 is opposite wxWin.
     if (pRect)
     {
         vRect2.xLeft   = pRect->x;
     if (pRect)
     {
         vRect2.xLeft   = pRect->x;
-        vRect2.yTop    = pRect->y;
+        vRect2.yTop    = pRect->y + pRect->height;
         vRect2.xRight  = pRect->x + pRect->width;
         vRect2.xRight  = pRect->x + pRect->width;
-        vRect2.yBottom = pRect->y + pRect->height;
+        vRect2.yBottom = pRect->y;
     }
     }
+    else
+    {
+        ::WinQueryWindowRect(GetHwnd(), &vRect2);
+        ::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect);
+        vRect2.yBottom += vRect.yTop - vRect.yBottom;
+        ::WinQueryWindowRect(m_hWndScrollBarVert, &vRect);
+        vRect2.xRight -= vRect.xRight - vRect.xLeft;
 
 
+    }
     if (pRect)
     if (pRect)
-        ::WinScrollWindow(GetHwnd(), (LONG)nDx, (LONG)nDy, &vRect2, NULL, NULLHANDLE, NULL, 0L);
+        ::WinScrollWindow( GetHwnd()
+                          ,(LONG)nDx
+                          ,(LONG)nDy
+                          ,&vRect2
+                          ,NULL
+                          ,NULLHANDLE
+                          ,NULL
+                          ,SW_INVALIDATERGN
+                         );
     else
     else
-        ::WinScrollWindow(GetHwnd(), nDx, nDy, NULL, NULL, NULLHANDLE, NULL, 0L);
+        ::WinScrollWindow( GetHwnd()
+                          ,nDx
+                          ,nDy
+                          ,NULL
+                          ,NULL
+                          ,NULLHANDLE
+                          ,NULL
+                          ,SW_INVALIDATERGN
+                         );
+
+    //
+    // Move the children
+    wxWindowList::Node*             pCurrent = GetChildren().GetFirst();
+    SWP                             vSwp;
+
+    while (pCurrent)
+    {
+        wxWindow*                   pChildWin = pCurrent->GetData();
+
+        if (pChildWin->GetHWND() != NULLHANDLE)
+        {
+            ::WinQueryWindowPos(pChildWin->GetHWND(), &vSwp);
+            ::WinQueryWindowRect(pChildWin->GetHWND(), &vRect);
+            if (pChildWin->GetHWND() == m_hWndScrollBarVert ||
+                pChildWin->GetHWND() == m_hWndScrollBarHorz)
+            {
+                ::WinSetWindowPos( pChildWin->GetHWND()
+                                  ,HWND_TOP
+                                  ,vSwp.x + nDx
+                                  ,vSwp.y + nDy
+                                  ,0
+                                  ,0
+                                  ,SWP_MOVE | SWP_SHOW | SWP_ZORDER
+                                 );
+            }
+            else
+            {
+                ::WinSetWindowPos( pChildWin->GetHWND()
+                                  ,HWND_BOTTOM
+                                  ,vSwp.x + nDx
+                                  ,vSwp.y + nDy
+                                  ,0
+                                  ,0
+                                  ,SWP_MOVE | SWP_ZORDER
+                                 );
+                ::WinInvalidateRect(pChildWin->GetHWND(), &vRect, FALSE);
+            }
+        }
+        pCurrent = pCurrent->GetNext();
+    }
 } // end of wxWindow::ScrollWindow
 
 // ---------------------------------------------------------------------------
 } // end of wxWindow::ScrollWindow
 
 // ---------------------------------------------------------------------------
@@ -1096,7 +1334,10 @@ void wxWindow::DoGetClientSize(
     HWND                            hWndClient;
     RECTL                           vRect;
 
     HWND                            hWndClient;
     RECTL                           vRect;
 
-    hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
+    if (IsKindOf(CLASSINFO(wxFrame)))
+        hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
+    else
+        hWndClient = NULLHANDLE;
     if( hWndClient == NULLHANDLE)
        ::WinQueryWindowRect(GetHwnd(), &vRect);
     else
     if( hWndClient == NULLHANDLE)
        ::WinQueryWindowRect(GetHwnd(), &vRect);
     else
@@ -1750,9 +1991,18 @@ void wxWindow::UnpackScroll(
 , WXHWND*                           phWnd
 )
 {
 , WXHWND*                           phWnd
 )
 {
-    *pCode = LOWORD(wParam);
-    *pPos  = HIWORD(wParam);
-    *phWnd = (WXHWND)lParam;
+    ULONG                           ulId;
+    HWND                            hWnd;
+
+    ulId    = (ULONG)LONGFROMMP(wParam);
+    hWnd = ::WinWindowFromID(GetHwnd(), ulId);
+    if (hWnd == m_hWndScrollBarHorz || hWnd == m_hWndScrollBarVert)
+        *phWnd = NULLHANDLE;
+    else
+        *phWnd = hWnd;
+
+    *pPos  = SHORT1FROMMP(lParam);
+    *pCode = SHORT2FROMMP(lParam);
 } // end of wxWindow::UnpackScroll
 
 void wxWindow::UnpackMenuSelect(
 } // end of wxWindow::UnpackScroll
 
 void wxWindow::UnpackMenuSelect(
@@ -1984,17 +2234,9 @@ MRESULT wxWindow::OS2WindowProc(
         case WM_MEASUREITEM:
             {
                 int                 nIdCtrl = (UINT)wParam;
         case WM_MEASUREITEM:
             {
                 int                 nIdCtrl = (UINT)wParam;
-                char                zMsg[128];
 
                 if ( uMsg == WM_DRAWITEM )
                 {
 
                 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);
                 }
                     bProcessed = OS2OnDrawItem(nIdCtrl,
                                               (WXDRAWITEMSTRUCT *)lParam);
                 }
@@ -2358,10 +2600,8 @@ bool wxWindow::OS2Create(
     RECTL                           vParentRect;
     HWND                            hWndClient;
 
     RECTL                           vParentRect;
     HWND                            hWndClient;
 
-    if (lX > -1L)
-        lX1 = lX;
-    if (lY > -1L)
-        lY1 = lY;
+    lX1 = lX;
+    lY1 = lY;
     if (lWidth > -1L)
         lWidth1 = lWidth;
     if (lHeight > -1L)
     if (lWidth > -1L)
         lWidth1 = lWidth;
     if (lHeight > -1L)
@@ -2671,49 +2911,129 @@ bool wxWindow::OS2OnDrawItem(
     //
     if (vId == 0)
     {
     //
     if (vId == 0)
     {
+        ERRORID                     vError;
+        wxString                    sError;
         POWNERITEM                  pMeasureStruct = (POWNERITEM)pItemStruct;
         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);
         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);
         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)
         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;
             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
         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
         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,
         //
         // leave the fsAttribute and fsOldAttribute unchanged.  If different,
         // the system will do the highlight or fraeming or disabling for us,
@@ -2765,7 +3085,7 @@ bool wxWindow::OS2OnMeasureItem(
             return FALSE;
         }
     }
             return FALSE;
         }
     }
-    wxWindow*                      pItem = FindItem(id);
+    wxWindow*                      pItem = FindItem(lId);
 
     if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
     {
 
     if (pItem && pItem->IsKindOf(CLASSINFO(wxControl)))
     {