diff --git a/reactos/subsys/system/regedit/edit.c b/reactos/subsys/system/regedit/edit.c index 6b17e3aeb3d..5c0107e8014 100644 --- a/reactos/subsys/system/regedit/edit.c +++ b/reactos/subsys/system/regedit/edit.c @@ -67,7 +67,14 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L switch(uMsg) { case WM_INITDIALOG: - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); + 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); return TRUE; case WM_COMMAND: @@ -75,16 +82,33 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L case IDOK: if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) { if ((len = GetWindowTextLength(hwndValue))) { - if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) { - stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) - *stringValueData = 0; + 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; + } } - /* Fall through */ + EndDialog(hwndDlg, IDOK); + break; case IDCANCEL: - EndDialog(hwndDlg, wParam); + EndDialog(hwndDlg, IDCANCEL); return TRUE; } } @@ -103,23 +127,41 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) editValueName = valueName; lRet = RegQueryValueEx(hKey, valueName, 0, &type, 0, &valueDataLen); + if(lRet != ERROR_SUCCESS && (!strcmp(valueName, _T("")) || valueName == NULL)) + { + lRet = ERROR_SUCCESS; /* Allow editing of (Default) values which don't exist */ + type = REG_SZ; + valueDataLen = 0; + stringValueData = NULL; + } + if (lRet != ERROR_SUCCESS) { error(hwnd, IDS_BAD_VALUE, valueName); goto done; } if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - if (!(stringValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen))) { - error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); - goto done; + if(valueDataLen > 0) + { + 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; + } } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, stringValueData, &valueDataLen); - if (lRet != ERROR_SUCCESS) { - error(hwnd, IDS_BAD_VALUE, valueName); - goto done; + else + { + stringValueData = NULL; } if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK) { - lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1); + if(stringValueData) + lRet = RegSetValueEx(hKey, valueName, 0, type, stringValueData, lstrlen(stringValueData) + 1); + else + lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0); if (lRet == ERROR_SUCCESS) result = TRUE; } } else if ( type == REG_DWORD ) { @@ -129,7 +171,8 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) } done: - HeapFree(GetProcessHeap(), 0, stringValueData); + if(stringValueData) + HeapFree(GetProcessHeap(), 0, stringValueData); stringValueData = NULL; return result; diff --git a/reactos/subsys/system/regedit/listview.c b/reactos/subsys/system/regedit/listview.c index e7d30457c52..8a50f7dcf3a 100644 --- a/reactos/subsys/system/regedit/listview.c +++ b/reactos/subsys/system/regedit/listview.c @@ -41,7 +41,7 @@ typedef struct tagLINE_INFO LPTSTR name; void* val; size_t val_len; -} LINE_INFO; +} LINE_INFO, *PLINE_INFO; /******************************************************************************* * Global and Local Variables: @@ -60,6 +60,8 @@ LPCTSTR GetValueName(HWND hwndLV) { int item, len, maxLen; LPTSTR newStr; + LVITEM LVItem; + PLINE_INFO lineinfo; if (!g_valueName) g_valueName = HeapAlloc(GetProcessHeap(), 0, 1024); if (!g_valueName) return NULL; @@ -70,13 +72,21 @@ LPCTSTR GetValueName(HWND hwndLV) item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED); if (item == -1) return NULL; do { - ListView_GetItemText(hwndLV, item, 0, g_valueName, maxLen); - len = _tcslen(g_valueName); - if (len < maxLen - 1) break; - newStr = HeapReAlloc(GetProcessHeap(), 0, g_valueName, maxLen * 2); - if (!newStr) return NULL; - g_valueName = newStr; - maxLen *= 2; + LVItem.mask = LVIF_PARAM; + LVItem.iItem = item; + if(ListView_GetItem(hwndLV, &LVItem)) + { + lineinfo = (PLINE_INFO)LVItem.lParam; + g_valueName = lineinfo->name; + len = _tcslen(g_valueName); + if (len < maxLen - 1) break; + newStr = HeapReAlloc(GetProcessHeap(), 0, g_valueName, maxLen * 2); + if (!newStr) return NULL; + g_valueName = newStr; + maxLen *= 2; + } + else + break; } while (TRUE); return g_valueName; @@ -327,33 +337,9 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR ListView_SortItems(hWnd, CompareFunc, (WPARAM)hWnd); break; - case NM_DBLCLK: { - NMITEMACTIVATE* nmitem = (LPNMITEMACTIVATE)lParam; - LVHITTESTINFO info; - - if (nmitem->hdr.hwndFrom != hWnd) break; - /* if (nmitem->hdr.idFrom != IDW_LISTVIEW) break; */ - /* if (nmitem->hdr.code != ???) break; */ -#ifdef _MSC_VER - switch (nmitem->uKeyFlags) { - case LVKF_ALT: /* The ALT key is pressed. */ - /* properties dialog box ? */ - break; - case LVKF_CONTROL: /* The CTRL key is pressed. */ - /* run dialog box for providing parameters... */ - break; - case LVKF_SHIFT: /* The SHIFT key is pressed. */ - break; - } -#endif - info.pt.x = nmitem->ptAction.x; - info.pt.y = nmitem->ptAction.y; - if (ListView_HitTest(hWnd, &info) != -1) { - LVITEM item; - item.mask = LVIF_PARAM; - item.iItem = info.iItem; - if (ListView_GetItem(hWnd, &item)) {} - } + case NM_DBLCLK: + { + SendMessage(hFrameWnd, WM_COMMAND, MAKEWPARAM(ID_EDIT_MODIFY, 0), 0); } break;