]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / CustomizedDisplayLib / CustomizedDisplayLibInternal.c
index 9b6ddb517fbfe8171d056abd5142083ba4caf687..d770a0f87370f2121da5f0a35c161aa734027bf3 100644 (file)
@@ -2,14 +2,8 @@
 \r
   This library class defines a set of interfaces to customize Display module\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution.  \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php.                                            \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2013-2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include "CustomizedDisplayLibInternal.h"\r
@@ -47,10 +41,10 @@ CHAR16            *gInputErrorMessage;
   Print banner info for front page.\r
 \r
   @param[in]  FormData             Form Data to be shown in Page\r
-  \r
+\r
 **/\r
 VOID\r
-PrintBannerInfo ( \r
+PrintBannerInfo (\r
   IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
   )\r
 {\r
@@ -84,15 +78,15 @@ PrintBannerInfo (
         ) {\r
       RowIdx    = (UINT8) (Line - (UINT8) gScreenDimensions.TopRow);\r
       ColumnIdx = (UINT8) (Alignment - (UINT8) gScreenDimensions.LeftColumn);\r
-  \r
+\r
       ASSERT (RowIdx < BANNER_HEIGHT && ColumnIdx < BANNER_COLUMNS);\r
-  \r
+\r
       if (gBannerData!= NULL && gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
         StrFrontPageBanner = LibGetToken (gBannerData->Banner[RowIdx][ColumnIdx], FormData->HiiHandle);\r
       } else {\r
         continue;\r
       }\r
-  \r
+\r
       switch (Alignment - gScreenDimensions.LeftColumn) {\r
       case 0:\r
         //\r
@@ -100,7 +94,7 @@ PrintBannerInfo (
         //\r
         PrintStringAt (gScreenDimensions.LeftColumn + BANNER_LEFT_COLUMN_INDENT, Line, StrFrontPageBanner);\r
         break;\r
-  \r
+\r
       case 1:\r
         //\r
         // Handle center column\r
@@ -111,7 +105,7 @@ PrintBannerInfo (
           StrFrontPageBanner\r
           );\r
         break;\r
-  \r
+\r
       case 2:\r
         //\r
         // Handle right column\r
@@ -123,26 +117,42 @@ PrintBannerInfo (
           );\r
         break;\r
       }\r
-  \r
+\r
       FreePool (StrFrontPageBanner);\r
     }\r
   }\r
 }\r
 \r
 /**\r
+  Print framework and form title for a page.\r
 \r
-  Print framework for a page.\r
-  \r
+  @param[in]  FormData             Form Data to be shown in Page\r
 **/\r
 VOID\r
 PrintFramework (\r
-  VOID\r
+  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
   )\r
 {\r
   UINTN                  Index;\r
   CHAR16                 Character;\r
   CHAR16                 *Buffer;\r
   UINTN                  Row;\r
+  CHAR16                 *TitleStr;\r
+  UINTN                  TitleColumn;\r
+\r
+  if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
+    //\r
+    // Only Setup page needs Framework\r
+    //\r
+    ClearLines (\r
+      gScreenDimensions.LeftColumn,\r
+      gScreenDimensions.RightColumn,\r
+      gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight,\r
+      gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1,\r
+      KEYHELP_TEXT | KEYHELP_BACKGROUND\r
+      );\r
+    return;\r
+  }\r
 \r
   Buffer = AllocateZeroPool (0x10000);\r
   ASSERT (Buffer != NULL);\r
@@ -151,123 +161,80 @@ PrintFramework (
     Buffer[Index] = Character;\r
   }\r
 \r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn,\r
-    gScreenDimensions.RightColumn,\r
-    gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight,\r
-    gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1,\r
-    KEYHELP_TEXT | KEYHELP_BACKGROUND\r
-    );\r
-\r
-  if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
-    ClearLines (\r
-      gScreenDimensions.LeftColumn,\r
-      gScreenDimensions.RightColumn,\r
-      gScreenDimensions.TopRow,\r
-      gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1,\r
-      TITLE_TEXT | TITLE_BACKGROUND\r
-      );\r
-    //\r
-    // Print Top border line\r
-    // +------------------------------------------------------------------------------+\r
-    // ?                                                                             ?\r
-    // +------------------------------------------------------------------------------+\r
-    //\r
-    Character = BOXDRAW_DOWN_RIGHT;\r
-\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_DOWN_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
-    Character = BOXDRAW_VERTICAL;\r
-    for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
-      PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
-      PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
-    }\r
-\r
-    Character = BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_UP_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
-    //\r
-    // Print Bottom border line\r
-    // +------------------------------------------------------------------------------+\r
-    // ?                                                                             ?\r
-    // +------------------------------------------------------------------------------+\r
-    //\r
-    Character = BOXDRAW_DOWN_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
-\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_DOWN_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-    Character = BOXDRAW_VERTICAL;\r
-    for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
-         Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
-         Row++\r
-        ) {\r
-      PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
-      PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
-    }\r
+  //\r
+  // Print Top border line\r
+  // +------------------------------------------------------------------------------+\r
+  // ?                                                                             ?\r
+  // +------------------------------------------------------------------------------+\r
+  //\r
+  gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
+  Character = BOXDRAW_DOWN_RIGHT;\r
 \r
-    Character = BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow, Character);\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
 \r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+  Character = BOXDRAW_DOWN_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
 \r
-    Character = BOXDRAW_UP_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  Character = BOXDRAW_VERTICAL;\r
+  for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
+    PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
+    PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
   }\r
-  \r
-  FreePool (Buffer);\r
-}\r
 \r
-/**\r
-  Print the form title.\r
+  //\r
+  // Print Form Title\r
+  //\r
+  TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
+  ASSERT (TitleStr != NULL);\r
+  TitleColumn = (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2;\r
+  PrintStringAtWithWidth (gScreenDimensions.LeftColumn + 1, gScreenDimensions.TopRow + 1, gLibEmptyString, TitleColumn - gScreenDimensions.LeftColumn - 1);\r
+  PrintStringAtWithWidth (\r
+    TitleColumn,\r
+    gScreenDimensions.TopRow + 1,\r
+    TitleStr,\r
+    gScreenDimensions.RightColumn - 1 - TitleColumn\r
+    );\r
+  FreePool (TitleStr);\r
 \r
-  @param[in]  FormData             Form Data to be shown in Page\r
+  Character = BOXDRAW_UP_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
 \r
-**/\r
-VOID\r
-PrintFormTitle (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  )\r
-{\r
-  CHAR16                 *TitleStr;\r
+  Character = BOXDRAW_UP_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
 \r
-  if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) != FORMSET_CLASS_PLATFORM_SETUP) {  \r
-    //\r
-    // Only Setup Page need Title.\r
-    //\r
-    return;\r
+  //\r
+  // Print Bottom border line\r
+  // +------------------------------------------------------------------------------+\r
+  // ?                                                                             ?\r
+  // +------------------------------------------------------------------------------+\r
+  //\r
+  Character = BOXDRAW_DOWN_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
+\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+\r
+  Character = BOXDRAW_DOWN_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  Character = BOXDRAW_VERTICAL;\r
+  for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
+       Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
+       Row++\r
+      ) {\r
+    PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
+    PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
   }\r
-  \r
-  TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
-  ASSERT (TitleStr != NULL);\r
-  \r
-  gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
 \r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn + 1,\r
-    gScreenDimensions.RightColumn - 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    gScreenDimensions.TopRow + 1,\r
-    TITLE_TEXT | TITLE_BACKGROUND\r
-    );\r
+  Character = BOXDRAW_UP_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
 \r
-  PrintStringAt (\r
-    (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
-    gScreenDimensions.TopRow + 1,\r
-    TitleStr\r
-    );\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
 \r
-  FreePool (TitleStr);\r
+  Character = BOXDRAW_UP_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+\r
+  FreePool (Buffer);\r
 }\r
 \r
 /**\r
@@ -283,8 +250,33 @@ ProcessUserOpcode(
   IN  EFI_IFR_OP_HEADER         *OpCodeData\r
   )\r
 {\r
+  EFI_GUID *   ClassGuid;\r
+  UINT8        ClassGuidNum;\r
+\r
+  ClassGuid    = NULL;\r
+  ClassGuidNum = 0;\r
+\r
   switch (OpCodeData->OpCode) {\r
-    case EFI_IFR_GUID_OP:     \r
+    case EFI_IFR_FORM_SET_OP:\r
+      //\r
+      // process the statement outside of form,if it is formset op, get its formsetguid or classguid and compared with gFrontPageFormSetGuid\r
+      //\r
+      if (CompareMem (PcdGetPtr (PcdFrontPageFormSetGuid), &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) == 0){\r
+        gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+      } else{\r
+        ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)OpCodeData)->Flags & 0x3);\r
+        ClassGuid    = (EFI_GUID *)(VOID *)((UINT8 *)OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+        while (ClassGuidNum-- > 0){\r
+          if (CompareGuid((EFI_GUID*)PcdGetPtr (PcdFrontPageFormSetGuid),ClassGuid)){\r
+            gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+            break;\r
+          }\r
+          ClassGuid ++;\r
+        }\r
+      }\r
+      break;\r
+\r
+    case EFI_IFR_GUID_OP:\r
       if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8*) OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
         // Tiano specific GUIDed opcodes\r
@@ -300,7 +292,7 @@ ProcessUserOpcode(
           //\r
           // Only in front page form set, we care about the banner data.\r
           //\r
-          if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
+          if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
             //\r
             // Initialize Driver private data\r
             //\r
@@ -308,7 +300,7 @@ ProcessUserOpcode(
               gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
               ASSERT (gBannerData != NULL);\r
             }\r
-            \r
+\r
             CopyMem (\r
               &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
               ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
@@ -337,7 +329,7 @@ ProcessUserOpcode(
 \r
 /**\r
   Process some op codes which is out side of current form.\r
-  \r
+\r
   @param FormData                Pointer to the form data.\r
 \r
   @return EFI_SUCCESS            Pass the statement success.\r
@@ -349,7 +341,9 @@ ProcessExternedOpcode (
   )\r
 {\r
   LIST_ENTRY                    *Link;\r
+  LIST_ENTRY                    *NestLink;\r
   FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+  FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;\r
 \r
   Link = GetFirstNode (&FormData->StatementListOSF);\r
   while (!IsNull (&FormData->StatementListOSF, Link)) {\r
@@ -365,6 +359,15 @@ ProcessExternedOpcode (
     Link = GetNextNode (&FormData->StatementListHead, Link);\r
 \r
     ProcessUserOpcode(Statement->OpCode);\r
+\r
+    NestLink = GetFirstNode (&Statement->NestStatementList);\r
+    while (!IsNull (&Statement->NestStatementList, NestLink)) {\r
+      NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);\r
+      NestLink = GetNextNode (&Statement->NestStatementList, NestLink);\r
+\r
+      ProcessUserOpcode(NestStatement->OpCode);\r
+    }\r
+\r
   }\r
 }\r
 \r
@@ -377,7 +380,7 @@ ProcessExternedOpcode (
   @return EFI_INVALID_PARAMETER  The input screen info is not acceptable.\r
 \r
 **/\r
-EFI_STATUS \r
+EFI_STATUS\r
 ScreenDiemensionInfoValidate (\r
   IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
   )\r
@@ -386,7 +389,7 @@ ScreenDiemensionInfoValidate (
   UINTN                Index;\r
 \r
   //\r
-  // Calculate total number of Register HotKeys. \r
+  // Calculate total number of Register HotKeys.\r
   //\r
   Index = 0;\r
   if (!IsListEmpty (&FormData->HotKeyListHead)){\r
@@ -547,70 +550,108 @@ LibGetStringWidth (
   Show all registered HotKey help strings on bottom Rows.\r
 \r
   @param FormData          The curent input form data info.\r
+  @param SetState          Set HotKey or Clear HotKey\r
 \r
 **/\r
 VOID\r
 PrintHotKeyHelpString (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
+  IN FORM_DISPLAY_ENGINE_FORM      *FormData,\r
+  IN BOOLEAN                       SetState\r
   )\r
 {\r
   UINTN                  CurrentCol;\r
   UINTN                  CurrentRow;\r
   UINTN                  BottomRowOfHotKeyHelp;\r
+  UINTN                  ColumnIndexWidth;\r
   UINTN                  ColumnWidth;\r
+  UINTN                  ColumnIndex;\r
   UINTN                  Index;\r
   EFI_SCREEN_DESCRIPTOR  LocalScreen;\r
   LIST_ENTRY             *Link;\r
   BROWSER_HOT_KEY        *HotKey;\r
-\r
-  if (IsListEmpty (&FormData->HotKeyListHead)) {\r
-    return;\r
-  }\r
+  CHAR16                 BakChar;\r
+  CHAR16                 *ColumnStr;\r
 \r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
   ColumnWidth            = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
   BottomRowOfHotKeyHelp  = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
+  ColumnStr              = gLibEmptyString;\r
 \r
   //\r
-  // Calculate total number of Register HotKeys. \r
+  // Calculate total number of Register HotKeys.\r
   //\r
   Index = 0;\r
   Link  = GetFirstNode (&FormData->HotKeyListHead);\r
   while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
     HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
     //\r
-    // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
-    //\r
-    if (StrLen (HotKey->HelpString) > ColumnWidth) {\r
-      HotKey->HelpString[ColumnWidth] = L'\0';\r
-    }\r
-    //\r
     // Calculate help information Column and Row.\r
     //\r
-    if ((Index % 3) != 2) {\r
-      CurrentCol = LocalScreen.LeftColumn + (2 - Index % 3) * ColumnWidth;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+    } else if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
     } else {\r
-      CurrentCol = LocalScreen.LeftColumn + 2;\r
+      CurrentCol       = LocalScreen.LeftColumn + 2;\r
+      ColumnIndexWidth = ColumnWidth - 2;\r
     }\r
     CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
+\r
+    //\r
+    // Help string can't exceed ColumnWidth. One Row will show three Help information.\r
+    //\r
+    BakChar = L'\0';\r
+    if (StrLen (HotKey->HelpString) > ColumnIndexWidth) {\r
+      BakChar = HotKey->HelpString[ColumnIndexWidth];\r
+      HotKey->HelpString[ColumnIndexWidth] = L'\0';\r
+    }\r
+\r
     //\r
     // Print HotKey help string on bottom Row.\r
     //\r
-    PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
+    if (SetState) {\r
+      ColumnStr = HotKey->HelpString;\r
+    }\r
+    PrintStringAtWithWidth (CurrentCol, CurrentRow, ColumnStr, ColumnIndexWidth);\r
 \r
+    if (BakChar != L'\0') {\r
+      HotKey->HelpString[ColumnIndexWidth] = BakChar;\r
+    }\r
     //\r
     // Get Next Hot Key.\r
     //\r
     Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
     Index ++;\r
   }\r
-  \r
+\r
+  if (SetState) {\r
+    //\r
+    // Clear KeyHelp\r
+    //\r
+    CurrentRow  = BottomRowOfHotKeyHelp - Index / 3;\r
+    ColumnIndex = Index % 3;\r
+    if (ColumnIndex == 0) {\r
+      CurrentCol       = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth - 1;\r
+      ColumnIndex ++;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
+    if (ColumnIndex == 1) {\r
+      CurrentCol       = LocalScreen.LeftColumn + ColumnWidth;\r
+      ColumnIndexWidth = ColumnWidth;\r
+      PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+    }\r
+  }\r
+\r
   return;\r
 }\r
 \r
 /**\r
   Get step info from numeric opcode.\r
-  \r
+\r
   @param[in] OpCode     The input numeric op code.\r
 \r
   @return step info for this opcode.\r
@@ -624,24 +665,24 @@ LibGetFieldFromNum (
   UINT64                Step;\r
 \r
   NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
-  \r
+\r
   switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
   case EFI_IFR_NUMERIC_SIZE_1:\r
     Step    = NumericOp->data.u8.Step;\r
     break;\r
-  \r
+\r
   case EFI_IFR_NUMERIC_SIZE_2:\r
     Step    = NumericOp->data.u16.Step;\r
     break;\r
-  \r
+\r
   case EFI_IFR_NUMERIC_SIZE_4:\r
     Step    = NumericOp->data.u32.Step;\r
     break;\r
-  \r
+\r
   case EFI_IFR_NUMERIC_SIZE_8:\r
     Step    = NumericOp->data.u64.Step;\r
     break;\r
-  \r
+\r
   default:\r
     Step = 0;\r
     break;\r
@@ -682,7 +723,7 @@ InitializeLibStrings (
 \r
   gNvUpdateMessage      = LibGetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), mCDLStringPackHandle);\r
   gInputErrorMessage    = LibGetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), mCDLStringPackHandle);\r
-  \r
+\r
   //\r
   // SpaceBuffer;\r
   //\r
@@ -723,7 +764,7 @@ FreeLibStrings (
 \r
   FreePool (gNvUpdateMessage);\r
   FreePool (gInputErrorMessage);\r
-  \r
+\r
   FreePool (mSpaceBuffer);\r
 }\r
 \r
@@ -752,7 +793,7 @@ WaitForKeyStroke (
     if (Status != EFI_NOT_READY) {\r
       continue;\r
     }\r
-    \r
+\r
     gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index);\r
   }\r
   return Status;\r
@@ -798,7 +839,7 @@ LibSetUnicodeMem (
 **/\r
 UINTN\r
 PrintInternal (\r
-  IN UINTN                            Width, \r
+  IN UINTN                            Width,\r
   IN UINTN                            Column,\r
   IN UINTN                            Row,\r
   IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,\r
@@ -811,6 +852,7 @@ PrintInternal (
   UINTN   Index;\r
   UINTN   PreviousIndex;\r
   UINTN   Count;\r
+  UINTN   TotalCount;\r
   UINTN   PrintWidth;\r
   UINTN   CharWidth;\r
 \r
@@ -835,6 +877,7 @@ PrintInternal (
   Index         = 0;\r
   PreviousIndex = 0;\r
   Count         = 0;\r
+  TotalCount    = 0;\r
   PrintWidth    = 0;\r
   CharWidth     = 1;\r
 \r
@@ -846,17 +889,14 @@ PrintInternal (
     if (Buffer[Index] == 0) {\r
       break;\r
     }\r
-    //\r
-    // Null-terminate the temporary string\r
-    //\r
-    BackupBuffer[Index] = 0;\r
 \r
     //\r
     // Print this out, we are about to switch widths\r
     //\r
     Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-    Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+    Count = StrLen (&BackupBuffer[PreviousIndex]);\r
     PrintWidth += Count * CharWidth;\r
+    TotalCount += Count;\r
 \r
     //\r
     // Preserve the current index + 1, since this is where we will start printing from next\r
@@ -890,8 +930,9 @@ PrintInternal (
   // We hit the end of the string - print it\r
   //\r
   Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+  Count = StrLen (&BackupBuffer[PreviousIndex]);\r
   PrintWidth += Count * CharWidth;\r
+  TotalCount += Count;\r
   if (PrintWidth < Width) {\r
     Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
     Out->SetAttribute (Out, Out->Mode->Attribute);\r
@@ -900,7 +941,7 @@ PrintInternal (
 \r
   FreePool (Buffer);\r
   FreePool (BackupBuffer);\r
-  return Count;\r
+  return TotalCount;\r
 }\r
 \r
 /**\r