383 lines
9.2 KiB
C++
383 lines
9.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// BasePSht.cpp
|
|
//
|
|
// Abstract:
|
|
// Implementation of the CBasePropertySheet class.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) August 31, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "BasePSht.h"
|
|
#include "ClusItem.h"
|
|
#include "TraceTag.h"
|
|
#include "BasePPag.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global Variables
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _DEBUG
|
|
CTraceTag g_tagBasePropSheet(_T("UI"), _T("BASE PROP SHEET"), 0);
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CBasePropertySheet
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(CBasePropertySheet, CBaseSheet)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BEGIN_MESSAGE_MAP(CBasePropertySheet, CBaseSheet)
|
|
//{{AFX_MSG_MAP(CBasePropertySheet)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::CBasePropertySheet
|
|
//
|
|
// Routine Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pParentWnd [IN OUT] Parent window for this property sheet.
|
|
// iSelectPage [IN] Page to show first.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CBasePropertySheet::CBasePropertySheet(
|
|
IN OUT CWnd * pParentWnd,
|
|
IN UINT iSelectPage
|
|
)
|
|
:
|
|
CBaseSheet(pParentWnd, iSelectPage)
|
|
{
|
|
m_pci = NULL;
|
|
|
|
} //*** CBasePropertySheet::CBaseSheet()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::~CBasePropertySheet
|
|
//
|
|
// Routine Description:
|
|
// Destructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CBasePropertySheet::~CBasePropertySheet(void)
|
|
{
|
|
if (m_pci != NULL)
|
|
m_pci->Release();
|
|
|
|
} //*** CBasePropertySheet::~CBasePropertySheet()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::BInit
|
|
//
|
|
// Routine Description:
|
|
// Initialize the property sheet.
|
|
//
|
|
// Arguments:
|
|
// pci [IN OUT] Cluster item whose properties are to be displayed.
|
|
// iimgIcon [IN] Index in the large image list for the image to use
|
|
// as the icon on each page.
|
|
//
|
|
// Return Value:
|
|
// TRUE Property sheet initialized successfully.
|
|
// FALSE Error initializing property sheet.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBasePropertySheet::BInit(
|
|
IN OUT CClusterItem * pci,
|
|
IN IIMG iimgIcon
|
|
)
|
|
{
|
|
BOOL bSuccess = TRUE;
|
|
CWaitCursor wc;
|
|
|
|
ASSERT_VALID(pci);
|
|
|
|
// Call the base class method.
|
|
if (!CBaseSheet::BInit(iimgIcon))
|
|
return FALSE;
|
|
|
|
ASSERT(m_pci == NULL);
|
|
m_pci = pci;
|
|
pci->AddRef();
|
|
|
|
try
|
|
{
|
|
// Set the object title.
|
|
m_strObjTitle = Pci()->PszTitle();
|
|
|
|
// Set the property sheet caption.
|
|
SetCaption(StrObjTitle());
|
|
|
|
// Add non-extension pages.
|
|
{
|
|
CBasePropertyPage ** ppages = Ppages();
|
|
int cpages = Cpages();
|
|
int ipage;
|
|
|
|
ASSERT(ppages != NULL);
|
|
ASSERT(cpages != 0);
|
|
|
|
for (ipage = 0 ; ipage < cpages ; ipage++)
|
|
{
|
|
ASSERT_VALID(ppages[ipage]);
|
|
ppages[ipage]->BInit(this);
|
|
AddPage(ppages[ipage]);
|
|
} // for: each page
|
|
} // Add non-extension pages
|
|
|
|
// Add extension pages.
|
|
AddExtensionPages(Pci()->PlstrExtensions(), Pci());
|
|
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
bSuccess = FALSE;
|
|
} // catch: anything
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CBasePropertySheet::BInit()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::DoModal
|
|
//
|
|
// Routine Description:
|
|
// Display a modal property sheet.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// id Control the user pressed to dismiss the sheet.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
INT_PTR CBasePropertySheet::DoModal(void)
|
|
{
|
|
INT_PTR id = IDCANCEL;
|
|
|
|
// Don't display a help button.
|
|
m_psh.dwFlags &= ~PSH_HASHELP;
|
|
|
|
// Display the property sheet.
|
|
id = CBaseSheet::DoModal();
|
|
|
|
// Update the state.
|
|
Trace(g_tagBasePropSheet, _T("DoModal: Calling UpdateState()"));
|
|
Pci()->UpdateState();
|
|
|
|
return id;
|
|
|
|
} //*** CBasePropertySheet::DoModal()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::AddExtensionPages
|
|
//
|
|
// Routine Description:
|
|
// Add extension pages to the sheet.
|
|
//
|
|
// Arguments:
|
|
// plstrExtensions [IN] List of extension names (CLSIDs).
|
|
// pci [IN OUT] Cluster item.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CBasePropertySheet::AddExtensionPages(
|
|
IN const CStringList * plstrExtensions,
|
|
IN OUT CClusterItem * pci
|
|
)
|
|
{
|
|
ASSERT_VALID(pci);
|
|
|
|
// Add extension pages.
|
|
if ((plstrExtensions != NULL)
|
|
&& (plstrExtensions->GetCount() > 0))
|
|
{
|
|
// Enclose the loading of the extension in a try/catch block so
|
|
// that the loading of the extension won't prevent all pages
|
|
// from being displayed.
|
|
try
|
|
{
|
|
Ext().CreatePropertySheetPages(
|
|
this,
|
|
*plstrExtensions,
|
|
pci,
|
|
NULL,
|
|
Hicon()
|
|
);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
} // catch: CException
|
|
catch (...)
|
|
{
|
|
} // catch: anything
|
|
} // Add extension pages
|
|
|
|
} //*** CBasePropertySheet::AddExtensionPages()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::HrAddPage
|
|
//
|
|
// Routine Description:
|
|
// Add an extension page.
|
|
//
|
|
// Arguments:
|
|
// hpage [IN OUT] Page to be added.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page added successfully.
|
|
// FALSE Page not added.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CBasePropertySheet::HrAddPage(IN OUT HPROPSHEETPAGE hpage)
|
|
{
|
|
HRESULT hr = ERROR_SUCCESS;
|
|
|
|
ASSERT(hpage != NULL);
|
|
if (hpage == NULL)
|
|
return FALSE;
|
|
|
|
// Add the page to the end of the list.
|
|
try
|
|
{
|
|
Lhpage().AddTail(hpage);
|
|
} // try
|
|
catch (...)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
} // catch: anything
|
|
|
|
return hr;
|
|
|
|
} //*** CBasePropertySheet::HrAddPage()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::OnInitDialog
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_INITDIALOG message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Focus not set yet.
|
|
// FALSE Focus already set.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBasePropertySheet::OnInitDialog(void)
|
|
{
|
|
BOOL bFocusNotSet;
|
|
|
|
bFocusNotSet = CBaseSheet::OnInitDialog();
|
|
|
|
// Add all the extension pages.
|
|
{
|
|
POSITION pos;
|
|
HPROPSHEETPAGE hpage;
|
|
|
|
pos = Lhpage().GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
hpage = (HPROPSHEETPAGE) Lhpage().GetNext(pos);
|
|
SendMessage(PSM_ADDPAGE, 0, (LPARAM) hpage);
|
|
} // while: more pages to add
|
|
} // Add all the extension pages
|
|
|
|
return bFocusNotSet;
|
|
|
|
} //*** CBasePropertySheet::OnInitDialog()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBasePropertySheet::SetCaption
|
|
//
|
|
// Routine Description:
|
|
// Set the caption for the property sheet.
|
|
//
|
|
// Arguments:
|
|
// pszTitle [IN] String to be included in the caption.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CBasePropertySheet::SetCaption(IN LPCTSTR pszTitle)
|
|
{
|
|
CString strCaption;
|
|
|
|
ASSERT(pszTitle != NULL);
|
|
|
|
try
|
|
{
|
|
strCaption.FormatMessage(IDS_PROPSHEET_CAPTION, pszTitle);
|
|
SetTitle(strCaption);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
// Ignore the error.
|
|
pe->Delete();
|
|
} // catch: CException
|
|
|
|
} //*** CBasePropertySheet::SetCaption()
|