windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/winnt/dngauge.c
2020-09-26 16:20:57 +08:00

199 lines
3 KiB
C

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
dngauge.c
Abstract:
Code implementing a gas gauge for file copies for DOS-hosted NT Setup.
Author:
Ted Miller (tedm) 14-April-1992
Revision History:
--*/
#include "winnt.h"
#include <string.h>
unsigned FileCount;
unsigned FilesCopied;
unsigned CurrentPercent;
int GaugeChar;
VOID
DnInitGauge(
IN unsigned NumberOfFiles,
IN PSCREEN AdditionalScreen OPTIONAL
)
/*++
Routine Description:
Initialize the gas gauge. This includes drawing the gas gauge at 0%
and setting some global variables.
Arguments:
NumberOfFiles - supplies total number of files that 100% represents.
Screen - If specified, supplies a screen to display along with the
gas gauge.
Return Value:
None.
--*/
{
FileCount = NumberOfFiles;
FilesCopied = 0;
CurrentPercent = 0;
GaugeChar = DnGetGaugeChar();
DnDrawGauge(AdditionalScreen);
}
VOID
DnpRepaintGauge(
IN BOOLEAN ForceRepaint
)
/*++
Routine Description:
Draw the entire gauge inits current state.
Arguments:
ForceRepaint - if TRUE, the gauge is redrawn even if the percentage
hasn't changed since the last time the gauge was redrawn.
Return Value:
None.
--*/
{
unsigned PercentComplete;
unsigned temp;
char Therm[GAUGE_WIDTH+1];
unsigned SpacesOnScreen;
#ifdef CODEPAGE_437
BOOLEAN HalfSpace;
#endif
if(!FileCount) {
return;
}
//
// Figure out the percent complete.
//
PercentComplete = (unsigned)(100L * FilesCopied / FileCount);
if(ForceRepaint || (PercentComplete != CurrentPercent)) {
CurrentPercent = PercentComplete;
//
// Figure out how many spaces this represents on-screen.
//
temp = CurrentPercent * GAUGE_WIDTH;
SpacesOnScreen = temp / 100;
memset(Therm,GaugeChar,SpacesOnScreen);
Therm[SpacesOnScreen] = '\0';
DnPositionCursor(GAUGE_THERM_X,GAUGE_THERM_Y);
DnSetGaugeAttribute(TRUE);
DnWriteString(Therm);
DnSetGaugeAttribute(FALSE);
sprintf(Therm,"%u%%",CurrentPercent);
DnPositionCursor(GAUGE_PERCENT_X,GAUGE_PERCENT_Y);
DnWriteString(Therm);
}
}
VOID
DnTickGauge(
VOID
)
/*++
Routine Description:
'Tick' the gas gauge, ie, indicate that another file has been copied.
Adjust the thermometer and percent-complete readouts.
Arguments:
None.
Return Value:
None.
--*/
{
if(FilesCopied < FileCount) {
FilesCopied++;
}
DnpRepaintGauge(FALSE);
}
VOID
DnDrawGauge(
IN PSCREEN AdditionalScreen OPTIONAL
)
/*++
Routine Description:
Clear the client area and redraw the gas gauge in its current state.
Arguments:
Screen - If specified, supplies a screen to display along with the
gas gauge.
Return Value:
None.
--*/
{
DnClearClientArea();
if(AdditionalScreen) {
DnDisplayScreen(AdditionalScreen);
}
DnDisplayScreen(&DnsGauge);
DnpRepaintGauge(TRUE);
}