windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/ctrlbar.h
2020-09-26 16:20:57 +08:00

317 lines
7.9 KiB
C++

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: ctrlbar.h
//
// Contents: IControlbar implementation, peer of IExtendControlbar
//
// Classes: CControlbar
//
// History:
//____________________________________________________________________________
//
#ifndef _CTRLBAR_H_
#define _CTRLBAR_H_
class CControlbarsCache;
class CMenuButton;
class CNode;
class CComponentPtrArray;
class CToolbar;
//+-------------------------------------------------------------------
//
// class: CControlbar
//
// Purpose: The IControlbar implementation that (equivalent
// to IExtendControlbar). This allows manipulation
// of toolbars & menu buttons.
// The snapin and CSelData hold reference to this object.
//
// History: 10-12-1999 AnandhaG Created
//
//--------------------------------------------------------------------
class CControlbar : public IControlbar,
public CComObjectRoot
{
public:
CControlbar();
~CControlbar();
IMPLEMENTS_SNAPIN_NAME_FOR_DEBUG()
private:
CControlbar(const CControlbar& controlBar);
public:
// ATL COM map
BEGIN_COM_MAP(CControlbar)
COM_INTERFACE_ENTRY(IControlbar)
END_COM_MAP()
#ifdef DBG
int dbg_cRef;
ULONG InternalAddRef()
{
bool b = 1;
if (b)
++dbg_cRef;
return CComObjectRoot::InternalAddRef();
}
ULONG InternalRelease()
{
bool b = 1;
if (b)
--dbg_cRef;
return CComObjectRoot::InternalRelease();
}
#endif // DBG
// IControlbar members
public:
STDMETHOD(Create)(MMC_CONTROL_TYPE nType,
LPEXTENDCONTROLBAR pExtendControlbar,
LPUNKNOWN* ppUnknown);
STDMETHOD(Attach)(MMC_CONTROL_TYPE nType, LPUNKNOWN lpUnknown);
STDMETHOD(Detach)(LPUNKNOWN lpUnknown);
public:
HRESULT ControlbarNotify(MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
SC ScCleanup();
SC ScShowToolbars(bool bShow);
// Toolbar button & Menu button click handler.
SC ScNotifySnapinOfMenuBtnClick(HNODE hNode, bool bScope, LPARAM lParam, LPMENUBUTTONDATA lpmenuButtonData);
SC ScNotifySnapinOfToolBtnClick(HNODE hNode, bool bScope, LPARAM lParam, UINT nID);
// The CToolbar object calls this when it is being destroyed.
// It wants Controlbar to stop referencing it.
void DeleteFromToolbarsList(CToolbar *pToolbar)
{
m_ToolbarsList.remove(pToolbar);
}
public:
// Accessors.
IExtendControlbar* GetExtendControlbar()
{
return m_spExtendControlbar;
}
void SetExtendControlbar(IExtendControlbar* pExtendControlbar,
const CLSID& clsidSnapin)
{
ASSERT(pExtendControlbar != NULL);
ASSERT(m_spExtendControlbar == NULL);
m_spExtendControlbar = pExtendControlbar;
m_clsidSnapin = clsidSnapin;
}
void SetExtendControlbar(IExtendControlbar* pExtendControlbar)
{
ASSERT(pExtendControlbar != NULL);
ASSERT(m_spExtendControlbar == NULL);
m_spExtendControlbar = pExtendControlbar;
}
BOOL IsSameSnapin(const CLSID& clsidSnapin)
{
return IsEqualCLSID(m_clsidSnapin, clsidSnapin);
}
void SetCache(CControlbarsCache* pCache)
{
ASSERT(pCache != NULL);
m_pCache = pCache;
}
CMenuButtonsMgr* GetMenuButtonsMgr()
{
CViewData* pViewData = GetViewData();
if (NULL != pViewData)
{
return pViewData->GetMenuButtonsMgr();
}
return NULL;
}
CAMCViewToolbarsMgr* GetAMCViewToolbarsMgr()
{
CViewData* pViewData = GetViewData();
if (NULL != pViewData)
{
return pViewData->GetAMCViewToolbarsMgr();
}
return NULL;
}
private:
// private methods
CViewData* GetViewData();
SC ScCreateToolbar(LPEXTENDCONTROLBAR pExtendControlbar, LPUNKNOWN* ppUnknown);
SC ScCreateMenuButton(LPEXTENDCONTROLBAR pExtendControlbar, LPUNKNOWN* ppUnknown);
SC ScAttachToolbar(LPUNKNOWN lpUnknown);
SC ScAttachMenuButtons(LPUNKNOWN lpUnknown);
SC ScDetachToolbars();
SC ScDetachToolbar(LPTOOLBAR lpToolbar);
SC ScDetachMenuButton(LPMENUBUTTON lpMenuButton);
// Implementation
private:
IExtendControlbarPtr m_spExtendControlbar;
CLSID m_clsidSnapin;
CControlbarsCache* m_pCache;
// List of IToolbar implementations (CToolbar) created.
typedef std::list<CToolbar*> ToolbarsList;
// Toolbars specific data
ToolbarsList m_ToolbarsList;
CMenuButton* m_pMenuButton; // One per IControlbar.
}; // class CControlbar
typedef CTypedPtrList<MMC::CPtrList, CControlbar*> CControlbarsList;
class CSelData
{
public:
CSelData(bool bScopeSel, bool bSelect)
:
m_bScopeSel(bScopeSel), m_bSelect(bSelect), m_pNodeScope(NULL),
m_pMS(NULL), m_pCtrlbarPrimary(NULL), m_lCookie(-1),
m_pCompPrimary(NULL)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CSelData);
}
~CSelData()
{
DECLARE_SC(sc, _T("CSelData::~CSelData"));
sc = ScReset();
DEBUG_DECREMENT_INSTANCE_COUNTER(CSelData);
}
SC ScReset();
SC ScDestroyPrimaryCtrlbar();
SC ScDestroyExtensionCtrlbars();
SC ScShowToolbars(bool bShow);
bool operator==(CSelData& rhs)
{
if (m_bScopeSel != rhs.m_bScopeSel ||
m_bSelect != rhs.m_bSelect)
return false;
if (m_bScopeSel)
return (m_pNodeScope == rhs.m_pNodeScope);
else
return (m_pMS == rhs.m_pMS && m_lCookie == rhs.m_lCookie);
}
CControlbar* GetControlbar(const CLSID& clsidSnapin);
CControlbarsList& GetControlbarsList()
{
return m_listExtCBs;
}
bool IsScope()
{
return m_bScopeSel;
}
bool IsSelect()
{
return m_bSelect;
}
// Implementation
CComponent* m_pCompPrimary;
CControlbar* m_pCtrlbarPrimary;
CControlbarsList m_listExtCBs;
IDataObjectPtr m_spDataObject;
// data for scope sel
CNode* m_pNodeScope;
// data for result sel
CMultiSelection* m_pMS;
MMC_COOKIE m_lCookie;
bool m_bScopeSel;
bool m_bSelect;
}; // class CSelData
class CControlbarsCache : public IControlbarsCache,
public CComObjectRoot
{
public:
CControlbarsCache() : m_pViewData(NULL), m_SelData(false, false)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CControlbarsCache);
}
~CControlbarsCache()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(CControlbarsCache);
}
public:
// ATL COM map
BEGIN_COM_MAP(CControlbarsCache)
COM_INTERFACE_ENTRY(IControlbarsCache)
END_COM_MAP()
// IControlbarsCache methods
public:
STDMETHOD(DetachControlbars)()
{
DECLARE_SC(sc, _T("CControlbarsCache::DetachControlbars"));
sc = m_SelData.ScReset();
if (sc)
return sc.ToHr();
return sc.ToHr();
}
public:
HRESULT OnResultSelChange(CNode* pNode, MMC_COOKIE cookie, BOOL bSelected);
HRESULT OnScopeSelChange(CNode* pNode, BOOL bSelected);
HRESULT OnMultiSelect(CNode* pNodeScope, CMultiSelection* pMultiSelection,
IDataObject* pDOMultiSel, BOOL bSelect);
void SetViewData(CViewData* pViewData);
CViewData* GetViewData();
SC ScShowToolbars(bool bShow)
{
DECLARE_SC(sc, _T("CControlbarsCache::ScShowToolbars"));
return (sc = m_SelData.ScShowToolbars(bShow));
}
private:
CSelData m_SelData;
CViewData* m_pViewData;
// private methods
HRESULT _OnDeSelect(CSelData& selData);
CControlbar* CreateControlbar(IExtendControlbarPtr& spECB,
const CLSID& clsidSnapin);
HRESULT _ProcessSelection(CSelData& selData,
CList<CLSID, CLSID&>& extnSnapins);
}; // class CControlbarsCache
#endif // _CTRLBAR_H_