windows-nt/Source/XPSP1/NT/admin/snapin/dfsadmin/dfsgui/mroots.cpp
2020-09-26 16:20:57 +08:00

191 lines
4.2 KiB
C++

/*++
Module Name:
MRoots.cpp
Abstract:
This module contains the Implementation of CMultiRoots.
This class displays the Pick DFS Roots Dialog.
*/
#include "stdafx.h"
#include "utils.h"
#include "MRoots.h"
#include "dfshelp.h"
/////////////////////////////////////////////////////////////////////////////
// CMultiRoots
CMultiRoots::CMultiRoots() : m_pRootList(NULL)
{
}
CMultiRoots::~CMultiRoots()
{
FreeNetNameList(&m_SelectedRootList);
}
HRESULT CMultiRoots::Init(BSTR i_bstrScope, ROOTINFOLIST *i_pRootList)
{
if (!i_bstrScope || !*i_bstrScope ||
!i_pRootList || !(i_pRootList->size()))
return E_INVALIDARG;
SAFE_SYSFREESTRING(&m_bstrScope);
m_bstrScope = i_bstrScope;
SAFE_SYSFREESTRING(&m_bstrText);
HRESULT hr = FormatResourceString(IDS_MROOTS_TEXT, i_bstrScope, &m_bstrText);
RETURN_IF_FAILED(hr);
m_pRootList = i_pRootList;
FreeNetNameList(&m_SelectedRootList);
return S_OK;
}
LRESULT CMultiRoots::OnInitDialog
(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
SetDlgItemText(IDC_MROOTS_TEXT, m_bstrText);
HWND hwnd = GetDlgItem(IDC_MROOTS_LIST);
HIMAGELIST hImageList = NULL;
int nIconIDs[] = {IDI_16x16_FTROOT, IDI_16x16_SAROOT};
HRESULT hr = CreateSmallImageList(
_Module.GetResourceInstance(),
nIconIDs,
sizeof(nIconIDs) / sizeof(nIconIDs[0]),
&hImageList);
if (SUCCEEDED(hr))
{
ListView_SetImageList(hwnd, hImageList, LVSIL_SMALL);
for(ROOTINFOLIST::iterator i = m_pRootList->begin(); i != m_pRootList->end(); i++)
{
if ((*i)->bstrRootName)
{
LVITEM lvItem = {0};
lvItem.mask = LVIF_TEXT | LVIF_IMAGE;
lvItem.pszText = (*i)->bstrRootName;
lvItem.iSubItem = 0;
lvItem.iImage = ((*i)->enumRootType == DFS_TYPE_FTDFS ? 0 : 1);
ListView_InsertItem(hwnd, &lvItem);
}
}
}
return TRUE; // Let the system set the focus
}
/*++
This function is called when a user clicks the ? in the top right of a property sheet
and then clciks a control, or when they hit F1 in a control.
--*/
LRESULT CMultiRoots::OnCtxHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
LPHELPINFO lphi = (LPHELPINFO) i_lParam;
if (!lphi || lphi->iContextType != HELPINFO_WINDOW || lphi->iCtrlId < 0)
return FALSE;
::WinHelp((HWND)(lphi->hItemHandle),
DFS_CTX_HELP_FILE,
HELP_WM_HELP,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_MROOTS);
return TRUE;
}
/*++
This function handles "What's This" help when a user right clicks the control
--*/
LRESULT CMultiRoots::OnCtxMenuHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
::WinHelp((HWND)i_wParam,
DFS_CTX_HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_MROOTS);
return TRUE;
}
LRESULT CMultiRoots::OnOK
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
CWaitCursor wait;
FreeNetNameList(&m_SelectedRootList);
HRESULT hr = S_OK;
HWND hwnd = GetDlgItem(IDC_MROOTS_LIST);
int nIndex = -1;
TCHAR szText[MAX_PATH];
do {
while (-1 != (nIndex = ListView_GetNextItem(hwnd, nIndex, LVNI_SELECTED)))
{
ListView_GetItemText(hwnd, nIndex, 0, szText, MAX_PATH);
NETNAME* pCurrent = new NETNAME;
BREAK_OUTOFMEMORY_IF_NULL(pCurrent, &hr);
pCurrent->bstrNetName = szText;
if (!(pCurrent->bstrNetName))
{
delete pCurrent;
hr = E_OUTOFMEMORY;
break;
}
m_SelectedRootList.push_back(pCurrent);
}
} while (0);
if (FAILED(hr))
{
FreeNetNameList(&m_SelectedRootList);
DisplayMessageBoxForHR(hr);
return FALSE;
}
EndDialog(S_OK);
return TRUE;
}
LRESULT CMultiRoots::OnCancel
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
EndDialog(S_FALSE);
return(true);
}