[PATCH 5/7] regedit: Update the data in a listview subitem without refreshing the listview
Hugh McMaster
hugh.mcmaster at outlook.com
Mon May 29 03:20:44 CDT 2017
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/regedit/edit.c | 9 +++++
programs/regedit/framewnd.c | 3 +-
programs/regedit/listview.c | 98 +++++++++++++++++++++++----------------------
programs/regedit/main.h | 1 +
4 files changed, 61 insertions(+), 50 deletions(-)
diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c
index 97a283f..fcf2a60 100644
--- a/programs/regedit/edit.c
+++ b/programs/regedit/edit.c
@@ -373,6 +373,15 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName)
error_code_messagebox(hwnd, IDS_UNSUPPORTED_TYPE, type);
}
+ /* Update the listview item with the new data string */
+ if (result)
+ {
+ int index = SendMessageW(g_pChildWnd->hListWnd, LVM_GETNEXTITEM, -1,
+ MAKELPARAM(LVNI_FOCUSED | LVNI_SELECTED, 0));
+ stringValueData = read_value(hwnd, hKey, valueName, &type, &len);
+ format_value_data(g_pChildWnd->hListWnd, index, type, stringValueData, len);
+ }
+
done:
HeapFree(GetProcessHeap(), 0, stringValueData);
stringValueData = NULL;
diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c
index 93a5e4f..0978cbc 100644
--- a/programs/regedit/framewnd.c
+++ b/programs/regedit/framewnd.c
@@ -778,8 +778,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LPCWSTR valueName = GetValueName(g_pChildWnd->hListWnd);
WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
- if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
- RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
+ ModifyValue(hWnd, hKeyRoot, keyPath, valueName);
HeapFree(GetProcessHeap(), 0, keyPath);
break;
}
diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c
index 123949f..caa9a23 100644
--- a/programs/regedit/listview.c
+++ b/programs/regedit/listview.c
@@ -109,6 +109,54 @@ static void MakeMULTISZDisplayable(LPWSTR multi)
/*******************************************************************************
* Local module support methods
*/
+void format_value_data(HWND hwndLV, int index, DWORD type, void *data, DWORD size)
+{
+ switch (type)
+ {
+ case REG_SZ:
+ case REG_EXPAND_SZ:
+ ListView_SetItemTextW(hwndLV, index, 2, data ? data : g_szValueNotSet);
+ break;
+ case REG_DWORD:
+ case REG_DWORD_BIG_ENDIAN:
+ {
+ DWORD value = *(DWORD *)data;
+ WCHAR buf[64];
+ WCHAR format[] = {'0','x','%','0','8','x',' ','(','%','u',')',0};
+ if (type == REG_DWORD_BIG_ENDIAN)
+ value = RtlUlongByteSwap(value);
+ wsprintfW(buf, format, value, value);
+ ListView_SetItemTextW(hwndLV, index, 2, buf);
+ break;
+ }
+ case REG_BINARY:
+ case REG_NONE:
+ {
+ unsigned int i;
+ BYTE *pData = data;
+ WCHAR *strBinary = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR) * 3 + sizeof(WCHAR));
+ WCHAR format[] = {'%','0','2','X',' ',0};
+ for (i = 0; i < size; i++)
+ wsprintfW( strBinary + i*3, format, pData[i] );
+ strBinary[size * 3] = 0;
+ ListView_SetItemTextW(hwndLV, index, 2, strBinary);
+ HeapFree(GetProcessHeap(), 0, strBinary);
+ break;
+ }
+ case REG_MULTI_SZ:
+ MakeMULTISZDisplayable(data);
+ ListView_SetItemTextW(hwndLV, index, 2, data);
+ break;
+ default:
+ {
+ WCHAR szText[128];
+ LoadStringW(hInst, IDS_REGISTRY_VALUE_CANT_DISPLAY, szText, COUNT_OF(szText));
+ ListView_SetItemTextW(hwndLV, index, 2, szText);
+ break;
+ }
+ }
+}
+
int AddEntryToList(HWND hwndLV, WCHAR *Name, DWORD dwValType, void *ValBuf, DWORD dwCount)
{
LINE_INFO* linfo;
@@ -154,54 +202,8 @@ int AddEntryToList(HWND hwndLV, WCHAR *Name, DWORD dwValType, void *ValBuf, DWOR
item.iIndent = 0;
#endif
- index = ListView_InsertItemW(hwndLV, &item);
- if (index != -1) {
- switch (dwValType) {
- case REG_SZ:
- case REG_EXPAND_SZ:
- if (ValBuf) {
- ListView_SetItemTextW(hwndLV, index, 2, ValBuf);
- } else {
- ListView_SetItemTextW(hwndLV, index, 2, g_szValueNotSet);
- }
- break;
- case REG_DWORD:
- case REG_DWORD_BIG_ENDIAN: {
- DWORD value = *(DWORD*)ValBuf;
- WCHAR buf[64];
- WCHAR format[] = {'0','x','%','0','8','x',' ','(','%','u',')',0};
- if (dwValType == REG_DWORD_BIG_ENDIAN)
- value = RtlUlongByteSwap(value);
- wsprintfW(buf, format, value, value);
- ListView_SetItemTextW(hwndLV, index, 2, buf);
- }
- break;
- case REG_BINARY:
- case REG_NONE: {
- unsigned int i;
- LPBYTE pData = ValBuf;
- LPWSTR strBinary = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(WCHAR) * 3 + sizeof(WCHAR));
- WCHAR format[] = {'%','0','2','X',' ',0};
- for (i = 0; i < dwCount; i++)
- wsprintfW( strBinary + i*3, format, pData[i] );
- strBinary[dwCount * 3] = 0;
- ListView_SetItemTextW(hwndLV, index, 2, strBinary);
- HeapFree(GetProcessHeap(), 0, strBinary);
- }
- break;
- case REG_MULTI_SZ:
- MakeMULTISZDisplayable(ValBuf);
- ListView_SetItemTextW(hwndLV, index, 2, ValBuf);
- break;
- default:
- {
- WCHAR szText[128];
- LoadStringW(hInst, IDS_REGISTRY_VALUE_CANT_DISPLAY, szText, COUNT_OF(szText));
- ListView_SetItemTextW(hwndLV, index, 2, szText);
- break;
- }
- }
- }
+ if ((index = ListView_InsertItemW(hwndLV, &item)) != -1)
+ format_value_data(hwndLV, index, dwValType, ValBuf, dwCount);
return index;
}
diff --git a/programs/regedit/main.h b/programs/regedit/main.h
index b4b0307..f09de34 100644
--- a/programs/regedit/main.h
+++ b/programs/regedit/main.h
@@ -117,6 +117,7 @@ extern void SetupStatusBar(HWND hWnd, BOOL bResize);
extern void UpdateStatusBar(void);
/* listview.c */
+extern void format_value_data(HWND hwndLV, int index, DWORD type, void *data, DWORD size);
extern int AddEntryToList(HWND hwndLV, WCHAR *Name, DWORD dwValType, void *ValBuf, DWORD dwCount);
extern HWND CreateListView(HWND hwndParent, UINT id);
extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue);
--
2.7.4
More information about the wine-patches
mailing list