--- /dev/null
+
+/* INCLUDES *****************************************************************/
+
+#include <ddk/ntddk.h>
+#include <ntdll/rtl.h>
+
+#include "usetup.h"
+#include "progress.h"
+
+/* FUNCTIONS ****************************************************************/
+
+
+static VOID
+DrawBorder(PPROGRESS Bar)
+{
+ COORD coPos;
+ ULONG Written;
+ SHORT i;
+
+ /* draw upper left corner */
+ coPos.X = Bar->Left;
+ coPos.Y = Bar->Top + 1;
+ FillConsoleOutputCharacter(0xDA, // '+',
+ 1,
+ coPos,
+ &Written);
+
+ /* draw upper edge */
+ coPos.X = Bar->Left + 1;
+ coPos.Y = Bar->Top + 1;
+ FillConsoleOutputCharacter(0xC4, // '-',
+ Bar->Right - Bar->Left - 1,
+ coPos,
+ &Written);
+
+ /* draw upper right corner */
+ coPos.X = Bar->Right;
+ coPos.Y = Bar->Top + 1;
+ FillConsoleOutputCharacter(0xBF, // '+',
+ 1,
+ coPos,
+ &Written);
+
+ /* draw left and right edge */
+ for (i = Bar->Top + 2; i < Bar->Bottom; i++)
+ {
+ coPos.X = Bar->Left;
+ coPos.Y = i;
+ FillConsoleOutputCharacter(0xB3, // '|',
+ 1,
+ coPos,
+ &Written);
+
+ coPos.X = Bar->Right;
+ FillConsoleOutputCharacter(0xB3, //'|',
+ 1,
+ coPos,
+ &Written);
+ }
+
+ /* draw lower left corner */
+ coPos.X = Bar->Left;
+ coPos.Y = Bar->Bottom;
+ FillConsoleOutputCharacter(0xC0, // '+',
+ 1,
+ coPos,
+ &Written);
+
+ /* draw lower edge */
+ coPos.X = Bar->Left + 1;
+ coPos.Y = Bar->Bottom;
+ FillConsoleOutputCharacter(0xC4, // '-',
+ Bar->Right - Bar->Left - 1,
+ coPos,
+ &Written);
+
+ /* draw lower right corner */
+ coPos.X = Bar->Right;
+ coPos.Y = Bar->Bottom;
+ FillConsoleOutputCharacter(0xD9, // '+',
+ 1,
+ coPos,
+ &Written);
+}
+
+
+static VOID
+DrawProgressBar(PPROGRESS Bar)
+{
+ CHAR TextBuffer[8];
+ COORD coPos;
+ ULONG Written;
+ SHORT i;
+
+ /* Print percentage */
+ sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
+
+ coPos.X = Bar->Left + (Bar->Width - 2) / 2;
+ coPos.Y = Bar->Top;
+ WriteConsoleOutputCharacters(TextBuffer,
+ 4,
+ coPos);
+
+ DrawBorder(Bar);
+
+ /* Draw the bar */
+ coPos.X = Bar->Left + 1;
+ for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
+ {
+ FillConsoleOutputAttribute(0x1E, /* Yellow on blue */
+ Bar->Width - 2,
+ coPos,
+ &Written);
+
+ FillConsoleOutputCharacter(' ',
+ Bar->Width - 2,
+ coPos,
+ &Written);
+ }
+
+}
+
+
+
+PPROGRESS
+CreateProgressBar(SHORT Left,
+ SHORT Top,
+ SHORT Right,
+ SHORT Bottom)
+{
+ PPROGRESS Bar;
+
+ Bar = (PPROGRESS)RtlAllocateHeap(ProcessHeap,
+ 0,
+ sizeof(PROGRESS));
+ if (Bar == NULL)
+ return(NULL);
+
+ Bar->Left = Left;
+ Bar->Top = Top;
+ Bar->Right = Right;
+ Bar->Bottom = Bottom;
+
+ Bar->Width = Bar->Right - Bar->Left + 1;
+
+ Bar->Percent = 0;
+ Bar->Pos = 0;
+
+ Bar->StepCount = 0;
+ Bar->CurrentStep = 0;
+
+ DrawProgressBar(Bar);
+
+ return(Bar);
+}
+
+
+VOID
+DestroyProgressBar(PPROGRESS Bar)
+{
+ RtlFreeHeap(ProcessHeap,
+ 0,
+ Bar);
+}
+
+VOID
+ProgressSetStepCount(PPROGRESS Bar,
+ ULONG StepCount)
+{
+ Bar->CurrentStep = 0;
+ Bar->StepCount = StepCount;
+
+ DrawProgressBar(Bar);
+}
+
+
+VOID
+ProgressNextStep(PPROGRESS Bar)
+{
+ CHAR TextBuffer[8];
+ COORD coPos;
+ ULONG Written;
+ ULONG NewPercent;
+ ULONG NewPos;
+
+ if ((Bar->StepCount == 0) ||
+ (Bar->CurrentStep == Bar->StepCount))
+ return;
+
+ Bar->CurrentStep++;
+
+ /* Calculate new percentage */
+ NewPercent = (ULONG)(((100.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5);
+
+ /* Redraw precentage if changed */
+ if (Bar->Percent != NewPercent)
+ {
+ Bar->Percent = NewPercent;
+
+ sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
+
+ coPos.X = Bar->Left + (Bar->Width - 2) / 2;
+ coPos.Y = Bar->Top;
+ WriteConsoleOutputCharacters(TextBuffer,
+ 4,
+ coPos);
+ }
+
+ /* Calculate bar position */
+ NewPos = (ULONG)((((float)(Bar->Width - 2) * 2.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5);
+
+ /* Redraw bar if changed */
+ if (Bar->Pos != NewPos)
+ {
+ Bar->Pos = NewPos;
+
+ for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
+ {
+ coPos.X = Bar->Left + 1;
+ FillConsoleOutputCharacter(0xDB,
+ Bar->Pos / 2,
+ coPos,
+ &Written);
+ coPos.X += Bar->Pos/2;
+
+ if (Pos & 1)
+ {
+ FillConsoleOutputCharacter(0xDD,
+ 1,
+ coPos,
+ &Written);
+ coPos.X++;
+ }
+
+ if (coPos.X <= Bar->Right - 1)
+ {
+ FillConsoleOutputCharacter(' ',
+ Bar->Right - coPos.X,
+ coPos,
+ &Written);
+ }
+ }
+ }
+}
+
+/* EOF */
--- /dev/null
+/*
+ * ReactOS kernel
+ * Copyright (C) 2002 ReactOS Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id: progress.h,v 1.1 2002/12/06 21:39:04 ekohl Exp $
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS text-mode setup
+ * FILE: subsys/system/usetup/partlist.h
+ * PURPOSE: Partition list functions
+ * PROGRAMMER: Eric Kohl
+ */
+
+#ifndef __PROGRESS_H__
+#define __PROGRESS_H__
+
+
+typedef struct _PROGRESS
+{
+ SHORT Left;
+ SHORT Top;
+ SHORT Right;
+ SHORT Bottom;
+
+ SHORT Width;
+
+ ULONG Percent;
+ ULONG Pos;
+
+ ULONG StepCount;
+ ULONG CurrentStep;
+} PROGRESS, *PPROGRESS;
+
+/* FUNCTIONS ****************************************************************/
+
+PPROGRESS
+CreateProgressBar(SHORT Left,
+ SHORT Top,
+ SHORT Right,
+ SHORT Bottom);
+
+VOID
+DestroyProgressBar(PPROGRESS Bar);
+
+VOID
+ProgressSetStepCount(PPROGRESS Bar,
+ ULONG StepCount);
+
+VOID
+ProgressNextStep(PPROGRESS Bar);
+
+#endif /* __PROGRESS_H__ */
+
+/* EOF */
\ No newline at end of file
#include "partlist.h"
#include "inicache.h"
#include "filequeue.h"
+#include "progress.h"
#define START_PAGE 0
{
ULONG TotalOperations;
ULONG CompletedOperations;
- ULONG Progress;
+ PPROGRESS ProgressBar;
} COPYCONTEXT, *PCOPYCONTEXT;
{
case SPFILENOTIFY_STARTSUBQUEUE:
CopyContext->TotalOperations = (ULONG)Param2;
+ ProgressSetStepCount(CopyContext->ProgressBar,
+ CopyContext->TotalOperations);
break;
case SPFILENOTIFY_STARTCOPY:
case SPFILENOTIFY_ENDCOPY:
CopyContext->CompletedOperations++;
+ ProgressNextStep(CopyContext->ProgressBar);
break;
}
{
WCHAR TargetRootPath[MAX_PATH];
COPYCONTEXT CopyContext;
-
- CopyContext.TotalOperations = 0;
- CopyContext.CompletedOperations = 0;
- CopyContext.Progress = 0;
+ SHORT xScreen;
+ SHORT yScreen;
SetStatusText(" Please wait...");
SetTextXY(6, 8, "Copying files");
+ GetScreenSize(&xScreen, &yScreen);
+
+ CopyContext.TotalOperations = 0;
+ CopyContext.CompletedOperations = 0;
+ CopyContext.ProgressBar = CreateProgressBar(6,
+ yScreen - 14,
+ xScreen - 7,
+ yScreen - 10);
+
swprintf(TargetRootPath,
L"\\Device\\Harddisk%lu\\Partition%lu",
PartData.DiskNumber,
SetupCloseFileQueue(SetupFileQueue);
+ DestroyProgressBar(CopyContext.ProgressBar);
+
SetStatusText(" ENTER = Continue F3 = Quit");
while(TRUE)