Source code

Revision control

Copy as Markdown

Other Tools

// ProgressDialog.h↩
#ifndef __PROGRESS_DIALOG_H↩
#define __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;↩
int _prevPercentValue;↩
bool _wasCreated;↩
bool _needClose;↩
bool _inCancelMessageBox;↩
bool _externalCloseMessageWasReceived;↩
bool OnTimer(WPARAM timerID, LPARAM callback);↩
void SetRange(UInt64 range);↩
void SetPos(UInt64 pos);↩
virtual bool OnInit();↩
virtual void OnCancel();↩
virtual void OnOK();↩
NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent;↩
#ifndef _SFX↩
void AddToTitle(LPCWSTR string);↩
#endif
bool OnButtonClicked(int buttonID, HWND buttonHWND);↩
void WaitCreating() { _dialogCreatedEvent.Lock(); }↩
void CheckNeedClose();↩
bool OnExternalCloseMessage();↩
public:↩
CProgressSync Sync;↩
int IconID;↩
#ifndef _SFX↩
HWND MainWindow;↩
UString MainTitle;↩
UString MainAddTitle;↩
~CProgressDialog();↩
#endif
CProgressDialog(): _timer(0)↩
#ifndef _SFX↩
,MainWindow(0)↩
#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 = 0)↩
{↩
_title = title;↩
INT_PTR res = CModalDialog::Create(IDD_PROGRESS, wndParent);↩
thread.Wait();↩
return res;↩
}↩
enum
{↩
kCloseMessage = WM_APP + 1↩
};↩
virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);↩
void ProcessWasFinished()↩
{↩
WaitCreating();↩
if (_wasCreated)↩
PostMsg(kCloseMessage);↩
else
_needClose = true;↩
};↩
};↩
class CProgressCloser↩
{↩
CProgressDialog *_p;↩
public:↩
CProgressCloser(CProgressDialog &p) : _p(&p) {}↩
~CProgressCloser() { _p->ProcessWasFinished(); }↩
};↩
#endif