reactos/subsys/system/regedit
diff -u -r1.5 -r1.6
--- En.rc 5 Apr 2004 12:00:11 -0000 1.5
+++ En.rc 20 Jun 2004 01:07:26 -0000 1.6
@@ -142,6 +142,20 @@
PUSHBUTTON "Cancel",IDCANCEL,196,64,50,14
END
+IDD_EDIT_MULTI_STRING DIALOG 32, 24, 252, 174
+STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP |
+ WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Edit Multi-String"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ LTEXT "Value &name:",IDC_STATIC,6,6,134,8
+ EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY
+ LTEXT "&Value data:",IDC_STATIC,6,35,161,8
+ EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | WS_VSCROLL
+ DEFPUSHBUTTON "OK",IDOK,142,154,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,196,154,50,14
+END
+
IDD_EDIT_DWORD DIALOG 32, 24, 252, 104
STYLE DS_SETFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_3DLOOK | DS_CONTEXTHELP |
@@ -225,9 +239,11 @@
STRINGTABLE DISCARDABLE
BEGIN
IDS_ERROR "Error"
+ IDS_WARNING "Warning"
IDS_BAD_VALUE "Can't query value '%s'"
IDS_UNSUPPORTED_TYPE "Can't edit keys of this type (%ld)"
IDS_TOO_BIG_VALUE "Value is too big (%ld)"
+ IDS_MULTI_SZ_EMPTY_STRING "Data of type REG_MULTI_SZ cannot contain empty strings.\nThe empty strings have been removed from the list."
END
/*****************************************************************/
reactos/subsys/system/regedit
diff -u -r1.6 -r1.7
--- edit.c 5 Apr 2004 12:00:11 -0000 1.6
+++ edit.c 20 Jun 2004 01:07:26 -0000 1.7
@@ -71,6 +71,29 @@
MessageBox(hwnd, errstr, title, MB_OK | MB_ICONERROR);
}
+void warning(HWND hwnd, INT resId, ...)
+{
+ va_list ap;
+ TCHAR title[256];
+ TCHAR errfmt[1024];
+ TCHAR errstr[1024];
+ HINSTANCE hInstance;
+
+ hInstance = GetModuleHandle(0);
+
+ if (!LoadString(hInstance, IDS_WARNING, title, COUNT_OF(title)))
+ lstrcpy(title, "Error");
+
+ if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt)))
+ lstrcpy(errfmt, "Unknown error string!");
+
+ va_start(ap, resId);
+ _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap);
+ va_end(ap);
+
+ MessageBox(hwnd, errstr, title, MB_OK | MB_ICONSTOP);
+}
+
INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR* valueData;
@@ -134,6 +157,69 @@
}
+INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ TCHAR* valueData;
+ HWND hwndValue;
+ int len;
+
+ switch(uMsg) {
+ case WM_INITDIALOG:
+ if(editValueName && strcmp(editValueName, _T("")))
+ {
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg, IDC_VALUE_NAME, _T("(Default)"));
+ }
+ SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
+ SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
+ return FALSE;
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
+ {
+ if ((len = GetWindowTextLength(hwndValue)))
+ {
+ if (stringValueData)
+ {
+ if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR))))
+ {
+ stringValueData = valueData;
+ if (!GetWindowText(hwndValue, stringValueData, len + 1))
+ *stringValueData = 0;
+ }
+ }
+ else
+ {
+ if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR))))
+ {
+ stringValueData = valueData;
+ if (!GetWindowText(hwndValue, stringValueData, len + 1))
+ *stringValueData = 0;
+ }
+ }
+ }
+ else
+ {
+ if (stringValueData)
+ *stringValueData = 0;
+ }
+ }
+ EndDialog(hwndDlg, IDOK);
+ break;
+ case IDCANCEL:
+ EndDialog(hwndDlg, IDCANCEL);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldwndproc;
@@ -362,6 +448,112 @@
result = TRUE;
}
}
+ else if (type == REG_MULTI_SZ)
+ {
+ if (valueDataLen > 0)
+ {
+ DWORD NewLen, llen, listlen, nl_len;
+ LPTSTR src, lines = NULL;
+
+ if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
+ {
+ error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
+ goto done;
+ }
+ lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen);
+ if (lRet != ERROR_SUCCESS)
+ {
+ error(hwnd, IDS_BAD_VALUE, valueName);
+ goto done;
+ }
+
+ /* convert \0 to \r\n */
+ NewLen = valueDataLen;
+ src = stringValueData;
+ nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR);
+ listlen = sizeof(TCHAR);
+ lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, listlen + sizeof(TCHAR));
+ while(*src != _T('\0'))
+ {
+ llen = _tcslen(src);
+ if(llen == 0)
+ break;
+ listlen += (llen * sizeof(TCHAR)) + nl_len;
+ lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, listlen);
+ _tcscat(lines, src);
+ _tcscat(lines, _T("\r\n"));
+ src += llen + 1;
+ }
+ HeapFree(GetProcessHeap(), 0, stringValueData);
+ stringValueData = lines;
+ }
+ else
+ {
+ stringValueData = NULL;
+ }
+
+ if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_multi_string_dlgproc) == IDOK)
+ {
+ if (stringValueData)
+ {
+ /* convert \r\n to \0 */
+ BOOL EmptyLines = FALSE;
+ LPTSTR src, lines, nl;
+ DWORD linechars, buflen, c_nl, dest;
+
+ src = stringValueData;
+ buflen = sizeof(TCHAR);
+ lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen + sizeof(TCHAR));
+ c_nl = _tcslen(_T("\r\n"));
+ dest = 0;
+ while(*src != _T('\0'))
+ {
+ if((nl = _tcsstr(src, _T("\r\n"))))
+ {
+ linechars = (nl - src) / sizeof(TCHAR);
+ if(nl == src)
+ {
+ EmptyLines = TRUE;
+ src = nl + c_nl;
+ continue;
+ }
+ }
+ else
+ {
+ linechars = _tcslen(src);
+ }
+ if(linechars > 0)
+ {
+ buflen += ((linechars + 1) * sizeof(TCHAR));
+ lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, buflen);
+ memcpy((lines + dest), src, linechars * sizeof(TCHAR));
+ dest += linechars;
+ lines[dest++] = _T('\0');
+ }
+ else
+ {
+ EmptyLines = TRUE;
+ }
+ src += linechars + (nl != NULL ? c_nl : 0);
+ }
+ lines[++dest] = _T('\0');
+
+ if(EmptyLines)
+ {
+ warning(hwnd, IDS_MULTI_SZ_EMPTY_STRING);
+ }
+
+ lRet = RegSetValueEx(hKey, valueName, 0, type, lines, buflen);
+ HeapFree(GetProcessHeap(), 0, lines);
+ }
+ else
+ {
+ lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0);
+ }
+ if (lRet == ERROR_SUCCESS)
+ result = TRUE;
+ }
+ }
else if (type == REG_DWORD)
{
lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen);
reactos/subsys/system/regedit
diff -u -r1.9 -r1.10
--- listview.c 19 Jun 2004 23:12:58 -0000 1.9
+++ listview.c 20 Jun 2004 01:07:26 -0000 1.10
@@ -159,8 +159,6 @@
index = ListView_InsertItem(hwndLV, &item);
if (index != -1) {
- /* LPTSTR pszText = NULL; */
- LPTSTR pszText = _T("value");
switch (dwValType) {
case REG_SZ:
case REG_EXPAND_SZ:
@@ -182,14 +180,18 @@
/* concatenate all srings */
while(*src != _T('\0'))
{
- _tcscat(str, _T(" "));
_tcscat(str, src);
+ _tcscat(str, _T(" "));
src += _tcslen(src) + 1;
}
ListView_SetItemText(hwndLV, index, 2, str);
HeapFree(GetProcessHeap(), 0, str);
}
+ else
+ ListView_SetItemText(hwndLV, index, 2, _T(""));
}
+ else
+ ListView_SetItemText(hwndLV, index, 2, _T(""));
}
break;
case REG_DWORD: {
@@ -212,8 +214,7 @@
}
break;
default:
- /* lpsRes = convertHexToHexCSV(lpbData, dwLen); */
- ListView_SetItemText(hwndLV, index, 2, pszText);
+ ListView_SetItemText(hwndLV, index, 2, _T("(value)"));
break;
}
}