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 NET_API_STATUS status
;
97 PLOCALGROUP_INFO_1 pGroupInfo
= NULL
;
99 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
100 iItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
104 /* Get the group name */
105 ListView_GetItemText(hwndLV
,
110 status
= NetLocalGroupGetInfo(NULL
, szGroupName
, 1, (LPBYTE
*)&pGroupInfo
);
112 ListView_SetItemText(hwndLV
, iItem
, 1,
113 pGroupInfo
->lgrpi1_comment
);
115 NetApiBufferFree(pGroupInfo
);
120 NewGroupDlgProc(HWND hwndDlg
,
125 PLOCALGROUP_INFO_1 groupInfo
;
128 UNREFERENCED_PARAMETER(wParam
);
130 groupInfo
= (PLOCALGROUP_INFO_1
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
135 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
136 groupInfo
= (PLOCALGROUP_INFO_1
)lParam
;
137 SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, EM_SETLIMITTEXT
, 20, 0);
141 switch (LOWORD(wParam
))
143 case IDC_GROUP_NEW_NAME
:
144 if (HIWORD(wParam
) == EN_CHANGE
)
146 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
147 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), (nLength
> 0));
152 if (!CheckAccountName(hwndDlg
, IDC_GROUP_NEW_NAME
, NULL
))
154 SetFocus(GetDlgItem(hwndDlg
, IDC_GROUP_NEW_NAME
));
155 SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, EM_SETSEL
, 0, -1);
159 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
162 groupInfo
->lgrpi1_name
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
163 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_NAME
, groupInfo
->lgrpi1_name
, nLength
+ 1);
166 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, WM_GETTEXTLENGTH
, 0, 0);
169 groupInfo
->lgrpi1_comment
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
170 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, groupInfo
->lgrpi1_comment
, nLength
+ 1);
173 EndDialog(hwndDlg
, IDOK
);
177 EndDialog(hwndDlg
, IDCANCEL
);
191 GroupNew(HWND hwndDlg
)
193 NET_API_STATUS status
;
194 LOCALGROUP_INFO_1 group
;
199 ZeroMemory(&group
, sizeof(LOCALGROUP_INFO_1
));
201 if (DialogBoxParam(hApplet
,
202 MAKEINTRESOURCE(IDD_GROUP_NEW
),
205 (LPARAM
)&group
) == IDOK
)
208 status
= NetLocalGroupAdd(NULL
,
213 status
= NERR_Success
;
215 if (status
!= NERR_Success
)
218 wsprintf(szText
, TEXT("Error: %u"), status
);
219 MessageBox(NULL
, szText
, TEXT("NetUserAdd"), MB_ICONERROR
| MB_OK
);
223 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
225 ZeroMemory(&lvi
, sizeof(lvi
));
226 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
227 lvi
.pszText
= group
.lgrpi1_name
;
230 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
232 ListView_SetItemText(hwndLV
, iItem
, 1,
233 group
.lgrpi1_comment
);
236 if (group
.lgrpi1_name
)
237 HeapFree(GetProcessHeap(), 0, group
.lgrpi1_name
);
239 if (group
.lgrpi1_comment
)
240 HeapFree(GetProcessHeap(), 0, group
.lgrpi1_comment
);
245 GroupRename(HWND hwndDlg
)
250 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
251 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
254 (void)ListView_EditLabel(hwndLV
, nItem
);
260 GroupDelete(HWND hwndDlg
)
262 TCHAR szGroupName
[UNLEN
];
266 NET_API_STATUS status
;
268 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
269 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
273 /* Get the new group name */
274 ListView_GetItemText(hwndLV
,
279 /* Display a warning message because the delete operation cannot be reverted */
280 wsprintf(szText
, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName
);
281 if (MessageBox(NULL
, szText
, TEXT("User Groups"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
284 /* Delete the group */
286 status
= NetLocalGroupDel(NULL
, szGroupName
);
288 status
= NERR_Success
;
290 if (status
!= NERR_Success
)
293 wsprintf(szText
, TEXT("Error: %u"), status
);
294 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDel"), MB_ICONERROR
| MB_OK
);
298 /* Delete the group from the list */
299 (void)ListView_DeleteItem(hwndLV
, nItem
);
306 OnInitDialog(HWND hwndDlg
)
312 /* Create the image list */
313 hImgList
= ImageList_Create(16,16,ILC_COLOR8
| ILC_MASK
,5,5);
314 hIcon
= LoadImage(hApplet
,MAKEINTRESOURCE(IDI_GROUP
),IMAGE_ICON
,16,16,LR_DEFAULTCOLOR
);
315 ImageList_AddIcon(hImgList
,hIcon
);
318 hwndListView
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
320 (VOID
)ListView_SetImageList(hwndListView
, hImgList
, LVSIL_SMALL
);
322 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
324 SetGroupsListColumns(hwndListView
);
326 UpdateGroupsList(hwndListView
);
331 OnBeginLabelEdit(LPNMLVDISPINFO pnmv
)
335 hwndEdit
= ListView_GetEditControl(pnmv
->hdr
.hwndFrom
);
336 if (hwndEdit
== NULL
)
339 SendMessage(hwndEdit
, EM_SETLIMITTEXT
, 20, 0);
346 OnEndLabelEdit(LPNMLVDISPINFO pnmv
)
348 TCHAR szOldGroupName
[UNLEN
];
349 TCHAR szNewGroupName
[UNLEN
];
350 LOCALGROUP_INFO_0 lgrpi0
;
351 NET_API_STATUS status
;
353 /* Leave, if there is no valid listview item */
354 if (pnmv
->item
.iItem
== -1)
357 /* Get the new user name */
358 ListView_GetItemText(pnmv
->hdr
.hwndFrom
,
363 /* Leave, if the user canceled the edit action */
364 if (pnmv
->item
.pszText
== NULL
)
367 /* Get the new user name */
368 lstrcpy(szNewGroupName
, pnmv
->item
.pszText
);
370 /* Leave, if the user name was not changed */
371 if (lstrcmp(szOldGroupName
, szNewGroupName
) == 0)
374 /* Check the group name for illegal characters */
375 if (!CheckAccountName(NULL
, 0, szNewGroupName
))
378 /* Change the user name */
379 lgrpi0
.lgrpi0_name
= szNewGroupName
;
382 status
= NetLocalGroupSetInfo(NULL
, szOldGroupName
, 0, (LPBYTE
)&lgrpi0
, NULL
);
384 status
= NERR_Success
;
386 if (status
!= NERR_Success
)
389 wsprintf(szText
, TEXT("Error: %u"), status
);
390 MessageBox(NULL
, szText
, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR
| MB_OK
);
394 /* Update the listview item */
395 ListView_SetItemText(pnmv
->hdr
.hwndFrom
,
404 OnNotify(HWND hwndDlg
, PGROUP_DATA pGroupData
, NMHDR
*phdr
)
406 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
408 switch (phdr
->idFrom
)
410 case IDC_GROUPS_LIST
:
414 pGroupData
->iCurrentItem
= lpnmlv
->iItem
;
418 if (lpnmlv
->iItem
!= -1)
422 uItem
= GetMenuDefaultItem(GetSubMenu(pGroupData
->hPopupMenu
, 1),
424 if (uItem
!= (UINT
)-1)
425 SendMessage(hwndDlg
, WM_COMMAND
, MAKEWPARAM(uItem
, 0), 0);
430 ClientToScreen(GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
), &lpnmlv
->ptAction
);
431 TrackPopupMenu(GetSubMenu(pGroupData
->hPopupMenu
, (lpnmlv
->iItem
== -1) ? 0 : 1),
432 TPM_LEFTALIGN
, lpnmlv
->ptAction
.x
, lpnmlv
->ptAction
.y
, 0, hwndDlg
, NULL
);
435 case LVN_BEGINLABELEDIT
:
436 return OnBeginLabelEdit((LPNMLVDISPINFO
)phdr
);
438 case LVN_ENDLABELEDIT
:
439 return OnEndLabelEdit((LPNMLVDISPINFO
)phdr
);
449 GroupsPageProc(HWND hwndDlg
,
454 PGROUP_DATA pGroupData
;
456 UNREFERENCED_PARAMETER(lParam
);
457 UNREFERENCED_PARAMETER(wParam
);
458 UNREFERENCED_PARAMETER(hwndDlg
);
461 pGroupData
= (PGROUP_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
466 pGroupData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GROUP_DATA
));
467 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGroupData
);
469 pGroupData
->hPopupMenu
= LoadMenu(hApplet
, MAKEINTRESOURCE(IDM_POPUP_GROUP
));
471 OnInitDialog(hwndDlg
);
472 SetMenuDefaultItem(GetSubMenu(pGroupData
->hPopupMenu
, 1),
473 IDM_GROUP_PROPERTIES
,
478 switch (LOWORD(wParam
))
484 case IDM_GROUP_RENAME
:
485 GroupRename(hwndDlg
);
488 case IDM_GROUP_DELETE
:
489 GroupDelete(hwndDlg
);
492 case IDM_GROUP_PROPERTIES
:
493 if (GroupProperties(hwndDlg
) == IDOK
)
494 UpdateGroupProperties(hwndDlg
);
500 return OnNotify(hwndDlg
, pGroupData
, (NMHDR
*)lParam
);
503 DestroyMenu(pGroupData
->hPopupMenu
);
504 HeapFree(GetProcessHeap(), 0, pGroupData
);