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
|
// ProgressBox.cpp
#include "StdAfx.h"
#include <stdio.h>
#include "ProgressBox.h"
#include "FarUtils.h"
using namespace NFar;
static void CopySpaces(char *destString, int numSpaces)
{
for(int i = 0; i < numSpaces; i++)
destString[i] = ' ';
destString[i] = '\0';
}
/////////////////////////////////
// CMessageBox
const int kNumStringsMax = 10;
void CMessageBox::Init(const CSysString &title, const CSysString &message,
int numStrings, int width)
{
if (numStrings > kNumStringsMax)
throw 120620;
m_NumStrings = numStrings;
m_Width = width;
m_Title = title;
m_Message = message;
}
const int kNumStaticStrings = 2;
void CMessageBox::ShowProcessMessages(const char *messages[])
{
const char *msgItems[kNumStaticStrings + kNumStringsMax];
msgItems[0] = m_Title;
msgItems[1] = m_Message;
char formattedMessages[kNumStringsMax][256];
for (int i = 0; i < m_NumStrings; i++)
{
char *formattedMessage = formattedMessages[i];
int len = strlen(messages[i]);
int size = MyMax(m_Width, len);
int startPos = (size - len) / 2;
CopySpaces(formattedMessage, startPos);
strcpy(formattedMessage + startPos, messages[i]);
CopySpaces(formattedMessage + startPos + len, size - startPos - len);
msgItems[kNumStaticStrings + i] = formattedMessage;
}
g_StartupInfo.ShowMessage(0, NULL, msgItems, kNumStaticStrings + m_NumStrings, 0);
}
/////////////////////////////////
// CProgressBox
void CProgressBox::Init(const CSysString &title, const CSysString &message,
UInt64 step)
{
CMessageBox::Init(title, message, 1, 22);
m_Step = step;
m_CompletedPrev = 0;
m_Total = 0;
}
void CProgressBox::ShowProcessMessage(const char *message)
{
CMessageBox::ShowProcessMessages(&message);
}
void CProgressBox::PrintPercent(UInt64 percent)
{
char valueBuffer[32];
sprintf(valueBuffer, "%I64u%%", percent);
ShowProcessMessage(valueBuffer);
}
void CProgressBox::SetTotal(UInt64 total)
{
m_Total = total;
}
void CProgressBox::PrintCompeteValue(UInt64 completed)
{
if (completed >= m_CompletedPrev + m_Step || completed < m_CompletedPrev ||
completed == 0)
{
if (m_Total == 0)
PrintPercent(0);
else
PrintPercent(completed * 100 / m_Total);
m_CompletedPrev = completed;
}
}
|