[PATCH 8/8] regedit: Remove the listview's sub-class and move its messages to childwnd.c
Hugh McMaster
hugh.mcmaster at outlook.com
Wed Jul 12 06:09:49 CDT 2017
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/regedit/childwnd.c | 130 ++++++++++++++++++++++++++++++++++++++++----
programs/regedit/listview.c | 127 +++----------------------------------------
programs/regedit/main.h | 17 +++++-
3 files changed, 143 insertions(+), 131 deletions(-)
diff --git a/programs/regedit/childwnd.c b/programs/regedit/childwnd.c
index 0a89647a3e..2a9a14b04f 100644
--- a/programs/regedit/childwnd.c
+++ b/programs/regedit/childwnd.c
@@ -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:
diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c
index aaec88fa95..72ab464646 100644
--- a/programs/regedit/listview.c
+++ b/programs/regedit/listview.c
@@ -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);
diff --git a/programs/regedit/main.h b/programs/regedit/main.h
index f3fbf86de4..8e05888883 100644
--- a/programs/regedit/main.h
+++ b/programs/regedit/main.h
@@ -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);
--
2.11.0
More information about the wine-patches
mailing list