1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "resource.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialog.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
14*f6dc9357SAndroid Build Coastguard Worker
15*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 3;
16*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse = 100;
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
19*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #endif
21*f6dc9357SAndroid Build Coastguard Worker
ProcessStopAndPause()22*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::ProcessStopAndPause()
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker for (;;)
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker if (GetStopped())
27*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
28*f6dc9357SAndroid Build Coastguard Worker if (!GetPaused())
29*f6dc9357SAndroid Build Coastguard Worker break;
30*f6dc9357SAndroid Build Coastguard Worker ::Sleep(100);
31*f6dc9357SAndroid Build Coastguard Worker }
32*f6dc9357SAndroid Build Coastguard Worker return S_OK;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
~CProgressDialog()36*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::~CProgressDialog()
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker AddToTitle(L"");
39*f6dc9357SAndroid Build Coastguard Worker }
AddToTitle(LPCWSTR s)40*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::AddToTitle(LPCWSTR s)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker if (MainWindow != 0)
43*f6dc9357SAndroid Build Coastguard Worker MySetWindowText(MainWindow, UString(s) + MainTitle);
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker #endif
46*f6dc9357SAndroid Build Coastguard Worker
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker #define UNDEFINED_VAL ((UInt64)(Int64)-1)
49*f6dc9357SAndroid Build Coastguard Worker
OnInit()50*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnInit()
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker _range = UNDEFINED_VAL;
53*f6dc9357SAndroid Build Coastguard Worker _prevPercentValue = UNDEFINED_VAL;
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker _wasCreated = true;
56*f6dc9357SAndroid Build Coastguard Worker _dialogCreatedEvent.Set();
57*f6dc9357SAndroid Build Coastguard Worker
58*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
59*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItems(*this, NULL, 0);
60*f6dc9357SAndroid Build Coastguard Worker #endif
61*f6dc9357SAndroid Build Coastguard Worker
62*f6dc9357SAndroid Build Coastguard Worker m_ProgressBar.Attach(GetItem(IDC_PROGRESS1));
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker if (IconID >= 0)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID));
67*f6dc9357SAndroid Build Coastguard Worker SetIcon(ICON_BIG, icon);
68*f6dc9357SAndroid Build Coastguard Worker }
69*f6dc9357SAndroid Build Coastguard Worker
70*f6dc9357SAndroid Build Coastguard Worker _timer = SetTimer(kTimerID, kTimerElapse);
71*f6dc9357SAndroid Build Coastguard Worker SetText(_title);
72*f6dc9357SAndroid Build Coastguard Worker CheckNeedClose();
73*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnInit();
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker
OnCancel()76*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnCancel() { Sync.SetStopped(true); }
OnOK()77*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnOK() { }
78*f6dc9357SAndroid Build Coastguard Worker
SetRange(UInt64 range)79*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetRange(UInt64 range)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker _range = range;
82*f6dc9357SAndroid Build Coastguard Worker _peviousPos = (UInt64)(Int64)-1;
83*f6dc9357SAndroid Build Coastguard Worker _converter.Init(range);
84*f6dc9357SAndroid Build Coastguard Worker m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100%
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker
SetPos(UInt64 pos)87*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetPos(UInt64 pos)
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker bool redraw = true;
90*f6dc9357SAndroid Build Coastguard Worker if (pos < _range && pos > _peviousPos)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker UInt64 posDelta = pos - _peviousPos;
93*f6dc9357SAndroid Build Coastguard Worker if (posDelta < (_range >> 10))
94*f6dc9357SAndroid Build Coastguard Worker redraw = false;
95*f6dc9357SAndroid Build Coastguard Worker }
96*f6dc9357SAndroid Build Coastguard Worker if (redraw)
97*f6dc9357SAndroid Build Coastguard Worker {
98*f6dc9357SAndroid Build Coastguard Worker m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100%
99*f6dc9357SAndroid Build Coastguard Worker _peviousPos = pos;
100*f6dc9357SAndroid Build Coastguard Worker }
101*f6dc9357SAndroid Build Coastguard Worker }
102*f6dc9357SAndroid Build Coastguard Worker
OnTimer(WPARAM,LPARAM)103*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)
104*f6dc9357SAndroid Build Coastguard Worker {
105*f6dc9357SAndroid Build Coastguard Worker if (Sync.GetPaused())
106*f6dc9357SAndroid Build Coastguard Worker return true;
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker CheckNeedClose();
109*f6dc9357SAndroid Build Coastguard Worker
110*f6dc9357SAndroid Build Coastguard Worker UInt64 total, completed;
111*f6dc9357SAndroid Build Coastguard Worker Sync.GetProgress(total, completed);
112*f6dc9357SAndroid Build Coastguard Worker if (total != _range)
113*f6dc9357SAndroid Build Coastguard Worker SetRange(total);
114*f6dc9357SAndroid Build Coastguard Worker SetPos(completed);
115*f6dc9357SAndroid Build Coastguard Worker
116*f6dc9357SAndroid Build Coastguard Worker if (total == 0)
117*f6dc9357SAndroid Build Coastguard Worker total = 1;
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker const UInt64 percentValue = completed * 100 / total;
120*f6dc9357SAndroid Build Coastguard Worker if (percentValue != _prevPercentValue)
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker wchar_t s[64];
123*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(percentValue, s);
124*f6dc9357SAndroid Build Coastguard Worker UString title = s;
125*f6dc9357SAndroid Build Coastguard Worker title += "% ";
126*f6dc9357SAndroid Build Coastguard Worker SetText(title + _title);
127*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
128*f6dc9357SAndroid Build Coastguard Worker AddToTitle(title + MainAddTitle);
129*f6dc9357SAndroid Build Coastguard Worker #endif
130*f6dc9357SAndroid Build Coastguard Worker _prevPercentValue = percentValue;
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker return true;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)135*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker switch (message)
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker case kCloseMessage:
140*f6dc9357SAndroid Build Coastguard Worker {
141*f6dc9357SAndroid Build Coastguard Worker if (_timer)
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker KillTimer(kTimerID);
144*f6dc9357SAndroid Build Coastguard Worker _timer = 0;
145*f6dc9357SAndroid Build Coastguard Worker }
146*f6dc9357SAndroid Build Coastguard Worker if (_inCancelMessageBox)
147*f6dc9357SAndroid Build Coastguard Worker {
148*f6dc9357SAndroid Build Coastguard Worker _externalCloseMessageWasReceived = true;
149*f6dc9357SAndroid Build Coastguard Worker break;
150*f6dc9357SAndroid Build Coastguard Worker }
151*f6dc9357SAndroid Build Coastguard Worker return OnExternalCloseMessage();
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker /*
154*f6dc9357SAndroid Build Coastguard Worker case WM_SETTEXT:
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker if (_timer == 0)
157*f6dc9357SAndroid Build Coastguard Worker return true;
158*f6dc9357SAndroid Build Coastguard Worker }
159*f6dc9357SAndroid Build Coastguard Worker */
160*f6dc9357SAndroid Build Coastguard Worker }
161*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnMessage(message, wParam, lParam);
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker
OnButtonClicked(unsigned buttonID,HWND buttonHWND)164*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
165*f6dc9357SAndroid Build Coastguard Worker {
166*f6dc9357SAndroid Build Coastguard Worker switch (buttonID)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker case IDCANCEL:
169*f6dc9357SAndroid Build Coastguard Worker {
170*f6dc9357SAndroid Build Coastguard Worker bool paused = Sync.GetPaused();
171*f6dc9357SAndroid Build Coastguard Worker Sync.SetPaused(true);
172*f6dc9357SAndroid Build Coastguard Worker _inCancelMessageBox = true;
173*f6dc9357SAndroid Build Coastguard Worker int res = ::MessageBoxW(*this, L"Are you sure you want to cancel?", _title, MB_YESNOCANCEL);
174*f6dc9357SAndroid Build Coastguard Worker _inCancelMessageBox = false;
175*f6dc9357SAndroid Build Coastguard Worker Sync.SetPaused(paused);
176*f6dc9357SAndroid Build Coastguard Worker if (res == IDCANCEL || res == IDNO)
177*f6dc9357SAndroid Build Coastguard Worker {
178*f6dc9357SAndroid Build Coastguard Worker if (_externalCloseMessageWasReceived)
179*f6dc9357SAndroid Build Coastguard Worker OnExternalCloseMessage();
180*f6dc9357SAndroid Build Coastguard Worker return true;
181*f6dc9357SAndroid Build Coastguard Worker }
182*f6dc9357SAndroid Build Coastguard Worker break;
183*f6dc9357SAndroid Build Coastguard Worker }
184*f6dc9357SAndroid Build Coastguard Worker }
185*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker
CheckNeedClose()188*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::CheckNeedClose()
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker if (_needClose)
191*f6dc9357SAndroid Build Coastguard Worker {
192*f6dc9357SAndroid Build Coastguard Worker PostMsg(kCloseMessage);
193*f6dc9357SAndroid Build Coastguard Worker _needClose = false;
194*f6dc9357SAndroid Build Coastguard Worker }
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker
OnExternalCloseMessage()197*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnExternalCloseMessage()
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker End(0);
200*f6dc9357SAndroid Build Coastguard Worker return true;
201*f6dc9357SAndroid Build Coastguard Worker }
202