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

625 lines
18 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-2000 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);
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()