[USETUP] Implement CreateProgressBarEx() (#791)
[reactos.git] / base / setup / usetup / progress.c
index 5543381..71f9ae9 100644 (file)
 /* FUNCTIONS ****************************************************************/
 
 
-static VOID
-DrawBorder(PPROGRESSBAR Bar)
+static
+VOID
+DrawBorder(
+    PPROGRESSBAR Bar)
 {
-  COORD coPos;
-  DWORD Written;
-  SHORT i;
-
-  /* draw upper left corner */
-  coPos.X = Bar->Left;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xDA, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw upper edge */
-  coPos.X = Bar->Left + 1;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xC4, // '-',
-                            Bar->Right - Bar->Left - 1,
-                            coPos,
-                            &Written);
-
-  /* draw upper right corner */
-  coPos.X = Bar->Right;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xBF, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw left and right edge */
-  for (i = Bar->Top + 2; i < Bar->Bottom; i++)
+    COORD coPos;
+    DWORD Written;
+    SHORT i;
+
+    /* draw upper left corner */
+    coPos.X = Bar->Left;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xDA, // '+',
+                                1,
+                                coPos,
+                                &Written);
+
+    /* draw upper edge */
+    coPos.X = Bar->Left + 1;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xC4, // '-',
+                                Bar->Right - Bar->Left - 1,
+                                coPos,
+                                &Written);
+
+    /* draw upper right corner */
+    coPos.X = Bar->Right;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                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;
-      FillConsoleOutputCharacterA(StdOutput,
-                                0xB3, // '|',
-                                1,
-                                coPos,
-                                &Written);
-
-      coPos.X = Bar->Right;
-      FillConsoleOutputCharacterA(StdOutput,
-                                0xB3, //'|',
-                                1,
-                                coPos,
-                                &Written);
+        coPos.X = Bar->Left;
+        coPos.Y = i;
+        FillConsoleOutputCharacterA(StdOutput,
+                                    0xB3, // '|',
+                                    1,
+                                    coPos,
+                                    &Written);
+
+        coPos.X = Bar->Right;
+        FillConsoleOutputCharacterA(StdOutput,
+                                    0xB3, //'|',
+                                    1,
+                                    coPos,
+                                    &Written);
     }
 
-  /* draw lower left corner */
-  coPos.X = Bar->Left;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xC0, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw lower edge */
-  coPos.X = Bar->Left + 1;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xC4, // '-',
-                            Bar->Right - Bar->Left - 1,
-                            coPos,
-                            &Written);
-
-  /* draw lower right corner */
-  coPos.X = Bar->Right;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xD9, // '+',
-                            1,
-                            coPos,
-                            &Written);
+    /* draw lower left corner */
+    coPos.X = Bar->Left;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xC0, // '+',
+                                1,
+                                coPos,
+                                &Written);
+
+    /* draw lower edge */
+    coPos.X = Bar->Left + 1;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xC4, // '-',
+                                Bar->Right - Bar->Left - 1,
+                                coPos,
+                                &Written);
+
+    /* draw lower right corner */
+    coPos.X = Bar->Right;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xD9, // '+',
+                                1,
+                                coPos,
+                                &Written);
 }
 
-static VOID
-DrawThickBorder(PPROGRESSBAR Bar)
+
+static
+VOID
+DrawThickBorder(
+    PPROGRESSBAR Bar)
 {
-  COORD coPos;
-  DWORD Written;
-  SHORT i;
-
-  /* draw upper left corner */
-  coPos.X = Bar->Left;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xC9, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw upper edge */
-  coPos.X = Bar->Left + 1;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xCD, // '-',
-                            Bar->Right - Bar->Left - 1,
-                            coPos,
-                            &Written);
-
-  /* draw upper right corner */
-  coPos.X = Bar->Right;
-  coPos.Y = Bar->Top + 1;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xBB, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw left and right edge */
-  for (i = Bar->Top + 2; i < Bar->Bottom; i++)
+    COORD coPos;
+    DWORD Written;
+    SHORT i;
+
+    /* draw upper left corner */
+    coPos.X = Bar->Left;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xC9, // '+',
+                                1,
+                                coPos,
+                                &Written);
+
+    /* draw upper edge */
+    coPos.X = Bar->Left + 1;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xCD, // '-',
+                                Bar->Right - Bar->Left - 1,
+                                coPos,
+                                &Written);
+
+    /* draw upper right corner */
+    coPos.X = Bar->Right;
+    coPos.Y = Bar->Top + 1;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xBB, // '+',
+                                1,
+                                coPos,
+                                &Written);
+
+    /* draw left and right edge */
+    for (i = Bar->Top + 2; i < Bar->Bottom; i++)
     {
-      coPos.X = Bar->Left;
-      coPos.Y = i;
-      FillConsoleOutputCharacterA(StdOutput,
-                                0xBA, // '|',
-                                1,
-                                coPos,
-                                &Written);
-
-      coPos.X = Bar->Right;
-      FillConsoleOutputCharacterA(StdOutput,
-                                0xBA, //'|',
-                                1,
-                                coPos,
-                                &Written);
+        coPos.X = Bar->Left;
+        coPos.Y = i;
+        FillConsoleOutputCharacterA(StdOutput,
+                                    0xBA, // '|',
+                                    1,
+                                    coPos,
+                                    &Written);
+
+        coPos.X = Bar->Right;
+        FillConsoleOutputCharacterA(StdOutput,
+                                    0xBA, //'|',
+                                    1,
+                                    coPos,
+                                    &Written);
     }
 
-  /* draw lower left corner */
-  coPos.X = Bar->Left;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xC8, // '+',
-                            1,
-                            coPos,
-                            &Written);
-
-  /* draw lower edge */
-  coPos.X = Bar->Left + 1;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xCD, // '-',
-                            Bar->Right - Bar->Left - 1,
-                            coPos,
-                            &Written);
-
-  /* draw lower right corner */
-  coPos.X = Bar->Right;
-  coPos.Y = Bar->Bottom;
-  FillConsoleOutputCharacterA(StdOutput,
-                            0xBC, // '+',
-                            1,
-                            coPos,
-                            &Written);
+    /* draw lower left corner */
+    coPos.X = Bar->Left;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xC8, // '+',
+                                1,
+                                coPos,
+                                &Written);
+
+    /* draw lower edge */
+    coPos.X = Bar->Left + 1;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xCD, // '-',
+                                Bar->Right - Bar->Left - 1,
+                                coPos,
+                                &Written);
+
+    /* draw lower right corner */
+    coPos.X = Bar->Right;
+    coPos.Y = Bar->Bottom;
+    FillConsoleOutputCharacterA(StdOutput,
+                                0xBC, // '+',
+                                1,
+                                coPos,
+                                &Written);
 }
 
-static VOID
-DrawProgressBar(PPROGRESSBAR Bar)
+
+static
+VOID
+DrawProgressBar(
+    PPROGRESSBAR Bar)
 {
-  CHAR TextBuffer[8];
-  COORD coPos;
-  DWORD Written;
-  PROGRESSBAR BarBorder = *Bar;
-
-  /* Print percentage */
-  sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
-
-  coPos.X = Bar->Left + (Bar->Width - 2) / 2;
-  coPos.Y = Bar->Top;
-  WriteConsoleOutputCharacterA(StdOutput,
-                              TextBuffer,
-                              4,
-                              coPos,
-                              &Written);
-
-  /* Draw the progress bar border */
-  DrawBorder(Bar);
-
-  /* Write Text Associated with Bar */
-  CONSOLE_SetTextXY(Bar->TextTop, Bar->TextRight, Bar->Text);
-
-  /* Draw the progress bar "border" border */
-  if (Bar->Double)
-  {
-      BarBorder.Top -= 5;
-      BarBorder.Bottom += 2;
-      BarBorder.Right += 5;
-      BarBorder.Left -= 5;
-      DrawThickBorder(&BarBorder);
-  }
-
-  /* Draw the bar */
-  coPos.X = Bar->Left + 1;
-  for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
+    CHAR TextBuffer[8];
+    COORD coPos;
+    DWORD Written;
+    PROGRESSBAR BarBorder = *Bar;
+
+    /* Print percentage */
+    sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
+
+    coPos.X = Bar->Left + (Bar->Width - 2) / 2;
+    coPos.Y = Bar->Top;
+    WriteConsoleOutputCharacterA(StdOutput,
+                                 TextBuffer,
+                                 4,
+                                 coPos,
+                                 &Written);
+
+    /* Draw the progress bar border */
+    DrawBorder(Bar);
+
+    /* Write Text Associated with Bar */
+    CONSOLE_SetTextXY(Bar->TextTop, Bar->TextRight, Bar->Text);
+
+    /* Draw the progress bar "border" border */
+    if (Bar->Double)
     {
-      FillConsoleOutputAttribute(StdOutput,
-                                FOREGROUND_YELLOW | BACKGROUND_BLUE,
-                                Bar->Width - 2,
-                                coPos,
-                                &Written);
-
-      FillConsoleOutputCharacterA(StdOutput,
-                                ' ',
-                                Bar->Width - 2,
-                                coPos,
-                                &Written);
+        BarBorder.Top -= 5;
+        BarBorder.Bottom += 2;
+        BarBorder.Right += 5;
+        BarBorder.Left -= 5;
+        DrawThickBorder(&BarBorder);
     }
 
+    /* Draw the bar */
+    coPos.X = Bar->Left + 1;
+    for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
+    {
+        FillConsoleOutputAttribute(StdOutput,
+                                   Bar->ProgressColour,
+                                   Bar->Width - 2,
+                                   coPos,
+                                   &Written);
+
+        FillConsoleOutputCharacterA(StdOutput,
+                                    ' ',
+                                    Bar->Width - 2,
+                                    coPos,
+                                    &Written);
+    }
 }
 
 
-
 PPROGRESSBAR
-CreateProgressBar(SHORT Left,
-                 SHORT Top,
-                 SHORT Right,
-                 SHORT Bottom,
-          SHORT TextTop,
-          SHORT TextRight,
-          IN BOOLEAN DoubleEdge,
-          char* Text)
+CreateProgressBarEx(
+    SHORT Left,
+    SHORT Top,
+    SHORT Right,
+    SHORT Bottom,
+    SHORT TextTop,
+    SHORT TextRight,
+    IN BOOLEAN DoubleEdge,
+    SHORT ProgressColour,
+    CHAR *Text)
 {
-  PPROGRESSBAR Bar;
+    PPROGRESSBAR Bar;
 
-  Bar = (PPROGRESSBAR)RtlAllocateHeap(ProcessHeap,
-                                     0,
-                                     sizeof(PROGRESSBAR));
-  if (Bar == NULL)
-    return(NULL);
+    Bar = (PPROGRESSBAR)RtlAllocateHeap(ProcessHeap,
+                                        0,
+                                        sizeof(PROGRESSBAR));
+    if (Bar == NULL)
+        return NULL;
 
-  Bar->Left = Left;
-  Bar->Top = Top;
-  Bar->Right = Right;
-  Bar->Bottom = Bottom;
-  Bar->TextTop = TextTop;
-  Bar->TextRight = TextRight;
-  Bar->Double = DoubleEdge;
-  Bar->Text = Text;
+    Bar->Left = Left;
+    Bar->Top = Top;
+    Bar->Right = Right;
+    Bar->Bottom = Bottom;
+    Bar->TextTop = TextTop;
+    Bar->TextRight = TextRight;
+    Bar->Double = DoubleEdge;
+    Bar->ProgressColour = ProgressColour;
+    Bar->Text = Text;
 
-  Bar->Width = Bar->Right - Bar->Left + 1;
+    Bar->Width = Bar->Right - Bar->Left + 1;
 
-  Bar->Percent = 0;
-  Bar->Pos = 0;
+    Bar->Percent = 0;
+    Bar->Pos = 0;
 
-  Bar->StepCount = 0;
-  Bar->CurrentStep = 0;
+    Bar->StepCount = 0;
+    Bar->CurrentStep = 0;
 
-  DrawProgressBar(Bar);
+    DrawProgressBar(Bar);
 
-  return(Bar);
+    return Bar;
 }
 
+PPROGRESSBAR
+CreateProgressBar(
+    SHORT Left,
+    SHORT Top,
+    SHORT Right,
+    SHORT Bottom,
+    SHORT TextTop,
+    SHORT TextRight,
+    IN BOOLEAN DoubleEdge,
+    CHAR *Text)
+{
+
+    /* Call the Ex variant of the function */
+    return CreateProgressBarEx(Left, Top, Right, Bottom,
+                               TextTop, TextRight,
+                               DoubleEdge,
+                               FOREGROUND_YELLOW | BACKGROUND_BLUE,
+                               Text);
+}
 
 VOID
-DestroyProgressBar(PPROGRESSBAR Bar)
+DestroyProgressBar(
+    PPROGRESSBAR Bar)
 {
-  RtlFreeHeap(ProcessHeap,
-             0,
-             Bar);
+    RtlFreeHeap(ProcessHeap, 0, Bar);
 }
 
+
 VOID
-ProgressSetStepCount(PPROGRESSBAR Bar,
-                    ULONG StepCount)
+ProgressSetStepCount(
+    PPROGRESSBAR Bar,
+    ULONG StepCount)
 {
-  Bar->CurrentStep = 0;
-  Bar->StepCount = StepCount;
+    Bar->CurrentStep = 0;
+    Bar->StepCount = StepCount;
 
-  DrawProgressBar(Bar);
+    DrawProgressBar(Bar);
 }
 
 
 VOID
-ProgressNextStep(PPROGRESSBAR Bar)
+ProgressNextStep(
+    PPROGRESSBAR Bar)
 {
-  ProgressSetStep(Bar, Bar->CurrentStep + 1);
+    ProgressSetStep(Bar, Bar->CurrentStep + 1);
 }
 
 
 VOID
-ProgressSetStep (PPROGRESSBAR Bar,
-                ULONG Step)
+ProgressSetStep(
+    PPROGRESSBAR Bar,
+    ULONG Step)
 {
-  CHAR TextBuffer[8];
-  COORD coPos;
-  DWORD Written;
-  ULONG NewPercent;
-  ULONG NewPos;
+    CHAR TextBuffer[8];
+    COORD coPos;
+    DWORD Written;
+    ULONG NewPercent;
+    ULONG NewPos;
 
-  if (Step > Bar->StepCount)
-    return;
+    if (Step > Bar->StepCount)
+        return;
 
-  Bar->CurrentStep = Step;
+    Bar->CurrentStep = Step;
 
-  /* Calculate new percentage */
-  NewPercent = (ULONG)(((100.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5);
+    /* Calculate new percentage */
+    NewPercent = (ULONG)(((100.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5);
 
-  /* Redraw precentage if changed */
-  if (Bar->Percent != NewPercent)
+    /* Redraw percentage if changed */
+    if (Bar->Percent != NewPercent)
     {
-      Bar->Percent = NewPercent;
+        Bar->Percent = NewPercent;
 
-      sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
+        sprintf(TextBuffer, "%-3lu%%", Bar->Percent);
 
-      coPos.X = Bar->Left + (Bar->Width - 2) / 2;
-      coPos.Y = Bar->Top;
-      WriteConsoleOutputCharacterA(StdOutput,
-                                  TextBuffer,
-                                  4,
-                                  coPos,
-                                  &Written);
+        coPos.X = Bar->Left + (Bar->Width - 2) / 2;
+        coPos.Y = Bar->Top;
+        WriteConsoleOutputCharacterA(StdOutput,
+                                     TextBuffer,
+                                     4,
+                                     coPos,
+                                     &Written);
     }
 
-  /* Calculate bar position */
-  NewPos = (ULONG)((((float)(Bar->Width - 2) * 2.0 * (float)Bar->CurrentStep) / (float)Bar->StepCount) + 0.5);
+    /* 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)
+    /* 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;
-         FillConsoleOutputCharacterA(StdOutput,
-                                    0xDB,
-                                    Bar->Pos / 2,
-                                    coPos,
-                                    &Written);
-         coPos.X += Bar->Pos/2;
-
-         if (NewPos & 1)
-           {
-             FillConsoleOutputCharacterA(StdOutput,
-                                        0xDD,
-                                        1,
-                                        coPos,
-                                        &Written);
-             coPos.X++;
-           }
-
-         if (coPos.X <= Bar->Right - 1)
-           {
-             FillConsoleOutputCharacterA(StdOutput,
-                                        ' ',
-                                        Bar->Right - coPos.X,
-                                        coPos,
-                                        &Written);
-           }
-       }
+        Bar->Pos = NewPos;
+
+        for (coPos.Y = Bar->Top + 2; coPos.Y <= Bar->Bottom - 1; coPos.Y++)
+        {
+            coPos.X = Bar->Left + 1;
+            FillConsoleOutputCharacterA(StdOutput,
+                                        0xDB,
+                                        Bar->Pos / 2,
+                                        coPos,
+                                        &Written);
+            coPos.X += Bar->Pos/2;
+
+            if (NewPos & 1)
+            {
+                FillConsoleOutputCharacterA(StdOutput,
+                                            0xDD,
+                                            1,
+                                            coPos,
+                                            &Written);
+                coPos.X++;
+            }
+
+            if (coPos.X <= Bar->Right - 1)
+            {
+                FillConsoleOutputCharacterA(StdOutput,
+                                            ' ',
+                                            Bar->Right - coPos.X,
+                                            coPos,
+                                            &Written);
+            }
+        }
     }
 }