From 720e0c05747b80f416e358cf0de073c8dc665bc1 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 00:24:28 +0100 Subject: [PATCH 1/6] + workaround: drag n' drop from 32-bit process on Notepad3 x64 window --- src/Helpers.c | 342 ++++++++++++++++++++++++++++++++++++++++++++++++ src/Helpers.h | 19 +++ src/Notepad3.c | 76 +++++++++-- src/Notepad3.rc | Bin 183202 -> 183504 bytes src/resource.h | 1 + 5 files changed, 428 insertions(+), 10 deletions(-) diff --git a/src/Helpers.c b/src/Helpers.c index 925a3fc74..82145b624 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -3580,5 +3580,347 @@ INT UTF8_mbslen(LPCSTR source,INT byte_length) return wchar_length; } +/////////////////////////////////////////////////////////////////////////////// +// +// Drag N Drop helpers +// +/////////////////////////////////////////////////////////////////////////////// + +static HANDLE g_hHeap = NULL; + +#define NP3DD_HEAP (g_hHeap == NULL ? (g_hHeap = GetProcessHeap()) : g_hHeap) + +typedef struct tIDROPTARGET { + IDropTarget idt; + LONG lRefCount; + ULONG lNumFormats; + CLIPFORMAT *pFormat; + HWND hWnd; + BOOL bAllowDrop; + DWORD dwKeyState; + IDataObject *pDataObject; + UINT nMsg; + void *pUserData; + NP3DDCALLBACK pDropProc; +} +NP3IDROPTARGET, *PNP3IDROPTARGET; + + +typedef struct IDRPTRG_VTBL +{ + BEGIN_INTERFACE + HRESULT(STDMETHODCALLTYPE *QueryInterface)(PNP3IDROPTARGET pThis, REFIID riid, void **ppvObject); + ULONG(STDMETHODCALLTYPE *AddRef)(PNP3IDROPTARGET pThis); + ULONG(STDMETHODCALLTYPE *Release)(PNP3IDROPTARGET pThis); + HRESULT(STDMETHODCALLTYPE *DragEnter)(PNP3IDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT(STDMETHODCALLTYPE *DragOver)(PNP3IDROPTARGET pThis, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT(STDMETHODCALLTYPE *DragLeave)(PNP3IDROPTARGET pThis); + HRESULT(STDMETHODCALLTYPE *Drop)(PNP3IDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + END_INTERFACE +} +IDRPTRG_VTBL, *PIDRPTRG_VTBL; + + +//============================================================================= +// +// NP3DragnDropInit() +// +void Np3DragnDropInit(HANDLE hHeap) +{ + if (g_hHeap == NULL && hHeap == NULL) + g_hHeap = GetProcessHeap(); + else if (g_hHeap == NULL) + g_hHeap = hHeap; + + OleInitialize(NULL); // just in case + return; +} + + +//============================================================================= +// +// IDRPTRG_AddRef() +// +static ULONG STDMETHODCALLTYPE IDRPTRG_AddRef(PNP3IDROPTARGET pThis) +{ + return InterlockedIncrement(&pThis->lRefCount); +} + + +//============================================================================= +// +// IDRPTRG_QueryDataObject() +// +static BOOL IDRPTRG_QueryDataObject(PNP3IDROPTARGET pDropTarget, IDataObject *pDataObject) +{ + ULONG lFmt; + FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + + for (lFmt = 0; lFmt < pDropTarget->lNumFormats; lFmt++) + { + fmtetc.cfFormat = pDropTarget->pFormat[lFmt]; + if (pDataObject->lpVtbl->QueryGetData(pDataObject, &fmtetc) == S_OK) + return TRUE; + } + + return FALSE; +} + + +//============================================================================= +// +// IDRPTRG_QueryInterface() +// +static HRESULT STDMETHODCALLTYPE IDRPTRG_QueryInterface(PNP3IDROPTARGET pThis, REFIID riid, + LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualGUID(riid, &IID_IUnknown)) + { + IDRPTRG_AddRef(pThis); + *ppvObject = pThis; + return S_OK; + } + else if (IsEqualGUID(riid, &IID_IDropTarget)) + { + IDRPTRG_AddRef(pThis); + *ppvObject = pThis; + return S_OK; + } + + return E_NOINTERFACE; +} + + +//============================================================================= +// +// IDRPTRG_Release() +// +static ULONG STDMETHODCALLTYPE IDRPTRG_Release(PNP3IDROPTARGET pThis) +{ + ULONG nCount; + + if ((nCount = InterlockedDecrement(&pThis->lRefCount)) == 0) + { + HeapFree(NP3DD_HEAP, 0, pThis); + return 0; + } + + return nCount; +} + + + +//============================================================================= +// +// IDRPTRG_DropEffect() +// +static DWORD IDRPTRG_DropEffect(DWORD dwKeyState, POINTL pt, DWORD dwAllowed) +{ + DWORD dwEffect = 0; + + if (dwKeyState & MK_CONTROL) + dwEffect = dwAllowed & DROPEFFECT_COPY; + else if (dwKeyState & MK_SHIFT) + dwEffect = dwAllowed & DROPEFFECT_MOVE; + + if (dwEffect == 0) + { + if (dwAllowed & DROPEFFECT_COPY) + dwEffect = DROPEFFECT_COPY; + if (dwAllowed & DROPEFFECT_MOVE) + dwEffect = DROPEFFECT_MOVE; + } + + UNUSED(pt); + return dwEffect; +} + + +//============================================================================= +// +// IDRPTRG_DragEnter() +// +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragEnter(PNP3IDROPTARGET pThis, IDataObject *pDataObject, + DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) +{ + pThis->bAllowDrop = IDRPTRG_QueryDataObject(pThis, pDataObject); + if (pThis->bAllowDrop) + { + *pdwEffect = IDRPTRG_DropEffect(dwKeyState, pt, *pdwEffect); + SetFocus(pThis->hWnd); + } + else + *pdwEffect = DROPEFFECT_NONE; + + return S_OK; +} + + +//============================================================================= +// +// IDRPTRG_DragOver() +// +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragOver(PNP3IDROPTARGET pThis, DWORD dwKeyState, POINTL pt, + DWORD *pdwEffect) +{ + if (pThis->bAllowDrop) + { + pThis->dwKeyState = dwKeyState; + + *pdwEffect = IDRPTRG_DropEffect(dwKeyState, pt, *pdwEffect); + } + else + *pdwEffect = DROPEFFECT_NONE; + + return S_OK; +} + + +//============================================================================= +// +// IDRPTRG_DragLeave() +// +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragLeave(PNP3IDROPTARGET pThis) +{ + UNUSED(pThis); + return S_OK; +} + + +//============================================================================= +// +// IDRPTRG_Drop() +// +static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PNP3IDROPTARGET pThis, IDataObject *pDataObject, + DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) +{ + FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + STGMEDIUM medium; + ULONG lFmt; + NP3DROPDATA DropData; + + UNUSED(dwKeyState); + UNUSED(pt); + + if (pThis->bAllowDrop) + { + for (lFmt = 0; lFmt < pThis->lNumFormats; lFmt++) + { + fmtetc.cfFormat = pThis->pFormat[lFmt]; + if (pDataObject->lpVtbl->QueryGetData(pDataObject, &fmtetc) == S_OK) + break; + } + if (lFmt < pThis->lNumFormats) + { + pDataObject->lpVtbl->GetData(pDataObject, &fmtetc, &medium); + *pdwEffect = DROPEFFECT_NONE; + if (pThis->pDropProc != NULL) + *pdwEffect = (*pThis->pDropProc)(pThis->pFormat[lFmt], medium.hGlobal, pThis->hWnd, pThis->dwKeyState, + pt, pThis->pUserData); + else if (pThis->nMsg != WM_NULL) + { + DropData.cf = pThis->pFormat[lFmt]; + DropData.dwKeyState = pThis->dwKeyState; + DropData.hData = medium.hGlobal; + DropData.pt = pt; + + *pdwEffect = (DWORD)SendMessage(pThis->hWnd, pThis->nMsg, (WPARAM)&DropData, + (LPARAM)pThis->pUserData); + } + if (*pdwEffect != DROPEFFECT_NONE) + ReleaseStgMedium(&medium); + } + } + else + *pdwEffect = DROPEFFECT_NONE; + + return S_OK; +} + + +//============================================================================= +// +// Np3CreateDropTarget() +// +IDropTarget* Np3CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT nMsg, + DWORD(*pDropProc)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData), + void *pUserData) +{ + PNP3IDROPTARGET pRet; + static IDRPTRG_VTBL idt_vtbl = { + IDRPTRG_QueryInterface, + IDRPTRG_AddRef, + IDRPTRG_Release, + IDRPTRG_DragEnter, + IDRPTRG_DragOver, + IDRPTRG_DragLeave, + IDRPTRG_Drop }; + + if ((pRet = HeapAlloc(NP3DD_HEAP, 0, sizeof(NP3IDROPTARGET) + lFmt * sizeof(CLIPFORMAT))) == NULL) + return NULL; + pRet->pFormat = (CLIPFORMAT *)(((char *)pRet) + sizeof(NP3IDROPTARGET)); + + pRet->idt.lpVtbl = (IDropTargetVtbl*)&idt_vtbl; + pRet->lRefCount = 1; + pRet->hWnd = hWnd; + pRet->nMsg = nMsg; + pRet->bAllowDrop = FALSE; + pRet->dwKeyState = 0; + pRet->lNumFormats = lFmt; + pRet->pDropProc = pDropProc; + pRet->pUserData = pUserData; + + for (lFmt = 0; lFmt < pRet->lNumFormats; lFmt++) + pRet->pFormat[lFmt] = pFormat[lFmt]; + + return (IDropTarget *)pRet; +} + + + +//============================================================================= +// +// Np3RegisterDragnDrop() +// +PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK pDropProc, void *pUserData) +{ + IDropTarget *pTarget; + + if ((pTarget = Np3CreateDropTarget(pFormat, lFmt, hWnd, nMsg, pDropProc, pUserData)) == NULL) + return NULL; + + if (RegisterDragDrop(hWnd, pTarget) != S_OK) + { + HeapFree(NP3DD_HEAP, 0, pTarget); + return NULL; + } + + return (PNP3DROPTARGET)pTarget; +} + + +//============================================================================= +// +// Np3RevokeDragnDrop() +// +PNP3DROPTARGET Np3RevokeDragnDrop(PNP3DROPTARGET pTarget) +{ + if (pTarget == NULL) + return NULL; + + if (((PNP3IDROPTARGET)pTarget)->hWnd != NULL) + { + if (GetWindowLongPtr(((PNP3IDROPTARGET)pTarget)->hWnd, GWLP_WNDPROC) != 0) + RevokeDragDrop(((PNP3IDROPTARGET)pTarget)->hWnd); + } + + ((IDropTarget *)pTarget)->lpVtbl->Release((IDropTarget *)pTarget); + + return NULL; +} + + /// End of Helpers.c \\\ diff --git a/src/Helpers.h b/src/Helpers.h index 1488867f0..fb1e857b2 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -436,6 +436,25 @@ inline HRESULT PathCchRenameExtension(PWSTR p,size_t l,PCWSTR a) { UNUSED(l); re inline HRESULT PathCchRemoveFileSpec(PWSTR p,size_t l) { UNUSED(l); return (PathRemoveFileSpec(p) ? S_OK : E_FAIL); } +// special Drag and Drop Handling + +typedef struct tNP3DROPDATA +{ + CLIPFORMAT cf; + POINTL pt; + DWORD dwKeyState; + HGLOBAL hData; +} +NP3DROPDATA, *PNP3DROPDATA; + +typedef struct tNP3DROPTARGET *PNP3DROPTARGET; +typedef DWORD(*NP3DDCALLBACK)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); + +void Np3DragnDropInit(HANDLE hHeap); +PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK, void *pUserData); +PNP3DROPTARGET Np3RevokeDragnDrop(PNP3DROPTARGET pTarget); + + #endif //_NP3_HELPERS_H_ /// End of Helpers.h \\\ diff --git a/src/Notepad3.c b/src/Notepad3.c index f903125f6..1f848fb63 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -310,6 +310,13 @@ WCHAR g_wchWorkingDirectory[MAX_PATH+2] = { L'\0' }; static UT_icd UndoRedoSelection_icd = { sizeof(UndoRedoSelection_t), NULL, NULL, NULL }; static UT_array* UndoRedoSelectionUTArray = NULL; + +static CLIPFORMAT cfDrpF = CF_HDROP; +static POINTL ptDummy = { 0, 0 }; +static PNP3DROPTARGET pDropTarget = NULL; +static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); + + //============================================================================= // // Flags @@ -644,6 +651,9 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n if (!hwnd) return FALSE; + // init DragnDrop handler + Np3DragnDropInit(NULL); + if (IsVista()) { if (iSciDirectWriteTech >= 0) SciCall_SetTechnology(DirectWriteTechnology[iSciDirectWriteTech]); @@ -1168,7 +1178,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) MsgDropFiles(hwnd, wParam, lParam); break; - case WM_COPYDATA: return MsgCopyData(hwnd, wParam, lParam); @@ -1225,13 +1234,6 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) case WM_TRAYMESSAGE: return MsgTrayMessage(hwnd, wParam, lParam); - case WM_MOUSEWHEEL: - case WM_MBUTTONDOWN: - if (wParam & MK_MBUTTON) { - PostMessage(hwnd, WM_COMMAND, MAKELONG(BME_EDIT_BOOKMARKTOGGLE, 1), 0); - } - return DefWindowProc(hwnd, umsg, wParam, lParam); - default: if (umsg == msgTaskbarCreated) { if (!IsWindowVisible(hwnd)) @@ -1412,6 +1414,7 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) // Drag & Drop DragAcceptFiles(hwnd,TRUE); + pDropTarget = Np3RegisterDragnDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); // File MRU pFileMRU = MRU_Create(L"Recent Files",MRU_NOCASE,32); @@ -1634,6 +1637,7 @@ void MsgEndSession(HWND hwnd, UINT umsg) wininfo = GetMyWindowPlacement(hwnd, NULL); DragAcceptFiles(hwnd, FALSE); + Np3RevokeDragnDrop(pDropTarget); // Terminate clipboard watching if (flagPasteBoard) { @@ -1855,9 +1859,10 @@ void MsgDropFiles(HWND hwnd, WPARAM wParam, LPARAM lParam) if (OpenFileDlg(hwndMain, tchFile, COUNTOF(tchFile), szBuf)) FileLoad(FALSE, FALSE, FALSE, FALSE, tchFile); } - - else + else if (PathFileExists(szBuf)) FileLoad(FALSE, FALSE, FALSE, FALSE, szBuf); + else + MsgBox(MBWARN, IDS_DROP_NO_FILE); if (DragQueryFile(hDrop, (UINT)(-1), NULL, 0) > 1) MsgBox(MBWARN, IDS_ERR_DROP); @@ -1868,6 +1873,57 @@ void MsgDropFiles(HWND hwnd, WPARAM wParam, LPARAM lParam) } + +//============================================================================= +// +// DropFilesProc() - Handles DROPFILES +// +// +static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData) +{ + UNUSED(dwKeyState); + UNUSED(pt); + + DWORD dwEffect = DROPEFFECT_NONE; + + //HWND hEditWnd = (HWND)pUserData; + UNUSED(pUserData); + + if (cf == CF_HDROP) + { + WCHAR szBuf[MAX_PATH + 40]; + HDROP hDrop = (HDROP)hData; + + // Reset Change Notify + //bPendingChangeNotify = FALSE; + + if (IsIconic(hWnd)) + ShowWindow(hWnd, SW_RESTORE); + + //SetForegroundWindow(hwnd); + + DragQueryFile(hDrop, 0, szBuf, COUNTOF(szBuf)); + + if (PathIsDirectory(szBuf)) { + WCHAR tchFile[MAX_PATH] = { L'\0' }; + if (OpenFileDlg(hWnd, tchFile, COUNTOF(tchFile), szBuf)) + FileLoad(FALSE, FALSE, FALSE, FALSE, tchFile); + } + + else + FileLoad(FALSE, FALSE, FALSE, FALSE, szBuf); + + if (DragQueryFile(hDrop, (UINT)(-1), NULL, 0) > 1) + MsgBox(MBWARN, IDS_ERR_DROP); + + dwEffect = DROPEFFECT_COPY; + } + + return dwEffect; +} /* End of MyDropProc(). */ + + + //============================================================================= // // MsgCopyData() - Handles WM_COPYDATA diff --git a/src/Notepad3.rc b/src/Notepad3.rc index eaede8a2dde1233c31939ebad716afd2a8639795..62f3b3a86bf291de25363fe98329bc0f803a44ca 100644 GIT binary patch delta 232 zcmZ29o%_N}?uHh|ElgIP{4NYZ4E_uO4Dk$pKstVUy(*LR^a&hHEa3_aDGWsn`3wa> zm>&jrdDGZ-=GG9&@@mrNHFWRm39 z0SXp?4NGJwW=Ngxn8_$BsKAiOkPgI|Kob=hN*MB|Gnz69tE&T5fVn`!a)7LSptC@H dpkYwwBmp%QO>Z=1lALbf&BU?Y$&)Fe2>|WpF8u%i delta 24 gcmcaGlY7y0?uHh|ElgIP)8l-YIJOsfF(ots0Cf=vmjD0& diff --git a/src/resource.h b/src/resource.h index 0dabab805..dc6ed473d 100644 --- a/src/resource.h +++ b/src/resource.h @@ -460,6 +460,7 @@ #define IDS_ERR_ACCESSDENIED 50041 #define IDS_WARN_UNKNOWN_EXT 50042 #define IDS_REGEX_INVALID 50043 +#define IDS_DROP_NO_FILE 50044 #define IDS_CMDLINEHELP 60000 #define IDM_EDIT_INSERT_GUID 60001 #define IDC_STATIC -1 From b2daa19b7bb91734ea3ee8e0c64c4ac855ed71f7 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 00:31:41 +0100 Subject: [PATCH 2/6] renaming of drag n' drop methods --- src/Helpers.c | 58 +++++++++++++++++++++++++------------------------- src/Helpers.h | 12 +++++------ src/Notepad3.c | 8 +++---- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/Helpers.c b/src/Helpers.c index 82145b624..e74ca5983 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -3603,19 +3603,19 @@ typedef struct tIDROPTARGET { void *pUserData; NP3DDCALLBACK pDropProc; } -NP3IDROPTARGET, *PNP3IDROPTARGET; +IDROPTARGET, *PIDROPTARGET; typedef struct IDRPTRG_VTBL { BEGIN_INTERFACE - HRESULT(STDMETHODCALLTYPE *QueryInterface)(PNP3IDROPTARGET pThis, REFIID riid, void **ppvObject); - ULONG(STDMETHODCALLTYPE *AddRef)(PNP3IDROPTARGET pThis); - ULONG(STDMETHODCALLTYPE *Release)(PNP3IDROPTARGET pThis); - HRESULT(STDMETHODCALLTYPE *DragEnter)(PNP3IDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); - HRESULT(STDMETHODCALLTYPE *DragOver)(PNP3IDROPTARGET pThis, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); - HRESULT(STDMETHODCALLTYPE *DragLeave)(PNP3IDROPTARGET pThis); - HRESULT(STDMETHODCALLTYPE *Drop)(PNP3IDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT(STDMETHODCALLTYPE *QueryInterface)(PIDROPTARGET pThis, REFIID riid, void **ppvObject); + ULONG(STDMETHODCALLTYPE *AddRef)(PIDROPTARGET pThis); + ULONG(STDMETHODCALLTYPE *Release)(PIDROPTARGET pThis); + HRESULT(STDMETHODCALLTYPE *DragEnter)(PIDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT(STDMETHODCALLTYPE *DragOver)(PIDROPTARGET pThis, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); + HRESULT(STDMETHODCALLTYPE *DragLeave)(PIDROPTARGET pThis); + HRESULT(STDMETHODCALLTYPE *Drop)(PIDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect); END_INTERFACE } IDRPTRG_VTBL, *PIDRPTRG_VTBL; @@ -3625,7 +3625,7 @@ IDRPTRG_VTBL, *PIDRPTRG_VTBL; // // NP3DragnDropInit() // -void Np3DragnDropInit(HANDLE hHeap) +void DragnDropInit(HANDLE hHeap) { if (g_hHeap == NULL && hHeap == NULL) g_hHeap = GetProcessHeap(); @@ -3641,7 +3641,7 @@ void Np3DragnDropInit(HANDLE hHeap) // // IDRPTRG_AddRef() // -static ULONG STDMETHODCALLTYPE IDRPTRG_AddRef(PNP3IDROPTARGET pThis) +static ULONG STDMETHODCALLTYPE IDRPTRG_AddRef(PIDROPTARGET pThis) { return InterlockedIncrement(&pThis->lRefCount); } @@ -3651,7 +3651,7 @@ static ULONG STDMETHODCALLTYPE IDRPTRG_AddRef(PNP3IDROPTARGET pThis) // // IDRPTRG_QueryDataObject() // -static BOOL IDRPTRG_QueryDataObject(PNP3IDROPTARGET pDropTarget, IDataObject *pDataObject) +static BOOL IDRPTRG_QueryDataObject(PIDROPTARGET pDropTarget, IDataObject *pDataObject) { ULONG lFmt; FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; @@ -3671,7 +3671,7 @@ static BOOL IDRPTRG_QueryDataObject(PNP3IDROPTARGET pDropTarget, IDataObject *pD // // IDRPTRG_QueryInterface() // -static HRESULT STDMETHODCALLTYPE IDRPTRG_QueryInterface(PNP3IDROPTARGET pThis, REFIID riid, +static HRESULT STDMETHODCALLTYPE IDRPTRG_QueryInterface(PIDROPTARGET pThis, REFIID riid, LPVOID *ppvObject) { *ppvObject = NULL; @@ -3697,7 +3697,7 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_QueryInterface(PNP3IDROPTARGET pThis, R // // IDRPTRG_Release() // -static ULONG STDMETHODCALLTYPE IDRPTRG_Release(PNP3IDROPTARGET pThis) +static ULONG STDMETHODCALLTYPE IDRPTRG_Release(PIDROPTARGET pThis) { ULONG nCount; @@ -3742,7 +3742,7 @@ static DWORD IDRPTRG_DropEffect(DWORD dwKeyState, POINTL pt, DWORD dwAllowed) // // IDRPTRG_DragEnter() // -static HRESULT STDMETHODCALLTYPE IDRPTRG_DragEnter(PNP3IDROPTARGET pThis, IDataObject *pDataObject, +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragEnter(PIDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) { pThis->bAllowDrop = IDRPTRG_QueryDataObject(pThis, pDataObject); @@ -3762,7 +3762,7 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_DragEnter(PNP3IDROPTARGET pThis, IDataO // // IDRPTRG_DragOver() // -static HRESULT STDMETHODCALLTYPE IDRPTRG_DragOver(PNP3IDROPTARGET pThis, DWORD dwKeyState, POINTL pt, +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragOver(PIDROPTARGET pThis, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) { if (pThis->bAllowDrop) @@ -3782,7 +3782,7 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_DragOver(PNP3IDROPTARGET pThis, DWORD d // // IDRPTRG_DragLeave() // -static HRESULT STDMETHODCALLTYPE IDRPTRG_DragLeave(PNP3IDROPTARGET pThis) +static HRESULT STDMETHODCALLTYPE IDRPTRG_DragLeave(PIDROPTARGET pThis) { UNUSED(pThis); return S_OK; @@ -3793,13 +3793,13 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_DragLeave(PNP3IDROPTARGET pThis) // // IDRPTRG_Drop() // -static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PNP3IDROPTARGET pThis, IDataObject *pDataObject, +static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PIDROPTARGET pThis, IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) { FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM medium; ULONG lFmt; - NP3DROPDATA DropData; + DROPDATA DropData; UNUSED(dwKeyState); UNUSED(pt); @@ -3844,11 +3844,11 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PNP3IDROPTARGET pThis, IDataObject // // Np3CreateDropTarget() // -IDropTarget* Np3CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT nMsg, +IDropTarget* CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT nMsg, DWORD(*pDropProc)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData), void *pUserData) { - PNP3IDROPTARGET pRet; + PIDROPTARGET pRet; static IDRPTRG_VTBL idt_vtbl = { IDRPTRG_QueryInterface, IDRPTRG_AddRef, @@ -3858,9 +3858,9 @@ IDropTarget* Np3CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UIN IDRPTRG_DragLeave, IDRPTRG_Drop }; - if ((pRet = HeapAlloc(NP3DD_HEAP, 0, sizeof(NP3IDROPTARGET) + lFmt * sizeof(CLIPFORMAT))) == NULL) + if ((pRet = HeapAlloc(NP3DD_HEAP, 0, sizeof(IDROPTARGET) + lFmt * sizeof(CLIPFORMAT))) == NULL) return NULL; - pRet->pFormat = (CLIPFORMAT *)(((char *)pRet) + sizeof(NP3IDROPTARGET)); + pRet->pFormat = (CLIPFORMAT *)(((char *)pRet) + sizeof(IDROPTARGET)); pRet->idt.lpVtbl = (IDropTargetVtbl*)&idt_vtbl; pRet->lRefCount = 1; @@ -3884,11 +3884,11 @@ IDropTarget* Np3CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UIN // // Np3RegisterDragnDrop() // -PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK pDropProc, void *pUserData) +PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK pDropProc, void *pUserData) { IDropTarget *pTarget; - if ((pTarget = Np3CreateDropTarget(pFormat, lFmt, hWnd, nMsg, pDropProc, pUserData)) == NULL) + if ((pTarget = CreateDropTarget(pFormat, lFmt, hWnd, nMsg, pDropProc, pUserData)) == NULL) return NULL; if (RegisterDragDrop(hWnd, pTarget) != S_OK) @@ -3897,7 +3897,7 @@ PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, return NULL; } - return (PNP3DROPTARGET)pTarget; + return (PDROPTARGET)pTarget; } @@ -3905,15 +3905,15 @@ PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, // // Np3RevokeDragnDrop() // -PNP3DROPTARGET Np3RevokeDragnDrop(PNP3DROPTARGET pTarget) +PDROPTARGET RevokeDragnDrop(PDROPTARGET pTarget) { if (pTarget == NULL) return NULL; - if (((PNP3IDROPTARGET)pTarget)->hWnd != NULL) + if (((PIDROPTARGET)pTarget)->hWnd != NULL) { - if (GetWindowLongPtr(((PNP3IDROPTARGET)pTarget)->hWnd, GWLP_WNDPROC) != 0) - RevokeDragDrop(((PNP3IDROPTARGET)pTarget)->hWnd); + if (GetWindowLongPtr(((PIDROPTARGET)pTarget)->hWnd, GWLP_WNDPROC) != 0) + RevokeDragDrop(((PIDROPTARGET)pTarget)->hWnd); } ((IDropTarget *)pTarget)->lpVtbl->Release((IDropTarget *)pTarget); diff --git a/src/Helpers.h b/src/Helpers.h index fb1e857b2..b2a95d880 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -438,21 +438,21 @@ inline HRESULT PathCchRemoveFileSpec(PWSTR p,size_t l) { UNUSED(l); re // special Drag and Drop Handling -typedef struct tNP3DROPDATA +typedef struct tDROPDATA { CLIPFORMAT cf; POINTL pt; DWORD dwKeyState; HGLOBAL hData; } -NP3DROPDATA, *PNP3DROPDATA; +DROPDATA, *PDROPDATA; -typedef struct tNP3DROPTARGET *PNP3DROPTARGET; +typedef struct tDROPTARGET *PDROPTARGET; typedef DWORD(*NP3DDCALLBACK)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); -void Np3DragnDropInit(HANDLE hHeap); -PNP3DROPTARGET Np3RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK, void *pUserData); -PNP3DROPTARGET Np3RevokeDragnDrop(PNP3DROPTARGET pTarget); +void DragnDropInit(HANDLE hHeap); +PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK, void *pUserData); +PDROPTARGET RevokeDragnDrop(PDROPTARGET pTarget); #endif //_NP3_HELPERS_H_ diff --git a/src/Notepad3.c b/src/Notepad3.c index 1f848fb63..e7ef65150 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -313,7 +313,7 @@ static UT_array* UndoRedoSelectionUTArray = NULL; static CLIPFORMAT cfDrpF = CF_HDROP; static POINTL ptDummy = { 0, 0 }; -static PNP3DROPTARGET pDropTarget = NULL; +static PDROPTARGET pDropTarget = NULL; static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); @@ -652,7 +652,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n return FALSE; // init DragnDrop handler - Np3DragnDropInit(NULL); + DragnDropInit(NULL); if (IsVista()) { if (iSciDirectWriteTech >= 0) @@ -1414,7 +1414,7 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) // Drag & Drop DragAcceptFiles(hwnd,TRUE); - pDropTarget = Np3RegisterDragnDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); + pDropTarget = RegisterDragnDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); // File MRU pFileMRU = MRU_Create(L"Recent Files",MRU_NOCASE,32); @@ -1637,7 +1637,7 @@ void MsgEndSession(HWND hwnd, UINT umsg) wininfo = GetMyWindowPlacement(hwnd, NULL); DragAcceptFiles(hwnd, FALSE); - Np3RevokeDragnDrop(pDropTarget); + RevokeDragnDrop(pDropTarget); // Terminate clipboard watching if (flagPasteBoard) { From c8501af6c7a8970e4e4132f810c9cd34381193be Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 00:39:07 +0100 Subject: [PATCH 3/6] + fix: adapt text for messagebox: no valid drop-file --- src/Notepad3.rc | Bin 183504 -> 183490 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Notepad3.rc b/src/Notepad3.rc index 62f3b3a86bf291de25363fe98329bc0f803a44ca..d60b7750e2bac7213f3068fb46e5baef7fa8a34e 100644 GIT binary patch delta 111 zcmcaGll#z2?uHh|ElgRSx@8QB3^@#$3@Ho>3~4|*har_A4=9!kq!k#7fMf}f%mmV9 z45`z*J((m~Gl2@yr!V(pGG>lp$eVuKlSzBJkQb90YZ6dj(ey@BCduh>K1>|j3%r;T FngCvw9RvUX delta 135 zcmX>!ll#I`C}ACv$9 From 5cd238f918b977b64738d2fffa2bc7a8f7e1035c Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 01:10:56 +0100 Subject: [PATCH 4/6] + minor refactorings --- src/Helpers.c | 51 ++++++++++++++++++++++++++++++-------------------- src/Helpers.h | 8 ++++---- src/Notepad3.c | 7 ++++--- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/Helpers.c b/src/Helpers.c index e74ca5983..7034ccc44 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -3588,8 +3588,6 @@ INT UTF8_mbslen(LPCSTR source,INT byte_length) static HANDLE g_hHeap = NULL; -#define NP3DD_HEAP (g_hHeap == NULL ? (g_hHeap = GetProcessHeap()) : g_hHeap) - typedef struct tIDROPTARGET { IDropTarget idt; LONG lRefCount; @@ -3601,7 +3599,7 @@ typedef struct tIDROPTARGET { IDataObject *pDataObject; UINT nMsg; void *pUserData; - NP3DDCALLBACK pDropProc; + DNDCALLBACK pDropProc; } IDROPTARGET, *PIDROPTARGET; @@ -3623,9 +3621,9 @@ IDRPTRG_VTBL, *PIDRPTRG_VTBL; //============================================================================= // -// NP3DragnDropInit() +// DragAndDropInit() // -void DragnDropInit(HANDLE hHeap) +void DragAndDropInit(HANDLE hHeap) { if (g_hHeap == NULL && hHeap == NULL) g_hHeap = GetProcessHeap(); @@ -3637,6 +3635,19 @@ void DragnDropInit(HANDLE hHeap) } +//============================================================================= +// +// GetDnDHeap() +// +static HANDLE GetDnDHeap() +{ + if (g_hHeap == NULL) { + g_hHeap = GetProcessHeap(); + } + return g_hHeap; +} + + //============================================================================= // // IDRPTRG_AddRef() @@ -3703,7 +3714,7 @@ static ULONG STDMETHODCALLTYPE IDRPTRG_Release(PIDROPTARGET pThis) if ((nCount = InterlockedDecrement(&pThis->lRefCount)) == 0) { - HeapFree(NP3DD_HEAP, 0, pThis); + HeapFree(GetDnDHeap(), 0, pThis); return 0; } @@ -3816,9 +3827,9 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PIDROPTARGET pThis, IDataObject *p { pDataObject->lpVtbl->GetData(pDataObject, &fmtetc, &medium); *pdwEffect = DROPEFFECT_NONE; - if (pThis->pDropProc != NULL) - *pdwEffect = (*pThis->pDropProc)(pThis->pFormat[lFmt], medium.hGlobal, pThis->hWnd, pThis->dwKeyState, - pt, pThis->pUserData); + if (pThis->pDropProc != NULL) { + *pdwEffect = (*pThis->pDropProc)(pThis->pFormat[lFmt], medium.hGlobal, pThis->hWnd, pThis->dwKeyState, pt, pThis->pUserData); + } else if (pThis->nMsg != WM_NULL) { DropData.cf = pThis->pFormat[lFmt]; @@ -3826,8 +3837,7 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PIDROPTARGET pThis, IDataObject *p DropData.hData = medium.hGlobal; DropData.pt = pt; - *pdwEffect = (DWORD)SendMessage(pThis->hWnd, pThis->nMsg, (WPARAM)&DropData, - (LPARAM)pThis->pUserData); + *pdwEffect = (DWORD)SendMessage(pThis->hWnd, pThis->nMsg, (WPARAM)&DropData, (LPARAM)pThis->pUserData); } if (*pdwEffect != DROPEFFECT_NONE) ReleaseStgMedium(&medium); @@ -3842,7 +3852,7 @@ static HRESULT STDMETHODCALLTYPE IDRPTRG_Drop(PIDROPTARGET pThis, IDataObject *p //============================================================================= // -// Np3CreateDropTarget() +// CreateDropTarget() // IDropTarget* CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT nMsg, DWORD(*pDropProc)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData), @@ -3858,8 +3868,9 @@ IDropTarget* CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT n IDRPTRG_DragLeave, IDRPTRG_Drop }; - if ((pRet = HeapAlloc(NP3DD_HEAP, 0, sizeof(IDROPTARGET) + lFmt * sizeof(CLIPFORMAT))) == NULL) + if ((pRet = HeapAlloc(GetDnDHeap(), 0, sizeof(IDROPTARGET) + lFmt * sizeof(CLIPFORMAT))) == NULL) return NULL; + pRet->pFormat = (CLIPFORMAT *)(((char *)pRet) + sizeof(IDROPTARGET)); pRet->idt.lpVtbl = (IDropTargetVtbl*)&idt_vtbl; @@ -3872,9 +3883,9 @@ IDropTarget* CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT n pRet->pDropProc = pDropProc; pRet->pUserData = pUserData; - for (lFmt = 0; lFmt < pRet->lNumFormats; lFmt++) + for (lFmt = 0; lFmt < pRet->lNumFormats; lFmt++) { pRet->pFormat[lFmt] = pFormat[lFmt]; - + } return (IDropTarget *)pRet; } @@ -3882,9 +3893,9 @@ IDropTarget* CreateDropTarget(CLIPFORMAT *pFormat, ULONG lFmt, HWND hWnd, UINT n //============================================================================= // -// Np3RegisterDragnDrop() +// RegisterDragAndDrop() // -PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK pDropProc, void *pUserData) +PDROPTARGET RegisterDragAndDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, DNDCALLBACK pDropProc, void *pUserData) { IDropTarget *pTarget; @@ -3893,7 +3904,7 @@ PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT n if (RegisterDragDrop(hWnd, pTarget) != S_OK) { - HeapFree(NP3DD_HEAP, 0, pTarget); + HeapFree(GetDnDHeap(), 0, pTarget); return NULL; } @@ -3903,9 +3914,9 @@ PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT n //============================================================================= // -// Np3RevokeDragnDrop() +// RevokeDragAndDrop() // -PDROPTARGET RevokeDragnDrop(PDROPTARGET pTarget) +PDROPTARGET RevokeDragAndDrop(PDROPTARGET pTarget) { if (pTarget == NULL) return NULL; diff --git a/src/Helpers.h b/src/Helpers.h index b2a95d880..15ae6c687 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -448,11 +448,11 @@ typedef struct tDROPDATA DROPDATA, *PDROPDATA; typedef struct tDROPTARGET *PDROPTARGET; -typedef DWORD(*NP3DDCALLBACK)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); +typedef DWORD(*DNDCALLBACK)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); -void DragnDropInit(HANDLE hHeap); -PDROPTARGET RegisterDragnDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, NP3DDCALLBACK, void *pUserData); -PDROPTARGET RevokeDragnDrop(PDROPTARGET pTarget); +void DragAndDropInit(HANDLE hHeap); +PDROPTARGET RegisterDragAndDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, DNDCALLBACK, void *pUserData); +PDROPTARGET RevokeDragAndDrop(PDROPTARGET pTarget); #endif //_NP3_HELPERS_H_ diff --git a/src/Notepad3.c b/src/Notepad3.c index b928cd392..1b87e2cf8 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -652,7 +652,7 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n return FALSE; // init DragnDrop handler - DragnDropInit(NULL); + DragAndDropInit(NULL); if (IsVista()) { SciCall_UnBufferedDraw(); // Current platforms perform window buffering so it is almost always better for this option to be turned off. @@ -1415,7 +1415,7 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) // Drag & Drop DragAcceptFiles(hwnd,TRUE); - pDropTarget = RegisterDragnDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); + pDropTarget = RegisterDragAndDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); // File MRU pFileMRU = MRU_Create(L"Recent Files",MRU_NOCASE,32); @@ -1638,7 +1638,7 @@ void MsgEndSession(HWND hwnd, UINT umsg) wininfo = GetMyWindowPlacement(hwnd, NULL); DragAcceptFiles(hwnd, FALSE); - RevokeDragnDrop(pDropTarget); + RevokeDragAndDrop(pDropTarget); // Terminate clipboard watching if (flagPasteBoard) { @@ -1863,6 +1863,7 @@ void MsgDropFiles(HWND hwnd, WPARAM wParam, LPARAM lParam) else if (PathFileExists(szBuf)) FileLoad(FALSE, FALSE, FALSE, FALSE, szBuf); else + // Windows Bug: wParam (HDROP) pointer is corrupted if dropped from 32-bit App MsgBox(MBWARN, IDS_DROP_NO_FILE); if (DragQueryFile(hDrop, (UINT)(-1), NULL, 0) > 1) From f19f62490083720541a77874ccc83e5950891ddd Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 01:16:58 +0100 Subject: [PATCH 5/6] + code cleanup --- src/Notepad3.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Notepad3.c b/src/Notepad3.c index 1b87e2cf8..81a62254b 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -1883,9 +1883,6 @@ void MsgDropFiles(HWND hwnd, WPARAM wParam, LPARAM lParam) // static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData) { - UNUSED(dwKeyState); - UNUSED(pt); - DWORD dwEffect = DROPEFFECT_NONE; //HWND hEditWnd = (HWND)pUserData; @@ -1896,14 +1893,9 @@ static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyS WCHAR szBuf[MAX_PATH + 40]; HDROP hDrop = (HDROP)hData; - // Reset Change Notify - //bPendingChangeNotify = FALSE; - if (IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE); - //SetForegroundWindow(hwnd); - DragQueryFile(hDrop, 0, szBuf, COUNTOF(szBuf)); if (PathIsDirectory(szBuf)) { @@ -1911,7 +1903,6 @@ static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyS if (OpenFileDlg(hWnd, tchFile, COUNTOF(tchFile), szBuf)) FileLoad(FALSE, FALSE, FALSE, FALSE, tchFile); } - else FileLoad(FALSE, FALSE, FALSE, FALSE, szBuf); @@ -1921,8 +1912,11 @@ static DWORD DropFilesProc(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyS dwEffect = DROPEFFECT_COPY; } + UNUSED(dwKeyState); + UNUSED(pt); + return dwEffect; -} /* End of MyDropProc(). */ +} From abca2f4097c7cd88c491ee7c8a232914d4c5b982 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Wed, 29 Nov 2017 13:29:21 +0100 Subject: [PATCH 6/6] + fix: issue regarding Accelerator keys for find/replace dialog --- src/Edit.c | 657 +++++++++++++++++++++++++------------------------ src/Notepad3.c | 4 +- 2 files changed, 336 insertions(+), 325 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 93f7a555c..7edfc82f7 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -4733,6 +4733,7 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA } return FALSE; + case WM_ACTIVATE: if (bDoCheckAllOccurrences) { bFlagsChanged = TRUE; @@ -4745,359 +4746,366 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA case WM_COMMAND: + { + lpefr = (LPEDITFINDREPLACE)GetWindowLongPtr(hwnd, DWLP_USER); + + switch (LOWORD(wParam)) { - lpefr = (LPEDITFINDREPLACE)GetWindowLongPtr(hwnd, DWLP_USER); - - switch (LOWORD(wParam)) { - case IDC_FINDTEXT: - case IDC_REPLACETEXT: - { - BOOL bEnableF = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT)) || - CB_ERR != SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_GETCURSEL, 0, 0)); + case IDC_FINDTEXT: + case IDC_REPLACETEXT: + { + BOOL bEnableF = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_FINDTEXT)) || + CB_ERR != SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_GETCURSEL, 0, 0)); - BOOL bEnableR = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_REPLACETEXT)) || - CB_ERR != SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_GETCURSEL, 0, 0)); + BOOL bEnableR = (GetWindowTextLengthW(GetDlgItem(hwnd, IDC_REPLACETEXT)) || + CB_ERR != SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_GETCURSEL, 0, 0)); - BOOL bEnableIS = !(BOOL)SendMessage(hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0); + BOOL bEnableIS = !(BOOL)SendMessage(hwndEdit, SCI_GETSELECTIONEMPTY, 0, 0); - DialogEnableWindow(hwnd, IDOK, bEnableF); - DialogEnableWindow(hwnd, IDC_FINDPREV, bEnableF); - DialogEnableWindow(hwnd, IDC_REPLACE, bEnableF); - DialogEnableWindow(hwnd, IDC_REPLACEALL, bEnableF); - DialogEnableWindow(hwnd, IDC_REPLACEINSEL, bEnableF && bEnableIS); - DialogEnableWindow(hwnd, IDC_SWAPSTRG, bEnableF || bEnableR); + DialogEnableWindow(hwnd, IDOK, bEnableF); + DialogEnableWindow(hwnd, IDC_FINDPREV, bEnableF); + DialogEnableWindow(hwnd, IDC_REPLACE, bEnableF); + DialogEnableWindow(hwnd, IDC_REPLACEALL, bEnableF); + DialogEnableWindow(hwnd, IDC_REPLACEINSEL, bEnableF && bEnableIS); + DialogEnableWindow(hwnd, IDC_SWAPSTRG, bEnableF || bEnableR); - if (HIWORD(wParam) == CBN_CLOSEUP) { - LONG lSelEnd; - SendDlgItemMessage(hwnd, LOWORD(wParam), CB_GETEDITSEL, 0, (LPARAM)&lSelEnd); - SendDlgItemMessage(hwnd, LOWORD(wParam), CB_SETEDITSEL, 0, MAKELPARAM(lSelEnd, lSelEnd)); - } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 200, NULL); + if (HIWORD(wParam) == CBN_CLOSEUP) { + LONG lSelEnd; + SendDlgItemMessage(hwnd, LOWORD(wParam), CB_GETEDITSEL, 0, (LPARAM)&lSelEnd); + SendDlgItemMessage(hwnd, LOWORD(wParam), CB_SETEDITSEL, 0, MAKELPARAM(lSelEnd, lSelEnd)); } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 200, NULL); + } + break; + + case IDC_MARKALL_OCC: + { + if (bDoCheckAllOccurrences) { + EditSetSearchFlags(hwnd, lpefr); + if (bFlagsChanged || (StringCchCompareXA(lastFind, lpefr->szFind) != 0)) { + BeginWaitCursor(); + StringCchCopyA(lastFind, COUNTOF(lastFind), lpefr->szFind); + RegExResult_t match = NO_MATCH; + match = EditFindHasMatch(hwndEdit, lpefr, (iSaveMarkOcc > 0), FALSE); + if (regexMatch != match) { + regexMatch = match; + InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, TRUE); + } + // we have to set Sci's regex instance to first find (have substitution in place) + EditFindHasMatch(hwndEdit, lpefr, FALSE, TRUE); + bFlagsChanged = FALSE; + EndWaitCursor(); + } + } + } + break; + + case IDC_FINDREGEXP: + if (IsDlgButtonChecked(hwnd, IDC_FINDREGEXP) == BST_CHECKED) + { + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); + DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); + + CheckDlgButton(hwnd, IDC_WILDCARDSEARCH, BST_UNCHECKED); // Can not use wildcard search together with regexp + lpefr->fuFlags |= SCFIND_NP3_REGEX; + lpefr->bWildcardSearch = FALSE; + } + else { + if (IsDlgButtonChecked(hwnd, IDC_WILDCARDSEARCH) == BST_CHECKED) { + lpefr->fuFlags |= SCFIND_NP3_REGEX; + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); + DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); + } + else { + lpefr->fuFlags ^= SCFIND_NP3_REGEX; + DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, TRUE); + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED); + } + } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); break; - case IDC_MARKALL_OCC: - { - if (bDoCheckAllOccurrences) { - EditSetSearchFlags(hwnd, lpefr); - if (bFlagsChanged || (StringCchCompareXA(lastFind, lpefr->szFind) != 0)) { - BeginWaitCursor(); - StringCchCopyA(lastFind, COUNTOF(lastFind), lpefr->szFind); - RegExResult_t match = NO_MATCH; - match = EditFindHasMatch(hwndEdit, lpefr, (iSaveMarkOcc > 0), FALSE); - if (regexMatch != match) { - regexMatch = match; - InvalidateRect(GetDlgItem(hwnd, IDC_FINDTEXT), NULL, TRUE); - } - // we have to set Sci's regex instance to first find (have substitution in place) - EditFindHasMatch(hwndEdit, lpefr, FALSE, TRUE); - bFlagsChanged = FALSE; - EndWaitCursor(); - } - } - } - break; + case IDC_WILDCARDSEARCH: + if (IsDlgButtonChecked(hwnd, IDC_WILDCARDSEARCH) == BST_CHECKED) + { + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); + DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); - case IDC_FINDREGEXP: + CheckDlgButton(hwnd, IDC_FINDREGEXP, BST_UNCHECKED); + lpefr->fuFlags |= SCFIND_NP3_REGEX; + lpefr->bWildcardSearch = TRUE; + } + else { if (IsDlgButtonChecked(hwnd, IDC_FINDREGEXP) == BST_CHECKED) { + lpefr->fuFlags |= SCFIND_NP3_REGEX; CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); - - CheckDlgButton(hwnd, IDC_WILDCARDSEARCH, BST_UNCHECKED); // Can not use wildcard search together with regexp - lpefr->fuFlags |= SCFIND_NP3_REGEX; - lpefr->bWildcardSearch = FALSE; } else { - if (IsDlgButtonChecked(hwnd, IDC_WILDCARDSEARCH) == BST_CHECKED) { - lpefr->fuFlags |= SCFIND_NP3_REGEX; - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); - DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); - } - else { - lpefr->fuFlags ^= SCFIND_NP3_REGEX; - DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, TRUE); - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED); + DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, TRUE); + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED); + lpefr->fuFlags ^= SCFIND_NP3_REGEX; + } + lpefr->bWildcardSearch = FALSE; + } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + case IDC_FINDTRANSFORMBS: + if (IsDlgButtonChecked(hwnd, IDC_FINDTRANSFORMBS) == BST_CHECKED) { + lpefr->bTransformBS = TRUE; + } + else { + lpefr->bTransformBS = FALSE; + } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + case IDC_FINDCASE: + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + case IDC_FINDWORD: + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + case IDC_FINDSTART: + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + + case IDOK: + case IDC_FINDPREV: + case IDC_REPLACE: + case IDC_REPLACEALL: + case IDC_REPLACEINSEL: + case IDACC_SELTONEXT: + case IDACC_SELTOPREV: + case IDMSG_SWITCHTOFIND: + case IDMSG_SWITCHTOREPLACE: + { + BOOL bIsFindDlg = (GetDlgItem(hwnd, IDC_REPLACE) == NULL); + + if ((bIsFindDlg && LOWORD(wParam) == IDMSG_SWITCHTOREPLACE || + !bIsFindDlg && LOWORD(wParam) == IDMSG_SWITCHTOFIND)) { + GetDlgPos(hwnd, &xFindReplaceDlgSave, &yFindReplaceDlgSave); + bSwitchedFindReplace = TRUE; + CopyMemory(&efrSave, lpefr, sizeof(EDITFINDREPLACE)); + } + + // Get current code page for Unicode conversion + UINT uCPEdit = Encoding_SciGetCodePage(hwnd); + cpLastFind = uCPEdit; + + if (!bSwitchedFindReplace && + !GetDlgItemTextW2A(uCPEdit, hwnd, IDC_FINDTEXT, lpefr->szFind, COUNTOF(lpefr->szFind))) { + DialogEnableWindow(hwnd, IDOK, FALSE); + DialogEnableWindow(hwnd, IDC_FINDPREV, FALSE); + DialogEnableWindow(hwnd, IDC_REPLACE, FALSE); + DialogEnableWindow(hwnd, IDC_REPLACEALL, FALSE); + DialogEnableWindow(hwnd, IDC_REPLACEINSEL, FALSE); + if (!GetDlgItemTextW2A(uCPEdit, hwnd, IDC_REPLACETEXT, lpefr->szReplace, COUNTOF(lpefr->szReplace))) + DialogEnableWindow(hwnd, IDC_SWAPSTRG, FALSE); + return TRUE; + } + + EditSetSearchFlags(hwnd, lpefr); + + if (bIsFindDlg) { + lpefr->bFindClose = (IsDlgButtonChecked(hwnd, IDC_FINDCLOSE) == BST_CHECKED) ? TRUE : FALSE; + } + else { + lpefr->bReplaceClose = (IsDlgButtonChecked(hwnd, IDC_FINDCLOSE) == BST_CHECKED) ? TRUE : FALSE; + } + + WCHAR tch[FNDRPL_BUFFER] = { L'\0' }; + + if (!bSwitchedFindReplace) { + // Save MRUs + if (StringCchLenA(lpefr->szFind, COUNTOF(lpefr->szFind))) { + if (GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8, COUNTOF(lpefr->szFindUTF8))) { + GetDlgItemText(hwnd, IDC_FINDTEXT, tch, COUNTOF(tch)); + MRU_Add(mruFind, tch, 0, 0, NULL); } } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - case IDC_WILDCARDSEARCH: - if (IsDlgButtonChecked(hwnd, IDC_WILDCARDSEARCH) == BST_CHECKED) - { - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); - DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); - - CheckDlgButton(hwnd, IDC_FINDREGEXP, BST_UNCHECKED); - lpefr->fuFlags |= SCFIND_NP3_REGEX; - lpefr->bWildcardSearch = TRUE; - } - else { - if (IsDlgButtonChecked(hwnd, IDC_FINDREGEXP) == BST_CHECKED) - { - lpefr->fuFlags |= SCFIND_NP3_REGEX; - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_CHECKED); - DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, FALSE); - } - else { - DialogEnableWindow(hwnd, IDC_FINDTRANSFORMBS, TRUE); - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, (lpefr->bTransformBS) ? BST_CHECKED : BST_UNCHECKED); - lpefr->fuFlags ^= SCFIND_NP3_REGEX; - } - lpefr->bWildcardSearch = FALSE; - } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - case IDC_FINDTRANSFORMBS: - if (IsDlgButtonChecked(hwnd, IDC_FINDTRANSFORMBS) == BST_CHECKED) { - lpefr->bTransformBS = TRUE; - } - else { - lpefr->bTransformBS = FALSE; - } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - case IDC_FINDCASE: - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - case IDC_FINDWORD: - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - case IDC_FINDSTART: - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; - - - case IDOK: - case IDC_FINDPREV: - case IDC_REPLACE: - case IDC_REPLACEALL: - case IDC_REPLACEINSEL: - case IDACC_SELTONEXT: - case IDACC_SELTOPREV: - case IDMSG_SWITCHTOFIND: - case IDMSG_SWITCHTOREPLACE: - { - BOOL bIsFindDlg = (GetDlgItem(hwnd, IDC_REPLACE) == NULL); - - if ((bIsFindDlg && LOWORD(wParam) == IDMSG_SWITCHTOREPLACE || - !bIsFindDlg && LOWORD(wParam) == IDMSG_SWITCHTOFIND)) { - GetDlgPos(hwnd, &xFindReplaceDlgSave, &yFindReplaceDlgSave); - bSwitchedFindReplace = TRUE; - CopyMemory(&efrSave, lpefr, sizeof(EDITFINDREPLACE)); - } - - // Get current code page for Unicode conversion - UINT uCPEdit = Encoding_SciGetCodePage(hwnd); - cpLastFind = uCPEdit; - - if (!bSwitchedFindReplace && - !GetDlgItemTextW2A(uCPEdit, hwnd, IDC_FINDTEXT, lpefr->szFind, COUNTOF(lpefr->szFind))) { - DialogEnableWindow(hwnd, IDOK, FALSE); - DialogEnableWindow(hwnd, IDC_FINDPREV, FALSE); - DialogEnableWindow(hwnd, IDC_REPLACE, FALSE); - DialogEnableWindow(hwnd, IDC_REPLACEALL, FALSE); - DialogEnableWindow(hwnd, IDC_REPLACEINSEL, FALSE); - if (!GetDlgItemTextW2A(uCPEdit, hwnd, IDC_REPLACETEXT, lpefr->szReplace, COUNTOF(lpefr->szReplace))) - DialogEnableWindow(hwnd, IDC_SWAPSTRG, FALSE); - return TRUE; - } - - EditSetSearchFlags(hwnd, lpefr); - - if (bIsFindDlg) { - lpefr->bFindClose = (IsDlgButtonChecked(hwnd, IDC_FINDCLOSE) == BST_CHECKED) ? TRUE : FALSE; - } - else { - lpefr->bReplaceClose = (IsDlgButtonChecked(hwnd, IDC_FINDCLOSE) == BST_CHECKED) ? TRUE : FALSE; - } - - WCHAR tch[FNDRPL_BUFFER] = { L'\0' }; - - if (!bSwitchedFindReplace) { - // Save MRUs - if (StringCchLenA(lpefr->szFind, COUNTOF(lpefr->szFind))) { - if (GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8, COUNTOF(lpefr->szFindUTF8))) { - GetDlgItemText(hwnd, IDC_FINDTEXT, tch, COUNTOF(tch)); - MRU_Add(mruFind, tch, 0, 0, NULL); - } - } - if (StringCchLenA(lpefr->szReplace, COUNTOF(lpefr->szReplace))) { - if (GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8))) { - GetDlgItemText(hwnd, IDC_REPLACETEXT, tch, COUNTOF(tch)); - MRU_Add(mruReplace, tch, 0, 0, NULL); - } - } - else - StringCchCopyA(lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8), ""); - } - else { - GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8, COUNTOF(lpefr->szFindUTF8)); - if (!GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8))) - StringCchCopyA(lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8), ""); - } - - // Reload MRUs - SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_RESETCONTENT, 0, 0); - SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_RESETCONTENT, 0, 0); - - for (int i = 0; i < MRU_Enum(mruFind, 0, NULL, 0); i++) { - MRU_Enum(mruFind, i, tch, COUNTOF(tch)); - SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_ADDSTRING, 0, (LPARAM)tch); - } - for (int i = 0; i < MRU_Enum(mruReplace, 0, NULL, 0); i++) { - MRU_Enum(mruReplace, i, tch, COUNTOF(tch)); - SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_ADDSTRING, 0, (LPARAM)tch); - } - - SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8); - SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8); - - if (!bSwitchedFindReplace) - SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)(GetFocus()), 1); - - BOOL bCloseDlg = FALSE; - if (bIsFindDlg) { - bCloseDlg = lpefr->bFindClose; - } - else if (LOWORD(wParam) != IDOK) { - bCloseDlg = lpefr->bReplaceClose; - } - - if (bCloseDlg) { - //EndDialog(hwnd,LOWORD(wParam)); - DestroyWindow(hwnd); - } - - switch (LOWORD(wParam)) { - case IDOK: // find next - case IDACC_SELTONEXT: - if (!bIsFindDlg) - bReplaceInitialized = TRUE; - EditFindNext(lpefr->hwnd, lpefr, LOWORD(wParam) == IDACC_SELTONEXT || HIBYTE(GetKeyState(VK_SHIFT))); - break; - - case IDC_FINDPREV: // find previous - case IDACC_SELTOPREV: - if (!bIsFindDlg) - bReplaceInitialized = TRUE; - EditFindPrev(lpefr->hwnd, lpefr, LOWORD(wParam) == IDACC_SELTOPREV || HIBYTE(GetKeyState(VK_SHIFT))); - break; - - case IDC_REPLACE: - bReplaceInitialized = TRUE; - EditReplace(lpefr->hwnd, lpefr); - break; - - case IDC_REPLACEALL: - bReplaceInitialized = TRUE; - EditReplaceAll(lpefr->hwnd, lpefr, TRUE); - break; - - case IDC_REPLACEINSEL: - bReplaceInitialized = TRUE; - EditReplaceAllInSelection(lpefr->hwnd, lpefr, TRUE); - break; + if (StringCchLenA(lpefr->szReplace, COUNTOF(lpefr->szReplace))) { + if (GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8))) { + GetDlgItemText(hwnd, IDC_REPLACETEXT, tch, COUNTOF(tch)); + MRU_Add(mruReplace, tch, 0, 0, NULL); } } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - break; + else + StringCchCopyA(lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8), ""); + } + else { + GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8, COUNTOF(lpefr->szFindUTF8)); + if (!GetDlgItemTextW2A(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8))) + StringCchCopyA(lpefr->szReplaceUTF8, COUNTOF(lpefr->szReplaceUTF8), ""); + } + // Reload MRUs + SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_RESETCONTENT, 0, 0); - case IDCANCEL: - //EndDialog(hwnd,IDCANCEL); + for (int i = 0; i < MRU_Enum(mruFind, 0, NULL, 0); i++) { + MRU_Enum(mruFind, i, tch, COUNTOF(tch)); + SendDlgItemMessage(hwnd, IDC_FINDTEXT, CB_ADDSTRING, 0, (LPARAM)tch); + } + for (int i = 0; i < MRU_Enum(mruReplace, 0, NULL, 0); i++) { + MRU_Enum(mruReplace, i, tch, COUNTOF(tch)); + SendDlgItemMessage(hwnd, IDC_REPLACETEXT, CB_ADDSTRING, 0, (LPARAM)tch); + } + + SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8); + SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_REPLACETEXT, lpefr->szReplaceUTF8); + + if (!bSwitchedFindReplace) + SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)(GetFocus()), 1); + + BOOL bCloseDlg = FALSE; + if (bIsFindDlg) { + bCloseDlg = lpefr->bFindClose; + } + else if (LOWORD(wParam) != IDOK) { + bCloseDlg = lpefr->bReplaceClose; + } + + if (bCloseDlg) { + //EndDialog(hwnd,LOWORD(wParam)); DestroyWindow(hwnd); + } + + switch (LOWORD(wParam)) { + case IDOK: // find next + case IDACC_SELTONEXT: + if (!bIsFindDlg) + bReplaceInitialized = TRUE; + EditFindNext(lpefr->hwnd, lpefr, LOWORD(wParam) == IDACC_SELTONEXT || HIBYTE(GetKeyState(VK_SHIFT))); break; - case IDC_SWAPSTRG: - { - WCHAR wszFind[FNDRPL_BUFFER] = { L'\0' }; - WCHAR wszRepl[FNDRPL_BUFFER] = { L'\0' }; - GetDlgItemTextW(hwnd, IDC_FINDTEXT, wszFind, COUNTOF(wszFind)); - GetDlgItemTextW(hwnd, IDC_REPLACETEXT, wszRepl, COUNTOF(wszRepl)); - SetDlgItemTextW(hwnd, IDC_FINDTEXT, wszRepl); - SetDlgItemTextW(hwnd, IDC_REPLACETEXT, wszFind); - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - } + case IDC_FINDPREV: // find previous + case IDACC_SELTOPREV: + if (!bIsFindDlg) + bReplaceInitialized = TRUE; + EditFindPrev(lpefr->hwnd, lpefr, LOWORD(wParam) == IDACC_SELTOPREV || HIBYTE(GetKeyState(VK_SHIFT))); break; - case IDC_CHECK_OCC: - { - bDoCheckAllOccurrences = !bDoCheckAllOccurrences; - CheckCmd(GetSystemMenu(hwnd, FALSE), IDS_CHECK_OCC, bDoCheckAllOccurrences); - if (bDoCheckAllOccurrences) { // switched ON - iSaveMarkOcc = iMarkOccurrences; - EnableCmd(GetMenu(hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, FALSE); - iMarkOccurrences = 0; - } - else { // switched OFF - if (iSaveMarkOcc >= 0) { - EnableCmd(GetMenu(hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, TRUE); - if (iSaveMarkOcc != 0) { - SendMessage(hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCURRENCES_ONOFF, 1), 0); - } - } - iSaveMarkOcc = -1; - } - bFlagsChanged = TRUE; - SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); - } + case IDC_REPLACE: + bReplaceInitialized = TRUE; + EditReplace(lpefr->hwnd, lpefr); break; - case IDACC_FIND: - PostMessage(GetParent(hwnd), WM_COMMAND, MAKELONG(IDM_EDIT_FIND, 1), 0); + case IDC_REPLACEALL: + bReplaceInitialized = TRUE; + EditReplaceAll(lpefr->hwnd, lpefr, TRUE); break; - case IDACC_REPLACE: - PostMessage(GetParent(hwnd), WM_COMMAND, MAKELONG(IDM_EDIT_REPLACE, 1), 0); - break; - - case IDACC_SAVEPOS: - GetDlgPos(hwnd, &xFindReplaceDlg, &yFindReplaceDlg); - break; - - case IDACC_RESETPOS: - CenterDlgInParent(hwnd); - xFindReplaceDlg = yFindReplaceDlg = 0; - break; - - case IDACC_FINDNEXT: - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDOK, 1), 0); - break; - - case IDACC_FINDPREV: - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_FINDPREV, 1), 0); - break; - - case IDACC_REPLACENEXT: - if (GetDlgItem(hwnd, IDC_REPLACE) != NULL) - PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_REPLACE, 1), 0); - break; - - case IDACC_SAVEFIND: - SendMessage(hwndMain, WM_COMMAND, MAKELONG(IDM_EDIT_SAVEFIND, 1), 0); - SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8); - CheckDlgButton(hwnd, IDC_FINDREGEXP, BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_WILDCARDSEARCH, BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_UNCHECKED); - PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)(GetDlgItem(hwnd, IDC_FINDTEXT)), 1); + case IDC_REPLACEINSEL: + bReplaceInitialized = TRUE; + EditReplaceAllInSelection(lpefr->hwnd, lpefr, TRUE); break; } - return TRUE; + } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + break; + + + case IDCANCEL: + //EndDialog(hwnd,IDCANCEL); + DestroyWindow(hwnd); + break; + + case IDC_SWAPSTRG: + { + WCHAR wszFind[FNDRPL_BUFFER] = { L'\0' }; + WCHAR wszRepl[FNDRPL_BUFFER] = { L'\0' }; + GetDlgItemTextW(hwnd, IDC_FINDTEXT, wszFind, COUNTOF(wszFind)); + GetDlgItemTextW(hwnd, IDC_REPLACETEXT, wszRepl, COUNTOF(wszRepl)); + SetDlgItemTextW(hwnd, IDC_FINDTEXT, wszRepl); + SetDlgItemTextW(hwnd, IDC_REPLACETEXT, wszFind); + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + } + break; + + case IDC_CHECK_OCC: + { + bDoCheckAllOccurrences = !bDoCheckAllOccurrences; + CheckCmd(GetSystemMenu(hwnd, FALSE), IDS_CHECK_OCC, bDoCheckAllOccurrences); + if (bDoCheckAllOccurrences) { // switched ON + iSaveMarkOcc = iMarkOccurrences; + EnableCmd(GetMenu(hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, FALSE); + iMarkOccurrences = 0; + } + else { // switched OFF + if (iSaveMarkOcc >= 0) { + EnableCmd(GetMenu(hwndMain), IDM_VIEW_MARKOCCURRENCES_ONOFF, TRUE); + if (iSaveMarkOcc != 0) { + SendMessage(hwndMain, WM_COMMAND, (WPARAM)MAKELONG(IDM_VIEW_MARKOCCURRENCES_ONOFF, 1), 0); + } + } + iSaveMarkOcc = -1; + } + bFlagsChanged = TRUE; + SetTimer(hwnd, IDT_TIMER_MRKALL, 100, NULL); + } + break; + + case IDACC_FIND: + PostMessage(GetParent(hwnd), WM_COMMAND, MAKELONG(IDM_EDIT_FIND, 1), 0); + break; + + case IDACC_REPLACE: + PostMessage(GetParent(hwnd), WM_COMMAND, MAKELONG(IDM_EDIT_REPLACE, 1), 0); + break; + + case IDACC_SAVEPOS: + GetDlgPos(hwnd, &xFindReplaceDlg, &yFindReplaceDlg); + break; + + case IDACC_RESETPOS: + CenterDlgInParent(hwnd); + xFindReplaceDlg = yFindReplaceDlg = 0; + break; + + case IDACC_FINDNEXT: + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDOK, 1), 0); + break; + + case IDACC_FINDPREV: + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_FINDPREV, 1), 0); + break; + + case IDACC_REPLACENEXT: + if (GetDlgItem(hwnd, IDC_REPLACE) != NULL) + PostMessage(hwnd, WM_COMMAND, MAKELONG(IDC_REPLACE, 1), 0); + break; + + case IDACC_SAVEFIND: + SendMessage(hwndMain, WM_COMMAND, MAKELONG(IDM_EDIT_SAVEFIND, 1), 0); + SetDlgItemTextA2W(CP_UTF8, hwnd, IDC_FINDTEXT, lpefr->szFindUTF8); + CheckDlgButton(hwnd, IDC_FINDREGEXP, BST_UNCHECKED); + CheckDlgButton(hwnd, IDC_WILDCARDSEARCH, BST_UNCHECKED); + CheckDlgButton(hwnd, IDC_FINDTRANSFORMBS, BST_UNCHECKED); + PostMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)(GetDlgItem(hwnd, IDC_FINDTEXT)), 1); + break; + + default: + //return FALSE; ??? + break; + } + + } // WM_COMMAND: + return TRUE; case WM_SYSCOMMAND: @@ -5141,6 +5149,9 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA MsgBox(MBINFO, IDS_WILDCARDHELP); } break; + + default: + return FALSE; } } break; @@ -5185,8 +5196,8 @@ INT_PTR CALLBACK EditFindReplaceDlgProcW(HWND hwnd,UINT umsg,WPARAM wParam,LPARA } return DefWindowProc(hwnd, umsg, wParam, lParam); - } // WM_COMMAND: - break; + default: + break; } // switch(umsg) diff --git a/src/Notepad3.c b/src/Notepad3.c index e59cfaf07..33f7ff3de 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -657,8 +657,8 @@ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpCmdLine,int n while (GetMessage(&msg,NULL,0,0)) { - if (IsWindow(hDlgFindReplace) && (msg.hwnd == hDlgFindReplace || IsChild(hDlgFindReplace,msg.hwnd))) - if (IsDialogMessage(hDlgFindReplace,&msg) || TranslateAccelerator(hDlgFindReplace,hAccFindReplace,&msg)) + if (IsWindow(hDlgFindReplace) && (msg.hwnd == hDlgFindReplace || IsChild(hDlgFindReplace, msg.hwnd))) + if (TranslateAccelerator(hDlgFindReplace, hAccFindReplace, &msg) || IsDialogMessage(hDlgFindReplace, &msg)) continue; if (!TranslateAccelerator(hwnd,hAccMain,&msg)) {