OSDN Git Service

add source code of 7z457
[sevenzip/7-Zip.git] / 7z457 / CPP / 7zip / UI / Far / ProgressBox.cpp
1 // ProgressBox.cpp
2
3 #include "StdAfx.h"
4
5 #include <stdio.h>
6
7 #include "ProgressBox.h"
8
9 #include "FarUtils.h"
10
11 using namespace NFar;
12
13 static void CopySpaces(char *destString, int numSpaces)
14 {
15   int i;
16   for(i = 0; i < numSpaces; i++)
17     destString[i] = ' ';
18   destString[i] = '\0';
19 }
20
21 /////////////////////////////////
22 // CMessageBox
23
24 const int kNumStringsMax = 10;
25
26 void CMessageBox::Init(const CSysString &title, const CSysString &message, 
27     int numStrings, int width)
28 {
29   if (numStrings > kNumStringsMax)
30     throw 120620;
31   m_NumStrings = numStrings;
32   m_Width = width;
33
34   m_Title = title;
35   m_Message = message;
36 }
37
38 const int kNumStaticStrings = 2;
39
40 void CMessageBox::ShowProcessMessages(const char *messages[])
41 {
42   const char *msgItems[kNumStaticStrings + kNumStringsMax];
43   msgItems[0] = m_Title;
44   msgItems[1] = m_Message;
45
46   char formattedMessages[kNumStringsMax][256];
47
48   for (int i = 0; i < m_NumStrings; i++)
49   {
50     char *formattedMessage = formattedMessages[i];
51     int len = (int)strlen(messages[i]);
52     int size = MyMax(m_Width, len);
53     int startPos = (size - len) / 2;
54     CopySpaces(formattedMessage, startPos);
55     MyStringCopy(formattedMessage + startPos, messages[i]);
56     CopySpaces(formattedMessage + startPos + len, size - startPos - len);
57     msgItems[kNumStaticStrings + i] = formattedMessage;
58   }
59
60   g_StartupInfo.ShowMessage(0, NULL, msgItems, kNumStaticStrings + m_NumStrings, 0);
61 }
62
63 /////////////////////////////////
64 // CProgressBox
65
66 void CProgressBox::Init(const CSysString &title, const CSysString &message,
67     UInt64 step)
68 {
69   CMessageBox::Init(title, message, 1, 22);
70   m_Step = step;
71   m_CompletedPrev = 0;
72   m_Total = 0;
73 }
74
75
76 void CProgressBox::ShowProcessMessage(const char *message)
77 {
78   CMessageBox::ShowProcessMessages(&message);
79 }
80
81 void CProgressBox::PrintPercent(UInt64 percent)
82 {
83   char valueBuffer[32];
84   sprintf(valueBuffer, "%I64u%%", percent);
85   ShowProcessMessage(valueBuffer);
86 }
87
88 void CProgressBox::SetTotal(UInt64 total)
89 {
90   m_Total = total;
91 }
92
93 void CProgressBox::PrintCompeteValue(UInt64 completed)
94 {
95   if (completed >= m_CompletedPrev + m_Step || completed < m_CompletedPrev ||
96       completed == 0)
97   {
98     if (m_Total == 0)
99       PrintPercent(0);
100     else
101       PrintPercent(completed * 100 / m_Total);
102     m_CompletedPrev = completed;
103   }
104 }