//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: menuitem.h // //-------------------------------------------------------------------------- // MenuItem.h : Declaration of the CMenuItem class. ///////////////////////////////////////////////////////////////////////////// // MenuItem.h : See MenuItem.cpp for implementation. #ifndef _MENUITEM_H #define _MENUITEM_H #ifndef DECLSPEC_UUID #if _MSC_VER >= 1100 #define DECLSPEC_UUID(x) __declspec(uuid(x)) #else #define DECLSPEC_UUID(x) #endif #endif #include "ndmgr.h" #include "cmenuinfo.h" // menu owner IDs #define OWNERID_NATIVE 0 #define OWNERID_PRIMARY_MIN 1 #define OWNERID_PRIMARY_MAX 0x7FFFFFFF #define OWNERID_THIRD_PARTY_MIN 0x80000000 #define OWNERID_THIRD_PARTY_MAX 0xFFFFFFFE #define OWNERID_INVALID 0xFFFFFFFF inline BOOL IsSystemOwnerID( MENU_OWNER_ID ownerid ) { return (OWNERID_NATIVE == ownerid); } inline BOOL IsPrimaryOwnerID( MENU_OWNER_ID ownerid ) { return (OWNERID_PRIMARY_MIN <= ownerid && OWNERID_PRIMARY_MAX >= ownerid ); } inline BOOL IsThirdPartyOwnerID( MENU_OWNER_ID ownerid ) { return (OWNERID_THIRD_PARTY_MIN <= ownerid && OWNERID_THIRD_PARTY_MAX >= ownerid ); } inline BOOL IsSpecialInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_SPECIAL); } inline BOOL IsSharedInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_SHARED); } inline BOOL IsCreatePrimaryInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_CREATE_PRIMARY); } inline BOOL IsAddPrimaryInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_ADD_PRIMARY); } inline BOOL IsAdd3rdPartyInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_ADD_3RDPARTY); } inline BOOL IsReservedInsertionPointID( long lInsertionPointID ) { return (lInsertionPointID & CCM_INSERTIONPOINTID_MASK_RESERVED); } inline BOOL IsReservedCommandID( long lCommandID ) { return (lCommandID & CCM_COMMANDID_MASK_RESERVED); } #define MENUITEM_BASE_ID 1000 /*+-------------------------------------------------------------------------* * class CMenuItem * * * PURPOSE: Encapsulates all information, including how to execute, * for a menu item. * *+-------------------------------------------------------------------------*/ class CMenuItem : public CTiedObject { DECLARE_NOT_COPIABLE(CMenuItem) DECLARE_NOT_ASSIGNABLE(CMenuItem) public: CMenuItem( LPCTSTR lpszName, LPCTSTR lpszStatusBarText, LPCTSTR lpszLanguageIndependentName, LPCTSTR lpszPath, LPCTSTR lpszLanguageIndependentPath, long nCommandID, long nMenuItemID, long nFlags, MENU_OWNER_ID ownerID, IExtendContextMenu * pExtendContextMenu, IDataObject * pDataObject, DWORD fSpecialFlags, bool bPassCommandBackToSnapin = false ); virtual ~CMenuItem(); // Interfaces public: // use MFC's standard object validity technique virtual void AssertValid(); public: void GetMenuItemName(LPTSTR pBuffer, int* pLen); LPCTSTR GetMenuItemName() const { return m_strName; } LPCTSTR GetMenuItemStatusBarText() const { return m_strStatusBarText; } LPCTSTR GetLanguageIndependentName() const { return m_strLanguageIndependentName;} LPCTSTR GetPath() const { return m_strPath;} LPCTSTR GetLanguageIndependentPath() const { return m_strLanguageIndependentPath;} long GetCommandID() const { return m_nCommandID; } long GetMenuItemID() const { return m_nMenuItemID; } long GetMenuItemFlags() const { return m_nFlags; } void SetMenuItemFlags( long nFlags ) { m_nFlags = nFlags; } MENU_OWNER_ID GetMenuItemOwner() const { return m_OwnerID; } MenuItemList& GetMenuItemSubmenu() { return m_SubMenu; } DWORD GetSpecialFlags() const { return m_fSpecialFlags;} HMENU GetPopupMenuHandle() { return m_PopupMenuHandle; } void SetPopupMenuHandle( HMENU hmenu ) { m_PopupMenuHandle = hmenu; } BOOL IsPopupMenu() { return (MF_POPUP & m_nFlags); } BOOL IsSpecialItemDefault() { return (m_fSpecialFlags & CCM_SPECIAL_DEFAULT_ITEM); } BOOL IsSpecialSeparator() { return (m_fSpecialFlags & CCM_SPECIAL_SEPARATOR); } BOOL IsSpecialSubmenu() { return (m_fSpecialFlags & CCM_SPECIAL_SUBMENU); } BOOL IsSpecialInsertionPoint() { return (m_fSpecialFlags & CCM_SPECIAL_INSERTION_POINT); } BOOL HasChildList() { return ((m_nFlags & MF_POPUP) || IsSpecialInsertionPoint()); } CMenuItem* FindItemByPath( LPCTSTR lpstrPath ); // creates and returns a ContextMenu interface. SC ScGetMenuItem(PPMENUITEM ppMenuItem); // MenuItem methods. virtual SC ScExecute(); // executes the menu item. virtual SC Scget_DisplayName(PBSTR pbstrName); virtual SC Scget_LanguageIndependentName(PBSTR LanguageIndependentName); virtual SC Scget_Path(PBSTR pbstrPath); virtual SC Scget_LanguageIndependentPath(PBSTR LanguageIndependentPath); virtual SC Scget_Enabled(PBOOL pBool); bool NeedsToPassCommandBackToSnapin() { return m_bPassCommandBackToSnapin; } private: CStr m_strName; CStr m_strStatusBarText; CStr m_strPath; CStr m_strLanguageIndependentName; CStr m_strLanguageIndependentPath; long m_nCommandID; long m_nMenuItemID; long m_nFlags; MENU_OWNER_ID m_OwnerID; long m_fSpecialFlags; HMENU m_PopupMenuHandle; MenuItemList m_SubMenu; IExtendContextMenuPtr m_spExtendContextMenu; // the callback called when the item is executed. IDataObject* m_pDataObject; BOOL m_bEnabled; MenuItemPtr m_spMenuItem; bool m_bPassCommandBackToSnapin; }; /*+-------------------------------------------------------------------------* * * CRootMenuItem * * PURPOSE: The root menu item. * * RETURNS: * class * *+-------------------------------------------------------------------------*/ class CRootMenuItem : public CMenuItem { public: CRootMenuItem() : CMenuItem(NULL/*lpszName*/, NULL/*lpszStatusBarText*/, NULL/*lpszLanguageIndependentName*/, NULL/*lpszPath*/, NULL/*lpszLanguageIndependentPath*/, 0/*nCommandID*/, 0/*nMenuItemID*/,MF_POPUP/*nFlags*/,0/*ownerID*/, NULL/*pExtendContextMenu*/, NULL/*pDataObject*/, 0/*fSpecialFlags*/) { } virtual SC ScExecute() const {SC sc; return sc;} // does nothing. }; ///////////////////////////////////////////////////////////////////////////// // SnapinStruct class SnapinStruct { // cannot assign - will unbalance m_pIDataObject refs DECLARE_NOT_COPIABLE(SnapinStruct) DECLARE_NOT_ASSIGNABLE(SnapinStruct) public: IExtendContextMenuPtr pIExtendContextMenu; MENU_OWNER_ID m_OwnerID; IDataObject* m_pIDataObject; SnapinStruct( IExtendContextMenu* pintf, IDataObject* pIDataObject, MENU_OWNER_ID ownerID) : pIExtendContextMenu( pintf ), m_OwnerID( ownerID ) { ASSERT( NULL != pintf && NULL != pIDataObject ); m_pIDataObject = pIDataObject; if (! IS_SPECIAL_DATAOBJECT(m_pIDataObject)) m_pIDataObject->AddRef(); } ~SnapinStruct() { if (! IS_SPECIAL_DATAOBJECT(m_pIDataObject)) m_pIDataObject->Release(); } }; #endif