windows-nt/Source/XPSP1/NT/admin/pchealth/sysinfo/msconfig/control/msconfigctl.h

385 lines
12 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
// MSConfigCtl.h : Declaration of the CMSConfigCtl
#ifndef __MSCONFIGCTL_H_
#define __MSCONFIGCTL_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include "pagegeneral.h"
#include "pagebootini.h"
#include "pageini.h"
#include "pageinternational.h"
#include "pageregistry.h"
#include "pageservices.h"
#include "pagestartup.h"
#include "msconfigstate.h"
#include "undolog.h"
//=============================================================================
// This class implements the main control for MSConfig. Each page of the
// tab control will be implemented by a distinct object - the objects
// are created here and the tabs are added to the tab control.
//=============================================================================
class ATL_NO_VTABLE CMSConfigCtl :
public CComObjectRootEx<CComSingleThreadModel>,
public IDispatchImpl<IMSConfigCtl, &IID_IMSConfigCtl, &LIBID_MSCONFIGLib>,
public CComCompositeControl<CMSConfigCtl>,
public IPersistStreamInitImpl<CMSConfigCtl>,
public IOleControlImpl<CMSConfigCtl>,
public IOleObjectImpl<CMSConfigCtl>,
public IOleInPlaceActiveObjectImpl<CMSConfigCtl>,
public IViewObjectExImpl<CMSConfigCtl>,
public IOleInPlaceObjectWindowlessImpl<CMSConfigCtl>,
public IPersistStorageImpl<CMSConfigCtl>,
public ISpecifyPropertyPagesImpl<CMSConfigCtl>,
public IQuickActivateImpl<CMSConfigCtl>,
public IDataObjectImpl<CMSConfigCtl>,
public IProvideClassInfo2Impl<&CLSID_MSConfigCtl, NULL, &LIBID_MSCONFIGLib>,
public CComCoClass<CMSConfigCtl, &CLSID_MSConfigCtl>
{
public:
CMSConfigCtl() :
m_hwndParent(NULL),
m_fDoNotRun(FALSE),
m_fRunningInHelpCtr(FALSE)
{
m_bWindowOnly = TRUE;
CalcExtent(m_sizeExtent);
}
DECLARE_REGISTRY_RESOURCEID(IDR_MSCONFIGCTL)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMSConfigCtl)
COM_INTERFACE_ENTRY(IMSConfigCtl)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()
BEGIN_PROP_MAP(CMSConfigCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_MSG_MAP(CMSConfigCtl)
CHAIN_MSG_MAP(CComCompositeControl<CMSConfigCtl>)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
NOTIFY_HANDLER(IDC_MSCONFIGTAB, TCN_SELCHANGE, OnSelChangeMSConfigTab)
NOTIFY_HANDLER(IDC_MSCONFIGTAB, TCN_SELCHANGING, OnSelChangingMSConfigTab)
COMMAND_HANDLER(IDC_BUTTONCANCEL, BN_CLICKED, OnClickedButtonCancel)
COMMAND_HANDLER(IDC_BUTTONOK, BN_CLICKED, OnClickedButtonOK)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
BEGIN_SINK_MAP(CMSConfigCtl)
//Make sure the Event Handlers have __stdcall calling convention
END_SINK_MAP()
STDMETHOD(OnAmbientPropertyChange)(DISPID dispid)
{
if (dispid == DISPID_AMBIENT_BACKCOLOR)
{
SetBackgroundColorFromAmbient();
FireViewChange();
}
return IOleControlImpl<CMSConfigCtl>::OnAmbientPropertyChange(dispid);
}
// IViewObjectEx
DECLARE_VIEW_STATUS(0)
// IMSConfigCtl
public:
STDMETHOD(SetParentHWND)(DWORD_PTR dwHWND);
//-------------------------------------------------------------------------
// When the control is initialized (we'll catch the dialog init message),
// the classes which implement each individual page of the tab control
// should be created and added to the control.
//-------------------------------------------------------------------------
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// Determine where this control is being created. If it's a normal
// web page (http:), then we shouldn't work at all. If it's in Help Center
// (hcp:), then we should present a limited functionality. If we're
// hosted in an executable, we should present full functionality.
CheckRunState();
if (m_fDoNotRun)
{
::ShowWindow(GetDlgItem(IDC_BUTTONOK), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_BUTTONCANCEL), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_BUTTONAPPLY), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_PLACEHOLDER), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_MSCONFIGTAB), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_STATICWONTRUN), SW_SHOW);
return 0;
}
else if (m_fRunningInHelpCtr)
{
::ShowWindow(GetDlgItem(IDC_BUTTONOK), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_BUTTONCANCEL), SW_HIDE);
}
::EnableWindow(GetDlgItem(IDC_BUTTONAPPLY), FALSE);
// Get a window for the static control on the dialog which is going
// to serve as a size rect for the property pages. Hide it, and get
// the rectangle for it.
RECT rectTabPage;
m_wndPlaceHolder.Attach(GetDlgItem(IDC_PLACEHOLDER));
m_wndPlaceHolder.ShowWindow(SW_HIDE);
m_wndPlaceHolder.GetWindowRect(&rectTabPage);
ScreenToClient(&rectTabPage);
// Load all of the tab pages into the tab control, then select the
// first one.
BOOL bDummy;
LoadTabPages(rectTabPage);
TabCtrl_SetCurSel(GetDlgItem(IDC_MSCONFIGTAB), 0);
OnSelChangeMSConfigTab(0, NULL, bDummy);
return 0;
}
//-------------------------------------------------------------------------
// Determine where the control is being created, and set the member
// variables m_fRunningInHelpCtr and m_fDoNotRun appropriately.
//-------------------------------------------------------------------------
void CheckRunState()
{
m_fRunningInHelpCtr = m_fDoNotRun = FALSE;
CComPtr<IOleContainer> spContainer;
m_spClientSite->GetContainer(&spContainer);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTMLDocument(spContainer);
if (spHTMLDocument)
{
BSTR bstrURL;
if (SUCCEEDED(spHTMLDocument->get_URL(&bstrURL)))
{
CString strURL(bstrURL);
strURL.MakeLower();
if (strURL.Left(5) == CString(_T("http:")))
m_fDoNotRun = TRUE;
else if (strURL.Left(5) == CString(_T("file:")))
m_fDoNotRun = TRUE;
else if (strURL.Left(4) == CString(_T("hcp:")))
m_fRunningInHelpCtr = TRUE;
// Include the following when we want to test the control
// using a local URL.
//
// if (strURL.Left(5) == CString(_T("file:")))
// m_fDoNotRun = FALSE;
SysFreeString(bstrURL);
}
}
}
//-------------------------------------------------------------------------
// Load each of the pages which are going to be put on the tab control.
// Each one will get a chance to elect to not participate (for example if
// it doesn't apply to this OS).
//-------------------------------------------------------------------------
void LoadTabPages(RECT & rectTabPage)
{
int iTabIndex = 0;
if (m_pageGeneral.IsValid(&m_state))
{
m_pageGeneral.Create(this->m_hWnd, rectTabPage);
m_pageGeneral.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageGeneral, m_pageGeneral.GetCaption());
}
if (m_pageSystemIni.IsValid(&m_state, _T("system.ini")))
{
m_pageSystemIni.Create(this->m_hWnd, rectTabPage);
m_pageSystemIni.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageSystemIni, m_pageSystemIni.GetCaption());
}
if (m_pageWinIni.IsValid(&m_state, _T("win.ini")))
{
m_pageWinIni.Create(this->m_hWnd, rectTabPage);
m_pageWinIni.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageWinIni, m_pageWinIni.GetCaption());
}
if (m_pageBootIni.IsValid(&m_state))
{
m_pageBootIni.Create(this->m_hWnd, rectTabPage);
m_pageBootIni.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageBootIni, m_pageBootIni.GetCaption());
}
if (m_pageStartup.IsValid(&m_state))
{
m_pageStartup.Create(this->m_hWnd, rectTabPage);
m_pageStartup.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageStartup, m_pageStartup.GetCaption());
}
if (m_pageServices.IsValid(&m_state))
{
m_pageServices.Create(this->m_hWnd, rectTabPage);
m_pageServices.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageServices, m_pageServices.GetCaption());
}
if (m_pageRegistry.IsValid(&m_state))
{
m_pageRegistry.Create(this->m_hWnd, rectTabPage);
m_pageRegistry.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageRegistry, m_pageRegistry.GetCaption());
}
if (m_pageInternational.IsValid(&m_state))
{
m_pageInternational.Create(this->m_hWnd, rectTabPage);
m_pageInternational.MoveWindow(&rectTabPage);
AddTab(iTabIndex++, (CWindow *)&m_pageInternational, m_pageInternational.GetCaption());
}
}
//-------------------------------------------------------------------------
// Creates a new tab in the tab control using the provided CWindow.
//-------------------------------------------------------------------------
void AddTab(int iTabIndex, CWindow * pPage, LPCTSTR szName)
{
pPage->ShowWindow(SW_HIDE);
TCITEM tci;
tci.mask = TCIF_PARAM | TCIF_TEXT;
tci.pszText = (LPTSTR)szName;
tci.lParam = (LPARAM)pPage;
TabCtrl_InsertItem(GetDlgItem(IDC_MSCONFIGTAB), iTabIndex, &tci);
}
//-------------------------------------------------------------------------
// When the user selects a new tab, we hide the CWindow associated with
// the old tab and show the CWindow associated with the new tab.
//-------------------------------------------------------------------------
LRESULT OnSelChangeMSConfigTab(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
CWindow * pNewWindow = GetTabWindow(TabCtrl_GetCurSel(GetDlgItem(IDC_MSCONFIGTAB)));
ASSERT(pNewWindow);
if (pNewWindow)
pNewWindow->ShowWindow(SW_SHOW);
return 0;
}
LRESULT OnSelChangingMSConfigTab(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
CWindow * pOldWindow = GetTabWindow(TabCtrl_GetCurSel(GetDlgItem(IDC_MSCONFIGTAB)));
ASSERT(pOldWindow);
if (pOldWindow)
pOldWindow->ShowWindow(SW_HIDE);
return 0;
}
//-------------------------------------------------------------------------
// Get the CWindow pointer for the specified tab (it's stored in the
// lParam attribute of the tab).
//-------------------------------------------------------------------------
CWindow * GetTabWindow(int iTabIndex)
{
TCITEM tci;
tci.mask = TCIF_PARAM;
tci.lParam = 0;
if (TabCtrl_GetItem(GetDlgItem(IDC_MSCONFIGTAB), iTabIndex, &tci))
return (CWindow *)tci.lParam;
return NULL;
}
enum { IDD = IDD_MSCONFIGCTL };
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (m_fDoNotRun)
return 0;
return 0;
}
//-------------------------------------------------------------------------
// Handle user clicks on the OK or Cancel buttons.
//-------------------------------------------------------------------------
LRESULT OnClickedButtonCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (m_hwndParent != NULL)
::PostMessage(m_hwndParent, WM_CLOSE, 0, 0);
return 0;
}
LRESULT OnClickedButtonOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (m_hwndParent != NULL)
::PostMessage(m_hwndParent, WM_CLOSE, 0, 0);
return 0;
}
private:
CWindow m_wndPlaceHolder; // hidden, used to place property pages
HWND m_hwndParent; // if the parent window is set, we can send messages
BOOL m_fDoNotRun; // should we present a UI
BOOL m_fRunningInHelpCtr; // is control loaded in HelpCtr
CPageIni m_pageWinIni; // "win.ini" tab
CPageIni m_pageSystemIni; // "system.ini" tab
CPageGeneral m_pageGeneral; // "general" tab
CPageBootIni m_pageBootIni; // "boot.ini" tab
CPageServices m_pageServices; // "services" tab
CPageStartup m_pageStartup; // "startup" tab
CPageRegistry m_pageRegistry; // "registry" tab
CPageInternational m_pageInternational; // "international" tab
CMSConfigState m_state; // state variable shared between pages
};
#endif //__MSCONFIGCTL_H_