xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/ProgressDialog.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // ProgressDialog.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_PROGRESS_DIALOG_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_PROGRESS_DIALOG_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Dialog.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ProgressBar.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "ProgressDialogRes.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker class CProgressSync
15*f6dc9357SAndroid Build Coastguard Worker {
16*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CCriticalSection _cs;
17*f6dc9357SAndroid Build Coastguard Worker   bool _stopped;
18*f6dc9357SAndroid Build Coastguard Worker   bool _paused;
19*f6dc9357SAndroid Build Coastguard Worker   UInt64 _total;
20*f6dc9357SAndroid Build Coastguard Worker   UInt64 _completed;
21*f6dc9357SAndroid Build Coastguard Worker public:
CProgressSync()22*f6dc9357SAndroid Build Coastguard Worker   CProgressSync(): _stopped(false), _paused(false), _total(1), _completed(0) {}
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker   HRESULT ProcessStopAndPause();
GetStopped()25*f6dc9357SAndroid Build Coastguard Worker   bool GetStopped()
26*f6dc9357SAndroid Build Coastguard Worker   {
27*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
28*f6dc9357SAndroid Build Coastguard Worker     return _stopped;
29*f6dc9357SAndroid Build Coastguard Worker   }
SetStopped(bool value)30*f6dc9357SAndroid Build Coastguard Worker   void SetStopped(bool value)
31*f6dc9357SAndroid Build Coastguard Worker   {
32*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
33*f6dc9357SAndroid Build Coastguard Worker     _stopped = value;
34*f6dc9357SAndroid Build Coastguard Worker   }
GetPaused()35*f6dc9357SAndroid Build Coastguard Worker   bool GetPaused()
36*f6dc9357SAndroid Build Coastguard Worker   {
37*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
38*f6dc9357SAndroid Build Coastguard Worker     return _paused;
39*f6dc9357SAndroid Build Coastguard Worker   }
SetPaused(bool value)40*f6dc9357SAndroid Build Coastguard Worker   void SetPaused(bool value)
41*f6dc9357SAndroid Build Coastguard Worker   {
42*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
43*f6dc9357SAndroid Build Coastguard Worker     _paused = value;
44*f6dc9357SAndroid Build Coastguard Worker   }
SetProgress(UInt64 total,UInt64 completed)45*f6dc9357SAndroid Build Coastguard Worker   void SetProgress(UInt64 total, UInt64 completed)
46*f6dc9357SAndroid Build Coastguard Worker   {
47*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
48*f6dc9357SAndroid Build Coastguard Worker     _total = total;
49*f6dc9357SAndroid Build Coastguard Worker     _completed = completed;
50*f6dc9357SAndroid Build Coastguard Worker   }
SetPos(UInt64 completed)51*f6dc9357SAndroid Build Coastguard Worker   void SetPos(UInt64 completed)
52*f6dc9357SAndroid Build Coastguard Worker   {
53*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
54*f6dc9357SAndroid Build Coastguard Worker     _completed = completed;
55*f6dc9357SAndroid Build Coastguard Worker   }
GetProgress(UInt64 & total,UInt64 & completed)56*f6dc9357SAndroid Build Coastguard Worker   void GetProgress(UInt64 &total, UInt64 &completed)
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     NWindows::NSynchronization::CCriticalSectionLock lock(_cs);
59*f6dc9357SAndroid Build Coastguard Worker     total = _total;
60*f6dc9357SAndroid Build Coastguard Worker     completed = _completed;
61*f6dc9357SAndroid Build Coastguard Worker   }
62*f6dc9357SAndroid Build Coastguard Worker };
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker class CU64ToI32Converter
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker   UInt64 _numShiftBits;
67*f6dc9357SAndroid Build Coastguard Worker public:
Init(UInt64 range)68*f6dc9357SAndroid Build Coastguard Worker   void Init(UInt64 range)
69*f6dc9357SAndroid Build Coastguard Worker   {
70*f6dc9357SAndroid Build Coastguard Worker     // Windows CE doesn't like big number here.
71*f6dc9357SAndroid Build Coastguard Worker     for (_numShiftBits = 0; range > (1 << 15); _numShiftBits++)
72*f6dc9357SAndroid Build Coastguard Worker       range >>= 1;
73*f6dc9357SAndroid Build Coastguard Worker   }
Count(UInt64 value)74*f6dc9357SAndroid Build Coastguard Worker   int Count(UInt64 value) { return int(value >> _numShiftBits); }
75*f6dc9357SAndroid Build Coastguard Worker };
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker class CProgressDialog: public NWindows::NControl::CModalDialog
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker private:
80*f6dc9357SAndroid Build Coastguard Worker   UINT_PTR _timer;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   UString _title;
83*f6dc9357SAndroid Build Coastguard Worker   CU64ToI32Converter _converter;
84*f6dc9357SAndroid Build Coastguard Worker   UInt64 _peviousPos;
85*f6dc9357SAndroid Build Coastguard Worker   UInt64 _range;
86*f6dc9357SAndroid Build Coastguard Worker   NWindows::NControl::CProgressBar m_ProgressBar;
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker   UInt64 _prevPercentValue;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker   bool _wasCreated;
91*f6dc9357SAndroid Build Coastguard Worker   bool _needClose;
92*f6dc9357SAndroid Build Coastguard Worker   bool _inCancelMessageBox;
93*f6dc9357SAndroid Build Coastguard Worker   bool _externalCloseMessageWasReceived;
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override;
96*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override;
97*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnInit() Z7_override;
98*f6dc9357SAndroid Build Coastguard Worker   virtual void OnCancel() Z7_override;
99*f6dc9357SAndroid Build Coastguard Worker   virtual void OnOK() Z7_override;
100*f6dc9357SAndroid Build Coastguard Worker   virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override;
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker   void SetRange(UInt64 range);
103*f6dc9357SAndroid Build Coastguard Worker   void SetPos(UInt64 pos);
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent;
106*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
107*f6dc9357SAndroid Build Coastguard Worker   void AddToTitle(LPCWSTR string);
108*f6dc9357SAndroid Build Coastguard Worker   #endif
109*f6dc9357SAndroid Build Coastguard Worker 
WaitCreating()110*f6dc9357SAndroid Build Coastguard Worker   void WaitCreating() { _dialogCreatedEvent.Lock(); }
111*f6dc9357SAndroid Build Coastguard Worker   void CheckNeedClose();
112*f6dc9357SAndroid Build Coastguard Worker   bool OnExternalCloseMessage();
113*f6dc9357SAndroid Build Coastguard Worker public:
114*f6dc9357SAndroid Build Coastguard Worker   CProgressSync Sync;
115*f6dc9357SAndroid Build Coastguard Worker   int IconID;
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_SFX
118*f6dc9357SAndroid Build Coastguard Worker   HWND MainWindow;
119*f6dc9357SAndroid Build Coastguard Worker   UString MainTitle;
120*f6dc9357SAndroid Build Coastguard Worker   UString MainAddTitle;
121*f6dc9357SAndroid Build Coastguard Worker   ~CProgressDialog();
122*f6dc9357SAndroid Build Coastguard Worker   #endif
123*f6dc9357SAndroid Build Coastguard Worker 
CProgressDialog()124*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog(): _timer(0)
125*f6dc9357SAndroid Build Coastguard Worker     #ifndef Z7_SFX
126*f6dc9357SAndroid Build Coastguard Worker     ,MainWindow(NULL)
127*f6dc9357SAndroid Build Coastguard Worker     #endif
128*f6dc9357SAndroid Build Coastguard Worker   {
129*f6dc9357SAndroid Build Coastguard Worker     IconID = -1;
130*f6dc9357SAndroid Build Coastguard Worker     _wasCreated = false;
131*f6dc9357SAndroid Build Coastguard Worker     _needClose = false;
132*f6dc9357SAndroid Build Coastguard Worker     _inCancelMessageBox = false;
133*f6dc9357SAndroid Build Coastguard Worker     _externalCloseMessageWasReceived = false;
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker     if (_dialogCreatedEvent.Create() != S_OK)
136*f6dc9357SAndroid Build Coastguard Worker       throw 1334987;
137*f6dc9357SAndroid Build Coastguard Worker   }
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker   INT_PTR Create(const UString &title, NWindows::CThread &thread, HWND wndParent = NULL)
140*f6dc9357SAndroid Build Coastguard Worker   {
141*f6dc9357SAndroid Build Coastguard Worker     _title = title;
142*f6dc9357SAndroid Build Coastguard Worker     INT_PTR res = CModalDialog::Create(IDD_PROGRESS, wndParent);
143*f6dc9357SAndroid Build Coastguard Worker     thread.Wait_Close();
144*f6dc9357SAndroid Build Coastguard Worker     return res;
145*f6dc9357SAndroid Build Coastguard Worker   }
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   enum
148*f6dc9357SAndroid Build Coastguard Worker   {
149*f6dc9357SAndroid Build Coastguard Worker     kCloseMessage = WM_APP + 1
150*f6dc9357SAndroid Build Coastguard Worker   };
151*f6dc9357SAndroid Build Coastguard Worker 
ProcessWasFinished()152*f6dc9357SAndroid Build Coastguard Worker   void ProcessWasFinished()
153*f6dc9357SAndroid Build Coastguard Worker   {
154*f6dc9357SAndroid Build Coastguard Worker     WaitCreating();
155*f6dc9357SAndroid Build Coastguard Worker     if (_wasCreated)
156*f6dc9357SAndroid Build Coastguard Worker       PostMsg(kCloseMessage);
157*f6dc9357SAndroid Build Coastguard Worker     else
158*f6dc9357SAndroid Build Coastguard Worker       _needClose = true;
159*f6dc9357SAndroid Build Coastguard Worker   }
160*f6dc9357SAndroid Build Coastguard Worker };
161*f6dc9357SAndroid Build Coastguard Worker 
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker class CProgressCloser
164*f6dc9357SAndroid Build Coastguard Worker {
165*f6dc9357SAndroid Build Coastguard Worker   CProgressDialog *_p;
166*f6dc9357SAndroid Build Coastguard Worker public:
CProgressCloser(CProgressDialog & p)167*f6dc9357SAndroid Build Coastguard Worker   CProgressCloser(CProgressDialog &p) : _p(&p) {}
~CProgressCloser()168*f6dc9357SAndroid Build Coastguard Worker   ~CProgressCloser() { _p->ProcessWasFinished(); }
169*f6dc9357SAndroid Build Coastguard Worker };
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker #endif
172