|
|
//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: Node.h
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 9/16/1996 RaviR Created
//
//____________________________________________________________________________
#ifndef _MMC_NODE_H_
#define _MMC_NODE_H_
#pragma once
#include "amcmsgid.h"
#include "refcount.h" // for CRefCountedObject
// A vector of strings to store column names
typedef std::vector<tstring> TStringVector;
///////////////////////////////////////////////////////////////////////////////
// Classes declared in this file
class CComponent; class CDataNotifyInfo;
class CNode; class CSnapInNode;
///////////////////////////////////////////////////////////////////////////////
// Forward declarations
class CConsoleTaskpad; class CResultItem; class CResultViewType; class CMMCClipBoardDataObject; class CViewSettingsPersistor;
///////////////////////////////////////////////////////////////////////////////
// Class declarations
//____________________________________________________________________________
//
// class: CComponent
//____________________________________________________________________________
//
class CComponent { DECLARE_NOT_COPIABLE (CComponent); DECLARE_NOT_ASSIGNABLE(CComponent); public: // Constructor & Destructor
CComponent(CSnapIn * pSnapIn); virtual ~CComponent();
// Attributes
const CLSID& GetCLSID() const { if (m_spSnapIn == NULL) return (GUID_NULL);
return m_spSnapIn->GetSnapInCLSID(); }
CSnapIn* GetSnapIn(void) const { return m_spSnapIn; }
IComponent* GetIComponent(void) const { return m_spIComponent; }
IFramePrivate* GetIFramePrivate(void) const { return m_spIFrame; }
IImageListPrivate* GetIImageListPrivate(void) const { return m_spIRsltImageList; }
// Operations
// Initialization
HRESULT Init(IComponentData* pIComponentData, HMTNODE hMTNode, HNODE lNode, COMPONENTID nComponentID, int viewID);
BOOL IsInitialized() { return (m_spIFrame != NULL); }
LPUNKNOWN GetUnknownToLoad(void) const { return m_spIComponent; }
// IComponent interface methods
HRESULT Initialize(LPCONSOLE lpConsole); HRESULT Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LONG_PTR arg, LPARAM param); HRESULT Destroy(MMC_COOKIE cookie); HRESULT QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); HRESULT GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppszViewType, long* pViewOptions); HRESULT GetDisplayInfo(RESULTDATAITEM* pResultDataItem);
// IComponent2 helper
SC ScQueryDispatch(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, PPDISPATCH ppSelectedObject);
void SetComponentID(COMPONENTID nID) { ASSERT(nID < 1000); m_ComponentID = nID; }
COMPONENTID GetComponentID(void) const { return m_ComponentID; }
void ResetComponentID(COMPONENTID id) { m_spIFrame->SetComponentID(m_ComponentID = id); }
SC ScResetConsoleVerbStates ();
// loaded from stream/storage; initailized with the new one; or does not need initialization
bool IsIComponentInitialized() { return m_bIComponentInitialized; }
// loaded from stream/storage; initailized with the new one; or does not need initialization
void SetIComponentInitialized() { m_bIComponentInitialized = true; }
private: // Implementation
CSnapInPtr m_spSnapIn;
IComponentPtr m_spIComponent; IFramePrivatePtr m_spIFrame; IImageListPrivatePtr m_spIRsltImageList;
COMPONENTID m_ComponentID; bool m_bIComponentInitialized;
// Helper methods
void Construct(CSnapIn * pSnapIn, CComponent* pComponent);
}; // class CComponent
class CComponentPtrArray : public CArray<CComponent*, CComponent*> { public: void AddComponent(CComponent* pCC) { for (int i = GetUpperBound(); i >= 0; --i) { if (GetAt(i) == pCC) return; }
Add(pCC); } };
//____________________________________________________________________________
//
// class: CNode
//
// PURPOSE: Each master tree node class (ie CMTxxx) has a matching CNode-derived
// class. The CNode-derived class objects encapsulate the view-dependent
// settings of the CMTNode derived object.
//
//____________________________________________________________________________
//
class CNode { DECLARE_NOT_ASSIGNABLE(CNode);
// Constructor & Destructor
protected: // only from CSnapInNode
CNode(CMTNode * pMTNode, CViewData* pViewData, bool fRootNode, bool fStaticNode); public: CNode(CMTNode * pMTNode, CViewData* pViewData, bool fRootNode); CNode(const CNode& other); virtual ~CNode();
// converters
static CNode* FromHandle (HNODE hNode); static CNode* FromResultItem (CResultItem* pri); static HNODE ToHandle (const CNode* pNode);
// Attributes
CViewData* GetViewData(void)const {ASSERT(m_pViewData != NULL); return m_pViewData;} int GetViewID(void) {ASSERT(m_pViewData != NULL);return m_pViewData->GetViewID();} virtual UINT GetResultImage() {return m_pMTNode->GetImage();} void SetDisplayName(LPCTSTR pName){m_pMTNode->SetDisplayName(pName);} void SetResultItem(HRESULTITEM hri){m_hri = hri;} long GetOwnerID(void) const{return m_pMTNode->GetOwnerID();}
void ResetFlags(); void SetExpandedAtLeastOnce(); BOOL WasExpandedAtLeastOnce(); void SetExpandedVisually(bool bExpanded); bool WasExpandedVisually(void); bool AllowNewWindowFromHere() const { return (m_pMTNode->AllowNewWindowFromHere()); }
tstring GetDisplayName(){return m_pMTNode->GetDisplayName();} CMTNode* GetMTNode() const {return m_pMTNode;} HRESULTITEM GetResultItem() const {return m_hri;} virtual BOOL NeedsViewToBePersisted(void){return FALSE;}
virtual CComponent* GetComponent(COMPONENTID nID); CComponent* GetPrimaryComponent(void); HRESULT InitComponents();
// Overridables
SC ScGetResultPane(CResultViewType &rvt, GUID *pGuidTaskpadID); BOOL IsDynamicNode() const {return !IsStaticNode();} BOOL IsStaticNode() const {return (m_fStaticNode);}
BOOL IsConsoleRoot(){return (GetMTNode()->Parent() == NULL);} BOOL IsRootNode() const {return m_fRootNode;} virtual LPUNKNOWN GetControl(CLSID& clsid); virtual LPUNKNOWN GetControl(LPUNKNOWN pUnkOCX);
virtual void SetControl(CLSID& clsid, IUnknown* pUnknown); virtual void SetControl(LPUNKNOWN pUnkOCX, IUnknown* pUnknown);
CSnapIn* GetPrimarySnapIn(void) {return GetPrimaryComponent()->GetSnapIn();} BOOL IsInitialized(void) {return !m_bInitComponents;} IUnknown* GetControlbarsCache(void) {return m_pViewData->GetControlbarsCache();}
HRESULT OnSelect(LPUNKNOWN lpView, BOOL bSelect, BOOL bResultPaneIsWeb); HRESULT OnScopeSelect(bool bSelect, SELECTIONINFO* pSelInfo); HRESULT OnListPad(LONG_PTR arg, LPARAM param); HRESULT IsTargetNode(CNode *pNodeTest) {return E_FAIL;} // do not change.
HRESULT OnExpand(bool fExpand); HRESULT OnGetPrimaryTask(IExtendTaskPad **ppExtendTaskPad); IFramePrivate * GetIFramePrivate(); HRESULT GetTaskEnumerator(LPOLESTR pszTaskGroup, IEnumTASK** ppEnumTask); HRESULT GetListPadInfo(IExtendTaskPad* pExtendTaskPad, LPOLESTR szTaskGroup, MMC_ILISTPAD_INFO* pIListPadInfo); void ResetControlbars(BOOL bSelect, SELECTIONINFO* pSelInfo);
void ResetVerbSets(BOOL bSelect, SELECTIONINFO* pSelInfo); HRESULT GetDataInfo(BOOL bSelect, SELECTIONINFO* pSelInfo, CDataNotifyInfo* pDNI); SC ScInitializeVerbs (bool bSelect, SELECTIONINFO* pSelInfo);
void OnTaskNotify(LONG_PTR arg, LPARAM param); virtual void OnWebContextMenu() {}; LPARAM GetUserParam(void); HRESULT GetDispInfoForListItem(LV_ITEMW* plvi); HRESULT GetDispInfo(LV_ITEMW* plvi);
HRESULT OnColumnClicked(LONG_PTR nCol); HRESULT OnInitOCX(IUnknown* pUnk); HRESULT OnCacheHint(int nStartIndex, int nEndIndex);
HRESULT SendShowEvent(BOOL bSelect);
HRESULT OnColumnsChange(CColumnInfoList& colInfoList); SC ScSetViewExtension(GUID *pGuidViewId, bool bUseDefaultTaskpad, bool bSetViewSettingsDirty); SC ScGetDataObject(bool bScopePane, LPARAM lResultItemCookie, bool& bScopeItem, LPDATAOBJECT* ppDataObject, CComponent **ppCComponent = NULL); SC ScGetPropertyFromINodeProperties(LPDATAOBJECT pDataObject, BOOL bForScopeItem, LPARAM resultItemParam, BSTR bstrPropertyName, PBSTR pbstrPropertyValue); SC ScExecuteShellCommand(BSTR Command, BSTR Directory, BSTR Parameters, BSTR WindowState); SC ScGetDropTargetDataObject(bool bScope, LPARAM lResultItemCookie, LPDATAOBJECT *ppDataObject);
CSnapInNode* GetStaticParent(void); HRESULT QueryDataObject(DATA_OBJECT_TYPES type, LPDATAOBJECT* ppdtobj); HRESULT GetNodeType(GUID* pGuid); SC ScSetupTaskpad(GUID *pGuidTaskpadID); HRESULT RestoreSort(INT nCol, DWORD dwSortOptions); SC ScRestoreSortFromPersistedData(); SC ScSaveSortData (int nCol, DWORD dwOptions); SC ScGetSnapinAndColumnDataID(GUID& snapinGuid, CXMLAutoBinary& columnID); SC ScRestoreResultView(const CResultViewType& rvt); SC ScRestoreViewMode(); SC ScSaveColumnInfoList(CColumnInfoList& columnInfoList); const CLSID& GetPrimarySnapInCLSID(void); HRESULT ExtractColumnConfigID(IDataObject* pDataObj, HGLOBAL& phGlobal); CLIPFORMAT GetColumnConfigIDCF();
void SetPrimaryComponent(CComponent* p) { ASSERT(m_pPrimaryComponent == NULL); m_pPrimaryComponent = p; }
SC ScGetCurrentColumnData( CColumnInfoList& columnInfoList, TStringVector& strColNames); SC ScShowColumn(int iColIndex, bool bShow); SC ScSetUpdatedColumnData( CColumnInfoList& oldColumnInfoList, CColumnInfoList& newColumnInfoList); SC ScGetSortColumn(int *piSortCol); SC ScSetSortColumn(int iSortCol, bool bAscending); SC ScGetViewExtensions(CViewExtInsertIterator it);
HRESULT ShowStandardListView(); HRESULT OnActvate(LONG_PTR lActivate); HRESULT OnMinimize(LONG_PTR fMinimized);
void Reset(); void SetInitComponents(BOOL b) { m_bInitComponents = b; } void OnColumns();
/***************************************************************************\
* * CLASS: CDataObjectCleanup * * PURPOSE: Groups methods to register/trigger data object clenup when * CNode, which data is put to data object goes away * * USAGE: Used from CMMCClipBoardDataObject to register nodes put to it * And used from ~CNode to trigger the cleanup * \***************************************************************************/ class CDataObjectCleanup { public: static SC ScRegisterNode(CNode *pNode, CMMCClipBoardDataObject *pObject); static SC ScUnadviseDataObject(CMMCClipBoardDataObject *pObject, bool bForceDataObjectCleanup = true); static SC ScUnadviseNode(CNode *pNode);
// mapping CNode to data object which contains it's data
typedef std::multimap<CNode *, CMMCClipBoardDataObject *> CMapOfNodes;
private: static CMapOfNodes s_mapOfNodes; };
// CViewSettingsPersistor's persistence interfaces.
static SC ScQueryViewSettingsPersistor(IPersistStream **ppStream); static SC ScQueryViewSettingsPersistor(CXMLObject **ppXMLObject); static SC ScOnDocumentClosing(); static SC ScDeleteViewSettings(int nVieWID); static SC ScSetFavoriteViewSettings (int nViewID, const CBookmark& bookmark, const CViewSettings& viewSettings);
SC ScSetViewMode (ULONG ulViewMode); SC ScSetTaskpadID(const GUID& guidTaskpad, bool bSetDirty);
// Implementation
private: HRESULT DeepNotify (MMC_NOTIFY_TYPE event, LONG_PTR arg, LPARAM param); SC ScInitializeViewExtension(const CLSID& clsid, CViewData *pViewData);
void CommonConstruct();
// Get & Set persisted ViewSettings data.
SC ScGetTaskpadID(GUID& guidTaskpad); SC ScGetConsoleTaskpad (const GUID& guidTaskpad, CConsoleTaskpad **ppTaskpad);
SC ScGetViewMode (ULONG& ulViewMode);
SC ScGetResultViewType (CResultViewType& rvt); SC ScSetResultViewType (const CResultViewType& rvt);
private: CMTNode* const m_pMTNode; // ptr back to the master node.
HRESULTITEM m_hri; // this node's result item handle
CViewData* m_pViewData; DWORD m_dwFlags;
enum { flag_expanded_at_least_once = 0x00000001, flag_expanded_visually = 0x00000002, };
CComponent* m_pPrimaryComponent; bool m_bInitComponents : 1; const bool m_fRootNode : 1; const bool m_fStaticNode : 1;
static CComObject<CViewSettingsPersistor>* m_pViewSettingsPersistor; };
//____________________________________________________________________________
//
// class: COCX
//
// Purpose: Store the IUnknown ptr of OCX wrapper and an identifier for
// the OCX. The identifier may be CLSID of the OCX or
// the IUnknown ptr of the OCX.
//
// In essence a OCXWrapper can be saved using CLSID of OCX as
// the key (IComponent::GetResultViewType) or IUnknown* of OCX
// as the key (IComponent2::GetResultViewType2).
//
// Therefore we have overloaded version of SetControl below.
//
//____________________________________________________________________________
//
class COCX { public: // Constructor & Destructor
COCX(void); ~COCX(void);
// Attributes
void SetControl(CLSID& clsid, IUnknown* pUnknown); BOOL IsControlCLSID(CLSID clsid) { return IsEqualCLSID(clsid, m_clsid); } IUnknown* GetControlUnknown() { return m_spOCXWrapperUnknown;}
void SetControl(LPUNKNOWN pUnkOCX, LPUNKNOWN pUnkOCXWrapper);
//
// Compare the IUnknown given and the one stored.
//
bool IsSameOCXIUnknowns(IUnknown *pOtherOCXUnknown) { return m_spOCXUnknown.IsEqualObject(pOtherOCXUnknown);}
// Implementation
private:
// Only one of CLSID or m_spOCXUnknown is valid, see class purpose for details.
CLSID m_clsid; CComPtr<IUnknown> m_spOCXUnknown;
CComPtr<IUnknown> m_spOCXWrapperUnknown;
}; // COCX
//____________________________________________________________________________
//
// class: CSnapInNode
//____________________________________________________________________________
//
class CSnapInNode : public CNode { public: // Constructor & Destructor
CSnapInNode(CMTSnapInNode* pMTNode, CViewData* pViewData, bool fRootNode); CSnapInNode(const CSnapInNode& other); ~CSnapInNode();
// Attributes
virtual UINT GetResultImage(); virtual BOOL NeedsViewToBePersisted(void) { return TRUE; }
virtual void SetControl(CLSID& clsid, IUnknown* pUnknown); virtual LPUNKNOWN GetControl(CLSID& clsid); void CloseControls() { GetOCXArray().RemoveAll(); } virtual void SetControl(LPUNKNOWN pUnkOCX, IUnknown* pUnknown); virtual LPUNKNOWN GetControl(LPUNKNOWN pUnkOCX);
CComponentArray& GetComponentArray(void) { return m_spData->GetComponentArray(); }
// Operations
// User interactions
BOOL Activate(LPUNKNOWN pUnkResultsPane); BOOL DeActivate(HNODE hNode); BOOL Show(HNODE hNode); void Reset();
int GetNumberOfComponents() { return GetComponentArray().size(); }
void AddComponentToArray(CComponent* pCC); CComponent* CreateComponent(CSnapIn* pSnapIn, int nID); CComponent* GetComponent(const CLSID& clsid); virtual CComponent* GetComponent(COMPONENTID nID); void DeleteComponent(COMPONENTID nID) { ASSERT(nID >= 0); int iMax = GetComponentArray().size() -1; ASSERT(nID <= iMax);
if (nID < iMax) { delete GetComponentArray()[nID]; GetComponentArray()[nID] = GetComponentArray()[iMax]; GetComponentArray()[iMax] = 0; GetComponentArray()[iMax]->ResetComponentID(nID); } GetComponentArray().resize(iMax); }
void SetResultImageList (IImageListPrivate* pImageList) { m_spData->SetImageList(pImageList); }
// Implementation
private: class CDataImpl { public: CDataImpl() : m_pImageList(NULL) {}
~CDataImpl() { Reset(); }
void Reset() { for (int i=0; i < m_ComponentArray.size(); i++) delete m_ComponentArray[i];
m_ComponentArray.clear(); }
private: IImageListPrivate* m_pImageList; // result image list
// Components array.
CComponentArray m_ComponentArray; CArray<COCX, COCX&> m_rgOCX;
public: void SetImageList(IImageListPrivate *pImageList) {m_pImageList = pImageList;} IImageListPrivate * GetImageList() {return m_pImageList;} CComponentArray & GetComponentArray(){return m_ComponentArray;} CArray<COCX, COCX&> & GetOCXArray() {return m_rgOCX;}
}; // CSnapInNode::CDataImpl
typedef CRefCountedObject<CDataImpl> CData; CData::SmartPtr m_spData;
IImageListPrivate * GetImageList() {return m_spData->GetImageList();} CArray<COCX, COCX&> & GetOCXArray() {return m_spData->GetOCXArray();}
}; // CSnapInNode
#include "node.inl"
#endif // _MMC_NODE_H_
|