2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS User Manager Control Panel
4 * FILE: dll/cpl/usrmgr/groups.c
5 * PURPOSE: Groups property page
7 * PROGRAMMERS: Eric Kohl
12 typedef struct _GROUP_DATA
18 } GROUP_DATA
, *PGROUP_DATA
;
22 SetGroupsListColumns(HWND hwndListView
)
28 GetClientRect(hwndListView
, &rect
);
30 memset(&column
, 0x00, sizeof(column
));
31 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
32 column
.fmt
= LVCFMT_LEFT
;
33 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.40);
35 LoadString(hApplet
, IDS_NAME
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
36 column
.pszText
= szStr
;
37 (void)ListView_InsertColumn(hwndListView
, 0, &column
);
39 column
.cx
= (INT
)((rect
.right
- rect
.left
) * 0.60);
41 LoadString(hApplet
, IDS_DESCRIPTION
, szStr
, sizeof(szStr
) / sizeof(szStr
[0]));
42 column
.pszText
= szStr
;
43 (void)ListView_InsertColumn(hwndListView
, 1, &column
);
48 UpdateGroupsList(HWND hwndListView
)
50 NET_API_STATUS netStatus
;
51 PLOCALGROUP_INFO_1 pBuffer
;
54 DWORD_PTR resume_handle
= 0;
61 netStatus
= NetLocalGroupEnum(NULL
, 1, (LPBYTE
*)&pBuffer
,
63 &totalentries
, &resume_handle
);
64 if (netStatus
!= NERR_Success
&& netStatus
!= ERROR_MORE_DATA
)
67 for (i
= 0; i
< entriesread
; i
++)
69 memset(&lvi
, 0x00, sizeof(lvi
));
70 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
71 lvi
.pszText
= pBuffer
[i
].lgrpi1_name
;
74 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
76 ListView_SetItemText(hwndListView
, iItem
, 1,
77 pBuffer
[i
].lgrpi1_comment
);
80 NetApiBufferFree(pBuffer
);
82 /* No more data left */
83 if (netStatus
!= ERROR_MORE_DATA
)
91 UpdateGroupProperties(HWND hwndDlg
)
93 TCHAR szGroupName
[UNLEN
];
96 PLOCALGROUP_INFO_1 pGroupInfo
= NULL
;
98 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
99 iItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
103 /* Get the group name */
104 ListView_GetItemText(hwndLV
,
109 NetLocalGroupGetInfo(NULL
, szGroupName
, 1, (LPBYTE
*)&pGroupInfo
);
111 ListView_SetItemText(hwndLV
, iItem
, 1,
112 pGroupInfo
->lgrpi1_comment
);
114 NetApiBufferFree(pGroupInfo
);
119 NewGroupDlgProc(HWND hwndDlg
,
124 PLOCALGROUP_INFO_1 groupInfo
;
127 UNREFERENCED_PARAMETER(wParam
);
129 groupInfo
= (PLOCALGROUP_INFO_1
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
134 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
135 groupInfo
= (PLOCALGROUP_INFO_1
)lParam
;
136 SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, EM_SETLIMITTEXT
, 20, 0);
140 switch (LOWORD(wParam
))
142 case IDC_GROUP_NEW_NAME
:
143 if (HIWORD(wParam
) == EN_CHANGE
)
145 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
146 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), (nLength
> 0));
151 if (!CheckAccountName(hwndDlg
, IDC_GROUP_NEW_NAME
, NULL
))
153 SetFocus(GetDlgItem(hwndDlg
, IDC_GROUP_NEW_NAME
));
154 SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, EM_SETSEL
, 0, -1);
158 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
161 groupInfo
->lgrpi1_name
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
162 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_NAME
, groupInfo
->lgrpi1_name
, nLength
+ 1);
165 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, WM_GETTEXTLENGTH
, 0, 0);
168 groupInfo
->lgrpi1_comment
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
169 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, groupInfo
->lgrpi1_comment
, nLength
+ 1);
172 EndDialog(hwndDlg
, IDOK
);
176 EndDialog(hwndDlg
, IDCANCEL
);
190 GroupNew(HWND hwndDlg
)
192 NET_API_STATUS status
;
193 LOCALGROUP_INFO_1 group
;
198 ZeroMemory(&group
, sizeof(LOCALGROUP_INFO_1
));
200 if (DialogBoxParam(hApplet
,
201 MAKEINTRESOURCE(IDD_GROUP_NEW
),
204 (LPARAM
)&group
) == IDOK
)
206 status
= NetLocalGroupAdd(NULL
,
210 if (status
!= NERR_Success
)
213 wsprintf(szText
, TEXT("Error: %u"), status
);
214 MessageBox(NULL
, szText
, TEXT("NetUserAdd"), MB_ICONERROR
| MB_OK
);
218 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
220 ZeroMemory(&lvi
, sizeof(lvi
));
221 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
222 lvi
.pszText
= group
.lgrpi1_name
;
225 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
227 ListView_SetItemText(hwndLV
, iItem
, 1,
228 group
.lgrpi1_comment
);
231 if (group
.lgrpi1_name
)
232 HeapFree(GetProcessHeap(), 0, group
.lgrpi1_name
);
234 if (group
.lgrpi1_comment
)
235 HeapFree(GetProcessHeap(), 0, group
.lgrpi1_comment
);
240 GroupRename(HWND hwndDlg
)
245 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
246 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
249 (void)ListView_EditLabel(hwndLV
, nItem
);
255 GroupDelete(HWND hwndDlg
)
257 TCHAR szGroupName
[UNLEN
];
261 NET_API_STATUS status
;
263 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
264 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
268 /* Get the new group name */
269 ListView_GetItemText(hwndLV
,
274 /* Display a warning message, because the delete operation cannot be reverted */
275 wsprintf(szText
, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName
);
276 if (MessageBox(NULL
, szText
, TEXT("User Groups"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
279 /* Delete the group */
280 status
= NetLocalGroupDel(NULL
, szGroupName
);
281 if (status
!= NERR_Success
)
284 wsprintf(szText
, TEXT("Error: %u"), status
);
285 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDel"), MB_ICONERROR
| MB_OK
);
289 /* Delete the group from the list */
290 (void)ListView_DeleteItem(hwndLV
, nItem
);
297 OnInitDialog(HWND hwndDlg
)
303 /* Create the image list */
304 hImgList
= ImageList_Create(16,16,ILC_COLOR8
| ILC_MASK
,5,5);
305 hIcon
= LoadImage(hApplet
,MAKEINTRESOURCE(IDI_GROUP
),IMAGE_ICON
,16,16,LR_DEFAULTCOLOR
);
306 ImageList_AddIcon(hImgList
,hIcon
);
309 hwndListView
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
311 (VOID
)ListView_SetImageList(hwndListView
, hImgList
, LVSIL_SMALL
);
313 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
315 SetGroupsListColumns(hwndListView
);
317 UpdateGroupsList(hwndListView
);
322 OnBeginLabelEdit(LPNMLVDISPINFO pnmv
)
326 hwndEdit
= ListView_GetEditControl(pnmv
->hdr
.hwndFrom
);
327 if (hwndEdit
== NULL
)
330 SendMessage(hwndEdit
, EM_SETLIMITTEXT
, 20, 0);
337 OnEndLabelEdit(LPNMLVDISPINFO pnmv
)
339 TCHAR szOldGroupName
[UNLEN
];
340 TCHAR szNewGroupName
[UNLEN
];
341 LOCALGROUP_INFO_0 lgrpi0
;
342 NET_API_STATUS status
;
344 /* Leave, if there is no valid listview item */
345 if (pnmv
->item
.iItem
== -1)
348 /* Get the new user name */
349 ListView_GetItemText(pnmv
->hdr
.hwndFrom
,
354 /* Leave, if the user canceled the edit action */
355 if (pnmv
->item
.pszText
== NULL
)
358 /* Get the new user name */
359 lstrcpy(szNewGroupName
, pnmv
->item
.pszText
);
361 /* Leave, if the user name was not changed */
362 if (lstrcmp(szOldGroupName
, szNewGroupName
) == 0)
365 /* Check the group name for illegal characters */
366 if (!CheckAccountName(NULL
, 0, szNewGroupName
))
369 /* Change the user name */
370 lgrpi0
.lgrpi0_name
= szNewGroupName
;
372 status
= NetLocalGroupSetInfo(NULL
, szOldGroupName
, 0, (LPBYTE
)&lgrpi0
, NULL
);
373 if (status
!= NERR_Success
)
376 wsprintf(szText
, TEXT("Error: %u"), status
);
377 MessageBox(NULL
, szText
, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR
| MB_OK
);
381 /* Update the listview item */
382 ListView_SetItemText(pnmv
->hdr
.hwndFrom
,
391 OnNotify(HWND hwndDlg
, PGROUP_DATA pGroupData
, NMHDR
*phdr
)
393 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
395 switch (phdr
->idFrom
)
397 case IDC_GROUPS_LIST
:
401 pGroupData
->iCurrentItem
= lpnmlv
->iItem
;
405 if (lpnmlv
->iItem
!= -1)
409 uItem
= GetMenuDefaultItem(GetSubMenu(pGroupData
->hPopupMenu
, 1),
411 if (uItem
!= (UINT
)-1)
412 SendMessage(hwndDlg
, WM_COMMAND
, MAKEWPARAM(uItem
, 0), 0);
417 ClientToScreen(GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
), &lpnmlv
->ptAction
);
418 TrackPopupMenu(GetSubMenu(pGroupData
->hPopupMenu
, (lpnmlv
->iItem
== -1) ? 0 : 1),
419 TPM_LEFTALIGN
, lpnmlv
->ptAction
.x
, lpnmlv
->ptAction
.y
, 0, hwndDlg
, NULL
);
422 case LVN_BEGINLABELEDIT
:
423 return OnBeginLabelEdit((LPNMLVDISPINFO
)phdr
);
425 case LVN_ENDLABELEDIT
:
426 return OnEndLabelEdit((LPNMLVDISPINFO
)phdr
);
436 GroupsPageProc(HWND hwndDlg
,
441 PGROUP_DATA pGroupData
;
443 UNREFERENCED_PARAMETER(lParam
);
444 UNREFERENCED_PARAMETER(wParam
);
445 UNREFERENCED_PARAMETER(hwndDlg
);
448 pGroupData
= (PGROUP_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
453 pGroupData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GROUP_DATA
));
454 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGroupData
);
456 pGroupData
->hPopupMenu
= LoadMenu(hApplet
, MAKEINTRESOURCE(IDM_POPUP_GROUP
));
458 OnInitDialog(hwndDlg
);
459 SetMenuDefaultItem(GetSubMenu(pGroupData
->hPopupMenu
, 1),
460 IDM_GROUP_PROPERTIES
,
465 switch (LOWORD(wParam
))
472 case IDM_GROUP_RENAME
:
473 GroupRename(hwndDlg
);
476 case IDM_GROUP_DELETE
:
477 case IDC_GROUPS_REMOVE
:
478 GroupDelete(hwndDlg
);
481 case IDM_GROUP_PROPERTIES
:
482 case IDC_GROUPS_PROPERTIES
:
483 if (GroupProperties(hwndDlg
) == IDOK
)
484 UpdateGroupProperties(hwndDlg
);
490 return OnNotify(hwndDlg
, pGroupData
, (NMHDR
*)lParam
);
493 DestroyMenu(pGroupData
->hPopupMenu
);
494 HeapFree(GetProcessHeap(), 0, pGroupData
);