|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2000 Microsoft Corporation
//
// Module Name:
// GrpWiz.cpp
//
// Abstract:
// Implementation of the CCreateGroupWizard class and all pages
// specific to a group wizard.
//
// Author:
// David Potter (davidp) July 22, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CluAdmin.h"
#include "GrpWiz.h"
#include "ClusDoc.h"
#include "DDxDDv.h"
#include "HelpData.h" // for g_rghelpmapGroupWizName
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CCreateGroupWizard
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CCreateGroupWizard, CBaseWizard)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CCreateGroupWizard, CBaseWizard) //{{AFX_MSG_MAP(CCreateGroupWizard)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::CCreateGroupWizard
//
// Routine Description:
// Constructor.
//
// Arguments:
// pdoc [IN OUT] Document in which group is to be created.
// pParentWnd [IN OUT] Parent window for this property sheet.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CCreateGroupWizard::CCreateGroupWizard( IN OUT CClusterDoc * pdoc, IN OUT CWnd * pParentWnd ) : CBaseWizard(IDS_NEW_GROUP_TITLE, pParentWnd)
{ ASSERT_VALID(pdoc); m_pdoc = pdoc;
m_pciGroup = 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_FINISH;
} //*** CCreateGroupWizard::CCreateGroupWizard()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::~CCreateGroupWizard
//
// Routine Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CCreateGroupWizard::~CCreateGroupWizard(void) { if (m_pciGroup != NULL) m_pciGroup->Release();
} //*** CCreateGroupWizard::~CCreateGroupWizard()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::BInit
//
// Routine Description:
// Initialize the wizard.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Wizard initialized successfully.
// FALSE Wizard not initialized successfully.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CCreateGroupWizard::BInit(void) { // Call the base class method.
CClusterAdminApp * papp = GetClusterAdminApp(); if (!CBaseWizard::BInit(papp->Iimg(IMGLI_GROUP))) return FALSE;
return TRUE;
} //*** CCreateGroupWizard::BInit()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::OnCancel
//
// Routine Description:
// Called after the wizard has been dismissed when the Cancel button
// has been pressed.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CCreateGroupWizard::OnCancel(void) { if (BCreated()) { ASSERT_VALID(PciGroup()); try { PciGroup()->DeleteGroup(); } // try
catch (CException * pe) { pe->ReportError(); pe->Delete(); } // catch: CException
catch (...) { } // catch: anything
m_bCreated = FALSE; } // if: we created the object
} //*** CCreateGroupWizard::OnCancel()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::Ppages
//
// Routine Description:
// Returns the array of pages to add to the property sheet.
//
// Arguments:
// None.
//
// Return Value:
// Page array.
//
//--
/////////////////////////////////////////////////////////////////////////////
CWizPage * CCreateGroupWizard::Ppages(void) { return m_rgpages;
} //*** CCreateGroupWizard::Ppages()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::Cpages
//
// Routine Description:
// Returns the count of pages in the array.
//
// Arguments:
// None.
//
// Return Value:
// Count of pages in the array.
//
//--
/////////////////////////////////////////////////////////////////////////////
int CCreateGroupWizard::Cpages(void) { return sizeof(m_rgpages) / sizeof(CWizPage);
} //*** CCreateGroupWizard::Cpages()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::BSetName
//
// Routine Description:
// Set the name of the group, creating it if necessary.
//
// Arguments:
// rstrName [IN] Name of the group.
//
// Return Value:
// TRUE Name set successfully.
// FALSE Error setting the name.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CCreateGroupWizard::BSetName( IN const CString & rstrName ) { BOOL bSuccess = TRUE; CWaitCursor wc;
try { if ( ! BCreated() ) { // Allocate an item and create the group.
if ( PciGroup() == NULL ) { m_pciGroup = new CGroup( FALSE ); if ( m_pciGroup == NULL ) { AfxThrowMemoryException(); } // if: error allocating memory
m_pciGroup->AddRef(); } // if: no group yet
PciGroup()->Create( Pdoc(), rstrName ); PciGroup()->ReadItem(); m_strName = rstrName; m_bCreated = TRUE; } // if: object not created yet
else { ASSERT_VALID( PciGroup() ); PciGroup()->SetName( rstrName ); m_strName = rstrName; } // else: object already exists
} // try
catch ( CException * pe ) { pe->ReportError(); pe->Delete(); try { PciGroup()->DeleteGroup(); } // try
catch (...) { } // catch: Anything
bSuccess = FALSE; } // catch: CException
return bSuccess;
} //*** CCreateGroupWizard::BSetName()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CCreateGroupWizard::BSetDescription
//
// Routine Description:
// Set the description of the group.
//
// Arguments:
// rstrDesc [IN] Description of the group.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
int CCreateGroupWizard::BSetDescription(IN const CString & rstrDesc) { BOOL bSuccess = TRUE; CWaitCursor wc;
try { ASSERT(BCreated()); ASSERT_VALID(PciGroup()); PciGroup()->SetCommonProperties( rstrDesc, PciGroup()->NFailoverThreshold(), PciGroup()->NFailoverPeriod(), PciGroup()->CgaftAutoFailbackType(), PciGroup()->NFailbackWindowStart(), PciGroup()->NFailbackWindowEnd() ); m_strDescription = rstrDesc; } // try
catch (CException * pe) { pe->ReportError(); pe->Delete(); bSuccess = FALSE; } // catch: CException
return bSuccess;
} //*** CCreateGroupWizard::BSetDescription()
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CNewGroupNamePage property page
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CNewGroupNamePage, CBaseWizardPage)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
BEGIN_MESSAGE_MAP(CNewGroupNamePage, CBaseWizardPage) //{{AFX_MSG_MAP(CNewGroupNamePage)
ON_EN_CHANGE(IDC_WIZ_GROUP_NAME, OnChangeGroupName) ON_EN_KILLFOCUS(IDC_WIZ_GROUP_NAME, OnKillFocusGroupName) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::CNewGroupNamePage
//
// Routine Description:
// Default constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CNewGroupNamePage::CNewGroupNamePage(void) : CBaseWizardPage(IDD, g_aHelpIDs_IDD_WIZ_GROUP_NAME) { //{{AFX_DATA_INIT(CNewGroupNamePage)
m_strName = _T(""); m_strDesc = _T(""); //}}AFX_DATA_INIT
} //*** CNewGroupNamePage::CNewGroupNamePage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNewGroupNamePage::DoDataExchange(CDataExchange * pDX) { CBaseWizardPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNewGroupNamePage)
DDX_Control(pDX, IDC_WIZ_GROUP_DESC, m_editDesc); DDX_Control(pDX, IDC_WIZ_GROUP_NAME, m_editName); DDX_Text(pDX, IDC_WIZ_GROUP_NAME, m_strName); DDX_Text(pDX, IDC_WIZ_GROUP_DESC, m_strDesc); //}}AFX_DATA_MAP
DDV_RequiredText(pDX, IDC_WIZ_GROUP_NAME, IDC_WIZ_GROUP_NAME_LABEL, m_strName);
} //*** CNewGroupNamePage::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::BApplyChanges
//
// Routine Description:
// Apply changes from this page.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Changes applied successfully.
// FALSE Error applying changes.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNewGroupNamePage::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 (!PwizGroup()->BSetName(m_strName) || !PwizGroup()->BSetDescription(m_strDesc)) return FALSE;
return TRUE;
} //*** CNewGroupNamePage::BApplyChanges()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::OnSetActive
//
// Routine Description:
// Handler for the PSN_SETACTIVE message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully initialized.
// FALSE Page not initialized.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNewGroupNamePage::OnSetActive(void) { BOOL bSuccess;
bSuccess = CBaseWizardPage::OnSetActive(); if (bSuccess) { if (m_strName.IsEmpty()) EnableNext(FALSE); } // if: successful thus far
return bSuccess;
} //*** CNewGroupNamePage::OnSetActive()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::OnChangeGroupName
//
// Routine Description:
// Handler for the EN_CHANGE message on the Group Name edit control.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNewGroupNamePage::OnChangeGroupName(void) { if (m_editName.GetWindowTextLength() == 0) EnableNext(FALSE); else EnableNext(TRUE);
} //*** CNewGroupNamePage::OnChangeGroupName()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupNamePage::OnKillFocusGroupName
//
// Routine Description:
// Handler for the WM_KILLFOCUS message on the Group Name edit control.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNewGroupNamePage::OnKillFocusGroupName(void) { CString strName;
m_editName.GetWindowText(strName); SetObjectTitle(strName);
} //*** CNewGroupNamePage::OnKillFocusGroupName()
//*************************************************************************//
/////////////////////////////////////////////////////////////////////////////
// CNewGroupOwnersPage property page
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CNewGroupOwnersPage, CListCtrlPairWizPage)
/////////////////////////////////////////////////////////////////////////////
// Message Maps
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CNewGroupOwnersPage, CListCtrlPairWizPage) //{{AFX_MSG_MAP(CNewGroupOwnersPage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::CNewGroupOwnersPage
//
// Routine Description:
// Constructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CNewGroupOwnersPage::CNewGroupOwnersPage(void) : CListCtrlPairWizPage( IDD, g_aHelpIDs_IDD_WIZ_PREFERRED_OWNERS, LCPS_SHOW_IMAGES | LCPS_ALLOW_EMPTY | LCPS_CAN_BE_ORDERED | LCPS_ORDERED, GetColumn, BDisplayProperties ) { //{{AFX_DATA_INIT(CNewGroupOwnersPage)
//}}AFX_DATA_INIT
} //*** CNewGroupOwnersPage::CNewGroupOwnersPage()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::DoDataExchange
//
// Routine Description:
// Do data exchange between the dialog and the class.
//
// Arguments:
// pDX [IN OUT] Data exchange object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CNewGroupOwnersPage::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(CNewGroupOwnersPage)
DDX_Control(pDX, IDC_LCP_NOTE, m_staticNote); //}}AFX_DATA_MAP
} //*** CNewGroupOwnersPage::DoDataExchange()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::BInitLists
//
// Routine Description:
// Initialize the lists.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page initialized successfully.
// FALSE Page failed to initialize.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNewGroupOwnersPage::BInitLists(void) { BOOL bSuccess = TRUE;
ASSERT_VALID(PciGroup());
try { SetLists(&PciGroup()->LpcinodePreferredOwners(), &PciGroup()->Pdoc()->LpciNodes()); } // try
catch (CException * pe) { pe->ReportError(); pe->Delete(); bSuccess = FALSE; } // catch: CException
return bSuccess;
} //*** CNewGroupOwnersPage::BInitLists()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::OnInitDialog
//
// Routine Description:
// Handler for the WM_INITDIALOG message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Focus needs to be set.
// FALSE Focus already set.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNewGroupOwnersPage::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
} //*** CNewGroupOwnersPage::OnInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::BApplyChanges
//
// Routine Description:
// Apply changes made on the page.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully applied.
// FALSE Error applying page.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CNewGroupOwnersPage::BApplyChanges(void) { BOOL bSuccess; CWaitCursor wc;
// Set the data from the page in the cluster item.
try { PciGroup()->SetPreferredOwners((CNodeList &) Plcp()->LpobjRight()); } // try
catch (CException * pe) { pe->ReportError(); pe->Delete(); return FALSE; } // catch: CException
bSuccess = CListCtrlPairWizPage::BApplyChanges(); if (bSuccess) { POSITION pos; CClusterNode * pciNode;;
// If the group is not owned by the first node in the preferred
// owners list, move the group to the first node.
pos = Plcp()->LpobjRight().GetHeadPosition(); if (pos != NULL) { pciNode = (CClusterNode *) Plcp()->LpobjRight().GetNext(pos); if (pciNode->StrName() != PciGroup()->StrOwner()) { try { PciGroup()->Move(pciNode); } // try
catch (CException * pe) { pe->ReportError(); pe->Delete(); } // catch: CException
} // if: not on first preferred owner node
} // if: there is a preferred owner
} // if: changes applied successfully
return bSuccess;
} //*** CNewGroupOwnersPage::BApplyChanges()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::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 CNewGroupOwnersPage::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();
} //*** CNewGroupOwnersPage::GetColumn()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CNewGroupOwnersPage::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 CNewGroupOwnersPage::BDisplayProperties(IN OUT CObject * pobj) { CClusterItem * pci = (CClusterItem *) pobj;
ASSERT_KINDOF(CClusterItem, pobj);
return pci->BDisplayProperties();
} //*** CNewGroupOwnersPage::BDisplayProperties();
|