xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog2.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_PROGRESS_DIALOG_2_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_PROGRESS_DIALOG_2_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ErrorMsg.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Dialog.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ListView.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ProgressBar.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "MyWindowsNew.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker struct CProgressMessageBoxPair
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   UString Title;
21*f6dc9357SAndroid Build Coastguard Worker   UString Message;
22*f6dc9357SAndroid Build Coastguard Worker };
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker struct CProgressFinalMessage
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker   CProgressMessageBoxPair ErrorMessage;
27*f6dc9357SAndroid Build Coastguard Worker   CProgressMessageBoxPair OkMessage;
28*f6dc9357SAndroid Build Coastguard Worker 
ThereIsMessageCProgressFinalMessage29*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsMessage() const { return !ErrorMessage.Message.IsEmpty() || !OkMessage.Message.IsEmpty(); }
30*f6dc9357SAndroid Build Coastguard Worker };
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker class CProgressSync
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker   bool _stopped;
35*f6dc9357SAndroid Build Coastguard Worker   bool _paused;
36*f6dc9357SAndroid Build Coastguard Worker public:
37*f6dc9357SAndroid Build Coastguard Worker   bool _filesProgressMode;
38*f6dc9357SAndroid Build Coastguard Worker   bool _isDir;
39*f6dc9357SAndroid Build Coastguard Worker   UInt64 _totalBytes;
40*f6dc9357SAndroid Build Coastguard Worker   UInt64 _completedBytes;
41*f6dc9357SAndroid Build Coastguard Worker   UInt64 _totalFiles;
42*f6dc9357SAndroid Build Coastguard Worker   UInt64 _curFiles;
43*f6dc9357SAndroid Build Coastguard Worker   UInt64 _inSize;
44*f6dc9357SAndroid Build Coastguard Worker   UInt64 _outSize;
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker   UString _titleFileName;
47*f6dc9357SAndroid Build Coastguard Worker   UString _status;
48*f6dc9357SAndroid Build Coastguard Worker   UString _filePath;
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   UStringVector Messages;
51*f6dc9357SAndroid Build Coastguard Worker   CProgressFinalMessage FinalMessage;
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CCriticalSection _cs;
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   CProgressSync();
56*f6dc9357SAndroid Build Coastguard Worker 
Get_Stopped()57*f6dc9357SAndroid Build Coastguard Worker   bool Get_Stopped()
58*f6dc9357SAndroid Build Coastguard Worker   {
59*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
60*f6dc9357SAndroid Build Coastguard Worker     return _stopped;
61*f6dc9357SAndroid Build Coastguard Worker   }
Set_Stopped(bool val)62*f6dc9357SAndroid Build Coastguard Worker   void Set_Stopped(bool val)
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
65*f6dc9357SAndroid Build Coastguard Worker     _stopped = val;
66*f6dc9357SAndroid Build Coastguard Worker   }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   bool Get_Paused();
Set_Paused(bool val)69*f6dc9357SAndroid Build Coastguard Worker   void Set_Paused(bool val)
70*f6dc9357SAndroid Build Coastguard Worker   {
71*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
72*f6dc9357SAndroid Build Coastguard Worker     _paused = val;
73*f6dc9357SAndroid Build Coastguard Worker   }
74*f6dc9357SAndroid Build Coastguard Worker 
Set_FilesProgressMode(bool filesProgressMode)75*f6dc9357SAndroid Build Coastguard Worker   void Set_FilesProgressMode(bool filesProgressMode)
76*f6dc9357SAndroid Build Coastguard Worker   {
77*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
78*f6dc9357SAndroid Build Coastguard Worker     _filesProgressMode = filesProgressMode;
79*f6dc9357SAndroid Build Coastguard Worker   }
80*f6dc9357SAndroid Build Coastguard Worker 
81*f6dc9357SAndroid Build Coastguard Worker   HRESULT CheckStop();
82*f6dc9357SAndroid Build Coastguard Worker   void Clear_Stop_Status();
83*f6dc9357SAndroid Build Coastguard Worker   HRESULT ScanProgress(UInt64 numFiles, UInt64 totalSize, const FString &fileName, bool isDir = false);
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_NumFilesTotal(UInt64 val);
86*f6dc9357SAndroid Build Coastguard Worker   void Set_NumBytesTotal(UInt64 val);
87*f6dc9357SAndroid Build Coastguard Worker   void Set_NumFilesCur(UInt64 val);
88*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_NumBytesCur(const UInt64 *val);
89*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_NumBytesCur(UInt64 val);
90*f6dc9357SAndroid Build Coastguard Worker   void Set_Ratio(const UInt64 *inSize, const UInt64 *outSize);
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker   void Set_TitleFileName(const UString &fileName);
93*f6dc9357SAndroid Build Coastguard Worker   void Set_Status(const UString &s);
94*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_Status2(const UString &s, const wchar_t *path, bool isDir = false);
95*f6dc9357SAndroid Build Coastguard Worker   void Set_FilePath(const wchar_t *path, bool isDir = false);
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker   void AddError_Message(const wchar_t *message);
98*f6dc9357SAndroid Build Coastguard Worker   void AddError_Message_Name(const wchar_t *message, const wchar_t *name);
99*f6dc9357SAndroid Build Coastguard Worker   // void AddError_Code_Name(DWORD systemError, const wchar_t *name);
100*f6dc9357SAndroid Build Coastguard Worker   void AddError_Code_Name(HRESULT systemError, const wchar_t *name);
101*f6dc9357SAndroid Build Coastguard Worker 
ThereIsMessage()102*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsMessage() const { return !Messages.IsEmpty() || FinalMessage.ThereIsMessage(); }
103*f6dc9357SAndroid Build Coastguard Worker };
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker class CProgressDialog: public NWindows::NControl::CModalDialog
107*f6dc9357SAndroid Build Coastguard Worker {
108*f6dc9357SAndroid Build Coastguard Worker   bool _isDir;
109*f6dc9357SAndroid Build Coastguard Worker   bool _wasCreated;
110*f6dc9357SAndroid Build Coastguard Worker   bool _needClose;
111*f6dc9357SAndroid Build Coastguard Worker   bool _errorsWereDisplayed;
112*f6dc9357SAndroid Build Coastguard Worker   bool _waitCloseByCancelButton;
113*f6dc9357SAndroid Build Coastguard Worker   bool _cancelWasPressed;
114*f6dc9357SAndroid Build Coastguard Worker   bool _inCancelMessageBox;
115*f6dc9357SAndroid Build Coastguard Worker   bool _externalCloseMessageWasReceived;
116*f6dc9357SAndroid Build Coastguard Worker   bool _background;
117*f6dc9357SAndroid Build Coastguard Worker public:
118*f6dc9357SAndroid Build Coastguard Worker   bool WaitMode;
119*f6dc9357SAndroid Build Coastguard Worker   bool MessagesDisplayed; // = true if user pressed OK on all messages or there are no messages.
120*f6dc9357SAndroid Build Coastguard Worker   bool CompressingMode;
121*f6dc9357SAndroid Build Coastguard Worker   bool ShowCompressionInfo;
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker private:
124*f6dc9357SAndroid Build Coastguard Worker   unsigned _numPostedMessages;
125*f6dc9357SAndroid Build Coastguard Worker   unsigned _numAutoSizeMessages;
126*f6dc9357SAndroid Build Coastguard Worker   unsigned _numMessages;
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker   UString _titleFileName;
129*f6dc9357SAndroid Build Coastguard Worker   UString _filePath;
130*f6dc9357SAndroid Build Coastguard Worker   UString _status;
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker   UString _background_String;
133*f6dc9357SAndroid Build Coastguard Worker   UString _backgrounded_String;
134*f6dc9357SAndroid Build Coastguard Worker   UString _foreground_String;
135*f6dc9357SAndroid Build Coastguard Worker   UString _pause_String;
136*f6dc9357SAndroid Build Coastguard Worker   UString _continue_String;
137*f6dc9357SAndroid Build Coastguard Worker   UString _paused_String;
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker   int _buttonSizeX;
140*f6dc9357SAndroid Build Coastguard Worker   int _buttonSizeY;
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   UINT_PTR _timer;
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker   UString _title;
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker   class CU64ToI32Converter
147*f6dc9357SAndroid Build Coastguard Worker   {
148*f6dc9357SAndroid Build Coastguard Worker     unsigned _numShiftBits;
149*f6dc9357SAndroid Build Coastguard Worker     UInt64 _range;
150*f6dc9357SAndroid Build Coastguard Worker   public:
CU64ToI32Converter()151*f6dc9357SAndroid Build Coastguard Worker     CU64ToI32Converter(): _numShiftBits(0), _range(1) {}
Init(UInt64 range)152*f6dc9357SAndroid Build Coastguard Worker     void Init(UInt64 range)
153*f6dc9357SAndroid Build Coastguard Worker     {
154*f6dc9357SAndroid Build Coastguard Worker       _range = range;
155*f6dc9357SAndroid Build Coastguard Worker       // Windows CE doesn't like big number for ProgressBar.
156*f6dc9357SAndroid Build Coastguard Worker       for (_numShiftBits = 0; range >= ((UInt32)1 << 15); _numShiftBits++)
157*f6dc9357SAndroid Build Coastguard Worker         range >>= 1;
158*f6dc9357SAndroid Build Coastguard Worker     }
Count(UInt64 val)159*f6dc9357SAndroid Build Coastguard Worker     int Count(UInt64 val)
160*f6dc9357SAndroid Build Coastguard Worker     {
161*f6dc9357SAndroid Build Coastguard Worker       int res = (int)(val >> _numShiftBits);
162*f6dc9357SAndroid Build Coastguard Worker       if (val == _range)
163*f6dc9357SAndroid Build Coastguard Worker         res++;
164*f6dc9357SAndroid Build Coastguard Worker       return res;
165*f6dc9357SAndroid Build Coastguard Worker     }
166*f6dc9357SAndroid Build Coastguard Worker   };
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker   CU64ToI32Converter _progressConv;
169*f6dc9357SAndroid Build Coastguard Worker   UInt64 _progressBar_Pos;
170*f6dc9357SAndroid Build Coastguard Worker   UInt64 _progressBar_Range;
171*f6dc9357SAndroid Build Coastguard Worker 
172*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CProgressBar m_ProgressBar;
173*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CListView _messageList;
174*f6dc9357SAndroid Build Coastguard Worker 
175*f6dc9357SAndroid Build Coastguard Worker   UStringVector _messageStrings;
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
178*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ITaskbarList3> _taskbarList;
179*f6dc9357SAndroid Build Coastguard Worker   // #endif
180*f6dc9357SAndroid Build Coastguard Worker   HWND _hwndForTaskbar;
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker   UInt32 _prevTime;
183*f6dc9357SAndroid Build Coastguard Worker   UInt64 _elapsedTime;
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker   UInt64 _prevPercentValue;
186*f6dc9357SAndroid Build Coastguard Worker   UInt64 _prevElapsedSec;
187*f6dc9357SAndroid Build Coastguard Worker   UInt64 _prevRemainingSec;
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   UInt64 _totalBytes_Prev;
190*f6dc9357SAndroid Build Coastguard Worker   UInt64 _processed_Prev;
191*f6dc9357SAndroid Build Coastguard Worker   UInt64 _packed_Prev;
192*f6dc9357SAndroid Build Coastguard Worker   UInt64 _ratio_Prev;
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker   UString _filesStr_Prev;
195*f6dc9357SAndroid Build Coastguard Worker   UString _filesTotStr_Prev;
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker   unsigned _numReduceSymbols;
198*f6dc9357SAndroid Build Coastguard Worker   unsigned _prevSpeed_MoveBits;
199*f6dc9357SAndroid Build Coastguard Worker   UInt64 _prevSpeed;
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker   // #ifdef __ITaskbarList3_INTERFACE_DEFINED__
SetTaskbarProgressState(TBPFLAG tbpFlags)202*f6dc9357SAndroid Build Coastguard Worker   void SetTaskbarProgressState(TBPFLAG tbpFlags)
203*f6dc9357SAndroid Build Coastguard Worker   {
204*f6dc9357SAndroid Build Coastguard Worker     if (_taskbarList && _hwndForTaskbar)
205*f6dc9357SAndroid Build Coastguard Worker       _taskbarList->SetProgressState(_hwndForTaskbar, tbpFlags);
206*f6dc9357SAndroid Build Coastguard Worker   }
207*f6dc9357SAndroid Build Coastguard Worker   // #endif
208*f6dc9357SAndroid Build Coastguard Worker   void SetTaskbarProgressState();
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker   void UpdateStatInfo(bool showAll);
211*f6dc9357SAndroid Build Coastguard Worker   void SetProgressRange(UInt64 range);
212*f6dc9357SAndroid Build Coastguard Worker   void SetProgressPos(UInt64 pos);
213*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override;
214*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnInit() Z7_override;
215*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnSize(WPARAM wParam, int xSize, int ySize) Z7_override;
216*f6dc9357SAndroid Build Coastguard Worker   virtual void OnCancel() Z7_override;
217*f6dc9357SAndroid Build Coastguard Worker   virtual void OnOK() Z7_override;
218*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnNotify(UINT /* controlID */, LPNMHDR header) Z7_override;
219*f6dc9357SAndroid Build Coastguard Worker   void CopyToClipboard();
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CManualResetEvent _createDialogEvent;
222*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent;
223*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
224*f6dc9357SAndroid Build Coastguard Worker   void AddToTitle(LPCWSTR string);
225*f6dc9357SAndroid Build Coastguard Worker   #endif
226*f6dc9357SAndroid Build Coastguard Worker 
227*f6dc9357SAndroid Build Coastguard Worker   void SetPauseText();
228*f6dc9357SAndroid Build Coastguard Worker   void SetPriorityText();
229*f6dc9357SAndroid Build Coastguard Worker   void OnPauseButton();
230*f6dc9357SAndroid Build Coastguard Worker   void OnPriorityButton();
231*f6dc9357SAndroid Build Coastguard Worker   bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override;
232*f6dc9357SAndroid Build Coastguard Worker   bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override;
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker   void SetTitleText();
235*f6dc9357SAndroid Build Coastguard Worker   void ShowSize(unsigned id, UInt64 val, UInt64 &prev);
236*f6dc9357SAndroid Build Coastguard Worker 
237*f6dc9357SAndroid Build Coastguard Worker   void UpdateMessagesDialog();
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker   void AddMessageDirect(LPCWSTR message, bool needNumber);
240*f6dc9357SAndroid Build Coastguard Worker   void AddMessage(LPCWSTR message);
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   bool OnExternalCloseMessage();
243*f6dc9357SAndroid Build Coastguard Worker   void EnableErrorsControls(bool enable);
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker   void ShowAfterMessages(HWND wndParent);
246*f6dc9357SAndroid Build Coastguard Worker 
247*f6dc9357SAndroid Build Coastguard Worker   void CheckNeedClose();
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker public:
250*f6dc9357SAndroid Build Coastguard Worker   CProgressSync Sync;
251*f6dc9357SAndroid Build Coastguard Worker   int IconID;
252*f6dc9357SAndroid Build Coastguard Worker   HWND MainWindow;
253*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
254*f6dc9357SAndroid Build Coastguard Worker   UString MainTitle;
255*f6dc9357SAndroid Build Coastguard Worker   UString MainAddTitle;
256*f6dc9357SAndroid Build Coastguard Worker   ~CProgressDialog() Z7_DESTRUCTOR_override;
257*f6dc9357SAndroid Build Coastguard Worker   #endif
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog();
WaitCreating()260*f6dc9357SAndroid Build Coastguard Worker   void WaitCreating()
261*f6dc9357SAndroid Build Coastguard Worker   {
262*f6dc9357SAndroid Build Coastguard Worker     _createDialogEvent.Set();
263*f6dc9357SAndroid Build Coastguard Worker     _dialogCreatedEvent.Lock();
264*f6dc9357SAndroid Build Coastguard Worker   }
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker   INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = NULL);
267*f6dc9357SAndroid Build Coastguard Worker 
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker   /* how it works:
270*f6dc9357SAndroid Build Coastguard Worker      1) the working thread calls ProcessWasFinished()
271*f6dc9357SAndroid Build Coastguard Worker         that sends kCloseMessage message to CProgressDialog (GUI) thread
272*f6dc9357SAndroid Build Coastguard Worker      2) CProgressDialog (GUI) thread receives kCloseMessage message and
273*f6dc9357SAndroid Build Coastguard Worker         calls ProcessWasFinished_GuiVirt();
274*f6dc9357SAndroid Build Coastguard Worker         So we can implement ProcessWasFinished_GuiVirt() and show special
275*f6dc9357SAndroid Build Coastguard Worker         results window in GUI thread with CProgressDialog as parent window
276*f6dc9357SAndroid Build Coastguard Worker   */
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   void ProcessWasFinished();
ProcessWasFinished_GuiVirt()279*f6dc9357SAndroid Build Coastguard Worker   virtual void ProcessWasFinished_GuiVirt() {}
280*f6dc9357SAndroid Build Coastguard Worker };
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker class CProgressCloser
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog *_p;
286*f6dc9357SAndroid Build Coastguard Worker public:
CProgressCloser(CProgressDialog & p)287*f6dc9357SAndroid Build Coastguard Worker   CProgressCloser(CProgressDialog &p) : _p(&p) {}
~CProgressCloser()288*f6dc9357SAndroid Build Coastguard Worker   ~CProgressCloser() { _p->ProcessWasFinished(); }
289*f6dc9357SAndroid Build Coastguard Worker };
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker 
292*f6dc9357SAndroid Build Coastguard Worker class CProgressThreadVirt: public CProgressDialog
293*f6dc9357SAndroid Build Coastguard Worker {
294*f6dc9357SAndroid Build Coastguard Worker protected:
295*f6dc9357SAndroid Build Coastguard Worker   FStringVector ErrorPaths;
296*f6dc9357SAndroid Build Coastguard Worker   CProgressFinalMessage FinalMessage;
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   // error if any of HRESULT, ErrorMessage, ErrorPath
299*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT ProcessVirt() = 0;
300*f6dc9357SAndroid Build Coastguard Worker public:
301*f6dc9357SAndroid Build Coastguard Worker   HRESULT Result;
302*f6dc9357SAndroid Build Coastguard Worker   bool ThreadFinishedOK; // if there is no fatal exception
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker   void Process();
AddErrorPath(const FString & path)305*f6dc9357SAndroid Build Coastguard Worker   void AddErrorPath(const FString &path) { ErrorPaths.Add(path); }
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   HRESULT Create(const UString &title, HWND parentWindow = NULL);
CProgressThreadVirt()308*f6dc9357SAndroid Build Coastguard Worker   CProgressThreadVirt(): Result(E_FAIL), ThreadFinishedOK(false) {}
309*f6dc9357SAndroid Build Coastguard Worker 
GetMessagePair(bool isError)310*f6dc9357SAndroid Build Coastguard Worker   CProgressMessageBoxPair &GetMessagePair(bool isError) { return isError ? FinalMessage.ErrorMessage : FinalMessage.OkMessage; }
311*f6dc9357SAndroid Build Coastguard Worker };
312*f6dc9357SAndroid Build Coastguard Worker 
313*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode);
314*f6dc9357SAndroid Build Coastguard Worker 
315*f6dc9357SAndroid Build Coastguard Worker /*
316*f6dc9357SAndroid Build Coastguard Worker how it works:
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker client code inherits CProgressThreadVirt and calls
319*f6dc9357SAndroid Build Coastguard Worker CProgressThreadVirt::Create()
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker   it creates new thread that calls CProgressThreadVirt::Process();
322*f6dc9357SAndroid Build Coastguard Worker   it creates modal progress dialog window with ProgressDialog.Create()
323*f6dc9357SAndroid Build Coastguard Worker }
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker CProgressThreadVirt::Process()
326*f6dc9357SAndroid Build Coastguard Worker {
327*f6dc9357SAndroid Build Coastguard Worker   {
328*f6dc9357SAndroid Build Coastguard Worker     Result = ProcessVirt(); // virtual function that must implement real work
329*f6dc9357SAndroid Build Coastguard Worker   }
330*f6dc9357SAndroid Build Coastguard Worker   if (exceptions) or FinalMessage.ErrorMessage.Message
331*f6dc9357SAndroid Build Coastguard Worker   {
332*f6dc9357SAndroid Build Coastguard Worker     set message to ProgressDialog.Sync.FinalMessage.ErrorMessage.Message
333*f6dc9357SAndroid Build Coastguard Worker   }
334*f6dc9357SAndroid Build Coastguard Worker   else if (FinalMessage.OkMessage.Message)
335*f6dc9357SAndroid Build Coastguard Worker   {
336*f6dc9357SAndroid Build Coastguard Worker     set message to ProgressDialog.Sync.FinalMessage.OkMessage
337*f6dc9357SAndroid Build Coastguard Worker   }
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker   PostMsg(kCloseMessage);
340*f6dc9357SAndroid Build Coastguard Worker }
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker CProgressDialog::OnExternalCloseMessage()
344*f6dc9357SAndroid Build Coastguard Worker {
345*f6dc9357SAndroid Build Coastguard Worker   if (ProgressDialog.Sync.FinalMessage)
346*f6dc9357SAndroid Build Coastguard Worker   {
347*f6dc9357SAndroid Build Coastguard Worker     WorkWasFinishedVirt();
348*f6dc9357SAndroid Build Coastguard Worker     Show (ProgressDialog.Sync.FinalMessage)
349*f6dc9357SAndroid Build Coastguard Worker     MessagesDisplayed = true;
350*f6dc9357SAndroid Build Coastguard Worker   }
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker */
354*f6dc9357SAndroid Build Coastguard Worker 
355*f6dc9357SAndroid Build Coastguard Worker #endif
356