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/Helpers.c b/src/Helpers.c index 925a3fc74..7034ccc44 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -3580,5 +3580,358 @@ INT UTF8_mbslen(LPCSTR source,INT byte_length) return wchar_length; } +/////////////////////////////////////////////////////////////////////////////// +// +// Drag N Drop helpers +// +/////////////////////////////////////////////////////////////////////////////// + +static HANDLE g_hHeap = NULL; + +typedef struct tIDROPTARGET { + IDropTarget idt; + LONG lRefCount; + ULONG lNumFormats; + CLIPFORMAT *pFormat; + HWND hWnd; + BOOL bAllowDrop; + DWORD dwKeyState; + IDataObject *pDataObject; + UINT nMsg; + void *pUserData; + DNDCALLBACK pDropProc; +} +IDROPTARGET, *PIDROPTARGET; + + +typedef struct IDRPTRG_VTBL +{ + BEGIN_INTERFACE + 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; + + +//============================================================================= +// +// DragAndDropInit() +// +void DragAndDropInit(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; +} + + +//============================================================================= +// +// GetDnDHeap() +// +static HANDLE GetDnDHeap() +{ + if (g_hHeap == NULL) { + g_hHeap = GetProcessHeap(); + } + return g_hHeap; +} + + +//============================================================================= +// +// IDRPTRG_AddRef() +// +static ULONG STDMETHODCALLTYPE IDRPTRG_AddRef(PIDROPTARGET pThis) +{ + return InterlockedIncrement(&pThis->lRefCount); +} + + +//============================================================================= +// +// IDRPTRG_QueryDataObject() +// +static BOOL IDRPTRG_QueryDataObject(PIDROPTARGET 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(PIDROPTARGET 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(PIDROPTARGET pThis) +{ + ULONG nCount; + + if ((nCount = InterlockedDecrement(&pThis->lRefCount)) == 0) + { + HeapFree(GetDnDHeap(), 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(PIDROPTARGET 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(PIDROPTARGET 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(PIDROPTARGET pThis) +{ + UNUSED(pThis); + return S_OK; +} + + +//============================================================================= +// +// IDRPTRG_Drop() +// +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; + DROPDATA 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; +} + + +//============================================================================= +// +// 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), + void *pUserData) +{ + PIDROPTARGET pRet; + static IDRPTRG_VTBL idt_vtbl = { + IDRPTRG_QueryInterface, + IDRPTRG_AddRef, + IDRPTRG_Release, + IDRPTRG_DragEnter, + IDRPTRG_DragOver, + IDRPTRG_DragLeave, + IDRPTRG_Drop }; + + 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; + 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; +} + + + +//============================================================================= +// +// RegisterDragAndDrop() +// +PDROPTARGET RegisterDragAndDrop(HWND hWnd, CLIPFORMAT *pFormat, ULONG lFmt, UINT nMsg, DNDCALLBACK pDropProc, void *pUserData) +{ + IDropTarget *pTarget; + + if ((pTarget = CreateDropTarget(pFormat, lFmt, hWnd, nMsg, pDropProc, pUserData)) == NULL) + return NULL; + + if (RegisterDragDrop(hWnd, pTarget) != S_OK) + { + HeapFree(GetDnDHeap(), 0, pTarget); + return NULL; + } + + return (PDROPTARGET)pTarget; +} + + +//============================================================================= +// +// RevokeDragAndDrop() +// +PDROPTARGET RevokeDragAndDrop(PDROPTARGET pTarget) +{ + if (pTarget == NULL) + return NULL; + + if (((PIDROPTARGET)pTarget)->hWnd != NULL) + { + if (GetWindowLongPtr(((PIDROPTARGET)pTarget)->hWnd, GWLP_WNDPROC) != 0) + RevokeDragDrop(((PIDROPTARGET)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..15ae6c687 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 tDROPDATA +{ + CLIPFORMAT cf; + POINTL pt; + DWORD dwKeyState; + HGLOBAL hData; +} +DROPDATA, *PDROPDATA; + +typedef struct tDROPTARGET *PDROPTARGET; +typedef DWORD(*DNDCALLBACK)(CLIPFORMAT cf, HGLOBAL hData, HWND hWnd, DWORD dwKeyState, POINTL pt, void *pUserData); + +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_ /// End of Helpers.h \\\ diff --git a/src/Notepad3.c b/src/Notepad3.c index e59cfaf07..65415bc31 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 PDROPTARGET 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 + DragAndDropInit(NULL); + if (IsVista()) { SciCall_UnBufferedDraw(); // Current platforms perform window buffering so it is almost always better for this option to be turned off. if (iSciDirectWriteTech >= 0) @@ -657,8 +667,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)) { @@ -1169,7 +1179,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); @@ -1406,6 +1415,7 @@ LRESULT MsgCreate(HWND hwnd,WPARAM wParam,LPARAM lParam) // Drag & Drop DragAcceptFiles(hwnd,TRUE); + pDropTarget = RegisterDragAndDrop(hwnd, &cfDrpF, 1, WM_NULL, DropFilesProc, (void*)hwndEdit); // File MRU pFileMRU = MRU_Create(L"Recent Files",MRU_NOCASE,32); @@ -1628,6 +1638,7 @@ void MsgEndSession(HWND hwnd, UINT umsg) wininfo = GetMyWindowPlacement(hwnd, NULL); DragAcceptFiles(hwnd, FALSE); + RevokeDragAndDrop(pDropTarget); // Terminate clipboard watching if (flagPasteBoard) { @@ -1849,9 +1860,11 @@ 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 + // 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) MsgBox(MBWARN, IDS_ERR_DROP); @@ -1862,6 +1875,51 @@ 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) +{ + DWORD dwEffect = DROPEFFECT_NONE; + + //HWND hEditWnd = (HWND)pUserData; + UNUSED(pUserData); + + if (cf == CF_HDROP) + { + WCHAR szBuf[MAX_PATH + 40]; + HDROP hDrop = (HDROP)hData; + + if (IsIconic(hWnd)) + ShowWindow(hWnd, SW_RESTORE); + + 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; + } + + UNUSED(dwKeyState); + UNUSED(pt); + + return dwEffect; +} + + + //============================================================================= // // MsgCopyData() - Handles WM_COPYDATA diff --git a/src/Notepad3.rc b/src/Notepad3.rc index eaede8a2d..d60b7750e 100644 Binary files a/src/Notepad3.rc and b/src/Notepad3.rc differ 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