]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix form flash issue.
authorEric Dong <eric.dong@intel.com>
Fri, 27 Sep 2013 12:19:51 +0000 (12:19 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 27 Sep 2013 12:19:51 +0000 (12:19 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14735 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.h
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c

index aa28146b0255405b8c846870e7d0fd53c4e824d2..4328761642609556a1d7844c5a2a58c5e3fd1583 100644 (file)
@@ -144,6 +144,12 @@ RefreshKeyHelp (
   EFI_IFR_DATE           *DateOp;\r
   EFI_IFR_TIME           *TimeOp;\r
   BOOLEAN                HexDisplay;\r
+  UINTN                  ColumnWidth1;\r
+  UINTN                  ColumnWidth2;\r
+  UINTN                  ColumnWidth3;\r
+  CHAR16                 *ColumnStr1;\r
+  CHAR16                 *ColumnStr2;\r
+  CHAR16                 *ColumnStr3;\r
 \r
   ASSERT (FormData != NULL);\r
   if (FormData == NULL) {\r
@@ -161,17 +167,27 @@ RefreshKeyHelp (
 \r
   StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
   LeftColumnOfHelp  = gScreenDimensions.LeftColumn + 1;\r
-  RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\r
+  RightColumnOfHelp = gScreenDimensions.RightColumn - 1;\r
   TopRowOfHelp      = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
   BottomRowOfHelp   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
 \r
-  ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
+  ColumnWidth1      = SecCol - StartColumnOfHelp;\r
+  ColumnWidth2      = ThdCol - SecCol;\r
+  ColumnWidth3      = RightColumnOfHelp - ThdCol;\r
+  ColumnStr1        = gLibEmptyString;\r
+  ColumnStr2        = gLibEmptyString;\r
+  ColumnStr3        = gLibEmptyString;\r
+\r
   if (Statement == NULL) {\r
     //\r
     // Print Key for Form without showable statement.\r
     //\r
-    PrintHotKeyHelpString (FormData);\r
-    PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEscapeString, ColumnWidth3);\r
+\r
     return;\r
   }\r
 \r
@@ -196,16 +212,17 @@ RefreshKeyHelp (
   case EFI_IFR_TIME_OP:\r
   case EFI_IFR_DATE_OP:\r
     if (!Selected) {\r
-        PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
       if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
         PrintAt (\r
-          0\r
+          ColumnWidth1\r
           StartColumnOfHelp,\r
           BottomRowOfHelp,\r
           L"%c%c%c%c%s",\r
@@ -215,17 +232,19 @@ RefreshKeyHelp (
           ARROW_LEFT,\r
           gMoveHighlight\r
           );\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1);\r
       } else {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
         if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {\r
-          PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
-        } \r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+          ColumnStr1 = gAdjustNumber;\r
+        }\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
       }\r
     } else {\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2);\r
 \r
       //\r
       // If it is a selected numeric with manual input, display different message\r
@@ -233,33 +252,35 @@ RefreshKeyHelp (
       if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || \r
           (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        PrintStringAt (\r
-          SecCol,\r
-          TopRowOfHelp,\r
-          HexDisplay ? gHexNumericInput : gDecNumericInput\r
-          );\r
-      } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput;\r
+        PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+      } else {\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       }\r
 \r
       if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
+        ColumnStr1 = gPlusString;\r
+        ColumnStr3 = gMinusString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3);\r
+      PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2);\r
 \r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3);\r
     }\r
     break;\r
 \r
   case EFI_IFR_CHECKBOX_OP:\r
-    PrintHotKeyHelpString (FormData);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
 \r
     if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+      ColumnStr3 = gEscapeString;\r
     }\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-    PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
+    PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
     break;\r
 \r
   case EFI_IFR_REF_OP:\r
@@ -270,25 +291,29 @@ RefreshKeyHelp (
   case EFI_IFR_RESET_BUTTON_OP:\r
   case EFI_IFR_SUBTITLE_OP:\r
      if (!Selected) {\r
-      PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-      PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+      PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+        ColumnStr2 = gEnterString;\r
       }\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
     } else {\r
-      if (Statement->OpCode->OpCode  != EFI_IFR_REF_OP) {\r
-        PrintStringAt (\r
-          (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2,\r
-          BottomRowOfHelp,\r
-          gEnterCommitString\r
-          );\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
+        ColumnStr2 = gEnterCommitString;\r
+        ColumnStr3 = gEnterEscapeString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
     }\r
     break;\r
 \r
index ade45b6a51b6ee32e5687df203d3c70d92e7ccce..841e0131857def0000b6b7a47bbd91a5e659f39b 100644 (file)
@@ -1,27 +1,16 @@
-##\r
-#  This file contains an 'Intel Peripheral Driver' and is        \r
-#  licensed for Intel CPUs and chipsets under the terms of your  \r
-#  license agreement with Intel or your vendor.  This file may   \r
-#  be modified by the user, subject to additional terms of the   \r
-#  license agreement                                             \r
-##\r
 ## @file\r
-#  \r
-#  General BDS defines and produce general interfaces for platform BDS driver including:\r
-#  1) BDS boot policy interface;\r
-#  2) BDS boot device connect interface;\r
-#  3) BDS Misc interfaces for mainting boot variable, ouput string, etc.\r
-#  \r
-#  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
-#  This software and associated documentation (if any) is furnished\r
-#  under a license and may only be used or copied in accordance\r
-#  with the terms of the license. Except as permitted by such\r
-#  license, no part of this software or documentation may be\r
-#  reproduced, stored in a retrieval system, or transmitted in any\r
-#  form or by any means without the express written consent of\r
-#  Intel Corporation.\r
-#  \r
-##\r
+# Customize display library used by display engine.\r
+#\r
+#  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\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
+#\r
+#\r
 \r
 [Defines]\r
   INF_VERSION                    = 0x00010005\r
index b6b4055b6d260ca2e584cf81454e4f10a627c890..82ab82bb34ef33361765c6140d879d788e8e05af 100644 (file)
@@ -144,6 +144,7 @@ PrintFramework (
   CHAR16                 *Buffer;\r
   UINTN                  Row;\r
   CHAR16                 *TitleStr;\r
+  UINTN                  TitleColumn;\r
 \r
   if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
     //\r
@@ -190,20 +191,15 @@ PrintFramework (
   //\r
   // Print Form Title\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
-\r
   TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
   ASSERT (TitleStr != NULL);\r
-  PrintStringAt (\r
-    (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\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
+    TitleStr,\r
+    gScreenDimensions.RightColumn - 1 - TitleColumn\r
     );\r
   FreePool (TitleStr);\r
 \r
@@ -524,29 +520,32 @@ 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
@@ -556,25 +555,41 @@ PrintHotKeyHelpString (
   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
@@ -582,6 +597,25 @@ PrintHotKeyHelpString (
     Index ++;\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
@@ -788,6 +822,7 @@ PrintInternal (
   UINTN   Index;\r
   UINTN   PreviousIndex;\r
   UINTN   Count;\r
+  UINTN   TotalCount;\r
   UINTN   PrintWidth;\r
   UINTN   CharWidth;\r
 \r
@@ -812,6 +847,7 @@ PrintInternal (
   Index         = 0;\r
   PreviousIndex = 0;\r
   Count         = 0;\r
+  TotalCount    = 0;\r
   PrintWidth    = 0;\r
   CharWidth     = 1;\r
 \r
@@ -823,17 +859,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
@@ -867,8 +900,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
@@ -877,7 +911,7 @@ PrintInternal (
 \r
   FreePool (Buffer);\r
   FreePool (BackupBuffer);\r
-  return Count;\r
+  return TotalCount;\r
 }\r
 \r
 /**\r
index ccbd45f4259440b9f58612425bf99fb78bcefc04..7342b508b06e39b6c2598b5cc37944ce494dfc8c 100644 (file)
@@ -193,11 +193,13 @@ 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
 /**\r
index a07cc75a47c2c44755a268bf5119d0f1cf9695c4..8e5b890bf359dfed1e5328253735dc3ae2b480b1 100644 (file)
@@ -130,6 +130,7 @@ CHAR16            *gOptionMismatch;
 CHAR16            *gFormSuppress;\r
 CHAR16            *gProtocolNotFound;\r
 \r
+CHAR16            gModalSkipColumn;\r
 CHAR16            gPromptBlockWidth;\r
 CHAR16            gOptionBlockWidth;\r
 CHAR16            gHelpBlockWidth;\r
@@ -259,20 +260,28 @@ GetPrompt (
   Get the supported width for a particular op-code\r
 \r
   @param  Statement              The curent statement.\r
+  @param  AdjustWidth            The width which is saved for the space.\r
 \r
   @return Returns the number of CHAR16 characters that is support.\r
 \r
 **/\r
 UINT16\r
 GetWidth (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT        *Statement\r
+  IN FORM_DISPLAY_ENGINE_STATEMENT        *Statement,\r
+  OUT UINT16                              *AdjustWidth\r
   )\r
 {\r
   CHAR16       *String;\r
   UINTN        Size;\r
-  UINT16       Width;\r
   EFI_IFR_TEXT *TestOp;\r
 \r
+  //\r
+  // For modal form, clean the entire row.\r
+  //\r
+  if ((gFormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
+    return (UINT16)(gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - gModalSkipColumn - SCROLL_ARROW_HEIGHT);\r
+  }\r
+\r
   Size = 0;\r
 \r
   //\r
@@ -297,12 +306,23 @@ GetWidth (
       //\r
       ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0))\r
       ) {\r
-    Width = (UINT16) (gPromptBlockWidth + gOptionBlockWidth);\r
-  } else {\r
-    Width = (UINT16) gPromptBlockWidth;\r
+    \r
+    //\r
+    // Return the space width.\r
+    // \r
+    if (AdjustWidth != NULL) {\r
+      *AdjustWidth = 2;\r
+    }\r
+    //\r
+    // Keep consistent with current behavior.\r
+    //\r
+    return (UINT16) (gPromptBlockWidth + gOptionBlockWidth - 2);\r
   }\r
 \r
-  return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
+  if (AdjustWidth != NULL) {\r
+    *AdjustWidth = 1;\r
+  }\r
+  return (UINT16) (gPromptBlockWidth - 1);\r
 }\r
 \r
 /**\r
@@ -516,7 +536,7 @@ UiAddMenuOption (
   String = GetToken (PromptId, gFormData->HiiHandle);\r
   ASSERT (String != NULL);\r
 \r
-  Width  = GetWidth (Statement);\r
+  Width  = GetWidth (Statement, NULL);\r
   for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {\r
     //\r
     // If there is more string to process print on the next row and increment the Skip value\r
@@ -1437,6 +1457,379 @@ FindTopMenu (
   }\r
 }\r
 \r
+/**\r
+  Update highlight menu info.\r
+\r
+  @param  MenuOption               The menu opton which is highlight.\r
+\r
+**/\r
+VOID\r
+UpdateHighlightMenuInfo (\r
+  IN UI_MENU_OPTION            *MenuOption\r
+  )\r
+{\r
+  FORM_DISPLAY_ENGINE_STATEMENT   *Statement;\r
+\r
+  //\r
+  // This is the current selected statement\r
+  //\r
+  Statement = MenuOption->ThisTag;\r
+\r
+  //\r
+  // Get the highlight statement.\r
+  //\r
+  gUserInput->SelectedStatement = Statement;\r
+  gSequence = (UINT16) MenuOption->Sequence;\r
+\r
+  //\r
+  // Record highlight row info for date/time opcode.\r
+  //\r
+  if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+    gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
+    gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
+  } else {\r
+    gHighligthMenuInfo.QuestionId = 0;\r
+    gHighligthMenuInfo.DisplayRow = 0;\r
+  }\r
+\r
+  RefreshKeyHelp(gFormData, Statement, FALSE);\r
+}\r
+\r
+/**\r
+  Update attribut for this menu.\r
+\r
+  @param  MenuOption               The menu opton which this attribut used to.\r
+  @param  Highlight                Whether this menu will be highlight.\r
+\r
+**/\r
+VOID\r
+SetDisplayAttribute (\r
+  IN UI_MENU_OPTION                  *MenuOption,\r
+  IN BOOLEAN                         Highlight\r
+  )\r
+{\r
+  FORM_DISPLAY_ENGINE_STATEMENT   *Statement;\r
+  \r
+  Statement = MenuOption->ThisTag;\r
+\r
+  if (Highlight) {\r
+    gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
+    return;\r
+  }\r
+\r
+  if (MenuOption->GrayOut) {\r
+    gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
+  } else {\r
+    if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
+      gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
+    } else {\r
+      gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  Print string for this menu option.\r
+\r
+  @param  MenuOption               The menu opton which this attribut used to.\r
+  @param  Col                      The column that this string will be print at.\r
+  @param  Row                      The row that this string will be print at.\r
+  @param  String                   The string which need to print.\r
+  @param  Width                    The width need to print, if string is less than the\r
+                                   width, the block space will be used.\r
+  @param  Highlight                Whether this menu will be highlight.\r
+\r
+**/\r
+VOID\r
+DisplayMenuString (\r
+  IN UI_MENU_OPTION         *MenuOption,\r
+  IN UINTN                  Col,\r
+  IN UINTN                  Row,\r
+  IN CHAR16                 *String,\r
+  IN UINTN                  Width,\r
+  IN BOOLEAN                Highlight\r
+  )\r
+{\r
+  UINTN            Length;\r
+\r
+  //\r
+  // Print string with normal color.\r
+  //\r
+  if (!Highlight) {\r
+    PrintStringAtWithWidth (Col, Row, String, Width);\r
+    return;\r
+  }\r
+  \r
+  //\r
+  // Print the highlight menu string.\r
+  // First print the highlight string.\r
+  // \r
+  SetDisplayAttribute(MenuOption, TRUE);\r
+  Length = PrintStringAt (Col, Row, String);\r
+\r
+  //\r
+  // Second, clean the empty after the string.\r
+  //\r
+  SetDisplayAttribute(MenuOption, FALSE);\r
+  PrintStringAtWithWidth (Col + Length, Row, L"", Width - Length);\r
+}\r
+\r
+/**\r
+  Print string for this menu option.\r
+\r
+  @param  MenuOption               The menu opton which this attribut used to.\r
+  @param  SkipWidth                The skip width between the left to the start of the prompt.\r
+  @param  BeginCol                 The begin column for one menu.\r
+  @param  SkipLine                 The skip line for this menu. \r
+  @param  BottomRow                The bottom row for this form.\r
+  @param  Highlight                Whether this menu will be highlight.\r
+\r
+  @retval EFI_SUCESSS              Process the user selection success.\r
+\r
+**/\r
+EFI_STATUS\r
+DisplayOneMenu (\r
+  IN UI_MENU_OPTION                  *MenuOption,\r
+  IN UINTN                           SkipWidth,\r
+  IN UINTN                           BeginCol,\r
+  IN UINTN                           SkipLine,\r
+  IN UINTN                           BottomRow,\r
+  IN BOOLEAN                         Highlight\r
+  )\r
+{\r
+  FORM_DISPLAY_ENGINE_STATEMENT   *Statement;\r
+  UINTN                           Index;\r
+  UINT16                          Width;\r
+  UINT16                          PromptWidth;\r
+  CHAR16                          *StringPtr;\r
+  CHAR16                          *OptionString;\r
+  CHAR16                          *OutputString;\r
+  UINTN                           OriginalRow;\r
+  UINT16                          GlyphWidth;\r
+  UINTN                           Temp;\r
+  UINTN                           Temp2;\r
+  UINTN                           Temp3;\r
+  EFI_STATUS                      Status;\r
+  UINTN                           Row;\r
+  UINTN                           Col;\r
+  UINTN                           PromptLineNum;\r
+  CHAR16                          AdjustValue;\r
+\r
+  Statement = MenuOption->ThisTag;\r
+  Col       = MenuOption->Col;\r
+  Row       = MenuOption->Row;\r
+  Temp      = SkipLine;\r
+  Temp2     = SkipLine;\r
+  Temp3     = SkipLine;\r
+  AdjustValue = 0;\r
+\r
+  //\r
+  // Set default color.\r
+  //\r
+  SetDisplayAttribute (MenuOption, FALSE);\r
+\r
+  //\r
+  // 1. Paint the option string.\r
+  //\r
+  Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (OptionString != NULL) {\r
+    if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+      //\r
+      // Adjust option string for date/time opcode.\r
+      //\r
+      ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
+    }\r
+  \r
+    Width       = (UINT16) gOptionBlockWidth - 1;\r
+    OriginalRow = Row;\r
+    GlyphWidth  = 1;\r
+  \r
+    for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
+      if (((Temp2 == 0)) && (Row <= BottomRow)) {\r
+        if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+          //\r
+          // For date/time question, it has three menu options for this qustion.\r
+          // The first/second menu options with the skip value is 0. the last one\r
+          // with skip value is 1.\r
+          //\r
+          if (MenuOption->Skip != 0) {\r
+            //\r
+            // For date/ time, print the last past (year for date and second for time)\r
+            // - 7 means skip [##/##/ for date and [##:##: for time.\r
+            //\r
+            DisplayMenuString (MenuOption,MenuOption->OptCol, Row, OutputString, Width + 1 - 7, Highlight);\r
+          } else {\r
+            //\r
+            // For date/ time, print the first and second past (year for date and second for time)\r
+            //                \r
+            DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, StrLen (OutputString), Highlight);\r
+          }\r
+        } else {\r
+          DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight);\r
+        }\r
+      }\r
+      \r
+      //\r
+      // If there is more string to process print on the next row and increment the Skip value\r
+      //\r
+      if (StrLen (&OptionString[Index]) != 0) {\r
+        if (Temp2 == 0) {\r
+          Row++;\r
+          //\r
+          // Since the Number of lines for this menu entry may or may not be reflected accurately\r
+          // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
+          // some testing to ensure we are keeping this in-sync.\r
+          //\r
+          // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
+          //\r
+          if ((Row - OriginalRow) >= MenuOption->Skip) {\r
+            MenuOption->Skip++;\r
+          }\r
+        }\r
+      }\r
+  \r
+      FreePool (OutputString);\r
+      if (Temp2 != 0) {\r
+        Temp2--;\r
+      }\r
+    }\r
+  \r
+    Row   = OriginalRow;\r
+    Highlight = FALSE;\r
+\r
+    FreePool (OptionString);\r
+  }\r
+  Temp2 = 0;\r
+\r
+\r
+  //\r
+  // 2. Pre calculate the skip value.\r
+  //\r
+  if ((Statement->OpCode->OpCode  == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
+    StringPtr   = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
+  \r
+    Width       = (UINT16) gOptionBlockWidth - 1;\r
+    OriginalRow = Row;\r
+    GlyphWidth    = 1;\r
+    for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { \r
+      if (StrLen (&StringPtr[Index]) != 0) {\r
+        Row++;\r
+        if ((Row - OriginalRow) >= MenuOption->Skip) {\r
+          MenuOption->Skip++;\r
+        }\r
+      }\r
+      FreePool (OutputString);\r
+    }\r
+  \r
+    Row = OriginalRow;\r
+    FreePool (StringPtr);\r
+  }\r
+\r
+\r
+  //\r
+  // 3. Paint the description.\r
+  //\r
+  PromptWidth   = GetWidth (Statement, &AdjustValue);\r
+  OriginalRow   = Row;\r
+  GlyphWidth    = 1;\r
+  PromptLineNum = 0;\r
+\r
+  if (MenuOption->Description == NULL || MenuOption->Description[0] == '\0') {\r
+    while (Temp++ < MenuOption->Skip) {\r
+      PrintStringAtWithWidth (BeginCol, Row++, L"", PromptWidth + AdjustValue + SkipWidth);\r
+    } \r
+  } else {\r
+    for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth, &GlyphWidth, &Index, &OutputString) != 0x0000;) {      \r
+      if ((Temp == 0) && (Row <= BottomRow)) { \r
+        //\r
+        // 1.Clean the start LEFT_SKIPPED_COLUMNS \r
+        //\r
+        PrintStringAtWithWidth (BeginCol, Row, L"", SkipWidth);\r
+        \r
+        if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
+          //\r
+          // Print Arrow for Goto button.\r
+          //\r
+          PrintCharAt (\r
+            MenuOption->Col - 2,\r
+            Row,\r
+            GEOMETRICSHAPE_RIGHT_TRIANGLE\r
+            );\r
+        }\r
+        DisplayMenuString (MenuOption, MenuOption->Col, Row, OutputString, PromptWidth + AdjustValue, Highlight);\r
+        PromptLineNum ++;\r
+      }\r
+      //\r
+      // If there is more string to process print on the next row and increment the Skip value\r
+      //\r
+      if (StrLen (&MenuOption->Description[Index]) != 0) {\r
+        if (Temp == 0) {\r
+          Row++;\r
+        }\r
+      }\r
+\r
+      FreePool (OutputString);\r
+      if (Temp != 0) {\r
+        Temp--;\r
+      }\r
+    }\r
+\r
+    Highlight = FALSE;\r
+\r
+    //\r
+    // Clean the empty prompt line.\r
+    // These line is used by option string but not prompt, so clean them here.\r
+    //\r
+    Row = OriginalRow + PromptLineNum;\r
+    while (PromptLineNum + SkipLine < MenuOption->Skip && Row <= BottomRow) {\r
+      PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue + SkipWidth);\r
+      PromptLineNum ++;\r
+      Row ++;\r
+    }\r
+  }\r
+  Row = OriginalRow;\r
+\r
+\r
+  //\r
+  // 4. If this is a text op with secondary text information\r
+  //\r
+  if ((Statement->OpCode->OpCode  == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
+    StringPtr   = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
+  \r
+    Width       = (UINT16) gOptionBlockWidth - 1;\r
+    OriginalRow = Row;\r
+    GlyphWidth  = 1;\r
+\r
+    for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { \r
+      if ((Temp3 == 0) && (Row <= BottomRow)) {\r
+        DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight);\r
+      }\r
+      //\r
+      // If there is more string to process print on the next row and increment the Skip value\r
+      //\r
+      if (StrLen (&StringPtr[Index]) != 0) {\r
+        if (Temp3 == 0) {\r
+          Row++;\r
+        }\r
+      }\r
+  \r
+      FreePool (OutputString);\r
+      if (Temp3 != 0) {\r
+        Temp3--;\r
+      }\r
+    }\r
+  \r
+    Row = OriginalRow;\r
+    FreePool (StringPtr);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Display menu and wait for user to select one menu option, then return it.\r
   If AutoBoot is enabled, then if user doesn't select any option,\r
@@ -1458,10 +1851,8 @@ UiDisplayMenu (
   UINTN                           DistanceValue;\r
   UINTN                           Row;\r
   UINTN                           Col;\r
-  UINTN                           TempRightCol;\r
   UINTN                           Temp;\r
   UINTN                           Temp2;\r
-  UINTN                           Temp3;\r
   UINTN                           TopRow;\r
   UINTN                           BottomRow;\r
   UINTN                           OriginalRow;\r
@@ -1491,7 +1882,6 @@ UiDisplayMenu (
   UI_SCREEN_OPERATION             ScreenOperation;\r
   UINT16                          DefaultId;\r
   FORM_DISPLAY_ENGINE_STATEMENT   *Statement;\r
-  UINTN                           ModalSkipColumn;\r
   BROWSER_HOT_KEY                 *HotKey;\r
   UINTN                           HelpPageIndex;\r
   UINTN                           HelpPageCount;\r
@@ -1507,6 +1897,7 @@ UiDisplayMenu (
   EFI_STRING_ID                   HelpInfo;\r
   UI_EVENT_TYPE                   EventType;\r
   FORM_DISPLAY_ENGINE_STATEMENT   *InitialHighlight;\r
+  BOOLEAN                         SkipHighLight;\r
 \r
   EventType           = UIEventNone;\r
   Status              = EFI_SUCCESS;\r
@@ -1531,6 +1922,7 @@ UiDisplayMenu (
   UpArrow             = FALSE;\r
   DownArrow           = FALSE;\r
   SkipValue           = 0;\r
+  SkipHighLight       = FALSE;\r
 \r
   NextMenuOption      = NULL;\r
   PreviousMenuOption  = NULL;\r
@@ -1538,21 +1930,27 @@ UiDisplayMenu (
   HotKey              = NULL;\r
   Repaint             = TRUE;\r
   MenuOption          = NULL;\r
-  ModalSkipColumn     = (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
+  gModalSkipColumn    = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
   InitialHighlight    = gFormData->HighLightedStatement;\r
 \r
   ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
 \r
-  gOptionBlockWidth = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
-  gPromptBlockWidth = (CHAR16) (gOptionBlockWidth + LEFT_SKIPPED_COLUMNS);\r
-  gHelpBlockWidth   = (CHAR16) (gOptionBlockWidth - LEFT_SKIPPED_COLUMNS);\r
+  //\r
+  //  Left                                              right\r
+  //   |<-.->|<-.........->|<- .........->|<-...........->|\r
+  //     Skip    Prompt         Option         Help \r
+  //\r
+  Width             = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
+  gOptionBlockWidth = Width + 1; \r
+  gHelpBlockWidth   = (CHAR16) (Width - LEFT_SKIPPED_COLUMNS);\r
+  gPromptBlockWidth = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * Width - 1);\r
 \r
   TopRow    = gStatementDimensions.TopRow    + SCROLL_ARROW_HEIGHT;\r
   BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT - 1;\r
 \r
   Row = TopRow;\r
   if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-    Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;\r
+    Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gModalSkipColumn;\r
   } else {\r
     Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS;\r
   }\r
@@ -1565,30 +1963,21 @@ UiDisplayMenu (
   while (TRUE) {\r
     switch (ControlFlag) {\r
     case CfInitialization:\r
-      if (IsListEmpty (&gMenuOption)) {\r
-        \r
-        if ((FormData->Attribute & HII_DISPLAY_MODAL) == 0) {\r
-          //\r
-          // Clear Statement range.\r
-          //\r
-          ClearLines (\r
-            gStatementDimensions.LeftColumn,\r
-            gStatementDimensions.RightColumn,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            GetFieldTextColor ()\r
-            );\r
-            \r
-          //\r
-          // Clear Key Range\r
-          //\r
-          RefreshKeyHelp (gFormData, NULL, FALSE);\r
-        }\r
+      if ((gOldFormEntry.HiiHandle != FormData->HiiHandle) || \r
+          (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))) {\r
+        //\r
+        // Clear Statement range if different formset is painted.\r
+        //\r
+        ClearLines (\r
+          gStatementDimensions.LeftColumn,\r
+          gStatementDimensions.RightColumn,\r
+          TopRow - SCROLL_ARROW_HEIGHT,\r
+          BottomRow + SCROLL_ARROW_HEIGHT,\r
+          GetFieldTextColor ()\r
+          );\r
 \r
-        ControlFlag = CfReadKey;\r
-      } else {\r
-        ControlFlag = CfRepaint;\r
       }\r
+      ControlFlag = CfRepaint;\r
       break;\r
 \r
     case CfRepaint:\r
@@ -1602,47 +1991,25 @@ UiDisplayMenu (
         UpArrow         = FALSE;\r
         Row             = TopRow;\r
 \r
-        Temp            = (UINTN) SkipValue;\r
-        Temp2           = (UINTN) SkipValue;\r
-        Temp3           = (UINTN) SkipValue;\r
-\r
+        gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+        \r
         //\r
-        // 1. Clear the screen.\r
+        // 1. Check whether need to print the arrow up.\r
         //\r
-        if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-          ClearLines (\r
-            gStatementDimensions.LeftColumn + ModalSkipColumn,\r
-            gStatementDimensions.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            GetFieldTextColor ()\r
-            );\r
-        } else {\r
-          TempRightCol = gStatementDimensions.RightColumn;\r
-          if (!mStatementLayoutIsChanged) {\r
-            TempRightCol = gStatementDimensions.RightColumn - gHelpBlockWidth;\r
-          }\r
-          ClearLines (\r
-            gStatementDimensions.LeftColumn,\r
-            gStatementDimensions.RightColumn,\r
+        if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
+          UpArrow = TRUE;\r
+        }\r
+        \r
+        PrintStringAtWithWidth(gStatementDimensions.LeftColumn, TopRow - 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+\r
+        if (UpArrow) {\r
+          gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
+          PrintCharAt (\r
+            gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
             TopRow - SCROLL_ARROW_HEIGHT,\r
-            TopRow - 1,\r
-            GetFieldTextColor ()\r
-            );\r
-          ClearLines (\r
-            gStatementDimensions.LeftColumn,\r
-            TempRightCol,\r
-            TopRow,\r
-            BottomRow,\r
-            GetFieldTextColor ()\r
-            );\r
-          ClearLines (\r
-            gStatementDimensions.LeftColumn,\r
-            gStatementDimensions.RightColumn,\r
-            BottomRow + 1,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            GetFieldTextColor ()\r
+            ARROW_UP\r
             );\r
+          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
         }\r
 \r
         //\r
@@ -1653,168 +2020,30 @@ UiDisplayMenu (
           MenuOption->Row     = Row;\r
           MenuOption->Col     = Col;\r
           if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn + ModalSkipColumn;\r
+            MenuOption->OptCol  = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth + gModalSkipColumn;\r
           } else {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn;\r
+            MenuOption->OptCol  = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth;\r
           }\r
 \r
-          Statement = MenuOption->ThisTag;\r
           if (MenuOption->NestInStatement) {\r
             MenuOption->Col += SUBTITLE_INDENT;\r
           }\r
 \r
-          if (MenuOption->GrayOut) {\r
-            gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
-          } else {\r
-            if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
-              gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
-            }\r
-          }\r
-\r
-          Width       = GetWidth (Statement);\r
-          OriginalRow = Row;\r
-          GlyphWidth  = 1;\r
-\r
-          if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
-            //\r
-            // Print Arrow for Goto button.\r
-            //\r
-            PrintCharAt (\r
-              MenuOption->Col - 2,\r
-              Row,\r
-              GEOMETRICSHAPE_RIGHT_TRIANGLE\r
-              );\r
-          }\r
-\r
-          //\r
-          // 2.1. Paint the description.\r
-          //\r
-          for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-            //\r
-            // Temp means need to skip how many lines from the start.\r
-            //\r
-            if ((Temp == 0) && (Row <= BottomRow)) {\r
-              PrintStringAt (MenuOption->Col, Row, OutputString);\r
-            }\r
-            //\r
-            // If there is more string to process print on the next row and increment the Skip value\r
-            //\r
-            if (StrLen (&MenuOption->Description[Index]) != 0) {\r
-              if (Temp == 0) {\r
-                Row++;\r
-              }\r
-            }\r
-\r
-            FreePool (OutputString);\r
-            if (Temp != 0) {\r
-              Temp--;\r
-            }\r
-          }\r
-\r
-          Temp  = 0;\r
-          Row   = OriginalRow;\r
-\r
-          //\r
-          // 2.2. Paint the option string.\r
-          //\r
-          Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE);\r
-          //\r
-          // If Error occur, question value update in ProcessOptions.\r
-          // Exit current FormDisplay with new question value.\r
-          //\r
-          if (EFI_ERROR (Status)) {\r
-            return Status;\r
-          }\r
-\r
-          if (OptionString != NULL) {\r
-            if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-              ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
-            }\r
-\r
-            Width       = (UINT16) gOptionBlockWidth;\r
-            OriginalRow = Row;\r
-            GlyphWidth  = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp2 == 0) && (Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&OptionString[Index]) != 0) {\r
-                if (Temp2 == 0) {\r
-                  Row++;\r
-                  //\r
-                  // Since the Number of lines for this menu entry may or may not be reflected accurately\r
-                  // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
-                  // some testing to ensure we are keeping this in-sync.\r
-                  //\r
-                  // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
-                  //\r
-                  if ((Row - OriginalRow) >= MenuOption->Skip) {\r
-                    MenuOption->Skip++;\r
-                  }\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp2 != 0) {\r
-                Temp2--;\r
-              }\r
-            }\r
-\r
-            Row   = OriginalRow;\r
-\r
-            FreePool (OptionString);\r
-          }\r
-          Temp2 = 0;\r
-\r
           //\r
-          // If this is a text op with secondary text information\r
+          // Save the highlight menu, will be used in CfRefreshHighLight case.\r
           //\r
-          if ((Statement->OpCode->OpCode  == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
-            StringPtr   = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
-\r
-            Width       = (UINT16) gOptionBlockWidth;\r
-            OriginalRow = Row;\r
-            GlyphWidth = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp3 == 0) && (Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&StringPtr[Index]) != 0) {\r
-                if (Temp3 == 0) {\r
-                  Row++;\r
-                  //\r
-                  // Since the Number of lines for this menu entry may or may not be reflected accurately\r
-                  // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
-                  // some testing to ensure we are keeping this in-sync.\r
-                  //\r
-                  // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
-                  //\r
-                  if ((Row - OriginalRow) >= MenuOption->Skip) {\r
-                    MenuOption->Skip++;\r
-                  }\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp3 != 0) {\r
-                Temp3--;\r
-              }\r
-            }\r
-\r
-            Row = OriginalRow;\r
-            FreePool (StringPtr);\r
+          if (Link == NewPos) {\r
+            SavedMenuOption = MenuOption;\r
+            SkipHighLight   = TRUE;\r
           }\r
-          Temp3 = 0;\r
-\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+          \r
+          DisplayOneMenu (MenuOption, \r
+                          ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) ? LEFT_SKIPPED_COLUMNS + gModalSkipColumn : LEFT_SKIPPED_COLUMNS,\r
+                          gStatementDimensions.LeftColumn, \r
+                          Link == TopOfScreen ? SkipValue : 0, \r
+                          BottomRow,\r
+                          Link == NewPos && IsSelectable(MenuOption)\r
+                          );\r
 \r
           //\r
           // 3. Update the row info which will be used by next menu.\r
@@ -1835,20 +2064,22 @@ UiDisplayMenu (
           }\r
         }\r
 \r
-        if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
-          UpArrow = TRUE;\r
-        }\r
-\r
-        if (UpArrow) {\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
-          PrintCharAt (\r
-            gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            ARROW_UP\r
-            );\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+        //\r
+        // 3. Menus in this form may not cover all form, clean the remain field.\r
+        //\r
+        while (Row <= BottomRow) {\r
+          if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
+            PrintStringAtWithWidth(gStatementDimensions.LeftColumn, Row++, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+          } else {\r
+            PrintStringAtWithWidth(gStatementDimensions.LeftColumn, Row++, L"", gStatementDimensions.RightColumn - gHelpBlockWidth - gStatementDimensions.LeftColumn);\r
+          }\r
         }\r
 \r
+        //\r
+        // 4. Print the down arrow row.\r
+        //\r
+        PrintStringAtWithWidth(gStatementDimensions.LeftColumn, BottomRow + 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+       \r
         if (DownArrow) {\r
           gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
           PrintCharAt (\r
@@ -1860,6 +2091,10 @@ UiDisplayMenu (
         }\r
 \r
         MenuOption = NULL;\r
+\r
+        if (IsListEmpty (&gMenuOption)) { \r
+          ControlFlag = CfReadKey;\r
+        }\r
       }\r
       break;\r
 \r
@@ -1872,6 +2107,13 @@ UiDisplayMenu (
       //\r
       ControlFlag = CfUpdateHelpString;\r
 \r
+      if (SkipHighLight) {\r
+        MenuOption    = SavedMenuOption;\r
+        SkipHighLight = FALSE;\r
+        UpdateHighlightMenuInfo (MenuOption);\r
+        break;\r
+      }\r
+\r
       if (MenuOption != NULL && TopOfScreen == &MenuOption->Link) {\r
         Temp = SkipValue;\r
       } else {\r
@@ -1933,7 +2175,7 @@ UiDisplayMenu (
               }\r
 \r
               OriginalRow = MenuOption->Row;\r
-              Width       = GetWidth (MenuOption->ThisTag);\r
+              Width       = GetWidth (MenuOption->ThisTag, NULL);\r
               GlyphWidth  = 1;\r
 \r
               for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
@@ -1967,25 +2209,9 @@ UiDisplayMenu (
         MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
         Statement = MenuOption->ThisTag;\r
 \r
-        //\r
-        // Get the highlight statement.\r
-        //\r
-        gUserInput->SelectedStatement = Statement;\r
-        gSequence = (UINT16) MenuOption->Sequence;\r
-\r
-        //\r
-        // Record highlight row info for date/time opcode.\r
-        //\r
-        if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-          gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
-          gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
-        } else {\r
-          gHighligthMenuInfo.QuestionId = 0;\r
-          gHighligthMenuInfo.DisplayRow = 0;\r
-        }\r
+        UpdateHighlightMenuInfo (MenuOption);\r
 \r
         if (!IsSelectable (MenuOption)) {\r
-          RefreshKeyHelp(gFormData, Statement, FALSE);\r
           break;\r
         }\r
 \r
@@ -2031,7 +2257,7 @@ UiDisplayMenu (
           if (NewLine) {\r
             OriginalRow = MenuOption->Row;\r
 \r
-            Width       = GetWidth (Statement);\r
+            Width       = GetWidth (Statement, NULL);\r
             GlyphWidth          = 1;\r
 \r
             for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
@@ -2058,8 +2284,6 @@ UiDisplayMenu (
           }\r
         }\r
 \r
-        RefreshKeyHelp(gFormData, MenuOption->ThisTag, FALSE);\r
-\r
         //\r
         // Clear reverse attribute\r
         //\r