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