// PropPageHolder.cpp : implementation file // #include "stdafx.h" #include "PropPageHolder.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPropPageHolder CPropPageHolder::CPropPageHolder() { m_pSite = NULL; m_pPropPage = NULL; m_bActivated = false; memset(&m_PageInfo, 0, sizeof(PROPPAGEINFO)); } /*CPropPageHolder::CPropPageHolder(IPropertyPage* pPage, IUnknown* pSite) { m_pSite = NULL; m_pPropPage = NULL; m_bActivated = false; memset(&m_PageInfo, 0, sizeof(PROPPAGEINFO)); // We were passed a IUnknown, so Initialize from there Initialize(pPage, pSite); } */ CPropPageHolder::~CPropPageHolder() { // Just in case if(m_pPropPage != NULL) Destroy(); if(m_PageInfo.cb != 0) { CoTaskMemFree(m_PageInfo.pszDocString); CoTaskMemFree(m_PageInfo.pszHelpFile); CoTaskMemFree(m_PageInfo.pszTitle); } } ///////////////////////////////////////////////////////////////////////////// // CPropPageHolder message handlers ////////////////////////////////////////////////////////////////// // Loads Prop Page if it has one HRESULT CPropPageHolder::Initialize(IPropertyPage* pPage, IUnknown* pSite) { // Can't Reinitialize ASSERT(!m_pPropPage); ASSERT(pSite); ASSERT(pPage); // This is the Container site // (Returned from IPropertyPageSite::GetPageContainer) m_pSite = pSite; m_pPropPage = pPage; pPage->AddRef(); // Get a IPropertyPageSite Pointer to ourselves // for the new Proppage IPropertyPageSite* pPageSite = NULL; QueryInterface(IID_IPropertyPageSite, (void**)&pPageSite); ASSERT(pPageSite); // Set Page Site HRESULT hr = m_pPropPage->SetPageSite(pPageSite); // Make sure to reset to null if failed if(FAILED(hr)) { m_pPropPage->Release(); m_pPropPage = NULL; } else { // Property page should have AddRef'ed, // So release our pointer Release(); } return hr; } ////////////////////////////////////////////////////////////////// // Creates and shows PropPage HRESULT CPropPageHolder::Create(HWND hwndParent, const RECT& rect, bool bModalParent /*= true*/) { // Need to Initialize First ASSERT(m_pPropPage); // If we're already activated then just // move to new coordinates if(m_bActivated) return Move(rect); HRESULT hr; // Activate the Page hr = m_pPropPage->Activate(hwndParent, &rect, true); if(!FAILED(hr)) { m_bActivated = true; // Make sure it's visible m_pPropPage->Show(SW_SHOW); } return hr; } ////////////////////////////////////////////////////////////////// // Destroys and Releases PropPage HRESULT CPropPageHolder::Destroy() { // Can't destroy NULL object if(m_pPropPage == NULL) return S_OK; Close(); // Make it let go of our IPropertyPageSite Pointer HRESULT hr = m_pPropPage->SetPageSite(NULL); // Then release it m_pPropPage->Release(); m_pPropPage = NULL; return hr; } HRESULT CPropPageHolder::Close() { // Need to Initialize // and create first ASSERT(m_pPropPage); if(m_bActivated) { m_bActivated = false; // Deactivate page return m_pPropPage->Deactivate(); } // It went okay but didn't do anything so... return S_FALSE; } ////////////////////////////////////////////////////////////////// // Calls IPropPage Show HRESULT CPropPageHolder::Show(UINT nCmdShow) { // Need to Initialize // and create first ASSERT(m_pPropPage); ASSERT(m_bActivated); return m_pPropPage->Show(nCmdShow); } ////////////////////////////////////////////////////////////////// // Calls IPropPage Move HRESULT CPropPageHolder::Move(const RECT& rect) { // Need to Initialize // and create first ASSERT(m_pPropPage); ASSERT(m_bActivated); return m_pPropPage->Move(&rect); } ////////////////////////////////////////////////////////////////// // PropPage is inited properly if pointer not null bool CPropPageHolder::IsInitialized() { return !(m_pPropPage == NULL); } ////////////////////////////////////////////////////////////////// // Calls IPropPage Apply (results in a call to OnStatusChanged // in our IPropPageSite) HRESULT CPropPageHolder::Apply() { // Need to Initialize First ASSERT(m_pPropPage); return m_pPropPage->Apply(); } ////////////////////////////////////////////////////////////////// // Is it Created? bool CPropPageHolder::IsActivated() { return m_bActivated; } ///////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // PropertyPageSite STDMETHODIMP CPropPageHolder::OnStatusChange(DWORD dwFlags) { TRACE("CPropPageHolder::XPropertyPageSite::OnStatusChange\n"); // We don't need to implement any of this // as we use delayed saving return S_OK; } STDMETHODIMP CPropPageHolder::GetLocaleID(LCID* pLocaleID) { TRACE("CPropPageHolder::XPropertyPageSite::GetLocaleID\n"); // Just give'm a default language *pLocaleID = LOCALE_SYSTEM_DEFAULT; return S_OK; } STDMETHODIMP CPropPageHolder::GetPageContainer(IUnknown** ppUnk) { TRACE("CPropPageHolder::XPropertyPageSite::GetPageContainer\n"); // If Error we need to set to NULL // This takes care of that cuz NULL is the only error around *ppUnk = m_pSite; if(!m_pSite) return E_UNEXPECTED; m_pSite->AddRef(); // Sorry return S_OK; } STDMETHODIMP CPropPageHolder::TranslateAccelerator(LPMSG pMsg) { TRACE("CPropPageHolder::XPropertyPageSite::TranslateAccelerator\n"); // Sorry return E_NOTIMPL; } string CPropPageHolder::GetTitle() { USES_CONVERSION; LoadInfo(); if(m_PageInfo.pszTitle) return OLE2T(m_PageInfo.pszTitle); return _T(""); } string CPropPageHolder::GetHelpFile() { USES_CONVERSION; LoadInfo(); if(m_PageInfo.pszHelpFile) return OLE2T(m_PageInfo.pszHelpFile); return _T(""); } DWORD CPropPageHolder::GetHelpContext() { LoadInfo(); return m_PageInfo.dwHelpContext; } HRESULT CPropPageHolder::LoadInfo() { if(m_PageInfo.cb != 0) return S_OK; ASSERT(m_pPropPage); m_PageInfo.cb = sizeof(PROPPAGEINFO); return m_pPropPage->GetPageInfo(&m_PageInfo); }