897 lines
16 KiB
C++
897 lines
16 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1994-95 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ausrdlg.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Add user dialog implementation.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Don Ryan (donryan) 14-Feb-1995
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode - Win32
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Jeff Parham (jeffparh) 30-Jan-1996
|
||
|
o Added new element to LV_COLUMN_ENTRY to differentiate the string
|
||
|
used for the column header from the string used in the menus
|
||
|
(so that the menu option can contain hot keys).
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "llsmgr.h"
|
||
|
#include "ausrdlg.h"
|
||
|
|
||
|
static LV_COLUMN_INFO g_userColumnInfo = {0, 0, 1, {0, 0, 0, -1}};
|
||
|
static LV_COLUMN_INFO g_addedColumnInfo = {0, 0, 1, {0, 0, 0, -1}};
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CAddUsersDialog, CDialog)
|
||
|
//{{AFX_MSG_MAP(CAddUsersDialog)
|
||
|
ON_CBN_DROPDOWN(IDC_ADD_USERS_DOMAINS, OnDropdownDomains)
|
||
|
ON_BN_CLICKED(IDC_ADD_USERS_ADD, OnAdd)
|
||
|
ON_BN_CLICKED(IDC_ADD_USERS_DELETE, OnDelete)
|
||
|
ON_NOTIFY(NM_DBLCLK, IDC_ADD_USERS_ADD_USERS, OnDblclkAddUsers)
|
||
|
ON_NOTIFY(NM_DBLCLK, IDC_ADD_USERS_USERS, OnDblclkUsers)
|
||
|
ON_CBN_SELCHANGE(IDC_ADD_USERS_DOMAINS, OnSelchangeDomains)
|
||
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_ADD_USERS_USERS, OnGetdispinfoUsers)
|
||
|
ON_NOTIFY(NM_KILLFOCUS, IDC_ADD_USERS_USERS, OnKillfocusUsers)
|
||
|
ON_NOTIFY(NM_SETFOCUS, IDC_ADD_USERS_USERS, OnSetfocusUsers)
|
||
|
ON_NOTIFY(NM_KILLFOCUS, IDC_ADD_USERS_ADD_USERS, OnKillfocusAddUsers)
|
||
|
ON_NOTIFY(NM_SETFOCUS, IDC_ADD_USERS_ADD_USERS, OnSetfocusAddUsers)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
|
||
|
CAddUsersDialog::CAddUsersDialog(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CAddUsersDialog::IDD, pParent)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Constructor for add user dialog.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pParent - parent window handle.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CAddUsersDialog)
|
||
|
m_iDomain = -1;
|
||
|
m_iIndex = 0;
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_pObList = NULL;
|
||
|
m_bIsDomainListExpanded = FALSE;
|
||
|
|
||
|
m_bIsFocusUserList = FALSE;
|
||
|
m_bIsFocusAddedList = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::DoDataExchange(CDataExchange* pDX)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Called by framework to exchange dialog data.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pDX - data exchange object.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CAddUsersDialog)
|
||
|
DDX_Control(pDX, IDC_ADD_USERS_ADD, m_addBtn);
|
||
|
DDX_Control(pDX, IDC_ADD_USERS_DELETE, m_delBtn);
|
||
|
DDX_Control(pDX, IDC_ADD_USERS_DOMAINS, m_domainList);
|
||
|
DDX_Control(pDX, IDC_ADD_USERS_ADD_USERS, m_addedList);
|
||
|
DDX_Control(pDX, IDC_ADD_USERS_USERS, m_userList);
|
||
|
DDX_CBIndex(pDX, IDC_ADD_USERS_DOMAINS, m_iDomain);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::InitDialog(CObList* pObList)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes return list.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pObList - pointer to return list.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
ASSERT_VALID(pObList);
|
||
|
m_pObList = pObList;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::InitDomainList()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes list of domains.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
VT_BOOL.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
int iDomain;
|
||
|
|
||
|
CString strLabel;
|
||
|
strLabel.LoadString(IDS_DEFAULT_DOMAIN);
|
||
|
|
||
|
if ((iDomain = m_domainList.AddString(strLabel)) != CB_ERR)
|
||
|
{
|
||
|
m_domainList.SetCurSel(iDomain);
|
||
|
m_domainList.SetItemDataPtr(iDomain, (LPVOID)-1L);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::InitUserList()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Initializes list of users.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
::LvInitColumns(&m_userList, &g_userColumnInfo);
|
||
|
::LvInitColumns(&m_addedList, &g_addedColumnInfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CAddUsersDialog::InsertDomains(CDomains* pDomains)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Inserts domains into domain list.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pDomains - domain collection.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
||
|
|
||
|
ASSERT_VALID(pDomains);
|
||
|
|
||
|
if (pDomains)
|
||
|
{
|
||
|
VARIANT va;
|
||
|
VariantInit(&va);
|
||
|
|
||
|
CDomain* pDomain;
|
||
|
int iDomain;
|
||
|
int nDomains = pDomains->GetCount();
|
||
|
|
||
|
for (va.vt = VT_I4, va.lVal = 0; (va.lVal < nDomains) && NT_SUCCESS(NtStatus); va.lVal++)
|
||
|
{
|
||
|
pDomain = (CDomain*)MKOBJ(pDomains->GetItem(va));
|
||
|
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
|
||
|
|
||
|
if (pDomain)
|
||
|
{
|
||
|
if ((iDomain = m_domainList.AddString(pDomain->m_strName)) != CB_ERR)
|
||
|
{
|
||
|
m_domainList.SetItemDataPtr(iDomain, pDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
|
||
|
pDomain->InternalRelease();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_INVALID_PARAMETER;
|
||
|
}
|
||
|
|
||
|
if (NT_SUCCESS(NtStatus))
|
||
|
{
|
||
|
m_bIsDomainListExpanded = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_domainList.ResetContent();
|
||
|
LlsSetLastStatus(NtStatus);
|
||
|
}
|
||
|
|
||
|
return m_bIsDomainListExpanded;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnAdd()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for IDC_ADD_USER_ADD.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
CUser* pUser;
|
||
|
int iItem = -1;
|
||
|
|
||
|
while (pUser = (CUser*)::LvGetNextObj(&m_userList, &iItem))
|
||
|
{
|
||
|
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
|
||
|
LV_FINDINFO lvFindInfo;
|
||
|
|
||
|
lvFindInfo.flags = LVFI_STRING;
|
||
|
lvFindInfo.psz = MKSTR(pUser->m_strName);
|
||
|
|
||
|
if (m_addedList.FindItem(&lvFindInfo, -1) == -1)
|
||
|
{
|
||
|
//
|
||
|
// Make a copy of the user (w/no parent)
|
||
|
//
|
||
|
|
||
|
CUser* pNewUser = new CUser(NULL, pUser->m_strName);
|
||
|
|
||
|
if (pNewUser)
|
||
|
{
|
||
|
LV_ITEM lvItem;
|
||
|
|
||
|
lvItem.mask = LVIF_TEXT|
|
||
|
LVIF_PARAM|
|
||
|
LVIF_IMAGE;
|
||
|
|
||
|
lvItem.iSubItem = 0;
|
||
|
lvItem.lParam = (LPARAM)(LPVOID)pNewUser;
|
||
|
|
||
|
lvItem.iImage = BMPI_USER;
|
||
|
lvItem.pszText = MKSTR(pNewUser->m_strName);
|
||
|
lvItem.iItem = m_iIndex;
|
||
|
|
||
|
|
||
|
m_addedList.InsertItem(&lvItem);
|
||
|
m_iIndex++;
|
||
|
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
theApp.DisplayStatus( STATUS_NO_MEMORY );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_userList.SetFocus();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnDblclkAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Notification handler for NM_DLBCLK.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pNMHDR - notification header.
|
||
|
pResult - return code.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
OnDelete();
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnDblclkUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Notification handler for NM_DLBCLK.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
pNMHDR - notification header.
|
||
|
pResult - return code.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
OnAdd();
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnDelete()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for IDC_ADD_USER_DELETE.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
CUser* pUser;
|
||
|
int iItem = -1;
|
||
|
int iLastItem = 0;
|
||
|
|
||
|
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem))
|
||
|
{
|
||
|
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
|
||
|
pUser->InternalRelease(); // allocated above....
|
||
|
m_addedList.DeleteItem(iItem);
|
||
|
|
||
|
iLastItem = iItem;
|
||
|
iItem = -1;
|
||
|
m_iIndex--;
|
||
|
}
|
||
|
|
||
|
m_addedList.SetItemState(iLastItem, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
|
||
|
m_addedList.SetFocus();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnDropdownDomains()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Notification handler for CBN_DROPDOWN.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
if (m_bIsDomainListExpanded)
|
||
|
return;
|
||
|
|
||
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
||
|
|
||
|
CDomains* pDomains;
|
||
|
CDomain* pDomain;
|
||
|
int iDomain;
|
||
|
|
||
|
VARIANT va;
|
||
|
VariantInit(&va);
|
||
|
|
||
|
if (LlsGetApp()->IsFocusDomain())
|
||
|
{
|
||
|
pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetActiveDomain());
|
||
|
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
|
||
|
|
||
|
if (pDomain)
|
||
|
{
|
||
|
//
|
||
|
// Expand to include trusted domains
|
||
|
//
|
||
|
|
||
|
pDomains = (CDomains*)MKOBJ(pDomain->GetTrustedDomains(va));
|
||
|
|
||
|
if (pDomains && InsertDomains(pDomains))
|
||
|
{
|
||
|
//
|
||
|
// Now add active domain itself...
|
||
|
//
|
||
|
|
||
|
if ((iDomain = m_domainList.AddString(pDomain->m_strName)) != CB_ERR)
|
||
|
{
|
||
|
m_domainList.SetItemDataPtr(iDomain, pDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = LlsGetLastStatus();
|
||
|
}
|
||
|
|
||
|
if (pDomains)
|
||
|
pDomains->InternalRelease();
|
||
|
|
||
|
pDomain->InternalRelease();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = LlsGetLastStatus();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDomain = (CDomain*)MKOBJ(LlsGetApp()->GetLocalDomain());
|
||
|
ASSERT(pDomain && pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
|
||
|
|
||
|
if (pDomain)
|
||
|
{
|
||
|
//
|
||
|
// Expand to include all domains
|
||
|
//
|
||
|
|
||
|
pDomains = (CDomains*)MKOBJ(LlsGetApp()->GetDomains(va));
|
||
|
|
||
|
if (pDomains && InsertDomains(pDomains))
|
||
|
{
|
||
|
//
|
||
|
// CODEWORK... scroll to local domain???
|
||
|
//
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = LlsGetLastStatus();
|
||
|
}
|
||
|
|
||
|
if (pDomains)
|
||
|
pDomains->InternalRelease();
|
||
|
|
||
|
pDomain->InternalRelease();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = LlsGetLastStatus();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!NT_SUCCESS(NtStatus))
|
||
|
{
|
||
|
theApp.DisplayStatus(NtStatus);
|
||
|
m_domainList.ResetContent();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CAddUsersDialog::OnInitDialog()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for WM_INITDIALOG.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
BeginWaitCursor();
|
||
|
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
InitUserList(); // always construct headers...
|
||
|
InitDomainList();
|
||
|
|
||
|
m_addBtn.EnableWindow(FALSE);
|
||
|
m_delBtn.EnableWindow(FALSE);
|
||
|
|
||
|
if (!RefreshUserList())
|
||
|
theApp.DisplayLastStatus();
|
||
|
|
||
|
m_domainList.SetFocus();
|
||
|
|
||
|
EndWaitCursor();
|
||
|
|
||
|
return FALSE; // set focus to domain list
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnSelchangeDomains()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for CBN_SELCHANGED.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
RefreshUserList();
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL CAddUsersDialog::RefreshUserList()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Refreshs list of users (with currently selected item).
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
VT_BOOL.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
NTSTATUS NtStatus = STATUS_SUCCESS;
|
||
|
|
||
|
m_userList.DeleteAllItems();
|
||
|
|
||
|
int iDomain;
|
||
|
|
||
|
if ((iDomain = m_domainList.GetCurSel()) != CB_ERR)
|
||
|
{
|
||
|
CDomain* pDomain = (CDomain*)m_domainList.GetItemDataPtr(iDomain);
|
||
|
CUsers* pUsers = (CUsers*)NULL;
|
||
|
|
||
|
VARIANT va;
|
||
|
VariantInit(&va);
|
||
|
|
||
|
if (pDomain == (CDomain*)-1L)
|
||
|
{
|
||
|
//
|
||
|
// Enumerate users in license cache...
|
||
|
//
|
||
|
|
||
|
CController* pController = (CController*)MKOBJ(LlsGetApp()->GetActiveController());
|
||
|
if ( pController )
|
||
|
{
|
||
|
pController->InternalRelease(); // held open by CApplication
|
||
|
|
||
|
pUsers = pController->m_pUsers;
|
||
|
pUsers->InternalAddRef(); // released below...
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Enumerate users in particular domain...
|
||
|
//
|
||
|
|
||
|
ASSERT(pDomain->IsKindOf(RUNTIME_CLASS(CDomain)));
|
||
|
|
||
|
pUsers = (CUsers*)MKOBJ(pDomain->GetUsers(va));
|
||
|
ASSERT(pUsers && pUsers->IsKindOf(RUNTIME_CLASS(CUsers)));
|
||
|
}
|
||
|
|
||
|
if (pUsers)
|
||
|
{
|
||
|
CUser* pUser;
|
||
|
int nUsers = pUsers->GetCount();
|
||
|
|
||
|
LV_ITEM lvItem;
|
||
|
|
||
|
lvItem.mask = LVIF_TEXT|
|
||
|
LVIF_PARAM|
|
||
|
LVIF_IMAGE;
|
||
|
|
||
|
lvItem.iSubItem = 0;
|
||
|
|
||
|
lvItem.pszText = LPSTR_TEXTCALLBACK;
|
||
|
lvItem.cchTextMax = LPSTR_TEXTCALLBACK_MAX;
|
||
|
|
||
|
lvItem.iImage = BMPI_USER;
|
||
|
|
||
|
for (va.vt = VT_I4, va.lVal = 0; (va.lVal < nUsers) && NT_SUCCESS(NtStatus); va.lVal++)
|
||
|
{
|
||
|
pUser = (CUser*)MKOBJ(pUsers->GetItem(va));
|
||
|
ASSERT(pUser && pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
|
||
|
if (pUser)
|
||
|
{
|
||
|
lvItem.iItem = va.lVal;
|
||
|
lvItem.lParam = (LPARAM)(LPVOID)pUser;
|
||
|
|
||
|
if (m_userList.InsertItem(&lvItem) == -1)
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
|
||
|
pUser->InternalRelease();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pUsers->InternalRelease();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = LlsGetLastStatus();
|
||
|
}
|
||
|
|
||
|
VariantClear(&va);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
NtStatus = STATUS_NO_MEMORY;
|
||
|
}
|
||
|
|
||
|
if (!NT_SUCCESS(NtStatus))
|
||
|
{
|
||
|
m_userList.DeleteAllItems();
|
||
|
LlsSetLastStatus(NtStatus);
|
||
|
}
|
||
|
|
||
|
::LvResizeColumns(&m_userList, &g_userColumnInfo);
|
||
|
|
||
|
return NT_SUCCESS(NtStatus);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnOK()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for IDOK.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
if (m_pObList)
|
||
|
{
|
||
|
CUser* pUser;
|
||
|
int iItem = -1;
|
||
|
|
||
|
m_pObList->RemoveAll();
|
||
|
|
||
|
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem, LVNI_ALL))
|
||
|
{
|
||
|
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
m_pObList->AddTail(pUser);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CDialog::OnOK();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnCancel()
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Message handler for IDCANCEL.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Values:
|
||
|
|
||
|
None.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
CUser* pUser;
|
||
|
int iItem = -1;
|
||
|
|
||
|
while (pUser = (CUser*)::LvGetNextObj(&m_addedList, &iItem, LVNI_ALL))
|
||
|
{
|
||
|
ASSERT(pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
pUser->InternalRelease();
|
||
|
}
|
||
|
|
||
|
CDialog::OnCancel();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::InitDialogCtrls()
|
||
|
{
|
||
|
int iItem = -1;
|
||
|
|
||
|
if (m_bIsFocusUserList && m_userList.GetItemCount())
|
||
|
{
|
||
|
m_addBtn.EnableWindow(TRUE);
|
||
|
m_delBtn.EnableWindow(FALSE);
|
||
|
}
|
||
|
else if (m_bIsFocusAddedList && m_addedList.GetItemCount())
|
||
|
{
|
||
|
m_addBtn.EnableWindow(FALSE);
|
||
|
m_delBtn.EnableWindow(TRUE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_addBtn.EnableWindow(FALSE);
|
||
|
m_delBtn.EnableWindow(FALSE);
|
||
|
}
|
||
|
|
||
|
::LvResizeColumns(&m_userList, &g_userColumnInfo);
|
||
|
::LvResizeColumns(&m_addedList, &g_addedColumnInfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CAddUsersDialog::OnGetdispinfoUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
LV_ITEM lvItem = ((LV_DISPINFO*)pNMHDR)->item;
|
||
|
|
||
|
if (lvItem.iSubItem == 0)
|
||
|
{
|
||
|
CUser* pUser = (CUser*)lvItem.lParam;
|
||
|
ASSERT(pUser && pUser->IsKindOf(RUNTIME_CLASS(CUser)));
|
||
|
|
||
|
lstrcpyn(lvItem.pszText, pUser->m_strName, lvItem.cchTextMax);
|
||
|
}
|
||
|
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
void CAddUsersDialog::OnKillfocusUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
void CAddUsersDialog::OnSetfocusUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
m_bIsFocusUserList = TRUE;
|
||
|
m_bIsFocusAddedList = FALSE;
|
||
|
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
void CAddUsersDialog::OnKillfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
void CAddUsersDialog::OnSetfocusAddUsers(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
m_bIsFocusUserList = FALSE;
|
||
|
m_bIsFocusAddedList = TRUE;
|
||
|
PostMessage(WM_COMMAND, ID_INIT_CTRLS);
|
||
|
*pResult = 0;
|
||
|
}
|
||
|
|
||
|
BOOL CAddUsersDialog::OnCommand(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
if (wParam == ID_INIT_CTRLS)
|
||
|
{
|
||
|
InitDialogCtrls();
|
||
|
return TRUE; // processed...
|
||
|
}
|
||
|
|
||
|
return CDialog::OnCommand(wParam, lParam);
|
||
|
}
|