Add code to create, delete and rename user groups.
authorEric Kohl <eric.kohl@reactos.org>
Sat, 17 May 2008 16:06:54 +0000 (16:06 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 17 May 2008 16:06:54 +0000 (16:06 +0000)
svn path=/trunk/; revision=33557

reactos/dll/cpl/usrmgr/groups.c
reactos/dll/cpl/usrmgr/lang/en-US.rc
reactos/dll/cpl/usrmgr/resource.h

index db6a6a4..86f6519 100644 (file)
@@ -1,5 +1,4 @@
-/* $Id$\r
- *\r
+/*\r
  * COPYRIGHT:       See COPYING in the top level directory\r
  * PROJECT:         ReactOS User Manager Control Panel\r
  * FILE:            dll/cpl/usrmgr/groups.c\r
@@ -70,10 +69,9 @@ UpdateGroupsList(HWND hwndListView)
         for (i = 0; i < entriesread; i++)\r
         {\r
            memset(&lvi, 0x00, sizeof(lvi));\r
-           lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; // | LVIF_PARAM;\r
-//           lvi.lParam = (LPARAM)VarData;\r
+           lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;\r
            lvi.pszText = pBuffer[i].lgrpi1_name;\r
-           lvi.state = 0; //(i == 0) ? LVIS_SELECTED : 0;\r
+           lvi.state = 0;\r
            lvi.iImage = 0;\r
            iItem = ListView_InsertItem(hwndListView, &lvi);\r
 \r
@@ -91,6 +89,186 @@ UpdateGroupsList(HWND hwndListView)
 }\r
 \r
 \r
+INT_PTR CALLBACK\r
+NewGroupDlgProc(HWND hwndDlg,\r
+               UINT uMsg,\r
+               WPARAM wParam,\r
+               LPARAM lParam)\r
+{\r
+    PLOCALGROUP_INFO_1 groupInfo;\r
+    INT nLength;\r
+\r
+    UNREFERENCED_PARAMETER(wParam);\r
+\r
+    groupInfo = (PLOCALGROUP_INFO_1)GetWindowLongPtr(hwndDlg, DWLP_USER);\r
+\r
+    switch (uMsg)\r
+    {\r
+        case WM_INITDIALOG:\r
+            SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);\r
+            groupInfo = (PLOCALGROUP_INFO_1)lParam;\r
+            SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, EM_SETLIMITTEXT, 20, 0);\r
+            break;\r
+\r
+        case WM_COMMAND:\r
+            switch (LOWORD(wParam))\r
+            {\r
+                case IDC_GROUP_NEW_NAME:\r
+                    if (HIWORD(wParam) == EN_CHANGE)\r
+                    {\r
+                        nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);\r
+                        EnableWindow(GetDlgItem(hwndDlg, IDOK), (nLength > 0));\r
+                    }\r
+                    break;\r
+\r
+                case IDOK:\r
+\r
+                    nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_NAME, WM_GETTEXTLENGTH, 0, 0);\r
+                    if (nLength > 0)\r
+                    {\r
+                        groupInfo->lgrpi1_name = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
+                        GetDlgItemText(hwndDlg, IDC_GROUP_NEW_NAME, groupInfo->lgrpi1_name, nLength + 1);\r
+                    }\r
+\r
+                    nLength = SendDlgItemMessage(hwndDlg, IDC_GROUP_NEW_DESCRIPTION, WM_GETTEXTLENGTH, 0, 0);\r
+                    if (nLength > 0)\r
+                    {\r
+                        groupInfo->lgrpi1_comment = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nLength + 1) * sizeof(WCHAR));\r
+                        GetDlgItemText(hwndDlg, IDC_GROUP_NEW_DESCRIPTION, groupInfo->lgrpi1_comment, nLength + 1);\r
+                    }\r
+\r
+                    EndDialog(hwndDlg, IDOK);\r
+                    break;\r
+\r
+                case IDCANCEL:\r
+                    EndDialog(hwndDlg, IDCANCEL);\r
+                    break;\r
+            }\r
+            break;\r
+\r
+        default:\r
+            return FALSE;\r
+    }\r
+\r
+    return TRUE;\r
+}\r
+\r
+\r
+static VOID\r
+GroupNew(HWND hwndDlg)\r
+{\r
+    NET_API_STATUS status;\r
+    LOCALGROUP_INFO_1 group;\r
+    LV_ITEM lvi;\r
+    INT iItem;\r
+    HWND hwndLV;\r
+\r
+    ZeroMemory(&group, sizeof(LOCALGROUP_INFO_1));\r
+\r
+    if (DialogBoxParam(hApplet,\r
+                       MAKEINTRESOURCE(IDD_GROUP_NEW),\r
+                       hwndDlg,\r
+                       NewGroupDlgProc,\r
+                       (LPARAM)&group) == IDOK)\r
+    {\r
+#if 0\r
+        status = NetLocalGroupAdd(NULL,\r
+                                  1,\r
+                                  (LPBYTE)&group,\r
+                                  NULL);\r
+#else\r
+        status = NERR_Success;\r
+#endif\r
+        if (status != NERR_Success)\r
+        {\r
+            TCHAR szText[256];\r
+            wsprintf(szText, TEXT("Error: %u"), status);\r
+            MessageBox(NULL, szText, TEXT("NetUserAdd"), MB_ICONERROR | MB_OK);\r
+            return;\r
+        }\r
+\r
+        hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST);\r
+\r
+        ZeroMemory(&lvi, sizeof(lvi));\r
+        lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;\r
+        lvi.pszText = group.lgrpi1_name;\r
+        lvi.state = 0;\r
+        lvi.iImage = 0;\r
+        iItem = ListView_InsertItem(hwndLV, &lvi);\r
+\r
+        ListView_SetItemText(hwndLV, iItem, 1,\r
+                             group.lgrpi1_comment);\r
+    }\r
+\r
+    if (group.lgrpi1_name)\r
+        HeapFree(GetProcessHeap, 0, group.lgrpi1_name);\r
+\r
+    if (group.lgrpi1_comment)\r
+        HeapFree(GetProcessHeap, 0, group.lgrpi1_comment);\r
+}\r
+\r
+\r
+static VOID\r
+GroupRename(HWND hwndDlg)\r
+{\r
+    INT nItem;\r
+    HWND hwndLV;\r
+\r
+    hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST);\r
+    nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);\r
+    if (nItem != -1)\r
+    {\r
+        (void)ListView_EditLabel(hwndLV, nItem);\r
+    }\r
+}\r
+\r
+\r
+static BOOL\r
+GroupDelete(HWND hwndDlg)\r
+{\r
+    TCHAR szGroupName[UNLEN];\r
+    TCHAR szText[256];\r
+    INT nItem;\r
+    HWND hwndLV;\r
+    NET_API_STATUS status;\r
+\r
+    hwndLV = GetDlgItem(hwndDlg, IDC_GROUPS_LIST);\r
+    nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);\r
+    if (nItem == -1)\r
+        return FALSE;\r
+\r
+    /* Get the new group name */\r
+    ListView_GetItemText(hwndLV,\r
+                         nItem, 0,\r
+                         szGroupName,\r
+                         UNLEN);\r
+\r
+    /* Display a warning message because the delete operation cannot be reverted */\r
+    wsprintf(szText, TEXT("Dou you really want to delete the user group \"%s\"?"), szGroupName);\r
+    if (MessageBox(NULL, szText, TEXT("User Groups"), MB_ICONWARNING | MB_YESNO) == IDNO)\r
+        return FALSE;\r
+\r
+    /* Delete the group */\r
+#if 0\r
+    status = NetLocalGroupDel(NULL, szGroupName);\r
+#else\r
+    status = NERR_Success;\r
+#endif\r
+    if (status != NERR_Success)\r
+    {\r
+        TCHAR szText[256];\r
+        wsprintf(szText, TEXT("Error: %u"), status);\r
+        MessageBox(NULL, szText, TEXT("NetLocalGroupDel"), MB_ICONERROR | MB_OK);\r
+        return FALSE;\r
+    }\r
+\r
+    /* Delete the group from the list */\r
+    (void)ListView_DeleteItem(hwndLV, nItem);\r
+\r
+    return TRUE;\r
+}\r
+\r
+\r
 static VOID\r
 OnInitDialog(HWND hwndDlg)\r
 {\r
@@ -113,13 +291,80 @@ OnInitDialog(HWND hwndDlg)
     SetGroupsListColumns(hwndListView);\r
 \r
     UpdateGroupsList(hwndListView);\r
+}\r
+\r
+\r
+static BOOL\r
+OnBeginLabelEdit(LPNMLVDISPINFO pnmv)\r
+{\r
+    HWND hwndEdit;\r
+\r
+    hwndEdit = ListView_GetEditControl(pnmv->hdr.hwndFrom);\r
+    if (hwndEdit == NULL)\r
+        return TRUE;\r
 \r
-//    (void)ListView_SetColumnWidth(hwndListView, 3, LVSCW_AUTOSIZE_USEHEADER);\r
-//    (void)ListView_Update(hwndListView, 0);\r
+    SendMessage(hwndEdit, EM_SETLIMITTEXT, 20, 0);\r
+\r
+    return FALSE;\r
 }\r
 \r
 \r
-static VOID\r
+static BOOL\r
+OnEndLabelEdit(LPNMLVDISPINFO pnmv)\r
+{\r
+    TCHAR szOldGroupName[UNLEN];\r
+    TCHAR szNewGroupName[UNLEN];\r
+    LOCALGROUP_INFO_0 lgrpi0;\r
+    NET_API_STATUS status;\r
+\r
+    /* Leave, if there is no valid listview item */\r
+    if (pnmv->item.iItem == -1)\r
+        return FALSE;\r
+\r
+    /* Get the new user name */\r
+    ListView_GetItemText(pnmv->hdr.hwndFrom,\r
+                         pnmv->item.iItem, 0,\r
+                         szOldGroupName,\r
+                         UNLEN);\r
+\r
+    /* Leave, if the user canceled the edit action */\r
+    if (pnmv->item.pszText == NULL)\r
+        return FALSE;\r
+\r
+    /* Get the new user name */\r
+    lstrcpy(szNewGroupName, pnmv->item.pszText);\r
+\r
+    /* Leave, if the user name was not changed */\r
+    if (lstrcmp(szOldGroupName, szNewGroupName) == 0)\r
+        return FALSE;\r
+\r
+\r
+    /* Change the user name */\r
+    lgrpi0.lgrpi0_name = szNewGroupName;\r
+\r
+#if 0\r
+    status = NetLocalGroupSetInfo(NULL, szOldGroupName, 0, (LPBYTE)&lgrpi0, NULL);\r
+#else\r
+    status = NERR_Success;\r
+#endif\r
+    if (status != NERR_Success)\r
+    {\r
+        TCHAR szText[256];\r
+        wsprintf(szText, TEXT("Error: %u"), status);\r
+        MessageBox(NULL, szText, TEXT("NetLocalGroupSetInfo"), MB_ICONERROR | MB_OK);\r
+        return FALSE;\r
+    }\r
+\r
+    /* Update the listview item */\r
+    ListView_SetItemText(pnmv->hdr.hwndFrom,\r
+                         pnmv->item.iItem, 0,\r
+                         szNewGroupName);\r
+\r
+    return TRUE;\r
+}\r
+\r
+\r
+static BOOL\r
 OnNotify(HWND hwndDlg, PGROUP_DATA pGroupData, NMHDR *phdr)\r
 {\r
     LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;\r
@@ -147,9 +392,17 @@ OnNotify(HWND hwndDlg, PGROUP_DATA pGroupData, NMHDR *phdr)
                     TrackPopupMenu(GetSubMenu(pGroupData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),\r
                                    TPM_LEFTALIGN, lpnmlv->ptAction.x, lpnmlv->ptAction.y, 0, hwndDlg, NULL);\r
                     break;\r
+\r
+                case LVN_BEGINLABELEDIT:\r
+                    return OnBeginLabelEdit((LPNMLVDISPINFO)phdr);\r
+\r
+                case LVN_ENDLABELEDIT:\r
+                    return OnEndLabelEdit((LPNMLVDISPINFO)phdr);\r
             }\r
             break;\r
     }\r
+\r
+    return FALSE;\r
 }\r
 \r
 \r
@@ -180,11 +433,24 @@ GroupsPageProc(HWND hwndDlg,
             break;\r
 \r
         case WM_COMMAND:\r
+            switch (LOWORD(wParam))\r
+            {\r
+                case IDM_GROUP_NEW:\r
+                    GroupNew(hwndDlg);\r
+                    break;\r
+\r
+                case IDM_GROUP_RENAME:\r
+                    GroupRename(hwndDlg);\r
+                    break;\r
+\r
+                case IDM_GROUP_DELETE:\r
+                    GroupDelete(hwndDlg);\r
+                    break;\r
+            }\r
             break;\r
 \r
         case WM_NOTIFY:\r
-            OnNotify(hwndDlg, pGroupData, (NMHDR *)lParam);\r
-            break;\r
+            return OnNotify(hwndDlg, pGroupData, (NMHDR *)lParam);\r
 \r
         case WM_DESTROY:\r
             DestroyMenu(pGroupData->hPopupMenu);\r
index bdfb932..a65faa4 100644 (file)
@@ -84,20 +84,34 @@ BEGIN
 END
 
 
+IDD_GROUP_NEW DIALOGEX DISCARDABLE  0, 0, 267, 74
+STYLE  DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "New Group"
+FONT 8, "MS Shell Dlg"
+BEGIN
+    EDITTEXT        IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
+    RTEXT           "Group name:", -1,7,10,96,8
+    EDITTEXT        IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL
+    RTEXT           "Description:", -1,7,28,96,8
+    DEFPUSHBUTTON   "OK",IDOK,156,53,50,14,WS_DISABLED
+    PUSHBUTTON      "Cancel",IDCANCEL,210,53,50,14
+END
+
+
 /* Menus */
 
 IDM_POPUP_GROUP MENU DISCARDABLE
 BEGIN
     POPUP ""
     BEGIN
-        MENUITEM "New Group...", IDM_GROUP_NEW, GRAYED
+        MENUITEM "New Group...", IDM_GROUP_NEW
     END
     POPUP ""
     BEGIN
         MENUITEM "Add Member", IDM_GROUP_ADD_MEMBER, GRAYED
         MENUITEM SEPARATOR
-        MENUITEM "Delete", IDM_GROUP_DELETE, GRAYED
-        MENUITEM "Rename", IDM_GROUP_RENAME, GRAYED
+        MENUITEM "Delete", IDM_GROUP_DELETE
+        MENUITEM "Rename", IDM_GROUP_RENAME
         MENUITEM SEPARATOR
         MENUITEM "Properties", IDM_GROUP_PROPERTIES, GRAYED
     END
index 5a6c7c3..7221855 100644 (file)
 #define IDC_USER_NEW_DISABLED       369\r
 \r
 \r
+#define IDD_GROUP_NEW               370\r
+#define IDC_GROUP_NEW_NAME          371\r
+#define IDC_GROUP_NEW_DESCRIPTION   372\r
+\r
+\r
 /* Strings */\r
 \r
 #define IDS_CPLNAME                 2000\r