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