Rollback patch 14537 & 14538, because patch 14537 is not tested by Laszlo Ersek,...
authorEric Dong <eric.dong@intel.com>
Mon, 12 Aug 2013 02:03:10 +0000 (02:03 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Aug 2013 02:03:10 +0000 (02:03 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14539 6f19259b-4bc3-4df7-8a09-765794883524

42 files changed:
DuetPkg/DuetPkg.fdf
DuetPkg/DuetPkgIa32.dsc
DuetPkg/DuetPkgX64.dsc
MdeModulePkg/Include/Library/CustomizedDisplayLib.h [deleted file]
MdeModulePkg/Include/Protocol/DisplayProtocol.h [deleted file]
MdeModulePkg/Include/Protocol/FormBrowserEx2.h [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/Colors.h [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.uni [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c [deleted file]
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.h [deleted file]
MdeModulePkg/MdeModulePkg.dec
MdeModulePkg/MdeModulePkg.dsc
MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf [deleted file]
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c [deleted file]
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h [deleted file]
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni [deleted file]
MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c [deleted file]
MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Colors.h [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
MdeModulePkg/Universal/SetupBrowserDxe/Expression.h [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Print.c [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c [new file with mode: 0644]
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h [new file with mode: 0644]
Nt32Pkg/Nt32Pkg.dsc
Nt32Pkg/Nt32Pkg.fdf
OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32.fdf
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgIa32X64.fdf
OvmfPkg/OvmfPkgX64.dsc
OvmfPkg/OvmfPkgX64.fdf

index 66f8b68ed822cc0c388766c39c136611b71655d1..f6bcdd9fdb63b6695b7da787155182eef70e7006 100644 (file)
@@ -59,7 +59,6 @@ INF  MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
 INF  MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf\r
 INF  MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
 INF  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
-INF  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
 \r
 INF  MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
 INF  MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
index 117bffb0ece603629b669176ea6db80f376a1cbb..b35ba913ffee38c12b4652040c03e0ea5717fb20 100644 (file)
@@ -85,7 +85,6 @@
   SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf\r
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf\r
-  CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
   #\r
   # Platform\r
   #\r
   }\r
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
   MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
-  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
 \r
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
index 70b159dd8237db5c731a6bf5dd6f52bdf5414c34..65c0d140192d2a6ebfb0a0467c2618b635b9ac30 100644 (file)
@@ -85,7 +85,6 @@
   SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf\r
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
   PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf\r
-  CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
   #\r
   # Platform\r
   #\r
   }\r
   MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
   MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
-  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
 \r
   MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf\r
   MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf\r
diff --git a/MdeModulePkg/Include/Library/CustomizedDisplayLib.h b/MdeModulePkg/Include/Library/CustomizedDisplayLib.h
deleted file mode 100644 (file)
index 31e1091..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/** @file\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
-\r
-**/\r
-\r
-#ifndef __CUSTOMIZED_DISPLAY_LIB_H__\r
-#define __CUSTOMIZED_DISPLAY_LIB_H__\r
-\r
-#include <Protocol/DisplayProtocol.h>\r
-\r
-/**\r
-+------------------------------------------------------------------------------+\r
-|                                 Setup Page                                   |\r
-+------------------------------------------------------------------------------+\r
-\r
-Statement\r
-Statement\r
-Statement\r
-\r
-\r
-\r
-\r
-\r
-+------------------------------------------------------------------------------+\r
-|                                F9=Reset to Defaults        F10=Save          |\r
-| ^"=Move Highlight          <Spacebar> Toggles Checkbox     Esc=Exit          |\r
-+------------------------------------------------------------------------------+\r
-  StatusBar\r
-**/\r
-\r
-/**\r
-  This funtion defines Page Frame and Backgroud. \r
-  \r
-  Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, \r
-  StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. \r
-\r
-  @param[in]  FormData             Form Data to be shown in Page.\r
-  @param[out] ScreenForStatement   Screen to be used for Statement. (Prompt, Value and Help)\r
-  \r
-  @return Status\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DisplayPageFrame (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData,\r
-  OUT EFI_SCREEN_DESCRIPTOR         *ScreenForStatement\r
-  );\r
-\r
-/**\r
-  Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-ClearDisplayPage (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  This function updates customized key panel's help information.\r
-  The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.\r
-  and arrange them in Footer panel.\r
-  \r
-  @param[in]  FormData       Form Data to be shown in Page. FormData has the highlighted statement. \r
-  @param[in]  Statement      The statement current selected.\r
-  @param[in]  Selected       Whether or not a tag be selected. TRUE means Enter has hit this question.\r
-**/\r
-VOID\r
-EFIAPI\r
-RefreshKeyHelp (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData,\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
-  IN  BOOLEAN                      Selected\r
-  );\r
-\r
-/**\r
-  Update status bar.\r
-\r
-  This function updates the status bar on the bottom of menu screen. It just shows StatusBar. \r
-  Original logic in this function should be splitted out.\r
-\r
-  @param[in]  MessageType            The type of message to be shown. InputError or Configuration Changed. \r
-  @param[in]  State                  Show or Clear Message.\r
-**/\r
-VOID\r
-EFIAPI\r
-UpdateStatusBar (\r
-  IN  UINTN                  MessageType,\r
-  IN  BOOLEAN                State\r
-  );\r
-\r
-/**\r
-  Create popup window. \r
-\r
-  This function draws OEM/Vendor specific pop up windows.\r
-\r
-  @param[out]  Key    User Input Key\r
-  @param       ...    String to be shown in Popup. The variable argument list is terminated by a NULL.\r
-  \r
-**/\r
-VOID\r
-EFIAPI\r
-CreateDialog (\r
-  OUT EFI_INPUT_KEY  *Key,        OPTIONAL\r
-  ...\r
-  );\r
-\r
-/**\r
-  Confirm how to handle the changed data. \r
-  \r
-  @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.\r
-**/\r
-UINTN\r
-EFIAPI\r
-ConfirmDataChange (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  OEM specifies whether Setup exits Page by ESC key.\r
-\r
-  This function customized the behavior that whether Setup exits Page so that \r
-  system able to boot when configuration is not changed.\r
-\r
-  @retval  TRUE     Exits FrontPage\r
-  @retval  FALSE    Don't exit FrontPage.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FormExitPolicy (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Set Timeout value for a ceratain Form to get user response. \r
-  \r
-  This function allows to set timeout value on a ceratain form if necessary.\r
-  If timeout is not zero, the form will exit if user has no response in timeout. \r
-  \r
-  @param[in]  FormData   Form Data to be shown in Page\r
-\r
-  @return 0     No timeout for this form. \r
-  @return > 0   Timeout value in 100 ns units.\r
-**/\r
-UINT64\r
-EFIAPI\r
-FormExitTimeout (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
-  );\r
-\r
-//\r
-// Print Functions\r
-//\r
-/**\r
-  Prints a unicode string to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  String     String pointer.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String\r
-  );\r
-\r
-\r
-/**\r
-  Prints a unicode string with the specified width to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  String     String pointer.\r
-  @param  Width      Width for String to be printed. If the print length of String < Width, \r
-                     Space char (L' ') will be used to append String. \r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAtWithWidth (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String,\r
-  IN UINTN     Width\r
-  );\r
-\r
-/**\r
-  Prints a chracter to the default console, at\r
-  the supplied cursor position, using L"%c" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Character  Character to print.\r
-\r
-  @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintCharAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  CHAR16       Character\r
-  );\r
-\r
-/**\r
-  Clear retangle with specified text attribute.\r
-\r
-  @param  LeftColumn     Left column of retangle.\r
-  @param  RightColumn    Right column of retangle.\r
-  @param  TopRow         Start row of retangle.\r
-  @param  BottomRow      End row of retangle.\r
-  @param  TextAttribute  The character foreground and background.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-ClearLines (\r
-  IN UINTN               LeftColumn,\r
-  IN UINTN               RightColumn,\r
-  IN UINTN               TopRow,\r
-  IN UINTN               BottomRow,\r
-  IN UINTN               TextAttribute\r
-  );\r
-\r
-//\r
-// Color Setting Functions\r
-//\r
-/**\r
-  Get OEM/Vendor specific popup attribute colors.\r
-\r
-  @retval  Byte code color setting for popup color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific popup attribute colors.\r
-\r
-  @retval  Byte code color setting for popup inverse color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupInverseColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific PickList color attribute.\r
-\r
-  @retval  Byte code color setting for pick list color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPickListColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific arrow color attribute.\r
-\r
-  @retval  Byte code color setting for arrow color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetArrowColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific info text color attribute.\r
-\r
-  @retval  Byte code color setting for info text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetInfoTextColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific help text color attribute.\r
-\r
-  @retval  Byte code color setting for help text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHelpTextColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific grayed out text color attribute.\r
-\r
-  @retval  Byte code color setting for grayed out text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetGrayedTextColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific highlighted text color attribute.\r
-\r
-  @retval  Byte code color setting for highlight text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHighlightTextColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific field text color attribute.\r
-\r
-  @retval  Byte code color setting for field text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetFieldTextColor (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Get OEM/Vendor specific subtitle text color attribute.\r
-\r
-  @retval  Byte code color setting for subtitle text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetSubTitleTextColor (\r
-  VOID\r
-  );\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Include/Protocol/DisplayProtocol.h b/MdeModulePkg/Include/Protocol/DisplayProtocol.h
deleted file mode 100644 (file)
index d4f0deb..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/** @file\r
-  FormDiplay protocol to show Form\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
-\r
-**/\r
-\r
-#ifndef __DISPLAY_PROTOCOL_H__\r
-#define __DISPLAY_PROTOCOL_H__\r
-\r
-#include <Protocol/FormBrowser2.h>\r
-\r
-#define EDKII_FORM_DISPLAY_ENGINE_PROTOCOL_GUID  \\r
-  { 0x9bbe29e9, 0xfda1, 0x41ec, { 0xad, 0x52, 0x45, 0x22, 0x13, 0x74, 0x2d, 0x2e } }\r
-\r
-// \r
-// Do nothing.\r
-//\r
-#define BROWSER_ACTION_NONE         BIT16\r
-//\r
-// ESC Exit\r
-//\r
-#define BROWSER_ACTION_FORM_EXIT    BIT17\r
-\r
-#define BROWSER_SUCCESS             0x0\r
-#define BROWSER_ERROR               BIT31\r
-#define BROWSER_SUBMIT_FAIL         BROWSER_ERROR | 0x01\r
-#define BROWSER_NO_SUBMIT_IF        BROWSER_ERROR | 0x02\r
-#define BROWSER_FORM_NOT_FOUND      BROWSER_ERROR | 0x03\r
-#define BROWSER_FORM_SUPPRESS       BROWSER_ERROR | 0x04\r
-#define BROWSER_PROTOCOL_NOT_FOUND  BROWSER_ERROR | 0x05\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1  0x10000\r
-#define FORM_DISPLAY_ENGINE_VERSION_1            0x10000\r
-\r
-typedef struct {\r
-  //\r
-  // HII Data Type\r
-  //\r
-  UINT8               Type;\r
-  //\r
-  // Buffer Data and Length if Type is EFI_IFR_TYPE_BUFFER or EFI_IFR_TYPE_STRING\r
-  //\r
-  UINT8               *Buffer;\r
-  UINT16              BufferLen;\r
-  EFI_IFR_TYPE_VALUE  Value;\r
-} EFI_HII_VALUE;\r
-\r
-#define DISPLAY_QUESTION_OPTION_SIGNATURE  SIGNATURE_32 ('Q', 'O', 'P', 'T')\r
-\r
-typedef struct {\r
-  UINTN                  Signature;\r
-  LIST_ENTRY             Link;\r
-  //\r
-  // OneOfOption Data\r
-  //\r
-  EFI_IFR_ONE_OF_OPTION  *OptionOpCode;\r
-  //\r
-  // Option ImageId and AnimationId\r
-  //\r
-  EFI_IMAGE_ID           ImageId;\r
-  EFI_ANIMATION_ID       AnimationId;\r
-} DISPLAY_QUESTION_OPTION;\r
-\r
-#define DISPLAY_QUESTION_OPTION_FROM_LINK(a)  CR (a, DISPLAY_QUESTION_OPTION, Link, DISPLAY_QUESTION_OPTION_SIGNATURE)\r
-\r
-typedef struct _FORM_DISPLAY_ENGINE_STATEMENT FORM_DISPLAY_ENGINE_STATEMENT;\r
-typedef struct _FORM_DISPLAY_ENGINE_FORM      FORM_DISPLAY_ENGINE_FORM;\r
-\r
-#define STATEMENT_VALID             0x0\r
-#define STATEMENT_INVALID           BIT31\r
-\r
-#define INCOSISTENT_IF_TRUE         STATEMENT_INVALID | 0x01\r
-#define WARNING_IF_TRUE             STATEMENT_INVALID | 0x02\r
-#define STRING_TOO_LONG             STATEMENT_INVALID | 0x03\r
-// ... to be extended.\r
-\r
-typedef struct {\r
-  //\r
-  // StringId for INCONSITENT_IF or WARNING_IF\r
-  //\r
-  EFI_STRING_ID  StringId;\r
-  //\r
-  // TimeOut for WARNING_IF\r
-  //\r
-  UINT8          TimeOut;\r
-} STATEMENT_ERROR_INFO;\r
-\r
-/**\r
-  Perform value check for a question.\r
-  \r
-  @param  Form       Form where Statement is in.\r
-  @param  Statement  Value will check for it.\r
-  @param  Value      New value will be checked.\r
-  \r
-  @retval Status     Value Status\r
-\r
-**/\r
-typedef\r
-UINT32\r
-(EFIAPI *VALIDATE_QUESTION) (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *Form,\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
-  IN EFI_HII_VALUE                 *Value, \r
-  OUT STATEMENT_ERROR_INFO         *ErrorInfo\r
-  );\r
-\r
-/**\r
-  Perform Password check. \r
-  Passwork may be encrypted by driver that requires the specific check.\r
-  \r
-  @param  Form             Form where Password Statement is in.\r
-  @param  Statement        Password statement\r
-  @param  PasswordString   Password string to be checked. It may be NULL.\r
-                           NULL means to restore password.\r
-                           "" string can be used to checked whether old password does exist.\r
-  \r
-  @return Status     Status of Password check.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *PASSWORD_CHECK) (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *Form,\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
-  IN EFI_STRING                    PasswordString  OPTIONAL\r
-  );\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'A')\r
-\r
-//\r
-// Attribute for Statement and Form\r
-//\r
-#define HII_DISPLAY_GRAYOUT          BIT0\r
-#define HII_DISPLAY_LOCK             BIT1\r
-#define HII_DISPLAY_READONLY         BIT2\r
-#define HII_DISPLAY_MODAL            BIT3\r
-\r
-struct _FORM_DISPLAY_ENGINE_STATEMENT{\r
-  UINTN                 Signature;\r
-  //\r
-  // Version for future structure extension\r
-  //\r
-  UINTN                 Version;\r
-  //\r
-  // link to all the statement which will show in the display form.\r
-  //\r
-  LIST_ENTRY            DisplayLink;\r
-  //\r
-  // Pointer to statement opcode.\r
-  // for Guided Opcode. All buffers will be here if GUIDED opcode scope is set.\r
-  //\r
-  EFI_IFR_OP_HEADER     *OpCode;\r
-  //\r
-  // Question CurrentValue\r
-  //\r
-  EFI_HII_VALUE         CurrentValue;\r
-  //\r
-  // Flag to describe whether setting is changed or not.\r
-  // Displayer may depend on it to show it with the different color. \r
-  //\r
-  BOOLEAN               SettingChangedFlag;\r
-  //\r
-  // nested Statement list inside of EFI_IFR_SUBTITLE\r
-  //\r
-  LIST_ENTRY            NestStatementList;\r
-  //\r
-  // nested EFI_IFR_ONE_OF_OPTION list (QUESTION_OPTION)\r
-  //\r
-  LIST_ENTRY            OptionListHead;\r
-  //\r
-  // Statement attributes: GRAYOUT, LOCK and READONLY\r
-  //\r
-  UINT32                Attribute;\r
-\r
-  //\r
-  // ValidateQuestion to do InconsistIf check\r
-  // It may be NULL if any value is valid.\r
-  //\r
-  VALIDATE_QUESTION     ValidateQuestion;\r
-  \r
-  //\r
-  // Password additional check. It may be NULL when the additional check is not required.\r
-  //\r
-  PASSWORD_CHECK        PasswordCheck;\r
-\r
-  //\r
-  // Statement ImageId and AnimationId\r
-  //\r
-  EFI_IMAGE_ID          ImageId;\r
-  EFI_ANIMATION_ID      AnimationId;\r
-};\r
-\r
-#define FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK(a)  CR (a, FORM_DISPLAY_ENGINE_STATEMENT, DisplayLink, FORM_DISPLAY_ENGINE_STATEMENT_SIGNATURE)\r
-\r
-#define BROWSER_HOT_KEY_SIGNATURE  SIGNATURE_32 ('B', 'H', 'K', 'S')\r
-\r
-typedef struct {\r
-  UINTN                 Signature;\r
-  LIST_ENTRY            Link;\r
-  \r
-  EFI_INPUT_KEY         *KeyData;\r
-  //\r
-  // Action is Discard, Default, Submit, Reset and Exit.\r
-  //\r
-  UINT32                 Action;\r
-  UINT16                 DefaultId;\r
-  //\r
-  // HotKey Help String\r
-  //\r
-  EFI_STRING             HelpString;\r
-} BROWSER_HOT_KEY;\r
-\r
-#define BROWSER_HOT_KEY_FROM_LINK(a)  CR (a, BROWSER_HOT_KEY, Link, BROWSER_HOT_KEY_SIGNATURE)\r
-\r
-#define FORM_DISPLAY_ENGINE_FORM_SIGNATURE  SIGNATURE_32 ('F', 'F', 'R', 'M')\r
-\r
-struct _FORM_DISPLAY_ENGINE_FORM {\r
-  UINTN                Signature;\r
-  //\r
-  // Version for future structure extension\r
-  //\r
-  UINTN                Version;\r
-  //\r
-  // Statement List inside of Form\r
-  //\r
-  LIST_ENTRY            StatementListHead;\r
-  //\r
-  // Statement List outside of Form  \r
-  //\r
-  LIST_ENTRY            StatementListOSF;\r
-  //\r
-  // The input screen dimenstions info.\r
-  //\r
-  EFI_SCREEN_DESCRIPTOR *ScreenDimensions;\r
-  //\r
-  // FormSet information\r
-  //\r
-  EFI_GUID             FormSetGuid;\r
-  //\r
-  // HiiHandle can be used to get String, Image or Animation\r
-  //\r
-  EFI_HII_HANDLE       HiiHandle;\r
-  \r
-  //\r
-  // Form ID and Title.\r
-  //\r
-  UINT16               FormId;\r
-  EFI_STRING_ID        FormTitle;\r
-  //\r
-  // Form Attributes: Lock, Modal.\r
-  //\r
-  UINT32               Attribute;\r
-  //\r
-  // Flag to describe whether setting is changed or not.\r
-  // Displayer depends on it to show ChangedFlag.\r
-  //\r
-  BOOLEAN              SettingChangedFlag;\r
-\r
-  //\r
-  // Statement to be HighLighted\r
-  //\r
-  FORM_DISPLAY_ENGINE_STATEMENT *HighLightedStatement;\r
-  //\r
-  // Event to notify Displayer that FormData is updated to be refreshed.\r
-  //\r
-  EFI_EVENT              FormRefreshEvent;\r
-  //\r
-  // Additional Hotkey registered by BrowserEx protocol.\r
-  //\r
-  LIST_ENTRY             HotKeyListHead;\r
-\r
-  //\r
-  // Form ImageId and AnimationId\r
-  //\r
-  EFI_IMAGE_ID         ImageId;\r
-  EFI_ANIMATION_ID     AnimationId;\r
-  \r
-  //\r
-  // If Status is error, display needs to handle it.  \r
-  //\r
-  UINT32               BrowserStatus;\r
-  //\r
-  // String for error status. It may be NULL. \r
-  //\r
-  EFI_STRING           ErrorString;\r
-};\r
-\r
-#define FORM_DISPLAY_ENGINE_FORM_FROM_LINK(a)  CR (a, FORM_DISPLAY_ENGINE_FORM, Link, FORM_DISPLAY_ENGINE_FORM_SIGNATURE)\r
-\r
-typedef struct {\r
-  FORM_DISPLAY_ENGINE_STATEMENT  *SelectedStatement; // Selected Statement and InputValue\r
-  \r
-  EFI_HII_VALUE                  InputValue;\r
-  \r
-  UINT32                         Action;             // If SelectedStatement is NULL, Action will be used.\r
-                                                     // Trig Action (Discard, Default, Submit, Reset and Exit)\r
-  UINT16                         DefaultId;\r
-} USER_INPUT;\r
-\r
-/**\r
-  Display one form, and return user input.\r
-  \r
-  @param FormData                Form Data to be shown.\r
-  @param UserInputData           User input data.\r
-  \r
-  @retval EFI_SUCCESS            Form Data is shown, and user input is got.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *FORM_DISPLAY) (\r
-  IN FORM_DISPLAY_ENGINE_FORM  *FormData,\r
-  OUT USER_INPUT               *UserInputData\r
-);\r
-\r
-/**\r
-  Exit Display and Clear Screen to the original state.\r
-\r
-**/\r
-typedef\r
-VOID\r
-(EFIAPI *EXIT_DISPLAY) (\r
-  VOID\r
-);\r
-\r
-/**\r
-  Confirm how to handle the changed data. \r
-  \r
-  @return Action of Submit, Discard and None\r
-**/\r
-typedef\r
-UINTN\r
-(EFIAPI *CONFIRM_DATA_CHANGE) (\r
-  VOID\r
-);\r
-\r
-typedef struct {\r
-  FORM_DISPLAY        FormDisplay;\r
-  EXIT_DISPLAY        ExitDisplay;\r
-  CONFIRM_DATA_CHANGE ConfirmDataChange;\r
-} EDKII_FORM_DISPLAY_ENGINE_PROTOCOL;\r
-\r
-extern EFI_GUID gEdkiiFormDisplayEngineProtocolGuid;\r
-#endif\r
diff --git a/MdeModulePkg/Include/Protocol/FormBrowserEx2.h b/MdeModulePkg/Include/Protocol/FormBrowserEx2.h
deleted file mode 100644 (file)
index 105ac03..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/** @file\r
-  Extension Form Browser Protocol provides the services that can be used to \r
-  register the different hot keys for the standard Browser actions described in UEFI specification.\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
-\r
-**/\r
-\r
-#ifndef __FORM_BROWSER_EXTENSION2_H__\r
-#define __FORM_BROWSER_EXTENSION2_H__\r
-\r
-#include <Protocol/FormBrowserEx.h>\r
-\r
-#define EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL_GUID  \\r
-  { 0xa770c357, 0xb693, 0x4e6d, { 0xa6, 0xcf, 0xd2, 0x1c, 0x72, 0x8e, 0x55, 0xb }}\r
-\r
-typedef struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL   EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL;\r
-\r
-#define BROWSER_EXTENSION2_VERSION_1  0x10000\r
-\r
-/**\r
-  Check whether the browser data has been modified.\r
-\r
-  @retval TRUE        Browser data is modified.\r
-  @retval FALSE       No browser data is modified.\r
-\r
-**/\r
-typedef\r
-BOOLEAN\r
-(EFIAPI *IS_BROWSER_DATA_MODIFIED) (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Execute the action requested by the Action parameter.\r
-\r
-  @param[in] Action     Execute the request action.\r
-  @param[in] DefaultId  The default Id info when need to load default value.\r
-\r
-  @retval EFI_SUCCESS              Execute the request action succss.\r
-\r
-**/\r
-typedef \r
-EFI_STATUS \r
-(EFIAPI *EXECUTE_ACTION) (\r
-  IN UINT32        Action,\r
-  IN UINT16        DefaultId\r
-  );\r
-\r
-#define FORM_ENTRY_INFO_SIGNATURE    SIGNATURE_32 ('f', 'e', 'i', 's')\r
-\r
-typedef struct {\r
-  UINTN           Signature;\r
-  LIST_ENTRY      Link;\r
-\r
-  EFI_HII_HANDLE  HiiHandle;\r
-  EFI_GUID        FormSetGuid;\r
-  EFI_FORM_ID     FormId;\r
-  EFI_QUESTION_ID QuestionId;\r
-} FORM_ENTRY_INFO;\r
-\r
-#define FORM_ENTRY_INFO_FROM_LINK(a)  CR (a, FORM_ENTRY_INFO, Link, FORM_ENTRY_INFO_SIGNATURE)\r
-\r
-struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL {\r
-  ///\r
-  /// Version for protocol future extension.\r
-  ///\r
-  UINT32                    Version;\r
-  SET_SCOPE                 SetScope;\r
-  REGISTER_HOT_KEY          RegisterHotKey;\r
-  REGISTER_EXIT_HANDLER     RegiserExitHandler;\r
-  IS_BROWSER_DATA_MODIFIED  IsBrowserDataModified;\r
-  EXECUTE_ACTION            ExecuteAction;\r
-  ///\r
-  /// A list of type FORMID_INFO is Browser View Form History List.\r
-  ///\r
-  LIST_ENTRY                FormViewHistoryHead;\r
-};\r
-\r
-extern EFI_GUID gEdkiiFormBrowserEx2ProtocolGuid;\r
-\r
-#endif\r
-\r
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/Colors.h b/MdeModulePkg/Library/CustomizedDisplayLib/Colors.h
deleted file mode 100644 (file)
index 2db8b99..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file\r
-MACRO definitions for color used in Setup Browser.\r
-\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\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
-\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
-// Unicode collation protocol in\r
-\r
-#ifndef _COLORS_H_\r
-#define _COLORS_H_\r
-\r
-//\r
-// Screen Color Settings\r
-//\r
-#define PICKLIST_HIGHLIGHT_TEXT       EFI_WHITE\r
-#define PICKLIST_HIGHLIGHT_BACKGROUND EFI_BACKGROUND_CYAN\r
-#define TITLE_TEXT                    EFI_WHITE\r
-#define TITLE_BACKGROUND              EFI_BACKGROUND_BLUE\r
-#define KEYHELP_TEXT                  EFI_LIGHTGRAY\r
-#define KEYHELP_BACKGROUND            EFI_BACKGROUND_BLACK\r
-#define SUBTITLE_BACKGROUND           EFI_BACKGROUND_LIGHTGRAY\r
-#define BANNER_TEXT                   EFI_BLUE\r
-#define BANNER_BACKGROUND             EFI_BACKGROUND_LIGHTGRAY\r
-#define FIELD_TEXT_GRAYED             EFI_DARKGRAY\r
-#define FIELD_BACKGROUND              EFI_BACKGROUND_LIGHTGRAY\r
-#define POPUP_TEXT                    EFI_LIGHTGRAY\r
-#define POPUP_BACKGROUND              EFI_BACKGROUND_BLUE\r
-#define POPUP_INVERSE_TEXT            EFI_LIGHTGRAY\r
-#define POPUP_INVERSE_BACKGROUND      EFI_BACKGROUND_BLACK\r
-#define HELP_TEXT                     EFI_BLUE\r
-#define ERROR_TEXT                    EFI_RED | EFI_BRIGHT\r
-#define INFO_TEXT                     EFI_YELLOW | EFI_BRIGHT\r
-#define ARROW_TEXT                    EFI_RED | EFI_BRIGHT\r
-#define ARROW_BACKGROUND              EFI_BACKGROUND_LIGHTGRAY\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c
deleted file mode 100644 (file)
index aa28146..0000000
+++ /dev/null
@@ -1,921 +0,0 @@
-/** @file\r
-\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
-\r
-**/\r
-#include "CustomizedDisplayLibInternal.h"\r
-\r
-EFI_GUID          gCustomizedDisplayLibGuid = { 0x99fdc8fd, 0x849b, 0x4eba, { 0xad, 0x13, 0xfb, 0x96, 0x99, 0xc9, 0xa, 0x4d } };\r
-\r
-EFI_HII_HANDLE    mCDLStringPackHandle;\r
-UINT16            gClassOfVfr;                 // Formset class information\r
-BOOLEAN           gLibIsFirstForm = TRUE;\r
-BANNER_DATA       *gBannerData;\r
-\r
-UINTN             gFooterHeight;\r
-\r
-/**\r
-+------------------------------------------------------------------------------+\r
-|                                 Setup Page                                   |\r
-+------------------------------------------------------------------------------+\r
-\r
-Statement\r
-Statement\r
-Statement\r
-\r
-\r
-\r
-\r
-\r
-+------------------------------------------------------------------------------+\r
-|                                F9=Reset to Defaults        F10=Save          |\r
-| ^"=Move Highlight          <Spacebar> Toggles Checkbox     Esc=Exit          |\r
-+------------------------------------------------------------------------------+\r
-  StatusBar\r
-**/\r
-\r
-/**\r
-  This funtion defines Page Frame and Backgroud. \r
-  \r
-  Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, \r
-  StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. \r
-\r
-  @param[in]  FormData             Form Data to be shown in Page.\r
-  @param[out] ScreenForStatement   Screen to be used for Statement. (Prompt, Value and Help)\r
-  \r
-  @return Status\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DisplayPageFrame (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData,\r
-  OUT EFI_SCREEN_DESCRIPTOR         *ScreenForStatement\r
-  )\r
-{\r
-  EFI_STATUS             Status;\r
-\r
-  ASSERT (FormData != NULL && ScreenForStatement != NULL);\r
-  if (FormData == NULL || ScreenForStatement == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Status = ScreenDiemensionInfoValidate (FormData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
-\r
-  ProcessExternedOpcode(FormData);\r
-\r
-  //\r
-  // Calculate the ScreenForStatement.\r
-  //\r
-  ScreenForStatement->BottomRow   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight;\r
-  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
-    ScreenForStatement->TopRow    = gScreenDimensions.TopRow + FRONT_PAGE_HEADER_HEIGHT;\r
-  } else {\r
-    ScreenForStatement->TopRow    = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;\r
-  }\r
-  ScreenForStatement->LeftColumn  = gScreenDimensions.LeftColumn;\r
-  ScreenForStatement->RightColumn = gScreenDimensions.RightColumn;\r
-\r
-  if ((gLibIsFirstForm) || ((FormData->Attribute & HII_DISPLAY_MODAL) != 0)) {\r
-    //\r
-    // Ensure we are in Text mode\r
-    //\r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-    ClearLines (0, gScreenDimensions.RightColumn, 0, gScreenDimensions.BottomRow, KEYHELP_BACKGROUND);\r
-    gLibIsFirstForm = FALSE;\r
-  }\r
-\r
-  //\r
-  // Don't print frame for modal form.\r
-  //\r
-  if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
-    PrintBannerInfo (FormData);\r
-  }\r
-\r
-  PrintFramework (FormData);\r
-\r
-  UpdateStatusBar(NV_UPDATE_REQUIRED, FormData->SettingChangedFlag);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function updates customized key panel's help information.\r
-  The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.\r
-  and arrange them in Footer panel.\r
-  \r
-  @param[in]  FormData       Form Data to be shown in Page. FormData has the highlighted statement. \r
-  @param[in]  Statement      The statement current selected.\r
-  @param[in]  Selected       Whether or not a tag be selected. TRUE means Enter has hit this question.\r
-**/\r
-VOID\r
-EFIAPI\r
-RefreshKeyHelp (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData,\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
-  IN  BOOLEAN                      Selected\r
-  )\r
-{\r
-  UINTN                  SecCol;\r
-  UINTN                  ThdCol;\r
-  UINTN                  LeftColumnOfHelp;\r
-  UINTN                  RightColumnOfHelp;\r
-  UINTN                  TopRowOfHelp;\r
-  UINTN                  BottomRowOfHelp;\r
-  UINTN                  StartColumnOfHelp;\r
-  EFI_IFR_NUMERIC        *NumericOp;\r
-  EFI_IFR_DATE           *DateOp;\r
-  EFI_IFR_TIME           *TimeOp;\r
-  BOOLEAN                HexDisplay;\r
-\r
-  ASSERT (FormData != NULL);\r
-  if (FormData == NULL) {\r
-    return;\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-  if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-    return;\r
-  }\r
-\r
-  SecCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3;\r
-  ThdCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2;\r
-\r
-  StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
-  LeftColumnOfHelp  = gScreenDimensions.LeftColumn + 1;\r
-  RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\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
-  if (Statement == NULL) {\r
-    //\r
-    // Print Key for Form without showable statement.\r
-    //\r
-    PrintHotKeyHelpString (FormData);\r
-    PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-    return;\r
-  }\r
-\r
-  HexDisplay = FALSE;\r
-  NumericOp = NULL;\r
-  DateOp    = NULL;\r
-  TimeOp    = NULL;\r
-  if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) {\r
-    NumericOp = (EFI_IFR_NUMERIC *) Statement->OpCode;\r
-    HexDisplay = (NumericOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
-  } else if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-    DateOp   = (EFI_IFR_DATE *) Statement->OpCode;\r
-    HexDisplay = (DateOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
-  } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    TimeOp  = (EFI_IFR_TIME *) Statement->OpCode;\r
-    HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
-  }  \r
-  switch (Statement->OpCode->OpCode) {\r
-  case EFI_IFR_ORDERED_LIST_OP:\r
-  case EFI_IFR_ONE_OF_OP:\r
-  case EFI_IFR_NUMERIC_OP:\r
-  case EFI_IFR_TIME_OP:\r
-  case EFI_IFR_DATE_OP:\r
-    if (!Selected) {\r
-        PrintHotKeyHelpString (FormData);\r
-\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-      }\r
-\r
-      if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
-          (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        PrintAt (\r
-          0, \r
-          StartColumnOfHelp,\r
-          BottomRowOfHelp,\r
-          L"%c%c%c%c%s",\r
-          ARROW_UP,\r
-          ARROW_DOWN,\r
-          ARROW_RIGHT,\r
-          ARROW_LEFT,\r
-          gMoveHighlight\r
-          );\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
-      } else {\r
-        PrintAt (0, 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
-      }\r
-    } else {\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
-\r
-      //\r
-      // If it is a selected numeric with manual input, display different message\r
-      //\r
-      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
-      }\r
-\r
-      if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
-      }\r
-\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_CHECKBOX_OP:\r
-    PrintHotKeyHelpString (FormData);\r
-\r
-    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-    }\r
-\r
-    PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
-    break;\r
-\r
-  case EFI_IFR_REF_OP:\r
-  case EFI_IFR_PASSWORD_OP:\r
-  case EFI_IFR_STRING_OP:\r
-  case EFI_IFR_TEXT_OP:\r
-  case EFI_IFR_ACTION_OP:\r
-  case EFI_IFR_RESET_BUTTON_OP:\r
-  case EFI_IFR_SUBTITLE_OP:\r
-     if (!Selected) {\r
-      PrintHotKeyHelpString (FormData);\r
-\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-      }\r
-\r
-      PrintAt (0, 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
-      }\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
-      }\r
-    }\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }  \r
-}\r
-\r
-/**\r
-  Update status bar.\r
-\r
-  This function updates the status bar on the bottom of menu screen. It just shows StatusBar. \r
-  Original logic in this function should be splitted out.\r
-\r
-  @param[in]  MessageType            The type of message to be shown. InputError or Configuration Changed. \r
-  @param[in]  State                  Show or Clear Message.\r
-**/\r
-VOID\r
-EFIAPI\r
-UpdateStatusBar (\r
-  IN  UINTN                  MessageType,\r
-  IN  BOOLEAN                State\r
-  )\r
-{\r
-  UINTN           Index;\r
-  CHAR16          OptionWidth;\r
-\r
-  OptionWidth = (CHAR16) ((gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3);\r
-\r
-  switch (MessageType) {\r
-  case INPUT_ERROR:\r
-    if (State) {\r
-      gST->ConOut->SetAttribute (gST->ConOut, ERROR_TEXT);\r
-      PrintStringAt (\r
-        gScreenDimensions.LeftColumn + OptionWidth,\r
-        gScreenDimensions.BottomRow - 1,\r
-        gInputErrorMessage\r
-        );\r
-    } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);\r
-      for (Index = 0; Index < (LibGetStringWidth (gInputErrorMessage) - 2) / 2; Index++) {\r
-        PrintStringAt (gScreenDimensions.LeftColumn + OptionWidth + Index, gScreenDimensions.BottomRow - 1, L"  ");\r
-      }\r
-    }\r
-    break;\r
-\r
-  case NV_UPDATE_REQUIRED:\r
-    //\r
-    // Global setting support. Show configuration change on every form.\r
-    //\r
-    if (State) {\r
-      gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);\r
-      PrintStringAt (\r
-        gScreenDimensions.LeftColumn + OptionWidth * 2,\r
-        gScreenDimensions.BottomRow - 1,\r
-        gNvUpdateMessage\r
-        );\r
-    } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);\r
-      for (Index = 0; Index < (LibGetStringWidth (gNvUpdateMessage) - 2) / 2; Index++) {\r
-        PrintStringAt (\r
-          (gScreenDimensions.LeftColumn + OptionWidth * 2 + Index),\r
-          gScreenDimensions.BottomRow - 1,\r
-          L"  "\r
-          );\r
-      }\r
-    }\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  } \r
-}\r
-\r
-/**\r
-  Create popup window. It will replace CreateDialog(). \r
-\r
-  This function draws OEM/Vendor specific pop up windows.\r
-\r
-  @param[out]  Key    User Input Key\r
-  @param       ...    String to be shown in Popup. The variable argument list is terminated by a NULL.\r
-  \r
-**/\r
-VOID\r
-EFIAPI\r
-CreateDialog (\r
-  OUT EFI_INPUT_KEY  *Key,        OPTIONAL\r
-  ...\r
-  )\r
-{\r
-  VA_LIST       Marker;\r
-  EFI_INPUT_KEY KeyValue;\r
-  EFI_STATUS    Status;\r
-  UINTN         LargestString;\r
-  UINTN         LineNum;\r
-  UINTN   Index;\r
-  UINTN   Count;\r
-  CHAR16  Character;\r
-  UINTN   Start;\r
-  UINTN   End;\r
-  UINTN   Top;\r
-  UINTN   Bottom;\r
-  CHAR16  *String;\r
-  UINTN   DimensionsWidth;\r
-  UINTN   DimensionsHeight;\r
-  UINTN   CurrentAttribute;\r
-\r
-  //\r
-  // If screen dimension info is not ready, get it from console.\r
-  //\r
-  if (gScreenDimensions.RightColumn == 0 || gScreenDimensions.BottomRow == 0) {\r
-    ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-    gST->ConOut->QueryMode (\r
-                   gST->ConOut,\r
-                   gST->ConOut->Mode->Mode,\r
-                   &gScreenDimensions.RightColumn,\r
-                   &gScreenDimensions.BottomRow\r
-                   );\r
-  }\r
-\r
-  DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
-  DimensionsHeight  = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;\r
-\r
-  LargestString = 0;\r
-  LineNum       = 0;\r
-  VA_START (Marker, Key);\r
-  while  ((String = VA_ARG (Marker, CHAR16 *)) != NULL) {\r
-    LineNum ++;\r
-    \r
-    if ((LibGetStringWidth (String) / 2) > LargestString) {\r
-      LargestString = (LibGetStringWidth (String) / 2);\r
-    }\r
-  } \r
-  VA_END (Marker);\r
-\r
-  if ((LargestString + 2) > DimensionsWidth) {\r
-    LargestString = DimensionsWidth - 2;\r
-  }\r
-  \r
-  CurrentAttribute  = gST->ConOut->Mode->Attribute;  \r
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-  gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
-\r
-  //\r
-  // Subtract the PopUp width from total Columns, allow for one space extra on\r
-  // each end plus a border.\r
-  //\r
-  Start     = (DimensionsWidth - LargestString - 2) / 2 + gScreenDimensions.LeftColumn + 1;\r
-  End       = Start + LargestString + 1;\r
-\r
-  Top       = ((DimensionsHeight - LineNum - 2) / 2) + gScreenDimensions.TopRow - 1;\r
-  Bottom    = Top + LineNum + 2;\r
-\r
-  Character = BOXDRAW_DOWN_RIGHT;\r
-  PrintCharAt (Start, Top, Character);\r
-  Character = BOXDRAW_HORIZONTAL;\r
-  for (Index = Start; Index + 2 < End; Index++) {\r
-    PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
-  }\r
-\r
-  Character = BOXDRAW_DOWN_LEFT;\r
-  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);\r
-  Character = BOXDRAW_VERTICAL;\r
-\r
-  Count = 0;\r
-  VA_START (Marker, Key);\r
-  for (Index = Top; Index + 2 < Bottom; Index++, Count++) {\r
-    String = VA_ARG (Marker, CHAR16*);\r
-\r
-    if (String[0] == CHAR_NULL) {\r
-      //\r
-      // Passing in a NULL results in a blank space\r
-      //\r
-      ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());\r
-    } else if (String[0] == L' ') {\r
-      //\r
-      // Passing in a space results in the assumption that this is where typing will occur\r
-      //\r
-      ClearLines (Start + 1, End - 1, Index + 1, Index + 1, POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND);\r
-      PrintStringAt (\r
-        ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,\r
-        Index + 1,\r
-        String + 1\r
-        );\r
-    } else {\r
-      //\r
-      // This will clear the background of the line - we never know who might have been\r
-      // here before us.  This differs from the next clear in that it used the non-reverse\r
-      // video for normal printing.\r
-      //\r
-      ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());\r
-      PrintStringAt (\r
-        ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,\r
-        Index + 1,\r
-        String\r
-        );\r
-    }\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
-    PrintCharAt (Start, Index + 1, Character);\r
-    PrintCharAt (End - 1, Index + 1, Character);\r
-  }\r
-  VA_END (Marker);\r
-\r
-  Character = BOXDRAW_UP_RIGHT;\r
-  PrintCharAt (Start, Bottom - 1, Character);\r
-  Character = BOXDRAW_HORIZONTAL;\r
-  for (Index = Start; Index + 2 < End; Index++) {\r
-    PrintCharAt ((UINTN)-1, (UINTN) -1, Character);\r
-  }\r
-\r
-  Character = BOXDRAW_UP_LEFT;\r
-  PrintCharAt ((UINTN)-1, (UINTN) -1, Character);\r
-\r
-  if (Key != NULL) {\r
-    Status = WaitForKeyStroke (&KeyValue);\r
-    ASSERT_EFI_ERROR (Status);\r
-    CopyMem (Key, &KeyValue, sizeof (EFI_INPUT_KEY));\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-}\r
-\r
-/**\r
-  Confirm how to handle the changed data. \r
-  \r
-  @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.\r
-**/\r
-UINTN\r
-EFIAPI\r
-ConfirmDataChange (\r
-  VOID\r
-  )\r
-{\r
-  CHAR16                  YesResponse;\r
-  CHAR16                  NoResponse;\r
-  EFI_INPUT_KEY           Key;\r
-\r
-  gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-  \r
-  YesResponse = gYesResponse[0];\r
-  NoResponse  = gNoResponse[0];\r
-  \r
-  //\r
-  // If NV flag is up, prompt user\r
-  //\r
-  do {\r
-    CreateDialog (&Key, gLibEmptyString, gSaveChanges, gAreYouSure, gLibEmptyString, NULL);\r
-  } while\r
-  (\r
-    (Key.ScanCode != SCAN_ESC) &&\r
-    ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
-    ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
-  );\r
-  \r
-  if (Key.ScanCode == SCAN_ESC) {\r
-    return BROWSER_ACTION_NONE;\r
-  } else if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
-    return BROWSER_ACTION_SUBMIT;\r
-  } else {\r
-    return BROWSER_ACTION_DISCARD;\r
-  }\r
-}\r
-\r
-/**\r
-  OEM specifies whether Setup exits Page by ESC key.\r
-\r
-  This function customized the behavior that whether Setup exits Page so that \r
-  system able to boot when configuration is not changed.\r
-\r
-  @retval  TRUE     Exits FrontPage\r
-  @retval  FALSE    Don't exit FrontPage.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FormExitPolicy (\r
-  VOID\r
-  )\r
-{\r
-  return gClassOfVfr == FORMSET_CLASS_FRONT_PAGE ? FALSE : TRUE;\r
-}\r
-\r
-/**\r
-  Set Timeout value for a ceratain Form to get user response. \r
-  \r
-  This function allows to set timeout value on a ceratain form if necessary.\r
-  If timeout is not zero, the form will exit if user has no response in timeout. \r
-  \r
-  @param[in]  FormData   Form Data to be shown in Page\r
-\r
-  @return 0     No timeout for this form. \r
-  @return > 0   Timeout value in 100 ns units.\r
-**/\r
-UINT64\r
-EFIAPI\r
-FormExitTimeout (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
-  )\r
-{\r
-  return 0;\r
-}\r
-//\r
-// Print Functions\r
-//\r
-/**\r
-  Prints a unicode string to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  String     String pointer.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String\r
-  )\r
-{\r
-  return PrintAt (0, Column, Row, L"%s", String);\r
-}\r
-\r
-/**\r
-  Prints a unicode string to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  String     String pointer.\r
-  @param  Width      Width for String.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintStringAtWithWidth (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String,\r
-  IN UINTN     Width\r
-  )\r
-{\r
-  return PrintAt (Width, Column, Row, L"%s", String);\r
-}\r
-\r
-/**\r
-  Prints a chracter to the default console, at\r
-  the supplied cursor position, using L"%c" format.\r
-\r
-  @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Row        The cursor position to print the string at. When it is -1, use current Position.\r
-  @param  Character  Character to print.\r
-\r
-  @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintCharAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  CHAR16       Character\r
-  )\r
-{\r
-  return PrintAt (0, Column, Row, L"%c", Character);\r
-}\r
-\r
-/**\r
-  Clear retangle with specified text attribute.\r
-\r
-  @param  LeftColumn     Left column of retangle.\r
-  @param  RightColumn    Right column of retangle.\r
-  @param  TopRow         Start row of retangle.\r
-  @param  BottomRow      End row of retangle.\r
-  @param  TextAttribute  The character foreground and background.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-ClearLines (\r
-  IN UINTN               LeftColumn,\r
-  IN UINTN               RightColumn,\r
-  IN UINTN               TopRow,\r
-  IN UINTN               BottomRow,\r
-  IN UINTN               TextAttribute\r
-  )\r
-{\r
-  CHAR16  *Buffer;\r
-  UINTN   Row;\r
-\r
-  //\r
-  // For now, allocate an arbitrarily long buffer\r
-  //\r
-  Buffer = AllocateZeroPool (0x10000);\r
-  ASSERT (Buffer != NULL);\r
-\r
-  //\r
-  // Set foreground and background as defined\r
-  //\r
-  gST->ConOut->SetAttribute (gST->ConOut, TextAttribute);\r
-\r
-  //\r
-  // Much faster to buffer the long string instead of print it a character at a time\r
-  //\r
-  LibSetUnicodeMem (Buffer, RightColumn - LeftColumn, L' ');\r
-\r
-  //\r
-  // Clear the desired area with the appropriate foreground/background\r
-  //\r
-  for (Row = TopRow; Row <= BottomRow; Row++) {\r
-    PrintStringAt (LeftColumn, Row, Buffer);\r
-  }\r
-\r
-  gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);\r
-\r
-  FreePool (Buffer);\r
-}\r
-\r
-//\r
-// Color Setting Functions\r
-//\r
-\r
-/**\r
-  Get OEM/Vendor specific popup attribute colors.\r
-\r
-  @retval  Byte code color setting for popup color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupColor (\r
-  VOID\r
-  )\r
-{\r
-  return POPUP_TEXT | POPUP_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific popup attribute colors.\r
-\r
-  @retval  Byte code color setting for popup inverse color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPopupInverseColor (\r
-  VOID\r
-  )\r
-{\r
-  return POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific PickList color attribute.\r
-\r
-  @retval  Byte code color setting for pick list color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetPickListColor (\r
-  VOID\r
-  )\r
-{\r
-  return PICKLIST_HIGHLIGHT_TEXT | PICKLIST_HIGHLIGHT_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific arrow color attribute.\r
-\r
-  @retval  Byte code color setting for arrow color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetArrowColor (\r
-  VOID\r
-  )\r
-{\r
-  return ARROW_TEXT | ARROW_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific info text color attribute.\r
-\r
-  @retval  Byte code color setting for info text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetInfoTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return INFO_TEXT | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific help text color attribute.\r
-\r
-  @retval  Byte code color setting for help text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHelpTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return HELP_TEXT | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific grayed out text color attribute.\r
-\r
-  @retval  Byte code color setting for grayed out text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetGrayedTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific highlighted text color attribute.\r
-\r
-  @retval  Byte code color setting for highlight text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetHighlightTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific field text color attribute.\r
-\r
-  @retval  Byte code color setting for field text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetFieldTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Get OEM/Vendor specific subtitle text color attribute.\r
-\r
-  @retval  Byte code color setting for subtitle text color.\r
-**/\r
-UINT8\r
-EFIAPI\r
-GetSubTitleTextColor (\r
-  VOID\r
-  )\r
-{\r
-  return PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND;\r
-}\r
-\r
-/**\r
-  Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-ClearDisplayPage (\r
-  VOID\r
-  )\r
-{\r
-  gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-  gST->ConOut->ClearScreen (gST->ConOut);\r
-  gLibIsFirstForm = TRUE;\r
-}\r
-\r
-/**\r
-  Constructor of Customized Display Library Instance.\r
-\r
-  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
-  @param  SystemTable   A pointer to the EFI System Table.\r
-\r
-  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CustomizedDisplayLibConstructor (\r
-  IN      EFI_HANDLE                ImageHandle,\r
-  IN      EFI_SYSTEM_TABLE          *SystemTable\r
-  )\r
-{\r
-  mCDLStringPackHandle = HiiAddPackages (&gCustomizedDisplayLibGuid, ImageHandle, CustomizedDisplayLibStrings, NULL);\r
-  ASSERT (mCDLStringPackHandle != NULL);\r
-\r
-  InitializeLibStrings();\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Destructor of Customized Display Library Instance.\r
-\r
-  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
-  @param  SystemTable   A pointer to the EFI System Table.\r
-\r
-  @retval EFI_SUCCESS   The destructor completed successfully.\r
-  @retval Other value   The destructor did not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CustomizedDisplayLibDestructor (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
-  )\r
-{\r
-  HiiRemovePackages(mCDLStringPackHandle);\r
-  \r
-  FreeLibStrings ();\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
deleted file mode 100644 (file)
index ade45b6..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-##\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
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = CustomizedDisplayLib\r
-  FILE_GUID                      = 80B92017-EC64-4923-938D-94FAEE85832E\r
-  MODULE_TYPE                    = DXE_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  LIBRARY_CLASS                  = CustomizedDisplayLib|DXE_DRIVER UEFI_APPLICATION\r
-  CONSTRUCTOR                    = CustomizedDisplayLibConstructor\r
-  DESTRUCTOR                     = CustomizedDisplayLibDestructor\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
-  CustomizedDisplayLib.c\r
-  Colors.h\r
-  CustomizedDisplayLibInternal.h\r
-  CustomizedDisplayLibInternal.c\r
-  CustomizedDisplayLib.uni\r
-  \r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-\r
-[LibraryClasses]\r
-  MemoryAllocationLib\r
-  BaseLib\r
-  UefiBootServicesTableLib\r
-  UefiDriverEntryPoint\r
-  UefiRuntimeServicesTableLib\r
-  BaseMemoryLib\r
-  DebugLib\r
-  PrintLib\r
-  HiiLib\r
-  DevicePathLib\r
-  PcdLib\r
-\r
-[Guids]\r
-  gEfiIfrTianoGuid\r
-  \r
-[Protocols]\r
-\r
-[Pcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserSubtitleTextColor               ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextColor                  ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldTextHighlightColor         ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserFieldBackgroundHighlightColor   ## CONSUMES
\ No newline at end of file
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.uni b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.uni
deleted file mode 100644 (file)
index 18a5c3b..0000000
Binary files a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.uni and /dev/null differ
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
deleted file mode 100644 (file)
index b6b4055..0000000
+++ /dev/null
@@ -1,914 +0,0 @@
-/** @file\r
-\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
-\r
-**/\r
-#include "CustomizedDisplayLibInternal.h"\r
-\r
-EFI_SCREEN_DESCRIPTOR         gScreenDimensions;\r
-CHAR16                        *mLibUnknownString;\r
-extern EFI_HII_HANDLE         mCDLStringPackHandle;\r
-CHAR16                        *mSpaceBuffer;\r
-#define SPACE_BUFFER_SIZE      1000\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-CHAR16            *gEnterString;\r
-CHAR16            *gEnterCommitString;\r
-CHAR16            *gEnterEscapeString;\r
-CHAR16            *gEscapeString;\r
-CHAR16            *gMoveHighlight;\r
-CHAR16            *gDecNumericInput;\r
-CHAR16            *gHexNumericInput;\r
-CHAR16            *gToggleCheckBox;\r
-CHAR16            *gLibEmptyString;\r
-CHAR16            *gAreYouSure;\r
-CHAR16            *gYesResponse;\r
-CHAR16            *gNoResponse;\r
-CHAR16            *gPlusString;\r
-CHAR16            *gMinusString;\r
-CHAR16            *gAdjustNumber;\r
-CHAR16            *gSaveChanges;\r
-CHAR16            *gNvUpdateMessage;\r
-CHAR16            *gInputErrorMessage;\r
-\r
-/**\r
-\r
-  Print banner info for front page.\r
-\r
-  @param[in]  FormData             Form Data to be shown in Page\r
-  \r
-**/\r
-VOID\r
-PrintBannerInfo ( \r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  )\r
-{\r
-  UINT8                  Line;\r
-  UINT8                  Alignment;\r
-  CHAR16                 *StrFrontPageBanner;\r
-  UINT8                  RowIdx;\r
-  UINT8                  ColumnIdx;\r
-\r
-  //\r
-  //    ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
-  //\r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn,\r
-    gScreenDimensions.RightColumn,\r
-    gScreenDimensions.TopRow,\r
-    FRONT_PAGE_HEADER_HEIGHT - 1 + gScreenDimensions.TopRow,\r
-    BANNER_TEXT | BANNER_BACKGROUND\r
-    );\r
-\r
-  //\r
-  //    for (Line = 0; Line < BANNER_HEIGHT; Line++) {\r
-  //\r
-  for (Line = (UINT8) gScreenDimensions.TopRow; Line < BANNER_HEIGHT + (UINT8) gScreenDimensions.TopRow; Line++) {\r
-    //\r
-    //      for (Alignment = 0; Alignment < BANNER_COLUMNS; Alignment++) {\r
-    //\r
-    for (Alignment = (UINT8) gScreenDimensions.LeftColumn;\r
-         Alignment < BANNER_COLUMNS + (UINT8) gScreenDimensions.LeftColumn;\r
-         Alignment++\r
-        ) {\r
-      RowIdx    = (UINT8) (Line - (UINT8) gScreenDimensions.TopRow);\r
-      ColumnIdx = (UINT8) (Alignment - (UINT8) gScreenDimensions.LeftColumn);\r
-  \r
-      ASSERT (RowIdx < BANNER_HEIGHT && ColumnIdx < BANNER_COLUMNS);\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
-      switch (Alignment - gScreenDimensions.LeftColumn) {\r
-      case 0:\r
-        //\r
-        // Handle left column\r
-        //\r
-        PrintStringAt (gScreenDimensions.LeftColumn + BANNER_LEFT_COLUMN_INDENT, Line, StrFrontPageBanner);\r
-        break;\r
-  \r
-      case 1:\r
-        //\r
-        // Handle center column\r
-        //\r
-        PrintStringAt (\r
-          gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3,\r
-          Line,\r
-          StrFrontPageBanner\r
-          );\r
-        break;\r
-  \r
-      case 2:\r
-        //\r
-        // Handle right column\r
-        //\r
-        PrintStringAt (\r
-          gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) * 2 / 3,\r
-          Line,\r
-          StrFrontPageBanner\r
-          );\r
-        break;\r
-      }\r
-  \r
-      FreePool (StrFrontPageBanner);\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Print framework and form title for a page.\r
-\r
-  @param[in]  FormData             Form Data to be shown in Page\r
-**/\r
-VOID\r
-PrintFramework (\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
-\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
-  Character = BOXDRAW_HORIZONTAL;\r
-  for (Index = 0; Index + 2 < (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn); Index++) {\r
-    Buffer[Index] = Character;\r
-  }\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
-  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow, 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
-  //\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
-    gScreenDimensions.TopRow + 1,\r
-    TitleStr\r
-    );\r
-  FreePool (TitleStr);\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
-  Character = BOXDRAW_UP_RIGHT;\r
-  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
-\r
-  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-  Character = BOXDRAW_UP_LEFT;\r
-  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-  \r
-  FreePool (Buffer);\r
-}\r
-\r
-/**\r
-  Process some op code which is not recognized by browser core.\r
-\r
-  @param OpCodeData                  The pointer to the op code buffer.\r
-\r
-  @return EFI_SUCCESS            Pass the statement success.\r
-\r
-**/\r
-VOID\r
-ProcessUserOpcode(\r
-  IN  EFI_IFR_OP_HEADER         *OpCodeData\r
-  )\r
-{\r
-  switch (OpCodeData->OpCode) {\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
-        //\r
-        switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
-        case EFI_IFR_EXTEND_OP_LABEL:\r
-          //\r
-          // just ignore label\r
-          //\r
-          break;\r
-\r
-        case EFI_IFR_EXTEND_OP_BANNER:\r
-          //\r
-          // Only in front page form set, we care about the banner data.\r
-          //\r
-          if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
-            //\r
-            // Initialize Driver private data\r
-            //\r
-            if (gBannerData == NULL) {\r
-              gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
-              ASSERT (gBannerData != NULL);\r
-            }\r
-            \r
-            CopyMem (\r
-              &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
-              ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
-              &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
-              sizeof (EFI_STRING_ID)\r
-              );\r
-          }\r
-          break;\r
-\r
-        case EFI_IFR_EXTEND_OP_SUBCLASS:\r
-          if (((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
-            gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
-          }\r
-          break;\r
-\r
-        default:\r
-          break;\r
-        }\r
-      }\r
-      break;\r
-\r
-    default:\r
-      break;\r
-  }\r
-}\r
-\r
-/**\r
-  Process some op codes which is out side of current form.\r
-  \r
-  @param FormData                Pointer to the form data.\r
-\r
-  @return EFI_SUCCESS            Pass the statement success.\r
-\r
-**/\r
-VOID\r
-ProcessExternedOpcode (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  )\r
-{\r
-  LIST_ENTRY                    *Link;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
-\r
-  Link = GetFirstNode (&FormData->StatementListOSF);\r
-  while (!IsNull (&FormData->StatementListOSF, Link)) {\r
-    Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&FormData->StatementListOSF, Link);\r
-\r
-    ProcessUserOpcode(Statement->OpCode);\r
-  }\r
-\r
-  Link = GetFirstNode (&FormData->StatementListHead);\r
-  while (!IsNull (&FormData->StatementListHead, Link)) {\r
-    Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&FormData->StatementListHead, Link);\r
-\r
-    ProcessUserOpcode(Statement->OpCode);\r
-  }\r
-}\r
-\r
-/**\r
-  Validate the input screen diemenstion info.\r
-\r
-  @param  FormData               The input form data info.\r
-\r
-  @return EFI_SUCCESS            The input screen info is acceptable.\r
-  @return EFI_INVALID_PARAMETER  The input screen info is not acceptable.\r
-\r
-**/\r
-EFI_STATUS \r
-ScreenDiemensionInfoValidate (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  )\r
-{\r
-  LIST_ENTRY           *Link;\r
-  UINTN                Index;\r
-\r
-  //\r
-  // Calculate total number of Register HotKeys. \r
-  //\r
-  Index = 0;\r
-  if (!IsListEmpty (&FormData->HotKeyListHead)){\r
-    Link  = GetFirstNode (&FormData->HotKeyListHead);\r
-    while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
-      Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
-      Index ++;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Show three HotKeys help information on one row.\r
-  //\r
-  gFooterHeight = FOOTER_HEIGHT + (Index / 3);\r
-\r
-\r
-  ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-  gST->ConOut->QueryMode (\r
-                 gST->ConOut,\r
-                 gST->ConOut->Mode->Mode,\r
-                 &gScreenDimensions.RightColumn,\r
-                 &gScreenDimensions.BottomRow\r
-                 );\r
-\r
-  //\r
-  // Check local dimension vs. global dimension.\r
-  //\r
-  if (FormData->ScreenDimensions != NULL) {\r
-    if ((gScreenDimensions.RightColumn < FormData->ScreenDimensions->RightColumn) ||\r
-        (gScreenDimensions.BottomRow < FormData->ScreenDimensions->BottomRow)\r
-        ) {\r
-      return EFI_INVALID_PARAMETER;\r
-    } else {\r
-      //\r
-      // Local dimension validation.\r
-      //\r
-      if ((FormData->ScreenDimensions->RightColumn > FormData->ScreenDimensions->LeftColumn) &&\r
-          (FormData->ScreenDimensions->BottomRow > FormData->ScreenDimensions->TopRow) &&\r
-          ((FormData->ScreenDimensions->RightColumn - FormData->ScreenDimensions->LeftColumn) > 2) &&\r
-          ((FormData->ScreenDimensions->BottomRow - FormData->ScreenDimensions->TopRow) > STATUS_BAR_HEIGHT +\r
-            FRONT_PAGE_HEADER_HEIGHT + gFooterHeight + 3)) {\r
-        CopyMem (&gScreenDimensions, (VOID *) FormData->ScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-      } else {\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Get the string based on the StringId and HII Package List Handle.\r
-\r
-  @param  Token                  The String's ID.\r
-  @param  HiiHandle              The package list in the HII database to search for\r
-                                 the specified string.\r
-\r
-  @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-LibGetToken (\r
-  IN  EFI_STRING_ID                Token,\r
-  IN  EFI_HII_HANDLE               HiiHandle\r
-  )\r
-{\r
-  EFI_STRING  String;\r
-\r
-  String = HiiGetString (HiiHandle, Token, NULL);\r
-  if (String == NULL) {\r
-    String = AllocateCopyPool (StrSize (mLibUnknownString), mLibUnknownString);\r
-    ASSERT (String != NULL);\r
-  }\r
-\r
-  return (CHAR16 *) String;\r
-}\r
-\r
-\r
-/**\r
-  Count the storage space of a Unicode string.\r
-\r
-  This function handles the Unicode string with NARROW_CHAR\r
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
-  does not count in the resultant output. If a WIDE_CHAR is\r
-  hit, then 2 Unicode character will consume an output storage\r
-  space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
-  If String is NULL, then ASSERT ().\r
-\r
-  @param String          The input string to be counted.\r
-\r
-  @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-LibGetStringWidth (\r
-  IN CHAR16               *String\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Count;\r
-  UINTN IncrementValue;\r
-\r
-  ASSERT (String != NULL);\r
-  if (String == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  Index           = 0;\r
-  Count           = 0;\r
-  IncrementValue  = 1;\r
-\r
-  do {\r
-    //\r
-    // Advance to the null-terminator or to the first width directive\r
-    //\r
-    for (;\r
-         (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
-         Index++, Count = Count + IncrementValue\r
-        )\r
-      ;\r
-\r
-    //\r
-    // We hit the null-terminator, we now have a count\r
-    //\r
-    if (String[Index] == 0) {\r
-      break;\r
-    }\r
-    //\r
-    // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
-    // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
-    //\r
-    if (String[Index] == NARROW_CHAR) {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 1;\r
-    } else {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 2;\r
-    }\r
-  } while (String[Index] != 0);\r
-\r
-  //\r
-  // Increment by one to include the null-terminator in the size\r
-  //\r
-  Count++;\r
-\r
-  return Count * sizeof (CHAR16);\r
-}\r
-\r
-/**\r
-  Show all registered HotKey help strings on bottom Rows.\r
-\r
-  @param FormData          The curent input form data info.\r
-\r
-**/\r
-VOID\r
-PrintHotKeyHelpString (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
-  )\r
-{\r
-  UINTN                  CurrentCol;\r
-  UINTN                  CurrentRow;\r
-  UINTN                  BottomRowOfHotKeyHelp;\r
-  UINTN                  ColumnWidth;\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
-\r
-  CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-  ColumnWidth            = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
-  BottomRowOfHotKeyHelp  = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
-\r
-  //\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
-    } else {\r
-      CurrentCol = LocalScreen.LeftColumn + 2;\r
-    }\r
-    CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
-    //\r
-    // Print HotKey help string on bottom Row.\r
-    //\r
-    PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
-\r
-    //\r
-    // Get Next Hot Key.\r
-    //\r
-    Link = GetNextNode (&FormData->HotKeyListHead, Link);\r
-    Index ++;\r
-  }\r
-  \r
-  return;\r
-}\r
-\r
-/**\r
-  Get step info from numeric opcode.\r
-  \r
-  @param[in] OpCode     The input numeric op code.\r
-\r
-  @return step info for this opcode.\r
-**/\r
-UINT64\r
-LibGetFieldFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode\r
-  )\r
-{\r
-  EFI_IFR_NUMERIC       *NumericOp;\r
-  UINT64                Step;\r
-\r
-  NumericOp = (EFI_IFR_NUMERIC *) OpCode;\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
-  case EFI_IFR_NUMERIC_SIZE_2:\r
-    Step    = NumericOp->data.u16.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_4:\r
-    Step    = NumericOp->data.u32.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_8:\r
-    Step    = NumericOp->data.u64.Step;\r
-    break;\r
-  \r
-  default:\r
-    Step = 0;\r
-    break;\r
-  }\r
-\r
-  return Step;\r
-}\r
-\r
-/**\r
-  Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeLibStrings (\r
-  VOID\r
-  )\r
-{\r
-  mLibUnknownString        = L"!";\r
-\r
-  gEnterString          = LibGetToken (STRING_TOKEN (ENTER_STRING), mCDLStringPackHandle);\r
-  gEnterCommitString    = LibGetToken (STRING_TOKEN (ENTER_COMMIT_STRING), mCDLStringPackHandle);\r
-  gEnterEscapeString    = LibGetToken (STRING_TOKEN (ENTER_ESCAPE_STRING), mCDLStringPackHandle);\r
-  gEscapeString         = LibGetToken (STRING_TOKEN (ESCAPE_STRING), mCDLStringPackHandle);\r
-  gMoveHighlight        = LibGetToken (STRING_TOKEN (MOVE_HIGHLIGHT), mCDLStringPackHandle);\r
-  gDecNumericInput      = LibGetToken (STRING_TOKEN (DEC_NUMERIC_INPUT), mCDLStringPackHandle);\r
-  gHexNumericInput      = LibGetToken (STRING_TOKEN (HEX_NUMERIC_INPUT), mCDLStringPackHandle);\r
-  gToggleCheckBox       = LibGetToken (STRING_TOKEN (TOGGLE_CHECK_BOX), mCDLStringPackHandle);\r
-\r
-  gAreYouSure           = LibGetToken (STRING_TOKEN (ARE_YOU_SURE), mCDLStringPackHandle);\r
-  gYesResponse          = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_YES), mCDLStringPackHandle);\r
-  gNoResponse           = LibGetToken (STRING_TOKEN (ARE_YOU_SURE_NO), mCDLStringPackHandle);\r
-  gPlusString           = LibGetToken (STRING_TOKEN (PLUS_STRING), mCDLStringPackHandle);\r
-  gMinusString          = LibGetToken (STRING_TOKEN (MINUS_STRING), mCDLStringPackHandle);\r
-  gAdjustNumber         = LibGetToken (STRING_TOKEN (ADJUST_NUMBER), mCDLStringPackHandle);\r
-  gSaveChanges          = LibGetToken (STRING_TOKEN (SAVE_CHANGES), mCDLStringPackHandle);\r
-\r
-  gLibEmptyString       = LibGetToken (STRING_TOKEN (EMPTY_STRING), mCDLStringPackHandle);\r
-\r
-  gNvUpdateMessage      = LibGetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), mCDLStringPackHandle);\r
-  gInputErrorMessage    = LibGetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), mCDLStringPackHandle);\r
-  \r
-  //\r
-  // SpaceBuffer;\r
-  //\r
-  mSpaceBuffer = AllocatePool ((SPACE_BUFFER_SIZE + 1) * sizeof (CHAR16));\r
-  ASSERT (mSpaceBuffer != NULL);\r
-  LibSetUnicodeMem (mSpaceBuffer, SPACE_BUFFER_SIZE, L' ');\r
-  mSpaceBuffer[SPACE_BUFFER_SIZE] = L'\0';\r
-}\r
-\r
-\r
-/**\r
-  Free the HII String.\r
-\r
-**/\r
-VOID\r
-FreeLibStrings (\r
-  VOID\r
-  )\r
-{\r
-  FreePool (gEnterString);\r
-  FreePool (gEnterCommitString);\r
-  FreePool (gEnterEscapeString);\r
-  FreePool (gEscapeString);\r
-  FreePool (gMoveHighlight);\r
-  FreePool (gDecNumericInput);\r
-  FreePool (gHexNumericInput);\r
-  FreePool (gToggleCheckBox);\r
-\r
-  FreePool (gAreYouSure);\r
-  FreePool (gYesResponse);\r
-  FreePool (gNoResponse);\r
-  FreePool (gPlusString);\r
-  FreePool (gMinusString);\r
-  FreePool (gAdjustNumber);\r
-  FreePool (gSaveChanges);\r
-\r
-  FreePool (gLibEmptyString);\r
-\r
-  FreePool (gNvUpdateMessage);\r
-  FreePool (gInputErrorMessage);\r
-  \r
-  FreePool (mSpaceBuffer);\r
-}\r
-\r
-/**\r
-  Wait for a key to be pressed by user.\r
-\r
-  @param Key         The key which is pressed by user.\r
-\r
-  @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       Index;\r
-\r
-  while (TRUE) {\r
-    Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
-    if (!EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-\r
-    if (Status != EFI_NOT_READY) {\r
-      continue;\r
-    }\r
-    \r
-    gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &Index);\r
-  }\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-LibSetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  )\r
-{\r
-  CHAR16  *Ptr;\r
-\r
-  Ptr = Buffer;\r
-  while ((Size--)  != 0) {\r
-    *(Ptr++) = Value;\r
-  }\r
-}\r
-\r
-/**\r
-  The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL\r
-  protocol instance.\r
-\r
-  @param Width           Width of string to be print.\r
-  @param Column          The position of the output string.\r
-  @param Row             The position of the output string.\r
-  @param Out             The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.\r
-  @param Fmt             The format string.\r
-  @param Args            The additional argument for the variables in the format string.\r
-\r
-  @return Number of Unicode character printed.\r
-\r
-**/\r
-UINTN\r
-PrintInternal (\r
-  IN UINTN                            Width, \r
-  IN UINTN                            Column,\r
-  IN UINTN                            Row,\r
-  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,\r
-  IN CHAR16                           *Fmt,\r
-  IN VA_LIST                          Args\r
-  )\r
-{\r
-  CHAR16  *Buffer;\r
-  CHAR16  *BackupBuffer;\r
-  UINTN   Index;\r
-  UINTN   PreviousIndex;\r
-  UINTN   Count;\r
-  UINTN   PrintWidth;\r
-  UINTN   CharWidth;\r
-\r
-  //\r
-  // For now, allocate an arbitrarily long buffer\r
-  //\r
-  Buffer        = AllocateZeroPool (0x10000);\r
-  BackupBuffer  = AllocateZeroPool (0x10000);\r
-  ASSERT (Buffer);\r
-  ASSERT (BackupBuffer);\r
-\r
-  if (Column != (UINTN) -1) {\r
-    Out->SetCursorPosition (Out, Column, Row);\r
-  }\r
-\r
-  UnicodeVSPrint (Buffer, 0x10000, Fmt, Args);\r
-\r
-  Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-\r
-  Out->SetAttribute (Out, Out->Mode->Attribute);\r
-\r
-  Index         = 0;\r
-  PreviousIndex = 0;\r
-  Count         = 0;\r
-  PrintWidth    = 0;\r
-  CharWidth     = 1;\r
-\r
-  do {\r
-    for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
-      BackupBuffer[Index] = Buffer[Index];\r
-    }\r
-\r
-    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
-    PrintWidth += Count * CharWidth;\r
-\r
-    //\r
-    // Preserve the current index + 1, since this is where we will start printing from next\r
-    //\r
-    PreviousIndex = Index + 1;\r
-\r
-    //\r
-    // We are at a narrow or wide character directive.  Set attributes and strip it and print it\r
-    //\r
-    if (Buffer[Index] == NARROW_CHAR) {\r
-      //\r
-      // Preserve bits 0 - 6 and zero out the rest\r
-      //\r
-      Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-      Out->SetAttribute (Out, Out->Mode->Attribute);\r
-      CharWidth = 1;\r
-    } else {\r
-      //\r
-      // Must be wide, set bit 7 ON\r
-      //\r
-      Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE;\r
-      Out->SetAttribute (Out, Out->Mode->Attribute);\r
-      CharWidth = 2;\r
-    }\r
-\r
-    Index++;\r
-\r
-  } while (Buffer[Index] != 0);\r
-\r
-  //\r
-  // We hit the end of the string - print it\r
-  //\r
-  Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
-  PrintWidth += Count * CharWidth;\r
-  if (PrintWidth < Width) {\r
-    Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-    Out->SetAttribute (Out, Out->Mode->Attribute);\r
-    Out->OutputString (Out, &mSpaceBuffer[SPACE_BUFFER_SIZE - Width + PrintWidth]);\r
-  }\r
-\r
-  FreePool (Buffer);\r
-  FreePool (BackupBuffer);\r
-  return Count;\r
-}\r
-\r
-/**\r
-  Prints a formatted unicode string to the default console, at\r
-  the supplied cursor position.\r
-\r
-  @param  Width      Width of String to be printed.\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at.\r
-  @param  Fmt        Format string.\r
-  @param  ...        Variable argument list for format string.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintAt (\r
-  IN UINTN     Width,\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *Fmt,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Args;\r
-  UINTN   LengthOfPrinted;\r
-\r
-  VA_START (Args, Fmt);\r
-  LengthOfPrinted = PrintInternal (Width, Column, Row, gST->ConOut, Fmt, Args);\r
-  VA_END (Args);\r
-  return LengthOfPrinted;\r
-}\r
-\r
diff --git a/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.h b/MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.h
deleted file mode 100644 (file)
index ccbd45f..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/** @file\r
-\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
-\r
-**/\r
-\r
-#ifndef __CUSTOMIZED_DISPLAY_LIB_INTERNAL_H__\r
-#define __CUSTOMIZED_DISPLAY_LIB_INTERNAL_H__\r
-\r
-\r
-\r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/SimpleTextOut.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/FormBrowser2.h>\r
-#include <Protocol/FormBrowserEx2.h>\r
-#include <Protocol/DisplayProtocol.h>\r
-#include <Protocol/DevicePath.h>\r
-#include <Protocol/UnicodeCollation.h>\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/HiiConfigRouting.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/UserManager.h>\r
-#include <Protocol/DevicePathFromText.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-#include <Guid/HiiPlatformSetupFormset.h>\r
-#include <Guid/HiiFormMapMethodGuid.h>\r
-\r
-#include <Library/PrintLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/PcdLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/CustomizedDisplayLib.h>\r
-\r
-#include "Colors.h"\r
-\r
-\r
-\r
-#define FORMSET_CLASS_PLATFORM_SETUP         0x0001\r
-#define FORMSET_CLASS_FRONT_PAGE             0x0002\r
-\r
-\r
-#define FRONT_PAGE_HEADER_HEIGHT      6\r
-#define NONE_FRONT_PAGE_HEADER_HEIGHT 3\r
-#define FOOTER_HEIGHT                 4\r
-#define STATUS_BAR_HEIGHT             1\r
-\r
-//\r
-// Screen definitions\r
-//\r
-#define BANNER_HEIGHT                 6\r
-#define BANNER_COLUMNS                3\r
-#define BANNER_LEFT_COLUMN_INDENT     1\r
-\r
-//\r
-// Character definitions\r
-//\r
-#define UPPER_LOWER_CASE_OFFSET 0x20\r
-\r
-//\r
-// This is the Input Error Message\r
-//\r
-#define INPUT_ERROR 1\r
-\r
-//\r
-// This is the NV RAM update required Message\r
-//\r
-#define NV_UPDATE_REQUIRED  2\r
-\r
-typedef struct {\r
-  EFI_STRING_ID  Banner[BANNER_HEIGHT][BANNER_COLUMNS];\r
-} BANNER_DATA;\r
-\r
-extern  UINT16                        gClassOfVfr;                 // Formset class information\r
-extern  BANNER_DATA                   *gBannerData;\r
-extern  EFI_SCREEN_DESCRIPTOR         gScreenDimensions;\r
-extern  UINTN                         gFooterHeight;\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-extern CHAR16            *gEnterString;\r
-extern CHAR16            *gEnterCommitString;\r
-extern CHAR16            *gEnterEscapeString;\r
-extern CHAR16            *gEscapeString;\r
-extern CHAR16            *gMoveHighlight;\r
-extern CHAR16            *gDecNumericInput;\r
-extern CHAR16            *gHexNumericInput;\r
-extern CHAR16            *gToggleCheckBox;\r
-extern CHAR16            *gLibEmptyString;\r
-extern CHAR16            *gAreYouSure;\r
-extern CHAR16            *gYesResponse;\r
-extern CHAR16            *gNoResponse;\r
-extern CHAR16            *gPlusString;\r
-extern CHAR16            *gMinusString;\r
-extern CHAR16            *gAdjustNumber;\r
-extern CHAR16            *gSaveChanges;\r
-extern CHAR16            *gNvUpdateMessage;\r
-extern CHAR16            *gInputErrorMessage;\r
-/**\r
-\r
-  Print banner info for front page.\r
-\r
-  @param[in]  FormData             Form Data to be shown in Page\r
-  \r
-**/\r
-VOID\r
-PrintBannerInfo ( \r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  );\r
-\r
-/**\r
-  Print framework and form title for a page.\r
-\r
-  @param[in]  FormData             Form Data to be shown in Page\r
-**/\r
-VOID\r
-PrintFramework (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  );\r
-\r
-/**\r
-  Validate the input screen diemenstion info.\r
-\r
-  @param  FormData               The input form data info.\r
-\r
-  @return EFI_SUCCESS            The input screen info is acceptable.\r
-  @return EFI_INVALID_PARAMETER  The input screen info is not acceptable.\r
-\r
-**/\r
-EFI_STATUS \r
-ScreenDiemensionInfoValidate (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  );\r
-\r
-/**\r
-  Get the string based on the StringId and HII Package List Handle.\r
-\r
-  @param  Token                  The String's ID.\r
-  @param  HiiHandle              The package list in the HII database to search for\r
-                                 the specified string.\r
-\r
-  @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-LibGetToken (\r
-  IN  EFI_STRING_ID                Token,\r
-  IN  EFI_HII_HANDLE               HiiHandle\r
-  );\r
-\r
-/**\r
-  Count the storage space of a Unicode string.\r
-\r
-  This function handles the Unicode string with NARROW_CHAR\r
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
-  does not count in the resultant output. If a WIDE_CHAR is\r
-  hit, then 2 Unicode character will consume an output storage\r
-  space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
-  If String is NULL, then ASSERT ().\r
-\r
-  @param String          The input string to be counted.\r
-\r
-  @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-LibGetStringWidth (\r
-  IN CHAR16               *String\r
-  );\r
-\r
-/**\r
-  Show all registered HotKey help strings on bottom Rows.\r
-\r
-  @param FormData          The curent input form data info.\r
-\r
-**/\r
-VOID\r
-PrintHotKeyHelpString (\r
-  IN FORM_DISPLAY_ENGINE_FORM      *FormData\r
-  );\r
-  \r
-/**\r
-  Get step info from numeric opcode.\r
-  \r
-  @param[in] OpCode     The input numeric op code.\r
-\r
-  @return step info for this opcode.\r
-**/\r
-UINT64\r
-LibGetFieldFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode\r
-  );\r
-\r
-/**\r
-  Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeLibStrings (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Free the HII String.\r
-\r
-**/\r
-VOID\r
-FreeLibStrings (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Wait for a key to be pressed by user.\r
-\r
-  @param Key         The key which is pressed by user.\r
-\r
-  @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
-  );\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-LibSetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  );\r
-\r
-/**\r
-  Prints a formatted unicode string to the default console, at\r
-  the supplied cursor position.\r
-\r
-  @param  Width      Width of String to be printed.\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at.\r
-  @param  Fmt        Format string.\r
-  @param  ...        Variable argument list for format string.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintAt (\r
-  IN UINTN     Width,\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *Fmt,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Process some op codes which is out side of current form.\r
-  \r
-  @param FormData                Pointer to the form data.\r
-\r
-**/\r
-VOID\r
-ProcessExternedOpcode (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  );\r
-\r
-#endif\r
index 4ae24eb80ee86563689e5b52243816ae0e6314c6..31055192973ea8179645fbff4757770d0808ce80 100644 (file)
   #\r
   CpuExceptionHandlerLib|Include/Library/CpuExceptionHandlerLib.h\r
   \r
-  ##  @libraryclass    Provides platform specific display interface.\r
-  #\r
-  CustomizedDisplayLib|Include/Library/CustomizedDisplayLib.h\r
-\r
 [Guids]\r
   ## MdeModule package token space guid\r
   # Include/Guid/MdeModulePkgTokenSpace.h\r
   ## Include/Protocol/BootLogo.h\r
   gEfiBootLogoProtocolGuid = { 0xcdea2bd3, 0xfc25, 0x4c1c, { 0xb9, 0x7c, 0xb3, 0x11, 0x86, 0x6, 0x49, 0x90 } }\r
 \r
-  ## Include/Protocol/DisplayProtocol.h\r
-  gEdkiiFormDisplayEngineProtocolGuid = { 0x9bbe29e9, 0xfda1, 0x41ec, { 0xad, 0x52, 0x45, 0x22, 0x13, 0x74, 0x2d, 0x2e } }\r
-\r
-  ## Include/Protocol/FormBrowserEx2.h\r
-  gEdkiiFormBrowserEx2ProtocolGuid = { 0xa770c357, 0xb693, 0x4e6d, { 0xa6, 0xcf, 0xd2, 0x1c, 0x72, 0x8e, 0x55, 0xb } }\r
-\r
 [PcdsFeatureFlag]\r
   ## Indicate whether platform can support update capsule across a system reset\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdSupportUpdateCapsuleReset|FALSE|BOOLEAN|0x0001001d\r
index 7895834c245fc90b10bfa47427bb8b63c78d5cce..781fbbf3b45a88b9a5003fdbbca6986ffb3688e5 100644 (file)
@@ -76,7 +76,6 @@
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf\r
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   PalLib|MdePkg/Library/BasePalLibNull/BasePalLibNull.inf\r
-  CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf\r
   #\r
   # Misc\r
   #\r
 \r
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
   MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
-  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf\r
   MdeModulePkg/Application/VariableInfo/VariableInfo.inf\r
   MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf\r
   MdeModulePkg/Universal/Variable/Pei/VariablePei.inf\r
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf b/MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
deleted file mode 100644 (file)
index 323fcad..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-## @file\r
-# The DXE driver produces FORM BROWSER protocols defined in UEFI HII 2.1 specificatin.\r
-#\r
-# Copyright (c) 2007 - 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
-#\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
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = DisplayEngine\r
-  FILE_GUID                      = E660EA85-058E-4b55-A54B-F02F83A24707\r
-  MODULE_TYPE                    = DXE_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  ENTRY_POINT                    = InitializeDisplayEngine\r
-  UNLOAD_IMAGE                   = UnloadDisplayEngine\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
-  FormDisplayStr.uni\r
-  FormDisplay.c\r
-  FormDisplay.h\r
-  ProcessOptions.c\r
-  InputHandler.c\r
-  \r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-  MdeModulePkg/MdeModulePkg.dec\r
-  \r
-[LibraryClasses]\r
-  UefiDriverEntryPoint\r
-  UefiBootServicesTableLib\r
-  DebugLib\r
-  BaseMemoryLib\r
-  BaseLib\r
-  PrintLib\r
-  HiiLib\r
-  MemoryAllocationLib\r
-  CustomizedDisplayLib\r
-\r
-[Protocols]\r
-  gEdkiiFormDisplayEngineProtocolGuid\r
-  gEdkiiFormBrowserEx2ProtocolGuid\r
-\r
-[Guids]\r
-  gEfiIfrTianoGuid                              ## CONSUMES  ## GUID  \r
-  \r
-[Depex]\r
-  gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid AND gEdkiiFormBrowserEx2ProtocolGuid\r
-  \r
-[FeaturePcd]\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserGrayOutTextStatement            ## CONSUMES\r
-  gEfiMdeModulePkgTokenSpaceGuid.PcdBrowerGrayOutReadOnlyMenu              ## CONSUMES\r
-\r
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
deleted file mode 100644 (file)
index a07cc75..0000000
+++ /dev/null
@@ -1,3255 +0,0 @@
-/** @file\r
-Entry and initialization module for the browser.\r
-\r
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\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
-\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
-#include "FormDisplay.h"\r
-\r
-//\r
-// Search table for UiDisplayMenu()\r
-//\r
-SCAN_CODE_TO_SCREEN_OPERATION     gScanCodeToOperation[] = {\r
-  {\r
-    SCAN_UP,\r
-    UiUp,\r
-  },\r
-  {\r
-    SCAN_DOWN,\r
-    UiDown,\r
-  },\r
-  {\r
-    SCAN_PAGE_UP,\r
-    UiPageUp,\r
-  },\r
-  {\r
-    SCAN_PAGE_DOWN,\r
-    UiPageDown,\r
-  },\r
-  {\r
-    SCAN_ESC,\r
-    UiReset,\r
-  },\r
-  {\r
-    SCAN_LEFT,\r
-    UiLeft,\r
-  },\r
-  {\r
-    SCAN_RIGHT,\r
-    UiRight,\r
-  }\r
-};\r
-\r
-UINTN mScanCodeNumber = sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]);\r
-\r
-SCREEN_OPERATION_T0_CONTROL_FLAG  gScreenOperationToControlFlag[] = {\r
-  {\r
-    UiNoOperation,\r
-    CfUiNoOperation,\r
-  },\r
-  {\r
-    UiSelect,\r
-    CfUiSelect,\r
-  },\r
-  {\r
-    UiUp,\r
-    CfUiUp,\r
-  },\r
-  {\r
-    UiDown,\r
-    CfUiDown,\r
-  },\r
-  {\r
-    UiLeft,\r
-    CfUiLeft,\r
-  },\r
-  {\r
-    UiRight,\r
-    CfUiRight,\r
-  },\r
-  {\r
-    UiReset,\r
-    CfUiReset,\r
-  },\r
-  {\r
-    UiPageUp,\r
-    CfUiPageUp,\r
-  },\r
-  {\r
-    UiPageDown,\r
-    CfUiPageDown\r
-  }, \r
-  {\r
-    UiHotKey,\r
-    CfUiHotKey\r
-  }\r
-};\r
-\r
-EFI_GUID  gDisplayEngineGuid = {\r
-  0xE38C1029, 0xE38F, 0x45b9, {0x8F, 0x0D, 0xE2, 0xE6, 0x0B, 0xC9, 0xB2, 0x62}\r
-};\r
-\r
-FORM_ENTRY_INFO               gFormEntryInfo;\r
-UINTN                         gSequence;\r
-EFI_SCREEN_DESCRIPTOR         gStatementDimensions;\r
-BOOLEAN                       mStatementLayoutIsChanged = TRUE;\r
-USER_INPUT                    *gUserInput;\r
-FORM_DISPLAY_ENGINE_FORM      *gFormData;\r
-EFI_HII_HANDLE                gHiiHandle;\r
-UINT16                        gDirection;\r
-LIST_ENTRY                    gMenuOption;\r
-DISPLAY_HIGHLIGHT_MENU_INFO   gHighligthMenuInfo = {0};\r
-BOOLEAN                       mIsFirstForm = TRUE;\r
-FORM_ENTRY_INFO               gOldFormEntry = {0};\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-CHAR16            *gFormNotFound;\r
-CHAR16            *gNoSubmitIf;\r
-CHAR16            *gBrwoserError;\r
-CHAR16            *gSaveFailed;\r
-CHAR16            *gPromptForData;\r
-CHAR16            *gPromptForPassword;\r
-CHAR16            *gPromptForNewPassword;\r
-CHAR16            *gConfirmPassword;\r
-CHAR16            *gConfirmError;\r
-CHAR16            *gPassowordInvalid;\r
-CHAR16            *gPressEnter;\r
-CHAR16            *gEmptyString;\r
-CHAR16            *gMiniString;\r
-CHAR16            *gOptionMismatch;\r
-CHAR16            *gFormSuppress;\r
-CHAR16            *gProtocolNotFound;\r
-\r
-CHAR16            gPromptBlockWidth;\r
-CHAR16            gOptionBlockWidth;\r
-CHAR16            gHelpBlockWidth;\r
-CHAR16            *mUnknownString;\r
-\r
-FORM_DISPLAY_DRIVER_PRIVATE_DATA  mPrivateData = {\r
-  FORM_DISPLAY_DRIVER_SIGNATURE,\r
-  NULL,\r
-  {\r
-    FormDisplay,\r
-    DriverClearDisplayPage,\r
-    ConfirmDataChange\r
-  }\r
-};\r
-\r
-\r
-/**\r
-  Get the string based on the StringId and HII Package List Handle.\r
-\r
-  @param  Token                  The String's ID.\r
-  @param  HiiHandle              The package list in the HII database to search for\r
-                                 the specified string.\r
-\r
-  @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-GetToken (\r
-  IN  EFI_STRING_ID                Token,\r
-  IN  EFI_HII_HANDLE               HiiHandle\r
-  )\r
-{\r
-  EFI_STRING  String;\r
-\r
-  String = HiiGetString (HiiHandle, Token, NULL);\r
-  if (String == NULL) {\r
-    String = AllocateCopyPool (StrSize (mUnknownString), mUnknownString);\r
-    ASSERT (String != NULL);\r
-  }\r
-\r
-  return (CHAR16 *) String;\r
-}\r
-\r
-\r
-/**\r
-  Initialize the HII String Token to the correct values.\r
-\r
-**/\r
-VOID\r
-InitializeDisplayStrings (\r
-  VOID\r
-  )\r
-{\r
-  mUnknownString        = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);\r
-  gSaveFailed           = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
-  gPromptForData        = GetToken (STRING_TOKEN (PROMPT_FOR_DATA), gHiiHandle);\r
-  gPromptForPassword    = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle);\r
-  gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle);\r
-  gConfirmPassword      = GetToken (STRING_TOKEN (CONFIRM_PASSWORD), gHiiHandle);\r
-  gConfirmError         = GetToken (STRING_TOKEN (CONFIRM_ERROR), gHiiHandle);\r
-  gPassowordInvalid     = GetToken (STRING_TOKEN (PASSWORD_INVALID), gHiiHandle);\r
-  gPressEnter           = GetToken (STRING_TOKEN (PRESS_ENTER), gHiiHandle);\r
-  gEmptyString          = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
-  gMiniString           = GetToken (STRING_TOKEN (MINI_STRING), gHiiHandle);\r
-  gOptionMismatch       = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle);\r
-  gFormSuppress         = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle);\r
-  gProtocolNotFound     = GetToken (STRING_TOKEN (PROTOCOL_NOT_FOUND), gHiiHandle);\r
-  gFormNotFound         = GetToken (STRING_TOKEN (STATUS_BROWSER_FORM_NOT_FOUND), gHiiHandle);\r
-  gNoSubmitIf           = GetToken (STRING_TOKEN (STATUS_BROWSER_NO_SUBMIT_IF), gHiiHandle);\r
-  gBrwoserError         = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);\r
-}\r
-\r
-/**\r
-  Free up the resource allocated for all strings required\r
-  by Setup Browser.\r
-\r
-**/\r
-VOID\r
-FreeDisplayStrings (\r
-  VOID\r
-  )\r
-{\r
-  FreePool (mUnknownString);\r
-  FreePool (gEmptyString);\r
-  FreePool (gSaveFailed);\r
-  FreePool (gPromptForData);\r
-  FreePool (gPromptForPassword);\r
-  FreePool (gPromptForNewPassword);\r
-  FreePool (gConfirmPassword);\r
-  FreePool (gConfirmError);\r
-  FreePool (gPassowordInvalid);\r
-  FreePool (gPressEnter);\r
-  FreePool (gMiniString);\r
-  FreePool (gOptionMismatch);\r
-  FreePool (gFormSuppress);\r
-  FreePool (gProtocolNotFound);\r
-  FreePool (gBrwoserError);\r
-  FreePool (gNoSubmitIf);\r
-  FreePool (gFormNotFound);\r
-}\r
-\r
-/**\r
-  Get prompt string id from the opcode data buffer.\r
-\r
-  @param  OpCode                 The input opcode buffer.\r
-\r
-  @return The prompt string id.\r
-\r
-**/\r
-EFI_STRING_ID\r
-GetPrompt (\r
-  IN EFI_IFR_OP_HEADER     *OpCode\r
-  )\r
-{\r
-  EFI_IFR_STATEMENT_HEADER  *Header;\r
-\r
-  if (OpCode->Length <= sizeof (EFI_IFR_OP_HEADER)) {\r
-    return 0;\r
-  }\r
-\r
-  Header = (EFI_IFR_STATEMENT_HEADER  *) (OpCode + 1);\r
-\r
-  return Header->Prompt;\r
-}\r
-\r
-/**\r
-  Get the supported width for a particular op-code\r
-\r
-  @param  Statement              The curent statement.\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
-  )\r
-{\r
-  CHAR16       *String;\r
-  UINTN        Size;\r
-  UINT16       Width;\r
-  EFI_IFR_TEXT *TestOp;\r
-\r
-  Size = 0;\r
-\r
-  //\r
-  // See if the second text parameter is really NULL\r
-  //\r
-  if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) {\r
-    TestOp = (EFI_IFR_TEXT *) Statement->OpCode;\r
-    if (TestOp->TextTwo != 0) {\r
-      String = GetToken (TestOp->TextTwo, gFormData->HiiHandle);\r
-      Size   = StrLen (String);\r
-      FreePool (String);\r
-    }\r
-  }\r
-\r
-  if ((Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) ||\r
-      (Statement->OpCode->OpCode == EFI_IFR_REF_OP) ||\r
-      (Statement->OpCode->OpCode == EFI_IFR_PASSWORD_OP) ||\r
-      (Statement->OpCode->OpCode == EFI_IFR_ACTION_OP) ||\r
-      (Statement->OpCode->OpCode == EFI_IFR_RESET_BUTTON_OP) ||\r
-      //\r
-      // Allow a wide display if text op-code and no secondary text op-code\r
-      //\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 (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
-}\r
-\r
-/**\r
-  Will copy LineWidth amount of a string in the OutputString buffer and return the\r
-  number of CHAR16 characters that were copied into the OutputString buffer.\r
-  The output string format is:\r
-    Glyph Info + String info + '\0'.\r
-\r
-  In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
-  @param  InputString            String description for this option.\r
-  @param  LineWidth              Width of the desired string to extract in CHAR16\r
-                                 characters\r
-  @param  GlyphWidth             The glyph width of the begin of the char in the string.\r
-  @param  Index                  Where in InputString to start the copy process\r
-  @param  OutputString           Buffer to copy the string into\r
-\r
-  @return Returns the number of CHAR16 characters that were copied into the OutputString \r
-  buffer, include extra glyph info and '\0' info.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
-  IN      CHAR16                      *InputString,\r
-  IN      UINT16                      LineWidth,\r
-  IN OUT  UINT16                      *GlyphWidth,\r
-  IN OUT  UINTN                       *Index,\r
-  OUT     CHAR16                      **OutputString\r
-  )\r
-{\r
-  UINT16          StrOffset;\r
-  UINT16          GlyphOffset;\r
-  UINT16          OriginalGlyphWidth;\r
-  BOOLEAN         ReturnFlag;\r
-  UINT16          LastSpaceOffset;\r
-  UINT16          LastGlyphWidth;\r
-\r
-  if (InputString == NULL || Index == NULL || OutputString == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  if (LineWidth == 0 || *GlyphWidth == 0) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Save original glyph width.\r
-  //\r
-  OriginalGlyphWidth = *GlyphWidth;\r
-  LastGlyphWidth     = OriginalGlyphWidth;\r
-  ReturnFlag         = FALSE;\r
-  LastSpaceOffset    = 0;\r
-\r
-  //\r
-  // NARROW_CHAR can not be printed in screen, so if a line only contain  the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line  in Screen.\r
-  // To avoid displaying this  empty line in screen,  just skip  the two CHARs here.\r
-  //\r
-  if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {\r
-    *Index = *Index + 2;\r
-  }\r
-\r
-  //\r
-  // Fast-forward the string and see if there is a carriage-return in the string\r
-  //\r
-  for (StrOffset = 0, GlyphOffset = 0; GlyphOffset <= LineWidth; StrOffset++) {\r
-    switch (InputString[*Index + StrOffset]) {\r
-      case NARROW_CHAR:\r
-        *GlyphWidth = 1;\r
-        break;\r
-\r
-      case WIDE_CHAR:\r
-        *GlyphWidth = 2;\r
-        break;\r
-\r
-      case CHAR_CARRIAGE_RETURN:\r
-      case CHAR_LINEFEED:\r
-      case CHAR_NULL:\r
-        ReturnFlag = TRUE;\r
-        break;\r
-\r
-      default:\r
-        GlyphOffset = GlyphOffset + *GlyphWidth;\r
-\r
-        //\r
-        // Record the last space info in this line. Will be used in rewind.\r
-        //\r
-        if ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) {\r
-          LastSpaceOffset = StrOffset;\r
-          LastGlyphWidth  = *GlyphWidth;\r
-        }\r
-        break;\r
-    }\r
-\r
-    if (ReturnFlag) {\r
-      break;\r
-    }\r
-  } \r
-\r
-  //\r
-  // Rewind the string from the maximum size until we see a space to break the line\r
-  //\r
-  if (GlyphOffset > LineWidth) {\r
-    //\r
-    // Rewind the string to last space char in this line.\r
-    //\r
-    if (LastSpaceOffset != 0) {\r
-      StrOffset   = LastSpaceOffset;\r
-      *GlyphWidth = LastGlyphWidth;\r
-    } else {\r
-      //\r
-      // Roll back to last char in the line width.\r
-      //\r
-      StrOffset--;\r
-    }\r
-  }\r
-\r
-  //\r
-  // The CHAR_NULL has process last time, this time just return 0 to stand for the end.\r
-  //\r
-  if (StrOffset == 0 && (InputString[*Index + StrOffset] == CHAR_NULL)) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Need extra glyph info and '\0' info, so +2.\r
-  //\r
-  *OutputString = AllocateZeroPool (((UINTN) (StrOffset + 2) * sizeof(CHAR16)));\r
-  if (*OutputString == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Save the glyph info at the begin of the string, will used by Print function.\r
-  //\r
-  if (OriginalGlyphWidth == 1) {\r
-    *(*OutputString) = NARROW_CHAR;\r
-  } else  {\r
-    *(*OutputString) = WIDE_CHAR;\r
-  }\r
-\r
-  CopyMem ((*OutputString) + 1, &InputString[*Index], StrOffset * sizeof(CHAR16));\r
-\r
-  if (InputString[*Index + StrOffset] == CHAR_SPACE) {\r
-    //\r
-    // Skip the space info at the begin of next line.\r
-    //  \r
-    *Index = (UINT16) (*Index + StrOffset + 1);\r
-  } else if (InputString[*Index + StrOffset] == CHAR_LINEFEED) {\r
-    //\r
-    // Skip the /n or /n/r info.\r
-    //\r
-    if (InputString[*Index + StrOffset + 1] == CHAR_CARRIAGE_RETURN) {\r
-      *Index = (UINT16) (*Index + StrOffset + 2);\r
-    } else {\r
-      *Index = (UINT16) (*Index + StrOffset + 1);\r
-    }\r
-  } else if (InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN) {\r
-    //\r
-    // Skip the /r or /r/n info.\r
-    //  \r
-    if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) {\r
-      *Index = (UINT16) (*Index + StrOffset + 2);\r
-    } else {\r
-      *Index = (UINT16) (*Index + StrOffset + 1);\r
-    }\r
-  } else {\r
-    *Index = (UINT16) (*Index + StrOffset);\r
-  }\r
-\r
-  //\r
-  // Include extra glyph info and '\0' info, so +2.\r
-  //\r
-  return StrOffset + 2;\r
-}\r
-\r
-/**\r
-  Add one menu option by specified description and context.\r
-\r
-  @param  Statement              Statement of this Menu Option.\r
-  @param  MenuItemCount          The index for this Option in the Menu.\r
-  @param  NestIn                 Whether this statement is nest in another statement.\r
-\r
-**/\r
-VOID\r
-UiAddMenuOption (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT   *Statement,\r
-  IN UINT16                          *MenuItemCount,\r
-  IN BOOLEAN                         NestIn\r
-  )\r
-{\r
-  UI_MENU_OPTION   *MenuOption;\r
-  UINTN            Index;\r
-  UINTN            Count;\r
-  CHAR16           *String;\r
-  UINT16           NumberOfLines;\r
-  UINT16           GlyphWidth;\r
-  UINT16           Width;\r
-  UINTN            ArrayEntry;\r
-  CHAR16           *OutputString;\r
-  EFI_STRING_ID    PromptId;\r
-\r
-  NumberOfLines = 1;\r
-  ArrayEntry    = 0;\r
-  GlyphWidth    = 1;\r
-  Count         = 1;\r
-  MenuOption    = NULL;\r
-\r
-  PromptId = GetPrompt (Statement->OpCode);\r
-  ASSERT (PromptId != 0);\r
-\r
-  String = GetToken (PromptId, gFormData->HiiHandle);\r
-  ASSERT (String != NULL);\r
-\r
-  Width  = GetWidth (Statement);\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
-    //\r
-    if (StrLen (&String[ArrayEntry]) != 0) {\r
-      NumberOfLines++;\r
-    }\r
-    FreePool (OutputString);\r
-  }\r
-\r
-  if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    //\r
-    // Add three MenuOptions for Date/Time\r
-    // Data format :      [01/02/2004]      [11:22:33]\r
-    // Line number :        0  0    1         0  0  1\r
-    //\r
-    NumberOfLines = 0;\r
-    Count = 3;\r
-  }\r
-\r
-  for (Index = 0; Index < Count; Index++) {\r
-    MenuOption = AllocateZeroPool (sizeof (UI_MENU_OPTION));\r
-    ASSERT (MenuOption);\r
-\r
-    MenuOption->Signature   = UI_MENU_OPTION_SIGNATURE;\r
-    MenuOption->Description = String;\r
-    MenuOption->Handle      = gFormData->HiiHandle;\r
-    MenuOption->ThisTag     = Statement;\r
-    MenuOption->NestInStatement = NestIn;\r
-    MenuOption->EntryNumber = *MenuItemCount;\r
-\r
-    if (Index == 2) {\r
-      //\r
-      // Override LineNumber for the MenuOption in Date/Time sequence\r
-      //\r
-      MenuOption->Skip = 1;\r
-    } else {\r
-      MenuOption->Skip = NumberOfLines;\r
-    }\r
-    MenuOption->Sequence = Index;\r
-\r
-    if ((Statement->Attribute & HII_DISPLAY_GRAYOUT) != 0) {\r
-      MenuOption->GrayOut = TRUE;\r
-    } else {\r
-      MenuOption->GrayOut = FALSE;\r
-    }\r
-\r
-    if ((Statement->Attribute & HII_DISPLAY_LOCK) != 0 || (gFormData->Attribute & HII_DISPLAY_LOCK) != 0) {\r
-      MenuOption->GrayOut = TRUE;\r
-    }\r
-\r
-    //\r
-    // If the form or the question has the lock attribute, deal same as grayout.\r
-    //\r
-    if ((gFormData->Attribute & HII_DISPLAY_LOCK) != 0 || (Statement->Attribute & HII_DISPLAY_LOCK) != 0) {\r
-      MenuOption->GrayOut = TRUE;\r
-    }\r
-\r
-    switch (Statement->OpCode->OpCode) {\r
-    case EFI_IFR_ORDERED_LIST_OP:\r
-    case EFI_IFR_ONE_OF_OP:\r
-    case EFI_IFR_NUMERIC_OP:\r
-    case EFI_IFR_TIME_OP:\r
-    case EFI_IFR_DATE_OP:\r
-    case EFI_IFR_CHECKBOX_OP:\r
-    case EFI_IFR_PASSWORD_OP:\r
-    case EFI_IFR_STRING_OP:\r
-      //\r
-      // User could change the value of these items\r
-      //\r
-      MenuOption->IsQuestion = TRUE;\r
-      break;\r
-    case EFI_IFR_TEXT_OP:\r
-      if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) {\r
-        //\r
-        // Initializing GrayOut option as TRUE for Text setup options \r
-        // so that those options will be Gray in colour and un selectable.\r
-        //\r
-        MenuOption->GrayOut = TRUE;\r
-      }\r
-      break;\r
-    default:\r
-      MenuOption->IsQuestion = FALSE;\r
-      break;\r
-    }\r
-\r
-    if ((Statement->Attribute & HII_DISPLAY_READONLY) != 0) {\r
-      MenuOption->ReadOnly = TRUE;\r
-      if (FeaturePcdGet (PcdBrowerGrayOutReadOnlyMenu)) {\r
-        MenuOption->GrayOut = TRUE;\r
-      }\r
-    }\r
-\r
-    InsertTailList (&gMenuOption, &MenuOption->Link);\r
-  }\r
-\r
-  (*MenuItemCount)++;\r
-}\r
-\r
-/**\r
-  Create the menu list base on the form data info.\r
-\r
-**/\r
-VOID\r
-ConvertStatementToMenu (\r
-  VOID\r
-  )\r
-{\r
-  UINT16                        MenuItemCount;\r
-  LIST_ENTRY                    *Link;\r
-  LIST_ENTRY                    *NestLink;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
-  FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;\r
-\r
-  MenuItemCount = 0;\r
-  InitializeListHead (&gMenuOption);\r
-\r
-  Link = GetFirstNode (&gFormData->StatementListHead);\r
-  while (!IsNull (&gFormData->StatementListHead, Link)) {\r
-    Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&gFormData->StatementListHead, Link);\r
-\r
-    //\r
-    // Skip the opcode not recognized by Display core.\r
-    //\r
-    if (Statement->OpCode->OpCode == EFI_IFR_GUID_OP) {\r
-      continue;\r
-    }\r
-\r
-    UiAddMenuOption (Statement, &MenuItemCount, FALSE);\r
-\r
-    //\r
-    // Check the statement nest in this host statement.\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
-      UiAddMenuOption (NestStatement, &MenuItemCount, TRUE);\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Count the storage space of a Unicode string.\r
-\r
-  This function handles the Unicode string with NARROW_CHAR\r
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
-  does not count in the resultant output. If a WIDE_CHAR is\r
-  hit, then 2 Unicode character will consume an output storage\r
-  space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
-  If String is NULL, then ASSERT ().\r
-\r
-  @param String          The input string to be counted.\r
-\r
-  @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-GetStringWidth (\r
-  IN CHAR16               *String\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Count;\r
-  UINTN IncrementValue;\r
-\r
-  ASSERT (String != NULL);\r
-  if (String == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  Index           = 0;\r
-  Count           = 0;\r
-  IncrementValue  = 1;\r
-\r
-  do {\r
-    //\r
-    // Advance to the null-terminator or to the first width directive\r
-    //\r
-    for (;\r
-         (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
-         Index++, Count = Count + IncrementValue\r
-        )\r
-      ;\r
-\r
-    //\r
-    // We hit the null-terminator, we now have a count\r
-    //\r
-    if (String[Index] == 0) {\r
-      break;\r
-    }\r
-    //\r
-    // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
-    // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
-    //\r
-    if (String[Index] == NARROW_CHAR) {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 1;\r
-    } else {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 2;\r
-    }\r
-  } while (String[Index] != 0);\r
-\r
-  //\r
-  // Increment by one to include the null-terminator in the size\r
-  //\r
-  Count++;\r
-\r
-  return Count * sizeof (CHAR16);\r
-}\r
-\r
-/**\r
-  Base on the input option string to update the skip value for a menu option.\r
-\r
-  @param  MenuOption             The MenuOption to be checked.\r
-  @param  OptionString           The input option string.\r
-\r
-**/\r
-VOID\r
-UpdateSkipInfoForMenu (\r
-  IN UI_MENU_OPTION               *MenuOption,\r
-  IN CHAR16                       *OptionString\r
-  )\r
-{\r
-  UINTN   Index;\r
-  UINT16  Width;\r
-  UINTN   Row;\r
-  CHAR16  *OutputString;\r
-  UINT16  GlyphWidth;\r
-\r
-  Width         = (UINT16) gOptionBlockWidth;\r
-  GlyphWidth    = 1;\r
-  Row           = 1;\r
-\r
-  for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-    if (StrLen (&OptionString[Index]) != 0) {\r
-      Row++;\r
-    }\r
-\r
-    FreePool (OutputString);\r
-  }\r
-\r
-  if ((Row > MenuOption->Skip) && \r
-      (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_DATE_OP) && \r
-      (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_TIME_OP)) {\r
-    MenuOption->Skip = Row;\r
-  }\r
-}\r
-\r
-/**\r
-  Update display lines for a Menu Option.\r
-\r
-  @param  MenuOption             The MenuOption to be checked.\r
-\r
-**/\r
-VOID\r
-UpdateOptionSkipLines (\r
-  IN UI_MENU_OPTION               *MenuOption\r
-  )\r
-{\r
-  CHAR16  *OptionString;\r
-\r
-  OptionString  = NULL;\r
-\r
-  ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
-  if (OptionString != NULL) {\r
-    UpdateSkipInfoForMenu (MenuOption, OptionString);\r
-\r
-    FreePool (OptionString);\r
-  }\r
-\r
-  if ((MenuOption->ThisTag->OpCode->OpCode  == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo != 0)) {\r
-    OptionString   = GetToken (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo, gFormData->HiiHandle);\r
-\r
-    if (OptionString != NULL) {\r
-      UpdateSkipInfoForMenu (MenuOption, OptionString);\r
-\r
-      FreePool (OptionString);\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Check whether this Menu Option could be highlighted.\r
-\r
-  This is an internal function.\r
-\r
-  @param  MenuOption             The MenuOption to be checked.\r
-\r
-  @retval TRUE                   This Menu Option is selectable.\r
-  @retval FALSE                  This Menu Option could not be selected.\r
-\r
-**/\r
-BOOLEAN\r
-IsSelectable (\r
-  UI_MENU_OPTION   *MenuOption\r
-  )\r
-{\r
-  if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) ||\r
-      MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-    return FALSE;\r
-  } else {\r
-    return TRUE;\r
-  }\r
-}\r
-\r
-/**\r
-  Move to next selectable statement.\r
-\r
-  This is an internal function.\r
-\r
-  @param  GoUp                   The navigation direction. TRUE: up, FALSE: down.\r
-  @param  CurrentPosition        Current position.\r
-  @param  GapToTop               Gap position to top or bottom.\r
-\r
-  @return The row distance from current MenuOption to next selectable MenuOption.\r
-\r
-  @retval -1       Reach the begin of the menu, still can't find the selectable menu.\r
-  @retval Value    Find the selectable menu, maybe the truly selectable, maybe the l\r
-                   last menu showing at current form.\r
-\r
-**/\r
-INTN\r
-MoveToNextStatement (\r
-  IN     BOOLEAN                   GoUp,\r
-  IN OUT LIST_ENTRY                **CurrentPosition,\r
-  IN     UINTN                     GapToTop\r
-  )\r
-{\r
-  INTN             Distance;\r
-  LIST_ENTRY       *Pos;\r
-  UI_MENU_OPTION   *NextMenuOption;\r
-  UI_MENU_OPTION   *PreMenuOption;\r
-\r
-  Distance      = 0;\r
-  Pos           = *CurrentPosition;\r
-  PreMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
-\r
-  while (TRUE) {\r
-    NextMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
-    //\r
-    // NextMenuOption->Row == 0 means this menu has not calculate\r
-    // the NextMenuOption->Skip value yet, just calculate here.\r
-    //\r
-    if (NextMenuOption->Row == 0) {\r
-      UpdateOptionSkipLines (NextMenuOption);\r
-    }\r
-    \r
-    if (GoUp && (PreMenuOption != NextMenuOption)) {\r
-      //\r
-      // In this case, still can't find the selectable menu,\r
-      // return the last one in the showing form.\r
-      //\r
-      if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
-        NextMenuOption = PreMenuOption;\r
-        break;\r
-      }\r
-\r
-      //\r
-      // Current Position doesn't need to be caculated when go up.\r
-      // Caculate distanct at first when go up\r
-      //      \r
-      Distance += NextMenuOption->Skip;\r
-    }\r
-\r
-    if (IsSelectable (NextMenuOption)) {\r
-      break;\r
-    }\r
-\r
-    //\r
-    // Arrive at begin of the menu list.\r
-    //\r
-    if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {\r
-      Distance = -1;\r
-      break;\r
-    }\r
-\r
-    if (!GoUp) {\r
-      //\r
-      // In this case, still can't find the selectable menu,\r
-      // return the last one in the showing form.\r
-      //\r
-      if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
-        NextMenuOption = PreMenuOption;\r
-        break;\r
-      }\r
-\r
-      Distance += NextMenuOption->Skip;\r
-    }\r
-\r
-    PreMenuOption = NextMenuOption;\r
-    Pos = (GoUp ? Pos->BackLink : Pos->ForwardLink);\r
-  }\r
-\r
-  *CurrentPosition = &NextMenuOption->Link;\r
-  return Distance;\r
-}\r
-\r
-\r
-/**\r
-  Process option string for date/time opcode.\r
-\r
-  @param  MenuOption              Menu option point to date/time.\r
-  @param  OptionString            Option string input for process.\r
-  @param  AddOptCol               Whether need to update MenuOption->OptCol. \r
-\r
-**/\r
-VOID \r
-ProcessStringForDateTime (\r
-  UI_MENU_OPTION                  *MenuOption,\r
-  CHAR16                          *OptionString,\r
-  BOOLEAN                         AddOptCol\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Count;\r
-  FORM_DISPLAY_ENGINE_STATEMENT          *Statement;\r
-  EFI_IFR_DATE                           *Date;\r
-  EFI_IFR_TIME                           *Time;\r
-\r
-  ASSERT (MenuOption != NULL && OptionString != NULL);\r
-  \r
-  Statement = MenuOption->ThisTag;\r
-  Date      = NULL;\r
-  Time      = NULL;\r
-  if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-    Date = (EFI_IFR_DATE *) Statement->OpCode;\r
-  } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    Time = (EFI_IFR_TIME *) Statement->OpCode;\r
-  }\r
-  \r
-  //\r
-  // If leading spaces on OptionString - remove the spaces\r
-  //\r
-  for (Index = 0; OptionString[Index] == L' '; Index++) {\r
-    //\r
-    // Base on the blockspace to get the option column info.\r
-    //\r
-    if (AddOptCol) {\r
-      MenuOption->OptCol++;\r
-    }\r
-  }\r
-  \r
-  for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) {\r
-    OptionString[Count] = OptionString[Index];\r
-    Count++;\r
-  }\r
-  OptionString[Count] = CHAR_NULL;\r
-  \r
-  //\r
-  // Enable to suppress field in the opcode base on the flag.\r
-  //\r
-  if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-    //\r
-    // OptionString format is: <**:  **: ****>\r
-    //                        |month|day|year|\r
-    //                          4     3    5\r
-    //\r
-    if ((Date->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
-      //\r
-      // At this point, only "<**:" in the optionstring. \r
-      // Clean the day's ** field, after clean, the format is "<  :"\r
-      //\r
-      SetUnicodeMem (&OptionString[1], 2, L' ');\r
-    } else if ((Date->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
-      //\r
-      // At this point, only "**:" in the optionstring. \r
-      // Clean the month's "**" field, after clean, the format is "  :"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    } else if ((Date->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
-      //\r
-      // At this point, only "****>" in the optionstring. \r
-      // Clean the year's "****" field, after clean, the format is "  >"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 4, L' ');\r
-    }\r
-  } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    //\r
-    // OptionString format is: <**:  **:    **>\r
-    //                        |hour|minute|second|\r
-    //                          4     3      3\r
-    //\r
-    if ((Time->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
-      //\r
-      // At this point, only "<**:" in the optionstring. \r
-      // Clean the hour's ** field, after clean, the format is "<  :"\r
-      //\r
-      SetUnicodeMem (&OptionString[1], 2, L' ');\r
-    } else if ((Time->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
-      //\r
-      // At this point, only "**:" in the optionstring. \r
-      // Clean the minute's "**" field, after clean, the format is "  :"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    } else if ((Time->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
-      //\r
-      // At this point, only "**>" in the optionstring. \r
-      // Clean the second's "**" field, after clean, the format is "  >"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    }\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Adjust Data and Time position accordingly.\r
-  Data format :      [01/02/2004]      [11:22:33]\r
-  Line number :        0  0    1         0  0  1\r
-\r
-  This is an internal function.\r
-\r
-  @param  DirectionUp            the up or down direction. False is down. True is\r
-                                 up.\r
-  @param  CurrentPosition        Current position. On return: Point to the last\r
-                                 Option (Year or Second) if up; Point to the first\r
-                                 Option (Month or Hour) if down.\r
-\r
-  @return Return line number to pad. It is possible that we stand on a zero-advance\r
-  @return data or time opcode, so pad one line when we judge if we are going to scroll outside.\r
-\r
-**/\r
-UINTN\r
-AdjustDateAndTimePosition (\r
-  IN     BOOLEAN                     DirectionUp,\r
-  IN OUT LIST_ENTRY                  **CurrentPosition\r
-  )\r
-{\r
-  UINTN           Count;\r
-  LIST_ENTRY      *NewPosition;\r
-  UI_MENU_OPTION  *MenuOption;\r
-  UINTN           PadLineNumber;\r
-\r
-  PadLineNumber = 0;\r
-  NewPosition   = *CurrentPosition;\r
-  MenuOption    = MENU_OPTION_FROM_LINK (NewPosition);\r
-\r
-  if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
-      (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-    //\r
-    // Calculate the distance from current position to the last Date/Time MenuOption\r
-    //\r
-    Count = 0;\r
-    while (MenuOption->Skip == 0) {\r
-      Count++;\r
-      NewPosition   = NewPosition->ForwardLink;\r
-      MenuOption    = MENU_OPTION_FROM_LINK (NewPosition);\r
-      PadLineNumber = 1;\r
-    }\r
-\r
-    NewPosition = *CurrentPosition;\r
-    if (DirectionUp) {\r
-      //\r
-      // Since the behavior of hitting the up arrow on a Date/Time MenuOption is intended\r
-      // to be one that back to the previous set of MenuOptions, we need to advance to the first\r
-      // Date/Time MenuOption and leave the remaining logic in CfUiUp intact so the appropriate\r
-      // checking can be done.\r
-      //\r
-      while (Count++ < 2) {\r
-        NewPosition = NewPosition->BackLink;\r
-      }\r
-    } else {\r
-      //\r
-      // Since the behavior of hitting the down arrow on a Date/Time MenuOption is intended\r
-      // to be one that progresses to the next set of MenuOptions, we need to advance to the last\r
-      // Date/Time MenuOption and leave the remaining logic in CfUiDown intact so the appropriate\r
-      // checking can be done.\r
-      //\r
-      while (Count-- > 0) {\r
-        NewPosition = NewPosition->ForwardLink;\r
-      }\r
-    }\r
-\r
-    *CurrentPosition = NewPosition;\r
-  }\r
-\r
-  return PadLineNumber;\r
-}\r
-\r
-/**\r
-  Get step info from numeric opcode.\r
-  \r
-  @param[in] OpCode     The input numeric op code.\r
-\r
-  @return step info for this opcode.\r
-**/\r
-UINT64\r
-GetFieldFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode\r
-  )\r
-{\r
-  EFI_IFR_NUMERIC       *NumericOp;\r
-  UINT64                Step;\r
-\r
-  NumericOp = (EFI_IFR_NUMERIC *) OpCode;\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
-  case EFI_IFR_NUMERIC_SIZE_2:\r
-    Step    = NumericOp->data.u16.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_4:\r
-    Step    = NumericOp->data.u32.Step;\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_8:\r
-    Step    = NumericOp->data.u64.Step;\r
-    break;\r
-  \r
-  default:\r
-    Step = 0;\r
-    break;\r
-  }\r
-\r
-  return Step;\r
-}\r
-\r
-/**\r
-  Find the registered HotKey based on KeyData.\r
-  \r
-  @param[in] KeyData     A pointer to a buffer that describes the keystroke\r
-                         information for the hot key.\r
-\r
-  @return The registered HotKey context. If no found, NULL will return.\r
-**/\r
-BROWSER_HOT_KEY *\r
-GetHotKeyFromRegisterList (\r
-  IN EFI_INPUT_KEY *KeyData\r
-  )\r
-{\r
-  LIST_ENTRY       *Link;\r
-  BROWSER_HOT_KEY  *HotKey;\r
-\r
-  Link = GetFirstNode (&gFormData->HotKeyListHead);\r
-  while (!IsNull (&gFormData->HotKeyListHead, Link)) {\r
-    HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
-    \r
-    if (HotKey->KeyData->ScanCode == KeyData->ScanCode) {\r
-      return HotKey;\r
-    }\r
-\r
-    Link = GetNextNode (&gFormData->HotKeyListHead, Link);\r
-  }\r
-  \r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  Determine if the menu is the last menu that can be selected.\r
-\r
-  This is an internal function.\r
-\r
-  @param  Direction              The scroll direction. False is down. True is up.\r
-  @param  CurrentPos             The current focus.\r
-\r
-  @return FALSE -- the menu isn't the last menu that can be selected.\r
-  @return TRUE  -- the menu is the last menu that can be selected.\r
-\r
-**/\r
-BOOLEAN\r
-ValueIsScroll (\r
-  IN  BOOLEAN                     Direction,\r
-  IN  LIST_ENTRY                  *CurrentPos\r
-  )\r
-{\r
-  LIST_ENTRY      *Temp;\r
-\r
-  Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink;\r
-\r
-  if (Temp == &gMenuOption) {\r
-    return TRUE;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Wait for a given event to fire, or for an optional timeout to expire.\r
-\r
-  @param  Event                  The event to wait for\r
-\r
-  @retval UI_EVENT_TYPE          The type of the event which is trigged.\r
-\r
-**/\r
-UI_EVENT_TYPE\r
-UiWaitForEvent (\r
-  IN EFI_EVENT                Event\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       Index;\r
-  UINTN       EventNum;\r
-  UINT64      Timeout;\r
-  EFI_EVENT   TimerEvent;\r
-  EFI_EVENT   WaitList[3];\r
-  UI_EVENT_TYPE  EventType;\r
-\r
-  TimerEvent = NULL;\r
-  Timeout    = FormExitTimeout(gFormData);\r
-\r
-  if (Timeout != 0) {\r
-    Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
-\r
-    //\r
-    // Set the timer event\r
-    //\r
-    gBS->SetTimer (\r
-          TimerEvent,\r
-          TimerRelative,\r
-          Timeout\r
-          );\r
-  }\r
-  \r
-  WaitList[0] = Event;\r
-  EventNum    = 1;\r
-  if (gFormData->FormRefreshEvent != NULL) {\r
-    WaitList[EventNum] = gFormData->FormRefreshEvent;\r
-    EventNum ++;\r
-  } \r
-\r
-  if (Timeout != 0) {\r
-    WaitList[EventNum] = TimerEvent;\r
-    EventNum ++;\r
-  }\r
-\r
-  Status = gBS->WaitForEvent (EventNum, WaitList, &Index);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  switch (Index) {\r
-  case 0:\r
-   EventType = UIEventKey;\r
-   break;\r
-\r
-  case 1:\r
-    if (gFormData->FormRefreshEvent != NULL) {\r
-      EventType = UIEventDriver;\r
-    } else {\r
-      ASSERT (Timeout != 0 && EventNum == 2);\r
-      EventType = UIEventTimeOut;\r
-    }\r
-    break;\r
-\r
-  default:\r
-    ASSERT (Index == 2 && EventNum == 3);\r
-    EventType = UIEventTimeOut;\r
-    break;\r
-  }\r
-\r
-  if (Timeout != 0) {\r
-    gBS->CloseEvent (TimerEvent);\r
-  }\r
-  \r
-  return EventType;\r
-}\r
-\r
-/**\r
-  Get question id info from the input opcode header.\r
-\r
-  @param  OpCode                 The input opcode header pointer.\r
-\r
-  @retval                        The question id for this opcode.\r
-\r
-**/\r
-EFI_QUESTION_ID\r
-GetQuestionIdInfo (\r
-  IN   EFI_IFR_OP_HEADER     *OpCode\r
-  )\r
-{\r
-  EFI_IFR_QUESTION_HEADER   *QuestionHeader;\r
-\r
-  if (OpCode->Length < sizeof (EFI_IFR_OP_HEADER) + sizeof (EFI_IFR_QUESTION_HEADER)) {\r
-    return 0;\r
-  }\r
-\r
-  QuestionHeader = (EFI_IFR_QUESTION_HEADER *)((UINT8 *) OpCode + sizeof(EFI_IFR_OP_HEADER));\r
-\r
-  return QuestionHeader->QuestionId;\r
-}\r
-\r
-/**\r
-  Find the first menu which will be show at the top.\r
-\r
-  @param  FormData               The data info for this form.\r
-  @param  TopOfScreen            The link_entry pointer to top menu.\r
-  @param  HighlightMenu          The menu which will be highlight.\r
-  @param  SkipValue              The skip value for the top menu.\r
-\r
-**/\r
-VOID\r
-FindTopMenu (\r
-  IN  FORM_DISPLAY_ENGINE_FORM  *FormData,\r
-  OUT LIST_ENTRY                **TopOfScreen,\r
-  OUT LIST_ENTRY                **HighlightMenu,\r
-  OUT INTN                      *SkipValue\r
-  )\r
-{\r
-  LIST_ENTRY                      *Link;\r
-  LIST_ENTRY                      *NewPos;\r
-  UINTN                           TopRow;\r
-  UINTN                           BottomRow;\r
-  UINTN                           Index;\r
-  UI_MENU_OPTION                  *SavedMenuOption;\r
-  UINTN                           EndRow;\r
-\r
-  TopRow    = gStatementDimensions.TopRow    + SCROLL_ARROW_HEIGHT;\r
-  BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;\r
-\r
-  //\r
-  // If not has input highlight statement, just return the first one in this form.\r
-  //\r
-  if (FormData->HighLightedStatement == NULL) {\r
-    *TopOfScreen   = gMenuOption.ForwardLink;\r
-    *HighlightMenu = gMenuOption.ForwardLink;\r
-    if (!IsListEmpty (&gMenuOption)) {\r
-      MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow);\r
-    }\r
-    *SkipValue     = 0;\r
-    return;\r
-  }\r
-\r
-  //\r
-  // Now base on the input highlight menu to find the top menu in this page.\r
-  // Will base on the highlight menu show at the bottom to find the top menu.\r
-  //\r
-  NewPos = gMenuOption.ForwardLink;\r
-  SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-\r
-  while ((SavedMenuOption->ThisTag != FormData->HighLightedStatement) ||\r
-         (SavedMenuOption->Sequence != gSequence)) {\r
-    NewPos     = NewPos->ForwardLink;\r
-    if (NewPos == &gMenuOption) {\r
-      //\r
-      // Not Found it, break\r
-      //\r
-      break;\r
-    }\r
-    SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-  }\r
-  ASSERT (SavedMenuOption->ThisTag == FormData->HighLightedStatement);\r
-\r
-  *HighlightMenu = NewPos;\r
-\r
-  AdjustDateAndTimePosition(FALSE, &NewPos);\r
-  SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-  UpdateOptionSkipLines (SavedMenuOption);\r
-\r
-  //\r
-  // If highlight opcode is date/time, keep the highlight row info not change.\r
-  //\r
-  if ((SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP || SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP) &&\r
-      (gHighligthMenuInfo.QuestionId != 0) && \r
-      (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode))) {\r
-    //\r
-    // Still show the highlight menu before exit from display engine.\r
-    //\r
-    EndRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;\r
-  } else {\r
-    EndRow = BottomRow;\r
-  }\r
-\r
-  //\r
-  // Base on the selected menu will show at the bottome of next page, \r
-  // select the menu show at the top of the next page. \r
-  //\r
-  Link    = NewPos;\r
-  for (Index = TopRow + SavedMenuOption->Skip; Index <= EndRow; ) {\r
-    Link = Link->BackLink;\r
-    //\r
-    // Already find the first menu in this form, means highlight menu \r
-    // will show in first page of this form.\r
-    //\r
-    if (Link == &gMenuOption) {\r
-      *TopOfScreen   = gMenuOption.ForwardLink;\r
-      *SkipValue     = 0;\r
-      return;\r
-    }\r
-    SavedMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-    UpdateOptionSkipLines (SavedMenuOption);\r
-    Index += SavedMenuOption->Skip;\r
-  }\r
-\r
-  //\r
-  // Found the menu which will show at the top of the page.\r
-  //\r
-  if (Link == NewPos) {\r
-    //\r
-    // The menu can show more than one pages, just show the menu at the top of the page.\r
-    //\r
-    *SkipValue    = 0;\r
-    *TopOfScreen  = Link;\r
-  } else {\r
-    //\r
-    // Check whether need to skip some line for menu shows at the top of the page.\r
-    //\r
-    *SkipValue = Index - EndRow;\r
-    if (*SkipValue > 0 && *SkipValue < (INTN) SavedMenuOption->Skip) {\r
-      *TopOfScreen     = Link;\r
-    } else {\r
-      *SkipValue       = 0;\r
-      *TopOfScreen     = Link->ForwardLink;\r
-    }\r
-  }\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
-  after period of time, it will automatically return the first menu option.\r
-\r
-  @param  FormData               The current form data info.\r
-\r
-  @retval EFI_SUCESSS            Process the user selection success.\r
-  @retval EFI_NOT_FOUND          Process option string for orderedlist/Oneof fail.\r
-\r
-**/\r
-EFI_STATUS\r
-UiDisplayMenu (\r
-  IN  FORM_DISPLAY_ENGINE_FORM  *FormData\r
-  )\r
-{\r
-  INTN                            SkipValue;\r
-  INTN                            Difference;\r
-  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
-  UINTN                           Index;\r
-  UINT16                          Width;\r
-  CHAR16                          *StringPtr;\r
-  CHAR16                          *OptionString;\r
-  CHAR16                          *OutputString;\r
-  CHAR16                          *HelpString;\r
-  CHAR16                          *HelpHeaderString;\r
-  CHAR16                          *HelpBottomString;\r
-  BOOLEAN                         NewLine;\r
-  BOOLEAN                         Repaint;\r
-  BOOLEAN                         UpArrow;\r
-  BOOLEAN                         DownArrow;\r
-  EFI_STATUS                      Status;\r
-  EFI_INPUT_KEY                   Key;\r
-  LIST_ENTRY                      *Link;\r
-  LIST_ENTRY                      *NewPos;\r
-  LIST_ENTRY                      *TopOfScreen;\r
-  LIST_ENTRY                      *SavedListEntry;\r
-  UI_MENU_OPTION                  *MenuOption;\r
-  UI_MENU_OPTION                  *NextMenuOption;\r
-  UI_MENU_OPTION                  *SavedMenuOption;\r
-  UI_MENU_OPTION                  *PreviousMenuOption;\r
-  UI_CONTROL_FLAG                 ControlFlag;\r
-  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
-  UINTN                           RowCount;\r
-  UINTN                           HelpLine;\r
-  UINTN                           HelpHeaderLine;\r
-  UINTN                           HelpBottomLine;\r
-  BOOLEAN                         MultiHelpPage;\r
-  UINT16                          GlyphWidth;\r
-  UINT16                          EachLineWidth;\r
-  UINT16                          HeaderLineWidth;\r
-  UINT16                          BottomLineWidth;\r
-  EFI_STRING_ID                   HelpInfo;\r
-  UI_EVENT_TYPE                   EventType;\r
-  FORM_DISPLAY_ENGINE_STATEMENT   *InitialHighlight;\r
-\r
-  EventType           = UIEventNone;\r
-  Status              = EFI_SUCCESS;\r
-  HelpString          = NULL;\r
-  HelpHeaderString    = NULL;\r
-  HelpBottomString    = NULL;\r
-  OptionString        = NULL;\r
-  ScreenOperation     = UiNoOperation;\r
-  NewLine             = TRUE;\r
-  DefaultId           = 0;\r
-  HelpPageCount       = 0;\r
-  HelpLine            = 0;\r
-  RowCount            = 0;\r
-  HelpBottomLine      = 0;\r
-  HelpHeaderLine      = 0;\r
-  HelpPageIndex       = 0;\r
-  MultiHelpPage       = FALSE;\r
-  EachLineWidth       = 0;\r
-  HeaderLineWidth     = 0;\r
-  BottomLineWidth     = 0;\r
-  OutputString        = NULL;\r
-  UpArrow             = FALSE;\r
-  DownArrow           = FALSE;\r
-  SkipValue           = 0;\r
-\r
-  NextMenuOption      = NULL;\r
-  PreviousMenuOption  = NULL;\r
-  SavedMenuOption     = NULL;\r
-  HotKey              = NULL;\r
-  Repaint             = TRUE;\r
-  MenuOption          = NULL;\r
-  ModalSkipColumn     = (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
-  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
-  } else {\r
-    Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS;\r
-  }\r
-\r
-  FindTopMenu(FormData, &TopOfScreen, &NewPos, &SkipValue);\r
-\r
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-\r
-  ControlFlag = CfInitialization;\r
-  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
-\r
-        ControlFlag = CfReadKey;\r
-      } else {\r
-        ControlFlag = CfRepaint;\r
-      }\r
-      break;\r
-\r
-    case CfRepaint:\r
-      ControlFlag = CfRefreshHighLight;\r
-\r
-      if (Repaint) {\r
-        //\r
-        // Display menu\r
-        //\r
-        DownArrow       = FALSE;\r
-        UpArrow         = FALSE;\r
-        Row             = TopRow;\r
-\r
-        Temp            = (UINTN) SkipValue;\r
-        Temp2           = (UINTN) SkipValue;\r
-        Temp3           = (UINTN) SkipValue;\r
-\r
-        //\r
-        // 1. Clear the screen.\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
-            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
-            );\r
-        }\r
-\r
-        //\r
-        // 2.Paint the menu.\r
-        //\r
-        for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) {\r
-          MenuOption          = MENU_OPTION_FROM_LINK (Link);\r
-          MenuOption->Row     = Row;\r
-          MenuOption->Col     = Col;\r
-          if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn + ModalSkipColumn;\r
-          } else {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn;\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
-          //\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
-          }\r
-          Temp3 = 0;\r
-\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-\r
-          //\r
-          // 3. Update the row info which will be used by next menu.\r
-          //\r
-          if (Link == TopOfScreen) {\r
-            Row += MenuOption->Skip - SkipValue;\r
-          } else {\r
-            Row += MenuOption->Skip;\r
-          }\r
-\r
-          if (Row > BottomRow) {\r
-            if (!ValueIsScroll (FALSE, Link)) {\r
-              DownArrow = TRUE;\r
-            }\r
-\r
-            Row = BottomRow + 1;\r
-            break;\r
-          }\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
-\r
-        if (DownArrow) {\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
-          PrintCharAt (\r
-            gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            ARROW_DOWN\r
-            );\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-        }\r
-\r
-        MenuOption = NULL;\r
-      }\r
-      break;\r
-\r
-    case CfRefreshHighLight:\r
-\r
-      //\r
-      // MenuOption: Last menu option that need to remove hilight\r
-      //             MenuOption is set to NULL in Repaint\r
-      // NewPos:     Current menu option that need to hilight\r
-      //\r
-      ControlFlag = CfUpdateHelpString;\r
-\r
-      if (MenuOption != NULL && TopOfScreen == &MenuOption->Link) {\r
-        Temp = SkipValue;\r
-      } else {\r
-        Temp = 0;\r
-      }\r
-      if (NewPos == TopOfScreen) {\r
-        Temp2 = SkipValue;\r
-      } else {\r
-        Temp2 = 0;\r
-      }\r
-\r
-      if (NewPos != NULL && (MenuOption == NULL || NewPos != &MenuOption->Link)) {\r
-        if (MenuOption != NULL) {\r
-          //\r
-          // Remove highlight on last Menu Option\r
-          //\r
-          gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
-          ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-          if (OptionString != NULL) {\r
-            if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
-                (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)\r
-               ) {\r
-              ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
-            }\r
-\r
-            Width               = (UINT16) gOptionBlockWidth;\r
-            OriginalRow         = MenuOption->Row;\r
-            GlyphWidth          = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, MenuOption->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 (Temp == 0) {\r
-                  MenuOption->Row++;\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp != 0) {\r
-                Temp--;\r
-              }\r
-            }\r
-\r
-            MenuOption->Row = OriginalRow;\r
-\r
-            FreePool (OptionString);\r
-          } else {\r
-            if (NewLine) {\r
-              if (MenuOption->GrayOut) {\r
-                gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
-              } else if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
-                gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
-              }\r
-\r
-              OriginalRow = MenuOption->Row;\r
-              Width       = GetWidth (MenuOption->ThisTag);\r
-              GlyphWidth  = 1;\r
-\r
-              for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-                if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
-                  PrintStringAt (MenuOption->Col, MenuOption->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
-                    MenuOption->Row++;\r
-                  }\r
-                }\r
-\r
-                FreePool (OutputString);\r
-                if (Temp != 0) {\r
-                  Temp--;\r
-                }\r
-              }\r
-\r
-              MenuOption->Row = OriginalRow;\r
-              gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-            }\r
-          }\r
-        }\r
-\r
-        //\r
-        // This is the current selected statement\r
-        //\r
-        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
-\r
-        if (!IsSelectable (MenuOption)) {\r
-          RefreshKeyHelp(gFormData, Statement, FALSE);\r
-          break;\r
-        }\r
-\r
-        //\r
-        // Set reverse attribute\r
-        //\r
-        gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
-        gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
-\r
-        ProcessOptions (MenuOption, FALSE, &OptionString, TRUE);\r
-        if (OptionString != NULL) {\r
-          if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-            ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
-          }\r
-          Width               = (UINT16) gOptionBlockWidth;\r
-\r
-          OriginalRow         = MenuOption->Row;\r
-          GlyphWidth          = 1;\r
-\r
-          for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-            if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
-              PrintStringAt (MenuOption->OptCol, MenuOption->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
-              MenuOption->Row++;\r
-              }\r
-            }\r
-\r
-            FreePool (OutputString);\r
-            if (Temp2 != 0) {\r
-              Temp2--;\r
-            }\r
-          }\r
-\r
-          MenuOption->Row = OriginalRow;\r
-\r
-          FreePool (OptionString);\r
-        } else {\r
-          if (NewLine) {\r
-            OriginalRow = MenuOption->Row;\r
-\r
-            Width       = GetWidth (Statement);\r
-            GlyphWidth          = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
-                PrintStringAt (MenuOption->Col, MenuOption->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 (Temp2 == 0) {\r
-                  MenuOption->Row++;\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp2 != 0) {\r
-                Temp2--;\r
-              }\r
-            }\r
-\r
-            MenuOption->Row = OriginalRow;\r
-\r
-          }\r
-        }\r
-\r
-        RefreshKeyHelp(gFormData, MenuOption->ThisTag, FALSE);\r
-\r
-        //\r
-        // Clear reverse attribute\r
-        //\r
-        gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-      }\r
-      break;\r
-\r
-    case CfUpdateHelpString:\r
-      ControlFlag = CfPrepareToReadKey;\r
-      if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-        break;\r
-      }\r
-\r
-      if (Repaint || NewLine) {\r
-        //\r
-        // Don't print anything if it is a NULL help token\r
-        //\r
-        ASSERT(MenuOption != NULL);\r
-        HelpInfo = ((EFI_IFR_STATEMENT_HEADER *) ((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help;\r
-        if (HelpInfo == 0 || !IsSelectable (MenuOption)) {\r
-          StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
-        } else {\r
-          StringPtr = GetToken (HelpInfo, gFormData->HiiHandle);\r
-        }\r
-\r
-        RowCount      = BottomRow - TopRow + 1;\r
-        HelpPageIndex = 0;\r
-        //\r
-        // 1.Calculate how many line the help string need to print.\r
-        //\r
-        if (HelpString != NULL) {\r
-          FreePool (HelpString);\r
-          HelpString = NULL;\r
-        }\r
-        HelpLine = ProcessHelpString (StringPtr, &HelpString, &EachLineWidth, RowCount);\r
-        FreePool (StringPtr);\r
-\r
-        if (HelpLine > RowCount) {\r
-          MultiHelpPage   = TRUE;\r
-          StringPtr       = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);\r
-          if (HelpHeaderString != NULL) {\r
-            FreePool (HelpHeaderString);\r
-            HelpHeaderString = NULL;\r
-          }\r
-          HelpHeaderLine  = ProcessHelpString (StringPtr, &HelpHeaderString, &HeaderLineWidth, 0);\r
-          FreePool (StringPtr);\r
-          StringPtr       = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);\r
-          if (HelpBottomString != NULL) {\r
-            FreePool (HelpBottomString);\r
-            HelpBottomString = NULL;\r
-          }\r
-          HelpBottomLine  = ProcessHelpString (StringPtr, &HelpBottomString, &BottomLineWidth, 0);\r
-          FreePool (StringPtr);\r
-          //\r
-          // Calculate the help page count.\r
-          //\r
-          if (HelpLine > 2 * RowCount - 2) {\r
-            HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;\r
-            if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {\r
-              HelpPageCount += 1;\r
-            }\r
-          } else {\r
-            HelpPageCount = 2;\r
-          }\r
-        } else {\r
-          MultiHelpPage = FALSE;\r
-        }\r
-      }\r
-\r
-      //\r
-      // Check whether need to show the 'More(U/u)' at the begin.\r
-      // Base on current direct info, here shows aligned to the right side of the column.\r
-      // If the direction is multi line and aligned to right side may have problem, so \r
-      // add ASSERT code here.\r
-      //\r
-      if (HelpPageIndex > 0) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ());\r
-        for (Index = 0; Index < HelpHeaderLine; Index++) {\r
-          ASSERT (HelpHeaderLine == 1);\r
-          ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));\r
-          PrintStringAtWithWidth (\r
-            gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-            Index + TopRow,\r
-            gEmptyString,\r
-            gHelpBlockWidth\r
-            );\r
-          PrintStringAt (\r
-            gStatementDimensions.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,\r
-            Index + TopRow,\r
-            &HelpHeaderString[Index * HeaderLineWidth]\r
-            );\r
-        }\r
-      }\r
-\r
-      gST->ConOut->SetAttribute (gST->ConOut, GetHelpTextColor ());\r
-      //\r
-      // Print the help string info.\r
-      //\r
-      if (!MultiHelpPage) {\r
-        for (Index = 0; Index < HelpLine; Index++) {\r
-          PrintStringAtWithWidth (\r
-            gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-            Index + TopRow,\r
-            &HelpString[Index * EachLineWidth],\r
-            gHelpBlockWidth\r
-            );\r
-        }\r
-        for (; Index < RowCount; Index ++) {\r
-          PrintStringAtWithWidth (\r
-            gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-            Index + TopRow,\r
-            gEmptyString,\r
-            gHelpBlockWidth\r
-            );\r
-        }\r
-        gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow);\r
-      } else  {\r
-        if (HelpPageIndex == 0) {\r
-          for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {\r
-            PrintStringAtWithWidth (\r
-              gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-              Index + TopRow,\r
-              &HelpString[Index * EachLineWidth],\r
-              gHelpBlockWidth\r
-              );\r
-          }\r
-        } else {\r
-          for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && \r
-              (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) {\r
-            PrintStringAtWithWidth (\r
-              gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-              Index + TopRow + HelpHeaderLine,\r
-              &HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* EachLineWidth],\r
-              gHelpBlockWidth\r
-              );\r
-          }\r
-          if (HelpPageIndex == HelpPageCount - 1) {\r
-            for (; Index < RowCount - HelpHeaderLine; Index ++) {\r
-              PrintStringAtWithWidth (\r
-                gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-                Index + TopRow + HelpHeaderLine,\r
-                gEmptyString,\r
-                gHelpBlockWidth\r
-                );\r
-            }\r
-            gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow);\r
-          }\r
-        } \r
-      }\r
-\r
-      //\r
-      // Check whether need to print the 'More(D/d)' at the bottom.\r
-      // Base on current direct info, here shows aligned to the right side of the column.\r
-      // If the direction is multi line and aligned to right side may have problem, so \r
-      // add ASSERT code here.\r
-      //\r
-      if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ());\r
-        for (Index = 0; Index < HelpBottomLine; Index++) {\r
-          ASSERT (HelpBottomLine == 1);\r
-          ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1)); \r
-          PrintStringAtWithWidth (\r
-            gStatementDimensions.RightColumn - gHelpBlockWidth,\r
-            BottomRow + Index - HelpBottomLine + 1,\r
-            gEmptyString,\r
-            gHelpBlockWidth\r
-            );\r
-          PrintStringAt (\r
-            gStatementDimensions.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,\r
-            BottomRow + Index - HelpBottomLine + 1,\r
-            &HelpBottomString[Index * BottomLineWidth]\r
-            );\r
-        }\r
-      }\r
-      //\r
-      // Reset this flag every time we finish using it.\r
-      //\r
-      Repaint = FALSE;\r
-      NewLine = FALSE;\r
-      break;\r
-\r
-    case CfPrepareToReadKey:\r
-      ControlFlag = CfReadKey;\r
-      ScreenOperation = UiNoOperation;\r
-      break;\r
-\r
-    case CfReadKey:\r
-      ControlFlag = CfScreenOperation;\r
-\r
-      //\r
-      // Wait for user's selection\r
-      //\r
-      while (TRUE) {\r
-        Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-        if (!EFI_ERROR (Status)) {\r
-          EventType = UIEventKey;\r
-          break;\r
-        }\r
-\r
-        //\r
-        // If we encounter error, continue to read another key in.\r
-        //\r
-        if (Status != EFI_NOT_READY) {\r
-          continue;\r
-        }\r
-        \r
-        EventType = UiWaitForEvent(gST->ConIn->WaitForKey);\r
-        if (EventType == UIEventKey) {\r
-          gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-        }\r
-        break;\r
-      }\r
-\r
-      if (EventType == UIEventDriver) {\r
-        gUserInput->Action = BROWSER_ACTION_NONE;\r
-        ControlFlag = CfExit;\r
-        break;\r
-      }\r
-      \r
-      if (EventType == UIEventTimeOut) {\r
-        gUserInput->Action = BROWSER_ACTION_FORM_EXIT;\r
-        ControlFlag = CfExit;\r
-        break;\r
-      }\r
-\r
-      switch (Key.UnicodeChar) {\r
-      case CHAR_CARRIAGE_RETURN:\r
-        if(MenuOption == NULL || MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-\r
-        ScreenOperation = UiSelect;\r
-        gDirection      = 0;\r
-        break;\r
-\r
-      //\r
-      // We will push the adjustment of these numeric values directly to the input handler\r
-      //  NOTE: we won't handle manual input numeric\r
-      //\r
-      case '+':\r
-      case '-':\r
-        //\r
-        // If the screen has no menu items, and the user didn't select UiReset\r
-        // ignore the selection and go back to reading keys.\r
-        //\r
-        if(IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-\r
-        ASSERT(MenuOption != NULL);\r
-        Statement = MenuOption->ThisTag;\r
-        if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP)\r
-          || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)\r
-          || ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (GetFieldFromNum(Statement->OpCode) != 0))\r
-        ){\r
-          if (Key.UnicodeChar == '+') {\r
-            gDirection = SCAN_RIGHT;\r
-          } else {\r
-            gDirection = SCAN_LEFT;\r
-          }\r
-          \r
-          Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE);\r
-          if (OptionString != NULL) {\r
-            FreePool (OptionString);\r
-          }\r
-          if (EFI_ERROR (Status)) {\r
-            //\r
-            // Repaint to clear possible error prompt pop-up\r
-            //\r
-            Repaint = TRUE;\r
-            NewLine = TRUE;\r
-          } else {\r
-            ControlFlag = CfExit;\r
-          }\r
-        }\r
-        break;\r
-\r
-      case '^':\r
-        ScreenOperation = UiUp;\r
-        break;\r
-\r
-      case 'V':\r
-      case 'v':\r
-        ScreenOperation = UiDown;\r
-        break;\r
-\r
-      case ' ':\r
-        if(IsListEmpty (&gMenuOption)) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-        \r
-        ASSERT(MenuOption != NULL);\r
-        if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) {\r
-          ScreenOperation = UiSelect;\r
-        }\r
-        break;\r
-\r
-      case 'D':\r
-      case 'd':\r
-        if (!MultiHelpPage) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-        ControlFlag    = CfUpdateHelpString;\r
-        HelpPageIndex  = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1;\r
-        break;\r
-\r
-      case 'U':\r
-      case 'u':\r
-        if (!MultiHelpPage) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-        ControlFlag    = CfUpdateHelpString;\r
-        HelpPageIndex  = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0;\r
-        break;\r
-\r
-      case CHAR_NULL:\r
-        for (Index = 0; Index < mScanCodeNumber; Index++) {\r
-          if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {\r
-            ScreenOperation = gScanCodeToOperation[Index].ScreenOperation;\r
-            break;\r
-          }\r
-        }\r
-        \r
-        if (((FormData->Attribute & HII_DISPLAY_MODAL) != 0) && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) {\r
-          //\r
-          // ModalForm has no ESC key and Hot Key.\r
-          //\r
-          ControlFlag = CfReadKey;\r
-        } else if (Index == mScanCodeNumber) {\r
-          //\r
-          // Check whether Key matches the registered hot key.\r
-          //\r
-          HotKey = NULL;\r
-          HotKey = GetHotKeyFromRegisterList (&Key);\r
-          if (HotKey != NULL) {\r
-            ScreenOperation = UiHotKey;\r
-          }\r
-        }\r
-        break;\r
-      }\r
-      break;\r
-\r
-    case CfScreenOperation:\r
-      if (ScreenOperation != UiReset) {\r
-        //\r
-        // If the screen has no menu items, and the user didn't select UiReset\r
-        // ignore the selection and go back to reading keys.\r
-        //\r
-        if (IsListEmpty (&gMenuOption)) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-      }\r
-\r
-      for (Index = 0;\r
-           Index < sizeof (gScreenOperationToControlFlag) / sizeof (gScreenOperationToControlFlag[0]);\r
-           Index++\r
-          ) {\r
-        if (ScreenOperation == gScreenOperationToControlFlag[Index].ScreenOperation) {\r
-          ControlFlag = gScreenOperationToControlFlag[Index].ControlFlag;\r
-          break;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiSelect:\r
-      ControlFlag = CfRepaint;\r
-\r
-      ASSERT(MenuOption != NULL);\r
-      Statement = MenuOption->ThisTag;\r
-      if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) {\r
-        break;\r
-      }\r
-\r
-      switch (Statement->OpCode->OpCode) {\r
-      case EFI_IFR_REF_OP:\r
-      case EFI_IFR_ACTION_OP:\r
-      case EFI_IFR_RESET_BUTTON_OP:\r
-        ControlFlag = CfExit;\r
-        break;\r
-\r
-      default:\r
-        //\r
-        // Editable Questions: oneof, ordered list, checkbox, numeric, string, password\r
-        //\r
-        RefreshKeyHelp (gFormData, Statement, TRUE);\r
-        Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE);\r
-        \r
-        if (OptionString != NULL) {\r
-          FreePool (OptionString);\r
-        }\r
-        \r
-        if (EFI_ERROR (Status)) {\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-          RefreshKeyHelp (gFormData, Statement, FALSE);\r
-          break;\r
-        } else {\r
-          ControlFlag = CfExit;\r
-          break;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiReset:\r
-      //\r
-      // We come here when someone press ESC\r
-      // If the policy is not exit front page when user press ESC, process here.\r
-      //\r
-      if (!FormExitPolicy()) {\r
-        Repaint     = TRUE;\r
-        NewLine     = TRUE;\r
-        ControlFlag = CfRepaint;\r
-        break;\r
-      }\r
-\r
-      //\r
-      // When user press ESC, it will try to show another menu, should clean the gSequence info.\r
-      //\r
-      if (gSequence != 0) {\r
-        gSequence = 0;\r
-      }\r
-\r
-      gUserInput->Action = BROWSER_ACTION_FORM_EXIT;\r
-      ControlFlag = CfExit;\r
-      break;\r
-\r
-    case CfUiHotKey:\r
-      ControlFlag = CfRepaint;\r
-      \r
-      gUserInput->Action = HotKey->Action;\r
-      ControlFlag = CfExit;\r
-      break;\r
-\r
-    case CfUiLeft:\r
-      ControlFlag = CfRepaint;\r
-      ASSERT(MenuOption != NULL);\r
-      if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        if (MenuOption->Sequence != 0) {\r
-          //\r
-          // In the middle or tail of the Date/Time op-code set, go left.\r
-          //\r
-          ASSERT(NewPos != NULL);\r
-          NewPos = NewPos->BackLink;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiRight:\r
-      ControlFlag = CfRepaint;\r
-      ASSERT(MenuOption != NULL);\r
-      if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        if (MenuOption->Sequence != 2) {\r
-          //\r
-          // In the middle or tail of the Date/Time op-code set, go left.\r
-          //\r
-          ASSERT(NewPos != NULL);\r
-          NewPos = NewPos->ForwardLink;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiUp:\r
-      ControlFlag = CfRepaint;\r
-\r
-      SavedListEntry = NewPos;\r
-\r
-      ASSERT(NewPos != NULL);\r
-      //\r
-      // Adjust Date/Time position before we advance forward.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      if (NewPos->BackLink != &gMenuOption) {\r
-        MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        ASSERT (MenuOption != NULL);\r
-        NewLine    = TRUE;\r
-        NewPos     = NewPos->BackLink;\r
-\r
-        PreviousMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        if (PreviousMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (PreviousMenuOption);\r
-        }\r
-        DistanceValue = PreviousMenuOption->Skip;\r
-        Difference    = 0;\r
-        if (MenuOption->Row >= DistanceValue + TopRow) {\r
-          Difference = MoveToNextStatement (TRUE, &NewPos, MenuOption->Row - TopRow - DistanceValue);\r
-        }\r
-        NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-       \r
-        if (Difference < 0) {\r
-          //\r
-          // We hit the begining MenuOption that can be focused\r
-          // so we simply scroll to the top.\r
-          //\r
-          if (TopOfScreen != gMenuOption.ForwardLink) {\r
-            TopOfScreen = gMenuOption.ForwardLink;\r
-            Repaint     = TRUE;\r
-          } else {\r
-            //\r
-            // Scroll up to the last page when we have arrived at top page.\r
-            //\r
-            NewPos          = &gMenuOption;\r
-            TopOfScreen     = &gMenuOption;\r
-            MenuOption      = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-            ScreenOperation = UiPageUp;\r
-            ControlFlag     = CfScreenOperation;\r
-            break;\r
-          }\r
-        } else if (MenuOption->Row < TopRow + DistanceValue + Difference) {\r
-          //\r
-          // Previous focus MenuOption is above the TopOfScreen, so we need to scroll\r
-          //\r
-          TopOfScreen = NewPos;\r
-          Repaint     = TRUE;\r
-          SkipValue = 0;\r
-        } else if (!IsSelectable (NextMenuOption)) {\r
-          //\r
-          // Continue to go up until scroll to next page or the selectable option is found.\r
-          //\r
-          ScreenOperation = UiUp;\r
-          ControlFlag     = CfScreenOperation;\r
-        }\r
-\r
-        //\r
-        // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-        //\r
-        AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-        AdjustDateAndTimePosition (TRUE, &NewPos);\r
-        MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        UpdateStatusBar (INPUT_ERROR, FALSE);\r
-      } else {\r
-        //\r
-        // Scroll up to the last page.\r
-        //\r
-        NewPos          = &gMenuOption;\r
-        TopOfScreen     = &gMenuOption;\r
-        MenuOption      = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        ScreenOperation = UiPageUp;\r
-        ControlFlag     = CfScreenOperation;\r
-      }\r
-      break;\r
-\r
-    case CfUiPageUp:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      //\r
-      ControlFlag     = CfRepaint;\r
-\r
-      ASSERT(NewPos != NULL);\r
-      //\r
-      // Already at the first menu option, Check the skip value.\r
-      //\r
-      if (NewPos->BackLink == &gMenuOption) {\r
-        if (SkipValue == 0) {\r
-          NewLine = FALSE;\r
-          Repaint = FALSE;\r
-        } else {\r
-          NewLine = TRUE;\r
-          Repaint = TRUE;\r
-          SkipValue = 0;\r
-        }\r
-        break;\r
-      }\r
-\r
-      NewLine   = TRUE;\r
-      Repaint   = TRUE;\r
-\r
-      //\r
-      // SkipValue > (BottomRow - TopRow + 1) means current menu has more than one\r
-      // form of options to be show, so just update the SkipValue to show the next\r
-      // parts of options.\r
-      //\r
-      if (SkipValue > (INTN) (BottomRow - TopRow + 1)) {\r
-        SkipValue -= BottomRow - TopRow + 1;\r
-        break;\r
-      }\r
-\r
-      Link      = TopOfScreen;\r
-      //\r
-      // First minus the menu of the top screen, it's value is SkipValue.\r
-      //\r
-      Index     = (BottomRow + 1) - SkipValue;\r
-      while ((Index > TopRow) && (Link->BackLink != &gMenuOption)) {\r
-        Link = Link->BackLink;\r
-        PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-        if (PreviousMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (PreviousMenuOption);\r
-        }        \r
-        if (Index < PreviousMenuOption->Skip) {\r
-          break;\r
-        }\r
-        Index = Index - PreviousMenuOption->Skip;\r
-      }\r
-      \r
-      if ((Link->BackLink == &gMenuOption) && (Index >= TopRow)) {\r
-        SkipValue = 0;\r
-        if (TopOfScreen == &gMenuOption) {\r
-          TopOfScreen = gMenuOption.ForwardLink;\r
-          NewPos      = gMenuOption.BackLink;\r
-          MoveToNextStatement (TRUE, &NewPos, BottomRow - TopRow);\r
-          Repaint = FALSE;\r
-        } else if (TopOfScreen != Link) {\r
-          TopOfScreen = Link;\r
-          NewPos      = Link;\r
-          MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-        } else {\r
-          //\r
-          // Finally we know that NewPos is the last MenuOption can be focused.\r
-          //\r
-          Repaint = FALSE;\r
-          NewPos  = Link;\r
-          MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-        }\r
-      } else {\r
-        if (Index > TopRow) {\r
-          //\r
-          // At here, only case "Index < PreviousMenuOption->Skip" can reach here.\r
-          //\r
-          SkipValue = PreviousMenuOption->Skip - (Index - TopRow);\r
-        } else if (Index == TopRow) {\r
-          SkipValue = 0;\r
-        } else {\r
-          SkipValue = TopRow - Index;\r
-        }\r
-\r
-        //\r
-        // Move to the option in Next page.\r
-        //\r
-        if (TopOfScreen == &gMenuOption) {\r
-          NewPos = gMenuOption.BackLink;\r
-          MoveToNextStatement (TRUE, &NewPos, BottomRow - TopRow);\r
-        } else {\r
-          NewPos = Link;\r
-          MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-        }\r
-\r
-        //\r
-        // There are more MenuOption needing scrolling up.\r
-        //\r
-        TopOfScreen = Link;\r
-        MenuOption  = NULL;\r
-      }\r
-\r
-      //\r
-      // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-      // Don't do this when we are already in the first page.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiPageDown:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      //\r
-      ControlFlag     = CfRepaint;\r
-\r
-      ASSERT (NewPos != NULL);\r
-      if (NewPos->ForwardLink == &gMenuOption) {\r
-        NewLine = FALSE;\r
-        Repaint = FALSE;\r
-        break;\r
-      }\r
-\r
-      NewLine = TRUE;\r
-      Repaint = TRUE;\r
-      Link    = TopOfScreen;\r
-      NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-      Index = TopRow + NextMenuOption->Skip - SkipValue;\r
-      //\r
-      // Count to the menu option which will show at the top of the next form.\r
-      //\r
-      while ((Index <= BottomRow + 1) && (Link->ForwardLink != &gMenuOption)) {\r
-        Link           = Link->ForwardLink;\r
-        NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-        Index = Index + NextMenuOption->Skip;\r
-      }\r
-\r
-      if ((Link->ForwardLink == &gMenuOption) && (Index <= BottomRow + 1)) {\r
-        //\r
-        // Finally we know that NewPos is the last MenuOption can be focused.\r
-        //\r
-        Repaint = FALSE;\r
-        MoveToNextStatement (TRUE, &Link, Index - TopRow);\r
-      } else {\r
-        //\r
-        // Calculate the skip line for top of screen menu.\r
-        //\r
-        if (Link == TopOfScreen) {\r
-          //\r
-          // The top of screen menu option occupies the entire form.\r
-          //\r
-          SkipValue += BottomRow - TopRow + 1;\r
-        } else {\r
-          SkipValue = NextMenuOption->Skip - (Index - (BottomRow + 1));\r
-        }\r
-\r
-        TopOfScreen = Link;\r
-        MenuOption = NULL;\r
-        //\r
-        // Move to the Next selectable menu.\r
-        //\r
-        MoveToNextStatement (FALSE, &Link, BottomRow - TopRow);\r
-      }\r
-\r
-      //\r
-      // Save the menu as the next highlight menu.\r
-      //\r
-      NewPos  = Link;\r
-\r
-      //\r
-      // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-      // Don't do this when we are already in the last page.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiDown:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      // NewPos  points to the menu which is highlighted now.\r
-      //\r
-      ControlFlag = CfRepaint;\r
-\r
-      //\r
-      // Since the behavior of hitting the down arrow on a Date/Time op-code is intended\r
-      // to be one that progresses to the next set of op-codes, we need to advance to the last\r
-      // Date/Time op-code and leave the remaining logic in UiDown intact so the appropriate\r
-      // checking can be done.  The only other logic we need to introduce is that if a Date/Time\r
-      // op-code is the last entry in the menu, we need to rewind back to the first op-code of\r
-      // the Date/Time op-code.\r
-      //\r
-      SavedListEntry = NewPos;\r
-      AdjustDateAndTimePosition (FALSE, &NewPos);\r
-\r
-      if (NewPos->ForwardLink != &gMenuOption) {\r
-        MenuOption      = MENU_OPTION_FROM_LINK (NewPos);\r
-        NewLine         = TRUE;\r
-        NewPos          = NewPos->ForwardLink;\r
-\r
-        Difference      = 0;\r
-        //\r
-        // Current menu not at the bottom of the form.\r
-        //\r
-        if (BottomRow >= MenuOption->Row + MenuOption->Skip) {\r
-          //\r
-          // Find the next selectable menu.\r
-          //\r
-          Difference = MoveToNextStatement (FALSE, &NewPos, BottomRow - MenuOption->Row - MenuOption->Skip);\r
-          //\r
-          // We hit the end of MenuOption that can be focused\r
-          // so we simply scroll to the first page.\r
-          //\r
-          if (Difference < 0) {\r
-            //\r
-            // Scroll to the first page.\r
-            //\r
-            if (TopOfScreen != gMenuOption.ForwardLink) {\r
-              TopOfScreen = gMenuOption.ForwardLink;\r
-              Repaint     = TRUE;\r
-              MenuOption  = NULL;\r
-            } else {\r
-              MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-            }\r
-            NewPos        = gMenuOption.ForwardLink;\r
-            MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-\r
-            SkipValue = 0;\r
-            //\r
-            // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
-            //\r
-            AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-            AdjustDateAndTimePosition (TRUE, &NewPos);\r
-            break;\r
-          }\r
-        }\r
-        NextMenuOption  = MENU_OPTION_FROM_LINK (NewPos);\r
-        if (NextMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (NextMenuOption);\r
-        }\r
-        DistanceValue  = Difference + NextMenuOption->Skip;\r
-\r
-        Temp = MenuOption->Row + MenuOption->Skip + DistanceValue - 1;\r
-        if ((MenuOption->Row + MenuOption->Skip == BottomRow + 1) &&\r
-            (NextMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP ||\r
-             NextMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)\r
-            ) {\r
-          Temp ++;\r
-        }\r
-\r
-        //\r
-        // If we are going to scroll, update TopOfScreen\r
-        //\r
-        if (Temp > BottomRow) {\r
-          do {\r
-            //\r
-            // Is the current top of screen a zero-advance op-code?\r
-            // If so, keep moving forward till we hit a >0 advance op-code\r
-            //\r
-            SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
-            //\r
-            // If bottom op-code is more than one line or top op-code is more than one line\r
-            //\r
-            if ((DistanceValue > 1) || (SavedMenuOption->Skip > 1)) {\r
-              //\r
-              // Is the bottom op-code greater than or equal in size to the top op-code?\r
-              //\r
-              if ((Temp - BottomRow) >= (SavedMenuOption->Skip - SkipValue)) {\r
-                //\r
-                // Skip the top op-code\r
-                //\r
-                TopOfScreen     = TopOfScreen->ForwardLink;\r
-                Difference      = (Temp - BottomRow) - (SavedMenuOption->Skip - SkipValue);\r
-\r
-                SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
-                //\r
-                // If we have a remainder, skip that many more op-codes until we drain the remainder\r
-                //\r
-                while (Difference >= (INTN) SavedMenuOption->Skip) {\r
-                  //\r
-                  // Since the Difference is greater than or equal to this op-code's skip value, skip it\r
-                  //\r
-                  Difference      = Difference - (INTN) SavedMenuOption->Skip;\r
-                  TopOfScreen     = TopOfScreen->ForwardLink;\r
-                  SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-                }\r
-                //\r
-                // Since we will act on this op-code in the next routine, and increment the\r
-                // SkipValue, set the skips to one less than what is required.\r
-                //\r
-                SkipValue = Difference - 1;\r
-              } else {\r
-                //\r
-                // Since we will act on this op-code in the next routine, and increment the\r
-                // SkipValue, set the skips to one less than what is required.\r
-                //\r
-                SkipValue += (Temp - BottomRow) - 1;\r
-              }\r
-            } else {\r
-              if ((SkipValue + 1) == (INTN) SavedMenuOption->Skip) {\r
-                TopOfScreen = TopOfScreen->ForwardLink;\r
-                break;\r
-              }\r
-            }\r
-            //\r
-            // If the op-code at the top of the screen is more than one line, let's not skip it yet\r
-            // Let's set a skip flag to smoothly scroll the top of the screen.\r
-            //\r
-            if (SavedMenuOption->Skip > 1) {\r
-              if (SavedMenuOption == NextMenuOption) {\r
-                SkipValue = 0;\r
-              } else {\r
-                SkipValue++;\r
-              }\r
-            } else if (SavedMenuOption->Skip == 1) {\r
-              SkipValue   = 0;\r
-            } else {\r
-              SkipValue   = 0;\r
-              TopOfScreen = TopOfScreen->ForwardLink;\r
-            }\r
-          } while (SavedMenuOption->Skip == 0);\r
-\r
-          Repaint       = TRUE;\r
-        } else if (!IsSelectable (NextMenuOption)) {\r
-          //\r
-          // Continue to go down until scroll to next page or the selectable option is found.\r
-          //\r
-          ScreenOperation = UiDown;\r
-          ControlFlag     = CfScreenOperation;\r
-        }\r
-\r
-        MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-\r
-        UpdateStatusBar (INPUT_ERROR, FALSE);\r
-\r
-      } else {\r
-        //\r
-        // Scroll to the first page.\r
-        //\r
-        if (TopOfScreen != gMenuOption.ForwardLink) {\r
-          TopOfScreen = gMenuOption.ForwardLink;\r
-          Repaint     = TRUE;\r
-          MenuOption  = NULL;\r
-        } else {\r
-          //\r
-          // Need to remove the current highlight menu.\r
-          // MenuOption saved the last highlight menu info.\r
-          //\r
-          MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        }\r
-\r
-        SkipValue     = 0;\r
-        NewLine       = TRUE;\r
-        //\r
-        // Get the next highlight menu.\r
-        //\r
-        NewPos        = gMenuOption.ForwardLink;\r
-        MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow);\r
-      }\r
-\r
-      //\r
-      // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiNoOperation:\r
-      ControlFlag = CfRepaint;\r
-      break;\r
-\r
-    case CfExit:\r
-      gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-      if (HelpString != NULL) {\r
-        FreePool (HelpString);\r
-      }\r
-      if (HelpHeaderString != NULL) {\r
-        FreePool (HelpHeaderString);\r
-      }\r
-      if (HelpBottomString != NULL) {\r
-        FreePool (HelpBottomString);\r
-      }\r
-      return EFI_SUCCESS;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-\r
-  Base on the browser status info to show an pop up message.\r
-\r
-**/\r
-VOID\r
-BrowserStatusProcess (\r
-  VOID\r
-  )\r
-{\r
-  CHAR16         *ErrorInfo;\r
-  EFI_INPUT_KEY  Key;\r
-\r
-  if (gFormData->BrowserStatus == BROWSER_SUCCESS) {\r
-    return;\r
-  }\r
-\r
-  if (gFormData->ErrorString != NULL) {\r
-    ErrorInfo = gFormData->ErrorString;\r
-  } else {\r
-    switch (gFormData->BrowserStatus) {\r
-    case BROWSER_SUBMIT_FAIL:\r
-      ErrorInfo = gSaveFailed;\r
-      break;\r
-\r
-    case BROWSER_NO_SUBMIT_IF:\r
-      ErrorInfo = gNoSubmitIf;\r
-      break;\r
-\r
-    case BROWSER_FORM_NOT_FOUND:\r
-      ErrorInfo = gFormNotFound;\r
-      break;\r
-\r
-    case BROWSER_FORM_SUPPRESS:\r
-      ErrorInfo = gFormSuppress;\r
-      break;\r
-\r
-    case BROWSER_PROTOCOL_NOT_FOUND:\r
-      ErrorInfo = gProtocolNotFound;\r
-      break;\r
-\r
-    default:\r
-      ErrorInfo = gBrwoserError;\r
-      break;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Error occur, prompt error message.\r
-  //\r
-  do {\r
-    CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
-  } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-}\r
-\r
-/**\r
-  Display one form, and return user input.\r
-  \r
-  @param FormData                Form Data to be shown.\r
-  @param UserInputData           User input data.\r
-  \r
-  @retval EFI_SUCCESS            1.Form Data is shown, and user input is got.\r
-                                 2.Error info has show and return.\r
-  @retval EFI_INVALID_PARAMETER  The input screen dimension is not valid\r
-  @retval EFI_NOT_FOUND          New form data has some error.\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-FormDisplay (\r
-  IN  FORM_DISPLAY_ENGINE_FORM  *FormData,\r
-  OUT USER_INPUT                *UserInputData\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  ASSERT (FormData != NULL);\r
-  if (FormData == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  gUserInput = UserInputData;\r
-  gFormData  = FormData;\r
-\r
-  //\r
-  // Process the status info first.\r
-  //\r
-  BrowserStatusProcess();\r
-  if (UserInputData == NULL) {\r
-    //\r
-    // UserInputData == NULL, means only need to print the error info, return here.\r
-    //\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  ConvertStatementToMenu();\r
-\r
-  Status = DisplayPageFrame (FormData, &gStatementDimensions);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Check whether layout is changed.\r
-  //\r
-  if (mIsFirstForm \r
-      || (gOldFormEntry.HiiHandle != FormData->HiiHandle)\r
-      || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))\r
-      || (gOldFormEntry.FormId != FormData->FormId)) {\r
-    mStatementLayoutIsChanged = TRUE;\r
-  } else {\r
-    mStatementLayoutIsChanged = FALSE;\r
-  }\r
-\r
-  Status = UiDisplayMenu(FormData);\r
-  \r
-  //\r
-  // Backup last form info.\r
-  //\r
-  mIsFirstForm            = FALSE;\r
-  gOldFormEntry.HiiHandle = FormData->HiiHandle;\r
-  CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid);\r
-  gOldFormEntry.FormId    = FormData->FormId;\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-DriverClearDisplayPage (\r
-  VOID\r
-  )\r
-{\r
-  ClearDisplayPage ();\r
-  mIsFirstForm = TRUE;\r
-}\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  )\r
-{\r
-  CHAR16  *Ptr;\r
-\r
-  Ptr = Buffer;\r
-  while ((Size--)  != 0) {\r
-    *(Ptr++) = Value;\r
-  }\r
-}\r
-\r
-/**\r
-  Initialize Setup Browser driver.\r
-\r
-  @param ImageHandle     The image handle.\r
-  @param SystemTable     The system table.\r
-\r
-  @retval EFI_SUCCESS    The Setup Browser module is initialized correctly..\r
-  @return Other value if failed to initialize the Setup Browser module.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeDisplayEngine (\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS                          Status;\r
-  EFI_INPUT_KEY                       HotKey;\r
-  EFI_STRING                          NewString;\r
-  EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2;\r
-\r
-  //\r
-  // Publish our HII data\r
-  //\r
-  gHiiHandle = HiiAddPackages (\r
-                 &gDisplayEngineGuid,\r
-                 ImageHandle,\r
-                 DisplayEngineStrings,\r
-                 NULL\r
-                 );\r
-  ASSERT (gHiiHandle != NULL);\r
-\r
-  //\r
-  // Install Form Display protocol\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &mPrivateData.Handle,\r
-                  &gEdkiiFormDisplayEngineProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &mPrivateData.FromDisplayProt\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  InitializeDisplayStrings();\r
-  \r
-  ZeroMem (&gHighligthMenuInfo, sizeof (gHighligthMenuInfo));\r
-  ZeroMem (&gOldFormEntry, sizeof (gOldFormEntry));\r
-\r
-  //\r
-  // Use BrowserEx2 protocol to register HotKey.\r
-  // \r
-  Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2);\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Register the default HotKey F9 and F10 again.\r
-    //\r
-    HotKey.UnicodeChar = CHAR_NULL;\r
-    HotKey.ScanCode   = SCAN_F10;\r
-    NewString         = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_TEN_STRING), NULL);\r
-    ASSERT (NewString != NULL);\r
-    FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_SUBMIT, 0, NewString);\r
-\r
-    HotKey.ScanCode   = SCAN_F9;\r
-    NewString         = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_NINE_STRING), NULL);\r
-    ASSERT (NewString != NULL);\r
-    FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD, NewString);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This is the default unload handle for display core drivers.\r
-\r
-  @param[in]  ImageHandle       The drivers' driver image.\r
-\r
-  @retval EFI_SUCCESS           The image is unloaded.\r
-  @retval Others                Failed to unload the image.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UnloadDisplayEngine (\r
-  IN EFI_HANDLE             ImageHandle\r
-  )\r
-{\r
-  HiiRemovePackages(gHiiHandle);\r
-\r
-  FreeDisplayStrings ();\r
-\r
-  return EFI_SUCCESS;\r
-}\r
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h
deleted file mode 100644 (file)
index 45bcadc..0000000
+++ /dev/null
@@ -1,589 +0,0 @@
-/** @file\r
-  FormDiplay protocol to show Form\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
-\r
-**/\r
-\r
-#ifndef __FORM_DISPLAY_H__\r
-#define __FORM_DISPLAY_H__\r
-\r
-\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/CustomizedDisplayLib.h>\r
-\r
-#include <Protocol/FormBrowserEx2.h>\r
-#include <Protocol/SimpleTextIn.h>\r
-#include <Protocol/DisplayProtocol.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-\r
-//\r
-// This is the generated header file which includes whatever needs to be exported (strings + IFR)\r
-//\r
-extern UINT8  DisplayEngineStrings[];\r
-extern EFI_SCREEN_DESCRIPTOR         gStatementDimensions;\r
-extern USER_INPUT                    *gUserInput;\r
-extern FORM_DISPLAY_ENGINE_FORM      *gFormData;\r
-extern EFI_HII_HANDLE                gHiiHandle;\r
-extern UINT16                        gDirection;\r
-extern LIST_ENTRY                    gMenuOption;\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-extern CHAR16            *gSaveFailed;\r
-extern CHAR16            *gPromptForData;\r
-extern CHAR16            *gPromptForPassword;\r
-extern CHAR16            *gPromptForNewPassword;\r
-extern CHAR16            *gConfirmPassword;\r
-extern CHAR16            *gConfirmError;\r
-extern CHAR16            *gPassowordInvalid;\r
-extern CHAR16            *gPressEnter;\r
-extern CHAR16            *gEmptyString;\r
-extern CHAR16            *gMiniString;\r
-extern CHAR16            *gOptionMismatch;\r
-extern CHAR16            *gFormSuppress;\r
-extern CHAR16            *gProtocolNotFound;\r
-\r
-extern CHAR16            gPromptBlockWidth;\r
-extern CHAR16            gOptionBlockWidth;\r
-extern CHAR16            gHelpBlockWidth;\r
-extern CHAR16            *mUnknownString;\r
-\r
-//\r
-// Screen definitions\r
-//\r
-\r
-#define LEFT_SKIPPED_COLUMNS          3\r
-#define SCROLL_ARROW_HEIGHT           1\r
-#define POPUP_PAD_SPACE_COUNT         5\r
-#define POPUP_FRAME_WIDTH             2\r
-\r
-//\r
-// Display definitions\r
-//\r
-#define LEFT_ONEOF_DELIMITER      L'<'\r
-#define RIGHT_ONEOF_DELIMITER     L'>'\r
-\r
-#define LEFT_NUMERIC_DELIMITER    L'['\r
-#define RIGHT_NUMERIC_DELIMITER   L']'\r
-\r
-#define LEFT_CHECKBOX_DELIMITER   L'['\r
-#define RIGHT_CHECKBOX_DELIMITER  L']'\r
-\r
-#define CHECK_ON                  L'X'\r
-#define CHECK_OFF                 L' '\r
-\r
-#define TIME_SEPARATOR            L':'\r
-#define DATE_SEPARATOR            L'/'\r
-\r
-#define SUBTITLE_INDENT  2\r
-\r
-//\r
-// This is the Input Error Message\r
-//\r
-#define INPUT_ERROR 1\r
-\r
-//\r
-// This is the NV RAM update required Message\r
-//\r
-#define NV_UPDATE_REQUIRED  2\r
-//\r
-// Time definitions\r
-//\r
-#define ONE_SECOND  10000000\r
-\r
-//\r
-// It take 23 characters including the NULL to print a 64 bits number with "[" and "]".\r
-// pow(2, 64) = [18446744073709551616]\r
-//\r
-#define MAX_NUMERIC_INPUT_WIDTH 23\r
-\r
-#define EFI_HII_EXPRESSION_INCONSISTENT_IF   0\r
-#define EFI_HII_EXPRESSION_NO_SUBMIT_IF      1\r
-#define EFI_HII_EXPRESSION_GRAY_OUT_IF       2\r
-#define EFI_HII_EXPRESSION_SUPPRESS_IF       3\r
-#define EFI_HII_EXPRESSION_DISABLE_IF        4\r
-\r
-//\r
-// Character definitions\r
-//\r
-#define CHAR_SPACE              0x0020\r
-\r
-#define FORM_DISPLAY_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'D', 'D', 'V')\r
-typedef struct {\r
-  UINT32                             Signature;\r
-\r
-  EFI_HANDLE                         Handle;\r
-\r
-  //\r
-  // Produced protocol\r
-  //\r
-  EDKII_FORM_DISPLAY_ENGINE_PROTOCOL FromDisplayProt;\r
-} FORM_DISPLAY_DRIVER_PRIVATE_DATA;\r
-\r
-\r
-typedef enum {\r
-  UiNoOperation,\r
-  UiSelect,\r
-  UiUp,\r
-  UiDown,\r
-  UiLeft,\r
-  UiRight,\r
-  UiReset,\r
-  UiPrevious,\r
-  UiPageUp,\r
-  UiPageDown,\r
-  UiHotKey,\r
-  UiMaxOperation\r
-} UI_SCREEN_OPERATION;\r
-\r
-typedef enum {\r
-  CfInitialization,\r
-  CfCheckSelection,\r
-  CfRepaint,\r
-  CfRefreshHighLight,\r
-  CfUpdateHelpString,\r
-  CfPrepareToReadKey,\r
-  CfReadKey,\r
-  CfScreenOperation,\r
-  CfUiSelect,\r
-  CfUiReset,\r
-  CfUiLeft,\r
-  CfUiRight,\r
-  CfUiUp,\r
-  CfUiPageUp,\r
-  CfUiPageDown,\r
-  CfUiDown,\r
-  CfUiDefault,\r
-  CfUiNoOperation,\r
-  CfExit,\r
-  CfUiHotKey,\r
-  CfMaxControlFlag\r
-} UI_CONTROL_FLAG;\r
-\r
-typedef enum {\r
-  UIEventNone,\r
-  UIEventKey,\r
-  UIEventTimeOut,\r
-  UIEventDriver\r
-} UI_EVENT_TYPE;\r
-\r
-typedef struct {\r
-  UINT16              ScanCode;\r
-  UI_SCREEN_OPERATION ScreenOperation;\r
-} SCAN_CODE_TO_SCREEN_OPERATION;\r
-\r
-typedef struct {\r
-  UI_SCREEN_OPERATION ScreenOperation;\r
-  UI_CONTROL_FLAG     ControlFlag;\r
-} SCREEN_OPERATION_T0_CONTROL_FLAG;\r
-\r
-typedef struct {\r
-  EFI_QUESTION_ID    QuestionId;\r
-  UINT16             DisplayRow;\r
-} DISPLAY_HIGHLIGHT_MENU_INFO;\r
-\r
-#define UI_MENU_OPTION_SIGNATURE  SIGNATURE_32 ('u', 'i', 'm', 'm')\r
-\r
-typedef struct {\r
-  UINTN                   Signature;\r
-  LIST_ENTRY              Link;\r
-\r
-  EFI_HII_HANDLE          Handle;\r
-  FORM_DISPLAY_ENGINE_STATEMENT  *ThisTag;\r
-  UINT16                  EntryNumber;\r
-\r
-  UINTN                   Row;\r
-  UINTN                   Col;\r
-  UINTN                   OptCol;\r
-  CHAR16                  *Description;\r
-  UINTN                   Skip;           // Number of lines\r
-\r
-  //\r
-  // Display item sequence for date/time\r
-  //  Date:      Month/Day/Year\r
-  //  Sequence:  0     1   2\r
-  //\r
-  //  Time:      Hour : Minute : Second\r
-  //  Sequence:  0      1        2\r
-  //\r
-  //\r
-  UINTN                   Sequence;\r
-\r
-  BOOLEAN                 GrayOut;\r
-  BOOLEAN                 ReadOnly;\r
-\r
-  //\r
-  // Whether user could change value of this item\r
-  //\r
-  BOOLEAN                 IsQuestion;\r
-  BOOLEAN                 NestInStatement;\r
-} UI_MENU_OPTION;\r
-\r
-#define MENU_OPTION_FROM_LINK(a)  CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)\r
-\r
-/**\r
-  Print Question Value according to it's storage width and display attributes.\r
-\r
-  @param  Question               The Question to be printed.\r
-  @param  FormattedNumber        Buffer for output string.\r
-  @param  BufferSize             The FormattedNumber buffer size in bytes.\r
-\r
-  @retval EFI_SUCCESS            Print success.\r
-  @retval EFI_BUFFER_TOO_SMALL   Buffer size is not enough for formatted number.\r
-\r
-**/\r
-EFI_STATUS\r
-PrintFormattedNumber (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT   *Question,\r
-  IN OUT CHAR16               *FormattedNumber,\r
-  IN UINTN                    BufferSize\r
-  );\r
-\r
-/**\r
-  Set value of a data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-  @param  Value                  The value to be set.\r
-\r
-**/\r
-VOID\r
-SetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index,\r
-  IN UINT64                   Value\r
-  );\r
-\r
-/**\r
-  Return data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-\r
-  @retval Value                  The data to be returned\r
-\r
-**/\r
-UINT64\r
-GetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index\r
-  );\r
-  \r
-/**\r
-  Search an Option of a Question by its value.\r
-\r
-  @param  Question               The Question\r
-  @param  OptionValue            Value for Option to be searched.\r
-\r
-  @retval Pointer                Pointer to the found Option.\r
-  @retval NULL                   Option not found.\r
-\r
-**/\r
-DISPLAY_QUESTION_OPTION *\r
-ValueToOption (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT   *Question,\r
-  IN EFI_HII_VALUE                   *OptionValue\r
-  );\r
-\r
-/**\r
-  Compare two Hii value.\r
-\r
-  @param  Value1                 Expression value to compare on left-hand.\r
-  @param  Value2                 Expression value to compare on right-hand.\r
-  @param  Result                 Return value after compare.\r
-                                 retval 0                      Two operators equal.\r
-                                 return Positive value if Value1 is greater than Value2.\r
-                                 retval Negative value if Value1 is less than Value2.\r
-  @param  HiiHandle              Only required for string compare.\r
-\r
-  @retval other                  Could not perform compare on two values.\r
-  @retval EFI_SUCCESS            Compare the value success.\r
-\r
-**/\r
-EFI_STATUS\r
-CompareHiiValue (\r
-  IN  EFI_HII_VALUE   *Value1,\r
-  IN  EFI_HII_VALUE   *Value2,\r
-  OUT INTN            *Result,\r
-  IN  EFI_HII_HANDLE  HiiHandle OPTIONAL\r
-  );\r
-\r
-/**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
-\r
-  @param RequestedWidth  The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param ...             A series of text strings that displayed in the pop-up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CreateMultiStringPopUp (\r
-  IN  UINTN                       RequestedWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Will copy LineWidth amount of a string in the OutputString buffer and return the\r
-  number of CHAR16 characters that were copied into the OutputString buffer.\r
-  The output string format is:\r
-    Glyph Info + String info + '\0'.\r
-\r
-  In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
-  @param  InputString            String description for this option.\r
-  @param  LineWidth              Width of the desired string to extract in CHAR16\r
-                                 characters\r
-  @param  GlyphWidth             The glyph width of the begin of the char in the string.\r
-  @param  Index                  Where in InputString to start the copy process\r
-  @param  OutputString           Buffer to copy the string into\r
-\r
-  @return Returns the number of CHAR16 characters that were copied into the OutputString \r
-  buffer, include extra glyph info and '\0' info.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
-  IN      CHAR16                      *InputString,\r
-  IN      UINT16                      LineWidth,\r
-  IN OUT  UINT16                      *GlyphWidth,\r
-  IN OUT  UINTN                       *Index,\r
-  OUT     CHAR16                      **OutputString\r
-  );\r
-\r
-\r
-/**\r
-  Get the string based on the StringId and HII Package List Handle.\r
-\r
-  @param  Token                  The String's ID.\r
-  @param  HiiHandle              The Hii handle for this string package.\r
-\r
-  @return The output string.\r
-\r
-**/\r
-CHAR16 *\r
-GetToken (\r
-  IN  EFI_STRING_ID                Token,\r
-  IN  EFI_HII_HANDLE               HiiHandle\r
-  );\r
-  \r
-/**\r
-  Count the storage space of a Unicode string.\r
-\r
-  This function handles the Unicode string with NARROW_CHAR\r
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
-  does not count in the resultant output. If a WIDE_CHAR is\r
-  hit, then 2 Unicode character will consume an output storage\r
-  space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
-  If String is NULL, then ASSERT ().\r
-\r
-  @param String          The input string to be counted.\r
-\r
-  @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-GetStringWidth (\r
-  IN CHAR16               *String\r
-  );\r
-\r
-/**\r
-  This routine reads a numeric value from the user input.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If numerical input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  );\r
-\r
-/**\r
-  Get string or password input from user.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-  @param  Prompt            The prompt string shown on popup window.\r
-  @param  StringPtr         Old user input and destination for use input string.\r
-\r
-  @retval EFI_SUCCESS       If string input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
-  IN     UI_MENU_OPTION              *MenuOption,\r
-  IN     CHAR16                      *Prompt,\r
-  IN OUT CHAR16                      *StringPtr\r
-  );\r
-\r
-/**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
-\r
-  @param RequestedWidth  The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param Marker          The variable argument list for the list of string to be printed.\r
-\r
-**/\r
-VOID\r
-CreateSharedPopUp (\r
-  IN  UINTN                       RequestedWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  IN  VA_LIST                     Marker\r
-  );\r
-  \r
-/**\r
-  Wait for a key to be pressed by user.\r
-\r
-  @param Key         The key which is pressed by user.\r
-\r
-  @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
-  );\r
-\r
-/**\r
-  Get selection for OneOf and OrderedList (Left/Right will be ignored).\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If Option input is processed successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetSelectionInputPopUp (\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  );\r
-\r
-/**\r
-  Process the help string: Split StringPtr to several lines of strings stored in\r
-  FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.\r
-\r
-  @param  StringPtr              The entire help string.\r
-  @param  FormattedString        The oupput formatted string.\r
-  @param  EachLineWidth          The max string length of each line in the formatted string.\r
-  @param  RowCount               TRUE: if Question is selected.\r
-\r
-**/\r
-UINTN\r
-ProcessHelpString (\r
-  IN  CHAR16  *StringPtr,\r
-  OUT CHAR16  **FormattedString,\r
-  OUT UINT16  *EachLineWidth,\r
-  IN  UINTN   RowCount\r
-  );\r
-\r
-/**\r
-  Process a Question's Option (whether selected or un-selected).\r
-\r
-  @param  MenuOption             The MenuOption for this Question.\r
-  @param  Selected               TRUE: if Question is selected.\r
-  @param  OptionString           Pointer of the Option String to be displayed.\r
-  @param  SkipErrorValue         Whether need to return when value without option for it.\r
-\r
-  @retval EFI_SUCCESS            Question Option process success.\r
-  @retval Other                  Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessOptions (\r
-  IN  UI_MENU_OPTION              *MenuOption,\r
-  IN  BOOLEAN                     Selected,\r
-  OUT CHAR16                      **OptionString,\r
-  IN  BOOLEAN                     SkipErrorValue\r
-  );\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  );\r
-\r
-/**\r
-  Display one form, and return user input.\r
-  \r
-  @param FormData                Form Data to be shown.\r
-  @param UserInputData           User input data.\r
-  \r
-  @retval EFI_SUCCESS            Form Data is shown, and user input is got.\r
-**/\r
-EFI_STATUS\r
-EFIAPI \r
-FormDisplay (\r
-  IN  FORM_DISPLAY_ENGINE_FORM  *FormData,\r
-  OUT USER_INPUT                *UserInputData\r
-  );\r
-\r
-/**\r
-  Clear Screen to the initial state.\r
-**/\r
-VOID\r
-EFIAPI \r
-DriverClearDisplayPage (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Exit Display and Clear Screen to the original state.\r
-\r
-**/\r
-VOID\r
-EFIAPI \r
-ExitDisplay (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Process validate for one question.\r
-\r
-  @param  Question               The question which need to validate.\r
-\r
-  @retval EFI_SUCCESS            Question Option process success.\r
-  @retval Other                  Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS \r
-ValidateQuestion (\r
-  IN FORM_DISPLAY_ENGINE_STATEMENT   *Question\r
-  );\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni b/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni
deleted file mode 100644 (file)
index 0ee7f46..0000000
Binary files a/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplayStr.uni and /dev/null differ
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c b/MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c
deleted file mode 100644 (file)
index a58e12f..0000000
+++ /dev/null
@@ -1,1531 +0,0 @@
-/** @file\r
-Implementation for handling user input from the User Interfaces.\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\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
-\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
-#include "FormDisplay.h"\r
-\r
-/**\r
-  Get maximum and minimum info from this opcode.\r
-\r
-  @param  OpCode            Pointer to the current input opcode.\r
-  @param  Minimum           The minimum size info for this opcode.\r
-  @param  Maximum           The maximum size info for this opcode.\r
-\r
-**/\r
-VOID\r
-GetFieldFromOp (\r
-  IN   EFI_IFR_OP_HEADER       *OpCode,\r
-  OUT  UINTN                   *Minimum,\r
-  OUT  UINTN                   *Maximum\r
-  )\r
-{\r
-  EFI_IFR_STRING    *StringOp;\r
-  EFI_IFR_PASSWORD  *PasswordOp;\r
-  if (OpCode->OpCode == EFI_IFR_STRING_OP) {\r
-    StringOp = (EFI_IFR_STRING *) OpCode;\r
-    *Minimum = StringOp->MinSize;\r
-    *Maximum = StringOp->MaxSize;    \r
-  } else if (OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
-    PasswordOp = (EFI_IFR_PASSWORD *) OpCode;\r
-    *Minimum = PasswordOp->MinSize;\r
-    *Maximum = PasswordOp->MaxSize;       \r
-  } else {\r
-    *Minimum = 0;\r
-    *Maximum = 0;       \r
-  }\r
-}\r
-\r
-/**\r
-  Get string or password input from user.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-  @param  Prompt            The prompt string shown on popup window.\r
-  @param  StringPtr         Old user input and destination for use input string.\r
-\r
-  @retval EFI_SUCCESS       If string input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
-  IN     UI_MENU_OPTION              *MenuOption,\r
-  IN     CHAR16                      *Prompt,\r
-  IN OUT CHAR16                      *StringPtr\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_INPUT_KEY           Key;\r
-  CHAR16                  NullCharacter;\r
-  UINTN                   ScreenSize;\r
-  CHAR16                  Space[2];\r
-  CHAR16                  KeyPad[2];\r
-  CHAR16                  *TempString;\r
-  CHAR16                  *BufferedString;\r
-  UINTN                   Index;\r
-  UINTN                   Index2;\r
-  UINTN                   Count;\r
-  UINTN                   Start;\r
-  UINTN                   Top;\r
-  UINTN                   DimensionsWidth;\r
-  UINTN                   DimensionsHeight;\r
-  UINTN                   CurrentCursor;\r
-  BOOLEAN                 CursorVisible;\r
-  UINTN                   Minimum;\r
-  UINTN                   Maximum;\r
-  FORM_DISPLAY_ENGINE_STATEMENT  *Question;\r
-  BOOLEAN                 IsPassword;\r
-\r
-  DimensionsWidth  = gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn;\r
-  DimensionsHeight = gStatementDimensions.BottomRow - gStatementDimensions.TopRow;\r
-\r
-  NullCharacter    = CHAR_NULL;\r
-  ScreenSize       = GetStringWidth (Prompt) / sizeof (CHAR16);\r
-  Space[0]         = L' ';\r
-  Space[1]         = CHAR_NULL;\r
-\r
-  Question         = MenuOption->ThisTag;\r
-  GetFieldFromOp(Question->OpCode, &Minimum, &Maximum);\r
-\r
-  if (Question->OpCode->OpCode == EFI_IFR_PASSWORD_OP) {\r
-    IsPassword = TRUE;\r
-  } else {\r
-    IsPassword = FALSE;\r
-  }\r
-\r
-  TempString = AllocateZeroPool ((Maximum + 1)* sizeof (CHAR16));\r
-  ASSERT (TempString);\r
-\r
-  if (ScreenSize < (Maximum + 1)) {\r
-    ScreenSize = Maximum + 1;\r
-  }\r
-\r
-  if ((ScreenSize + 2) > DimensionsWidth) {\r
-    ScreenSize = DimensionsWidth - 2;\r
-  }\r
-\r
-  BufferedString = AllocateZeroPool (ScreenSize * 2);\r
-  ASSERT (BufferedString);\r
-\r
-  Start = (DimensionsWidth - ScreenSize - 2) / 2 + gStatementDimensions.LeftColumn + 1;\r
-  Top   = ((DimensionsHeight - 6) / 2) + gStatementDimensions.TopRow - 1;\r
-\r
-  //\r
-  // Display prompt for string\r
-  //\r
-  // CreateDialog (NULL, "", Prompt, Space, "", NULL);\r
-  CreateMultiStringPopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);\r
-  gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
-\r
-  CursorVisible = gST->ConOut->Mode->CursorVisible;\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-\r
-  CurrentCursor = GetStringWidth (StringPtr) / 2 - 1;\r
-  if (CurrentCursor != 0) {\r
-    //\r
-    // Show the string which has beed saved before.\r
-    //\r
-    SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
-    PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
-    if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
-      Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
-    } else {\r
-      Index = 0;\r
-    }\r
-\r
-    if (IsPassword) {\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
-    }\r
-\r
-    for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
-      BufferedString[Count] = StringPtr[Index];\r
-\r
-      if (IsPassword) {\r
-        PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
-      }\r
-    }\r
-\r
-    if (!IsPassword) {\r
-      PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-    }\r
-    \r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-    gST->ConOut->SetCursorPosition (gST->ConOut, Start + GetStringWidth (StringPtr) / 2, Top + 3);\r
-  }\r
-  \r
-  do {\r
-    Status = WaitForKeyStroke (&Key);\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
-    switch (Key.UnicodeChar) {\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-        if (CurrentCursor > 0) {\r
-          CurrentCursor--;\r
-        }\r
-        break;\r
-\r
-      case SCAN_RIGHT:\r
-        if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {\r
-          CurrentCursor++;\r
-        }\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-\r
-      default:\r
-        break;\r
-      }\r
-\r
-      break;\r
-\r
-    case CHAR_CARRIAGE_RETURN:\r
-      if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {\r
-\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_SUCCESS;\r
-      } else {\r
-        //\r
-        // Simply create a popup to tell the user that they had typed in too few characters.\r
-        // To save code space, we can then treat this as an error and return back to the menu.\r
-        //\r
-        do {\r
-          CreateDialog (&Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter, NULL);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-      }\r
-\r
-      break;\r
-\r
-    case CHAR_BACKSPACE:\r
-      if (StringPtr[0] != CHAR_NULL && CurrentCursor != 0) {\r
-        for (Index = 0; Index < CurrentCursor - 1; Index++) {\r
-          TempString[Index] = StringPtr[Index];\r
-        }\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (Count >= CurrentCursor) {\r
-          for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {\r
-            TempString[Index] = StringPtr[Index2];\r
-          }\r
-          TempString[Index] = CHAR_NULL;\r
-        }\r
-        //\r
-        // Effectively truncate string by 1 character\r
-        //\r
-        StrCpy (StringPtr, TempString);\r
-        CurrentCursor --;\r
-      }\r
-\r
-    default:\r
-      //\r
-      // If it is the beginning of the string, don't worry about checking maximum limits\r
-      //\r
-      if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        StrnCpy (StringPtr, &Key.UnicodeChar, 1);\r
-        CurrentCursor++;\r
-      } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        KeyPad[0] = Key.UnicodeChar;\r
-        KeyPad[1] = CHAR_NULL;\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (CurrentCursor < Count) {\r
-          for (Index = 0; Index < CurrentCursor; Index++) {\r
-            TempString[Index] = StringPtr[Index];\r
-          }\r
-                 TempString[Index] = CHAR_NULL;\r
-          StrCat (TempString, KeyPad);\r
-          StrCat (TempString, StringPtr + CurrentCursor);\r
-          StrCpy (StringPtr, TempString);\r
-        } else {\r
-          StrCat (StringPtr, KeyPad);\r
-        }\r
-        CurrentCursor++;\r
-      }\r
-\r
-      //\r
-      // If the width of the input string is now larger than the screen, we nee to\r
-      // adjust the index to start printing portions of the string\r
-      //\r
-      SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
-      PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
-      if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
-        Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
-      } else {\r
-        Index = 0;\r
-      }\r
-\r
-      if (IsPassword) {\r
-        gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
-      }\r
-\r
-      for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
-        BufferedString[Count] = StringPtr[Index];\r
-\r
-        if (IsPassword) {\r
-          PrintCharAt ((UINTN)-1, (UINTN)-1, L'*');\r
-        }\r
-      }\r
-\r
-      if (!IsPassword) {\r
-        PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-      }\r
-      break;\r
-    }\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-    gST->ConOut->SetCursorPosition (gST->ConOut, Start + CurrentCursor + 1, Top + 3);\r
-  } while (TRUE);\r
-\r
-}\r
-\r
-/**\r
-  Adjust the value to the correct one. Rules follow the sample:\r
-  like:  Year change:  2012.02.29 -> 2013.02.29 -> 2013.02.01\r
-         Month change: 2013.03.29 -> 2013.02.29 -> 2013.02.28\r
-\r
-  @param  QuestionValue     Pointer to current question.\r
-  @param  Sequence          The sequence of the field in the question.\r
-**/\r
-VOID\r
-AdjustQuestionValue (\r
-  IN  EFI_HII_VALUE           *QuestionValue,\r
-  IN  UINT8                   Sequence\r
-  )\r
-{\r
-  UINT8     Month;\r
-  UINT16    Year;\r
-  UINT8     Maximum;\r
-  UINT8     Minimum;\r
-\r
-  Month   = QuestionValue->Value.date.Month;\r
-  Year    = QuestionValue->Value.date.Year;\r
-  Minimum = 1;\r
-\r
-  switch (Month) {\r
-  case 2:\r
-    if ((Year % 4) == 0 && ((Year % 100) != 0 || (Year % 400) == 0)) {\r
-      Maximum = 29;\r
-    } else {\r
-      Maximum = 28;\r
-    }\r
-    break;\r
-  case 4:\r
-  case 6:\r
-  case 9:\r
-  case 11:\r
-    Maximum = 30;\r
-    break;\r
-  default:\r
-    Maximum = 31;\r
-    break;\r
-  }\r
-\r
-  //\r
-  // Change the month area.\r
-  //\r
-  if (Sequence == 0) {\r
-    if (QuestionValue->Value.date.Day > Maximum) {\r
-      QuestionValue->Value.date.Day = Maximum;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Change the Year area.\r
-  //\r
-  if (Sequence == 2) {\r
-    if (QuestionValue->Value.date.Day > Maximum) {\r
-      QuestionValue->Value.date.Day = Minimum;\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Get field info from numeric opcode.\r
-\r
-  @param  OpCode            Pointer to the current input opcode.\r
-  @param  Minimum           The minimum size info for this opcode.\r
-  @param  Maximum           The maximum size info for this opcode.\r
-  @param  Step              The step size info for this opcode.\r
-  @param  StorageWidth      The storage width info for this opcode.\r
-\r
-**/\r
-VOID\r
-GetValueFromNum (\r
-  IN  EFI_IFR_OP_HEADER     *OpCode,\r
-  OUT UINT64                *Minimum,\r
-  OUT UINT64                *Maximum,\r
-  OUT UINT64                *Step,\r
-  OUT UINT16                *StorageWidth\r
-)\r
-{\r
-  EFI_IFR_NUMERIC       *NumericOp;\r
-\r
-  NumericOp = (EFI_IFR_NUMERIC *) OpCode;\r
-  \r
-  switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) {\r
-  case EFI_IFR_NUMERIC_SIZE_1:\r
-    *Minimum = NumericOp->data.u8.MinValue;\r
-    *Maximum = NumericOp->data.u8.MaxValue;\r
-    *Step    = NumericOp->data.u8.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT8);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_2:\r
-    *Minimum = NumericOp->data.u16.MinValue;\r
-    *Maximum = NumericOp->data.u16.MaxValue;\r
-    *Step    = NumericOp->data.u16.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT16);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_4:\r
-    *Minimum = NumericOp->data.u32.MinValue;\r
-    *Maximum = NumericOp->data.u32.MaxValue;\r
-    *Step    = NumericOp->data.u32.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT32);\r
-    break;\r
-  \r
-  case EFI_IFR_NUMERIC_SIZE_8:\r
-    *Minimum = NumericOp->data.u64.MinValue;\r
-    *Maximum = NumericOp->data.u64.MaxValue;\r
-    *Step    = NumericOp->data.u64.Step;\r
-    *StorageWidth = (UINT16) sizeof (UINT64);\r
-    break;\r
-  \r
-  default:\r
-    break;\r
-  }\r
-\r
-  if (*Maximum == 0) {\r
-    *Maximum = (UINT64) -1;\r
-  }\r
-}\r
-\r
-/**\r
-  This routine reads a numeric value from the user input.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If numerical input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  UINTN                   Column;\r
-  UINTN                   Row;\r
-  CHAR16                  InputText[MAX_NUMERIC_INPUT_WIDTH];\r
-  CHAR16                  FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];\r
-  UINT64                  PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];\r
-  UINTN                   Count;\r
-  UINTN                   Loop;\r
-  BOOLEAN                 ManualInput;\r
-  BOOLEAN                 HexInput;\r
-  BOOLEAN                 DateOrTime;\r
-  UINTN                   InputWidth;\r
-  UINT64                  EditValue;\r
-  UINT64                  Step;\r
-  UINT64                  Minimum;\r
-  UINT64                  Maximum;\r
-  UINTN                   EraseLen;\r
-  UINT8                   Digital;\r
-  EFI_INPUT_KEY           Key;\r
-  EFI_HII_VALUE           *QuestionValue;\r
-  FORM_DISPLAY_ENGINE_STATEMENT  *Question;\r
-  EFI_IFR_NUMERIC                *NumericOp;\r
-  UINT16                         StorageWidth;\r
-\r
-  Column            = MenuOption->OptCol;\r
-  Row               = MenuOption->Row;\r
-  PreviousNumber[0] = 0;\r
-  Count             = 0;\r
-  InputWidth        = 0;\r
-  Digital           = 0;\r
-  StorageWidth      = 0;\r
-  Minimum           = 0;\r
-  Maximum           = 0;\r
-  NumericOp         = NULL;\r
-\r
-  Question      = MenuOption->ThisTag;\r
-  QuestionValue = &Question->CurrentValue;\r
-\r
-  //\r
-  // Only two case, user can enter to this function: Enter and +/- case.\r
-  // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT\r
-  //\r
-  ManualInput        = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
-\r
-  if ((Question->OpCode->OpCode == EFI_IFR_DATE_OP) || (Question->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-    DateOrTime = TRUE;\r
-  } else {\r
-    DateOrTime = FALSE;\r
-  }\r
-\r
-  //\r
-  // Prepare Value to be edit\r
-  //\r
-  EraseLen = 0;\r
-  EditValue = 0;\r
-  if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-    Step = 1;\r
-    Minimum = 1;\r
-\r
-    switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 12;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.date.Month;\r
-      break;\r
-\r
-    case 1:\r
-      switch (QuestionValue->Value.date.Month) {\r
-      case 2:\r
-        if ((QuestionValue->Value.date.Year % 4) == 0  && \r
-            ((QuestionValue->Value.date.Year % 100) != 0 || \r
-            (QuestionValue->Value.date.Year % 400) == 0)) {\r
-          Maximum = 29;\r
-        } else {\r
-          Maximum = 28;\r
-        }\r
-        break;\r
-      case 4:\r
-      case 6:\r
-      case 9:\r
-      case 11:\r
-        Maximum = 30;\r
-        break;\r
-      default:\r
-        Maximum = 31;\r
-        break;\r
-      } \r
-\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.date.Day;\r
-      break;\r
-\r
-    case 2:\r
-      Maximum = 0xffff;\r
-      EraseLen = 5;\r
-      EditValue = QuestionValue->Value.date.Year;\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-    Step = 1;\r
-    Minimum = 0;\r
-\r
-    switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 23;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.time.Hour;\r
-      break;\r
-\r
-    case 1:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Minute;\r
-      break;\r
-\r
-    case 2:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Second;\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  } else {\r
-    ASSERT (Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP);\r
-    NumericOp = (EFI_IFR_NUMERIC *) Question->OpCode;\r
-    GetValueFromNum(Question->OpCode, &Minimum, &Maximum, &Step, &StorageWidth);\r
-    EditValue = QuestionValue->Value.u64;\r
-    EraseLen  = gOptionBlockWidth;\r
-  }\r
-\r
-  if ((Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (NumericOp != NULL) &&\r
-      ((NumericOp->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX)) {\r
-    HexInput = TRUE;\r
-  } else {\r
-    HexInput = FALSE;\r
-  }\r
-\r
-  //\r
-  // Enter from "Enter" input, clear the old word showing.\r
-  //\r
-  if (ManualInput) {\r
-    if (Question->OpCode->OpCode == EFI_IFR_NUMERIC_OP) {\r
-      if (HexInput) {\r
-        InputWidth = StorageWidth * 2;\r
-      } else {\r
-        switch (StorageWidth) {\r
-        case 1:\r
-          InputWidth = 3;\r
-          break;\r
-\r
-        case 2:\r
-          InputWidth = 5;\r
-          break;\r
-\r
-        case 4:\r
-          InputWidth = 10;\r
-          break;\r
-\r
-        case 8:\r
-          InputWidth = 20;\r
-          break;\r
-\r
-        default:\r
-          InputWidth = 0;\r
-          break;\r
-        }\r
-      }\r
-\r
-      InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-      SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH);\r
-      InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintStringAt (Column, Row, InputText);\r
-      Column++;\r
-    }\r
-\r
-    if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-      if (MenuOption->Sequence == 2) {\r
-        InputWidth = 4;\r
-      } else {\r
-        InputWidth = 2;\r
-      }\r
-\r
-      if (MenuOption->Sequence == 0) {\r
-        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
-        SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      } else {\r
-        InputText[InputWidth + 1] = DATE_SEPARATOR;\r
-      }\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintStringAt (Column, Row, InputText);\r
-      if (MenuOption->Sequence == 0) {\r
-        Column++;\r
-      }\r
-    }\r
-\r
-    if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-      InputWidth = 2;\r
-\r
-      if (MenuOption->Sequence == 0) {\r
-        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
-        SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      } else {\r
-        InputText[InputWidth + 1] = TIME_SEPARATOR;\r
-      }\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintStringAt (Column, Row, InputText);\r
-      if (MenuOption->Sequence == 0) {\r
-        Column++;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // First time we enter this handler, we need to check to see if\r
-  // we were passed an increment or decrement directive\r
-  //\r
-  do {\r
-    Key.UnicodeChar = CHAR_NULL;\r
-    if (gDirection != 0) {\r
-      Key.ScanCode  = gDirection;\r
-      gDirection    = 0;\r
-      goto TheKey2;\r
-    }\r
-\r
-    Status = WaitForKeyStroke (&Key);\r
-\r
-TheKey2:\r
-    switch (Key.UnicodeChar) {\r
-\r
-    case '+':\r
-    case '-':\r
-      if (Key.UnicodeChar == '+') {\r
-        Key.ScanCode = SCAN_RIGHT;\r
-      } else {\r
-        Key.ScanCode = SCAN_LEFT;\r
-      }\r
-      Key.UnicodeChar = CHAR_NULL;\r
-      goto TheKey2;\r
-\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-      case SCAN_RIGHT:\r
-        if (DateOrTime && !ManualInput) {\r
-          //\r
-          // By setting this value, we will return back to the caller.\r
-          // We need to do this since an auto-refresh will destroy the adjustment\r
-          // based on what the real-time-clock is showing.  So we always commit\r
-          // upon changing the value.\r
-          //\r
-          gDirection = SCAN_DOWN;\r
-        }\r
-\r
-        if ((Step != 0) && !ManualInput) {\r
-          if (Key.ScanCode == SCAN_LEFT) {\r
-            if (EditValue >= Minimum + Step) {\r
-              EditValue = EditValue - Step;\r
-            } else if (EditValue > Minimum){\r
-              EditValue = Minimum;\r
-            } else {\r
-              EditValue = Maximum;\r
-            }\r
-          } else if (Key.ScanCode == SCAN_RIGHT) {\r
-            if (EditValue + Step <= Maximum) {\r
-              EditValue = EditValue + Step;\r
-            } else if (EditValue < Maximum) {\r
-              EditValue = Maximum;\r
-            } else {\r
-              EditValue = Minimum;\r
-            }\r
-          }\r
-\r
-          ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
-          if (Question->OpCode->OpCode == EFI_IFR_DATE_OP) {\r
-            if (MenuOption->Sequence == 2) {\r
-              //\r
-              // Year\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);\r
-            } else {\r
-              //\r
-              // Month/Day\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-            }\r
-\r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
-            }\r
-          } else if (Question->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
-            UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-\r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
-            }\r
-          } else {\r
-            QuestionValue->Value.u64 = EditValue;\r
-            PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
-          }\r
-\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
-          for (Loop = 0; Loop < EraseLen; Loop++) {\r
-            PrintStringAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
-          }\r
-          gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
-\r
-          if (MenuOption->Sequence == 0) {\r
-            PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
-            Column = MenuOption->OptCol + 1;\r
-          }\r
-\r
-          PrintStringAt (Column, Row, FormattedNumber);\r
-\r
-          if (!DateOrTime || MenuOption->Sequence == 2) {\r
-            PrintCharAt ((UINTN)-1, (UINTN)-1, RIGHT_NUMERIC_DELIMITER);\r
-          }\r
-        }\r
-\r
-        goto EnterCarriageReturn;\r
-        break;\r
-\r
-      case SCAN_UP:\r
-      case SCAN_DOWN:\r
-        goto EnterCarriageReturn;\r
-\r
-      case SCAN_ESC:\r
-        return EFI_DEVICE_ERROR;\r
-\r<