diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 98baef60e..73e30f2c3 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -1458,7 +1458,7 @@ bool Notepad_plus::replaceInFiles() { if (filesCount >= 200) filesPerPercent = filesCount / 100; - progress.open(NULL, TEXT("Replace In Files progress...")); + progress.open(_findReplaceDlg.getHSelf(), TEXT("Replace In Files progress...")); } for (size_t i = 0, updateOnCount = filesPerPercent; i < filesCount; ++i) @@ -1496,6 +1496,7 @@ bool Notepad_plus::replaceInFiles() { updateOnCount += filesPerPercent; progress.setPercent((i * 100) / filesCount, fileNames.at(i).c_str()); + progress.flushCallerUserInput(); } else { @@ -1504,6 +1505,7 @@ bool Notepad_plus::replaceInFiles() } progress.close(); + progress.flushCallerUserInput(); _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); _invisibleEditView.setCurrentBuffer(oldBuf); @@ -1553,7 +1555,7 @@ bool Notepad_plus::findInFiles() { if (filesCount >= 200) filesPerPercent = filesCount / 100; - progress.open(NULL, TEXT("Find In Files progress...")); + progress.open(_findReplaceDlg.getHSelf(), TEXT("Find In Files progress...")); } for (size_t i = 0, updateOnCount = filesPerPercent; i < filesCount; ++i) @@ -1583,6 +1585,7 @@ bool Notepad_plus::findInFiles() { updateOnCount += filesPerPercent; progress.setPercent((i * 100) / filesCount, fileNames.at(i).c_str()); + progress.flushCallerUserInput(); } else { @@ -1591,6 +1594,7 @@ bool Notepad_plus::findInFiles() } progress.close(); + progress.flushCallerUserInput(); _findReplaceDlg.finishFilesSearch(nbTotal); diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp index 9cdacaded..70b1d52e3 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -2917,7 +2917,7 @@ const int Progress::cBTNheight = 25; volatile LONG Progress::refCount = 0; -Progress::Progress(HINSTANCE hInst) : _hwnd(NULL) +Progress::Progress(HINSTANCE hInst) : _hwnd(NULL), _hCallerWnd(NULL) { if (::InterlockedIncrement(&refCount) == 1) { @@ -2955,23 +2955,26 @@ Progress::~Progress() } -HWND Progress::open(HWND hOwner, const TCHAR* header) +HWND Progress::open(HWND hCallerWnd, const TCHAR* header) { if (_hwnd) return _hwnd; - _hOwner = hOwner; + // Create manually reset non-signaled event + _hActiveState = ::CreateEvent(NULL, TRUE, FALSE, NULL); + if (!_hActiveState) + return NULL; + + _hCallerWnd = hCallerWnd; + + for (HWND hwnd = _hCallerWnd; hwnd; hwnd = ::GetParent(hwnd)) + ::UpdateWindow(hwnd); if (header) _tcscpy_s(_header, _countof(_header), header); else _tcscpy_s(_header, _countof(_header), cDefaultHeader); - // Create manually reset non-signaled event - _hActiveState = ::CreateEvent(NULL, TRUE, FALSE, NULL); - if (!_hActiveState) - return NULL; - _hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc, (LPVOID)this, 0, NULL); if (!_hThread) @@ -2995,11 +2998,17 @@ HWND Progress::open(HWND hOwner, const TCHAR* header) } -bool Progress::isCancelled() const +void Progress::close() { if (_hwnd) - return (::WaitForSingleObject(_hActiveState, 0) != WAIT_OBJECT_0); - return false; + { + ::SendMessage(_hwnd, WM_CLOSE, 0, 0); + _hwnd = NULL; + ::WaitForSingleObject(_hThread, INFINITE); + + ::CloseHandle(_hThread); + ::CloseHandle(_hActiveState); + } } @@ -3007,21 +3016,22 @@ void Progress::setPercent(unsigned percent, const TCHAR *fileName) const { if (_hwnd) { - ::SendNotifyMessage(_hPBar, PBM_SETPOS, (WPARAM)percent, 0); + ::PostMessage(_hPBar, PBM_SETPOS, (WPARAM)percent, 0); ::SendMessage(_hPText, WM_SETTEXT, 0, (LPARAM)fileName); } } -void Progress::close() +void Progress::flushCallerUserInput() const { - if (_hwnd) + MSG msg; + for (HWND hwnd = _hCallerWnd; hwnd; hwnd = ::GetParent(hwnd)) { - ::SendMessage(_hwnd, WM_CLOSE, 0, 0); - _hwnd = NULL; - ::WaitForSingleObject(_hThread, INFINITE); - ::CloseHandle(_hThread); - ::CloseHandle(_hActiveState); + if (::PeekMessage(&msg, hwnd, 0, 0, PM_QS_INPUT | PM_REMOVE)) + { + while (::PeekMessage(&msg, hwnd, 0, 0, PM_QS_INPUT | PM_REMOVE)); + ::UpdateWindow(hwnd); + } } } @@ -3054,14 +3064,11 @@ int Progress::thread() int Progress::createProgressWindow() { - DWORD styleEx = WS_EX_OVERLAPPEDWINDOW; - if (_hOwner) - styleEx |= WS_EX_TOOLWINDOW; - - _hwnd = ::CreateWindowEx(styleEx, + _hwnd = ::CreateWindowEx( + WS_EX_TOOLWINDOW | WS_EX_OVERLAPPEDWINDOW | WS_EX_TOPMOST, cClassName, _header, WS_POPUP | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - _hOwner, NULL, _hInst, (LPVOID)this); + NULL, NULL, _hInst, (LPVOID)this); if (!_hwnd) return -1; @@ -3094,7 +3101,6 @@ int Progress::createProgressWindow() (width - cBTNwidth) / 2, height - cBTNheight - 5, cBTNwidth, cBTNheight, _hwnd, NULL, _hInst, NULL); - if (hf) ::SendMessage(_hBtn, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h index 3a638b7f8..92a35fb4f 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h @@ -410,15 +410,24 @@ public: Progress(HINSTANCE hInst); ~Progress(); - HWND open(HWND hOwner = NULL, const TCHAR* header = NULL); - bool isCancelled() const; - void setPercent(unsigned percent, const TCHAR *fileName) const; - void setInfo(const TCHAR *info) const { + HWND open(HWND hCallerWnd = NULL, const TCHAR* header = NULL); + void close(); + + bool isCancelled() const + { + if (_hwnd) + return (::WaitForSingleObject(_hActiveState, 0) != WAIT_OBJECT_0); + return false; + } + + void setInfo(const TCHAR *info) const + { if (_hwnd) ::SendMessage(_hPText, WM_SETTEXT, 0, (LPARAM)info); - }; + } - void close(); + void setPercent(unsigned percent, const TCHAR *fileName) const; + void flushCallerUserInput() const; private: static const TCHAR cClassName[]; @@ -444,7 +453,7 @@ private: HINSTANCE _hInst; volatile HWND _hwnd; - HWND _hOwner; + HWND _hCallerWnd; TCHAR _header[128]; HANDLE _hThread; HANDLE _hActiveState;