342 lines
10 KiB
C++
342 lines
10 KiB
C++
//____________________________________________________________________________
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: ScopTree.h
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History:
|
|
//____________________________________________________________________________
|
|
//
|
|
|
|
#ifndef _SCOPTREE_H_
|
|
#define _SCOPTREE_H_
|
|
|
|
class CDocument;
|
|
class CNode;
|
|
class CMTNode;
|
|
class CSPImageCache;
|
|
class CMTSnapInNode;
|
|
class CExtensionsCache;
|
|
class CSnapIn;
|
|
class CMultiSelection;
|
|
class CConsoleTaskpad;
|
|
class CConsoleTaskpadList;
|
|
class CDefaultTaskpadList;
|
|
class CConsoleFrame;
|
|
class CNewTreeNode;
|
|
|
|
typedef CNewTreeNode* PNEWTREENODE;
|
|
typedef CList <PNEWTREENODE, PNEWTREENODE> NewNodeList;
|
|
typedef CList<HMTNODE, HMTNODE> CHMTNODEList;
|
|
typedef CTypedPtrList<MMC::CPtrList, CMTNode*> CMTNodeList;
|
|
typedef CList<CMTNode*, CMTNode*> MTNodesList;
|
|
typedef std::map<CMTNode*, PNODE> CMapMTNodeToMMCNode;
|
|
|
|
typedef CMTSnapInNode * PMTSNAPINNODE;
|
|
|
|
// forward declarations for external classes
|
|
class CBookmark;
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* class CMMCScopeNode
|
|
*
|
|
*
|
|
* PURPOSE: Implements the Node automation interface, for a scope node
|
|
*
|
|
*+-------------------------------------------------------------------------*/
|
|
class CMMCScopeNode :
|
|
public CMMCIDispatchImpl<Node>
|
|
{
|
|
friend class CScopeTree;
|
|
|
|
public:
|
|
BEGIN_MMC_COM_MAP(CMMCScopeNode)
|
|
END_MMC_COM_MAP()
|
|
|
|
// Node methods
|
|
public:
|
|
STDMETHODIMP get_Name( PBSTR pbstrName);
|
|
STDMETHODIMP get_Property( BSTR PropertyName, PBSTR PropertyValue);
|
|
STDMETHODIMP get_Bookmark( PBSTR pbstrBookmark);
|
|
STDMETHODIMP IsScopeNode(PBOOL pbIsScopeNode);
|
|
STDMETHODIMP get_Nodetype(PBSTR Nodetype);
|
|
|
|
|
|
// determines whether the object is valid or not.
|
|
::SC ScIsValid();
|
|
|
|
~CMMCScopeNode();
|
|
public: // accessors
|
|
CMTNode *GetMTNode() {return m_pMTNode;}
|
|
void ResetMTNode() {m_pMTNode = NULL;}
|
|
|
|
private:
|
|
::SC ScGetDataObject(IDataObject **ppDataObject); // returns the data object for the underlying scope node.
|
|
|
|
private: // implementation
|
|
CMTNode *m_pMTNode;
|
|
};
|
|
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// class: CScopeTree
|
|
//____________________________________________________________________________
|
|
//
|
|
class CScopeTree :
|
|
public IScopeTree,
|
|
public IPersistStorage,
|
|
public CComObjectRoot,
|
|
public CComCoClass<CScopeTree, &CLSID_ScopeTree>,
|
|
public CTiedObject
|
|
{
|
|
|
|
// Constructor/Destructor
|
|
public:
|
|
CScopeTree();
|
|
~CScopeTree();
|
|
|
|
|
|
public:
|
|
#ifdef DBG
|
|
ULONG InternalAddRef()
|
|
{
|
|
return CComObjectRoot::InternalAddRef();
|
|
}
|
|
ULONG InternalRelease()
|
|
{
|
|
return CComObjectRoot::InternalRelease();
|
|
}
|
|
int dbg_InstID;
|
|
#endif // DBG
|
|
|
|
|
|
// ATL Map
|
|
public:
|
|
BEGIN_COM_MAP(CScopeTree)
|
|
COM_INTERFACE_ENTRY(IScopeTree)
|
|
COM_INTERFACE_ENTRY(IPersistStorage)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CScopeTree)
|
|
|
|
DECLARE_MMC_OBJECT_REGISTRATION (
|
|
g_szMmcndmgrDll, // implementing DLL
|
|
CLSID_ScopeTree, // CLSID
|
|
_T("ScopeTree 1.0 Object"), // class name
|
|
_T("NODEMGR.ScopeTreeObject.1"), // ProgID
|
|
_T("NODEMGR.ScopeTreeObject")) // version-independent ProgID
|
|
|
|
private: // Object model related tied COM objects
|
|
SnapInsPtr m_spSnapIns;
|
|
ScopeNamespacePtr m_spScopeNamespace;
|
|
|
|
public: // Object model methods
|
|
// SnapIns interface
|
|
typedef PMTSNAPINNODE CSnapIns_Positon;
|
|
CMTSnapInNode *GetNextStaticNode(CMTNode *pMTNode);
|
|
|
|
SC ScAdd (BSTR bstrSnapinNameOrCLSID, VARIANT varParentSnapin,
|
|
VARIANT varProperties, SnapIn** ppSnapIn); // add a snap-in.
|
|
SC ScItem(long Index, PPSNAPIN ppSnapIn);
|
|
SC ScRemove(PSNAPIN pSnapIn);
|
|
SC Scget_Count(PLONG pCount);
|
|
|
|
// SnapIns enumerator
|
|
SC ScGetNextSnapInPos(CSnapIns_Positon &pos); // helper function
|
|
|
|
SC ScEnumNext(CSnapIns_Positon &pos, PDISPATCH & pDispatch);
|
|
SC ScEnumSkip(unsigned long celt, unsigned long& celtSkipped, CSnapIns_Positon &pos);
|
|
SC ScEnumReset( CSnapIns_Positon &pos);
|
|
|
|
// ScopeNamespace interface
|
|
SC ScGetParent(PNODE pNode, PPNODE ppChild);
|
|
SC ScGetChild(PNODE pNode, PPNODE ppChild);
|
|
SC ScGetNext(PNODE pNode, PPNODE ppNext);
|
|
SC ScGetRoot(PPNODE ppRoot);
|
|
SC ScExpand(PNODE pNode);
|
|
|
|
|
|
// helpers
|
|
private:
|
|
SC ScGetNode(CMTNode *pMTNode, PPNODE ppOut); // creates a Node interface object for the given MTNode.
|
|
SC ScGetRootNode(PPNODE ppRootNode); // Calls above method to get to Root node.
|
|
|
|
public:
|
|
SC ScGetNode(PNODE pNode, CMTNode **ppMTNodeOut);
|
|
|
|
// Operations
|
|
public:
|
|
// IScopeTree methods
|
|
STDMETHOD(Initialize)(HWND hwndFrame, IStringTablePrivate* pStringTable);
|
|
STDMETHOD(QueryIterator)(IScopeTreeIter** ppIter);
|
|
STDMETHOD(QueryNodeCallback)(INodeCallback** ppNodeCallback);
|
|
STDMETHOD(CreateNode)(HMTNODE hMTNode, LONG_PTR lViewData, BOOL fRootNode,
|
|
HNODE* phNode);
|
|
|
|
STDMETHOD(CloseView)(int nView);
|
|
STDMETHOD(DeleteView)(int nView);
|
|
STDMETHOD(DestroyNode)(HNODE hNode);
|
|
STDMETHOD(Find)(MTNODEID mID, HMTNODE* hMTNode);
|
|
STDMETHOD(Find)(MTNODEID mID, CMTNode** ppMTNode);
|
|
STDMETHOD(GetImageList)(PLONG_PTR pImageList);
|
|
STDMETHOD(RunSnapIn)(HWND hwndParent);
|
|
STDMETHOD(GetFileVersion)(IStorage* pstgRoot, int* pnVersion);
|
|
STDMETHOD(GetNodeIDFromBookmark)(HBOOKMARK hbm, MTNODEID* pID, bool& bExactMatchFound);
|
|
STDMETHOD(GetNodeIDFromStream)(IStream *pStm, MTNODEID* pID);
|
|
STDMETHOD(GetNodeFromBookmark)(HBOOKMARK hbm, CConsoleView *pConsoleView, PPNODE ppNode, bool& bExactMatchFound); // get the node from bookmark
|
|
STDMETHOD(GetIDPath)(MTNODEID id, MTNODEID** ppIDs, long* pLength);
|
|
STDMETHOD(IsSynchronousExpansionRequired)();
|
|
STDMETHOD(RequireSynchronousExpansion)(BOOL fRequireSyncExpand);
|
|
STDMETHOD(SetConsoleData)(LPARAM lConsoleData);
|
|
STDMETHOD(GetPathString)(HMTNODE hmtnRoot, HMTNODE hmtnLeaf, LPOLESTR* pPath);
|
|
STDMETHOD(QuerySnapIns)(SnapIns **ppSnapIns);
|
|
STDMETHOD(QueryScopeNamespace)(ScopeNamespace **ppScopeNamespace);
|
|
STDMETHOD(CreateProperties)(Properties** ppProperties);
|
|
STDMETHOD(GetNodeID)(PNODE pNode, MTNODEID *pID);
|
|
STDMETHOD(GetHMTNode)(PNODE pNode, HMTNODE *phMTNode);
|
|
STDMETHOD(GetMMCNode)(HMTNODE hMTNode, PPNODE ppNode);
|
|
STDMETHOD(QueryRootNode)(PPNODE ppNode);
|
|
STDMETHOD(IsSnapinInUse)(REFCLSID refClsidSnapIn, PBOOL pbInUse);
|
|
|
|
STDMETHOD(Persist)(HPERSISTOR pPersistor);
|
|
|
|
// IPersistStorage methods
|
|
STDMETHOD(HandsOffStorage)(void);
|
|
STDMETHOD(InitNew)(IStorage *pStg);
|
|
STDMETHOD(IsDirty)(void);
|
|
STDMETHOD(Load)(IStorage *pStg);
|
|
STDMETHOD(Save)(IStorage *pStg, BOOL fSameAsLoad);
|
|
STDMETHOD(SaveCompleted)(IStorage *pStg);
|
|
|
|
// IPersist method
|
|
STDMETHOD(GetClassID)(CLSID *pClassID);
|
|
|
|
// snap-in addition and removal
|
|
SC ScAddOrRemoveSnapIns(MTNodesList * pmtnDeletedList, NewNodeList * pnnList);
|
|
public:
|
|
SC ScAddSnapin(LPCWSTR szSnapinNameOrCLSID, SnapIn* pParentSnapinNode, Properties* varProperties, SnapIn*& rpSnapIn);
|
|
|
|
|
|
private: // taskpad persistence
|
|
HRESULT LoadTaskpadList(IStorage *pStg);
|
|
|
|
// Attributes
|
|
public:
|
|
CMTNode* GetRoot(void);
|
|
CSPImageCache* GetImageCache(void) { return m_pImageCache; }
|
|
|
|
/*
|
|
* convenient, type-safe alternative to IScopeTree::GetImageList
|
|
*/
|
|
HIMAGELIST GetImageList () const;
|
|
|
|
// Operations
|
|
SC ScInsert(LPSCOPEDATAITEM pSDI, COMPONENTID nID,
|
|
CMTNode** ppMTNodeNew);
|
|
SC ScInsert(CMTNode* pmtnParent, CMTNode* pmtnToInsert);
|
|
SC ScDelete(CMTNode* pmtn, BOOL fDeleteThis, COMPONENTID nID);
|
|
void DeleteNode(CMTNode* pmtn);
|
|
void UpdateAllViews(LONG lHint, LPARAM lParam);
|
|
void Cleanup(void);
|
|
|
|
HWND GetMainWindow()
|
|
{
|
|
return (m_pConsoleData->m_hwndMainFrame);
|
|
}
|
|
|
|
static IStringTablePrivate* GetStringTable()
|
|
{
|
|
return (m_spStringTable);
|
|
}
|
|
|
|
static bool _IsSynchronousExpansionRequired()
|
|
{
|
|
return (m_fRequireSyncExpand);
|
|
}
|
|
|
|
static void _RequireSynchronousExpansion(bool fRequireSyncExpand)
|
|
{
|
|
m_fRequireSyncExpand = fRequireSyncExpand;
|
|
}
|
|
|
|
static CScopeTree* GetScopeTree()
|
|
{
|
|
return (m_pScopeTree);
|
|
}
|
|
|
|
PersistData* GetPersistData() const
|
|
{
|
|
return m_spPersistData;
|
|
}
|
|
|
|
SConsoleData* GetConsoleData() const
|
|
{
|
|
return m_pConsoleData;
|
|
}
|
|
|
|
CConsoleFrame* GetConsoleFrame() const
|
|
{
|
|
return ((m_pConsoleData != NULL) ? m_pConsoleData->GetConsoleFrame() : NULL);
|
|
}
|
|
|
|
CConsoleTaskpadList* GetConsoleTaskpadList() const
|
|
{
|
|
return (m_pConsoleTaskpads);
|
|
}
|
|
|
|
CDefaultTaskpadList* GetDefaultTaskpadList() const
|
|
{
|
|
return (m_pDefaultTaskpads);
|
|
}
|
|
|
|
SC ScSetHelpCollectionInvalid();
|
|
|
|
HRESULT InsertConsoleTaskpad (CConsoleTaskpad *pConsoleTaskpad,
|
|
CNode *pNodeTarget, bool bStartTaskWizard);
|
|
|
|
SC ScUnadviseMTNode(CMTNode* pMTNode); // called from ~CMTNode()
|
|
SC ScUnadviseMMCScopeNode(PNODE pNode); // called from ~MMCScopeNode();
|
|
|
|
// Implementation
|
|
private:
|
|
// the one and only CScopeTree for this console
|
|
static CScopeTree* m_pScopeTree;
|
|
CMTNode* m_pMTNodeRoot;
|
|
CSPImageCache* m_pImageCache;
|
|
PersistDataPtr m_spPersistData;
|
|
CMTNodeList m_MTNodesToBeReset;
|
|
SConsoleData* m_pConsoleData;
|
|
CConsoleTaskpadList* m_pConsoleTaskpads;
|
|
CDefaultTaskpadList* m_pDefaultTaskpads;
|
|
CMapMTNodeToMMCNode m_mapMTNodeToMMCNode;
|
|
|
|
static bool m_fRequireSyncExpand;
|
|
static IStringTablePrivatePtr m_spStringTable;
|
|
|
|
CMTNode* _FindLastChild(CMTNode* pMTNodeParent);
|
|
CMTNode* _FindPrev(CMTNode* pMTNode);
|
|
void _DeleteNode(CMTNode* pmtn);
|
|
void _GetPathString(CMTNode* pmtnRoot, CMTNode* pmtnCur, CStr& strPath);
|
|
void DeleteDynamicNodes(CMTNode* pMTNode);
|
|
BOOL ExtensionsHaveChanged(CMTSnapInNode* pMTSINode);
|
|
void HandleExtensionChanges(CMTNode* pMTNode);
|
|
|
|
// Not implemented
|
|
CScopeTree(const CScopeTree& rhs);
|
|
CScopeTree& operator= (const CScopeTree& rhs);
|
|
|
|
}; // CScopeTree
|
|
|
|
#endif // _SCOPTREE_H_
|
|
|
|
|