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