1615 lines
45 KiB
C++
1615 lines
45 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1996-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// ResWiz.cpp
|
|
//
|
|
// Abstract:
|
|
// Implementation of the CCreateResourceWizard class and all pages
|
|
// specific to a new resource wizard.
|
|
//
|
|
// Author:
|
|
// David Potter (davidp) September 3, 1996
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "CluAdmin.h"
|
|
#include "ResWiz.h"
|
|
#include "ClusDoc.h"
|
|
#include "DDxDDv.h"
|
|
#include "HelpData.h"
|
|
#include "TreeView.h"
|
|
#include "ExcOper.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCreateResourceWizard
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNAMIC(CCreateResourceWizard, CBaseWizard)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
|
|
BEGIN_MESSAGE_MAP(CCreateResourceWizard, CBaseWizard)
|
|
//{{AFX_MSG_MAP(CCreateResourceWizard)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::CCreateResourceWizard
|
|
//
|
|
// Routine Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// pdoc [IN OUT] Document in which resource is to be created.
|
|
// pParentWnd [IN OUT] Parent window for this property sheet.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CCreateResourceWizard::CCreateResourceWizard(
|
|
IN OUT CClusterDoc * pdoc,
|
|
IN OUT CWnd * pParentWnd
|
|
)
|
|
: CBaseWizard(IDS_NEW_RESOURCE_TITLE, pParentWnd)
|
|
{
|
|
ASSERT_VALID(pdoc);
|
|
m_pdoc = pdoc;
|
|
|
|
m_pciResType = NULL;
|
|
m_pciGroup = NULL;
|
|
m_pciRes = NULL;
|
|
m_bCreated = FALSE;
|
|
|
|
m_rgpages[0].m_pwpage = &m_pageName;
|
|
m_rgpages[0].m_dwWizButtons = PSWIZB_NEXT;
|
|
m_rgpages[1].m_pwpage = &m_pageOwners;
|
|
m_rgpages[1].m_dwWizButtons = PSWIZB_BACK | PSWIZB_NEXT;
|
|
m_rgpages[2].m_pwpage = &m_pageDependencies;
|
|
m_rgpages[2].m_dwWizButtons = PSWIZB_BACK | PSWIZB_NEXT;
|
|
|
|
} //*** CCreateResourceWizard::CCreateResourceWizard()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::~CCreateResourceWizard
|
|
//
|
|
// Routine Description:
|
|
// Destructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CCreateResourceWizard::~CCreateResourceWizard(void)
|
|
{
|
|
if (m_pciRes != NULL)
|
|
m_pciRes->Release();
|
|
if (m_pciResType != NULL)
|
|
m_pciResType->Release();
|
|
if (m_pciGroup != NULL)
|
|
m_pciGroup->Release();
|
|
|
|
} //*** CCreateResourceWizard::~CCreateResourceWizard()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::BInit
|
|
//
|
|
// Routine Description:
|
|
// Initialize the wizard.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Wizard initialized successfully.
|
|
// FALSE Wizard not initialized successfully.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CCreateResourceWizard::BInit(void)
|
|
{
|
|
// Call the base class method.
|
|
CClusterAdminApp * papp = GetClusterAdminApp();
|
|
if (!CBaseWizard::BInit(papp->Iimg(IMGLI_RES)))
|
|
return FALSE;
|
|
|
|
// Get default group and/or resource type.
|
|
{
|
|
CTreeItem * pti;
|
|
CListItem * pli;
|
|
|
|
// Get the current MDI frame window.
|
|
CSplitterFrame * pframe = (CSplitterFrame *) ((CFrameWnd*)AfxGetMainWnd())->GetActiveFrame();
|
|
ASSERT_VALID(pframe);
|
|
ASSERT_KINDOF(CSplitterFrame, pframe);
|
|
|
|
// Get currently selected tree item and list item with focus.
|
|
pti = pframe->PviewTree()->PtiSelected();
|
|
pli = pframe->PviewList()->PliFocused();
|
|
|
|
// If the currently selected item in the tree view is a group,
|
|
// default to using that group.
|
|
ASSERT_VALID(pti);
|
|
ASSERT_VALID(pti->Pci());
|
|
if (pti->Pci()->IdsType() == IDS_ITEMTYPE_GROUP)
|
|
{
|
|
ASSERT_KINDOF(CGroup, pti->Pci());
|
|
m_pciGroup = (CGroup *) pti->Pci();
|
|
} // if: group selected
|
|
else
|
|
{
|
|
// If the item with the focus in the list control is a group,
|
|
// default to using it. If it is a resource, use its group.
|
|
if (pli != NULL)
|
|
{
|
|
ASSERT_VALID(pli->Pci());
|
|
if (pli->Pci()->IdsType() == IDS_ITEMTYPE_GROUP)
|
|
{
|
|
ASSERT_KINDOF(CGroup, pli->Pci());
|
|
m_pciGroup = (CGroup *) pli->Pci();
|
|
} // if: group has focus
|
|
else if (pli->Pci()->IdsType() == IDS_ITEMTYPE_RESOURCE)
|
|
{
|
|
ASSERT_KINDOF(CResource, pli->Pci());
|
|
m_pciGroup = ((CResource *) pli->Pci())->PciGroup();
|
|
} // else if: resource has focus
|
|
} // if: a list item has focus
|
|
} // else: tree item not a group
|
|
|
|
// Increment the reference count on the group.
|
|
if (m_pciGroup != NULL)
|
|
m_pciGroup->AddRef();
|
|
|
|
// If a resource is selected, set the default resource type from it.
|
|
// If a resource type is selected, set the default resource type to it.
|
|
if (pli != NULL)
|
|
{
|
|
ASSERT_VALID(pli->Pci());
|
|
if (pli->Pci()->IdsType() == IDS_ITEMTYPE_RESOURCE)
|
|
{
|
|
ASSERT_KINDOF(CResource, pli->Pci());
|
|
m_pciResType = ((CResource *) pli->Pci())->PciResourceType();
|
|
} // if: resource has focus
|
|
else if (pli->Pci()->IdsType() == IDS_ITEMTYPE_RESTYPE)
|
|
{
|
|
ASSERT_KINDOF(CResourceType, pli->Pci());
|
|
m_pciResType = (CResourceType *) pli->Pci();
|
|
} // else if: resource type has focus
|
|
} // if: a list item has focus
|
|
|
|
// Increment the reference count on the resource type.
|
|
if (m_pciResType != NULL)
|
|
m_pciResType->AddRef();
|
|
} // // Get currently selected group
|
|
|
|
return TRUE;
|
|
|
|
} //*** CCreateResourceWizard::BInit()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::OnCancel
|
|
//
|
|
// Routine Description:
|
|
// Called after the wizard has been dismissed when the Cancel button
|
|
// has been pressed.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CCreateResourceWizard::OnCancel(void)
|
|
{
|
|
if (BCreated())
|
|
{
|
|
ASSERT_VALID(PciRes());
|
|
try
|
|
{
|
|
PciRes()->DeleteResource();
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
} // catch: CException
|
|
catch (...)
|
|
{
|
|
} // catch: anything
|
|
m_bCreated = FALSE;
|
|
} // if: we created the object
|
|
|
|
} //*** CCreateResourceWizard::OnCancel()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CBaseWizard::OnWizardFinish
|
|
//
|
|
// Routine Description:
|
|
// Called after the wizard has been dismissed when the Finish button
|
|
// has been pressed.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CCreateResourceWizard::OnWizardFinish(void)
|
|
{
|
|
CResource * pciResDoc;
|
|
|
|
ASSERT_VALID(PciRes());
|
|
|
|
try
|
|
{
|
|
pciResDoc = (CResource *) Pdoc()->LpciResources().PciFromName(PciRes()->StrName());
|
|
ASSERT_VALID(pciResDoc);
|
|
if (pciResDoc != NULL)
|
|
pciResDoc->ReadItem();
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
} // catch: CException
|
|
|
|
} //*** CCreateResourceWizard::OnWizardFinish()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::Ppages
|
|
//
|
|
// Routine Description:
|
|
// Returns the array of pages to add to the property sheet.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// Page array.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CWizPage * CCreateResourceWizard::Ppages(void)
|
|
{
|
|
return m_rgpages;
|
|
|
|
} //*** CCreateResourceWizard::Ppages()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::Cpages
|
|
//
|
|
// Routine Description:
|
|
// Returns the count of pages in the array.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// Count of pages in the array.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
int CCreateResourceWizard::Cpages(void)
|
|
{
|
|
return sizeof(m_rgpages) / sizeof(CWizPage);
|
|
|
|
} //*** CCreateResourceWizard::Cpages()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CCreateResourceWizard::BSetRequiredFields
|
|
//
|
|
// Routine Description:
|
|
// Set the required fields of the resource, creating it if necessary.
|
|
//
|
|
// Arguments:
|
|
// rstrName [IN] Name of the resource.
|
|
// pciResType [IN] The resource type of the resource.
|
|
// pciGroup [IN] The group to which the resource belongs.
|
|
// bSeparateMonitor [IN] TRUE = Resource runs in a separate moniotor.
|
|
// rstrDesc [IN] Description of the resource.
|
|
//
|
|
// Return Value:
|
|
// TRUE Required fields set successfully.
|
|
// FALSE Error setting the required fields.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CCreateResourceWizard::BSetRequiredFields(
|
|
IN const CString & rstrName,
|
|
IN CResourceType * pciResType,
|
|
IN CGroup * pciGroup,
|
|
IN BOOL bSeparateMonitor,
|
|
IN const CString & rstrDesc
|
|
)
|
|
{
|
|
BOOL bSuccess = TRUE;
|
|
CResource * pciResDoc;
|
|
CWaitCursor wc;
|
|
|
|
ASSERT(pciGroup != NULL);
|
|
|
|
try
|
|
{
|
|
if ( BCreated()
|
|
&& ( (pciResType->StrName().CompareNoCase(PciRes()->StrRealResourceType()) != 0)
|
|
|| (PciRes()->PciGroup() == NULL)
|
|
|| (pciGroup->StrName().CompareNoCase(PciRes()->PciGroup()->StrName()) != 0)))
|
|
{
|
|
PciRes()->DeleteResource();
|
|
m_bCreated = FALSE;
|
|
} // if: object created already but resource type changed
|
|
if (!BCreated())
|
|
{
|
|
// Allocate an item.
|
|
if (PciRes() != NULL)
|
|
{
|
|
VERIFY(m_pciRes->Release() == 0);
|
|
} // if: item already allocated
|
|
m_pciRes = new CResource(FALSE);
|
|
if ( m_pciRes == NULL )
|
|
{
|
|
AfxThrowMemoryException();
|
|
} // if: error allocating the resource
|
|
m_pciRes->AddRef();
|
|
|
|
// Create the resource.
|
|
PciRes()->Create(
|
|
Pdoc(),
|
|
rstrName,
|
|
pciResType->StrName(),
|
|
pciGroup->StrName(),
|
|
bSeparateMonitor
|
|
);
|
|
|
|
// Create the resource in the document.
|
|
pciResDoc = Pdoc()->PciAddNewResource(rstrName);
|
|
if (pciResDoc != NULL)
|
|
pciResDoc->SetInitializing();
|
|
|
|
// Read the resource.
|
|
PciRes()->ReadItem();
|
|
|
|
// Set the description field.
|
|
try
|
|
{
|
|
PciRes()->SetCommonProperties(
|
|
rstrDesc,
|
|
bSeparateMonitor,
|
|
PciRes()->NLooksAlive(),
|
|
PciRes()->NIsAlive(),
|
|
PciRes()->CrraRestartAction(),
|
|
PciRes()->NRestartThreshold(),
|
|
PciRes()->NRestartPeriod(),
|
|
PciRes()->NPendingTimeout()
|
|
);
|
|
} // try
|
|
catch (CNTException * pnte)
|
|
{
|
|
if (pnte->Sc() != ERROR_RESOURCE_PROPERTIES_STORED)
|
|
throw;
|
|
pnte->Delete();
|
|
} // catch: CNTException
|
|
|
|
m_strName = rstrName;
|
|
m_strDescription = rstrDesc;
|
|
m_bCreated = TRUE;
|
|
m_bNeedToLoadExtensions = TRUE;
|
|
} // if: object not created yet
|
|
else
|
|
{
|
|
ASSERT_VALID(PciRes());
|
|
|
|
// If the group changed, clear the dependencies.
|
|
if (pciGroup->StrName() != PciRes()->StrGroup())
|
|
{
|
|
CResourceList lpobjRes;
|
|
PciRes()->SetDependencies(lpobjRes);
|
|
PciRes()->SetGroup(pciGroup->StrName());
|
|
} // if: group name changed
|
|
|
|
PciRes()->SetName(rstrName);
|
|
try
|
|
{
|
|
PciRes()->SetCommonProperties(
|
|
rstrDesc,
|
|
bSeparateMonitor,
|
|
PciRes()->NLooksAlive(),
|
|
PciRes()->NIsAlive(),
|
|
PciRes()->CrraRestartAction(),
|
|
PciRes()->NRestartThreshold(),
|
|
PciRes()->NRestartPeriod(),
|
|
PciRes()->NPendingTimeout()
|
|
);
|
|
} // try
|
|
catch (CNTException * pnte)
|
|
{
|
|
if (pnte->Sc() != ERROR_RESOURCE_PROPERTIES_STORED)
|
|
throw;
|
|
pnte->Delete();
|
|
} // catch: CNTException
|
|
m_strName = rstrName;
|
|
m_strDescription = rstrDesc;
|
|
} // else: object already exists
|
|
|
|
// Save the resource type pointer.
|
|
if (pciResType != m_pciResType)
|
|
{
|
|
pciResType->AddRef();
|
|
if (m_pciResType != NULL)
|
|
m_pciResType->Release();
|
|
m_pciResType = pciResType;
|
|
} // if: the resource type changed
|
|
// Save the group pointer.
|
|
if (pciGroup != m_pciGroup)
|
|
{
|
|
pciGroup->AddRef();
|
|
if (m_pciGroup != NULL)
|
|
m_pciGroup->Release();
|
|
m_pciGroup = pciGroup;
|
|
} // if: the group changed
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
if (PciRes() != NULL)
|
|
{
|
|
try
|
|
{
|
|
PciRes()->DeleteResource();
|
|
} // try
|
|
catch (...)
|
|
{
|
|
} // catch: Anything
|
|
VERIFY(m_pciRes->Release() == 0);
|
|
m_pciRes = NULL;
|
|
m_bCreated = FALSE;
|
|
} // if: there is a resource
|
|
bSuccess = FALSE;
|
|
} // catch: CException
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CCreateResourceWizard::BSetRequiredFields()
|
|
|
|
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNewResNamePage property page
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CNewResNamePage, CBaseWizardPage)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
|
|
BEGIN_MESSAGE_MAP(CNewResNamePage, CBaseWizardPage)
|
|
//{{AFX_MSG_MAP(CNewResNamePage)
|
|
ON_EN_CHANGE(IDC_WIZ_RES_NAME, OnChangeResName)
|
|
ON_EN_KILLFOCUS(IDC_WIZ_RES_NAME, OnKillFocusResName)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::CNewResNamePage
|
|
//
|
|
// Routine Description:
|
|
// Default constructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CNewResNamePage::CNewResNamePage(void)
|
|
: CBaseWizardPage(IDD, g_aHelpIDs_IDD_WIZ_RESOURCE_NAME)
|
|
{
|
|
//{{AFX_DATA_INIT(CNewResNamePage)
|
|
m_strName = _T("");
|
|
m_strDesc = _T("");
|
|
m_strGroup = _T("");
|
|
m_strResType = _T("");
|
|
m_bSeparateMonitor = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_pciResType = NULL;
|
|
m_pciGroup = NULL;
|
|
|
|
} //*** CNewResNamePage::CNewResNamePage()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::DoDataExchange
|
|
//
|
|
// Routine Description:
|
|
// Do data exchange between the dialog and the class.
|
|
//
|
|
// Arguments:
|
|
// pDX [IN OUT] Data exchange object
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResNamePage::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
CBaseWizardPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CNewResNamePage)
|
|
DDX_Control(pDX, IDC_WIZ_RES_GROUP, m_cboxGroups);
|
|
DDX_Control(pDX, IDC_WIZ_RES_RESTYPE, m_cboxResTypes);
|
|
DDX_Control(pDX, IDC_WIZ_RES_DESC, m_editDesc);
|
|
DDX_Control(pDX, IDC_WIZ_RES_NAME, m_editName);
|
|
DDX_Text(pDX, IDC_WIZ_RES_NAME, m_strName);
|
|
DDX_Text(pDX, IDC_WIZ_RES_DESC, m_strDesc);
|
|
DDX_CBString(pDX, IDC_WIZ_RES_GROUP, m_strGroup);
|
|
DDX_CBString(pDX, IDC_WIZ_RES_RESTYPE, m_strResType);
|
|
DDX_Check(pDX, IDC_WIZ_RES_SEPARATE_MONITOR, m_bSeparateMonitor);
|
|
//}}AFX_DATA_MAP
|
|
|
|
DDV_RequiredText(pDX, IDC_WIZ_RES_NAME, IDC_WIZ_RES_NAME_LABEL, m_strName);
|
|
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
int icbi;
|
|
|
|
icbi = m_cboxResTypes.GetCurSel();
|
|
ASSERT(icbi != CB_ERR);
|
|
m_pciResType = (CResourceType *) m_cboxResTypes.GetItemDataPtr(icbi);
|
|
|
|
icbi = m_cboxGroups.GetCurSel();
|
|
ASSERT(icbi != CB_ERR);
|
|
m_pciGroup = (CGroup *) m_cboxGroups.GetItemDataPtr(icbi);
|
|
} // if: saving data from dialog
|
|
else
|
|
{
|
|
// Select the proper resource type item.
|
|
if (m_cboxResTypes.GetCurSel() == CB_ERR)
|
|
m_cboxResTypes.SetCurSel(0);
|
|
|
|
// Select the proper group item.
|
|
if (m_cboxGroups.GetCurSel() == CB_ERR)
|
|
m_cboxGroups.SetCurSel(0);
|
|
} // else: setting to dialog
|
|
|
|
} //*** CNewResNamePage::DoDataExchange()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::OnInitDialog
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_INITDIALOG message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Focus needs to be set.
|
|
// FALSE Focus already set.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResNamePage::OnInitDialog(void)
|
|
{
|
|
CBaseWizardPage::OnInitDialog();
|
|
|
|
// Fill the Resource Type list.
|
|
{
|
|
POSITION pos;
|
|
CResourceType * pciResType;
|
|
int icbi;
|
|
|
|
CDC * pCboxDC;
|
|
CFont * pfontOldFont;
|
|
CFont * pfontCBFont;
|
|
int nCboxHorizExtent = 0;
|
|
CSize cboxTextSize;
|
|
TEXTMETRIC tm;
|
|
|
|
tm.tmAveCharWidth = 0;
|
|
|
|
//
|
|
// Refer to Knowledge base article Q66370 for details on how to
|
|
// set the horizontal extent of a list box (or drop list).
|
|
//
|
|
|
|
pCboxDC = m_cboxResTypes.GetDC(); // Get the device context (DC) from the combo box.
|
|
pfontCBFont = m_cboxResTypes.GetFont(); // Get the combo box font.
|
|
pfontOldFont = pCboxDC->SelectObject(pfontCBFont); // Select this font into the DC. Save the old font.
|
|
pCboxDC->GetTextMetrics(&tm); // Get the text metrics of this DC.
|
|
|
|
pos = PwizRes()->Pdoc()->LpciResourceTypes().GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
pciResType = (CResourceType *) PwizRes()->Pdoc()->LpciResourceTypes().GetNext(pos);
|
|
|
|
const CString &rstrCurResTypeString = pciResType->StrDisplayName();
|
|
|
|
ASSERT_VALID(pciResType);
|
|
if ( (pciResType->Hkey() != NULL)
|
|
&& (rstrCurResTypeString.GetLength() > 0)
|
|
&& (pciResType->StrName() != CLUS_RESTYPE_NAME_FTSET)
|
|
)
|
|
{
|
|
icbi = m_cboxResTypes.AddString(rstrCurResTypeString);
|
|
|
|
// Compute the horizontal extent of this string.
|
|
cboxTextSize = pCboxDC->GetTextExtent(rstrCurResTypeString);
|
|
if (cboxTextSize.cx > nCboxHorizExtent)
|
|
{
|
|
nCboxHorizExtent = cboxTextSize.cx;
|
|
}
|
|
|
|
ASSERT(icbi != CB_ERR);
|
|
m_cboxResTypes.SetItemDataPtr(icbi, pciResType);
|
|
pciResType->AddRef();
|
|
} // if: resource type is valid
|
|
} // while: more items in the list
|
|
|
|
pCboxDC->SelectObject(pfontOldFont); // Reset the original font in the DC
|
|
m_cboxResTypes.ReleaseDC(pCboxDC); // Release the DC
|
|
m_cboxResTypes.SetHorizontalExtent(nCboxHorizExtent + tm.tmAveCharWidth);
|
|
|
|
} // Fill the Resource Type list
|
|
|
|
// Fill the Group list.
|
|
{
|
|
POSITION pos;
|
|
CGroup * pciGroup;
|
|
int icbi;
|
|
|
|
pos = PwizRes()->Pdoc()->LpciGroups().GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
pciGroup = (CGroup *) PwizRes()->Pdoc()->LpciGroups().GetNext(pos);
|
|
ASSERT_VALID(pciGroup);
|
|
if ( (pciGroup->Hgroup() != NULL)
|
|
&& (pciGroup->Hkey() != NULL))
|
|
{
|
|
icbi = m_cboxGroups.AddString(pciGroup->StrName());
|
|
ASSERT(icbi != CB_ERR);
|
|
m_cboxGroups.SetItemDataPtr(icbi, pciGroup);
|
|
pciGroup->AddRef();
|
|
} // if: group is valid
|
|
} // while: more items in the list
|
|
} // Fill the Group list
|
|
|
|
// If there is a group already selected, get its name.
|
|
if (PwizRes()->PciGroup() != NULL)
|
|
m_strGroup = PwizRes()->PciGroup()->StrName();
|
|
|
|
// If there is a resource type already selected, get its name.
|
|
if (PwizRes()->PciResType() != NULL)
|
|
m_strResType = PwizRes()->PciResType()->StrName();
|
|
|
|
UpdateData(FALSE /*bSaveAndValidate*/);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
|
|
} //*** CNewResNamePage::OnInitDialog()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::OnSetActive
|
|
//
|
|
// Routine Description:
|
|
// Handler for the PSN_SETACTIVE message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page successfully initialized.
|
|
// FALSE Page not initialized.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResNamePage::OnSetActive(void)
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
bSuccess = CBaseWizardPage::OnSetActive();
|
|
if (bSuccess)
|
|
{
|
|
if (m_strName.IsEmpty())
|
|
EnableNext(FALSE);
|
|
} // if: successful thus far
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CNewResNamePage::OnSetActive()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::BApplyChanges
|
|
//
|
|
// Routine Description:
|
|
// Apply changes from this page.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Changes applied successfully.
|
|
// FALSE Error applying changes.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResNamePage::BApplyChanges(void)
|
|
{
|
|
CWaitCursor wc;
|
|
|
|
ASSERT(Pwiz() != NULL);
|
|
|
|
// Get the data from the dialog.
|
|
if (!UpdateData(TRUE /*bSaveAndValidate*/))
|
|
return FALSE;
|
|
|
|
// Save the data in the sheet.
|
|
if (!PwizRes()->BSetRequiredFields(
|
|
m_strName,
|
|
m_pciResType,
|
|
m_pciGroup,
|
|
m_bSeparateMonitor,
|
|
m_strDesc))
|
|
return FALSE;
|
|
|
|
// Load extensions here.
|
|
Pwiz()->LoadExtensions(PwizRes()->PciRes());
|
|
|
|
return TRUE;
|
|
|
|
} //*** CNewResNamePage::BApplyChanges()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::OnDestroy
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_DESTROY message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResNamePage::OnDestroy(void)
|
|
{
|
|
// Release references on resource type pointers.
|
|
if (m_cboxResTypes.m_hWnd != NULL)
|
|
{
|
|
int icbi;
|
|
CResourceType * pciResType;
|
|
|
|
for (icbi = m_cboxResTypes.GetCount() - 1 ; icbi >= 0 ; icbi--)
|
|
{
|
|
pciResType = (CResourceType *) m_cboxResTypes.GetItemDataPtr(icbi);
|
|
ASSERT_VALID(pciResType);
|
|
ASSERT_KINDOF(CResourceType, pciResType);
|
|
|
|
pciResType->Release();
|
|
} // while: more items in the list control
|
|
} // if: resource types combobox has been initialized
|
|
|
|
// Release references on group pointers.
|
|
if (m_cboxGroups.m_hWnd != NULL)
|
|
{
|
|
int icbi;
|
|
CGroup * pciGroup;
|
|
|
|
for (icbi = m_cboxGroups.GetCount() - 1 ; icbi >= 0 ; icbi--)
|
|
{
|
|
pciGroup = (CGroup *) m_cboxGroups.GetItemDataPtr(icbi);
|
|
ASSERT_VALID(pciGroup);
|
|
ASSERT_KINDOF(CGroup, pciGroup);
|
|
|
|
pciGroup->Release();
|
|
} // while: more items in the list control
|
|
} // if: groups combobox has been initialized
|
|
|
|
CBaseWizardPage::OnDestroy();
|
|
|
|
} //*** CNewResNamePage::OnDestroy()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::OnChangeResName
|
|
//
|
|
// Routine Description:
|
|
// Handler for the EN_CHANGE message on the Resource Name edit control.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResNamePage::OnChangeResName(void)
|
|
{
|
|
if (m_editName.GetWindowTextLength() == 0)
|
|
EnableNext(FALSE);
|
|
else
|
|
EnableNext(TRUE);
|
|
|
|
} //*** CNewResNamePage::OnChangeResName()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResNamePage::OnKillFocusResName
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_KILLFOCUS message on the Resource Name edit control.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResNamePage::OnKillFocusResName(void)
|
|
{
|
|
CString strName;
|
|
|
|
m_editName.GetWindowText(strName);
|
|
SetObjectTitle(strName);
|
|
|
|
} //*** CNewResNamePage::OnKillFocusResName()
|
|
|
|
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNewResOwnersPage property page
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CNewResOwnersPage, CListCtrlPairWizPage)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BEGIN_MESSAGE_MAP(CNewResOwnersPage, CListCtrlPairWizPage)
|
|
//{{AFX_MSG_MAP(CNewResOwnersPage)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::CNewResOwnersPage
|
|
//
|
|
// Routine Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CNewResOwnersPage::CNewResOwnersPage(void)
|
|
: CListCtrlPairWizPage(
|
|
IDD,
|
|
g_aHelpIDs_IDD_WIZ_POSSIBLE_OWNERS,
|
|
LCPS_SHOW_IMAGES | LCPS_ALLOW_EMPTY,
|
|
GetColumn,
|
|
BDisplayProperties
|
|
)
|
|
{
|
|
//{{AFX_DATA_INIT(CNewResOwnersPage)
|
|
//}}AFX_DATA_INIT
|
|
|
|
} //*** CNewResOwnersPage::CNewResOwnersPage()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::DoDataExchange
|
|
//
|
|
// Routine Description:
|
|
// Do data exchange between the dialog and the class.
|
|
//
|
|
// Arguments:
|
|
// pDX [IN OUT] Data exchange object
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResOwnersPage::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
// Initialize the lists before the list pair control is updated.
|
|
if (!pDX->m_bSaveAndValidate)
|
|
{
|
|
if (!BInitLists())
|
|
pDX->Fail();
|
|
} // if: setting data to the dialog
|
|
|
|
CListCtrlPairWizPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CNewResOwnersPage)
|
|
DDX_Control(pDX, IDC_LCP_NOTE, m_staticNote);
|
|
//}}AFX_DATA_MAP
|
|
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
if (!BBackPressed())
|
|
{
|
|
#if 0
|
|
// If user removed node on which group is online,
|
|
// display message and fail.
|
|
if (!BOwnedByPossibleOwner())
|
|
{
|
|
CString strMsg;
|
|
strMsg.FormatMessage(IDS_RES_NOT_OWNED_BY_POSSIBLE_OWNER, PciRes()->StrGroup(), PciRes()->StrOwner());
|
|
AfxMessageBox(strMsg, MB_OK | MB_ICONSTOP);
|
|
strMsg.Empty(); // prepare to throw exception in Fail()
|
|
pDX->Fail();
|
|
} // if: not owned by possible owner
|
|
#endif
|
|
} // if: Back button not pressed
|
|
} // if: saving data from dialog
|
|
|
|
} //*** CNewResOwnersPage::DoDataExchange()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::BInitLists
|
|
//
|
|
// Routine Description:
|
|
// Initialize the lists.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page initialized successfully.
|
|
// FALSE Page failed to initialize.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResOwnersPage::BInitLists(void)
|
|
{
|
|
BOOL bSuccess = TRUE;
|
|
|
|
ASSERT_VALID(PciRes());
|
|
|
|
try
|
|
{
|
|
SetLists(&PciRes()->LpcinodePossibleOwners(), &PciRes()->Pdoc()->LpciNodes());
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
bSuccess = FALSE;
|
|
} // catch: CException
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CNewResOwnersPage::BInitLists()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::OnInitDialog
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_INITDIALOG message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Focus needs to be set.
|
|
// FALSE Focus already set.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResOwnersPage::OnInitDialog(void)
|
|
{
|
|
// Add columns.
|
|
try
|
|
{
|
|
NAddColumn(IDS_COLTEXT_NAME, COLI_WIDTH_NAME);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
} // catch: CException
|
|
|
|
// Call the base class method.
|
|
CListCtrlPairWizPage::OnInitDialog();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
|
|
} //*** CNewResOwnersPage::OnInitDialog()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::OnSetActive
|
|
//
|
|
// Routine Description:
|
|
// Handler for the PSN_SETACTIVE message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page successfully initialized.
|
|
// FALSE Page not initialized.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResOwnersPage::OnSetActive(void)
|
|
{
|
|
BOOL bSuccess;
|
|
|
|
PciRes()->CollectPossibleOwners(NULL);
|
|
bSuccess = CListCtrlPairWizPage::OnSetActive();
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CNewResOwnersPage::OnSetActive()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::BApplyChanges
|
|
//
|
|
// Routine Description:
|
|
// Apply changes made on the page.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page successfully applied.
|
|
// FALSE Error applying page.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResOwnersPage::BApplyChanges(void)
|
|
{
|
|
CWaitCursor wc;
|
|
|
|
try
|
|
{
|
|
// Set the data from the page in the cluster item.
|
|
PciRes()->SetPossibleOwners((CNodeList &) Plcp()->LpobjRight());
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
return FALSE;
|
|
} // catch: CException
|
|
|
|
return CListCtrlPairWizPage::BApplyChanges();
|
|
|
|
} //*** CNewResOwnersPage::BApplyChanges()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::BOwnedByPossibleOwner
|
|
//
|
|
// Routine Description:
|
|
// Determine if the group in which this resource resides is owned by
|
|
// a node in the proposed possible owners list.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Group owned by node in possible owners list.
|
|
// FALSE Group NOT owned by node in possible owners list.
|
|
//
|
|
// Exceptions Thrown:
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResOwnersPage::BOwnedByPossibleOwner(void) const
|
|
{
|
|
CClusterNode * pciNode = NULL;
|
|
|
|
// Get the node on which the resource is online.
|
|
PciRes()->UpdateState();
|
|
|
|
// Find the owner node in the proposed possible owners list.
|
|
{
|
|
POSITION pos;
|
|
|
|
pos = Plcp()->LpobjRight().GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
pciNode = (CClusterNode *) Plcp()->LpobjRight().GetNext(pos);
|
|
ASSERT_VALID(pciNode);
|
|
|
|
if (PciRes()->StrOwner().CompareNoCase(pciNode->StrName()) == 0)
|
|
break;
|
|
pciNode = NULL;
|
|
} // while: more items in the list
|
|
} // Find the owner node in the proposed possible owners list
|
|
|
|
return (pciNode != NULL);
|
|
|
|
} //*** CNewResOwnersPage::BOwnedByPossibleOwner()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::GetColumn [static]
|
|
//
|
|
// Routine Description:
|
|
// Returns a column for an item.
|
|
//
|
|
// Arguments:
|
|
// pobj [IN OUT] Object for which the column is to be displayed.
|
|
// iItem [IN] Index of the item in the list.
|
|
// icol [IN] Column number whose text is to be retrieved.
|
|
// pdlg [IN OUT] Dialog to which object belongs.
|
|
// rstr [OUT] String in which to return column text.
|
|
// piimg [OUT] Image index for the object.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CALLBACK CNewResOwnersPage::GetColumn(
|
|
IN OUT CObject * pobj,
|
|
IN int iItem,
|
|
IN int icol,
|
|
IN OUT CDialog * pdlg,
|
|
OUT CString & rstr,
|
|
OUT int * piimg
|
|
)
|
|
{
|
|
CClusterNode * pciNode = (CClusterNode *) pobj;
|
|
int colid;
|
|
|
|
ASSERT_VALID(pciNode);
|
|
ASSERT((0 <= icol) && (icol <= 1));
|
|
|
|
switch (icol)
|
|
{
|
|
// Sorting by resource name.
|
|
case 0:
|
|
colid = IDS_COLTEXT_NAME;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(0);
|
|
colid = IDS_COLTEXT_NAME;
|
|
break;
|
|
} // switch: pdlg->NSortColumn()
|
|
|
|
pciNode->BGetColumnData(colid, rstr);
|
|
if (piimg != NULL)
|
|
*piimg = pciNode->IimgObjectType();
|
|
|
|
} //*** CNewResOwnersPage::GetColumn()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResOwnersPage::BDisplayProperties [static]
|
|
//
|
|
// Routine Description:
|
|
// Display the properties of the specified object.
|
|
//
|
|
// Arguments:
|
|
// pobj [IN OUT] Cluster item whose properties are to be displayed.
|
|
//
|
|
// Return Value:
|
|
// TRUE Properties where accepted.
|
|
// FALSE Properties where cancelled.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CALLBACK CNewResOwnersPage::BDisplayProperties(IN OUT CObject * pobj)
|
|
{
|
|
CClusterItem * pci = (CClusterItem *) pobj;
|
|
|
|
ASSERT_KINDOF(CClusterItem, pobj);
|
|
|
|
return pci->BDisplayProperties();
|
|
|
|
} //*** CNewResOwnersPage::BDisplayProperties();
|
|
|
|
|
|
//*************************************************************************//
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNewResDependsPage property page
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
IMPLEMENT_DYNCREATE(CNewResDependsPage, CListCtrlPairWizPage)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Message Maps
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
BEGIN_MESSAGE_MAP(CNewResDependsPage, CListCtrlPairWizPage)
|
|
//{{AFX_MSG_MAP(CNewResDependsPage)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::CNewResDependsPage
|
|
//
|
|
// Routine Description:
|
|
// Constructor.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
CNewResDependsPage::CNewResDependsPage(void)
|
|
: CListCtrlPairWizPage(
|
|
IDD,
|
|
g_aHelpIDs_IDD_WIZ_DEPENDENCIES,
|
|
LCPS_SHOW_IMAGES | LCPS_ALLOW_EMPTY,
|
|
GetColumn,
|
|
BDisplayProperties
|
|
)
|
|
{
|
|
//{{AFX_DATA_INIT(CNewResDependsPage)
|
|
//}}AFX_DATA_INIT
|
|
|
|
} //*** CNewResDependsPage::CNewResDependsPage()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::DoDataExchange
|
|
//
|
|
// Routine Description:
|
|
// Do data exchange between the dialog and the class.
|
|
//
|
|
// Arguments:
|
|
// pDX [IN OUT] Data exchange object
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CNewResDependsPage::DoDataExchange(CDataExchange * pDX)
|
|
{
|
|
// Initialize the lists before the list pair control is updated.
|
|
if (!pDX->m_bSaveAndValidate)
|
|
{
|
|
if (!BInitLists())
|
|
pDX->Fail();
|
|
} // if: setting data to the dialog
|
|
|
|
CListCtrlPairWizPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CNewResDependsPage)
|
|
//}}AFX_DATA_MAP
|
|
|
|
} //*** CNewResDependsPage::DoDataExchange()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::BInitLists
|
|
//
|
|
// Routine Description:
|
|
// Initialize the lists.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page initialized successfully.
|
|
// FALSE Page failed to initialize.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResDependsPage::BInitLists(void)
|
|
{
|
|
BOOL bSuccess = TRUE;
|
|
|
|
ASSERT_VALID(PciRes());
|
|
|
|
try
|
|
{
|
|
// Create the list of resources on which this resource can be dependent.
|
|
{
|
|
POSITION posPci;
|
|
CResource * pciRes;
|
|
const CResourceList & rlpciResources = PciGroup()->Lpcires();
|
|
|
|
LpciresAvailable().RemoveAll();
|
|
|
|
posPci = rlpciResources.GetHeadPosition();
|
|
while (posPci != NULL)
|
|
{
|
|
// Get the cluster item pointer.
|
|
pciRes = (CResource *) rlpciResources.GetNext(posPci);
|
|
ASSERT_VALID(pciRes);
|
|
|
|
// If we CAN be dependent on this resource, add it to our Available list.
|
|
if (PciRes()->BCanBeDependent(pciRes)
|
|
|| PciRes()->BIsDependent(pciRes))
|
|
LpciresAvailable().AddTail(pciRes);
|
|
} // while: more items in the list
|
|
} // Create the list of resources on which this resource can be dependent
|
|
|
|
SetLists(&PciRes()->LpciresDependencies(), &LpciresAvailable());
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
bSuccess = FALSE;
|
|
} // catch: CException
|
|
|
|
return bSuccess;
|
|
|
|
} //*** CNewResDependsPage::BInitLists()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::OnInitDialog
|
|
//
|
|
// Routine Description:
|
|
// Handler for the WM_INITDIALOG message.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Focus needs to be set.
|
|
// FALSE Focus already set.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResDependsPage::OnInitDialog(void)
|
|
{
|
|
// Add columns.
|
|
try
|
|
{
|
|
NAddColumn(IDS_COLTEXT_RESOURCE, COLI_WIDTH_NAME);
|
|
NAddColumn(IDS_COLTEXT_RESTYPE, COLI_WIDTH_RESTYPE);
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
} // catch: CException
|
|
|
|
// Call the base class method.
|
|
CListCtrlPairWizPage::OnInitDialog();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
|
|
} //*** CNewResDependsPage::OnInitDialog()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::BApplyChanges
|
|
//
|
|
// Routine Description:
|
|
// Apply changes made on the page.
|
|
//
|
|
// Arguments:
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
// TRUE Page successfully applied.
|
|
// FALSE Error applying page.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNewResDependsPage::BApplyChanges(void)
|
|
{
|
|
CWaitCursor wc;
|
|
|
|
// Check to see if required dependencies have been made.
|
|
{
|
|
CString strMissing;
|
|
CString strMsg;
|
|
|
|
try
|
|
{
|
|
if (!PciRes()->BRequiredDependenciesPresent((const CResourceList &)Plcp()->LpobjRight(), strMissing))
|
|
{
|
|
strMsg.FormatMessage(IDS_REQUIRED_DEPENDENCY_NOT_FOUND, strMissing);
|
|
AfxMessageBox(strMsg, MB_OK | MB_ICONSTOP);
|
|
return FALSE;
|
|
} // if: all required dependencies not present
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
return FALSE;
|
|
} // catch: CException
|
|
} // Check to see if required dependencies have been made
|
|
|
|
// Set the data from the page in the cluster item.
|
|
try
|
|
{
|
|
PciRes()->SetDependencies((CResourceList &) Plcp()->LpobjRight());
|
|
} // try
|
|
catch (CException * pe)
|
|
{
|
|
pe->ReportError();
|
|
pe->Delete();
|
|
return FALSE;
|
|
} // catch: CException
|
|
|
|
return CListCtrlPairWizPage::BApplyChanges();
|
|
|
|
} //*** CNewResDependsPage::BApplyChanges()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::GetColumn [static]
|
|
//
|
|
// Routine Description:
|
|
// Returns a column for an item.
|
|
//
|
|
// Arguments:
|
|
// pobj [IN OUT] Object for which the column is to be displayed.
|
|
// iItem [IN] Index of the item in the list.
|
|
// icol [IN] Column number whose text is to be retrieved.
|
|
// pdlg [IN OUT] Dialog to which object belongs.
|
|
// rstr [OUT] String in which to return column text.
|
|
// piimg [OUT] Image index for the object.
|
|
//
|
|
// Return Value:
|
|
// None.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CALLBACK CNewResDependsPage::GetColumn(
|
|
IN OUT CObject * pobj,
|
|
IN int iItem,
|
|
IN int icol,
|
|
IN OUT CDialog * pdlg,
|
|
OUT CString & rstr,
|
|
OUT int * piimg
|
|
)
|
|
{
|
|
CResource * pciRes = (CResource *) pobj;
|
|
int colid;
|
|
|
|
ASSERT_VALID(pciRes);
|
|
ASSERT((0 <= icol) && (icol <= 1));
|
|
|
|
switch (icol)
|
|
{
|
|
// Sorting by resource name.
|
|
case 0:
|
|
colid = IDS_COLTEXT_RESOURCE;
|
|
break;
|
|
|
|
// Sorting by resource type.
|
|
case 1:
|
|
colid = IDS_COLTEXT_RESTYPE;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(0);
|
|
colid = IDS_COLTEXT_RESOURCE;
|
|
break;
|
|
} // switch: pdlg->NSortColumn()
|
|
|
|
pciRes->BGetColumnData(colid, rstr);
|
|
if (piimg != NULL)
|
|
*piimg = pciRes->IimgObjectType();
|
|
|
|
} //*** CNewResDependsPage::GetColumn()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// CNewResDependsPage::BDisplayProperties [static]
|
|
//
|
|
// Routine Description:
|
|
// Display the properties of the specified object.
|
|
//
|
|
// Arguments:
|
|
// pobj [IN OUT] Cluster item whose properties are to be displayed.
|
|
//
|
|
// Return Value:
|
|
// TRUE Properties where accepted.
|
|
// FALSE Properties where cancelled.
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CALLBACK CNewResDependsPage::BDisplayProperties(IN OUT CObject * pobj)
|
|
{
|
|
CClusterItem * pci = (CClusterItem *) pobj;
|
|
|
|
ASSERT_KINDOF(CClusterItem, pobj);
|
|
|
|
return pci->BDisplayProperties();
|
|
|
|
} //*** CNewResDependsPage::BDisplayProperties();
|