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