windows-nt/Source/XPSP1/NT/base/cluster/admin/cluadmin/reswiz.cpp
2020-09-26 16:20:57 +08:00

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();