//
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
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
);
{
ERRORID vError;
wxString sError;
+ char zMsg[128];
#if wxUSE_ACCEL
UpdateAccel(pItem);
#endif // wxUSE_ACCEL
{
//
// 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
,(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);
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
// ---------------------------------------------------------------------------
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
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);
}
{
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.
,MPFROM2SHORT( (USHORT)pMeasureStruct->idItem
,(SHORT)(sizeof(wxMenuItem))
)
- ,(PSZ)&vMenuItem
+ ,(PSZ)pData
);
-
wxRect vRect( pMeasureStruct->rclItem.xLeft
,pMeasureStruct->rclItem.yTop
,pMeasureStruct->rclItem.xRight
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,
//
// 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);