//____________________________________________________________________________ // // 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 NewNodeList; typedef CList CHMTNODEList; typedef CTypedPtrList CMTNodeList; typedef CList MTNodesList; typedef std::map 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 { 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, 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_