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 resume_handle
= 0;
63 netStatus
= NetLocalGroupEnum(NULL
, 1, (LPBYTE
*)&pBuffer
,
65 &totalentries
, &resume_handle
);
66 if (netStatus
!= NERR_Success
&& netStatus
!= ERROR_MORE_DATA
)
69 for (i
= 0; i
< entriesread
; i
++)
71 memset(&lvi
, 0x00, sizeof(lvi
));
72 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
73 lvi
.pszText
= pBuffer
[i
].lgrpi1_name
;
76 iItem
= ListView_InsertItem(hwndListView
, &lvi
);
78 ListView_SetItemText(hwndListView
, iItem
, 1,
79 pBuffer
[i
].lgrpi1_comment
);
82 NetApiBufferFree(&pBuffer
);
84 /* No more data left */
85 if (netStatus
!= ERROR_MORE_DATA
)
93 NewGroupDlgProc(HWND hwndDlg
,
98 PLOCALGROUP_INFO_1 groupInfo
;
101 UNREFERENCED_PARAMETER(wParam
);
103 groupInfo
= (PLOCALGROUP_INFO_1
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
108 SetWindowLongPtr(hwndDlg
, DWLP_USER
, lParam
);
109 groupInfo
= (PLOCALGROUP_INFO_1
)lParam
;
110 SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, EM_SETLIMITTEXT
, 20, 0);
114 switch (LOWORD(wParam
))
116 case IDC_GROUP_NEW_NAME
:
117 if (HIWORD(wParam
) == EN_CHANGE
)
119 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
120 EnableWindow(GetDlgItem(hwndDlg
, IDOK
), (nLength
> 0));
126 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_NAME
, WM_GETTEXTLENGTH
, 0, 0);
129 groupInfo
->lgrpi1_name
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
130 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_NAME
, groupInfo
->lgrpi1_name
, nLength
+ 1);
133 nLength
= SendDlgItemMessage(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, WM_GETTEXTLENGTH
, 0, 0);
136 groupInfo
->lgrpi1_comment
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, (nLength
+ 1) * sizeof(WCHAR
));
137 GetDlgItemText(hwndDlg
, IDC_GROUP_NEW_DESCRIPTION
, groupInfo
->lgrpi1_comment
, nLength
+ 1);
140 EndDialog(hwndDlg
, IDOK
);
144 EndDialog(hwndDlg
, IDCANCEL
);
158 GroupNew(HWND hwndDlg
)
160 NET_API_STATUS status
;
161 LOCALGROUP_INFO_1 group
;
166 ZeroMemory(&group
, sizeof(LOCALGROUP_INFO_1
));
168 if (DialogBoxParam(hApplet
,
169 MAKEINTRESOURCE(IDD_GROUP_NEW
),
172 (LPARAM
)&group
) == IDOK
)
175 status
= NetLocalGroupAdd(NULL
,
180 status
= NERR_Success
;
182 if (status
!= NERR_Success
)
185 wsprintf(szText
, TEXT("Error: %u"), status
);
186 MessageBox(NULL
, szText
, TEXT("NetUserAdd"), MB_ICONERROR
| MB_OK
);
190 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
192 ZeroMemory(&lvi
, sizeof(lvi
));
193 lvi
.mask
= LVIF_TEXT
| LVIF_STATE
| LVIF_IMAGE
;
194 lvi
.pszText
= group
.lgrpi1_name
;
197 iItem
= ListView_InsertItem(hwndLV
, &lvi
);
199 ListView_SetItemText(hwndLV
, iItem
, 1,
200 group
.lgrpi1_comment
);
203 if (group
.lgrpi1_name
)
204 HeapFree(GetProcessHeap
, 0, group
.lgrpi1_name
);
206 if (group
.lgrpi1_comment
)
207 HeapFree(GetProcessHeap
, 0, group
.lgrpi1_comment
);
212 GroupRename(HWND hwndDlg
)
217 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
218 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
221 (void)ListView_EditLabel(hwndLV
, nItem
);
227 GroupDelete(HWND hwndDlg
)
229 TCHAR szGroupName
[UNLEN
];
233 NET_API_STATUS status
;
235 hwndLV
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
236 nItem
= ListView_GetNextItem(hwndLV
, -1, LVNI_SELECTED
);
240 /* Get the new group name */
241 ListView_GetItemText(hwndLV
,
246 /* Display a warning message because the delete operation cannot be reverted */
247 wsprintf(szText
, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName
);
248 if (MessageBox(NULL
, szText
, TEXT("User Groups"), MB_ICONWARNING
| MB_YESNO
) == IDNO
)
251 /* Delete the group */
253 status
= NetLocalGroupDel(NULL
, szGroupName
);
255 status
= NERR_Success
;
257 if (status
!= NERR_Success
)
260 wsprintf(szText
, TEXT("Error: %u"), status
);
261 MessageBox(NULL
, szText
, TEXT("NetLocalGroupDel"), MB_ICONERROR
| MB_OK
);
265 /* Delete the group from the list */
266 (void)ListView_DeleteItem(hwndLV
, nItem
);
273 OnInitDialog(HWND hwndDlg
)
279 /* Create the image list */
280 hImgList
= ImageList_Create(16,16,ILC_COLOR8
| ILC_MASK
,5,5);
281 hIcon
= LoadImage(hApplet
,MAKEINTRESOURCE(IDI_GROUP
),IMAGE_ICON
,16,16,LR_DEFAULTCOLOR
);
282 ImageList_AddIcon(hImgList
,hIcon
);
285 hwndListView
= GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
);
287 (VOID
)ListView_SetImageList(hwndListView
, hImgList
, LVSIL_SMALL
);
289 (void)ListView_SetExtendedListViewStyle(hwndListView
, LVS_EX_FULLROWSELECT
);
291 SetGroupsListColumns(hwndListView
);
293 UpdateGroupsList(hwndListView
);
298 OnBeginLabelEdit(LPNMLVDISPINFO pnmv
)
302 hwndEdit
= ListView_GetEditControl(pnmv
->hdr
.hwndFrom
);
303 if (hwndEdit
== NULL
)
306 SendMessage(hwndEdit
, EM_SETLIMITTEXT
, 20, 0);
313 OnEndLabelEdit(LPNMLVDISPINFO pnmv
)
315 TCHAR szOldGroupName
[UNLEN
];
316 TCHAR szNewGroupName
[UNLEN
];
317 LOCALGROUP_INFO_0 lgrpi0
;
318 NET_API_STATUS status
;
320 /* Leave, if there is no valid listview item */
321 if (pnmv
->item
.iItem
== -1)
324 /* Get the new user name */
325 ListView_GetItemText(pnmv
->hdr
.hwndFrom
,
330 /* Leave, if the user canceled the edit action */
331 if (pnmv
->item
.pszText
== NULL
)
334 /* Get the new user name */
335 lstrcpy(szNewGroupName
, pnmv
->item
.pszText
);
337 /* Leave, if the user name was not changed */
338 if (lstrcmp(szOldGroupName
, szNewGroupName
) == 0)
342 /* Change the user name */
343 lgrpi0
.lgrpi0_name
= szNewGroupName
;
346 status
= NetLocalGroupSetInfo(NULL
, szOldGroupName
, 0, (LPBYTE
)&lgrpi0
, NULL
);
348 status
= NERR_Success
;
350 if (status
!= NERR_Success
)
353 wsprintf(szText
, TEXT("Error: %u"), status
);
354 MessageBox(NULL
, szText
, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR
| MB_OK
);
358 /* Update the listview item */
359 ListView_SetItemText(pnmv
->hdr
.hwndFrom
,
368 OnNotify(HWND hwndDlg
, PGROUP_DATA pGroupData
, NMHDR
*phdr
)
370 LPNMLISTVIEW lpnmlv
= (LPNMLISTVIEW
)phdr
;
372 switch (phdr
->idFrom
)
374 case IDC_GROUPS_LIST
:
378 pGroupData
->iCurrentItem
= lpnmlv
->iItem
;
379 if (lpnmlv
->iItem
== -1)
391 ClientToScreen(GetDlgItem(hwndDlg
, IDC_GROUPS_LIST
), &lpnmlv
->ptAction
);
392 TrackPopupMenu(GetSubMenu(pGroupData
->hPopupMenu
, (lpnmlv
->iItem
== -1) ? 0 : 1),
393 TPM_LEFTALIGN
, lpnmlv
->ptAction
.x
, lpnmlv
->ptAction
.y
, 0, hwndDlg
, NULL
);
396 case LVN_BEGINLABELEDIT
:
397 return OnBeginLabelEdit((LPNMLVDISPINFO
)phdr
);
399 case LVN_ENDLABELEDIT
:
400 return OnEndLabelEdit((LPNMLVDISPINFO
)phdr
);
410 GroupsPageProc(HWND hwndDlg
,
415 PGROUP_DATA pGroupData
;
417 UNREFERENCED_PARAMETER(lParam
);
418 UNREFERENCED_PARAMETER(wParam
);
419 UNREFERENCED_PARAMETER(hwndDlg
);
422 pGroupData
= (PGROUP_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
427 pGroupData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(GROUP_DATA
));
428 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pGroupData
);
430 pGroupData
->hPopupMenu
= LoadMenu(hApplet
, MAKEINTRESOURCE(IDM_POPUP_GROUP
));
432 OnInitDialog(hwndDlg
);
436 switch (LOWORD(wParam
))
442 case IDM_GROUP_RENAME
:
443 GroupRename(hwndDlg
);
446 case IDM_GROUP_DELETE
:
447 GroupDelete(hwndDlg
);
453 return OnNotify(hwndDlg
, pGroupData
, (NMHDR
*)lParam
);
456 DestroyMenu(pGroupData
->hPopupMenu
);
457 HeapFree(GetProcessHeap(), 0, pGroupData
);