mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-16 00:11:42 -06:00
4.44 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
804edc5756
commit
d9666cf046
175
CPP/7zip/FileManager/Resource/ProgressDialog/ProgressDialog.cpp
Executable file
175
CPP/7zip/FileManager/Resource/ProgressDialog/ProgressDialog.cpp
Executable file
@@ -0,0 +1,175 @@
|
||||
// ProgressDialog.cpp
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "resource.h"
|
||||
#include "ProgressDialog.h"
|
||||
#include "Common/IntToString.h"
|
||||
#include "Common/IntToString.h"
|
||||
|
||||
using namespace NWindows;
|
||||
|
||||
static const UINT_PTR kTimerID = 3;
|
||||
static const UINT kTimerElapse = 50;
|
||||
|
||||
#ifdef LANG
|
||||
#include "../../LangUtils.h"
|
||||
#endif
|
||||
|
||||
#ifdef LANG
|
||||
static CIDLangPair kIDLangPairs[] =
|
||||
{
|
||||
{ IDCANCEL, 0x02000711 }
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef _SFX
|
||||
CProgressDialog::~CProgressDialog()
|
||||
{
|
||||
AddToTitle(TEXT(""));
|
||||
}
|
||||
void CProgressDialog::AddToTitle(LPCWSTR s)
|
||||
{
|
||||
if (MainWindow != 0)
|
||||
::MySetWindowText(MainWindow, UString(s) + MainTitle);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
bool CProgressDialog::OnInit()
|
||||
{
|
||||
_range = UINT64(-1);
|
||||
_prevPercentValue = -1;
|
||||
|
||||
#ifdef LANG
|
||||
// LangSetWindowText(HWND(*this), 0x02000C00);
|
||||
LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));
|
||||
#endif
|
||||
|
||||
m_ProgressBar.Attach(GetItem(IDC_PROGRESS1));
|
||||
_timer = SetTimer(kTimerID, kTimerElapse);
|
||||
_dialogCreatedEvent.Set();
|
||||
SetText(_title);
|
||||
return CModalDialog::OnInit();
|
||||
}
|
||||
|
||||
void CProgressDialog::OnCancel()
|
||||
{
|
||||
ProgressSynch.SetStopped(true);
|
||||
}
|
||||
|
||||
void CProgressDialog::SetRange(UINT64 range)
|
||||
{
|
||||
_range = range;
|
||||
_peviousPos = (UInt64)(Int64)-1;
|
||||
_converter.Init(range);
|
||||
m_ProgressBar.SetRange32(0 , _converter.Count(range)); // Test it for 100%
|
||||
}
|
||||
|
||||
void CProgressDialog::SetPos(UINT64 pos)
|
||||
{
|
||||
bool redraw = true;
|
||||
if (pos < _range && pos > _peviousPos)
|
||||
{
|
||||
UINT64 posDelta = pos - _peviousPos;
|
||||
if (posDelta < (_range >> 10))
|
||||
redraw = false;
|
||||
}
|
||||
if(redraw)
|
||||
{
|
||||
m_ProgressBar.SetPos(_converter.Count(pos)); // Test it for 100%
|
||||
_peviousPos = pos;
|
||||
}
|
||||
}
|
||||
|
||||
bool CProgressDialog::OnTimer(WPARAM /* timerID */, LPARAM /* callback */)
|
||||
{
|
||||
if (ProgressSynch.GetPaused())
|
||||
return true;
|
||||
UINT64 total, completed;
|
||||
ProgressSynch.GetProgress(total, completed);
|
||||
if (total != _range)
|
||||
SetRange(total);
|
||||
SetPos(completed);
|
||||
|
||||
if (total == 0)
|
||||
total = 1;
|
||||
|
||||
int percentValue = (int)(completed * 100 / total);
|
||||
if (percentValue != _prevPercentValue)
|
||||
{
|
||||
wchar_t s[64];
|
||||
ConvertUInt64ToString(percentValue, s);
|
||||
UString title = s;
|
||||
title += L"% ";
|
||||
SetText(title + _title);
|
||||
#ifndef _SFX
|
||||
AddToTitle(title + MainAddTitle);
|
||||
#endif
|
||||
_prevPercentValue = percentValue;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
////////////////////
|
||||
// CU64ToI32Converter
|
||||
|
||||
static const UINT64 kMaxIntValue = 0x7FFFFFFF;
|
||||
|
||||
void CU64ToI32Converter::Init(UINT64 range)
|
||||
{
|
||||
_numShiftBits = 0;
|
||||
while(range > kMaxIntValue)
|
||||
{
|
||||
range >>= 1;
|
||||
_numShiftBits++;
|
||||
}
|
||||
}
|
||||
|
||||
int CU64ToI32Converter::Count(UINT64 aValue)
|
||||
{
|
||||
return int(aValue >> _numShiftBits);
|
||||
}
|
||||
|
||||
const UINT CProgressDialog::kCloseMessage = WM_USER + 1;
|
||||
|
||||
bool CProgressDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(message)
|
||||
{
|
||||
case kCloseMessage:
|
||||
{
|
||||
KillTimer(_timer);
|
||||
_timer = 0;
|
||||
End(0);
|
||||
return true;
|
||||
}
|
||||
case WM_SETTEXT:
|
||||
{
|
||||
if (_timer == 0)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return CModalDialog::OnMessage(message, wParam, lParam);
|
||||
}
|
||||
|
||||
bool CProgressDialog::OnButtonClicked(int buttonID, HWND buttonHWND)
|
||||
{
|
||||
switch(buttonID)
|
||||
{
|
||||
case IDCANCEL:
|
||||
{
|
||||
bool paused = ProgressSynch.GetPaused();;
|
||||
ProgressSynch.SetPaused(true);
|
||||
int res = ::MessageBoxW(HWND(*this),
|
||||
L"Are you sure you want to cancel?",
|
||||
_title, MB_YESNOCANCEL);
|
||||
ProgressSynch.SetPaused(paused);
|
||||
if (res == IDCANCEL || res == IDNO)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
|
||||
}
|
||||
129
CPP/7zip/FileManager/Resource/ProgressDialog/ProgressDialog.h
Executable file
129
CPP/7zip/FileManager/Resource/ProgressDialog/ProgressDialog.h
Executable file
@@ -0,0 +1,129 @@
|
||||
// ProgressDialog.h
|
||||
|
||||
#ifndef __PROGRESSDIALOG_H
|
||||
#define __PROGRESSDIALOG_H
|
||||
|
||||
#include "resource.h"
|
||||
|
||||
#include "Windows/Control/Dialog.h"
|
||||
#include "Windows/Control/ProgressBar.h"
|
||||
#include "Windows/Synchronization.h"
|
||||
|
||||
class CProgressSynch
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSection _criticalSection;
|
||||
bool _stopped;
|
||||
bool _paused;
|
||||
UINT64 _total;
|
||||
UINT64 _completed;
|
||||
public:
|
||||
CProgressSynch(): _stopped(false), _paused(false), _total(1), _completed(0) {}
|
||||
|
||||
bool GetStopped()
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
return _stopped;
|
||||
}
|
||||
void SetStopped(bool value)
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
_stopped = value;
|
||||
}
|
||||
bool GetPaused()
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
return _paused;
|
||||
}
|
||||
void SetPaused(bool value)
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
_paused = value;
|
||||
}
|
||||
void SetProgress(UINT64 total, UINT64 completed)
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
_total = total;
|
||||
_completed = completed;
|
||||
}
|
||||
void SetPos(UINT64 completed)
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
_completed = completed;
|
||||
}
|
||||
void GetProgress(UINT64 &total, UINT64 &completed)
|
||||
{
|
||||
NWindows::NSynchronization::CCriticalSectionLock lock(_criticalSection);
|
||||
total = _total;
|
||||
completed = _completed;
|
||||
}
|
||||
};
|
||||
|
||||
class CU64ToI32Converter
|
||||
{
|
||||
UINT64 _numShiftBits;
|
||||
public:
|
||||
void Init(UINT64 _range);
|
||||
int Count(UINT64 aValue);
|
||||
};
|
||||
|
||||
// class CProgressDialog: public NWindows::NControl::CModelessDialog
|
||||
|
||||
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 OnTimer(WPARAM timerID, LPARAM callback);
|
||||
void SetRange(UINT64 range);
|
||||
void SetPos(UINT64 pos);
|
||||
virtual bool OnInit();
|
||||
virtual void OnCancel();
|
||||
NWindows::NSynchronization::CManualResetEvent _dialogCreatedEvent;
|
||||
#ifndef _SFX
|
||||
void AddToTitle(LPCWSTR string);
|
||||
#endif
|
||||
bool OnButtonClicked(int buttonID, HWND buttonHWND);
|
||||
public:
|
||||
CProgressSynch ProgressSynch;
|
||||
|
||||
#ifndef _SFX
|
||||
HWND MainWindow;
|
||||
UString MainTitle;
|
||||
UString MainAddTitle;
|
||||
~CProgressDialog();
|
||||
#endif
|
||||
|
||||
CProgressDialog(): _timer(0)
|
||||
#ifndef _SFX
|
||||
,MainWindow(0)
|
||||
#endif
|
||||
{}
|
||||
|
||||
void WaitCreating() { _dialogCreatedEvent.Lock(); }
|
||||
|
||||
|
||||
INT_PTR Create(const UString &title, HWND wndParent = 0)
|
||||
{
|
||||
_title = title;
|
||||
return CModalDialog::Create(IDD_DIALOG_PROGRESS, wndParent);
|
||||
}
|
||||
|
||||
static const UINT kCloseMessage;
|
||||
|
||||
virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
void MyClose()
|
||||
{
|
||||
PostMessage(kCloseMessage);
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
16
CPP/7zip/FileManager/Resource/ProgressDialog/StdAfx.h
Executable file
16
CPP/7zip/FileManager/Resource/ProgressDialog/StdAfx.h
Executable file
@@ -0,0 +1,16 @@
|
||||
// stdafx.h
|
||||
|
||||
#ifndef __STDAFX_H
|
||||
#define __STDAFX_H
|
||||
|
||||
#define _WIN32_WINNT 0x0400
|
||||
|
||||
// it's for Windows NT supporting (MENUITEMINFOW)
|
||||
#define WINVER 0x0400
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
#include "Common/NewHandler.h"
|
||||
|
||||
#endif
|
||||
3
CPP/7zip/FileManager/Resource/ProgressDialog/resource.h
Executable file
3
CPP/7zip/FileManager/Resource/ProgressDialog/resource.h
Executable file
@@ -0,0 +1,3 @@
|
||||
#define IDD_DIALOG_PROGRESS 500
|
||||
|
||||
#define IDC_PROGRESS1 1000
|
||||
20
CPP/7zip/FileManager/Resource/ProgressDialog/resource.rc
Executable file
20
CPP/7zip/FileManager/Resource/ProgressDialog/resource.rc
Executable file
@@ -0,0 +1,20 @@
|
||||
#include "resource.h"
|
||||
#include "../../../GuiCommon.rc"
|
||||
|
||||
#define xSize2 172
|
||||
#define ySize2 42
|
||||
#define xSize (xSize2 + marg + marg)
|
||||
#define ySize (ySize2 + marg + marg)
|
||||
|
||||
#define bYPos (ySize - marg - bYSize)
|
||||
#define bXPos (xSize - marg - bXSize)
|
||||
|
||||
|
||||
IDD_DIALOG_PROGRESS DIALOG 0, 0, xSize, ySize MY_MODAL_DIALOG_STYLE
|
||||
CAPTION "Progress"
|
||||
MY_FONT
|
||||
BEGIN
|
||||
PUSHBUTTON "Cancel", IDCANCEL, bXPos, bYPos , bXSize, bYSize
|
||||
CONTROL "Progress1", IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,
|
||||
marg,marg, xSize2, 14
|
||||
END
|
||||
Reference in New Issue
Block a user