394 lines
11 KiB
C++
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;
|
|
};
|
|
|
|
|