385 lines
12 KiB
C
385 lines
12 KiB
C
|
// 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_
|