ReactOS 0.4.15-dev-7924-g5949c20
progress.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS text-mode setup
4 * FILE: base/setup/usetup/progress.c
5 * PURPOSE: Partition list functions
6 * PROGRAMMER:
7 */
8
9/* INCLUDES *****************************************************************/
10
11#include "usetup.h"
12
13#define NDEBUG
14#include <debug.h>
15
16/* FUNCTIONS ****************************************************************/
17
18static
22 IN BOOLEAN AlwaysUpdate,
24 IN SIZE_T cchBufferSize)
25{
26 // static PCSTR ProgressFormatText;
27 ULONG OldProgress = Bar->Progress;
28
29 /* Calculate the new percentage */
30 if (Bar->StepCount == 0)
31 Bar->Progress = 0;
32 else
33 Bar->Progress = ((100 * Bar->CurrentStep + (Bar->StepCount / 2)) / Bar->StepCount);
34
35 /* Build the progress string if it has changed */
36 if ( Bar->ProgressFormatText &&
37 (AlwaysUpdate || (Bar->Progress != OldProgress)) )
38 {
39 RtlStringCchPrintfA(Buffer, cchBufferSize,
40 Bar->ProgressFormatText, Bar->Progress);
41 return TRUE;
42 }
43 return FALSE;
44}
45
46static
47VOID
50{
51 COORD coPos;
52 DWORD Written;
53 SHORT i;
54
55 /* draw upper left corner */
56 coPos.X = Bar->Left;
57 coPos.Y = Bar->Top + 1;
59 CharUpperLeftCorner, // '+',
60 1,
61 coPos,
62 &Written);
63
64 /* draw upper edge */
65 coPos.X = Bar->Left + 1;
66 coPos.Y = Bar->Top + 1;
68 CharHorizontalLine, // '-',
69 Bar->Right - Bar->Left - 1,
70 coPos,
71 &Written);
72
73 /* draw upper right corner */
74 coPos.X = Bar->Right;
75 coPos.Y = Bar->Top + 1;
78 1,
79 coPos,
80 &Written);
81
82 /* draw left and right edge */
83 for (i = Bar->Top + 2; i < Bar->Bottom; i++)
84 {
85 coPos.X = Bar->Left;
86 coPos.Y = i;
88 CharVerticalLine, // '|',
89 1,
90 coPos,
91 &Written);
92
93 coPos.X = Bar->Right;
95 CharVerticalLine, //'|',
96 1,
97 coPos,
98 &Written);
99 }
100
101 /* draw lower left corner */
102 coPos.X = Bar->Left;
103 coPos.Y = Bar->Bottom;
105 CharLowerLeftCorner, // '+',
106 1,
107 coPos,
108 &Written);
109
110 /* draw lower edge */
111 coPos.X = Bar->Left + 1;
112 coPos.Y = Bar->Bottom;
114 CharHorizontalLine, // '-',
115 Bar->Right - Bar->Left - 1,
116 coPos,
117 &Written);
118
119 /* draw lower right corner */
120 coPos.X = Bar->Right;
121 coPos.Y = Bar->Bottom;
123 CharLowerRightCorner, // '+',
124 1,
125 coPos,
126 &Written);
127}
128
129static
130VOID
133{
134 COORD coPos;
135 DWORD Written;
136 SHORT i;
137
138 /* draw upper left corner */
139 coPos.X = Bar->Left;
140 coPos.Y = Bar->Top + 1;
143 1,
144 coPos,
145 &Written);
146
147 /* draw upper edge */
148 coPos.X = Bar->Left + 1;
149 coPos.Y = Bar->Top + 1;
152 Bar->Right - Bar->Left - 1,
153 coPos,
154 &Written);
155
156 /* draw upper right corner */
157 coPos.X = Bar->Right;
158 coPos.Y = Bar->Top + 1;
161 1,
162 coPos,
163 &Written);
164
165 /* draw left and right edge */
166 for (i = Bar->Top + 2; i < Bar->Bottom; i++)
167 {
168 coPos.X = Bar->Left;
169 coPos.Y = i;
172 1,
173 coPos,
174 &Written);
175
176 coPos.X = Bar->Right;
179 1,
180 coPos,
181 &Written);
182 }
183
184 /* draw lower left corner */
185 coPos.X = Bar->Left;
186 coPos.Y = Bar->Bottom;
189 1,
190 coPos,
191 &Written);
192
193 /* draw lower edge */
194 coPos.X = Bar->Left + 1;
195 coPos.Y = Bar->Bottom;
198 Bar->Right - Bar->Left - 1,
199 coPos,
200 &Written);
201
202 /* draw lower right corner */
203 coPos.X = Bar->Right;
204 coPos.Y = Bar->Bottom;
207 1,
208 coPos,
209 &Written);
210}
211
212static
213VOID
216{
217 COORD coPos;
218 DWORD Written;
219 PROGRESSBAR BarBorder = *Bar;
220 CHAR TextBuffer[256];
221
222 /* Draw the progress bar "border" border */
223 if (Bar->DoubleEdge)
224 {
225 BarBorder.Top -= 5;
226 BarBorder.Bottom += 2;
227 BarBorder.Right += 5;
228 BarBorder.Left -= 5;
229 DrawThickBorder(&BarBorder);
230 }
231
232 /* Draw the progress bar border */
234
235 /* Display the description text */
236 if (Bar->DescriptionText)
237 CONSOLE_SetTextXY(Bar->TextTop, Bar->TextRight, Bar->DescriptionText);
238
239 /* Always update and display the progress */
240 if (Bar->UpdateProgressProc &&
241 Bar->UpdateProgressProc(Bar, TRUE, TextBuffer, ARRAYSIZE(TextBuffer)))
242 {
243 coPos.X = Bar->Left + (Bar->Width - (USHORT)strlen(TextBuffer) + 1) / 2;
244 coPos.Y = Bar->Top;
248 coPos,
249 &Written);
250 }
251
252 /* Draw the empty bar */
253 coPos.X = Bar->Left + 1;
254 for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
255 {
257 Bar->ProgressColour,
258 Bar->Width - 2,
259 coPos,
260 &Written);
261
263 ' ',
264 Bar->Width - 2,
265 coPos,
266 &Written);
267 }
268}
269
270
273 IN SHORT Left,
274 IN SHORT Top,
275 IN SHORT Right,
277 IN SHORT TextTop,
278 IN SHORT TextRight,
279 IN BOOLEAN DoubleEdge,
280 IN SHORT ProgressColour,
281 IN ULONG StepCount,
282 IN PCSTR DescriptionText OPTIONAL,
283 IN PCSTR ProgressFormatText OPTIONAL,
284 IN PUPDATE_PROGRESS UpdateProgressProc OPTIONAL)
285{
287
289 0,
290 sizeof(PROGRESSBAR));
291 if (Bar == NULL)
292 return NULL;
293
294 Bar->Left = Left;
295 Bar->Top = Top;
296 Bar->Right = Right;
297 Bar->Bottom = Bottom;
298 Bar->TextTop = TextTop;
299 Bar->TextRight = TextRight;
300
301 Bar->Width = Bar->Right - Bar->Left + 1;
302
303 Bar->DoubleEdge = DoubleEdge;
304 Bar->ProgressColour = ProgressColour;
305 Bar->DescriptionText = DescriptionText;
306 Bar->ProgressFormatText = ProgressFormatText;
307
308 Bar->UpdateProgressProc = UpdateProgressProc;
309
310 /* Reset the progress bar counts and initially draw it */
311 ProgressSetStepCount(Bar, StepCount);
312
313 return Bar;
314}
315
318 IN SHORT Left,
319 IN SHORT Top,
320 IN SHORT Right,
322 IN SHORT TextTop,
323 IN SHORT TextRight,
324 IN BOOLEAN DoubleEdge,
325 IN PCSTR DescriptionText OPTIONAL)
326{
327 /* Call the Ex variant of the function */
328 return CreateProgressBarEx(Left, Top, Right, Bottom,
329 TextTop, TextRight,
330 DoubleEdge,
332 0,
333 DescriptionText,
334 "%-3lu%%",
336}
337
338VOID
341{
343}
344
345
346VOID
349 IN ULONG StepCount)
350{
351 Bar->CurrentStep = 0;
352 Bar->StepCount = StepCount;
353
354 Bar->Progress = 0;
355 Bar->Pos = 0;
356
358}
359
360VOID
363{
364 ProgressSetStep(Bar, Bar->CurrentStep + 1);
365}
366
367VOID
370 IN ULONG Step)
371{
372 COORD coPos;
373 DWORD Written;
374 ULONG NewPos;
375 CHAR TextBuffer[256];
376
377 if (Step > Bar->StepCount)
378 return;
379
380 Bar->CurrentStep = Step;
381
382 /* Update the progress and redraw it if it has changed */
383 if (Bar->UpdateProgressProc &&
384 Bar->UpdateProgressProc(Bar, FALSE, TextBuffer, ARRAYSIZE(TextBuffer)))
385 {
386 coPos.X = Bar->Left + (Bar->Width - (USHORT)strlen(TextBuffer) + 1) / 2;
387 coPos.Y = Bar->Top;
391 coPos,
392 &Written);
393 }
394
395 /* Calculate the bar position */
396 NewPos = (((Bar->Width - 2) * 2 * Bar->CurrentStep + (Bar->StepCount / 2)) / Bar->StepCount);
397
398 /* Redraw the bar if it has changed */
399 if (Bar->Pos != NewPos)
400 {
401 Bar->Pos = NewPos;
402
403 for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
404 {
405 coPos.X = Bar->Left + 1;
407 CharBlock,
408 Bar->Pos / 2,
409 coPos,
410 &Written);
411 coPos.X += Bar->Pos / 2;
412
413 if (NewPos & 1)
414 {
417 1,
418 coPos,
419 &Written);
420 coPos.X++;
421 }
422
423 if (coPos.X <= Bar->Right - 1)
424 {
426 ' ',
427 Bar->Right - coPos.X,
428 coPos,
429 &Written);
430 }
431 }
432 }
433}
434
435/* EOF */
unsigned char BOOLEAN
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
HANDLE ProcessHeap
Definition: servman.c:15
BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, IN LPCSTR lpCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:407
BOOL WINAPI FillConsoleOutputCharacterA(IN HANDLE hConsoleOutput, IN CHAR cCharacter, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfCharsWritten)
Definition: console.c:560
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:525
VOID ProgressSetStep(IN PPROGRESSBAR Bar, IN ULONG Step)
Definition: progress.c:368
static BOOLEAN NTAPI UpdateProgressPercentage(IN PPROGRESSBAR Bar, IN BOOLEAN AlwaysUpdate, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
Definition: progress.c:20
static VOID DrawThickBorder(IN PPROGRESSBAR Bar)
Definition: progress.c:131
VOID ProgressNextStep(IN PPROGRESSBAR Bar)
Definition: progress.c:361
PPROGRESSBAR CreateProgressBarEx(IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom, IN SHORT TextTop, IN SHORT TextRight, IN BOOLEAN DoubleEdge, IN SHORT ProgressColour, IN ULONG StepCount, IN PCSTR DescriptionText OPTIONAL, IN PCSTR ProgressFormatText OPTIONAL, IN PUPDATE_PROGRESS UpdateProgressProc OPTIONAL)
Definition: progress.c:272
VOID ProgressSetStepCount(IN PPROGRESSBAR Bar, IN ULONG StepCount)
Definition: progress.c:347
static VOID DrawBorder(IN PPROGRESSBAR Bar)
Definition: progress.c:48
static VOID DrawProgressBar(IN PPROGRESSBAR Bar)
Definition: progress.c:214
PPROGRESSBAR CreateProgressBar(IN SHORT Left, IN SHORT Top, IN SHORT Right, IN SHORT Bottom, IN SHORT TextTop, IN SHORT TextRight, IN BOOLEAN DoubleEdge, IN PCSTR DescriptionText OPTIONAL)
Definition: progress.c:317
VOID DestroyProgressBar(IN OUT PPROGRESSBAR Bar)
Definition: progress.c:339
struct _PROGRESSBAR * PPROGRESSBAR
BOOLEAN(NTAPI * PUPDATE_PROGRESS)(IN struct _PROGRESSBAR *Bar, IN BOOLEAN AlwaysUpdate, OUT PSTR Buffer, IN SIZE_T cchBufferSize)
Definition: progress.h:32
static LPHIST_ENTRY Bottom
Definition: history.c:54
static LPHIST_ENTRY Top
Definition: history.c:53
#define BACKGROUND_BLUE
Definition: blue.h:65
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:590
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:608
Definition: bufpool.h:45
char TextBuffer[BUFFERLEN]
Definition: combotst.c:45
VOID CONSOLE_SetTextXY(IN SHORT x, IN SHORT y, IN LPCSTR Text)
Definition: consup.c:320
HANDLE StdOutput
Definition: consup.c:37
#define FOREGROUND_YELLOW
Definition: consup.h:30
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void Bar(void)
Definition: terminate.cpp:70
NTSTRSAFEVAPI RtlStringCchPrintfA(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
Definition: ntstrsafe.h:1085
short SHORT
Definition: pedump.c:59
unsigned short USHORT
Definition: pedump.c:61
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1340
ULONG X
Definition: bl.h:1339
SHORT Right
Definition: progress.h:43
SHORT Left
Definition: progress.h:41
SHORT Top
Definition: progress.h:42
SHORT Bottom
Definition: progress.h:44
char * PSTR
Definition: typedefs.h:51
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const char * PCSTR
Definition: typedefs.h:52
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
CHAR CharHorizontalLine
Definition: mui.c:39
CHAR CharHalfBlock
Definition: mui.c:36
CHAR CharBlock
Definition: mui.c:35
CHAR CharDoubleLowerRightCorner
Definition: mui.c:52
CHAR CharDoubleUpperRightCorner
Definition: mui.c:50
CHAR CharUpperRightCorner
Definition: mui.c:42
CHAR CharDoubleLowerLeftCorner
Definition: mui.c:51
CHAR CharDoubleUpperLeftCorner
Definition: mui.c:49
CHAR CharDoubleHorizontalLine
Definition: mui.c:47
CHAR CharLowerRightCorner
Definition: mui.c:44
CHAR CharUpperLeftCorner
Definition: mui.c:41
CHAR CharDoubleVerticalLine
Definition: mui.c:48
CHAR CharVerticalLine
Definition: mui.c:40
CHAR CharLowerLeftCorner
Definition: mui.c:43
char CHAR
Definition: xmlstorage.h:175