///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-2002 Microsoft Corporation // // Module Name: // ResTProp.cpp // // Abstract: // Implementation of the resource type property sheet and pages. // // Author: // David Potter (davidp) May 14, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ResTProp.h" #include "ResType.h" #include "DDxDDv.h" #include "HelpData.h" // for g_rghelpmap* #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CResTypePropSheet ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CResTypePropSheet, CBasePropertySheet) ///////////////////////////////////////////////////////////////////////////// // Message Maps BEGIN_MESSAGE_MAP(CResTypePropSheet, CBasePropertySheet) //{{AFX_MSG_MAP(CResTypePropSheet) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypePropSheet::CResTypePropSheet // // Routine Description: // Constructor. // // Arguments: // pci [IN OUT] Cluster item whose properties are to be displayed. // pParentWnd [IN OUT] Parent window for this property sheet. // iSelectPage [IN] Page to show first. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CResTypePropSheet::CResTypePropSheet( IN OUT CWnd * pParentWnd, IN UINT iSelectPage ) : CBasePropertySheet(pParentWnd, iSelectPage) { m_rgpages[0] = &PageGeneral(); } //*** CResTypePropSheet::CResTypePropSheet() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypePropSheet::BInit // // Routine Description: // Initialize the property sheet. // // Arguments: // pci [IN OUT] Cluster item whose properties are to be displayed. // iimgIcon [IN] Index in the large image list for the image to use // as the icon on each page. // // Return Value: // TRUE Property sheet initialized successfully. // FALSE Error initializing property sheet. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CResTypePropSheet::BInit( IN OUT CClusterItem * pci, IN IIMG iimgIcon ) { // Call the base class method. if (!CBasePropertySheet::BInit(pci, iimgIcon)) return FALSE; // Set the read-only flag. m_bReadOnly = PciResType()->BReadOnly(); return TRUE; } //*** CResTypePropSheet::BInit() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypePropSheet::Ppages // // Routine Description: // Returns the array of pages to add to the property sheet. // // Arguments: // None. // // Return Value: // Page array. // //-- ///////////////////////////////////////////////////////////////////////////// CBasePropertyPage ** CResTypePropSheet::Ppages(void) { return m_rgpages; } //*** CResTypePropSheet::Ppages() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypePropSheet::Cpages // // Routine Description: // Returns the count of pages in the array. // // Arguments: // None. // // Return Value: // Count of pages in the array. // //-- ///////////////////////////////////////////////////////////////////////////// int CResTypePropSheet::Cpages(void) { return sizeof(m_rgpages) / sizeof(CBasePropertyPage *); } //*** CResTypePropSheet::Cpages() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // CResTypeGeneralPage property page ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(CResTypeGeneralPage, CBasePropertyPage) ///////////////////////////////////////////////////////////////////////////// // Message Maps BEGIN_MESSAGE_MAP(CResTypeGeneralPage, CBasePropertyPage) //{{AFX_MSG_MAP(CResTypeGeneralPage) ON_EN_KILLFOCUS(IDC_PP_RESTYPE_DISPLAY_NAME, OnKillFocusDisplayName) ON_LBN_DBLCLK(IDC_PP_RESTYPE_POSSIBLE_OWNERS, OnDblClkPossibleOwners) ON_WM_CONTEXTMENU() //}}AFX_MSG_MAP ON_EN_CHANGE(IDC_PP_RESTYPE_DISPLAY_NAME, CBasePropertyPage::OnChangeCtrl) ON_EN_CHANGE(IDC_PP_RESTYPE_DESC, CBasePropertyPage::OnChangeCtrl) ON_EN_CHANGE(IDC_PP_RESTYPE_LOOKS_ALIVE, CBasePropertyPage::OnChangeCtrl) ON_EN_CHANGE(IDC_PP_RESTYPE_IS_ALIVE, CBasePropertyPage::OnChangeCtrl) ON_COMMAND(ID_FILE_PROPERTIES, OnProperties) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::CResTypeGeneralPage // // Routine Description: // Constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CResTypeGeneralPage::CResTypeGeneralPage(void) : CBasePropertyPage(IDD, g_aHelpIDs_IDD_PP_RESTYPE_GENERAL) { //{{AFX_DATA_INIT(CResTypeGeneralPage) m_strDisplayName = _T(""); m_strDesc = _T(""); m_strName = _T(""); m_strResDLL = _T(""); m_strQuorumCapable = _T(""); //}}AFX_DATA_INIT } //*** CResTypeGeneralPage::CResTypePropSheet() ///////////////////////////////////////////////////////////////////////////// //++ // // CGroupFailoverPage::BInit // // Routine Description: // Initialize the page. // // Arguments: // psht [IN OUT] Property sheet to which this page belongs. // // Return Value: // TRUE Page initialized successfully. // FALSE Page failed to initialize. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CResTypeGeneralPage::BInit(IN OUT CBaseSheet * psht) { BOOL bSuccess; ASSERT_KINDOF(CResTypePropSheet, psht); bSuccess = CBasePropertyPage::BInit(psht); if (bSuccess) { m_strDisplayName = PciResType()->StrDisplayName(); m_strDesc = PciResType()->StrDescription(); m_nLooksAlive = PciResType()->NLooksAlive(); m_nIsAlive = PciResType()->NIsAlive(); m_strName = PciResType()->StrName(); m_strResDLL = PciResType()->StrResDLLName(); if (PciResType()->BQuorumCapable()) m_strQuorumCapable.LoadString(IDS_YES); else m_strQuorumCapable.LoadString(IDS_NO); // Duplicate the possible owners list. { POSITION pos; CClusterNode * pciNode; pos = PciResType()->LpcinodePossibleOwners().GetHeadPosition(); while (pos != NULL) { pciNode = (CClusterNode *) PciResType()->LpcinodePossibleOwners().GetNext(pos); ASSERT_VALID(pciNode); m_lpciPossibleOwners.AddTail(pciNode); } // while: more nodes in the list } // Duplicate the possible owners list } // if: base class method was successful return bSuccess; } //*** CResTypeGeneralPage::BInit() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::DoDataExchange // // Routine Description: // Do data exchange between the dialog and the class. // // Arguments: // pDX [IN OUT] Data exchange object // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::DoDataExchange(CDataExchange * pDX) { CString strValue; CBasePropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CResTypeGeneralPage) DDX_Control(pDX, IDC_PP_RESTYPE_QUORUM_CAPABLE, m_editQuorumCapable); DDX_Control(pDX, IDC_PP_RESTYPE_RESDLL, m_editResDLL); DDX_Control(pDX, IDC_PP_RESTYPE_NAME, m_editName); DDX_Control(pDX, IDC_PP_RESTYPE_POSSIBLE_OWNERS, m_lbPossibleOwners); DDX_Control(pDX, IDC_PP_RESTYPE_IS_ALIVE, m_editIsAlive); DDX_Control(pDX, IDC_PP_RESTYPE_LOOKS_ALIVE, m_editLooksAlive); DDX_Control(pDX, IDC_PP_RESTYPE_DESC, m_editDesc); DDX_Control(pDX, IDC_PP_RESTYPE_DISPLAY_NAME, m_editDisplayName); DDX_Text(pDX, IDC_PP_RESTYPE_NAME, m_strName); DDX_Text(pDX, IDC_PP_RESTYPE_DISPLAY_NAME, m_strDisplayName); DDX_Text(pDX, IDC_PP_RESTYPE_DESC, m_strDesc); DDX_Text(pDX, IDC_PP_RESTYPE_RESDLL, m_strResDLL); DDX_Text(pDX, IDC_PP_RESTYPE_QUORUM_CAPABLE, m_strQuorumCapable); //}}AFX_DATA_MAP if (pDX->m_bSaveAndValidate) { if (!BReadOnly()) { DDX_Number(pDX, IDC_PP_RESTYPE_LOOKS_ALIVE, m_nLooksAlive, 10, 0xffffffff); DDX_Number(pDX, IDC_PP_RESTYPE_IS_ALIVE, m_nIsAlive, 10, 0xffffffff); DDV_RequiredText(pDX, IDC_PP_RESTYPE_DISPLAY_NAME, IDC_PP_RESTYPE_DISPLAY_NAME_LABEL, m_strDisplayName); try { PciResType()->ValidateCommonProperties( m_strDisplayName, m_strDesc, m_nLooksAlive, m_nIsAlive ); } // try catch (CException * pe) { pe->ReportError(); pe->Delete(); pDX->Fail(); } // catch: CException } // if: not read only } // if: saving data else { if (PciResType()->BAvailable()) { DDX_Number(pDX, IDC_PP_RESTYPE_LOOKS_ALIVE, m_nLooksAlive, CLUSTER_RESTYPE_MINIMUM_LOOKS_ALIVE, CLUSTER_RESTYPE_MAXIMUM_LOOKS_ALIVE); DDX_Number(pDX, IDC_PP_RESTYPE_IS_ALIVE, m_nIsAlive, CLUSTER_RESTYPE_MINIMUM_IS_ALIVE, CLUSTER_RESTYPE_MAXIMUM_IS_ALIVE); } // if: resource type properties are available else { m_editLooksAlive.SetWindowText(_T("")); m_editIsAlive.SetWindowText(_T("")); m_editQuorumCapable.SetWindowText(_T("")); } // else: resource type properties are NOT available FillPossibleOwners(); } // else: setting data to dialog } //*** CResTypeGeneralPage::DoDataExchange() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::FillPossibleOwners // // Routine Description: // Fill the Possible Owners list box. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::FillPossibleOwners(void) { POSITION posPci; CClusterNode * pciNode; int iitem; m_lbPossibleOwners.ResetContent(); posPci = LpciPossibleOwners().GetHeadPosition(); while (posPci != NULL) { pciNode = (CClusterNode *) LpciPossibleOwners().GetNext(posPci); iitem = m_lbPossibleOwners.AddString(pciNode->StrName()); if (iitem >= 0) m_lbPossibleOwners.SetItemDataPtr(iitem, pciNode); } // for: each string in the list } //*** CResTypeGeneralPage::FillPossibleOwners() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnInitDialog // // Routine Description: // Handler for the WM_INITDIALOG message. // // Arguments: // None. // // Return Value: // TRUE Focus needs to be set. // FALSE Focus already set. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CResTypeGeneralPage::OnInitDialog(void) { CBasePropertyPage::OnInitDialog(); // Set the static edit controls ReadOnly m_editName.SetReadOnly(TRUE); m_editResDLL.SetReadOnly(TRUE); m_editQuorumCapable.SetReadOnly(TRUE); // If read-only, set all controls to be either disabled or read-only. if (BReadOnly()) { m_editDisplayName.SetReadOnly(TRUE); m_editDesc.SetReadOnly(TRUE); m_editLooksAlive.SetReadOnly(TRUE); m_editIsAlive.SetReadOnly(TRUE); } // if: sheet is read-only return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //*** CResTypeGeneralPage::OnInitDialog() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnApply // // Routine Description: // Handler for the PSN_APPLY message. // // Arguments: // None. // // Return Value: // TRUE Page successfully applied. // FALSE Error applying page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CResTypeGeneralPage::OnApply(void) { // Set the data from the page in the cluster item. try { CWaitCursor wc; PciResType()->SetCommonProperties( m_strDisplayName, m_strDesc, m_nLooksAlive, m_nIsAlive ); } // try catch (CException * pe) { pe->ReportError(); pe->Delete(); return FALSE; } // catch: CException return CBasePropertyPage::OnApply(); } //*** CResTypeGeneralPage::OnApply() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnKillFocusDisplayName // // Routine Description: // Handler for the WM_KILLFOCUS message on the Display Name edit control. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::OnKillFocusDisplayName(void) { CString strName; m_editDisplayName.GetWindowText(strName); SetObjectTitle(strName); Ppsht()->SetCaption(strName); } //*** CResTypeGeneralPage::OnKillFocusDisplayName() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnProperties // // Routine Description: // Handler for the BN_CLICKED message on the Properties button. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::OnProperties(void) { int iitem; CClusterNode * pciNode; // Get the item with the focus. iitem = m_lbPossibleOwners.GetCurSel(); ASSERT(iitem >= 0); if (iitem >= 0) { // Get the node pointer. pciNode = (CClusterNode *) m_lbPossibleOwners.GetItemDataPtr(iitem); ASSERT_VALID(pciNode); // Set properties of that item. if (pciNode->BDisplayProperties()) { } // if: properties changed } // if: found an item with focus } //*** CResTypeGeneralPage::OnProperties() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnContextMenu // // Routine Description: // Handler for the WM_CONTEXTMENU method. // // Arguments: // pWnd Window in which the user right clicked the mouse. // point Position of the cursor, in screen coordinates. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::OnContextMenu(CWnd * pWnd, CPoint point) { BOOL bHandled = FALSE; CMenu * pmenu = NULL; CListBox * pListBox = (CListBox *) pWnd; CString strMenuName; CWaitCursor wc; // If focus is not in the list control, don't handle the message. if (pWnd == &m_lbPossibleOwners) { // Create the menu to display. try { pmenu = new CMenu; if (pmenu->CreatePopupMenu()) { UINT nFlags = MF_STRING; // If there are no items in the list, disable the menu item. if (pListBox->GetCount() == 0) nFlags |= MF_GRAYED; // Add the Properties item to the menu. strMenuName.LoadString(IDS_MENU_PROPERTIES); if (pmenu->AppendMenu(nFlags, ID_FILE_PROPERTIES, strMenuName)) { bHandled = TRUE; if (pListBox->GetCurSel() == -1) pListBox->SetCurSel(0); } // if: successfully added menu item } // if: menu created successfully } // try catch (CException * pe) { pe->ReportError(); pe->Delete(); } // catch: CException } // if: focus is on list control if (bHandled) { // Display the menu. if (!pmenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this )) { } // if: unsuccessfully displayed the menu } // if: there is a menu to display else CBasePropertyPage::OnContextMenu(pWnd, point); delete pmenu; } //*** CResTypeGeneralPage::OnContextMenu() ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeGeneralPage::OnDblClkPossibleOwners // // Routine Description: // Handler for the LBN_DBLCLK message on the Possible Owners listbox. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CResTypeGeneralPage::OnDblClkPossibleOwners(void) { OnProperties(); } //*** CResTypeGeneralPage::OnDblClkPossibleOwners()