regedit: Remove the listview's sub-class and move its messages to childwnd.c.

Signed-off-by: Hugh McMaster <hugh.mcmaster@outlook.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hugh McMaster 2017-07-12 11:09:49 +00:00 committed by Alexandre Julliard
parent aa42d81e6d
commit 683b9992f6
3 changed files with 143 additions and 131 deletions

View File

@ -354,6 +354,96 @@ static int treeview_notify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
return 0;
}
static int listview_notify(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (((NMHDR *)lParam)->code)
{
case NM_DBLCLK:
{
NMITEMACTIVATE *nmitem = (NMITEMACTIVATE *)lParam;
LVHITTESTINFO info;
info.pt.x = nmitem->ptAction.x;
info.pt.y = nmitem->ptAction.y;
if (SendMessageW(g_pChildWnd->hListWnd, LVM_HITTEST, 0, (LPARAM)&info) != -1)
{
LVITEMW item;
item.state = 0;
item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SendMessageW(g_pChildWnd->hListWnd, LVM_SETITEMSTATE, (UINT)-1, (LPARAM)&item);
item.state = LVIS_FOCUSED | LVIS_SELECTED;
item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SendMessageW(g_pChildWnd->hListWnd, LVM_SETITEMSTATE, info.iItem, (LPARAM)&item);
SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0);
}
break;
}
case NM_RETURN:
{
int cnt = SendMessageW(g_pChildWnd->hListWnd, LVM_GETNEXTITEM, -1,
MAKELPARAM(LVNI_FOCUSED | LVNI_SELECTED, 0));
if (cnt != -1)
SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0);
break;
}
case NM_SETFOCUS:
g_pChildWnd->nFocusPanel = 1;
break;
case LVN_BEGINLABELEDITW:
if (!((NMLVDISPINFOW *)lParam)->item.iItem)
return 1;
return 0;
case LVN_COLUMNCLICK:
if (g_columnToSort == ((NMLISTVIEW *)lParam)->iSubItem)
g_invertSort = !g_invertSort;
else
{
g_columnToSort = ((NMLISTVIEW *)lParam)->iSubItem;
g_invertSort = FALSE;
}
SendMessageW(g_pChildWnd->hListWnd, LVM_SORTITEMS,
(WPARAM)g_pChildWnd->hListWnd, (LPARAM)CompareFunc);
break;
case LVN_DELETEITEM:
{
NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;
LINE_INFO *info = (LINE_INFO *)nmlv->lParam;
HeapFree(GetProcessHeap(), 0, info->name);
HeapFree(GetProcessHeap(), 0, info);
break;
}
case LVN_ENDLABELEDITW:
{
NMLVDISPINFOW *dispInfo = (NMLVDISPINFOW *)lParam;
WCHAR *oldName = GetItemText(g_pChildWnd->hListWnd, dispInfo->item.iItem);
LONG ret;
if (!oldName) return -1; /* cannot rename a default value */
ret = RenameValue(g_pChildWnd->hListWnd, g_currentRootKey, g_currentPath,
oldName, dispInfo->item.pszText);
if (ret)
{
dispInfo->item.iSubItem = 0;
SendMessageW(g_pChildWnd->hListWnd, LVM_SETITEMTEXTW,
dispInfo->item.iItem, (LPARAM)&dispInfo->item);
}
HeapFree(GetProcessHeap(), 0, oldName);
return 0;
}
case LVN_GETDISPINFOW:
OnGetDispInfo((NMLVDISPINFOW *)lParam);
break;
}
return 0;
}
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
@ -433,18 +523,36 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
draw_splitbar(hWnd, last_split);
break;
case WM_CONTEXTMENU: {
case WM_CONTEXTMENU:
{
POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};
TVHITTESTINFO ht;
ht.pt = pt;
ScreenToClient(g_pChildWnd->hTreeWnd, &ht.pt);
if (SendMessageW(g_pChildWnd->hTreeWnd, TVM_HITTEST, 0, (LPARAM)&ht)) {
HTREEITEM root;
SendMessageW(g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)ht.hItem);
root = (HTREEITEM)SendMessageW(g_pChildWnd->hTreeWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0);
TrackPopupMenu(GetSubMenu(hPopupMenus, ht.hItem == root ? PM_COMPUTER : PM_TREEVIEW),
TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL);
short int menu_id = -1;
if ((HWND)wParam == g_pChildWnd->hTreeWnd)
{
TVHITTESTINFO ht;
ht.pt = pt;
ScreenToClient(g_pChildWnd->hTreeWnd, &ht.pt);
if (SendMessageW(g_pChildWnd->hTreeWnd, TVM_HITTEST, 0, (LPARAM)&ht))
{
HTREEITEM root;
SendMessageW(g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)ht.hItem);
root = (HTREEITEM)SendMessageW(g_pChildWnd->hTreeWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0);
menu_id = (ht.hItem == root) ? PM_COMPUTER : PM_TREEVIEW;
}
}
else
{
int sel = SendMessageW(g_pChildWnd->hListWnd, LVM_GETNEXTITEM, -1,
MAKELPARAM(LVNI_SELECTED, 0));
menu_id = (sel == -1) ? PM_NEW_VALUE : PM_MODIFY_VALUE;
}
TrackPopupMenu(GetSubMenu(hPopupMenus, menu_id), TPM_RIGHTBUTTON,
pt.x, pt.y, 0, hFrameWnd, NULL);
break;
}
@ -491,7 +599,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
if (wParam == TREE_WINDOW && g_pChildWnd)
return treeview_notify(hWnd, message, wParam, lParam);
else if (wParam == LIST_WINDOW && g_pChildWnd)
return SendMessageW(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam);
return listview_notify(hWnd, message, wParam, lParam);
break;
case WM_SIZE:

View File

@ -26,30 +26,21 @@
#include <stdio.h>
#include "main.h"
#include "wine/unicode.h"
static INT Image_String;
static INT Image_Binary;
typedef struct tagLINE_INFO
{
DWORD dwValType;
LPWSTR name;
void* val;
size_t val_len;
} LINE_INFO;
/*******************************************************************************
* Global and Local Variables:
*/
static WNDPROC g_orgListWndProc;
static DWORD g_columnToSort = ~0U;
static BOOL g_invertSort = FALSE;
static LPWSTR g_valueName;
static LPWSTR g_currentPath;
static HKEY g_currentRootKey;
static WCHAR g_szValueNotSet[64];
DWORD g_columnToSort = ~0U;
BOOL g_invertSort = FALSE;
WCHAR *g_currentPath;
HKEY g_currentRootKey;
static WCHAR *g_valueName;
static WCHAR g_szValueNotSet[64];
#define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1)
static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 };
@ -256,8 +247,7 @@ static BOOL CreateListColumns(HWND hWndListView)
}
/* OnGetDispInfo - processes the LVN_GETDISPINFO notification message. */
static void OnGetDispInfo(NMLVDISPINFOW* plvdi)
void OnGetDispInfo(NMLVDISPINFOW *plvdi)
{
static WCHAR buffer[200];
static WCHAR reg_szT[] = {'R','E','G','_','S','Z',0},
@ -330,7 +320,7 @@ static void OnGetDispInfo(NMLVDISPINFOW* plvdi)
}
}
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
LINE_INFO*l, *r;
l = (LINE_INFO*)lParam1;
@ -362,104 +352,6 @@ HWND StartValueRename(HWND hwndLV)
return (HWND)SendMessageW(hwndLV, LVM_EDITLABELW, item, 0);
}
static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_NOTIFY_REFLECT:
switch (((LPNMHDR)lParam)->code) {
case LVN_BEGINLABELEDITW:
if (!((NMLVDISPINFOW *)lParam)->item.iItem)
return 1;
return 0;
case LVN_GETDISPINFOW:
OnGetDispInfo((NMLVDISPINFOW*)lParam);
break;
case LVN_COLUMNCLICK:
if (g_columnToSort == ((LPNMLISTVIEW)lParam)->iSubItem)
g_invertSort = !g_invertSort;
else {
g_columnToSort = ((LPNMLISTVIEW)lParam)->iSubItem;
g_invertSort = FALSE;
}
SendMessageW(hWnd, LVM_SORTITEMS, (WPARAM)hWnd, (LPARAM)CompareFunc);
break;
case LVN_ENDLABELEDITW: {
LPNMLVDISPINFOW dispInfo = (LPNMLVDISPINFOW)lParam;
LPWSTR oldName = GetItemText(hWnd, dispInfo->item.iItem);
LONG ret;
if (!oldName) return -1; /* cannot rename a default value */
ret = RenameValue(hWnd, g_currentRootKey, g_currentPath, oldName, dispInfo->item.pszText);
if (ret)
{
dispInfo->item.iSubItem = 0;
SendMessageW(hWnd, LVM_SETITEMTEXTW, dispInfo->item.iItem, (LPARAM)&dispInfo->item);
}
HeapFree(GetProcessHeap(), 0, oldName);
return 0;
}
case LVN_DELETEITEM: {
NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;
LINE_INFO *info = (LINE_INFO *)nmlv->lParam;
HeapFree(GetProcessHeap(), 0, info->name);
HeapFree(GetProcessHeap(), 0, info);
}
break;
case NM_RETURN: {
int cnt = SendMessageW(hWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_FOCUSED | LVNI_SELECTED, 0));
if (cnt != -1)
SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0);
}
break;
case NM_SETFOCUS:
g_pChildWnd->nFocusPanel = 1;
break;
case NM_DBLCLK: {
NMITEMACTIVATE* nmitem = (LPNMITEMACTIVATE)lParam;
LVHITTESTINFO info;
/* if (nmitem->hdr.hwndFrom != hWnd) break; unnecessary because of WM_NOTIFY_REFLECT */
/* if (nmitem->hdr.idFrom != IDW_LISTVIEW) break; */
/* if (nmitem->hdr.code != ???) break; */
info.pt.x = nmitem->ptAction.x;
info.pt.y = nmitem->ptAction.y;
if (SendMessageW(hWnd, LVM_HITTEST, 0, (LPARAM)&info) != -1) {
LVITEMW item;
item.state = 0;
item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SendMessageW(hWnd, LVM_SETITEMSTATE, (UINT)-1, (LPARAM)&item);
item.state = LVIS_FOCUSED | LVIS_SELECTED;
item.stateMask = LVIS_FOCUSED | LVIS_SELECTED;
SendMessageW(hWnd, LVM_SETITEMSTATE, info.iItem, (LPARAM)&item);
SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0);
}
}
break;
default:
return 0; /* shouldn't call default ! */
}
break;
case WM_CONTEXTMENU: {
int cnt = SendMessageW(hWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_SELECTED, 0));
TrackPopupMenu(GetSubMenu(hPopupMenus, cnt == -1 ? PM_NEW_VALUE : PM_MODIFY_VALUE),
TPM_RIGHTBUTTON, (short)LOWORD(lParam), (short)HIWORD(lParam),
0, hFrameWnd, NULL);
break;
}
default:
return CallWindowProcW(g_orgListWndProc, hWnd, message, wParam, lParam);
}
return 0;
}
HWND CreateListView(HWND hwndParent, UINT id)
{
RECT rcClient;
@ -482,7 +374,6 @@ HWND CreateListView(HWND hwndParent, UINT id)
/* Initialize the image list */
if (!InitListViewImageList(hwndLV)) goto fail;
if (!CreateListColumns(hwndLV)) goto fail;
g_orgListWndProc = (WNDPROC) SetWindowLongPtrW(hwndLV, GWLP_WNDPROC, (LPARAM)ListWndProc);
return hwndLV;
fail:
DestroyWindow(hwndLV);

View File

@ -34,8 +34,6 @@
#define MAX_NEW_KEY_LEN 128
#define WM_NOTIFY_REFLECT (WM_USER+1024)
/* Pop-Up Menus */
#define PM_COMPUTER 0
#define PM_TREEVIEW 1
@ -76,6 +74,14 @@ typedef struct {
} ChildWnd;
extern ChildWnd* g_pChildWnd;
typedef struct tagLINE_INFO
{
WCHAR *name;
DWORD dwValType;
void *val;
size_t val_len;
} LINE_INFO;
/*******************************************************************************
* Global Variables:
*/
@ -93,6 +99,11 @@ extern const WCHAR szChildClass[];
extern const WCHAR szHexEditClass[];
extern WCHAR g_pszDefaultValueName[];
extern DWORD g_columnToSort;
extern BOOL g_invertSort;
extern WCHAR *g_currentPath;
extern HKEY g_currentRootKey;
/* Registry class names and their indexes */
extern const WCHAR* reg_class_namesW[];
#define INDEX_HKEY_LOCAL_MACHINE 0
@ -120,7 +131,9 @@ extern void UpdateStatusBar(void);
extern BOOL update_listview_path(const WCHAR *path);
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, int pos);
extern void OnGetDispInfo(NMLVDISPINFOW *plvdi);
extern HWND CreateListView(HWND hwndParent, UINT id);
extern int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue);
extern HWND StartValueRename(HWND hwndLV);
extern LPWSTR GetItemText(HWND hwndLV, UINT item);