xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog2.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_OLD_WIN_SDK
6*f6dc9357SAndroid Build Coastguard Worker #include <ShlGuid.h>
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Clipboard.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker #include "../GUI/ExtractRes.h"
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #include "LangUtils.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker #include "DialogSize.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialog2.h"
21*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialog2Res.h"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
26*f6dc9357SAndroid Build Coastguard Worker extern bool g_DisableUserQuestions;
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 3;
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker static const UINT kCloseMessage = WM_APP + 1;
31*f6dc9357SAndroid Build Coastguard Worker // we can't use WM_USER, since WM_USER can be used by standard Windows procedure for Dialog
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse =
34*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
35*f6dc9357SAndroid Build Coastguard Worker   500
36*f6dc9357SAndroid Build Coastguard Worker   #else
37*f6dc9357SAndroid Build Coastguard Worker   200
38*f6dc9357SAndroid Build Coastguard Worker   #endif
39*f6dc9357SAndroid Build Coastguard Worker   ;
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker static const UINT kCreateDelay =
42*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
43*f6dc9357SAndroid Build Coastguard Worker   2500
44*f6dc9357SAndroid Build Coastguard Worker   #else
45*f6dc9357SAndroid Build Coastguard Worker   500
46*f6dc9357SAndroid Build Coastguard Worker   #endif
47*f6dc9357SAndroid Build Coastguard Worker   ;
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker static const DWORD kPauseSleepTime = 100;
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_ELAPSED,
56*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_REMAINING,
57*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_TOTAL,
58*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_SPEED,
59*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_PROCESSED,
60*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_RATIO,
61*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_ERRORS,
62*f6dc9357SAndroid Build Coastguard Worker   IDB_PROGRESS_BACKGROUND,
63*f6dc9357SAndroid Build Coastguard Worker   IDB_PAUSE
64*f6dc9357SAndroid Build Coastguard Worker };
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs_Colon[] =
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_PACKED,
69*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_FILES
70*f6dc9357SAndroid Build Coastguard Worker };
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker #endif
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker #define UNDEFINED_VAL         ((UInt64)(Int64)-1)
76*f6dc9357SAndroid Build Coastguard Worker #define INIT_AS_UNDEFINED(v)  v = UNDEFINED_VAL;
77*f6dc9357SAndroid Build Coastguard Worker #define IS_UNDEFINED_VAL(v)   ((v) == UNDEFINED_VAL)
78*f6dc9357SAndroid Build Coastguard Worker #define IS_DEFINED_VAL(v)     ((v) != UNDEFINED_VAL)
79*f6dc9357SAndroid Build Coastguard Worker 
CProgressSync()80*f6dc9357SAndroid Build Coastguard Worker CProgressSync::CProgressSync():
81*f6dc9357SAndroid Build Coastguard Worker     _stopped(false),
82*f6dc9357SAndroid Build Coastguard Worker     _paused(false),
83*f6dc9357SAndroid Build Coastguard Worker     _filesProgressMode(false),
84*f6dc9357SAndroid Build Coastguard Worker     _isDir(false),
85*f6dc9357SAndroid Build Coastguard Worker     _totalBytes(UNDEFINED_VAL), _completedBytes(0),
86*f6dc9357SAndroid Build Coastguard Worker     _totalFiles(UNDEFINED_VAL), _curFiles(0),
87*f6dc9357SAndroid Build Coastguard Worker     _inSize(UNDEFINED_VAL),
88*f6dc9357SAndroid Build Coastguard Worker     _outSize(UNDEFINED_VAL)
89*f6dc9357SAndroid Build Coastguard Worker     {}
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker #define CHECK_STOP  if (_stopped) return E_ABORT; if (!_paused) return S_OK;
92*f6dc9357SAndroid Build Coastguard Worker #define CRITICAL_LOCK NSynchronization::CCriticalSectionLock lock(_cs);
93*f6dc9357SAndroid Build Coastguard Worker 
Get_Paused()94*f6dc9357SAndroid Build Coastguard Worker bool CProgressSync::Get_Paused()
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
97*f6dc9357SAndroid Build Coastguard Worker   return _paused;
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker 
CheckStop()100*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::CheckStop()
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker   for (;;)
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     {
105*f6dc9357SAndroid Build Coastguard Worker       CRITICAL_LOCK
106*f6dc9357SAndroid Build Coastguard Worker       CHECK_STOP
107*f6dc9357SAndroid Build Coastguard Worker     }
108*f6dc9357SAndroid Build Coastguard Worker     ::Sleep(kPauseSleepTime);
109*f6dc9357SAndroid Build Coastguard Worker   }
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker 
Clear_Stop_Status()112*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Clear_Stop_Status()
113*f6dc9357SAndroid Build Coastguard Worker {
114*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
115*f6dc9357SAndroid Build Coastguard Worker   if (_stopped)
116*f6dc9357SAndroid Build Coastguard Worker     _stopped = false;
117*f6dc9357SAndroid Build Coastguard Worker }
118*f6dc9357SAndroid Build Coastguard Worker 
ScanProgress(UInt64 numFiles,UInt64 totalSize,const FString & fileName,bool isDir)119*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::ScanProgress(UInt64 numFiles, UInt64 totalSize, const FString &fileName, bool isDir)
120*f6dc9357SAndroid Build Coastguard Worker {
121*f6dc9357SAndroid Build Coastguard Worker   {
122*f6dc9357SAndroid Build Coastguard Worker     CRITICAL_LOCK
123*f6dc9357SAndroid Build Coastguard Worker     _totalFiles = numFiles;
124*f6dc9357SAndroid Build Coastguard Worker     _totalBytes = totalSize;
125*f6dc9357SAndroid Build Coastguard Worker     _filePath = fs2us(fileName);
126*f6dc9357SAndroid Build Coastguard Worker     _isDir = isDir;
127*f6dc9357SAndroid Build Coastguard Worker     // _completedBytes = 0;
128*f6dc9357SAndroid Build Coastguard Worker     CHECK_STOP
129*f6dc9357SAndroid Build Coastguard Worker   }
130*f6dc9357SAndroid Build Coastguard Worker   return CheckStop();
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker 
Set_NumFilesTotal(UInt64 val)133*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::Set_NumFilesTotal(UInt64 val)
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker   {
136*f6dc9357SAndroid Build Coastguard Worker     CRITICAL_LOCK
137*f6dc9357SAndroid Build Coastguard Worker     _totalFiles = val;
138*f6dc9357SAndroid Build Coastguard Worker     CHECK_STOP
139*f6dc9357SAndroid Build Coastguard Worker   }
140*f6dc9357SAndroid Build Coastguard Worker   return CheckStop();
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker 
Set_NumBytesTotal(UInt64 val)143*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_NumBytesTotal(UInt64 val)
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
146*f6dc9357SAndroid Build Coastguard Worker   _totalBytes = val;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker 
Set_NumFilesCur(UInt64 val)149*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_NumFilesCur(UInt64 val)
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
152*f6dc9357SAndroid Build Coastguard Worker   _curFiles = val;
153*f6dc9357SAndroid Build Coastguard Worker }
154*f6dc9357SAndroid Build Coastguard Worker 
Set_NumBytesCur(const UInt64 * val)155*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::Set_NumBytesCur(const UInt64 *val)
156*f6dc9357SAndroid Build Coastguard Worker {
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     CRITICAL_LOCK
159*f6dc9357SAndroid Build Coastguard Worker     if (val)
160*f6dc9357SAndroid Build Coastguard Worker       _completedBytes = *val;
161*f6dc9357SAndroid Build Coastguard Worker     CHECK_STOP
162*f6dc9357SAndroid Build Coastguard Worker   }
163*f6dc9357SAndroid Build Coastguard Worker   return CheckStop();
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker 
Set_NumBytesCur(UInt64 val)166*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::Set_NumBytesCur(UInt64 val)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker   {
169*f6dc9357SAndroid Build Coastguard Worker     CRITICAL_LOCK
170*f6dc9357SAndroid Build Coastguard Worker     _completedBytes = val;
171*f6dc9357SAndroid Build Coastguard Worker     CHECK_STOP
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker   return CheckStop();
174*f6dc9357SAndroid Build Coastguard Worker }
175*f6dc9357SAndroid Build Coastguard Worker 
Set_Ratio(const UInt64 * inSize,const UInt64 * outSize)176*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_Ratio(const UInt64 *inSize, const UInt64 *outSize)
177*f6dc9357SAndroid Build Coastguard Worker {
178*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
179*f6dc9357SAndroid Build Coastguard Worker   if (inSize)
180*f6dc9357SAndroid Build Coastguard Worker     _inSize = *inSize;
181*f6dc9357SAndroid Build Coastguard Worker   if (outSize)
182*f6dc9357SAndroid Build Coastguard Worker     _outSize = *outSize;
183*f6dc9357SAndroid Build Coastguard Worker }
184*f6dc9357SAndroid Build Coastguard Worker 
Set_TitleFileName(const UString & fileName)185*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_TitleFileName(const UString &fileName)
186*f6dc9357SAndroid Build Coastguard Worker {
187*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
188*f6dc9357SAndroid Build Coastguard Worker   _titleFileName = fileName;
189*f6dc9357SAndroid Build Coastguard Worker }
190*f6dc9357SAndroid Build Coastguard Worker 
Set_Status(const UString & s)191*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_Status(const UString &s)
192*f6dc9357SAndroid Build Coastguard Worker {
193*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
194*f6dc9357SAndroid Build Coastguard Worker   _status = s;
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker 
Set_Status2(const UString & s,const wchar_t * path,bool isDir)197*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressSync::Set_Status2(const UString &s, const wchar_t *path, bool isDir)
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker   {
200*f6dc9357SAndroid Build Coastguard Worker     CRITICAL_LOCK
201*f6dc9357SAndroid Build Coastguard Worker     _status = s;
202*f6dc9357SAndroid Build Coastguard Worker     if (path)
203*f6dc9357SAndroid Build Coastguard Worker       _filePath = path;
204*f6dc9357SAndroid Build Coastguard Worker     else
205*f6dc9357SAndroid Build Coastguard Worker       _filePath.Empty();
206*f6dc9357SAndroid Build Coastguard Worker     _isDir = isDir;
207*f6dc9357SAndroid Build Coastguard Worker   }
208*f6dc9357SAndroid Build Coastguard Worker   return CheckStop();
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker 
Set_FilePath(const wchar_t * path,bool isDir)211*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::Set_FilePath(const wchar_t *path, bool isDir)
212*f6dc9357SAndroid Build Coastguard Worker {
213*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
214*f6dc9357SAndroid Build Coastguard Worker   if (path)
215*f6dc9357SAndroid Build Coastguard Worker     _filePath = path;
216*f6dc9357SAndroid Build Coastguard Worker   else
217*f6dc9357SAndroid Build Coastguard Worker     _filePath.Empty();
218*f6dc9357SAndroid Build Coastguard Worker   _isDir = isDir;
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker 
AddError_Message(const wchar_t * message)222*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::AddError_Message(const wchar_t *message)
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker   CRITICAL_LOCK
225*f6dc9357SAndroid Build Coastguard Worker   Messages.Add(message);
226*f6dc9357SAndroid Build Coastguard Worker }
227*f6dc9357SAndroid Build Coastguard Worker 
AddError_Message_Name(const wchar_t * message,const wchar_t * name)228*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::AddError_Message_Name(const wchar_t *message, const wchar_t *name)
229*f6dc9357SAndroid Build Coastguard Worker {
230*f6dc9357SAndroid Build Coastguard Worker   UString s;
231*f6dc9357SAndroid Build Coastguard Worker   if (name && *name != 0)
232*f6dc9357SAndroid Build Coastguard Worker     s += name;
233*f6dc9357SAndroid Build Coastguard Worker   if (message && *message != 0)
234*f6dc9357SAndroid Build Coastguard Worker   {
235*f6dc9357SAndroid Build Coastguard Worker     if (!s.IsEmpty())
236*f6dc9357SAndroid Build Coastguard Worker       s.Add_LF();
237*f6dc9357SAndroid Build Coastguard Worker     s += message;
238*f6dc9357SAndroid Build Coastguard Worker     if (!s.IsEmpty() && s.Back() == L'\n')
239*f6dc9357SAndroid Build Coastguard Worker       s.DeleteBack();
240*f6dc9357SAndroid Build Coastguard Worker   }
241*f6dc9357SAndroid Build Coastguard Worker   AddError_Message(s);
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker 
AddError_Code_Name(HRESULT systemError,const wchar_t * name)244*f6dc9357SAndroid Build Coastguard Worker void CProgressSync::AddError_Code_Name(HRESULT systemError, const wchar_t *name)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker   UString s = NError::MyFormatMessage(systemError);
247*f6dc9357SAndroid Build Coastguard Worker   if (systemError == 0)
248*f6dc9357SAndroid Build Coastguard Worker     s = "Error";
249*f6dc9357SAndroid Build Coastguard Worker   AddError_Message_Name(s, name);
250*f6dc9357SAndroid Build Coastguard Worker }
251*f6dc9357SAndroid Build Coastguard Worker 
CProgressDialog()252*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::CProgressDialog():
253*f6dc9357SAndroid Build Coastguard Worker     _isDir(false),
254*f6dc9357SAndroid Build Coastguard Worker     _wasCreated(false),
255*f6dc9357SAndroid Build Coastguard Worker     _needClose(false),
256*f6dc9357SAndroid Build Coastguard Worker     _errorsWereDisplayed(false),
257*f6dc9357SAndroid Build Coastguard Worker     _waitCloseByCancelButton(false),
258*f6dc9357SAndroid Build Coastguard Worker     _cancelWasPressed(false),
259*f6dc9357SAndroid Build Coastguard Worker     _inCancelMessageBox(false),
260*f6dc9357SAndroid Build Coastguard Worker     _externalCloseMessageWasReceived(false),
261*f6dc9357SAndroid Build Coastguard Worker     _background(false),
262*f6dc9357SAndroid Build Coastguard Worker     WaitMode(false),
263*f6dc9357SAndroid Build Coastguard Worker     MessagesDisplayed(false),
264*f6dc9357SAndroid Build Coastguard Worker     CompressingMode(true),
265*f6dc9357SAndroid Build Coastguard Worker     ShowCompressionInfo(true),
266*f6dc9357SAndroid Build Coastguard Worker     _numPostedMessages(0),
267*f6dc9357SAndroid Build Coastguard Worker     _numAutoSizeMessages(0),
268*f6dc9357SAndroid Build Coastguard Worker     _numMessages(0),
269*f6dc9357SAndroid Build Coastguard Worker     _timer(0),
270*f6dc9357SAndroid Build Coastguard Worker     IconID(-1),
271*f6dc9357SAndroid Build Coastguard Worker     MainWindow(NULL)
272*f6dc9357SAndroid Build Coastguard Worker {
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker   if (_dialogCreatedEvent.Create() != S_OK)
275*f6dc9357SAndroid Build Coastguard Worker     throw 1334987;
276*f6dc9357SAndroid Build Coastguard Worker   if (_createDialogEvent.Create() != S_OK)
277*f6dc9357SAndroid Build Coastguard Worker     throw 1334987;
278*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
279*f6dc9357SAndroid Build Coastguard Worker   CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&_taskbarList);
280*f6dc9357SAndroid Build Coastguard Worker   if (_taskbarList)
281*f6dc9357SAndroid Build Coastguard Worker     _taskbarList->HrInit();
282*f6dc9357SAndroid Build Coastguard Worker   // #endif
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
286*f6dc9357SAndroid Build Coastguard Worker 
~CProgressDialog()287*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::~CProgressDialog()
288*f6dc9357SAndroid Build Coastguard Worker {
289*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
290*f6dc9357SAndroid Build Coastguard Worker   SetTaskbarProgressState(TBPF_NOPROGRESS);
291*f6dc9357SAndroid Build Coastguard Worker   // #endif
292*f6dc9357SAndroid Build Coastguard Worker   AddToTitle(L"");
293*f6dc9357SAndroid Build Coastguard Worker }
AddToTitle(LPCWSTR s)294*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::AddToTitle(LPCWSTR s)
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker   if (MainWindow)
297*f6dc9357SAndroid Build Coastguard Worker   {
298*f6dc9357SAndroid Build Coastguard Worker     CWindow window(MainWindow);
299*f6dc9357SAndroid Build Coastguard Worker     window.SetText((UString)s + MainTitle);
300*f6dc9357SAndroid Build Coastguard Worker   }
301*f6dc9357SAndroid Build Coastguard Worker }
302*f6dc9357SAndroid Build Coastguard Worker 
303*f6dc9357SAndroid Build Coastguard Worker #endif
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker 
SetTaskbarProgressState()306*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetTaskbarProgressState()
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
309*f6dc9357SAndroid Build Coastguard Worker   if (_taskbarList && _hwndForTaskbar)
310*f6dc9357SAndroid Build Coastguard Worker   {
311*f6dc9357SAndroid Build Coastguard Worker     TBPFLAG tbpFlags;
312*f6dc9357SAndroid Build Coastguard Worker     if (Sync.Get_Paused())
313*f6dc9357SAndroid Build Coastguard Worker       tbpFlags = TBPF_PAUSED;
314*f6dc9357SAndroid Build Coastguard Worker     else
315*f6dc9357SAndroid Build Coastguard Worker       tbpFlags = _errorsWereDisplayed ? TBPF_ERROR: TBPF_NORMAL;
316*f6dc9357SAndroid Build Coastguard Worker     SetTaskbarProgressState(tbpFlags);
317*f6dc9357SAndroid Build Coastguard Worker   }
318*f6dc9357SAndroid Build Coastguard Worker   // #endif
319*f6dc9357SAndroid Build Coastguard Worker }
320*f6dc9357SAndroid Build Coastguard Worker 
321*f6dc9357SAndroid Build Coastguard Worker static const unsigned kTitleFileNameSizeLimit = 36;
322*f6dc9357SAndroid Build Coastguard Worker static const unsigned kCurrentFileNameSizeLimit = 82;
323*f6dc9357SAndroid Build Coastguard Worker 
ReduceString(UString & s,unsigned size)324*f6dc9357SAndroid Build Coastguard Worker static void ReduceString(UString &s, unsigned size)
325*f6dc9357SAndroid Build Coastguard Worker {
326*f6dc9357SAndroid Build Coastguard Worker   if (s.Len() <= size)
327*f6dc9357SAndroid Build Coastguard Worker     return;
328*f6dc9357SAndroid Build Coastguard Worker   s.Delete(size / 2, s.Len() - size);
329*f6dc9357SAndroid Build Coastguard Worker   s.Insert(size / 2, L" ... ");
330*f6dc9357SAndroid Build Coastguard Worker }
331*f6dc9357SAndroid Build Coastguard Worker 
EnableErrorsControls(bool enable)332*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::EnableErrorsControls(bool enable)
333*f6dc9357SAndroid Build Coastguard Worker {
334*f6dc9357SAndroid Build Coastguard Worker   ShowItem_Bool(IDT_PROGRESS_ERRORS, enable);
335*f6dc9357SAndroid Build Coastguard Worker   ShowItem_Bool(IDT_PROGRESS_ERRORS_VAL, enable);
336*f6dc9357SAndroid Build Coastguard Worker   ShowItem_Bool(IDL_PROGRESS_MESSAGES, enable);
337*f6dc9357SAndroid Build Coastguard Worker }
338*f6dc9357SAndroid Build Coastguard Worker 
OnInit()339*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnInit()
340*f6dc9357SAndroid Build Coastguard Worker {
341*f6dc9357SAndroid Build Coastguard Worker   _hwndForTaskbar = MainWindow;
342*f6dc9357SAndroid Build Coastguard Worker   if (!_hwndForTaskbar)
343*f6dc9357SAndroid Build Coastguard Worker     _hwndForTaskbar = GetParent();
344*f6dc9357SAndroid Build Coastguard Worker   if (!_hwndForTaskbar)
345*f6dc9357SAndroid Build Coastguard Worker     _hwndForTaskbar = *this;
346*f6dc9357SAndroid Build Coastguard Worker 
347*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_progressBar_Range)
348*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_progressBar_Pos)
349*f6dc9357SAndroid Build Coastguard Worker 
350*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_prevPercentValue)
351*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_prevElapsedSec)
352*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_prevRemainingSec)
353*f6dc9357SAndroid Build Coastguard Worker 
354*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_prevSpeed)
355*f6dc9357SAndroid Build Coastguard Worker   _prevSpeed_MoveBits = 0;
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker   _prevTime = ::GetTickCount();
358*f6dc9357SAndroid Build Coastguard Worker   _elapsedTime = 0;
359*f6dc9357SAndroid Build Coastguard Worker 
360*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_totalBytes_Prev)
361*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_processed_Prev)
362*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_packed_Prev)
363*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_ratio_Prev)
364*f6dc9357SAndroid Build Coastguard Worker 
365*f6dc9357SAndroid Build Coastguard Worker   _filesStr_Prev.Empty();
366*f6dc9357SAndroid Build Coastguard Worker   _filesTotStr_Prev.Empty();
367*f6dc9357SAndroid Build Coastguard Worker 
368*f6dc9357SAndroid Build Coastguard Worker   m_ProgressBar.Attach(GetItem(IDC_PROGRESS1));
369*f6dc9357SAndroid Build Coastguard Worker   _messageList.Attach(GetItem(IDL_PROGRESS_MESSAGES));
370*f6dc9357SAndroid Build Coastguard Worker   _messageList.SetUnicodeFormat();
371*f6dc9357SAndroid Build Coastguard Worker   _messageList.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
372*f6dc9357SAndroid Build Coastguard Worker 
373*f6dc9357SAndroid Build Coastguard Worker   _wasCreated = true;
374*f6dc9357SAndroid Build Coastguard Worker   _dialogCreatedEvent.Set();
375*f6dc9357SAndroid Build Coastguard Worker 
376*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_LANG
377*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
378*f6dc9357SAndroid Build Coastguard Worker   LangSetDlgItems_Colon(*this, kLangIDs_Colon, Z7_ARRAY_SIZE(kLangIDs_Colon));
379*f6dc9357SAndroid Build Coastguard Worker   #endif
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker   CWindow window(GetItem(IDB_PROGRESS_BACKGROUND));
382*f6dc9357SAndroid Build Coastguard Worker   window.GetText(_background_String);
383*f6dc9357SAndroid Build Coastguard Worker   _backgrounded_String = _background_String;
384*f6dc9357SAndroid Build Coastguard Worker   _backgrounded_String.RemoveChar(L'&');
385*f6dc9357SAndroid Build Coastguard Worker 
386*f6dc9357SAndroid Build Coastguard Worker   window = GetItem(IDB_PAUSE);
387*f6dc9357SAndroid Build Coastguard Worker   window.GetText(_pause_String);
388*f6dc9357SAndroid Build Coastguard Worker 
389*f6dc9357SAndroid Build Coastguard Worker   LangString(IDS_PROGRESS_FOREGROUND, _foreground_String);
390*f6dc9357SAndroid Build Coastguard Worker   LangString(IDS_CONTINUE, _continue_String);
391*f6dc9357SAndroid Build Coastguard Worker   LangString(IDS_PROGRESS_PAUSED, _paused_String);
392*f6dc9357SAndroid Build Coastguard Worker 
393*f6dc9357SAndroid Build Coastguard Worker   SetText(_title);
394*f6dc9357SAndroid Build Coastguard Worker   SetPauseText();
395*f6dc9357SAndroid Build Coastguard Worker   SetPriorityText();
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker   _messageList.InsertColumn(0, L"", 40);
398*f6dc9357SAndroid Build Coastguard Worker   _messageList.InsertColumn(1, L"", 460);
399*f6dc9357SAndroid Build Coastguard Worker   _messageList.SetColumnWidthAuto(0);
400*f6dc9357SAndroid Build Coastguard Worker   _messageList.SetColumnWidthAuto(1);
401*f6dc9357SAndroid Build Coastguard Worker 
402*f6dc9357SAndroid Build Coastguard Worker   EnableErrorsControls(false);
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   GetItemSizes(IDCANCEL, _buttonSizeX, _buttonSizeY);
405*f6dc9357SAndroid Build Coastguard Worker   _numReduceSymbols = kCurrentFileNameSizeLimit;
406*f6dc9357SAndroid Build Coastguard Worker   NormalizeSize(true);
407*f6dc9357SAndroid Build Coastguard Worker 
408*f6dc9357SAndroid Build Coastguard Worker   if (!ShowCompressionInfo)
409*f6dc9357SAndroid Build Coastguard Worker   {
410*f6dc9357SAndroid Build Coastguard Worker     HideItem(IDT_PROGRESS_PACKED);
411*f6dc9357SAndroid Build Coastguard Worker     HideItem(IDT_PROGRESS_PACKED_VAL);
412*f6dc9357SAndroid Build Coastguard Worker     HideItem(IDT_PROGRESS_RATIO);
413*f6dc9357SAndroid Build Coastguard Worker     HideItem(IDT_PROGRESS_RATIO_VAL);
414*f6dc9357SAndroid Build Coastguard Worker   }
415*f6dc9357SAndroid Build Coastguard Worker 
416*f6dc9357SAndroid Build Coastguard Worker   if (IconID >= 0)
417*f6dc9357SAndroid Build Coastguard Worker   {
418*f6dc9357SAndroid Build Coastguard Worker     HICON icon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IconID));
419*f6dc9357SAndroid Build Coastguard Worker     // SetIcon(ICON_SMALL, icon);
420*f6dc9357SAndroid Build Coastguard Worker     SetIcon(ICON_BIG, icon);
421*f6dc9357SAndroid Build Coastguard Worker   }
422*f6dc9357SAndroid Build Coastguard Worker   _timer = SetTimer(kTimerID, kTimerElapse);
423*f6dc9357SAndroid Build Coastguard Worker   #ifdef UNDER_CE
424*f6dc9357SAndroid Build Coastguard Worker   Foreground();
425*f6dc9357SAndroid Build Coastguard Worker   #endif
426*f6dc9357SAndroid Build Coastguard Worker 
427*f6dc9357SAndroid Build Coastguard Worker   CheckNeedClose();
428*f6dc9357SAndroid Build Coastguard Worker 
429*f6dc9357SAndroid Build Coastguard Worker   SetTaskbarProgressState();
430*f6dc9357SAndroid Build Coastguard Worker 
431*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnInit();
432*f6dc9357SAndroid Build Coastguard Worker }
433*f6dc9357SAndroid Build Coastguard Worker 
434*f6dc9357SAndroid Build Coastguard Worker static const UINT kIDs[] =
435*f6dc9357SAndroid Build Coastguard Worker {
436*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_ELAPSED,   IDT_PROGRESS_ELAPSED_VAL,
437*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_REMAINING, IDT_PROGRESS_REMAINING_VAL,
438*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_FILES,     IDT_PROGRESS_FILES_VAL,
439*f6dc9357SAndroid Build Coastguard Worker   0,                      IDT_PROGRESS_FILES_TOTAL,
440*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_ERRORS,    IDT_PROGRESS_ERRORS_VAL,
441*f6dc9357SAndroid Build Coastguard Worker 
442*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_TOTAL,     IDT_PROGRESS_TOTAL_VAL,
443*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_SPEED,     IDT_PROGRESS_SPEED_VAL,
444*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_PROCESSED, IDT_PROGRESS_PROCESSED_VAL,
445*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_PACKED,    IDT_PROGRESS_PACKED_VAL,
446*f6dc9357SAndroid Build Coastguard Worker   IDT_PROGRESS_RATIO,     IDT_PROGRESS_RATIO_VAL
447*f6dc9357SAndroid Build Coastguard Worker };
448*f6dc9357SAndroid Build Coastguard Worker 
OnSize(WPARAM,int xSize,int ySize)449*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize)
450*f6dc9357SAndroid Build Coastguard Worker {
451*f6dc9357SAndroid Build Coastguard Worker   int sY;
452*f6dc9357SAndroid Build Coastguard Worker   int sStep;
453*f6dc9357SAndroid Build Coastguard Worker   int mx, my;
454*f6dc9357SAndroid Build Coastguard Worker   {
455*f6dc9357SAndroid Build Coastguard Worker     RECT r;
456*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDT_PROGRESS_ELAPSED, r);
457*f6dc9357SAndroid Build Coastguard Worker     mx = r.left;
458*f6dc9357SAndroid Build Coastguard Worker     my = r.top;
459*f6dc9357SAndroid Build Coastguard Worker     sY = RECT_SIZE_Y(r);
460*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDT_PROGRESS_REMAINING, r);
461*f6dc9357SAndroid Build Coastguard Worker     sStep = r.top - my;
462*f6dc9357SAndroid Build Coastguard Worker   }
463*f6dc9357SAndroid Build Coastguard Worker 
464*f6dc9357SAndroid Build Coastguard Worker   InvalidateRect(NULL);
465*f6dc9357SAndroid Build Coastguard Worker 
466*f6dc9357SAndroid Build Coastguard Worker   const int xSizeClient = xSize - mx * 2;
467*f6dc9357SAndroid Build Coastguard Worker 
468*f6dc9357SAndroid Build Coastguard Worker   {
469*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
470*f6dc9357SAndroid Build Coastguard Worker     for (i = 800; i > 40; i = i * 9 / 10)
471*f6dc9357SAndroid Build Coastguard Worker       if (Units_To_Pixels_X((int)i) <= xSizeClient)
472*f6dc9357SAndroid Build Coastguard Worker         break;
473*f6dc9357SAndroid Build Coastguard Worker     _numReduceSymbols = i / 4;
474*f6dc9357SAndroid Build Coastguard Worker   }
475*f6dc9357SAndroid Build Coastguard Worker 
476*f6dc9357SAndroid Build Coastguard Worker   int yPos = ySize - my - _buttonSizeY;
477*f6dc9357SAndroid Build Coastguard Worker 
478*f6dc9357SAndroid Build Coastguard Worker   ChangeSubWindowSizeX(GetItem(IDT_PROGRESS_STATUS), xSize - mx * 2);
479*f6dc9357SAndroid Build Coastguard Worker   ChangeSubWindowSizeX(GetItem(IDT_PROGRESS_FILE_NAME), xSize - mx * 2);
480*f6dc9357SAndroid Build Coastguard Worker   ChangeSubWindowSizeX(GetItem(IDC_PROGRESS1), xSize - mx * 2);
481*f6dc9357SAndroid Build Coastguard Worker 
482*f6dc9357SAndroid Build Coastguard Worker   int bSizeX = _buttonSizeX;
483*f6dc9357SAndroid Build Coastguard Worker   int mx2 = mx;
484*f6dc9357SAndroid Build Coastguard Worker   for (;; mx2--)
485*f6dc9357SAndroid Build Coastguard Worker   {
486*f6dc9357SAndroid Build Coastguard Worker     const int bSize2 = bSizeX * 3 + mx2 * 2;
487*f6dc9357SAndroid Build Coastguard Worker     if (bSize2 <= xSizeClient)
488*f6dc9357SAndroid Build Coastguard Worker       break;
489*f6dc9357SAndroid Build Coastguard Worker     if (mx2 < 5)
490*f6dc9357SAndroid Build Coastguard Worker     {
491*f6dc9357SAndroid Build Coastguard Worker       bSizeX = (xSizeClient - mx2 * 2) / 3;
492*f6dc9357SAndroid Build Coastguard Worker       break;
493*f6dc9357SAndroid Build Coastguard Worker     }
494*f6dc9357SAndroid Build Coastguard Worker   }
495*f6dc9357SAndroid Build Coastguard Worker   if (bSizeX < 2)
496*f6dc9357SAndroid Build Coastguard Worker     bSizeX = 2;
497*f6dc9357SAndroid Build Coastguard Worker 
498*f6dc9357SAndroid Build Coastguard Worker   {
499*f6dc9357SAndroid Build Coastguard Worker     RECT r;
500*f6dc9357SAndroid Build Coastguard Worker     GetClientRectOfItem(IDL_PROGRESS_MESSAGES, r);
501*f6dc9357SAndroid Build Coastguard Worker     const int y = r.top;
502*f6dc9357SAndroid Build Coastguard Worker     int ySize2 = yPos - my - y;
503*f6dc9357SAndroid Build Coastguard Worker     const int kMinYSize = _buttonSizeY + _buttonSizeY * 3 / 4;
504*f6dc9357SAndroid Build Coastguard Worker     int xx = xSize - mx * 2;
505*f6dc9357SAndroid Build Coastguard Worker     if (ySize2 < kMinYSize)
506*f6dc9357SAndroid Build Coastguard Worker     {
507*f6dc9357SAndroid Build Coastguard Worker       ySize2 = kMinYSize;
508*f6dc9357SAndroid Build Coastguard Worker       if (xx > bSizeX * 2)
509*f6dc9357SAndroid Build Coastguard Worker         xx -= bSizeX;
510*f6dc9357SAndroid Build Coastguard Worker     }
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker     _messageList.Move(mx, y, xx, ySize2);
513*f6dc9357SAndroid Build Coastguard Worker   }
514*f6dc9357SAndroid Build Coastguard Worker 
515*f6dc9357SAndroid Build Coastguard Worker   {
516*f6dc9357SAndroid Build Coastguard Worker     int xPos = xSize - mx;
517*f6dc9357SAndroid Build Coastguard Worker     xPos -= bSizeX;
518*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDCANCEL, xPos, yPos, bSizeX, _buttonSizeY);
519*f6dc9357SAndroid Build Coastguard Worker     xPos -= (mx2 + bSizeX);
520*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDB_PAUSE, xPos, yPos, bSizeX, _buttonSizeY);
521*f6dc9357SAndroid Build Coastguard Worker     xPos -= (mx2 + bSizeX);
522*f6dc9357SAndroid Build Coastguard Worker     MoveItem(IDB_PROGRESS_BACKGROUND, xPos, yPos, bSizeX, _buttonSizeY);
523*f6dc9357SAndroid Build Coastguard Worker   }
524*f6dc9357SAndroid Build Coastguard Worker 
525*f6dc9357SAndroid Build Coastguard Worker   int valueSize;
526*f6dc9357SAndroid Build Coastguard Worker   int labelSize;
527*f6dc9357SAndroid Build Coastguard Worker   int padSize;
528*f6dc9357SAndroid Build Coastguard Worker 
529*f6dc9357SAndroid Build Coastguard Worker   labelSize = Units_To_Pixels_X(MY_PROGRESS_LABEL_UNITS_MIN);
530*f6dc9357SAndroid Build Coastguard Worker   valueSize = Units_To_Pixels_X(MY_PROGRESS_VAL_UNITS);
531*f6dc9357SAndroid Build Coastguard Worker   padSize = Units_To_Pixels_X(MY_PROGRESS_PAD_UNITS);
532*f6dc9357SAndroid Build Coastguard Worker   const int requiredSize = (labelSize + valueSize) * 2 + padSize;
533*f6dc9357SAndroid Build Coastguard Worker 
534*f6dc9357SAndroid Build Coastguard Worker   int gSize;
535*f6dc9357SAndroid Build Coastguard Worker   {
536*f6dc9357SAndroid Build Coastguard Worker     if (requiredSize < xSizeClient)
537*f6dc9357SAndroid Build Coastguard Worker     {
538*f6dc9357SAndroid Build Coastguard Worker       const int incr = (xSizeClient - requiredSize) / 3;
539*f6dc9357SAndroid Build Coastguard Worker       labelSize += incr;
540*f6dc9357SAndroid Build Coastguard Worker     }
541*f6dc9357SAndroid Build Coastguard Worker     else
542*f6dc9357SAndroid Build Coastguard Worker       labelSize = (xSizeClient - valueSize * 2 - padSize) / 2;
543*f6dc9357SAndroid Build Coastguard Worker     if (labelSize < 0)
544*f6dc9357SAndroid Build Coastguard Worker       labelSize = 0;
545*f6dc9357SAndroid Build Coastguard Worker 
546*f6dc9357SAndroid Build Coastguard Worker     gSize = labelSize + valueSize;
547*f6dc9357SAndroid Build Coastguard Worker     padSize = xSizeClient - gSize * 2;
548*f6dc9357SAndroid Build Coastguard Worker   }
549*f6dc9357SAndroid Build Coastguard Worker 
550*f6dc9357SAndroid Build Coastguard Worker   labelSize = gSize - valueSize;
551*f6dc9357SAndroid Build Coastguard Worker 
552*f6dc9357SAndroid Build Coastguard Worker   yPos = my;
553*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(kIDs); i += 2)
554*f6dc9357SAndroid Build Coastguard Worker   {
555*f6dc9357SAndroid Build Coastguard Worker     int x = mx;
556*f6dc9357SAndroid Build Coastguard Worker     const unsigned kNumColumn1Items = 5 * 2;
557*f6dc9357SAndroid Build Coastguard Worker     if (i >= kNumColumn1Items)
558*f6dc9357SAndroid Build Coastguard Worker     {
559*f6dc9357SAndroid Build Coastguard Worker       if (i == kNumColumn1Items)
560*f6dc9357SAndroid Build Coastguard Worker         yPos = my;
561*f6dc9357SAndroid Build Coastguard Worker       x = mx + gSize + padSize;
562*f6dc9357SAndroid Build Coastguard Worker     }
563*f6dc9357SAndroid Build Coastguard Worker     if (kIDs[i] != 0)
564*f6dc9357SAndroid Build Coastguard Worker     MoveItem(kIDs[i], x, yPos, labelSize, sY);
565*f6dc9357SAndroid Build Coastguard Worker     MoveItem(kIDs[i + 1], x + labelSize, yPos, valueSize, sY);
566*f6dc9357SAndroid Build Coastguard Worker     yPos += sStep;
567*f6dc9357SAndroid Build Coastguard Worker   }
568*f6dc9357SAndroid Build Coastguard Worker   return false;
569*f6dc9357SAndroid Build Coastguard Worker }
570*f6dc9357SAndroid Build Coastguard Worker 
OnCancel()571*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnCancel() { Sync.Set_Stopped(true); }
OnOK()572*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnOK() { }
573*f6dc9357SAndroid Build Coastguard Worker 
SetProgressRange(UInt64 range)574*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetProgressRange(UInt64 range)
575*f6dc9357SAndroid Build Coastguard Worker {
576*f6dc9357SAndroid Build Coastguard Worker   if (range == _progressBar_Range)
577*f6dc9357SAndroid Build Coastguard Worker     return;
578*f6dc9357SAndroid Build Coastguard Worker   _progressBar_Range = range;
579*f6dc9357SAndroid Build Coastguard Worker   INIT_AS_UNDEFINED(_progressBar_Pos)
580*f6dc9357SAndroid Build Coastguard Worker   _progressConv.Init(range);
581*f6dc9357SAndroid Build Coastguard Worker   m_ProgressBar.SetRange32(0, _progressConv.Count(range));
582*f6dc9357SAndroid Build Coastguard Worker }
583*f6dc9357SAndroid Build Coastguard Worker 
SetProgressPos(UInt64 pos)584*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetProgressPos(UInt64 pos)
585*f6dc9357SAndroid Build Coastguard Worker {
586*f6dc9357SAndroid Build Coastguard Worker   if (pos >= _progressBar_Range ||
587*f6dc9357SAndroid Build Coastguard Worker       pos <= _progressBar_Pos ||
588*f6dc9357SAndroid Build Coastguard Worker       pos - _progressBar_Pos >= (_progressBar_Range >> 10))
589*f6dc9357SAndroid Build Coastguard Worker   {
590*f6dc9357SAndroid Build Coastguard Worker     m_ProgressBar.SetPos(_progressConv.Count(pos));
591*f6dc9357SAndroid Build Coastguard Worker     // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
592*f6dc9357SAndroid Build Coastguard Worker     if (_taskbarList && _hwndForTaskbar)
593*f6dc9357SAndroid Build Coastguard Worker       _taskbarList->SetProgressValue(_hwndForTaskbar, pos, _progressBar_Range);
594*f6dc9357SAndroid Build Coastguard Worker     // #endif
595*f6dc9357SAndroid Build Coastguard Worker     _progressBar_Pos = pos;
596*f6dc9357SAndroid Build Coastguard Worker   }
597*f6dc9357SAndroid Build Coastguard Worker }
598*f6dc9357SAndroid Build Coastguard Worker 
599*f6dc9357SAndroid Build Coastguard Worker #define UINT_TO_STR_2(val) { s[0] = (wchar_t)('0' + (val) / 10); s[1] = (wchar_t)('0' + (val) % 10); s += 2; }
600*f6dc9357SAndroid Build Coastguard Worker 
601*f6dc9357SAndroid Build Coastguard Worker void GetTimeString(UInt64 timeValue, wchar_t *s);
GetTimeString(UInt64 timeValue,wchar_t * s)602*f6dc9357SAndroid Build Coastguard Worker void GetTimeString(UInt64 timeValue, wchar_t *s)
603*f6dc9357SAndroid Build Coastguard Worker {
604*f6dc9357SAndroid Build Coastguard Worker   UInt64 hours = timeValue / 3600;
605*f6dc9357SAndroid Build Coastguard Worker   UInt32 seconds = (UInt32)(timeValue - hours * 3600);
606*f6dc9357SAndroid Build Coastguard Worker   UInt32 minutes = seconds / 60;
607*f6dc9357SAndroid Build Coastguard Worker   seconds %= 60;
608*f6dc9357SAndroid Build Coastguard Worker   if (hours > 99)
609*f6dc9357SAndroid Build Coastguard Worker   {
610*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt64ToString(hours, s);
611*f6dc9357SAndroid Build Coastguard Worker     for (; *s != 0; s++);
612*f6dc9357SAndroid Build Coastguard Worker   }
613*f6dc9357SAndroid Build Coastguard Worker   else
614*f6dc9357SAndroid Build Coastguard Worker   {
615*f6dc9357SAndroid Build Coastguard Worker     UInt32 hours32 = (UInt32)hours;
616*f6dc9357SAndroid Build Coastguard Worker     UINT_TO_STR_2(hours32)
617*f6dc9357SAndroid Build Coastguard Worker   }
618*f6dc9357SAndroid Build Coastguard Worker   *s++ = ':'; UINT_TO_STR_2(minutes)
619*f6dc9357SAndroid Build Coastguard Worker   *s++ = ':'; UINT_TO_STR_2(seconds)
620*f6dc9357SAndroid Build Coastguard Worker   *s = 0;
621*f6dc9357SAndroid Build Coastguard Worker }
622*f6dc9357SAndroid Build Coastguard Worker 
ConvertSizeToString(UInt64 v,wchar_t * s)623*f6dc9357SAndroid Build Coastguard Worker static void ConvertSizeToString(UInt64 v, wchar_t *s)
624*f6dc9357SAndroid Build Coastguard Worker {
625*f6dc9357SAndroid Build Coastguard Worker   Byte c = 0;
626*f6dc9357SAndroid Build Coastguard Worker        if (v >= ((UInt64)100000 << 20)) { v >>= 30; c = 'G'; }
627*f6dc9357SAndroid Build Coastguard Worker   else if (v >= ((UInt64)100000 << 10)) { v >>= 20; c = 'M'; }
628*f6dc9357SAndroid Build Coastguard Worker   else if (v >= ((UInt64)100000 <<  0)) { v >>= 10; c = 'K'; }
629*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(v, s);
630*f6dc9357SAndroid Build Coastguard Worker   if (c != 0)
631*f6dc9357SAndroid Build Coastguard Worker   {
632*f6dc9357SAndroid Build Coastguard Worker     s += MyStringLen(s);
633*f6dc9357SAndroid Build Coastguard Worker     *s++ = ' ';
634*f6dc9357SAndroid Build Coastguard Worker     *s++ = c;
635*f6dc9357SAndroid Build Coastguard Worker     *s++ = 'B';
636*f6dc9357SAndroid Build Coastguard Worker     *s++ = 0;
637*f6dc9357SAndroid Build Coastguard Worker   }
638*f6dc9357SAndroid Build Coastguard Worker }
639*f6dc9357SAndroid Build Coastguard Worker 
ShowSize(unsigned id,UInt64 val,UInt64 & prev)640*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::ShowSize(unsigned id, UInt64 val, UInt64 &prev)
641*f6dc9357SAndroid Build Coastguard Worker {
642*f6dc9357SAndroid Build Coastguard Worker   if (val == prev)
643*f6dc9357SAndroid Build Coastguard Worker     return;
644*f6dc9357SAndroid Build Coastguard Worker   prev = val;
645*f6dc9357SAndroid Build Coastguard Worker   wchar_t s[40];
646*f6dc9357SAndroid Build Coastguard Worker   s[0] = 0;
647*f6dc9357SAndroid Build Coastguard Worker   if (IS_DEFINED_VAL(val))
648*f6dc9357SAndroid Build Coastguard Worker     ConvertSizeToString(val, s);
649*f6dc9357SAndroid Build Coastguard Worker   SetItemText(id, s);
650*f6dc9357SAndroid Build Coastguard Worker }
651*f6dc9357SAndroid Build Coastguard Worker 
GetChangedString(const UString & newStr,UString & prevStr,bool & hasChanged)652*f6dc9357SAndroid Build Coastguard Worker static void GetChangedString(const UString &newStr, UString &prevStr, bool &hasChanged)
653*f6dc9357SAndroid Build Coastguard Worker {
654*f6dc9357SAndroid Build Coastguard Worker   hasChanged = !(prevStr == newStr);
655*f6dc9357SAndroid Build Coastguard Worker   if (hasChanged)
656*f6dc9357SAndroid Build Coastguard Worker     prevStr = newStr;
657*f6dc9357SAndroid Build Coastguard Worker }
658*f6dc9357SAndroid Build Coastguard Worker 
GetPower32(UInt32 val)659*f6dc9357SAndroid Build Coastguard Worker static unsigned GetPower32(UInt32 val)
660*f6dc9357SAndroid Build Coastguard Worker {
661*f6dc9357SAndroid Build Coastguard Worker   const unsigned kStart = 32;
662*f6dc9357SAndroid Build Coastguard Worker   UInt32 mask = ((UInt32)1 << (kStart - 1));
663*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = kStart;; i--)
664*f6dc9357SAndroid Build Coastguard Worker   {
665*f6dc9357SAndroid Build Coastguard Worker     if (i == 0 || (val & mask) != 0)
666*f6dc9357SAndroid Build Coastguard Worker       return i;
667*f6dc9357SAndroid Build Coastguard Worker     mask >>= 1;
668*f6dc9357SAndroid Build Coastguard Worker   }
669*f6dc9357SAndroid Build Coastguard Worker }
670*f6dc9357SAndroid Build Coastguard Worker 
GetPower64(UInt64 val)671*f6dc9357SAndroid Build Coastguard Worker static unsigned GetPower64(UInt64 val)
672*f6dc9357SAndroid Build Coastguard Worker {
673*f6dc9357SAndroid Build Coastguard Worker   UInt32 high = (UInt32)(val >> 32);
674*f6dc9357SAndroid Build Coastguard Worker   if (high == 0)
675*f6dc9357SAndroid Build Coastguard Worker     return GetPower32((UInt32)val);
676*f6dc9357SAndroid Build Coastguard Worker   return GetPower32(high) + 32;
677*f6dc9357SAndroid Build Coastguard Worker }
678*f6dc9357SAndroid Build Coastguard Worker 
MyMultAndDiv(UInt64 mult1,UInt64 mult2,UInt64 divider)679*f6dc9357SAndroid Build Coastguard Worker static UInt64 MyMultAndDiv(UInt64 mult1, UInt64 mult2, UInt64 divider)
680*f6dc9357SAndroid Build Coastguard Worker {
681*f6dc9357SAndroid Build Coastguard Worker   unsigned pow1 = GetPower64(mult1);
682*f6dc9357SAndroid Build Coastguard Worker   unsigned pow2 = GetPower64(mult2);
683*f6dc9357SAndroid Build Coastguard Worker   while (pow1 + pow2 > 64)
684*f6dc9357SAndroid Build Coastguard Worker   {
685*f6dc9357SAndroid Build Coastguard Worker     if (pow1 > pow2) { pow1--; mult1 >>= 1; }
686*f6dc9357SAndroid Build Coastguard Worker     else             { pow2--; mult2 >>= 1; }
687*f6dc9357SAndroid Build Coastguard Worker     divider >>= 1;
688*f6dc9357SAndroid Build Coastguard Worker   }
689*f6dc9357SAndroid Build Coastguard Worker   UInt64 res = mult1 * mult2;
690*f6dc9357SAndroid Build Coastguard Worker   if (divider != 0)
691*f6dc9357SAndroid Build Coastguard Worker     res /= divider;
692*f6dc9357SAndroid Build Coastguard Worker   return res;
693*f6dc9357SAndroid Build Coastguard Worker }
694*f6dc9357SAndroid Build Coastguard Worker 
UpdateStatInfo(bool showAll)695*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::UpdateStatInfo(bool showAll)
696*f6dc9357SAndroid Build Coastguard Worker {
697*f6dc9357SAndroid Build Coastguard Worker   UInt64 total, completed, totalFiles, completedFiles, inSize, outSize;
698*f6dc9357SAndroid Build Coastguard Worker   bool filesProgressMode;
699*f6dc9357SAndroid Build Coastguard Worker 
700*f6dc9357SAndroid Build Coastguard Worker   bool titleFileName_Changed;
701*f6dc9357SAndroid Build Coastguard Worker   bool curFilePath_Changed;
702*f6dc9357SAndroid Build Coastguard Worker   bool status_Changed;
703*f6dc9357SAndroid Build Coastguard Worker   unsigned numErrors;
704*f6dc9357SAndroid Build Coastguard Worker   {
705*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(Sync._cs);
706*f6dc9357SAndroid Build Coastguard Worker     total = Sync._totalBytes;
707*f6dc9357SAndroid Build Coastguard Worker     completed = Sync._completedBytes;
708*f6dc9357SAndroid Build Coastguard Worker     totalFiles = Sync._totalFiles;
709*f6dc9357SAndroid Build Coastguard Worker     completedFiles = Sync._curFiles;
710*f6dc9357SAndroid Build Coastguard Worker     inSize = Sync._inSize;
711*f6dc9357SAndroid Build Coastguard Worker     outSize = Sync._outSize;
712*f6dc9357SAndroid Build Coastguard Worker     filesProgressMode = Sync._filesProgressMode;
713*f6dc9357SAndroid Build Coastguard Worker 
714*f6dc9357SAndroid Build Coastguard Worker     GetChangedString(Sync._titleFileName, _titleFileName, titleFileName_Changed);
715*f6dc9357SAndroid Build Coastguard Worker     GetChangedString(Sync._filePath, _filePath, curFilePath_Changed);
716*f6dc9357SAndroid Build Coastguard Worker     GetChangedString(Sync._status, _status, status_Changed);
717*f6dc9357SAndroid Build Coastguard Worker     if (_isDir != Sync._isDir)
718*f6dc9357SAndroid Build Coastguard Worker     {
719*f6dc9357SAndroid Build Coastguard Worker       curFilePath_Changed = true;
720*f6dc9357SAndroid Build Coastguard Worker       _isDir = Sync._isDir;
721*f6dc9357SAndroid Build Coastguard Worker     }
722*f6dc9357SAndroid Build Coastguard Worker     numErrors = Sync.Messages.Size();
723*f6dc9357SAndroid Build Coastguard Worker   }
724*f6dc9357SAndroid Build Coastguard Worker 
725*f6dc9357SAndroid Build Coastguard Worker   UInt32 curTime = ::GetTickCount();
726*f6dc9357SAndroid Build Coastguard Worker 
727*f6dc9357SAndroid Build Coastguard Worker   const UInt64 progressTotal = filesProgressMode ? totalFiles : total;
728*f6dc9357SAndroid Build Coastguard Worker   const UInt64 progressCompleted = filesProgressMode ? completedFiles : completed;
729*f6dc9357SAndroid Build Coastguard Worker   {
730*f6dc9357SAndroid Build Coastguard Worker     if (IS_UNDEFINED_VAL(progressTotal))
731*f6dc9357SAndroid Build Coastguard Worker     {
732*f6dc9357SAndroid Build Coastguard Worker       // SetPos(0);
733*f6dc9357SAndroid Build Coastguard Worker       // SetRange(progressCompleted);
734*f6dc9357SAndroid Build Coastguard Worker     }
735*f6dc9357SAndroid Build Coastguard Worker     else
736*f6dc9357SAndroid Build Coastguard Worker     {
737*f6dc9357SAndroid Build Coastguard Worker       if (_progressBar_Pos != 0 || progressCompleted != 0 ||
738*f6dc9357SAndroid Build Coastguard Worker           (_progressBar_Range == 0 && progressTotal != 0))
739*f6dc9357SAndroid Build Coastguard Worker       {
740*f6dc9357SAndroid Build Coastguard Worker         SetProgressRange(progressTotal);
741*f6dc9357SAndroid Build Coastguard Worker         SetProgressPos(progressCompleted);
742*f6dc9357SAndroid Build Coastguard Worker       }
743*f6dc9357SAndroid Build Coastguard Worker     }
744*f6dc9357SAndroid Build Coastguard Worker   }
745*f6dc9357SAndroid Build Coastguard Worker 
746*f6dc9357SAndroid Build Coastguard Worker   ShowSize(IDT_PROGRESS_TOTAL_VAL, total, _totalBytes_Prev);
747*f6dc9357SAndroid Build Coastguard Worker 
748*f6dc9357SAndroid Build Coastguard Worker   _elapsedTime += (curTime - _prevTime);
749*f6dc9357SAndroid Build Coastguard Worker   _prevTime = curTime;
750*f6dc9357SAndroid Build Coastguard Worker   UInt64 elapsedSec = _elapsedTime / 1000;
751*f6dc9357SAndroid Build Coastguard Worker   bool elapsedChanged = false;
752*f6dc9357SAndroid Build Coastguard Worker   if (elapsedSec != _prevElapsedSec)
753*f6dc9357SAndroid Build Coastguard Worker   {
754*f6dc9357SAndroid Build Coastguard Worker     _prevElapsedSec = elapsedSec;
755*f6dc9357SAndroid Build Coastguard Worker     elapsedChanged = true;
756*f6dc9357SAndroid Build Coastguard Worker     wchar_t s[40];
757*f6dc9357SAndroid Build Coastguard Worker     GetTimeString(elapsedSec, s);
758*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_PROGRESS_ELAPSED_VAL, s);
759*f6dc9357SAndroid Build Coastguard Worker   }
760*f6dc9357SAndroid Build Coastguard Worker 
761*f6dc9357SAndroid Build Coastguard Worker   bool needSetTitle = false;
762*f6dc9357SAndroid Build Coastguard Worker   if (elapsedChanged || showAll)
763*f6dc9357SAndroid Build Coastguard Worker   {
764*f6dc9357SAndroid Build Coastguard Worker     if (numErrors > _numPostedMessages)
765*f6dc9357SAndroid Build Coastguard Worker     {
766*f6dc9357SAndroid Build Coastguard Worker       UpdateMessagesDialog();
767*f6dc9357SAndroid Build Coastguard Worker       wchar_t s[32];
768*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt64ToString(numErrors, s);
769*f6dc9357SAndroid Build Coastguard Worker       SetItemText(IDT_PROGRESS_ERRORS_VAL, s);
770*f6dc9357SAndroid Build Coastguard Worker       if (!_errorsWereDisplayed)
771*f6dc9357SAndroid Build Coastguard Worker       {
772*f6dc9357SAndroid Build Coastguard Worker         _errorsWereDisplayed = true;
773*f6dc9357SAndroid Build Coastguard Worker         EnableErrorsControls(true);
774*f6dc9357SAndroid Build Coastguard Worker         SetTaskbarProgressState();
775*f6dc9357SAndroid Build Coastguard Worker       }
776*f6dc9357SAndroid Build Coastguard Worker     }
777*f6dc9357SAndroid Build Coastguard Worker 
778*f6dc9357SAndroid Build Coastguard Worker     if (progressCompleted != 0)
779*f6dc9357SAndroid Build Coastguard Worker     {
780*f6dc9357SAndroid Build Coastguard Worker       if (IS_UNDEFINED_VAL(progressTotal))
781*f6dc9357SAndroid Build Coastguard Worker       {
782*f6dc9357SAndroid Build Coastguard Worker         if (IS_DEFINED_VAL(_prevRemainingSec))
783*f6dc9357SAndroid Build Coastguard Worker         {
784*f6dc9357SAndroid Build Coastguard Worker           INIT_AS_UNDEFINED(_prevRemainingSec)
785*f6dc9357SAndroid Build Coastguard Worker           SetItemText(IDT_PROGRESS_REMAINING_VAL, L"");
786*f6dc9357SAndroid Build Coastguard Worker         }
787*f6dc9357SAndroid Build Coastguard Worker       }
788*f6dc9357SAndroid Build Coastguard Worker       else
789*f6dc9357SAndroid Build Coastguard Worker       {
790*f6dc9357SAndroid Build Coastguard Worker         UInt64 remainingTime = 0;
791*f6dc9357SAndroid Build Coastguard Worker         if (progressCompleted < progressTotal)
792*f6dc9357SAndroid Build Coastguard Worker           remainingTime = MyMultAndDiv(_elapsedTime, progressTotal - progressCompleted, progressCompleted);
793*f6dc9357SAndroid Build Coastguard Worker         UInt64 remainingSec = remainingTime / 1000;
794*f6dc9357SAndroid Build Coastguard Worker         if (remainingSec != _prevRemainingSec)
795*f6dc9357SAndroid Build Coastguard Worker         {
796*f6dc9357SAndroid Build Coastguard Worker           _prevRemainingSec = remainingSec;
797*f6dc9357SAndroid Build Coastguard Worker           wchar_t s[40];
798*f6dc9357SAndroid Build Coastguard Worker           GetTimeString(remainingSec, s);
799*f6dc9357SAndroid Build Coastguard Worker           SetItemText(IDT_PROGRESS_REMAINING_VAL, s);
800*f6dc9357SAndroid Build Coastguard Worker         }
801*f6dc9357SAndroid Build Coastguard Worker       }
802*f6dc9357SAndroid Build Coastguard Worker       {
803*f6dc9357SAndroid Build Coastguard Worker         const UInt64 elapsedTime = (_elapsedTime == 0) ? 1 : _elapsedTime;
804*f6dc9357SAndroid Build Coastguard Worker         // 22.02: progressCompleted can be for number of files
805*f6dc9357SAndroid Build Coastguard Worker         UInt64 v = (completed * 1000) / elapsedTime;
806*f6dc9357SAndroid Build Coastguard Worker         Byte c = 0;
807*f6dc9357SAndroid Build Coastguard Worker         unsigned moveBits = 0;
808*f6dc9357SAndroid Build Coastguard Worker              if (v >= ((UInt64)10000 << 10)) { moveBits = 20; c = 'M'; }
809*f6dc9357SAndroid Build Coastguard Worker         else if (v >= ((UInt64)10000 <<  0)) { moveBits = 10; c = 'K'; }
810*f6dc9357SAndroid Build Coastguard Worker         v >>= moveBits;
811*f6dc9357SAndroid Build Coastguard Worker         if (moveBits != _prevSpeed_MoveBits || v != _prevSpeed)
812*f6dc9357SAndroid Build Coastguard Worker         {
813*f6dc9357SAndroid Build Coastguard Worker           _prevSpeed_MoveBits = moveBits;
814*f6dc9357SAndroid Build Coastguard Worker           _prevSpeed = v;
815*f6dc9357SAndroid Build Coastguard Worker           wchar_t s[40];
816*f6dc9357SAndroid Build Coastguard Worker           ConvertUInt64ToString(v, s);
817*f6dc9357SAndroid Build Coastguard Worker           unsigned pos = MyStringLen(s);
818*f6dc9357SAndroid Build Coastguard Worker           s[pos++] = ' ';
819*f6dc9357SAndroid Build Coastguard Worker           if (moveBits != 0)
820*f6dc9357SAndroid Build Coastguard Worker             s[pos++] = c;
821*f6dc9357SAndroid Build Coastguard Worker           s[pos++] = 'B';
822*f6dc9357SAndroid Build Coastguard Worker           s[pos++] = '/';
823*f6dc9357SAndroid Build Coastguard Worker           s[pos++] = 's';
824*f6dc9357SAndroid Build Coastguard Worker           s[pos++] = 0;
825*f6dc9357SAndroid Build Coastguard Worker           SetItemText(IDT_PROGRESS_SPEED_VAL, s);
826*f6dc9357SAndroid Build Coastguard Worker         }
827*f6dc9357SAndroid Build Coastguard Worker       }
828*f6dc9357SAndroid Build Coastguard Worker     }
829*f6dc9357SAndroid Build Coastguard Worker 
830*f6dc9357SAndroid Build Coastguard Worker     {
831*f6dc9357SAndroid Build Coastguard Worker       UInt64 percent = 0;
832*f6dc9357SAndroid Build Coastguard Worker       {
833*f6dc9357SAndroid Build Coastguard Worker         if (IS_DEFINED_VAL(progressTotal))
834*f6dc9357SAndroid Build Coastguard Worker         {
835*f6dc9357SAndroid Build Coastguard Worker           percent = progressCompleted * 100;
836*f6dc9357SAndroid Build Coastguard Worker           if (progressTotal != 0)
837*f6dc9357SAndroid Build Coastguard Worker             percent /= progressTotal;
838*f6dc9357SAndroid Build Coastguard Worker         }
839*f6dc9357SAndroid Build Coastguard Worker       }
840*f6dc9357SAndroid Build Coastguard Worker       if (percent != _prevPercentValue)
841*f6dc9357SAndroid Build Coastguard Worker       {
842*f6dc9357SAndroid Build Coastguard Worker         _prevPercentValue = percent;
843*f6dc9357SAndroid Build Coastguard Worker         needSetTitle = true;
844*f6dc9357SAndroid Build Coastguard Worker       }
845*f6dc9357SAndroid Build Coastguard Worker     }
846*f6dc9357SAndroid Build Coastguard Worker 
847*f6dc9357SAndroid Build Coastguard Worker     {
848*f6dc9357SAndroid Build Coastguard Worker       wchar_t s[64];
849*f6dc9357SAndroid Build Coastguard Worker 
850*f6dc9357SAndroid Build Coastguard Worker       ConvertUInt64ToString(completedFiles, s);
851*f6dc9357SAndroid Build Coastguard Worker       if (_filesStr_Prev != s)
852*f6dc9357SAndroid Build Coastguard Worker       {
853*f6dc9357SAndroid Build Coastguard Worker         _filesStr_Prev = s;
854*f6dc9357SAndroid Build Coastguard Worker         SetItemText(IDT_PROGRESS_FILES_VAL, s);
855*f6dc9357SAndroid Build Coastguard Worker       }
856*f6dc9357SAndroid Build Coastguard Worker 
857*f6dc9357SAndroid Build Coastguard Worker       s[0] = 0;
858*f6dc9357SAndroid Build Coastguard Worker       if (IS_DEFINED_VAL(totalFiles))
859*f6dc9357SAndroid Build Coastguard Worker       {
860*f6dc9357SAndroid Build Coastguard Worker         MyStringCopy(s, L" / ");
861*f6dc9357SAndroid Build Coastguard Worker         ConvertUInt64ToString(totalFiles, s + MyStringLen(s));
862*f6dc9357SAndroid Build Coastguard Worker       }
863*f6dc9357SAndroid Build Coastguard Worker       if (_filesTotStr_Prev != s)
864*f6dc9357SAndroid Build Coastguard Worker       {
865*f6dc9357SAndroid Build Coastguard Worker         _filesTotStr_Prev = s;
866*f6dc9357SAndroid Build Coastguard Worker         SetItemText(IDT_PROGRESS_FILES_TOTAL, s);
867*f6dc9357SAndroid Build Coastguard Worker       }
868*f6dc9357SAndroid Build Coastguard Worker     }
869*f6dc9357SAndroid Build Coastguard Worker 
870*f6dc9357SAndroid Build Coastguard Worker     const UInt64 packSize   = CompressingMode ? outSize : inSize;
871*f6dc9357SAndroid Build Coastguard Worker     const UInt64 unpackSize = CompressingMode ? inSize : outSize;
872*f6dc9357SAndroid Build Coastguard Worker 
873*f6dc9357SAndroid Build Coastguard Worker     if (IS_UNDEFINED_VAL(unpackSize) &&
874*f6dc9357SAndroid Build Coastguard Worker         IS_UNDEFINED_VAL(packSize))
875*f6dc9357SAndroid Build Coastguard Worker     {
876*f6dc9357SAndroid Build Coastguard Worker       ShowSize(IDT_PROGRESS_PROCESSED_VAL, completed, _processed_Prev);
877*f6dc9357SAndroid Build Coastguard Worker       ShowSize(IDT_PROGRESS_PACKED_VAL, UNDEFINED_VAL, _packed_Prev);
878*f6dc9357SAndroid Build Coastguard Worker     }
879*f6dc9357SAndroid Build Coastguard Worker     else
880*f6dc9357SAndroid Build Coastguard Worker     {
881*f6dc9357SAndroid Build Coastguard Worker       ShowSize(IDT_PROGRESS_PROCESSED_VAL, unpackSize, _processed_Prev);
882*f6dc9357SAndroid Build Coastguard Worker       ShowSize(IDT_PROGRESS_PACKED_VAL, packSize, _packed_Prev);
883*f6dc9357SAndroid Build Coastguard Worker 
884*f6dc9357SAndroid Build Coastguard Worker       if (IS_DEFINED_VAL(packSize) &&
885*f6dc9357SAndroid Build Coastguard Worker           IS_DEFINED_VAL(unpackSize) &&
886*f6dc9357SAndroid Build Coastguard Worker           unpackSize != 0)
887*f6dc9357SAndroid Build Coastguard Worker       {
888*f6dc9357SAndroid Build Coastguard Worker         wchar_t s[32];
889*f6dc9357SAndroid Build Coastguard Worker         UInt64 ratio = packSize * 100 / unpackSize;
890*f6dc9357SAndroid Build Coastguard Worker         if (_ratio_Prev != ratio)
891*f6dc9357SAndroid Build Coastguard Worker         {
892*f6dc9357SAndroid Build Coastguard Worker           _ratio_Prev = ratio;
893*f6dc9357SAndroid Build Coastguard Worker           ConvertUInt64ToString(ratio, s);
894*f6dc9357SAndroid Build Coastguard Worker           MyStringCat(s, L"%");
895*f6dc9357SAndroid Build Coastguard Worker           SetItemText(IDT_PROGRESS_RATIO_VAL, s);
896*f6dc9357SAndroid Build Coastguard Worker         }
897*f6dc9357SAndroid Build Coastguard Worker       }
898*f6dc9357SAndroid Build Coastguard Worker     }
899*f6dc9357SAndroid Build Coastguard Worker   }
900*f6dc9357SAndroid Build Coastguard Worker 
901*f6dc9357SAndroid Build Coastguard Worker   if (needSetTitle || titleFileName_Changed)
902*f6dc9357SAndroid Build Coastguard Worker     SetTitleText();
903*f6dc9357SAndroid Build Coastguard Worker 
904*f6dc9357SAndroid Build Coastguard Worker   if (status_Changed)
905*f6dc9357SAndroid Build Coastguard Worker   {
906*f6dc9357SAndroid Build Coastguard Worker     UString s = _status;
907*f6dc9357SAndroid Build Coastguard Worker     ReduceString(s, _numReduceSymbols);
908*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_PROGRESS_STATUS, s);
909*f6dc9357SAndroid Build Coastguard Worker   }
910*f6dc9357SAndroid Build Coastguard Worker 
911*f6dc9357SAndroid Build Coastguard Worker   if (curFilePath_Changed)
912*f6dc9357SAndroid Build Coastguard Worker   {
913*f6dc9357SAndroid Build Coastguard Worker     UString s1, s2;
914*f6dc9357SAndroid Build Coastguard Worker     if (_isDir)
915*f6dc9357SAndroid Build Coastguard Worker       s1 = _filePath;
916*f6dc9357SAndroid Build Coastguard Worker     else
917*f6dc9357SAndroid Build Coastguard Worker     {
918*f6dc9357SAndroid Build Coastguard Worker       int slashPos = _filePath.ReverseFind_PathSepar();
919*f6dc9357SAndroid Build Coastguard Worker       if (slashPos >= 0)
920*f6dc9357SAndroid Build Coastguard Worker       {
921*f6dc9357SAndroid Build Coastguard Worker         s1.SetFrom(_filePath, (unsigned)(slashPos + 1));
922*f6dc9357SAndroid Build Coastguard Worker         s2 = _filePath.Ptr((unsigned)(slashPos + 1));
923*f6dc9357SAndroid Build Coastguard Worker       }
924*f6dc9357SAndroid Build Coastguard Worker       else
925*f6dc9357SAndroid Build Coastguard Worker         s2 = _filePath;
926*f6dc9357SAndroid Build Coastguard Worker     }
927*f6dc9357SAndroid Build Coastguard Worker     ReduceString(s1, _numReduceSymbols);
928*f6dc9357SAndroid Build Coastguard Worker     ReduceString(s2, _numReduceSymbols);
929*f6dc9357SAndroid Build Coastguard Worker     s1.Add_LF();
930*f6dc9357SAndroid Build Coastguard Worker     s1 += s2;
931*f6dc9357SAndroid Build Coastguard Worker     SetItemText(IDT_PROGRESS_FILE_NAME, s1);
932*f6dc9357SAndroid Build Coastguard Worker   }
933*f6dc9357SAndroid Build Coastguard Worker }
934*f6dc9357SAndroid Build Coastguard Worker 
OnTimer(WPARAM,LPARAM)935*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)
936*f6dc9357SAndroid Build Coastguard Worker {
937*f6dc9357SAndroid Build Coastguard Worker   if (Sync.Get_Paused())
938*f6dc9357SAndroid Build Coastguard Worker     return true;
939*f6dc9357SAndroid Build Coastguard Worker   CheckNeedClose();
940*f6dc9357SAndroid Build Coastguard Worker   UpdateStatInfo(false);
941*f6dc9357SAndroid Build Coastguard Worker   return true;
942*f6dc9357SAndroid Build Coastguard Worker }
943*f6dc9357SAndroid Build Coastguard Worker 
944*f6dc9357SAndroid Build Coastguard Worker struct CWaitCursor
945*f6dc9357SAndroid Build Coastguard Worker {
946*f6dc9357SAndroid Build Coastguard Worker   HCURSOR _waitCursor;
947*f6dc9357SAndroid Build Coastguard Worker   HCURSOR _oldCursor;
CWaitCursorCWaitCursor948*f6dc9357SAndroid Build Coastguard Worker   CWaitCursor()
949*f6dc9357SAndroid Build Coastguard Worker   {
950*f6dc9357SAndroid Build Coastguard Worker     _waitCursor = LoadCursor(NULL, IDC_WAIT);
951*f6dc9357SAndroid Build Coastguard Worker     if (_waitCursor != NULL)
952*f6dc9357SAndroid Build Coastguard Worker       _oldCursor = SetCursor(_waitCursor);
953*f6dc9357SAndroid Build Coastguard Worker   }
~CWaitCursorCWaitCursor954*f6dc9357SAndroid Build Coastguard Worker   ~CWaitCursor()
955*f6dc9357SAndroid Build Coastguard Worker   {
956*f6dc9357SAndroid Build Coastguard Worker     if (_waitCursor != NULL)
957*f6dc9357SAndroid Build Coastguard Worker       SetCursor(_oldCursor);
958*f6dc9357SAndroid Build Coastguard Worker   }
959*f6dc9357SAndroid Build Coastguard Worker };
960*f6dc9357SAndroid Build Coastguard Worker 
Create(const UString & title,NWindows::CThread & thread,HWND wndParent)961*f6dc9357SAndroid Build Coastguard Worker INT_PTR CProgressDialog::Create(const UString &title, NWindows::CThread &thread, HWND wndParent)
962*f6dc9357SAndroid Build Coastguard Worker {
963*f6dc9357SAndroid Build Coastguard Worker   INT_PTR res = 0;
964*f6dc9357SAndroid Build Coastguard Worker   try
965*f6dc9357SAndroid Build Coastguard Worker   {
966*f6dc9357SAndroid Build Coastguard Worker     if (WaitMode)
967*f6dc9357SAndroid Build Coastguard Worker     {
968*f6dc9357SAndroid Build Coastguard Worker       CWaitCursor waitCursor;
969*f6dc9357SAndroid Build Coastguard Worker       HANDLE h[] = { thread, _createDialogEvent };
970*f6dc9357SAndroid Build Coastguard Worker 
971*f6dc9357SAndroid Build Coastguard Worker       const DWORD res2 = WaitForMultipleObjects(Z7_ARRAY_SIZE(h), h, FALSE, kCreateDelay);
972*f6dc9357SAndroid Build Coastguard Worker       if (res2 == WAIT_OBJECT_0 && !Sync.ThereIsMessage())
973*f6dc9357SAndroid Build Coastguard Worker         return 0;
974*f6dc9357SAndroid Build Coastguard Worker     }
975*f6dc9357SAndroid Build Coastguard Worker     _title = title;
976*f6dc9357SAndroid Build Coastguard Worker     BIG_DIALOG_SIZE(360, 192);
977*f6dc9357SAndroid Build Coastguard Worker     res = CModalDialog::Create(SIZED_DIALOG(IDD_PROGRESS), wndParent);
978*f6dc9357SAndroid Build Coastguard Worker   }
979*f6dc9357SAndroid Build Coastguard Worker   catch(...)
980*f6dc9357SAndroid Build Coastguard Worker   {
981*f6dc9357SAndroid Build Coastguard Worker     _wasCreated = true;
982*f6dc9357SAndroid Build Coastguard Worker     _dialogCreatedEvent.Set();
983*f6dc9357SAndroid Build Coastguard Worker   }
984*f6dc9357SAndroid Build Coastguard Worker   thread.Wait_Close();
985*f6dc9357SAndroid Build Coastguard Worker   if (!MessagesDisplayed)
986*f6dc9357SAndroid Build Coastguard Worker   if (!g_DisableUserQuestions)
987*f6dc9357SAndroid Build Coastguard Worker     MessageBoxW(wndParent, L"Progress Error", L"7-Zip", MB_ICONERROR);
988*f6dc9357SAndroid Build Coastguard Worker   return res;
989*f6dc9357SAndroid Build Coastguard Worker }
990*f6dc9357SAndroid Build Coastguard Worker 
OnExternalCloseMessage()991*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnExternalCloseMessage()
992*f6dc9357SAndroid Build Coastguard Worker {
993*f6dc9357SAndroid Build Coastguard Worker   // it doesn't work if there is MessageBox.
994*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
995*f6dc9357SAndroid Build Coastguard Worker   SetTaskbarProgressState(TBPF_NOPROGRESS);
996*f6dc9357SAndroid Build Coastguard Worker   // #endif
997*f6dc9357SAndroid Build Coastguard Worker   // AddToTitle(L"Finished ");
998*f6dc9357SAndroid Build Coastguard Worker   // SetText(L"Finished2 ");
999*f6dc9357SAndroid Build Coastguard Worker 
1000*f6dc9357SAndroid Build Coastguard Worker   UpdateStatInfo(true);
1001*f6dc9357SAndroid Build Coastguard Worker 
1002*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDCANCEL, LangString(IDS_CLOSE));
1003*f6dc9357SAndroid Build Coastguard Worker   ::SendMessage(GetItem(IDCANCEL), BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
1004*f6dc9357SAndroid Build Coastguard Worker   HideItem(IDB_PROGRESS_BACKGROUND);
1005*f6dc9357SAndroid Build Coastguard Worker   HideItem(IDB_PAUSE);
1006*f6dc9357SAndroid Build Coastguard Worker 
1007*f6dc9357SAndroid Build Coastguard Worker   ProcessWasFinished_GuiVirt();
1008*f6dc9357SAndroid Build Coastguard Worker 
1009*f6dc9357SAndroid Build Coastguard Worker   bool thereAreMessages;
1010*f6dc9357SAndroid Build Coastguard Worker   CProgressFinalMessage fm;
1011*f6dc9357SAndroid Build Coastguard Worker   {
1012*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(Sync._cs);
1013*f6dc9357SAndroid Build Coastguard Worker     thereAreMessages = !Sync.Messages.IsEmpty();
1014*f6dc9357SAndroid Build Coastguard Worker     fm = Sync.FinalMessage;
1015*f6dc9357SAndroid Build Coastguard Worker   }
1016*f6dc9357SAndroid Build Coastguard Worker 
1017*f6dc9357SAndroid Build Coastguard Worker   if (!fm.ErrorMessage.Message.IsEmpty())
1018*f6dc9357SAndroid Build Coastguard Worker   {
1019*f6dc9357SAndroid Build Coastguard Worker     MessagesDisplayed = true;
1020*f6dc9357SAndroid Build Coastguard Worker     if (fm.ErrorMessage.Title.IsEmpty())
1021*f6dc9357SAndroid Build Coastguard Worker       fm.ErrorMessage.Title = "7-Zip";
1022*f6dc9357SAndroid Build Coastguard Worker     if (!g_DisableUserQuestions)
1023*f6dc9357SAndroid Build Coastguard Worker       MessageBoxW(*this, fm.ErrorMessage.Message, fm.ErrorMessage.Title, MB_ICONERROR);
1024*f6dc9357SAndroid Build Coastguard Worker   }
1025*f6dc9357SAndroid Build Coastguard Worker   else if (!thereAreMessages)
1026*f6dc9357SAndroid Build Coastguard Worker   {
1027*f6dc9357SAndroid Build Coastguard Worker     MessagesDisplayed = true;
1028*f6dc9357SAndroid Build Coastguard Worker 
1029*f6dc9357SAndroid Build Coastguard Worker     if (!fm.OkMessage.Message.IsEmpty())
1030*f6dc9357SAndroid Build Coastguard Worker     {
1031*f6dc9357SAndroid Build Coastguard Worker       if (fm.OkMessage.Title.IsEmpty())
1032*f6dc9357SAndroid Build Coastguard Worker         fm.OkMessage.Title = "7-Zip";
1033*f6dc9357SAndroid Build Coastguard Worker       if (!g_DisableUserQuestions)
1034*f6dc9357SAndroid Build Coastguard Worker         MessageBoxW(*this, fm.OkMessage.Message, fm.OkMessage.Title, MB_OK);
1035*f6dc9357SAndroid Build Coastguard Worker     }
1036*f6dc9357SAndroid Build Coastguard Worker   }
1037*f6dc9357SAndroid Build Coastguard Worker 
1038*f6dc9357SAndroid Build Coastguard Worker   if (!g_DisableUserQuestions)
1039*f6dc9357SAndroid Build Coastguard Worker   if (thereAreMessages && !_cancelWasPressed)
1040*f6dc9357SAndroid Build Coastguard Worker   {
1041*f6dc9357SAndroid Build Coastguard Worker     _waitCloseByCancelButton = true;
1042*f6dc9357SAndroid Build Coastguard Worker     UpdateMessagesDialog();
1043*f6dc9357SAndroid Build Coastguard Worker     return true;
1044*f6dc9357SAndroid Build Coastguard Worker   }
1045*f6dc9357SAndroid Build Coastguard Worker 
1046*f6dc9357SAndroid Build Coastguard Worker   End(0);
1047*f6dc9357SAndroid Build Coastguard Worker   return true;
1048*f6dc9357SAndroid Build Coastguard Worker }
1049*f6dc9357SAndroid Build Coastguard Worker 
OnMessage(UINT message,WPARAM wParam,LPARAM lParam)1050*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
1051*f6dc9357SAndroid Build Coastguard Worker {
1052*f6dc9357SAndroid Build Coastguard Worker   switch (message)
1053*f6dc9357SAndroid Build Coastguard Worker   {
1054*f6dc9357SAndroid Build Coastguard Worker     case kCloseMessage:
1055*f6dc9357SAndroid Build Coastguard Worker     {
1056*f6dc9357SAndroid Build Coastguard Worker       if (_timer)
1057*f6dc9357SAndroid Build Coastguard Worker       {
1058*f6dc9357SAndroid Build Coastguard Worker         /* 21.03 : KillTimer(kTimerID) instead of KillTimer(_timer).
1059*f6dc9357SAndroid Build Coastguard Worker            But (_timer == kTimerID) in Win10. So it worked too */
1060*f6dc9357SAndroid Build Coastguard Worker         KillTimer(kTimerID);
1061*f6dc9357SAndroid Build Coastguard Worker         _timer = 0;
1062*f6dc9357SAndroid Build Coastguard Worker       }
1063*f6dc9357SAndroid Build Coastguard Worker       if (_inCancelMessageBox)
1064*f6dc9357SAndroid Build Coastguard Worker       {
1065*f6dc9357SAndroid Build Coastguard Worker         /* if user is in MessageBox(), we will call OnExternalCloseMessage()
1066*f6dc9357SAndroid Build Coastguard Worker            later, when MessageBox() will be closed */
1067*f6dc9357SAndroid Build Coastguard Worker         _externalCloseMessageWasReceived = true;
1068*f6dc9357SAndroid Build Coastguard Worker         break;
1069*f6dc9357SAndroid Build Coastguard Worker       }
1070*f6dc9357SAndroid Build Coastguard Worker       return OnExternalCloseMessage();
1071*f6dc9357SAndroid Build Coastguard Worker     }
1072*f6dc9357SAndroid Build Coastguard Worker     /*
1073*f6dc9357SAndroid Build Coastguard Worker     case WM_SETTEXT:
1074*f6dc9357SAndroid Build Coastguard Worker     {
1075*f6dc9357SAndroid Build Coastguard Worker       if (_timer == 0)
1076*f6dc9357SAndroid Build Coastguard Worker         return true;
1077*f6dc9357SAndroid Build Coastguard Worker       break;
1078*f6dc9357SAndroid Build Coastguard Worker     }
1079*f6dc9357SAndroid Build Coastguard Worker     */
1080*f6dc9357SAndroid Build Coastguard Worker   }
1081*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnMessage(message, wParam, lParam);
1082*f6dc9357SAndroid Build Coastguard Worker }
1083*f6dc9357SAndroid Build Coastguard Worker 
SetTitleText()1084*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetTitleText()
1085*f6dc9357SAndroid Build Coastguard Worker {
1086*f6dc9357SAndroid Build Coastguard Worker   UString s;
1087*f6dc9357SAndroid Build Coastguard Worker   if (Sync.Get_Paused())
1088*f6dc9357SAndroid Build Coastguard Worker   {
1089*f6dc9357SAndroid Build Coastguard Worker     s += _paused_String;
1090*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1091*f6dc9357SAndroid Build Coastguard Worker   }
1092*f6dc9357SAndroid Build Coastguard Worker   if (IS_DEFINED_VAL(_prevPercentValue))
1093*f6dc9357SAndroid Build Coastguard Worker   {
1094*f6dc9357SAndroid Build Coastguard Worker     s.Add_UInt64(_prevPercentValue);
1095*f6dc9357SAndroid Build Coastguard Worker     s.Add_Char('%');
1096*f6dc9357SAndroid Build Coastguard Worker   }
1097*f6dc9357SAndroid Build Coastguard Worker   if (_background)
1098*f6dc9357SAndroid Build Coastguard Worker   {
1099*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1100*f6dc9357SAndroid Build Coastguard Worker     s += _backgrounded_String;
1101*f6dc9357SAndroid Build Coastguard Worker   }
1102*f6dc9357SAndroid Build Coastguard Worker 
1103*f6dc9357SAndroid Build Coastguard Worker   s.Add_Space();
1104*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
1105*f6dc9357SAndroid Build Coastguard Worker   {
1106*f6dc9357SAndroid Build Coastguard Worker     unsigned len = s.Len();
1107*f6dc9357SAndroid Build Coastguard Worker     s += MainAddTitle;
1108*f6dc9357SAndroid Build Coastguard Worker     AddToTitle(s);
1109*f6dc9357SAndroid Build Coastguard Worker     s.DeleteFrom(len);
1110*f6dc9357SAndroid Build Coastguard Worker   }
1111*f6dc9357SAndroid Build Coastguard Worker   #endif
1112*f6dc9357SAndroid Build Coastguard Worker 
1113*f6dc9357SAndroid Build Coastguard Worker   s += _title;
1114*f6dc9357SAndroid Build Coastguard Worker   if (!_titleFileName.IsEmpty())
1115*f6dc9357SAndroid Build Coastguard Worker   {
1116*f6dc9357SAndroid Build Coastguard Worker     UString fileName = _titleFileName;
1117*f6dc9357SAndroid Build Coastguard Worker     ReduceString(fileName, kTitleFileNameSizeLimit);
1118*f6dc9357SAndroid Build Coastguard Worker     s.Add_Space();
1119*f6dc9357SAndroid Build Coastguard Worker     s += fileName;
1120*f6dc9357SAndroid Build Coastguard Worker   }
1121*f6dc9357SAndroid Build Coastguard Worker   SetText(s);
1122*f6dc9357SAndroid Build Coastguard Worker }
1123*f6dc9357SAndroid Build Coastguard Worker 
SetPauseText()1124*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetPauseText()
1125*f6dc9357SAndroid Build Coastguard Worker {
1126*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDB_PAUSE, Sync.Get_Paused() ? _continue_String : _pause_String);
1127*f6dc9357SAndroid Build Coastguard Worker   SetTitleText();
1128*f6dc9357SAndroid Build Coastguard Worker }
1129*f6dc9357SAndroid Build Coastguard Worker 
OnPauseButton()1130*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnPauseButton()
1131*f6dc9357SAndroid Build Coastguard Worker {
1132*f6dc9357SAndroid Build Coastguard Worker   bool paused = !Sync.Get_Paused();
1133*f6dc9357SAndroid Build Coastguard Worker   Sync.Set_Paused(paused);
1134*f6dc9357SAndroid Build Coastguard Worker   UInt32 curTime = ::GetTickCount();
1135*f6dc9357SAndroid Build Coastguard Worker   if (paused)
1136*f6dc9357SAndroid Build Coastguard Worker     _elapsedTime += (curTime - _prevTime);
1137*f6dc9357SAndroid Build Coastguard Worker   SetTaskbarProgressState();
1138*f6dc9357SAndroid Build Coastguard Worker   _prevTime = curTime;
1139*f6dc9357SAndroid Build Coastguard Worker   SetPauseText();
1140*f6dc9357SAndroid Build Coastguard Worker }
1141*f6dc9357SAndroid Build Coastguard Worker 
SetPriorityText()1142*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::SetPriorityText()
1143*f6dc9357SAndroid Build Coastguard Worker {
1144*f6dc9357SAndroid Build Coastguard Worker   SetItemText(IDB_PROGRESS_BACKGROUND, _background ?
1145*f6dc9357SAndroid Build Coastguard Worker       _foreground_String :
1146*f6dc9357SAndroid Build Coastguard Worker       _background_String);
1147*f6dc9357SAndroid Build Coastguard Worker   SetTitleText();
1148*f6dc9357SAndroid Build Coastguard Worker }
1149*f6dc9357SAndroid Build Coastguard Worker 
OnPriorityButton()1150*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::OnPriorityButton()
1151*f6dc9357SAndroid Build Coastguard Worker {
1152*f6dc9357SAndroid Build Coastguard Worker   _background = !_background;
1153*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
1154*f6dc9357SAndroid Build Coastguard Worker   SetPriorityClass(GetCurrentProcess(), _background ? IDLE_PRIORITY_CLASS : NORMAL_PRIORITY_CLASS);
1155*f6dc9357SAndroid Build Coastguard Worker   #endif
1156*f6dc9357SAndroid Build Coastguard Worker   SetPriorityText();
1157*f6dc9357SAndroid Build Coastguard Worker }
1158*f6dc9357SAndroid Build Coastguard Worker 
AddMessageDirect(LPCWSTR message,bool needNumber)1159*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::AddMessageDirect(LPCWSTR message, bool needNumber)
1160*f6dc9357SAndroid Build Coastguard Worker {
1161*f6dc9357SAndroid Build Coastguard Worker   wchar_t sz[16];
1162*f6dc9357SAndroid Build Coastguard Worker   sz[0] = 0;
1163*f6dc9357SAndroid Build Coastguard Worker   if (needNumber)
1164*f6dc9357SAndroid Build Coastguard Worker     ConvertUInt32ToString(_numMessages + 1, sz);
1165*f6dc9357SAndroid Build Coastguard Worker   const unsigned itemIndex = _messageStrings.Size(); // _messageList.GetItemCount();
1166*f6dc9357SAndroid Build Coastguard Worker   if (_messageList.InsertItem(itemIndex, sz) == (int)itemIndex)
1167*f6dc9357SAndroid Build Coastguard Worker   {
1168*f6dc9357SAndroid Build Coastguard Worker     _messageList.SetSubItem(itemIndex, 1, message);
1169*f6dc9357SAndroid Build Coastguard Worker     _messageStrings.Add(message);
1170*f6dc9357SAndroid Build Coastguard Worker   }
1171*f6dc9357SAndroid Build Coastguard Worker }
1172*f6dc9357SAndroid Build Coastguard Worker 
AddMessage(LPCWSTR message)1173*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::AddMessage(LPCWSTR message)
1174*f6dc9357SAndroid Build Coastguard Worker {
1175*f6dc9357SAndroid Build Coastguard Worker   UString s = message;
1176*f6dc9357SAndroid Build Coastguard Worker   bool needNumber = true;
1177*f6dc9357SAndroid Build Coastguard Worker   while (!s.IsEmpty())
1178*f6dc9357SAndroid Build Coastguard Worker   {
1179*f6dc9357SAndroid Build Coastguard Worker     const int pos = s.Find(L'\n');
1180*f6dc9357SAndroid Build Coastguard Worker     if (pos < 0)
1181*f6dc9357SAndroid Build Coastguard Worker       break;
1182*f6dc9357SAndroid Build Coastguard Worker     AddMessageDirect(s.Left((unsigned)pos), needNumber);
1183*f6dc9357SAndroid Build Coastguard Worker     needNumber = false;
1184*f6dc9357SAndroid Build Coastguard Worker     s.DeleteFrontal((unsigned)pos + 1);
1185*f6dc9357SAndroid Build Coastguard Worker   }
1186*f6dc9357SAndroid Build Coastguard Worker   AddMessageDirect(s, needNumber);
1187*f6dc9357SAndroid Build Coastguard Worker   _numMessages++;
1188*f6dc9357SAndroid Build Coastguard Worker }
1189*f6dc9357SAndroid Build Coastguard Worker 
GetNumDigits(unsigned val)1190*f6dc9357SAndroid Build Coastguard Worker static unsigned GetNumDigits(unsigned val)
1191*f6dc9357SAndroid Build Coastguard Worker {
1192*f6dc9357SAndroid Build Coastguard Worker   unsigned i = 0;
1193*f6dc9357SAndroid Build Coastguard Worker   for (;;)
1194*f6dc9357SAndroid Build Coastguard Worker   {
1195*f6dc9357SAndroid Build Coastguard Worker     i++;
1196*f6dc9357SAndroid Build Coastguard Worker     val /= 10;
1197*f6dc9357SAndroid Build Coastguard Worker     if (val == 0)
1198*f6dc9357SAndroid Build Coastguard Worker       return i;
1199*f6dc9357SAndroid Build Coastguard Worker   }
1200*f6dc9357SAndroid Build Coastguard Worker }
1201*f6dc9357SAndroid Build Coastguard Worker 
UpdateMessagesDialog()1202*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::UpdateMessagesDialog()
1203*f6dc9357SAndroid Build Coastguard Worker {
1204*f6dc9357SAndroid Build Coastguard Worker   UStringVector messages;
1205*f6dc9357SAndroid Build Coastguard Worker   {
1206*f6dc9357SAndroid Build Coastguard Worker     NSynchronization::CCriticalSectionLock lock(Sync._cs);
1207*f6dc9357SAndroid Build Coastguard Worker     const unsigned num = Sync.Messages.Size();
1208*f6dc9357SAndroid Build Coastguard Worker     if (num > _numPostedMessages)
1209*f6dc9357SAndroid Build Coastguard Worker     {
1210*f6dc9357SAndroid Build Coastguard Worker       messages.ClearAndReserve(num - _numPostedMessages);
1211*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = _numPostedMessages; i < num; i++)
1212*f6dc9357SAndroid Build Coastguard Worker         messages.AddInReserved(Sync.Messages[i]);
1213*f6dc9357SAndroid Build Coastguard Worker       _numPostedMessages = num;
1214*f6dc9357SAndroid Build Coastguard Worker     }
1215*f6dc9357SAndroid Build Coastguard Worker   }
1216*f6dc9357SAndroid Build Coastguard Worker   if (!messages.IsEmpty())
1217*f6dc9357SAndroid Build Coastguard Worker   {
1218*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, messages)
1219*f6dc9357SAndroid Build Coastguard Worker       AddMessage(messages[i]);
1220*f6dc9357SAndroid Build Coastguard Worker     // SetColumnWidthAuto() can be slow for big number of files.
1221*f6dc9357SAndroid Build Coastguard Worker     if (_numPostedMessages < 1000000 || _numAutoSizeMessages < 100)
1222*f6dc9357SAndroid Build Coastguard Worker     if (_numAutoSizeMessages < 100 ||
1223*f6dc9357SAndroid Build Coastguard Worker         GetNumDigits(_numPostedMessages) >
1224*f6dc9357SAndroid Build Coastguard Worker         GetNumDigits(_numAutoSizeMessages))
1225*f6dc9357SAndroid Build Coastguard Worker     {
1226*f6dc9357SAndroid Build Coastguard Worker       _messageList.SetColumnWidthAuto(0);
1227*f6dc9357SAndroid Build Coastguard Worker       _messageList.SetColumnWidthAuto(1);
1228*f6dc9357SAndroid Build Coastguard Worker       _numAutoSizeMessages = _numPostedMessages;
1229*f6dc9357SAndroid Build Coastguard Worker     }
1230*f6dc9357SAndroid Build Coastguard Worker   }
1231*f6dc9357SAndroid Build Coastguard Worker }
1232*f6dc9357SAndroid Build Coastguard Worker 
1233*f6dc9357SAndroid Build Coastguard Worker 
OnButtonClicked(unsigned buttonID,HWND buttonHWND)1234*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
1235*f6dc9357SAndroid Build Coastguard Worker {
1236*f6dc9357SAndroid Build Coastguard Worker   switch (buttonID)
1237*f6dc9357SAndroid Build Coastguard Worker   {
1238*f6dc9357SAndroid Build Coastguard Worker     // case IDOK: // if IDCANCEL is not DEFPUSHBUTTON
1239*f6dc9357SAndroid Build Coastguard Worker     case IDCANCEL:
1240*f6dc9357SAndroid Build Coastguard Worker     {
1241*f6dc9357SAndroid Build Coastguard Worker       if (_waitCloseByCancelButton)
1242*f6dc9357SAndroid Build Coastguard Worker       {
1243*f6dc9357SAndroid Build Coastguard Worker         MessagesDisplayed = true;
1244*f6dc9357SAndroid Build Coastguard Worker         End(IDCLOSE);
1245*f6dc9357SAndroid Build Coastguard Worker         break;
1246*f6dc9357SAndroid Build Coastguard Worker       }
1247*f6dc9357SAndroid Build Coastguard Worker 
1248*f6dc9357SAndroid Build Coastguard Worker       if (_cancelWasPressed)
1249*f6dc9357SAndroid Build Coastguard Worker         return true;
1250*f6dc9357SAndroid Build Coastguard Worker 
1251*f6dc9357SAndroid Build Coastguard Worker       const bool paused = Sync.Get_Paused();
1252*f6dc9357SAndroid Build Coastguard Worker 
1253*f6dc9357SAndroid Build Coastguard Worker       if (!paused)
1254*f6dc9357SAndroid Build Coastguard Worker       {
1255*f6dc9357SAndroid Build Coastguard Worker         OnPauseButton();
1256*f6dc9357SAndroid Build Coastguard Worker       }
1257*f6dc9357SAndroid Build Coastguard Worker 
1258*f6dc9357SAndroid Build Coastguard Worker       _inCancelMessageBox = true;
1259*f6dc9357SAndroid Build Coastguard Worker       const int res = ::MessageBoxW(*this, LangString(IDS_PROGRESS_ASK_CANCEL), _title, MB_YESNOCANCEL);
1260*f6dc9357SAndroid Build Coastguard Worker       _inCancelMessageBox = false;
1261*f6dc9357SAndroid Build Coastguard Worker       if (res == IDYES)
1262*f6dc9357SAndroid Build Coastguard Worker         _cancelWasPressed = true;
1263*f6dc9357SAndroid Build Coastguard Worker 
1264*f6dc9357SAndroid Build Coastguard Worker       if (!paused)
1265*f6dc9357SAndroid Build Coastguard Worker       {
1266*f6dc9357SAndroid Build Coastguard Worker         OnPauseButton();
1267*f6dc9357SAndroid Build Coastguard Worker       }
1268*f6dc9357SAndroid Build Coastguard Worker 
1269*f6dc9357SAndroid Build Coastguard Worker       if (_externalCloseMessageWasReceived)
1270*f6dc9357SAndroid Build Coastguard Worker       {
1271*f6dc9357SAndroid Build Coastguard Worker         /* we have received kCloseMessage while we were in MessageBoxW().
1272*f6dc9357SAndroid Build Coastguard Worker            so we call OnExternalCloseMessage() here.
1273*f6dc9357SAndroid Build Coastguard Worker            it can show MessageBox and it can close dialog */
1274*f6dc9357SAndroid Build Coastguard Worker         OnExternalCloseMessage();
1275*f6dc9357SAndroid Build Coastguard Worker         return true;
1276*f6dc9357SAndroid Build Coastguard Worker       }
1277*f6dc9357SAndroid Build Coastguard Worker 
1278*f6dc9357SAndroid Build Coastguard Worker       if (!_cancelWasPressed)
1279*f6dc9357SAndroid Build Coastguard Worker         return true;
1280*f6dc9357SAndroid Build Coastguard Worker 
1281*f6dc9357SAndroid Build Coastguard Worker       MessagesDisplayed = true;
1282*f6dc9357SAndroid Build Coastguard Worker       // we will call Sync.Set_Stopped(true) in OnButtonClicked() : OnCancel()
1283*f6dc9357SAndroid Build Coastguard Worker       break;
1284*f6dc9357SAndroid Build Coastguard Worker     }
1285*f6dc9357SAndroid Build Coastguard Worker 
1286*f6dc9357SAndroid Build Coastguard Worker     case IDB_PAUSE:
1287*f6dc9357SAndroid Build Coastguard Worker       OnPauseButton();
1288*f6dc9357SAndroid Build Coastguard Worker       return true;
1289*f6dc9357SAndroid Build Coastguard Worker     case IDB_PROGRESS_BACKGROUND:
1290*f6dc9357SAndroid Build Coastguard Worker       OnPriorityButton();
1291*f6dc9357SAndroid Build Coastguard Worker       return true;
1292*f6dc9357SAndroid Build Coastguard Worker   }
1293*f6dc9357SAndroid Build Coastguard Worker   return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
1294*f6dc9357SAndroid Build Coastguard Worker }
1295*f6dc9357SAndroid Build Coastguard Worker 
CheckNeedClose()1296*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::CheckNeedClose()
1297*f6dc9357SAndroid Build Coastguard Worker {
1298*f6dc9357SAndroid Build Coastguard Worker   if (_needClose)
1299*f6dc9357SAndroid Build Coastguard Worker   {
1300*f6dc9357SAndroid Build Coastguard Worker     PostMsg(kCloseMessage);
1301*f6dc9357SAndroid Build Coastguard Worker     _needClose = false;
1302*f6dc9357SAndroid Build Coastguard Worker   }
1303*f6dc9357SAndroid Build Coastguard Worker }
1304*f6dc9357SAndroid Build Coastguard Worker 
ProcessWasFinished()1305*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::ProcessWasFinished()
1306*f6dc9357SAndroid Build Coastguard Worker {
1307*f6dc9357SAndroid Build Coastguard Worker   // Set Window title here.
1308*f6dc9357SAndroid Build Coastguard Worker   if (!WaitMode)
1309*f6dc9357SAndroid Build Coastguard Worker     WaitCreating();
1310*f6dc9357SAndroid Build Coastguard Worker 
1311*f6dc9357SAndroid Build Coastguard Worker   if (_wasCreated)
1312*f6dc9357SAndroid Build Coastguard Worker     PostMsg(kCloseMessage);
1313*f6dc9357SAndroid Build Coastguard Worker   else
1314*f6dc9357SAndroid Build Coastguard Worker     _needClose = true;
1315*f6dc9357SAndroid Build Coastguard Worker }
1316*f6dc9357SAndroid Build Coastguard Worker 
1317*f6dc9357SAndroid Build Coastguard Worker 
OnNotify(UINT,LPNMHDR header)1318*f6dc9357SAndroid Build Coastguard Worker bool CProgressDialog::OnNotify(UINT /* controlID */, LPNMHDR header)
1319*f6dc9357SAndroid Build Coastguard Worker {
1320*f6dc9357SAndroid Build Coastguard Worker   if (header->hwndFrom != _messageList)
1321*f6dc9357SAndroid Build Coastguard Worker     return false;
1322*f6dc9357SAndroid Build Coastguard Worker   switch (header->code)
1323*f6dc9357SAndroid Build Coastguard Worker   {
1324*f6dc9357SAndroid Build Coastguard Worker     case LVN_KEYDOWN:
1325*f6dc9357SAndroid Build Coastguard Worker     {
1326*f6dc9357SAndroid Build Coastguard Worker       LPNMLVKEYDOWN keyDownInfo = LPNMLVKEYDOWN(header);
1327*f6dc9357SAndroid Build Coastguard Worker       switch (keyDownInfo->wVKey)
1328*f6dc9357SAndroid Build Coastguard Worker       {
1329*f6dc9357SAndroid Build Coastguard Worker         case 'A':
1330*f6dc9357SAndroid Build Coastguard Worker         {
1331*f6dc9357SAndroid Build Coastguard Worker           if (IsKeyDown(VK_CONTROL))
1332*f6dc9357SAndroid Build Coastguard Worker           {
1333*f6dc9357SAndroid Build Coastguard Worker             _messageList.SelectAll();
1334*f6dc9357SAndroid Build Coastguard Worker             return true;
1335*f6dc9357SAndroid Build Coastguard Worker           }
1336*f6dc9357SAndroid Build Coastguard Worker           break;
1337*f6dc9357SAndroid Build Coastguard Worker         }
1338*f6dc9357SAndroid Build Coastguard Worker         case VK_INSERT:
1339*f6dc9357SAndroid Build Coastguard Worker         case 'C':
1340*f6dc9357SAndroid Build Coastguard Worker         {
1341*f6dc9357SAndroid Build Coastguard Worker           if (IsKeyDown(VK_CONTROL))
1342*f6dc9357SAndroid Build Coastguard Worker           {
1343*f6dc9357SAndroid Build Coastguard Worker             CopyToClipboard();
1344*f6dc9357SAndroid Build Coastguard Worker             return true;
1345*f6dc9357SAndroid Build Coastguard Worker           }
1346*f6dc9357SAndroid Build Coastguard Worker           break;
1347*f6dc9357SAndroid Build Coastguard Worker         }
1348*f6dc9357SAndroid Build Coastguard Worker       }
1349*f6dc9357SAndroid Build Coastguard Worker     }
1350*f6dc9357SAndroid Build Coastguard Worker   }
1351*f6dc9357SAndroid Build Coastguard Worker   return false;
1352*f6dc9357SAndroid Build Coastguard Worker }
1353*f6dc9357SAndroid Build Coastguard Worker 
1354*f6dc9357SAndroid Build Coastguard Worker 
ListView_GetSelected(NControl::CListView & listView,CUIntVector & vector)1355*f6dc9357SAndroid Build Coastguard Worker static void ListView_GetSelected(NControl::CListView &listView, CUIntVector &vector)
1356*f6dc9357SAndroid Build Coastguard Worker {
1357*f6dc9357SAndroid Build Coastguard Worker   vector.Clear();
1358*f6dc9357SAndroid Build Coastguard Worker   int index = -1;
1359*f6dc9357SAndroid Build Coastguard Worker   for (;;)
1360*f6dc9357SAndroid Build Coastguard Worker   {
1361*f6dc9357SAndroid Build Coastguard Worker     index = listView.GetNextSelectedItem(index);
1362*f6dc9357SAndroid Build Coastguard Worker     if (index < 0)
1363*f6dc9357SAndroid Build Coastguard Worker       break;
1364*f6dc9357SAndroid Build Coastguard Worker     vector.Add((unsigned)index);
1365*f6dc9357SAndroid Build Coastguard Worker   }
1366*f6dc9357SAndroid Build Coastguard Worker }
1367*f6dc9357SAndroid Build Coastguard Worker 
1368*f6dc9357SAndroid Build Coastguard Worker 
CopyToClipboard()1369*f6dc9357SAndroid Build Coastguard Worker void CProgressDialog::CopyToClipboard()
1370*f6dc9357SAndroid Build Coastguard Worker {
1371*f6dc9357SAndroid Build Coastguard Worker   CUIntVector indexes;
1372*f6dc9357SAndroid Build Coastguard Worker   ListView_GetSelected(_messageList, indexes);
1373*f6dc9357SAndroid Build Coastguard Worker   UString s;
1374*f6dc9357SAndroid Build Coastguard Worker   unsigned numIndexes = indexes.Size();
1375*f6dc9357SAndroid Build Coastguard Worker   if (numIndexes == 0)
1376*f6dc9357SAndroid Build Coastguard Worker     numIndexes = (unsigned)_messageList.GetItemCount();
1377*f6dc9357SAndroid Build Coastguard Worker 
1378*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < numIndexes; i++)
1379*f6dc9357SAndroid Build Coastguard Worker   {
1380*f6dc9357SAndroid Build Coastguard Worker     const unsigned index = (i < indexes.Size() ? indexes[i] : i);
1381*f6dc9357SAndroid Build Coastguard Worker     // s.Add_UInt32(index);
1382*f6dc9357SAndroid Build Coastguard Worker     // s += ": ";
1383*f6dc9357SAndroid Build Coastguard Worker     s += _messageStrings[index];
1384*f6dc9357SAndroid Build Coastguard Worker     {
1385*f6dc9357SAndroid Build Coastguard Worker       s +=
1386*f6dc9357SAndroid Build Coastguard Worker         #ifdef _WIN32
1387*f6dc9357SAndroid Build Coastguard Worker           "\r\n"
1388*f6dc9357SAndroid Build Coastguard Worker         #else
1389*f6dc9357SAndroid Build Coastguard Worker           "\n"
1390*f6dc9357SAndroid Build Coastguard Worker         #endif
1391*f6dc9357SAndroid Build Coastguard Worker         ;
1392*f6dc9357SAndroid Build Coastguard Worker     }
1393*f6dc9357SAndroid Build Coastguard Worker   }
1394*f6dc9357SAndroid Build Coastguard Worker 
1395*f6dc9357SAndroid Build Coastguard Worker   ClipboardSetText(*this, s);
1396*f6dc9357SAndroid Build Coastguard Worker }
1397*f6dc9357SAndroid Build Coastguard Worker 
1398*f6dc9357SAndroid Build Coastguard Worker 
MyThreadFunction(void * param)1399*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL MyThreadFunction(void *param)
1400*f6dc9357SAndroid Build Coastguard Worker {
1401*f6dc9357SAndroid Build Coastguard Worker   CProgressThreadVirt *p = (CProgressThreadVirt *)param;
1402*f6dc9357SAndroid Build Coastguard Worker   try
1403*f6dc9357SAndroid Build Coastguard Worker   {
1404*f6dc9357SAndroid Build Coastguard Worker     p->Process();
1405*f6dc9357SAndroid Build Coastguard Worker     p->ThreadFinishedOK = true;
1406*f6dc9357SAndroid Build Coastguard Worker   }
1407*f6dc9357SAndroid Build Coastguard Worker   catch (...) { p->Result = E_FAIL; }
1408*f6dc9357SAndroid Build Coastguard Worker   return 0;
1409*f6dc9357SAndroid Build Coastguard Worker }
1410*f6dc9357SAndroid Build Coastguard Worker 
1411*f6dc9357SAndroid Build Coastguard Worker 
Create(const UString & title,HWND parentWindow)1412*f6dc9357SAndroid Build Coastguard Worker HRESULT CProgressThreadVirt::Create(const UString &title, HWND parentWindow)
1413*f6dc9357SAndroid Build Coastguard Worker {
1414*f6dc9357SAndroid Build Coastguard Worker   NWindows::CThread thread;
1415*f6dc9357SAndroid Build Coastguard Worker   const WRes wres = thread.Create(MyThreadFunction, this);
1416*f6dc9357SAndroid Build Coastguard Worker   if (wres != 0)
1417*f6dc9357SAndroid Build Coastguard Worker     return HRESULT_FROM_WIN32(wres);
1418*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog::Create(title, thread, parentWindow);
1419*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
1420*f6dc9357SAndroid Build Coastguard Worker }
1421*f6dc9357SAndroid Build Coastguard Worker 
AddMessageToString(UString & dest,const UString & src)1422*f6dc9357SAndroid Build Coastguard Worker static void AddMessageToString(UString &dest, const UString &src)
1423*f6dc9357SAndroid Build Coastguard Worker {
1424*f6dc9357SAndroid Build Coastguard Worker   if (!src.IsEmpty())
1425*f6dc9357SAndroid Build Coastguard Worker   {
1426*f6dc9357SAndroid Build Coastguard Worker     if (!dest.IsEmpty())
1427*f6dc9357SAndroid Build Coastguard Worker       dest.Add_LF();
1428*f6dc9357SAndroid Build Coastguard Worker     dest += src;
1429*f6dc9357SAndroid Build Coastguard Worker   }
1430*f6dc9357SAndroid Build Coastguard Worker }
1431*f6dc9357SAndroid Build Coastguard Worker 
Process()1432*f6dc9357SAndroid Build Coastguard Worker void CProgressThreadVirt::Process()
1433*f6dc9357SAndroid Build Coastguard Worker {
1434*f6dc9357SAndroid Build Coastguard Worker   CProgressCloser closer(*this);
1435*f6dc9357SAndroid Build Coastguard Worker   UString m;
1436*f6dc9357SAndroid Build Coastguard Worker   try { Result = ProcessVirt(); }
1437*f6dc9357SAndroid Build Coastguard Worker   catch(const wchar_t *s) { m = s; }
1438*f6dc9357SAndroid Build Coastguard Worker   catch(const UString &s) { m = s; }
1439*f6dc9357SAndroid Build Coastguard Worker   catch(const char *s) { m = GetUnicodeString(s); }
1440*f6dc9357SAndroid Build Coastguard Worker   catch(int v)
1441*f6dc9357SAndroid Build Coastguard Worker   {
1442*f6dc9357SAndroid Build Coastguard Worker     m = "Error #";
1443*f6dc9357SAndroid Build Coastguard Worker     m.Add_UInt32((unsigned)v);
1444*f6dc9357SAndroid Build Coastguard Worker   }
1445*f6dc9357SAndroid Build Coastguard Worker   catch(...) { m = "Error"; }
1446*f6dc9357SAndroid Build Coastguard Worker   if (Result != E_ABORT)
1447*f6dc9357SAndroid Build Coastguard Worker   {
1448*f6dc9357SAndroid Build Coastguard Worker     if (m.IsEmpty() && Result != S_OK)
1449*f6dc9357SAndroid Build Coastguard Worker       m = HResultToMessage(Result);
1450*f6dc9357SAndroid Build Coastguard Worker   }
1451*f6dc9357SAndroid Build Coastguard Worker   AddMessageToString(m, FinalMessage.ErrorMessage.Message);
1452*f6dc9357SAndroid Build Coastguard Worker 
1453*f6dc9357SAndroid Build Coastguard Worker   {
1454*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR(i, ErrorPaths)
1455*f6dc9357SAndroid Build Coastguard Worker     {
1456*f6dc9357SAndroid Build Coastguard Worker       if (i >= 32)
1457*f6dc9357SAndroid Build Coastguard Worker         break;
1458*f6dc9357SAndroid Build Coastguard Worker       AddMessageToString(m, fs2us(ErrorPaths[i]));
1459*f6dc9357SAndroid Build Coastguard Worker     }
1460*f6dc9357SAndroid Build Coastguard Worker   }
1461*f6dc9357SAndroid Build Coastguard Worker 
1462*f6dc9357SAndroid Build Coastguard Worker   CProgressSync &sync = Sync;
1463*f6dc9357SAndroid Build Coastguard Worker   NSynchronization::CCriticalSectionLock lock(sync._cs);
1464*f6dc9357SAndroid Build Coastguard Worker   if (m.IsEmpty())
1465*f6dc9357SAndroid Build Coastguard Worker   {
1466*f6dc9357SAndroid Build Coastguard Worker     if (!FinalMessage.OkMessage.Message.IsEmpty())
1467*f6dc9357SAndroid Build Coastguard Worker       sync.FinalMessage.OkMessage = FinalMessage.OkMessage;
1468*f6dc9357SAndroid Build Coastguard Worker   }
1469*f6dc9357SAndroid Build Coastguard Worker   else
1470*f6dc9357SAndroid Build Coastguard Worker   {
1471*f6dc9357SAndroid Build Coastguard Worker     sync.FinalMessage.ErrorMessage.Message = m;
1472*f6dc9357SAndroid Build Coastguard Worker     if (Result == S_OK)
1473*f6dc9357SAndroid Build Coastguard Worker       Result = E_FAIL;
1474*f6dc9357SAndroid Build Coastguard Worker   }
1475*f6dc9357SAndroid Build Coastguard Worker }
1476*f6dc9357SAndroid Build Coastguard Worker 
HResultToMessage(HRESULT errorCode)1477*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode)
1478*f6dc9357SAndroid Build Coastguard Worker {
1479*f6dc9357SAndroid Build Coastguard Worker   if (errorCode == E_OUTOFMEMORY)
1480*f6dc9357SAndroid Build Coastguard Worker     return LangString(IDS_MEM_ERROR);
1481*f6dc9357SAndroid Build Coastguard Worker   else
1482*f6dc9357SAndroid Build Coastguard Worker     return NError::MyFormatMessage(errorCode);
1483*f6dc9357SAndroid Build Coastguard Worker }
1484