diff options
Diffstat (limited to 'CPP/7zip/UI/FileManager/ProgressDialog.cpp')
-rwxr-xr-x | CPP/7zip/UI/FileManager/ProgressDialog.cpp | 114 |
1 files changed, 65 insertions, 49 deletions
diff --git a/CPP/7zip/UI/FileManager/ProgressDialog.cpp b/CPP/7zip/UI/FileManager/ProgressDialog.cpp index 5be77a8f..cdb8399e 100755 --- a/CPP/7zip/UI/FileManager/ProgressDialog.cpp +++ b/CPP/7zip/UI/FileManager/ProgressDialog.cpp @@ -1,15 +1,19 @@ // ProgressDialog.cpp #include "StdAfx.h" + +#include "Common/IntToString.h" + #include "resource.h" + #include "ProgressDialog.h" -#include "Common/IntToString.h" -#include "Common/IntToString.h" using namespace NWindows; +extern HINSTANCE g_hInstance; + static const UINT_PTR kTimerID = 3; -static const UINT kTimerElapse = 50; +static const UINT kTimerElapse = 100; #ifdef LANG #include "LangUtils.h" @@ -22,7 +26,7 @@ static CIDLangPair kIDLangPairs[] = }; #endif -HRESULT CProgressSynch::ProcessStopAndPause() +HRESULT CProgressSync::ProcessStopAndPause() { for (;;) { @@ -48,30 +52,37 @@ void CProgressDialog::AddToTitle(LPCWSTR s) #endif - bool CProgressDialog::OnInit() { - _range = UINT64(-1); + _range = (UInt64)-1; _prevPercentValue = -1; + _wasCreated = true; + _dialogCreatedEvent.Set(); + #ifdef LANG // LangSetWindowText(HWND(*this), 0x02000C00); LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0])); #endif m_ProgressBar.Attach(GetItem(IDC_PROGRESS1)); + + if (IconID >= 0) + { + HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID)); + SetIcon(ICON_BIG, icon); + } + _timer = SetTimer(kTimerID, kTimerElapse); - _dialogCreatedEvent.Set(); SetText(_title); + CheckNeedClose(); return CModalDialog::OnInit(); } -void CProgressDialog::OnCancel() -{ - ProgressSynch.SetStopped(true); -} +void CProgressDialog::OnCancel() { Sync.SetStopped(true); } +void CProgressDialog::OnOK() { } -void CProgressDialog::SetRange(UINT64 range) +void CProgressDialog::SetRange(UInt64 range) { _range = range; _peviousPos = (UInt64)(Int64)-1; @@ -79,16 +90,16 @@ void CProgressDialog::SetRange(UINT64 range) m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100% } -void CProgressDialog::SetPos(UINT64 pos) +void CProgressDialog::SetPos(UInt64 pos) { bool redraw = true; if (pos < _range && pos > _peviousPos) { - UINT64 posDelta = pos - _peviousPos; + UInt64 posDelta = pos - _peviousPos; if (posDelta < (_range >> 10)) redraw = false; } - if(redraw) + if (redraw) { m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100% _peviousPos = pos; @@ -97,10 +108,13 @@ void CProgressDialog::SetPos(UINT64 pos) bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { - if (ProgressSynch.GetPaused()) + if (Sync.GetPaused()) return true; - UINT64 total, completed; - ProgressSynch.GetProgress(total, completed); + + CheckNeedClose(); + + UInt64 total, completed; + Sync.GetProgress(total, completed); if (total != _range) SetRange(total); SetPos(completed); @@ -124,29 +138,6 @@ bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */) return true; } - -//////////////////// -// CU64ToI32Converter - -static const UINT64 kMaxIntValue = 0x7FFFFFFF; - -void CU64ToI32Converter::Init(UINT64 range) -{ - _numShiftBits = 0; - while(range > kMaxIntValue) - { - range >>= 1; - _numShiftBits++; - } -} - -int CU64ToI32Converter::Count(UINT64 aValue) -{ - return int(aValue >> _numShiftBits); -} - -const UINT CProgressDialog::kCloseMessage = WM_USER + 1; - bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) @@ -155,14 +146,20 @@ bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { KillTimer(_timer); _timer = 0; - End(0); - return true; + if (_inCancelMessageBox) + { + _externalCloseMessageWasReceived = true; + break; + } + return OnExternalCloseMessage(); } + /* case WM_SETTEXT: { if (_timer == 0) return true; } + */ } return CModalDialog::OnMessage(message, wParam, lParam); } @@ -173,16 +170,35 @@ bool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { case IDCANCEL: { - bool paused = ProgressSynch.GetPaused();; - ProgressSynch.SetPaused(true); - int res = ::MessageBoxW(HWND(*this), - L"Are you sure you want to cancel?", - _title, MB_YESNOCANCEL); - ProgressSynch.SetPaused(paused); + bool paused = Sync.GetPaused(); + Sync.SetPaused(true); + _inCancelMessageBox = true; + int res = ::MessageBoxW(HWND(*this), L"Are you sure you want to cancel?", _title, MB_YESNOCANCEL); + _inCancelMessageBox = false; + Sync.SetPaused(paused); if (res == IDCANCEL || res == IDNO) + { + if (_externalCloseMessageWasReceived) + OnExternalCloseMessage(); return true; + } break; } } return CModalDialog::OnButtonClicked(buttonID, buttonHWND); } + +void CProgressDialog::CheckNeedClose() +{ + if (_needClose) + { + PostMessage(kCloseMessage); + _needClose = false; + } +} + +bool CProgressDialog::OnExternalCloseMessage() +{ + End(0); + return true; +} |