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

394 lines
11 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: propsht.h
//
//--------------------------------------------------------------------------
// Declaration for callback functions
LRESULT CALLBACK MessageProc(int nCode, WPARAM wParam, LPARAM lParam);
// Declaration for data window wnd Proc
LRESULT CALLBACK DataWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
// Forward declarations
class CNodeInitObject;
class CPropertySheetProvider;
// Type definitions
typedef CList<HANDLE, HANDLE> PAGE_LIST;
#include "tstring.h"
enum EPropertySheetType
{
epstScopeItem = 0,
epstResultItem = 1,
epstMultipleItems = 2,
};
///////////////////////////////////////////////////////////////////////////////
// CThreadData - Base class for thread based objects
//
namespace AMC
{
class CThreadData
{
public:
CThreadData() {m_dwTid = 0;};
public:
UINT m_dwTid;
};
}
class CNoPropsPropertyPage : public WTL::CPropertyPageImpl<CNoPropsPropertyPage>
{
typedef WTL::CPropertyPageImpl<CNoPropsPropertyPage> BaseClass;
public:
CNoPropsPropertyPage() {}
~CNoPropsPropertyPage() {}
public:
enum { IDD = IDD_NOPROPS_PROPPAGE };
BEGIN_MSG_MAP(CSnapinAboutPage)
CHAIN_MSG_MAP(BaseClass)
END_MSG_MAP()
};
//+-------------------------------------------------------------------
//
// Class: CPropertySheetToolTips
//
// Purpose: This class has stores tooltip data for
// the property sheets. This includes fullpath
// from the console root to property sheet owner
// node, owner name and an array of snapin name
// indexed by property page tab number.
//
// History: 06-18-1999 AnandhaG Created
//
//--------------------------------------------------------------------
class CPropertySheetToolTips : public WTL::CToolTipCtrl
{
// This is the id used for the tool tip control for property sheet
// title. So when we get TTN_NEEDTEXT we can identify if the text
// is for title or a tab.
#define PROPSHEET_TITLE_TOOLTIP_ID 1234
private:
tstring m_strThisSnapinName; // This is a temp member variable that has
// snapin that is currently adding pages
// This is used while constructing below
// array of pages.
std::vector<tstring> m_strSnapins; // Property page (tab) owner snapins array
tstring m_strFullPath;
tstring m_strItemName;
EPropertySheetType m_PropSheetType;
public:
CPropertySheetToolTips()
{
}
CPropertySheetToolTips(const CPropertySheetToolTips& sp)
{
m_strThisSnapinName = sp.m_strThisSnapinName;
m_strSnapins = sp.m_strSnapins;
m_strFullPath = sp.m_strFullPath;
}
CPropertySheetToolTips& operator=(const CPropertySheetToolTips& sp)
{
if (this != &sp)
{
m_strThisSnapinName = sp.m_strThisSnapinName;
m_strSnapins = sp.m_strSnapins;
m_strFullPath = sp.m_strFullPath;
}
return (*this);
}
void SetThisSnapin(LPCTSTR szName)
{
m_strThisSnapinName = szName;
}
LPCTSTR GetThisSnapin()
{
return m_strThisSnapinName.data();
}
void AddSnapinPage()
{
m_strSnapins.push_back(m_strThisSnapinName);
}
LPCTSTR GetSnapinPage(int nIndex)
{
return m_strSnapins[nIndex].data();
}
INT GetNumPages()
{
return m_strSnapins.size();
}
LPCTSTR GetFullPath()
{
return m_strFullPath.data();
}
void SetFullPath(LPTSTR szName, BOOL bAddEllipses = FALSE)
{
m_strFullPath = szName;
if (bAddEllipses)
m_strFullPath += _T("...");
}
void SetItemName(LPTSTR szName)
{
m_strItemName = szName;
}
LPCTSTR GetItemName()
{
return m_strItemName.data();
}
void SetPropSheetType(EPropertySheetType propSheetType)
{
m_PropSheetType = propSheetType;
}
EPropertySheetType GetPropSheetType()
{
return m_PropSheetType;
}
};
///////////////////////////////////////////////////////////////////////////////
// CPropertySheet - Basic property sheet class
//
namespace AMC
{
class CPropertySheet : public AMC::CThreadData
{
friend class CPropertySheetProvider;
// Constructor/Destructor
public:
CPropertySheet();
virtual ~CPropertySheet();
private:
/*
* copy construction and assignment aren't supported;
* insure the compiler doesn't generate defaults
*/
CPropertySheet (const CPropertySheet& other);
CPropertySheet& operator= (const CPropertySheet& other);
// Interface
public:
void CommonConstruct();
BOOL Create(LPCTSTR lpszCaption, bool fPropSheet, MMC_COOKIE cookie, LPDATAOBJECT pDataObject,
LONG_PTR lpMasterTreeNode, DWORD dwOptions);
HRESULT DoSheet(HWND hParent, int nPage); // create property sheet/pages and go modeless
BOOL AddExtensionPages();
void AddNoPropsPage();
BOOL CreateDataWindow(HWND hParent); // create the hidden data window
bool IsWizard() const { return (m_pstHeader.dwFlags & (PSH_WIZARD97 | PSH_WIZARD)); }
bool IsWizard97() const { return (m_pstHeader.dwFlags & PSH_WIZARD97); }
void GetWatermarks (IExtendPropertySheet2* pExtend2);
DWORD GetOriginatingThreadID () const
{
return (m_dwThreadID);
}
void ForceOldStyleWizard ();
// Attributes
public:
PROPSHEETHEADER m_pstHeader; //
PAGE_LIST m_PageList; // page list for property sheet
MMC_COOKIE m_cookie;
LONG_PTR m_lpMasterNode; // master tree pointer
LPSTREAM m_pStream; // Stream for marshalled pointer
LPDATAOBJECT m_pThreadLocalDataObject; // Marshalled data object pointer
CMTNode* m_pMTNode; // MTNode of property sheet owner
const DWORD m_dwThreadID; // ID of thread that created property sheet
/*
* Bug 187702: Use CXxxHandle instead of CXxx so the resources
* will *not* be cleaned up on destruction. Yes, this may leak if
* the if the snap-in doesn't manage the object lifetime (which it
* shouldn't have to do because these are OUT parameters for
* IExtendPropertySheet2::GetWatermarks), but it's required for app
* compat.
*/
WTL::CBitmapHandle m_bmpWatermark;
WTL::CBitmapHandle m_bmpHeader;
WTL::CPaletteHandle m_Palette;
public:
void SetDataObject( IDataObject *pDataObject) {m_spDataObject = pDataObject;}
void SetComponent( IComponent *pComponent) {m_spComponent = pComponent;}
void SetComponentData(IComponentData *pComponentData){m_spComponentData = pComponentData;}
IDataObject* GetDataObject() { return m_spDataObject.GetInterfacePtr();}
IComponent * GetComponent() { return m_spComponent.GetInterfacePtr();}
IComponentData * GetComponentData() { return m_spComponentData.GetInterfacePtr();}
private:
IDataObjectPtr m_spDataObject;
IComponentDataPtr m_spComponentData;
IComponentPtr m_spComponent;
// components that extend this prop sheet
std::vector<IUnknownPtr> m_Extenders;
// streams containing exterders' marshalled interfaces (if required)
std::vector<IStream*> m_ExtendersMarshallStreams;
// Message handlers
public:
LRESULT OnCreate(CWPRETSTRUCT* pMsg);
LRESULT OnInitDialog(CWPRETSTRUCT* pMsg);
LRESULT OnNcDestroy(CWPRETSTRUCT* pMsg);
LRESULT OnWMNotify(CWPRETSTRUCT* pMsg);
public:
HWND m_hDlg; // property sheet hwnd
HHOOK m_msgHook; // hook handle for page, only valid through WM_INITDIALOG
HWND m_hDataWindow; // hidden data window
BOOL m_bModalProp; // TRUE if the property sheet should be modal
BOOL m_bAddExtension;// TRUE if we need to add extension pages
private:
HPROPSHEETPAGE m_pages[MAXPROPPAGES];
CStr m_title;
CNoPropsPropertyPage m_NoPropsPage;
public:
// Tooltip data
CPropertySheetToolTips m_PropToolTips;
};
}
///////////////////////////////////////////////////////////////////////////////
// CThreadToSheetMap - Maps thread IDs to CPropertySheetObjects.
//
class CThreadToSheetMap
{
public:
typedef DWORD KEY;
typedef AMC::CPropertySheet * VALUE;
typedef std::map<KEY, VALUE> CMap;
CThreadToSheetMap(){};
~CThreadToSheetMap(){};
public:
void Add(KEY id, VALUE pObject)
{
CSingleLock lock(&m_critSection, TRUE);
m_map[id] = pObject;
}
void Remove(KEY id)
{
CSingleLock lock(&m_critSection, TRUE);
m_map.erase(id);
}
BOOL Find(KEY id, VALUE& pObject)
{
CSingleLock lock(&m_critSection, TRUE);
std::map<KEY, VALUE>::iterator it = m_map.find(id);
if(it == m_map.end())
return false;
pObject = it->second;
return true;
}
public:
CCriticalSection m_critSection;
private:
CMap m_map;
};
///////////////////////////////////////////////////////////////////////////////
// CPropertySheetProvider - The implementation for the IPropertySheetProvider
// interface.
class CPropertySheetProvider :
public IPropertySheetProviderPrivate,
public IPropertySheetCallback,
public IPropertySheetNotify
{
friend class AMCPropertySheet;
public:
CPropertySheetProvider();
~CPropertySheetProvider();
// IPropertySheetProviderPrivate
public:
STDMETHOD(CreatePropertySheet)(LPCWSTR title, unsigned char bType, MMC_COOKIE cookie,
LPDATAOBJECT pDataObject, DWORD dwOptions);
STDMETHOD(CreatePropertySheetEx)(LPCWSTR title, unsigned char bType, MMC_COOKIE cookie,
LPDATAOBJECT pDataObject, LONG_PTR lpMasterTreeNode, DWORD dwOptions);
STDMETHOD(Show)(LONG_PTR window, int page);
STDMETHOD(ShowEx)(HWND hwnd, int page, BOOL bModalPage);
STDMETHOD(FindPropertySheet)(MMC_COOKIE cookie, LPCOMPONENT lpComponent, LPDATAOBJECT lpDataObject);
STDMETHOD(AddPrimaryPages)(LPUNKNOWN lpUnknown, BOOL bCreateHandle, HWND hNotifyWindow, BOOL bScopePane);
STDMETHOD(AddExtensionPages)();
STDMETHOD(AddMultiSelectionExtensionPages)(LONG_PTR lMultiSelection);
STDMETHOD(FindPropertySheetEx)(MMC_COOKIE cookie, LPCOMPONENT lpComponent,
LPCOMPONENTDATA lpComponentData, LPDATAOBJECT lpDataObject);
STDMETHOD(SetPropertySheetData)(INT nPropSheetType, HMTNODE hMTNode);
// IPropertySheetCallback
public:
STDMETHOD(AddPage)(HPROPSHEETPAGE page);
STDMETHOD(RemovePage)(HPROPSHEETPAGE page);
// IPropertySheetNotify
public:
STDMETHOD(Notify)(LPPROPERTYNOTIFYINFO pNotify, LPARAM lParam);
// Objects in common with all instances of IPropertySheetProvider(s)
static CThreadToSheetMap TID_LIST;
public:
AMC::CPropertySheet* m_pSheet;
};