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