diff --git a/reactos/dll/cpl/usrmgr/groups.c b/reactos/dll/cpl/usrmgr/groups.c
index fbb3475e268..7778bbc0a3c 100644
--- a/reactos/dll/cpl/usrmgr/groups.c
+++ b/reactos/dll/cpl/usrmgr/groups.c
@@ -29,8 +29,8 @@ SetGroupsListColumns(HWND hwndListView)
GetClientRect(hwndListView, &rect);
memset(&column, 0x00, sizeof(column));
- column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
- column.fmt=LVCFMT_LEFT;
+ column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
+ column.fmt = LVCFMT_LEFT;
column.cx = (INT)((rect.right - rect.left) * 0.40);
column.iSubItem = 0;
LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0]));
diff --git a/reactos/dll/cpl/usrmgr/lang/en-US.rc b/reactos/dll/cpl/usrmgr/lang/en-US.rc
index 248c07b5ef6..d278bcf193a 100644
--- a/reactos/dll/cpl/usrmgr/lang/en-US.rc
+++ b/reactos/dll/cpl/usrmgr/lang/en-US.rc
@@ -12,7 +12,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Users"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 7, 238, 85, WS_EX_CLIENTEDGE
END
@@ -22,7 +22,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Groups"
FONT 8, "MS Shell Dlg"
BEGIN
- CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
+ CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 7, 238, 85, WS_EX_CLIENTEDGE
END
@@ -36,6 +36,31 @@ BEGIN
END
+IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223
+STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "General"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "", IDC_USER_NAME, 7, 7, 112, 8
+
+END
+
+
+
+IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74
+STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Change Password"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL
+ RTEXT "New Password:", -1,7,10,96,8
+ EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL
+ RTEXT "Repeat Password:", -1,7,28,96,8
+ DEFPUSHBUTTON "OK",IDOK,156,53,50,14
+ PUSHBUTTON "Abbrechen",IDCANCEL,210,53,50,14
+END
+
+
/* Menus */
IDM_POPUP_GROUP MENU DISCARDABLE
diff --git a/reactos/dll/cpl/usrmgr/resource.h b/reactos/dll/cpl/usrmgr/resource.h
index 27779466a70..cd413e81efe 100644
--- a/reactos/dll/cpl/usrmgr/resource.h
+++ b/reactos/dll/cpl/usrmgr/resource.h
@@ -13,10 +13,14 @@
#define ICONSIZE 16
-/* ids */
-#define IDC_USRMGR_ICON 40
-#define IDC_USRMGR_ICON2 100 // Needed for theme compatability with Windows.
+/* Icons */
+#define IDI_USRMGR_ICON 40
+#define IDI_USRMGR_ICON2 100 // Needed for theme compatibility with Windows.
+#define IDI_USER 41
+#define IDI_LOCKED_USER 42
+#define IDI_GROUP 43
+
#define IDD_USERS 100
#define IDD_GROUPS 101
@@ -29,6 +33,26 @@
#define IDC_STATIC -1
+/* Dialogs */
+
+#define IDD_USER_GENERAL 310
+#define IDC_USER_NAME 311
+#define IDC_USER_FULLNAME 312
+#define IDC_USER_DESCRIPTION 313
+#define IDC_USER_PW_CHANGE 314
+#define IDC_USER_PW_NOCHANGE 315
+#define IDC_USER_PW_EXPIRE 316
+#define IDC_USER_DEACTIVATE 317
+#define IDC_USER_LOCK 318
+
+
+#define IDD_CHANGE_PASSWORD 350
+#define IDC_EDIT_PASSWORD1 351
+#define IDC_EDIT_PASSWORD2 352
+
+
+/* Strings */
+
#define IDS_CPLNAME 2000
#define IDS_CPLDESCRIPTION 2001
@@ -36,7 +60,9 @@
#define IDS_FULLNAME 2101
#define IDS_DESCRIPTION 2102
+
/* Menus */
+
#define IDM_POPUP_GROUP 120
#define IDM_GROUP_ADD_MEMBER 121
#define IDM_GROUP_NEW 122
diff --git a/reactos/dll/cpl/usrmgr/resources/group.ico b/reactos/dll/cpl/usrmgr/resources/group.ico
new file mode 100644
index 00000000000..6a7c73a315e
Binary files /dev/null and b/reactos/dll/cpl/usrmgr/resources/group.ico differ
diff --git a/reactos/dll/cpl/usrmgr/resources/locked.ico b/reactos/dll/cpl/usrmgr/resources/locked.ico
new file mode 100644
index 00000000000..9953f9dee8d
Binary files /dev/null and b/reactos/dll/cpl/usrmgr/resources/locked.ico differ
diff --git a/reactos/dll/cpl/usrmgr/resources/user.ico b/reactos/dll/cpl/usrmgr/resources/user.ico
new file mode 100644
index 00000000000..1868683d351
Binary files /dev/null and b/reactos/dll/cpl/usrmgr/resources/user.ico differ
diff --git a/reactos/dll/cpl/usrmgr/users.c b/reactos/dll/cpl/usrmgr/users.c
index f0d60ad492d..b48711a4bc5 100644
--- a/reactos/dll/cpl/usrmgr/users.c
+++ b/reactos/dll/cpl/usrmgr/users.c
@@ -20,6 +20,69 @@ typedef struct _USER_DATA
} USER_DATA, *PUSER_DATA;
+
+static BOOL
+SetPassword(HWND hwndDlg)
+{
+ TCHAR szPassword1[256];
+ TCHAR szPassword2[256];
+ UINT uLen1;
+ UINT uLen2;
+
+ uLen1 = GetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD1, szPassword1, 256);
+ uLen2 = GetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD2, szPassword2, 256);
+
+ /* Check the passwords */
+ if (uLen1 != uLen2 || _tcscmp(szPassword1, szPassword2) != 0)
+ {
+ MessageBox(hwndDlg,
+ TEXT("The passwords you entered are not the same!"),
+ TEXT("ERROR"),
+ MB_OK | MB_ICONERROR);
+ return FALSE;
+ }
+
+
+ return TRUE;
+}
+
+
+INT_PTR CALLBACK
+ChangePasswordDlgProc(HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ UNREFERENCED_PARAMETER(wParam);
+
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ if (SetPassword(hwndDlg))
+ EndDialog(hwndDlg, 0);
+ break;
+
+ case IDCANCEL:
+ EndDialog(hwndDlg, 0);
+ break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+
static VOID
SetUsersListColumns(HWND hwndListView)
{
@@ -120,7 +183,46 @@ OnInitDialog(HWND hwndDlg)
}
-static VOID
+static BOOL
+OnEndLabelEdit(LPNMLVDISPINFO pnmv)
+{
+ TCHAR szOldUserName[UNLEN];
+ TCHAR szNewUserName[UNLEN];
+ USER_INFO_0 useri0;
+ NET_API_STATUS status;
+
+ if (pnmv->item.iItem == -1)
+ return FALSE;
+
+ ListView_GetItemText(pnmv->hdr.hwndFrom,
+ pnmv->item.iItem, 0,
+ szOldUserName,
+ UNLEN);
+ lstrcpy(szNewUserName, pnmv->item.pszText);
+
+ if (lstrcmp(szOldUserName, szNewUserName) == 0)
+ return FALSE;
+
+ useri0.usri0_name = szNewUserName;
+
+ status = NetUserSetInfo(NULL, szOldUserName, 0, (LPBYTE)&useri0, NULL);
+ if (status != NERR_Success)
+ {
+ TCHAR szText[256];
+ wsprintf(szText, _T("Error: %u"), status);
+ MessageBox(NULL, szText, _T("NetUserSetInfo"), MB_ICONERROR | MB_OK);
+ return FALSE;
+ }
+
+ ListView_SetItemText(pnmv->hdr.hwndFrom,
+ pnmv->item.iItem, 0,
+ szNewUserName);
+
+ return TRUE;
+}
+
+
+static BOOL
OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
{
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
@@ -143,6 +245,9 @@ OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
case NM_DBLCLK:
break;
+ case LVN_ENDLABELEDIT:
+ return OnEndLabelEdit((LPNMLVDISPINFO)phdr);
+
case NM_RCLICK:
ClientToScreen(GetDlgItem(hwndDlg, IDC_USERS_LIST), &lpnmlv->ptAction);
TrackPopupMenu(GetSubMenu(pUserData->hPopupMenu, (lpnmlv->iItem == -1) ? 0 : 1),
@@ -151,6 +256,8 @@ OnNotify(HWND hwndDlg, PUSER_DATA pUserData, NMHDR *phdr)
}
break;
}
+
+ return FALSE;
}
@@ -180,6 +287,28 @@ UsersPageProc(HWND hwndDlg,
case WM_COMMAND:
switch (LOWORD(wParam))
{
+ case IDM_USER_CHANGE_PASSWORD:
+ DialogBoxParam(hApplet,
+ MAKEINTRESOURCE(IDD_CHANGE_PASSWORD),
+ hwndDlg,
+ ChangePasswordDlgProc,
+ (LPARAM)NULL);
+ break;
+
+ case IDM_USER_RENAME:
+ {
+ INT nItem;
+ HWND hwndLV;
+
+ hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST);
+ nItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED);
+ if (nItem != -1)
+ {
+ (void)ListView_EditLabel(hwndLV, nItem);
+ }
+ }
+ break;
+
case IDM_USER_PROPERTIES:
MessageBeep(-1);
break;
@@ -187,8 +316,7 @@ UsersPageProc(HWND hwndDlg,
break;
case WM_NOTIFY:
- OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
- break;
+ return OnNotify(hwndDlg, pUserData, (NMHDR *)lParam);
case WM_DESTROY:
DestroyMenu(pUserData->hPopupMenu);
diff --git a/reactos/dll/cpl/usrmgr/usrmgr.c b/reactos/dll/cpl/usrmgr/usrmgr.c
index 992441e1c58..c622bea9af1 100644
--- a/reactos/dll/cpl/usrmgr/usrmgr.c
+++ b/reactos/dll/cpl/usrmgr/usrmgr.c
@@ -20,7 +20,7 @@ HINSTANCE hApplet = 0;
APPLET Applets[NUM_APPLETS] =
{
{
- IDC_USRMGR_ICON,
+ IDI_USRMGR_ICON,
IDS_CPLNAME,
IDS_CPLDESCRIPTION,
UsrmgrApplet
@@ -60,7 +60,7 @@ UsrmgrApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
psh.dwFlags = PSH_PROPSHEETPAGE;
psh.hwndParent = NULL;
psh.hInstance = hApplet;
- psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_USRMGR_ICON));
+ psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_USRMGR_ICON));
psh.pszCaption = Caption;
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
diff --git a/reactos/dll/cpl/usrmgr/usrmgr.rbuild b/reactos/dll/cpl/usrmgr/usrmgr.rbuild
index 764a542deb4..42b5e321d16 100644
--- a/reactos/dll/cpl/usrmgr/usrmgr.rbuild
+++ b/reactos/dll/cpl/usrmgr/usrmgr.rbuild
@@ -5,6 +5,7 @@
.
0x600
0x501
+ 0x609
kernel32
user32
gdi32
diff --git a/reactos/dll/cpl/usrmgr/usrmgr.rc b/reactos/dll/cpl/usrmgr/usrmgr.rc
index f547cae50ec..945525391b6 100644
--- a/reactos/dll/cpl/usrmgr/usrmgr.rc
+++ b/reactos/dll/cpl/usrmgr/usrmgr.rc
@@ -11,7 +11,11 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
123 24 DISCARDABLE "manifest.xml"
-IDC_USRMGR_ICON ICON "resources/applet.ico"
-IDC_USRMGR_ICON2 ICON "resources/applet.ico"
+IDI_USRMGR_ICON ICON "resources/applet.ico"
+IDI_USRMGR_ICON2 ICON "resources/applet.ico"
+
+IDI_USER ICON "resources/user.ico"
+IDI_LOCKED_USER ICON "resources/locked.ico"
+IDI_GROUP ICON "resources/group.ico"
#include "rsrc.rc"