regedit: Use Unicode strings when updating listview.
This commit is contained in:
parent
f7ff9e76f9
commit
4aabdecd67
|
@ -233,10 +233,11 @@ static LPTSTR GetPathFullPath(HWND hwndTV, LPTSTR path) {
|
||||||
static void OnTreeSelectionChanged(HWND hwndTV, HWND hwndLV, HTREEITEM hItem, BOOL bRefreshLV)
|
static void OnTreeSelectionChanged(HWND hwndTV, HWND hwndLV, HTREEITEM hItem, BOOL bRefreshLV)
|
||||||
{
|
{
|
||||||
if (bRefreshLV) {
|
if (bRefreshLV) {
|
||||||
LPCTSTR keyPath;
|
LPWSTR keyPath;
|
||||||
HKEY hRootKey = NULL;
|
HKEY hRootKey = NULL;
|
||||||
keyPath = GetItemPath(hwndTV, hItem, &hRootKey);
|
keyPath = GetItemPathW(hwndTV, hItem, &hRootKey);
|
||||||
RefreshListView(hwndLV, hRootKey, keyPath, NULL);
|
RefreshListView(hwndLV, hRootKey, keyPath, NULL);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyPath);
|
||||||
}
|
}
|
||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
}
|
}
|
||||||
|
|
|
@ -691,10 +691,10 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
}
|
}
|
||||||
HeapFree(GetProcessHeap(), 0, keyPathW);
|
HeapFree(GetProcessHeap(), 0, keyPathW);
|
||||||
} else if (GetFocus() == g_pChildWnd->hListWnd) {
|
} else if (GetFocus() == g_pChildWnd->hListWnd) {
|
||||||
|
WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
|
||||||
curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED);
|
curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED);
|
||||||
while(curIndex != -1) {
|
while(curIndex != -1) {
|
||||||
WCHAR* valueNameW;
|
WCHAR* valueNameW;
|
||||||
WCHAR* keyPathW;
|
|
||||||
|
|
||||||
valueName = GetItemText(g_pChildWnd->hListWnd, curIndex);
|
valueName = GetItemText(g_pChildWnd->hListWnd, curIndex);
|
||||||
curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED);
|
curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED);
|
||||||
|
@ -705,25 +705,29 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
valueNameW = GetWideString(valueName);
|
valueNameW = GetWideString(valueName);
|
||||||
keyPathW = GetWideString(keyPath);
|
|
||||||
if (!DeleteValue(hWnd, hKeyRoot, keyPathW, valueNameW, curIndex==-1 && firstItem))
|
if (!DeleteValue(hWnd, hKeyRoot, keyPathW, valueNameW, curIndex==-1 && firstItem))
|
||||||
{
|
{
|
||||||
HeapFree(GetProcessHeap(), 0, valueNameW);
|
HeapFree(GetProcessHeap(), 0, valueNameW);
|
||||||
HeapFree(GetProcessHeap(), 0, keyPathW);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
firstItem = FALSE;
|
firstItem = FALSE;
|
||||||
HeapFree(GetProcessHeap(), 0, valueNameW);
|
HeapFree(GetProcessHeap(), 0, valueNameW);
|
||||||
HeapFree(GetProcessHeap(), 0, keyPathW);
|
|
||||||
}
|
}
|
||||||
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
|
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, NULL);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyPathW);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ID_EDIT_MODIFY:
|
case ID_EDIT_MODIFY:
|
||||||
valueName = GetValueName(g_pChildWnd->hListWnd);
|
{
|
||||||
if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName))
|
LPCWSTR valueNameW = GetValueName(g_pChildWnd->hListWnd);
|
||||||
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName);
|
CHAR* valueNameA = GetMultiByteString(valueNameW);
|
||||||
|
WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
|
||||||
|
if (ModifyValue(hWnd, hKeyRoot, keyPath, valueNameA))
|
||||||
|
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, valueNameW);
|
||||||
|
HeapFree(GetProcessHeap(), 0, valueNameA);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyPathW);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ID_EDIT_FIND:
|
case ID_EDIT_FIND:
|
||||||
case ID_EDIT_FINDNEXT:
|
case ID_EDIT_FINDNEXT:
|
||||||
{
|
{
|
||||||
|
@ -792,7 +796,11 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
/* fall through */
|
/* fall through */
|
||||||
create_value:
|
create_value:
|
||||||
if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
|
if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) {
|
||||||
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey);
|
WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
|
||||||
|
WCHAR* newKeyW = GetWideString(newKey);
|
||||||
|
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, newKeyW);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyPathW);
|
||||||
|
HeapFree(GetProcessHeap(), 0, newKeyW);
|
||||||
StartValueRename(g_pChildWnd->hListWnd);
|
StartValueRename(g_pChildWnd->hListWnd);
|
||||||
/* FIXME: start rename */
|
/* FIXME: start rename */
|
||||||
}
|
}
|
||||||
|
@ -847,8 +855,12 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ID_VIEW_REFRESH:
|
case ID_VIEW_REFRESH:
|
||||||
|
{
|
||||||
|
WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
|
||||||
RefreshTreeView(g_pChildWnd->hTreeWnd);
|
RefreshTreeView(g_pChildWnd->hTreeWnd);
|
||||||
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL);
|
RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, NULL);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyPathW);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
/*case ID_OPTIONS_TOOLBAR:*/
|
/*case ID_OPTIONS_TOOLBAR:*/
|
||||||
/* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
|
/* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
|
||||||
|
|
|
@ -46,8 +46,8 @@ typedef struct tagLINE_INFO
|
||||||
static WNDPROC g_orgListWndProc;
|
static WNDPROC g_orgListWndProc;
|
||||||
static DWORD g_columnToSort = ~0U;
|
static DWORD g_columnToSort = ~0U;
|
||||||
static BOOL g_invertSort = FALSE;
|
static BOOL g_invertSort = FALSE;
|
||||||
static LPTSTR g_valueName;
|
static LPWSTR g_valueName;
|
||||||
static LPTSTR g_currentPath;
|
static LPWSTR g_currentPath;
|
||||||
static HKEY g_currentRootKey;
|
static HKEY g_currentRootKey;
|
||||||
static WCHAR g_szValueNotSetW[64];
|
static WCHAR g_szValueNotSetW[64];
|
||||||
static TCHAR g_szValueNotSet[64];
|
static TCHAR g_szValueNotSet[64];
|
||||||
|
@ -79,18 +79,41 @@ LPTSTR GetItemText(HWND hwndLV, UINT item)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
LPCTSTR GetValueName(HWND hwndLV)
|
LPWSTR GetItemTextW(HWND hwndLV, UINT item)
|
||||||
|
{
|
||||||
|
LPWSTR newStr, curStr;
|
||||||
|
unsigned int maxLen = 128;
|
||||||
|
|
||||||
|
curStr = HeapAlloc(GetProcessHeap(), 0, maxLen * sizeof(WCHAR));
|
||||||
|
if (!curStr) return NULL;
|
||||||
|
if (item == 0) { /* first item is ALWAYS a default */
|
||||||
|
HeapFree(GetProcessHeap(), 0, curStr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
ListView_GetItemTextW(hwndLV, item, 0, curStr, maxLen * sizeof(WCHAR));
|
||||||
|
if (lstrlenW(curStr) < maxLen - 1) return curStr;
|
||||||
|
newStr = HeapReAlloc(GetProcessHeap(), 0, curStr, maxLen * 2 * sizeof(WCHAR));
|
||||||
|
if (!newStr) break;
|
||||||
|
curStr = newStr;
|
||||||
|
maxLen *= 2;
|
||||||
|
} while (TRUE);
|
||||||
|
HeapFree(GetProcessHeap(), 0, curStr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPCWSTR GetValueName(HWND hwndLV)
|
||||||
{
|
{
|
||||||
INT item;
|
INT item;
|
||||||
|
|
||||||
if (g_valueName != LPSTR_TEXTCALLBACK)
|
if (g_valueName != LPSTR_TEXTCALLBACKW)
|
||||||
HeapFree(GetProcessHeap(), 0, g_valueName);
|
HeapFree(GetProcessHeap(), 0, g_valueName);
|
||||||
g_valueName = NULL;
|
g_valueName = NULL;
|
||||||
|
|
||||||
item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED);
|
item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED);
|
||||||
if (item == -1) return NULL;
|
if (item == -1) return NULL;
|
||||||
|
|
||||||
g_valueName = GetItemText(hwndLV, item);
|
g_valueName = GetItemTextW(hwndLV, item);
|
||||||
|
|
||||||
return g_valueName;
|
return g_valueName;
|
||||||
}
|
}
|
||||||
|
@ -400,11 +423,18 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR
|
||||||
case LVN_ENDLABELEDIT: {
|
case LVN_ENDLABELEDIT: {
|
||||||
LPNMLVDISPINFO dispInfo = (LPNMLVDISPINFO)lParam;
|
LPNMLVDISPINFO dispInfo = (LPNMLVDISPINFO)lParam;
|
||||||
LPTSTR valueName = GetItemText(hWnd, dispInfo->item.iItem);
|
LPTSTR valueName = GetItemText(hWnd, dispInfo->item.iItem);
|
||||||
|
LPSTR pathA;
|
||||||
LONG ret;
|
LONG ret;
|
||||||
if (!valueName) return -1; /* cannot rename a default value */
|
if (!valueName) return -1; /* cannot rename a default value */
|
||||||
ret = RenameValue(hWnd, g_currentRootKey, g_currentPath, valueName, dispInfo->item.pszText);
|
pathA = GetMultiByteString(g_currentPath);
|
||||||
|
ret = RenameValue(hWnd, g_currentRootKey, pathA, valueName, dispInfo->item.pszText);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pathA);
|
||||||
if (ret)
|
if (ret)
|
||||||
RefreshListView(hWnd, g_currentRootKey, g_currentPath, dispInfo->item.pszText);
|
{
|
||||||
|
WCHAR* itemTextW = GetWideString(dispInfo->item.pszText);
|
||||||
|
RefreshListView(hWnd, g_currentRootKey, g_currentPath, itemTextW);
|
||||||
|
HeapFree(GetProcessHeap(), 0, itemTextW);
|
||||||
|
}
|
||||||
HeapFree(GetProcessHeap(), 0, valueName);
|
HeapFree(GetProcessHeap(), 0, valueName);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -490,7 +520,7 @@ fail:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highlightValue)
|
BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue)
|
||||||
{
|
{
|
||||||
BOOL result = FALSE;
|
BOOL result = FALSE;
|
||||||
DWORD max_sub_key_len;
|
DWORD max_sub_key_len;
|
||||||
|
@ -503,17 +533,12 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli
|
||||||
LONG errCode;
|
LONG errCode;
|
||||||
INT count, i;
|
INT count, i;
|
||||||
LVITEMW item;
|
LVITEMW item;
|
||||||
WCHAR* keyPathW;
|
|
||||||
WCHAR* highlightValueW;
|
|
||||||
|
|
||||||
if (!hwndLV) return FALSE;
|
if (!hwndLV) return FALSE;
|
||||||
|
|
||||||
SendMessageW(hwndLV, WM_SETREDRAW, FALSE, 0);
|
SendMessageW(hwndLV, WM_SETREDRAW, FALSE, 0);
|
||||||
|
|
||||||
keyPathW = GetWideString(keyPath);
|
errCode = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ, &hKey);
|
||||||
highlightValueW = GetWideString(highlightValue);
|
|
||||||
|
|
||||||
errCode = RegOpenKeyExW(hKeyRoot, keyPathW, 0, KEY_READ, &hKey);
|
|
||||||
if (errCode != ERROR_SUCCESS) goto done;
|
if (errCode != ERROR_SUCCESS) goto done;
|
||||||
|
|
||||||
count = ListView_GetItemCount(hwndLV);
|
count = ListView_GetItemCount(hwndLV);
|
||||||
|
@ -542,14 +567,14 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli
|
||||||
AddEntryToList(hwndLV, NULL, REG_SZ, NULL, 0, !highlightValue);
|
AddEntryToList(hwndLV, NULL, REG_SZ, NULL, 0, !highlightValue);
|
||||||
}
|
}
|
||||||
for(index = 0; index < val_count; index++) {
|
for(index = 0; index < val_count; index++) {
|
||||||
BOOL bSelected = (valName == highlightValueW); /* NOT a bug, we check for double NULL here */
|
BOOL bSelected = (valName == highlightValue); /* NOT a bug, we check for double NULL here */
|
||||||
valNameLen = max_val_name_len;
|
valNameLen = max_val_name_len;
|
||||||
valSize = max_val_size;
|
valSize = max_val_size;
|
||||||
valType = 0;
|
valType = 0;
|
||||||
errCode = RegEnumValueW(hKey, index, valName, &valNameLen, NULL, &valType, valBuf, &valSize);
|
errCode = RegEnumValueW(hKey, index, valName, &valNameLen, NULL, &valType, valBuf, &valSize);
|
||||||
if (errCode != ERROR_SUCCESS) goto done;
|
if (errCode != ERROR_SUCCESS) goto done;
|
||||||
valBuf[valSize] = 0;
|
valBuf[valSize] = 0;
|
||||||
if (valName && highlightValueW && !lstrcmpW(valName, highlightValueW))
|
if (valName && highlightValue && !lstrcmpW(valName, highlightValue))
|
||||||
bSelected = TRUE;
|
bSelected = TRUE;
|
||||||
AddEntryToList(hwndLV, valName[0] ? valName : NULL, valType, valBuf, valSize, bSelected);
|
AddEntryToList(hwndLV, valName[0] ? valName : NULL, valType, valBuf, valSize, bSelected);
|
||||||
}
|
}
|
||||||
|
@ -558,9 +583,9 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli
|
||||||
g_currentRootKey = hKeyRoot;
|
g_currentRootKey = hKeyRoot;
|
||||||
if (keyPath != g_currentPath) {
|
if (keyPath != g_currentPath) {
|
||||||
HeapFree(GetProcessHeap(), 0, g_currentPath);
|
HeapFree(GetProcessHeap(), 0, g_currentPath);
|
||||||
g_currentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlen(keyPath) + 1) * sizeof(TCHAR));
|
g_currentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(keyPath) + 1) * sizeof(WCHAR));
|
||||||
if (!g_currentPath) goto done;
|
if (!g_currentPath) goto done;
|
||||||
lstrcpy(g_currentPath, keyPath);
|
lstrcpyW(g_currentPath, keyPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
|
@ -568,8 +593,6 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highli
|
||||||
done:
|
done:
|
||||||
HeapFree(GetProcessHeap(), 0, valBuf);
|
HeapFree(GetProcessHeap(), 0, valBuf);
|
||||||
HeapFree(GetProcessHeap(), 0, valName);
|
HeapFree(GetProcessHeap(), 0, valName);
|
||||||
HeapFree(GetProcessHeap(), 0, keyPathW);
|
|
||||||
HeapFree(GetProcessHeap(), 0, highlightValueW);
|
|
||||||
SendMessageW(hwndLV, WM_SETREDRAW, TRUE, 0);
|
SendMessageW(hwndLV, WM_SETREDRAW, TRUE, 0);
|
||||||
if (hKey) RegCloseKey(hKey);
|
if (hKey) RegCloseKey(hKey);
|
||||||
|
|
||||||
|
|
|
@ -120,10 +120,10 @@ extern void UpdateStatusBar(void);
|
||||||
|
|
||||||
/* listview.c */
|
/* listview.c */
|
||||||
extern HWND CreateListView(HWND hwndParent, UINT id);
|
extern HWND CreateListView(HWND hwndParent, UINT id);
|
||||||
extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR highlightValue);
|
extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue);
|
||||||
extern HWND StartValueRename(HWND hwndLV);
|
extern HWND StartValueRename(HWND hwndLV);
|
||||||
extern LPTSTR GetItemText(HWND hwndLV, UINT item);
|
extern LPTSTR GetItemText(HWND hwndLV, UINT item);
|
||||||
extern LPCTSTR GetValueName(HWND hwndLV);
|
extern LPCWSTR GetValueName(HWND hwndLV);
|
||||||
extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result);
|
extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result);
|
||||||
extern BOOL IsDefaultValue(HWND hwndLV, int i);
|
extern BOOL IsDefaultValue(HWND hwndLV, int i);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue