//____________________________________________________________________________ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: verbs.h // // Contents: // // Classes: // // Functions: // // History: 4/9/1997 RaviR Created //____________________________________________________________________________ // #ifndef _VERBS_H_ #define _VERBS_H_ class CNode; class CVerbSet; /*+-------------------------------------------------------------------------* * class CConsoleVerbState * * * PURPOSE: Button state for console commands. * *+-------------------------------------------------------------------------*/ class CConsoleVerbState { public: CConsoleVerbState() {m_state = m_stateDisabled = TBSTATE_HIDDEN; m_bHiddenBySnapIn = false;} void Init(BYTE stateDisabled) {m_stateDisabled = m_state;} void Disable() {m_state = m_stateDisabled; m_bHiddenBySnapIn = false;} BYTE GetState() {return m_state;} void SetState(BYTE state) {m_state = state;} void SetHiddenBySnapin(BOOL b) {m_bHiddenBySnapIn = b;} bool IsHiddenBySnapin() {return m_bHiddenBySnapIn;} private: BYTE m_state; // State bool m_bHiddenBySnapIn; BYTE m_stateDisabled; // what "Disabled" means for this verb. }; typedef CConsoleVerbState *LPCONSOLE_VERB_STATE; /*+-------------------------------------------------------------------------* * class CConsoleVerbImpl * * * PURPOSE: This is the object that the snapins' IConsoleVerb points to. * This object has a pointer to an implementation of CVerbSet. * The CVerbSet object can be switched to allow a temporary * selection, for instance. This allows a view to have its toolbars * to get their verb settings from a different CVerbSet object than * the right click context menu does - just set the CVerbSet * pointer on the CConsoleVerbImpl to the CVerbSet that the * changes should be routed to, and send the snapin an MMCN_SELECT * notification. * * What might be confusing at first is that both CConsoleVerbImpl * as well as CVerbSet keep a set of states. 1) The CConsoleVerbImpl * needs to have its own set because the * set of states needs to look consistent to the snapin regardless * of where the CVerbSet pointer is pointing to. 2) At the same time, * the CVerbSet needs its own set of states so that its client * consistently reads this set. *+-------------------------------------------------------------------------*/ class CConsoleVerbImpl : public IConsoleVerb, public CComObjectRoot { public: CConsoleVerbImpl(); ~CConsoleVerbImpl(); // ATL COM maps BEGIN_COM_MAP(CConsoleVerbImpl) COM_INTERFACE_ENTRY(IConsoleVerb) END_COM_MAP() // IConsoleVerb methods public: STDMETHOD(GetVerbState)(MMC_CONSOLE_VERB eCmdID, MMC_BUTTON_STATE nState, BOOL* pbState); STDMETHOD(SetVerbState)(MMC_CONSOLE_VERB eCmdID, MMC_BUTTON_STATE nState, BOOL bState); STDMETHOD(SetDefaultVerb)(MMC_CONSOLE_VERB eCmdID); STDMETHOD(GetDefaultVerb)(MMC_CONSOLE_VERB* peCmdID) { *peCmdID = m_DefaultVerb; return S_OK; } BYTE GetVerbState(MMC_CONSOLE_VERB verb); HRESULT SetDisabledAll(void); void SetVerbSet(IConsoleVerb* pVerbSet); private: CVerbSet* GetVerbSet() { ASSERT(m_pVerbSet != NULL); return m_pVerbSet; } public: #ifdef DBG int dbg_cRef_CConsoleVerbImpl; ULONG InternalAddRef(); ULONG InternalRelease(); #endif // DBG // Internal functions private: LPCONSOLE_VERB_STATE GetConsoleVerbState(MMC_CONSOLE_VERB m_eCmdID); // Implementation private: CVerbSet* m_pVerbSet; MMC_CONSOLE_VERB m_DefaultVerb; CConsoleVerbState m_rgConsoleVerbStates[evMax]; bool m_bCutVerbDisabledBySnapin; }; // class CConsoleVerbImpl HRESULT _GetConsoleVerb(CNode* pNode, LPCONSOLEVERB* ppConsoleVerb); /*+-------------------------------------------------------------------------* * class CVerbSetBase * * * PURPOSE: This class retains the state of all the verbs corresponding * to a particular object. See the note in CConsoleVerbImpl above. * * This also forms base class for CVerbSet as well as CTemporaryVerbSet * objects. * * Do not instantiate this object directly you should create either * CVerbSet or CTemporaryVerbSet object. * *+-------------------------------------------------------------------------*/ class CVerbSetBase : public IConsoleVerb, public CComObjectRoot { public: CVerbSetBase(); ~CVerbSetBase(); // ATL COM maps BEGIN_COM_MAP(CVerbSetBase) COM_INTERFACE_ENTRY(IConsoleVerb) END_COM_MAP() // IConsoleVerb methods public: STDMETHOD(GetVerbState)(MMC_CONSOLE_VERB m_eCmdID, MMC_BUTTON_STATE nState, BOOL* pbState); STDMETHOD(GetDefaultVerb)(MMC_CONSOLE_VERB* peCmdID); STDMETHOD(SetVerbState)(MMC_CONSOLE_VERB m_eCmdID, MMC_BUTTON_STATE nState, BOOL bState) { ASSERT(0 && "Should never come here!!!"); return E_FAIL; } STDMETHOD(SetDefaultVerb)(MMC_CONSOLE_VERB m_eCmdID) { ASSERT(0 && "Should never come here!!!"); return E_FAIL; } SC ScInitializeForMultiSelection(CNode *pNode, bool bSelect); void SetMultiSelection(CMultiSelection* pMS); SC ScComputeVerbStates(); IConsoleVerb* GetConsoleVerb(void) const; // Implementation protected: void Reset(); BYTE _GetVerbState(EVerb ev); private: void _EnableVerb(EVerb eVerb, bool fEnable); void _EnableVerb(EVerb eVerb); void _HideVerb(EVerb eVerb); void _AskSnapin(EVerb eVerb); protected: CNode* m_pNode; bool m_bScopePaneSelected; LPARAM m_lResultCookie; bool m_bVerbContextDataValid; CMultiSelection* m_pMultiSelection; IConsoleVerbPtr m_spConsoleVerbCurr; struct SVerbState { BYTE bAskSnapin; // 0 => don't ask, 1 => ask, 2 => asked and answered. BYTE nState; }; SVerbState m_rbVerbState[evMax]; }; /*+-------------------------------------------------------------------------* * class CVerbSet * * * PURPOSE: This object stores verb state information for currently (non-temporarily) * selected item if there is one and is created by CViewData per view. * *+-------------------------------------------------------------------------*/ class CVerbSet : public CVerbSetBase { public: CVerbSet() { Reset(); } SC ScInitialize (CNode *pNode, bool bScope, bool bSelect, bool bLVBackgroundSelected, LPARAM lResultCookie); void Notify(IConsoleVerb* pCVIn, MMC_CONSOLE_VERB m_eCmdID); SC ScGetVerbSetContext(CNode*& pNode, bool& bScope, LPARAM& lResultCookie, bool& bSelected); void DisableChangesToStdbar() { m_bChangesToStdbarEnabled = false;} void EnableChangesToStdbar() { m_bChangesToStdbarEnabled = true;} private: bool IsChangesToStdbarEnabled() { return m_bChangesToStdbarEnabled;} void Reset(); private: bool m_bChangesToStdbarEnabled; }; /*+-------------------------------------------------------------------------* * class CTemporaryVerbSet * * * PURPOSE: This object provides methods to initialize temporary verbset state * infomation. This de-selects any item that is currently selected, then * selects temp item computes verbs, de-selects temp item and selects * original item. * * Here selection or de-selection means sending (MMCN_SELECT, true) or * (MMCN_SELECT, false). * *+-------------------------------------------------------------------------*/ class CTemporaryVerbSet : public CVerbSetBase { public: STDMETHOD(GetDefaultVerb)(MMC_CONSOLE_VERB* peCmdID); SC ScInitialize(CNode *pNode, LPARAM lResultCookie, bool bScopePaneSel); SC ScInitialize(LPDATAOBJECT lpDataObject, CNode *pNode, bool bScopePaneSel, LPARAM lResultCookie); SC ScComputeVerbStates(); private: SC ScInitializePermanentVerbSet(CNode *pNode, bool bSelect); private: MMC_CONSOLE_VERB m_DefaultVerb; }; inline CVerbSetBase::CVerbSetBase() { Reset(); DEBUG_INCREMENT_INSTANCE_COUNTER(CVerbSetBase); } inline CVerbSetBase::~CVerbSetBase() { DEBUG_DECREMENT_INSTANCE_COUNTER(CVerbSetBase); } inline void CVerbSetBase::SetMultiSelection(CMultiSelection* pMS) { m_pMultiSelection = pMS; } inline void CVerbSetBase::Reset() { m_bScopePaneSelected = false; m_bVerbContextDataValid = false; m_lResultCookie = NULL; m_pNode = NULL; m_pMultiSelection = NULL; m_spConsoleVerbCurr = NULL; } inline IConsoleVerb* CVerbSetBase::GetConsoleVerb(void) const { return m_spConsoleVerbCurr; } inline void CVerbSetBase::_EnableVerb(EVerb eVerb, bool fEnable) { if (fEnable) _EnableVerb(eVerb); else _HideVerb(eVerb); } inline void CVerbSetBase::_EnableVerb(EVerb eVerb) { m_rbVerbState[eVerb].bAskSnapin = 0; m_rbVerbState[eVerb].nState = TBSTATE_ENABLED; } inline void CVerbSetBase::_HideVerb(EVerb eVerb) { m_rbVerbState[eVerb].bAskSnapin = 0; m_rbVerbState[eVerb].nState = TBSTATE_HIDDEN; } inline void CVerbSetBase::_AskSnapin(EVerb eVerb) { m_rbVerbState[eVerb].bAskSnapin = 1; m_rbVerbState[eVerb].nState = 0; } inline void CConsoleVerbImpl::SetVerbSet(IConsoleVerb* pVerbSet) { m_pVerbSet = dynamic_cast(pVerbSet); ASSERT(m_pVerbSet != NULL); } inline void CVerbSet::Reset() { CVerbSetBase::Reset(); m_bChangesToStdbarEnabled = true; } inline SC CVerbSet::ScGetVerbSetContext(CNode*& pNode, bool& bScopePaneSel, LPARAM& lResultCookie, bool& bDataValid) { pNode = m_pNode; bScopePaneSel = m_bScopePaneSelected; lResultCookie = m_lResultCookie; bDataValid = m_bVerbContextDataValid; if (! pNode) return E_FAIL; return S_OK; } #endif // _VERBS_H_