2025-11-28 00:35:46 +09:00

384 lines
10 KiB
C

/**********************************************************************
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) Microsoft Corporation. All Rights Reserved.
Module Name:
PeoplePickerDialog.c
Abstract:
This C file includes a sample, simple People Picker dialog.
--********************************************************************/
#pragma warning(disable:4201) // nameless struct/union
#include "PeoplePickerDialog.h"
// Forward Declarations
//
HRESULT InitPeoplePickerDialog(HWND hDlg);
void AddPersonToListView(HWND hDlg, LPARAM lParam);
void RemovePersonFromListView(HWND hDlg, LPARAM lParam);
void ClearPeopleFromListView(HWND hDlg);
INT_PTR CALLBACK PeoplePicker(HWND, UINT, WPARAM, LPARAM);
//-----------------------------------------------------------------------------
// Function: ShowPeoplePicker
//
// Purpose: Displays dialog and returns chosen user
//
// Returns: HRESULT
//
INT_PTR ShowPeoplePicker(HINSTANCE hInst, HWND hWnd, PEER_PEOPLE_NEAR_ME ** ppPerson)
{
if (ppPerson == NULL)
return FALSE;
return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PEOPLEPICKERDIALOG), hWnd, PeoplePicker, (LPARAM) ppPerson);
}
//-----------------------------------------------------------------------------
// Function: PeoplePickerFreePerson
//
// Purpose: Frees a PEER_PEOPLE_NEAR_ME
//
// Returns: HRESULT
//
void PeoplePickerFreePerson(PEER_PEOPLE_NEAR_ME * pPerson)
{
PeoplePickerModelFreePerson(pPerson);
}
//-----------------------------------------------------------------------------
// Function: InitPeoplePickerDialog
//
// Purpose: Initializes the people picker dialog setting up the list view
// and initializing the model
//
// Returns: HRESULT
//
HRESULT InitPeoplePickerDialog(HWND hDlg)
{
HRESULT hr = S_OK;
LV_COLUMN lvCol = {0};
HWND hList = NULL;
// Setup the column
//
lvCol.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;
lvCol.pszText = L"Name";
lvCol.cx = 0x190;
// Add the column
//
hList = GetDlgItem(hDlg,IDC_PEOPLELIST);
if (NULL != hList)
{
SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM) &lvCol);
}
else
{
MessageBox(NULL, L"Critical error", L"Critical error", MB_OK);
return E_UNEXPECTED;
}
// Init the data model
//
hr = InitPeoplePickerModel(hDlg);
if (FAILED(hr))
{
return hr;
}
return hr;
}
//-----------------------------------------------------------------------------
// Function: AddPersonToListView
//
// Purpose: Creates the list view item associating the
// person added with the LPARAM of the list view item.
//
// Returns: VOID
//
VOID AddPersonToListView(HWND hDlg, LPARAM lParam)
{
HWND hList = NULL;
LVITEM lvItem = {0};
PEER_PEOPLE_NEAR_ME * pPerson = (PEER_PEOPLE_NEAR_ME *) lParam;
// Setup listview item & unpack person near me info
//
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.cchTextMax = 256;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = pPerson->pwzNickName;
lvItem.lParam = (LPARAM) pPerson;
// Get the list from the dialog to insert the item
//
hList = GetDlgItem(hDlg, IDC_PEOPLELIST);
if (ListView_InsertItem(hList, &lvItem) == -1)
{
MessageBox(hDlg, L"Unable to add person to the list", L"Error", MB_OK);
PeoplePickerModelFreePerson(pPerson);
}
}
//-----------------------------------------------------------------------------
// Function: RemovePersonFromListView
//
// Purpose: Removes the person from the ListView
//
// Returns: VOID
//
VOID RemovePersonFromListView(HWND hDlg, LPARAM lParam)
{
HWND hList = NULL;
LVFINDINFO lvItemToFind = {0};
LVITEM lvItem = {0};
int index = -1;
PEER_PEOPLE_NEAR_ME * pPerson = (PEER_PEOPLE_NEAR_ME*) lParam;
PEER_PEOPLE_NEAR_ME * pTempPerson = NULL;
// Setup the search item
//
lvItemToFind.flags = LVFI_STRING;
lvItemToFind.psz = pPerson->pwzNickName;
// Setup the LVITEM info wanted
//
lvItem.mask = LVIF_PARAM;
hList = GetDlgItem(hDlg, IDC_PEOPLELIST);
// Get the list and find the item
//
index = ListView_FindItem(hList, index, &lvItemToFind);
while (-1 != index)
{
lvItem.iItem = index;
if (ListView_GetItem(hList, &lvItem))
{
pTempPerson = (PEER_PEOPLE_NEAR_ME *) lvItem.lParam;
if (0 == memcmp(&(pPerson->id), &(pTempPerson->id), sizeof(GUID)))
{
// Free the person we associated with the list view and delete it from the list view
//
PeoplePickerModelFreePerson((PEER_PEOPLE_NEAR_ME *)lvItem.lParam);
ListView_DeleteItem(hList, index);
PeoplePickerModelFreePerson(pPerson);
return;
}
else
{
index = ListView_FindItem(hList, index, &lvItemToFind);
}
}
}
PeoplePickerModelFreePerson(pPerson);
}
//-----------------------------------------------------------------------------
// Function: ClearPeopleFromListView
//
// Purpose: Cleans up the list view and all LPARAMs containing people
//
// Returns: VOID
//
VOID ClearPeopleFromListView(HWND hDlg)
{
HWND hList = NULL;
LVITEM lvItem = {0};
int index = 0;
int count = 0;
// Get the list
//
hList = GetDlgItem(hDlg,IDC_PEOPLELIST);
// Get the total # of items
//
count = ListView_GetItemCount(hList);
for (index = 0; index < count; index++)
{
// Get the item to delete
//
lvItem.mask = LVIF_PARAM;
lvItem.iItem = index;
if (ListView_GetItem(hList,&lvItem))
{
// Free the person associated with the list view item
//
PeoplePickerModelFreePerson((PEER_PEOPLE_NEAR_ME *)lvItem.lParam);
}
}
// Clear the list view
//
ListView_DeleteAllItems(hList);
}
//-----------------------------------------------------------------------------
// Function: AcceptSelectedItem
//
// Purpose: Save the PNM contact represented by the index and close the dialog.
//
// Returns: HRESULT
//
HRESULT AcceptSelectedItem(HWND hDlg, int index)
{
HRESULT hr = E_FAIL;
HWND hList = NULL;
LVITEM lvItem = {0};
PEER_PEOPLE_NEAR_ME * pSelectedPerson = NULL;
PEER_PEOPLE_NEAR_ME ** ppPerson = NULL;
if (index < 0) return E_INVALIDARG;
hList = GetDlgItem(hDlg, IDC_PEOPLELIST);
//Setup the lvItem to get the actual item at the index
//
lvItem.mask = LVIF_PARAM;
lvItem.iItem = index;
if (ListView_GetItem(hList, &lvItem))
{
//Get the relevant fields from the person stored in the item's LPARAM
//
pSelectedPerson = (PEER_PEOPLE_NEAR_ME *) lvItem.lParam;
ppPerson = (PEER_PEOPLE_NEAR_ME **) (LONG_PTR) GetWindowLongPtr(hDlg, DWLP_USER);
hr = DuplicatePeerPeopleNearMe(ppPerson, pSelectedPerson);
}
// Clean up the dialog and associated model
//
ClearPeopleFromListView(hDlg);
PeoplePickerModelDestroy();
if (SUCCEEDED(hr))
{
EndDialog(hDlg, IDOK);
}
else
{
EndDialog(hDlg, IDCANCEL);
}
return hr;
}
//-----------------------------------------------------------------------------
// Function: PeoplePicker
//
// Purpose: People Picker Dialog Proc
//
// Returns: HRESULT
//
INT_PTR CALLBACK PeoplePicker(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hList = NULL;
int index = 0;
switch (message)
{
case WM_INITDIALOG:
// Save the PEER_PEOPLE_NEAR_ME output param received from ShowPeoplePicker
//
SetWindowLongPtr(hDlg, DWLP_USER, (LONG) lParam);
InitPeoplePickerDialog(hDlg);
return (INT_PTR)TRUE;
case WM_ADDPERSON:
AddPersonToListView(hDlg, lParam);
return (INT_PTR)TRUE;
case WM_REMOVEPERSON:
RemovePersonFromListView(hDlg, lParam);
return (INT_PTR)TRUE;
case WM_CLEARPEOPLE:
ClearPeopleFromListView(hDlg);
return (INT_PTR)TRUE;
case WM_NOTIFY:
// Check the list to see if something is selected
// If so, enable the "OK" button, if not disable the "OK" button.
//
if (((LPNMHDR)lParam)->code == LVN_ITEMCHANGED)
{
hList = GetDlgItem(hDlg,IDC_PEOPLELIST);
if (ListView_GetSelectedCount(hList))
{
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
}
}
if (((LPNMHDR)lParam)->code == NM_DBLCLK)
{
index = ((LPNMITEMACTIVATE)lParam)->iItem;
if (index >= 0)
{
AcceptSelectedItem(hDlg, index);
}
}
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
hList = GetDlgItem(hDlg, IDC_PEOPLELIST);
//Get the index of the first selected item
//
index = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
if (index >= 0)
{
AcceptSelectedItem(hDlg, index);
}
return (INT_PTR)TRUE;
}
if (LOWORD(wParam) == IDCANCEL)
{
// Clean up the dialog and associated model
//
ClearPeopleFromListView(hDlg);
PeoplePickerModelDestroy();
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}