]> git.saurik.com Git - wxWidgets.git/commitdiff
Ownerdrawn menu updates
authorDavid Webster <Dave.Webster@bhmi.com>
Tue, 20 Mar 2001 05:46:07 +0000 (05:46 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Tue, 20 Mar 2001 05:46:07 +0000 (05:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9550 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/os2/menu.h
src/os2/menu.cpp
src/os2/window.cpp

index 7b05ee3297dd99c228d898ce322279daa7a9673e..fac76609db604e267547430ec045b95093ddb3bc 100644 (file)
@@ -125,6 +125,15 @@ public:
     //
     int FindAccel(int nId) const;
 #endif // wxUSE_ACCEL
+    //
+    // OS/2 specific Find
+    //
+    wxMenuItem* FindItem(int id, ULONG hItem, wxMenu **menu = NULL) const;
+    //virtual function hiding suppression
+    int FindItem(const wxString& rsString) const
+    { return wxMenuBase::FindItem(rsString); }
+    wxMenuItem* FindItem(int id, wxMenu **menu = NULL) const
+    { return wxMenuBase::FindItem(id, menu); }
 
     //
     // All OS/2PM Menu's have one of these
@@ -219,7 +228,10 @@ public:
     virtual wxMenuItem* FindItem( int      nId
                                  ,wxMenu** ppMenu = NULL
                                 ) const;
-
+    virtual wxMenuItem* FindItem( int      nId
+                                 ,ULONG    hItem
+                                 ,wxMenu** ppMenu = NULL
+                                ) const;
     virtual void        EnableTop( size_t nPos
                                   ,bool   bFlag
                                  );
index a9c390acc31d7a9f6389d6eccfeb89d69bb68d14..07327e565b438f0a1b62d203527f2ae5b23c4acd 100644 (file)
@@ -265,6 +265,7 @@ bool wxMenu::DoInsertOrAppend(
 {
     ERRORID                         vError;
     wxString                        sError;
+    char                            zMsg[128];
 #if wxUSE_ACCEL
     UpdateAccel(pItem);
 #endif // wxUSE_ACCEL
@@ -325,12 +326,14 @@ bool wxMenu::DoInsertOrAppend(
     {
         //
         // Want to get {Measure|Draw}Item messages?
-        // item draws itself, pass pointer to it in data parameter
+        // item draws itself, passing pointer to data doesn't work in OS/2
         // Will eventually need to set the image handle somewhere into vItem.hItem
         //
         rItem.afStyle |= MIS_OWNERDRAW;
         pData = (BYTE*)pItem;
-        // vItem.hItem = ????
+        rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP();
+        pItem->m_vMenuData.afStyle = rItem.afStyle;
+        pItem->m_vMenuData.hItem = rItem.hItem;
     }
     else
 #endif
@@ -358,6 +361,21 @@ bool wxMenu::DoInsertOrAppend(
                               ,(MPARAM)&rItem
                               ,(MPARAM)pData
                              );
+#if wxUSE_OWNER_DRAWN
+    if (pItem->IsOwnerDrawn())
+    {
+        BOOL                       rc;
+        MENUITEM                   vMenuItem;
+
+        ::WinSendMsg( GetHmenu()
+                     ,MM_QUERYITEM
+                     ,MPFROM2SHORT( (USHORT)pItem->GetId()
+                                   ,(USHORT)(FALSE)
+                                  )
+                     ,&vMenuItem
+                    );
+    }
+#endif
     if (rc == MIT_MEMERROR || rc == MIT_ERROR)
     {
         vError = ::WinGetLastError(vHabmain);
@@ -618,6 +636,42 @@ wxWindow* wxMenu::GetWindow() const
     return NULL;
 } // end of wxMenu::GetWindow
 
+// recursive search for item by id
+wxMenuItem* wxMenu::FindItem(
+  int                               nItemId
+, ULONG                             hItem
+, wxMenu**                          ppItemMenu
+) const
+{
+    if ( ppItemMenu )
+        *ppItemMenu = NULL;
+
+    wxMenuItem*                     pItem = NULL;
+
+    for ( wxMenuItemList::Node *node = m_items.GetFirst();
+          node && !pItem;
+          node = node->GetNext() )
+    {
+        pItem = node->GetData();
+
+        if ( pItem->GetId() == nItemId && pItem->m_vMenuData.hItem == hItem)
+        {
+            if ( ppItemMenu )
+                *ppItemMenu = (wxMenu *)this;
+        }
+        else if ( pItem->IsSubMenu() )
+        {
+            pItem = pItem->GetSubMenu()->FindItem(nItemId, hItem, ppItemMenu);
+        }
+        else
+        {
+            // don't exit the loop
+            pItem = NULL;
+        }
+    }
+    return pItem;
+} // end of wxMenu::FindItem
+
 // ---------------------------------------------------------------------------
 // Menu Bar
 // ---------------------------------------------------------------------------
@@ -1090,4 +1144,25 @@ wxMenuItem* wxMenuBar::FindItem(
     return pItem;
 } // end of wxMenuBar::FindItem
 
+wxMenuItem* wxMenuBar::FindItem(
+  int                               nId
+, ULONG                             hItem
+, wxMenu**                          ppItemMenu
+) const
+{
+    if (ppItemMenu)
+        *ppItemMenu = NULL;
+
+    wxMenuItem*                     pItem = NULL;
+    size_t                          nCount = GetMenuCount();
+
+    for (size_t i = 0; !pItem && (i < nCount); i++)
+    {
+        pItem = m_menus[i]->FindItem( nId
+                                     ,hItem
+                                     ,ppItemMenu
+                                    );
+    }
+    return pItem;
+} // end of wxMenuBar::FindItem
 
index ce16cbc0c7ca78cf906394e9a39a8f7906a08019..d62b0942dcff838a83ec513d6c16fd51e079e90a 100644 (file)
@@ -1983,15 +1983,24 @@ MRESULT wxWindow::OS2WindowProc(
         case WM_DRAWITEM:
         case WM_MEASUREITEM:
             {
-                int idCtrl = (UINT)wParam;
+                int                 nIdCtrl = (UINT)wParam;
+                char                zMsg[128];
+
                 if ( uMsg == WM_DRAWITEM )
                 {
-                    bProcessed = OS2OnDrawItem(idCtrl,
+                    // DEBUG
+                    sprintf(zMsg, "In OS2OnDrawItem, id: %d", nIdCtrl);
+                    (void)wxMessageBox( "wxWindows Menu sample"
+                                       ,zMsg
+                                       ,wxICON_INFORMATION
+                                      );
+                    // end DEBUG
+                    bProcessed = OS2OnDrawItem(nIdCtrl,
                                               (WXDRAWITEMSTRUCT *)lParam);
                 }
                 else
                 {
-                    bProcessed = OS2OnMeasureItem(idCtrl,
+                    bProcessed = OS2OnMeasureItem(nIdCtrl,
                                                  (WXMEASUREITEMSTRUCT *)lParam);
                 }
 
@@ -2656,22 +2665,22 @@ bool wxWindow::OS2OnDrawItem(
 {
     wxDC                            vDc;
 
+#if wxUSE_OWNER_DRAWN
     //
     // Is it a menu item?
     //
     if (vId == 0)
     {
-
-#if wxUSE_OWNER_DRAWN
         POWNERITEM                  pMeasureStruct = (POWNERITEM)pItemStruct;
-        wxMenuItem                  vMenuItem;
+        BYTE*                       pData;
+        wxMenuItem*                 pMenuItem;
         HDC                         hDC = ::GpiQueryDevice(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.
@@ -2681,9 +2690,8 @@ bool wxWindow::OS2OnDrawItem(
                      ,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
                                    ,(SHORT)(sizeof(wxMenuItem))
                                   )
-                     ,(PSZ)&vMenuItem
+                     ,(PSZ)pData
                     );
-
         wxRect                      vRect( pMeasureStruct->rclItem.xLeft
                                           ,pMeasureStruct->rclItem.yTop
                                           ,pMeasureStruct->rclItem.xRight
@@ -2699,12 +2707,13 @@ bool wxWindow::OS2OnDrawItem(
             eAction = wxOwnerDrawn::wxODDrawAll;
         else
             eAction = wxOwnerDrawn::wxODSelectChanged;
-
-        return(vMenuItem.OnDrawItem( vDc
-                                    ,vRect
-                                    ,eAction
-                                    ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute
-                                   ));
+        pMenuItem = (wxMenuItem*)pData;
+        return(pMenuItem->OnDrawItem( vDc
+                                     ,vRect
+                                     ,eAction
+                                     ,(wxOwnerDrawn::wxODStatus)pMeasureStruct->fsAttribute
+                                    ));
+#endif
         //
         // leave the fsAttribute and fsOldAttribute unchanged.  If different,
         // the system will do the highlight or fraeming or disabling for us,
@@ -2730,30 +2739,21 @@ 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;
+        char                        zData[sizeof(wxMenuItem)];
 
-        //
-        // 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);
+        char                        zMsg[128];
 
-        size_t                      lWidth  = (size_t)(pMeasureStruct->rclItem.xRight - pMeasureStruct->rclItem.xLeft);
-        size_t                      lHeight = (size_t)(pMeasureStruct->rclItem.yTop - pMeasureStruct->rclItem.yBottom);
+        if (IsKindOf(CLASSINFO(wxFrame)))
+        {
+            wxFrame*                pFrame = (wxFrame*)this;
+            wxMenuItem*             pMenuItem = pFrame->GetMenuBar()->FindItem(pMeasureStruct->idItem, pMeasureStruct->hItem);
 
-        return(vMenuItem.OnMeasureItem( &lWidth
-                                       ,&lHeight
-                                      ));
+            wxCHECK( pMenuItem->IsKindOf(CLASSINFO(wxMenuItem)), FALSE );
+            return(pMenuItem->OnMeasureItem(&pMeasureStruct->rclItem));
+        }
     }
     wxWindow*                      pItem = FindItem(id);