Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/FileManager/ProgressDialog.cpp')
-rwxr-xr-xCPP/7zip/UI/FileManager/ProgressDialog.cpp114
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;
+}