17c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** @file
27c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
37c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This library class defines a set of interfaces to customize Display module
47c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric DongCopyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
67c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongThis program and the accompanying materials are licensed and made available under
77c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dongthe terms and conditions of the BSD License that accompanies this distribution.
87c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongThe full text of the license may be found at
97c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Donghttp://opensource.org/licenses/bsd-license.php.
107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong#include "CustomizedDisplayLibInternal.h"
167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_GUID          gCustomizedDisplayLibGuid = { 0x99fdc8fd, 0x849b, 0x4eba, { 0xad, 0x13, 0xfb, 0x96, 0x99, 0xc9, 0xa, 0x4d } };
187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_HII_HANDLE    mCDLStringPackHandle;
207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT16            gClassOfVfr;                 // Formset class information
215a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongBOOLEAN           gLibIsFirstForm = TRUE;
227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBANNER_DATA       *gBannerData;
237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN             gFooterHeight;
257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong+------------------------------------------------------------------------------+
287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong|                                 Setup Page                                   |
297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong+------------------------------------------------------------------------------+
307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongStatement
327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongStatement
337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongStatement
347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong+------------------------------------------------------------------------------+
405a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong|                                F9=Reset to Defaults        F10=Save          |
415a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong| ^"=Move Highlight          <Spacebar> Toggles Checkbox     Esc=Exit          |
427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong+------------------------------------------------------------------------------+
437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  StatusBar
447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This funtion defines Page Frame and Backgroud.
487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Based on the above layout, it will be responsible for HeaderHeight, FooterHeight,
507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  StatusBarHeight and Backgroud. And, it will reserve Screen for Statement.
517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  FormData             Form Data to be shown in Page.
537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[out] ScreenForStatement   Screen to be used for Statement. (Prompt, Value and Help)
547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return Status
567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS
587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongDisplayPageFrame (
607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN FORM_DISPLAY_ENGINE_FORM       *FormData,
617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  OUT EFI_SCREEN_DESCRIPTOR         *ScreenForStatement
627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_STATUS             Status;
657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ASSERT (FormData != NULL && ScreenForStatement != NULL);
677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (FormData == NULL || ScreenForStatement == NULL) {
687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return EFI_INVALID_PARAMETER;
697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Status = ScreenDiemensionInfoValidate (FormData);
727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (EFI_ERROR (Status)) {
737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return Status;
747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;
777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ProcessExternedOpcode(FormData);
797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // Calculate the ScreenForStatement.
827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ScreenForStatement->BottomRow   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight;
845a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {
857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ScreenForStatement->TopRow    = gScreenDimensions.TopRow + FRONT_PAGE_HEADER_HEIGHT;
867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } else {
877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ScreenForStatement->TopRow    = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;
887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ScreenForStatement->LeftColumn  = gScreenDimensions.LeftColumn;
907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ScreenForStatement->RightColumn = gScreenDimensions.RightColumn;
917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
925a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  if ((gLibIsFirstForm) || ((FormData->Attribute & HII_DISPLAY_MODAL) != 0)) {
935a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    //
945a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    // Ensure we are in Text mode
955a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    //
965a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
975a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    ClearLines (0, gScreenDimensions.RightColumn, 0, gScreenDimensions.BottomRow, KEYHELP_BACKGROUND);
985a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    gLibIsFirstForm = FALSE;
997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
1007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
1025a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  // Don't print frame for modal form.
1037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
1047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {
1057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return EFI_SUCCESS;
1067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
1077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1085a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {
1097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintBannerInfo (FormData);
1107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
1117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1125a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  PrintFramework (FormData);
1137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UpdateStatusBar(NV_UPDATE_REQUIRED, FormData->SettingChangedFlag);
1157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return EFI_SUCCESS;
1177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
1187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
1207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This function updates customized key panel's help information.
1217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.
1227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  and arrange them in Footer panel.
1237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  FormData       Form Data to be shown in Page. FormData has the highlighted statement.
1257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  Statement      The statement current selected.
1267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  Selected       Whether or not a tag be selected. TRUE means Enter has hit this question.
1277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
1287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID
1297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
1307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongRefreshKeyHelp (
1317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN FORM_DISPLAY_ENGINE_FORM      *FormData,
1327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,
1337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN  BOOLEAN                      Selected
1347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
1357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
1367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  SecCol;
1377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  ThdCol;
1387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  RightColumnOfHelp;
1397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  TopRowOfHelp;
1407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  BottomRowOfHelp;
1417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN                  StartColumnOfHelp;
1427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_IFR_NUMERIC        *NumericOp;
1437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_IFR_DATE           *DateOp;
1447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_IFR_TIME           *TimeOp;
1457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  BOOLEAN                HexDisplay;
146af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  UINTN                  ColumnWidth1;
147af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  UINTN                  ColumnWidth2;
148af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  UINTN                  ColumnWidth3;
149af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  CHAR16                 *ColumnStr1;
150af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  CHAR16                 *ColumnStr2;
151af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  CHAR16                 *ColumnStr3;
1527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ASSERT (FormData != NULL);
1547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (FormData == NULL) {
1557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return;
1567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
1577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);
1597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {
1617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return;
1627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
1637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
1647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  SecCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3;
1657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ThdCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2;
1667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
167d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  //
168d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  // + 2 means leave 1 space before the first hotkey info.
169d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  //
1707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;
171af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  RightColumnOfHelp = gScreenDimensions.RightColumn - 1;
1727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  TopRowOfHelp      = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;
1737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  BottomRowOfHelp   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;
1747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
175af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnWidth1      = SecCol - StartColumnOfHelp;
176af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnWidth2      = ThdCol - SecCol;
177af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnWidth3      = RightColumnOfHelp - ThdCol;
178af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnStr1        = gLibEmptyString;
179af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnStr2        = gLibEmptyString;
180af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong  ColumnStr3        = gLibEmptyString;
181af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong
182d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  //
183d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  // Clean the space at gScreenDimensions.LeftColumn + 1.
184d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  //
185d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  PrintStringAtWithWidth (StartColumnOfHelp - 1, BottomRowOfHelp, gLibEmptyString, 1);
186d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong  PrintStringAtWithWidth (StartColumnOfHelp - 1, TopRowOfHelp, gLibEmptyString, 1);
187d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong
1887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (Statement == NULL) {
1897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    //
1907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    // Print Key for Form without showable statement.
1917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    //
192af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintHotKeyHelpString (FormData, TRUE);
193af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);
194af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2);
195af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);
196d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {
197d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong      ColumnStr3 = gEscapeString;
198d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong    }
199d89d1a546a7db864cc94efc3ba79db61e1dc3ba1Eric Dong    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);
200af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong
2017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    return;
2027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
2037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  HexDisplay = FALSE;
2057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  NumericOp = NULL;
2067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  DateOp    = NULL;
2077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  TimeOp    = NULL;
2087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) {
2097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    NumericOp = (EFI_IFR_NUMERIC *) Statement->OpCode;
2107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    HexDisplay = (NumericOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;
2117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } else if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) {
2127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    DateOp   = (EFI_IFR_DATE *) Statement->OpCode;
2137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    HexDisplay = (DateOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;
2147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {
2157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    TimeOp  = (EFI_IFR_TIME *) Statement->OpCode;
2167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;
2177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
2187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  switch (Statement->OpCode->OpCode) {
2197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_ORDERED_LIST_OP:
2207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_ONE_OF_OP:
2217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_NUMERIC_OP:
2227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_TIME_OP:
2237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_DATE_OP:
2247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    if (!Selected) {
225af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintHotKeyHelpString (FormData, TRUE);
2267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2275a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {
228af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr3 = gEscapeString;
2297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
230af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);
2317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||
2337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {
2347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        PrintAt (
235af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong          ColumnWidth1,
2367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          StartColumnOfHelp,
2377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          BottomRowOfHelp,
2387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          L"%c%c%c%c%s",
2397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          ARROW_UP,
2407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          ARROW_DOWN,
2417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          ARROW_RIGHT,
2427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          ARROW_LEFT,
2437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          gMoveHighlight
2447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          );
245af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);
246af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1);
2477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      } else {
248af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);
2497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {
250af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong          ColumnStr1 = gAdjustNumber;
251af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        }
252af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);
253af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);
2547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
2557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else {
256af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintHotKeyHelpString (FormData, FALSE);
257af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2);
2587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
2607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // If it is a selected numeric with manual input, display different message
2617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
2627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) ||
2637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||
2647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {
265af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput;
266af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);
267af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      } else {
268af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);
2697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
2707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {
272af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr1 = gPlusString;
273af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr3 = gMinusString;
2747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
275af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);
276af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3);
277af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2);
2787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
279af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3);
2807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
2817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
2827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_CHECKBOX_OP:
284af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintHotKeyHelpString (FormData, TRUE);
2857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2865a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {
287af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      ColumnStr3 = gEscapeString;
2887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
289af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);
2907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
291af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);
292af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2);
293af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);
2947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
2957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
2967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_REF_OP:
2977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_PASSWORD_OP:
2987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_STRING_OP:
2997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_TEXT_OP:
3007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_ACTION_OP:
3017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_RESET_BUTTON_OP:
3027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case EFI_IFR_SUBTITLE_OP:
3037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong     if (!Selected) {
304af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintHotKeyHelpString (FormData, TRUE);
3057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3065a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {
307af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr3 = gEscapeString;
3087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
309af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);
3107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
311af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);
3127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {
313af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr2 = gEnterString;
3147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
315af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);
316af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);
3177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else {
318af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintHotKeyHelpString (FormData, FALSE);
319af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {
320af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr2 = gEnterCommitString;
321af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong        ColumnStr3 = gEnterEscapeString;
3227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
323af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);
324af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1);
325af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);
326af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);
3277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
3287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
3297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  default:
3317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
3327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
3337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
3347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
3367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Update status bar.
3377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This function updates the status bar on the bottom of menu screen. It just shows StatusBar.
3397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Original logic in this function should be splitted out.
3407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  MessageType            The type of message to be shown. InputError or Configuration Changed.
3427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  State                  Show or Clear Message.
3437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
3447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID
3457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
3467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUpdateStatusBar (
3477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN  UINTN                  MessageType,
3487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN  BOOLEAN                State
3497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
3507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
3517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN           Index;
3527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16          OptionWidth;
3537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  OptionWidth = (CHAR16) ((gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3);
3557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  switch (MessageType) {
3577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case INPUT_ERROR:
3587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    if (State) {
3597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      gST->ConOut->SetAttribute (gST->ConOut, ERROR_TEXT);
3607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      PrintStringAt (
3617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gScreenDimensions.LeftColumn + OptionWidth,
3627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gScreenDimensions.BottomRow - 1,
3637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gInputErrorMessage
3647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        );
3657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else {
3667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);
3677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      for (Index = 0; Index < (LibGetStringWidth (gInputErrorMessage) - 2) / 2; Index++) {
3687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        PrintStringAt (gScreenDimensions.LeftColumn + OptionWidth + Index, gScreenDimensions.BottomRow - 1, L"  ");
3697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
3707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
3717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
3727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  case NV_UPDATE_REQUIRED:
3747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    //
3757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    // Global setting support. Show configuration change on every form.
3767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    //
3777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    if (State) {
3787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);
3797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      PrintStringAt (
3807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gScreenDimensions.LeftColumn + OptionWidth * 2,
3817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gScreenDimensions.BottomRow - 1,
3827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        gNvUpdateMessage
3837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        );
3847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else {
3857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_BACKGROUND);
3867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      for (Index = 0; Index < (LibGetStringWidth (gNvUpdateMessage) - 2) / 2; Index++) {
3877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        PrintStringAt (
3887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          (gScreenDimensions.LeftColumn + OptionWidth * 2 + Index),
3897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          gScreenDimensions.BottomRow - 1,
3907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          L"  "
3917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong          );
3927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      }
3937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
3947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
3957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
3967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  default:
3977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    break;
3987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
3997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
4007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
4027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Create popup window. It will replace CreateDialog().
4037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This function draws OEM/Vendor specific pop up windows.
4057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[out]  Key    User Input Key
4077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param       ...    String to be shown in Popup. The variable argument list is terminated by a NULL.
4087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
4107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID
4117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
4127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCreateDialog (
4137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  OUT EFI_INPUT_KEY  *Key,        OPTIONAL
4147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ...
4157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
4167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
4177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VA_LIST       Marker;
4187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_INPUT_KEY KeyValue;
4197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_STATUS    Status;
4207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN         LargestString;
4217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN         LineNum;
4227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Index;
4237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Count;
4247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16  Character;
4257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Start;
4267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   End;
4277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Top;
4287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Bottom;
4297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16  *String;
4307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   DimensionsWidth;
4317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   DimensionsHeight;
4327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   CurrentAttribute;
433980f3026e56ef7868962bbca386655f11c10fd33Eric Dong  BOOLEAN CursorVisible;
4347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
4367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // If screen dimension info is not ready, get it from console.
4377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
4387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (gScreenDimensions.RightColumn == 0 || gScreenDimensions.BottomRow == 0) {
4397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
4407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    gST->ConOut->QueryMode (
4417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong                   gST->ConOut,
4427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong                   gST->ConOut->Mode->Mode,
4437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong                   &gScreenDimensions.RightColumn,
4447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong                   &gScreenDimensions.BottomRow
4457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong                   );
4467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
4477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;
4497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  DimensionsHeight  = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;
4507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  LargestString = 0;
4527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  LineNum       = 0;
4537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VA_START (Marker, Key);
4547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  while  ((String = VA_ARG (Marker, CHAR16 *)) != NULL) {
4557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    LineNum ++;
4567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    if ((LibGetStringWidth (String) / 2) > LargestString) {
4587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      LargestString = (LibGetStringWidth (String) / 2);
4597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
4607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
4617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VA_END (Marker);
4627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if ((LargestString + 2) > DimensionsWidth) {
4647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    LargestString = DimensionsWidth - 2;
4657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
4667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
467980f3026e56ef7868962bbca386655f11c10fd33Eric Dong  CurrentAttribute  = gST->ConOut->Mode->Attribute;
468980f3026e56ef7868962bbca386655f11c10fd33Eric Dong  CursorVisible     = gST->ConOut->Mode->CursorVisible;
4697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->EnableCursor (gST->ConOut, FALSE);
4707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());
4717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
4737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // Subtract the PopUp width from total Columns, allow for one space extra on
4747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // each end plus a border.
4757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
4767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Start     = (DimensionsWidth - LargestString - 2) / 2 + gScreenDimensions.LeftColumn + 1;
4777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  End       = Start + LargestString + 1;
4787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Top       = ((DimensionsHeight - LineNum - 2) / 2) + gScreenDimensions.TopRow - 1;
4807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Bottom    = Top + LineNum + 2;
4817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_DOWN_RIGHT;
4837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  PrintCharAt (Start, Top, Character);
4847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_HORIZONTAL;
4857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  for (Index = Start; Index + 2 < End; Index++) {
4867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintCharAt ((UINTN)-1, (UINTN)-1, Character);
4877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
4887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_DOWN_LEFT;
4907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  PrintCharAt ((UINTN)-1, (UINTN)-1, Character);
4917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_VERTICAL;
4927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Count = 0;
4947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VA_START (Marker, Key);
4957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  for (Index = Top; Index + 2 < Bottom; Index++, Count++) {
4967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    String = VA_ARG (Marker, CHAR16*);
4977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
4987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    if (String[0] == CHAR_NULL) {
4997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // Passing in a NULL results in a blank space
5017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());
5037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else if (String[0] == L' ') {
5047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // Passing in a space results in the assumption that this is where typing will occur
5067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      ClearLines (Start + 1, End - 1, Index + 1, Index + 1, POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND);
5087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      PrintStringAt (
5097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,
5107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        Index + 1,
5117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        String + 1
5127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        );
5137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    } else {
5147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // This will clear the background of the line - we never know who might have been
5167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // here before us.  This differs from the next clear in that it used the non-reverse
5177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      // video for normal printing.
5187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      //
5197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      ClearLines (Start, End, Index + 1, Index + 1, GetPopupColor ());
5207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong      PrintStringAt (
5217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        ((DimensionsWidth - LibGetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,
5227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        Index + 1,
5237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        String
5247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong        );
5257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    }
5267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());
5287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintCharAt (Start, Index + 1, Character);
5297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintCharAt (End - 1, Index + 1, Character);
5307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
5317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VA_END (Marker);
5327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_UP_RIGHT;
5347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  PrintCharAt (Start, Bottom - 1, Character);
5357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_HORIZONTAL;
5367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  for (Index = Start; Index + 2 < End; Index++) {
5377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintCharAt ((UINTN)-1, (UINTN) -1, Character);
5387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
5397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Character = BOXDRAW_UP_LEFT;
5417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  PrintCharAt ((UINTN)-1, (UINTN) -1, Character);
5427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (Key != NULL) {
5447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    Status = WaitForKeyStroke (&KeyValue);
5457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ASSERT_EFI_ERROR (Status);
5467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    CopyMem (Key, &KeyValue, sizeof (EFI_INPUT_KEY));
5477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
5487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);
550980f3026e56ef7868962bbca386655f11c10fd33Eric Dong  gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);
5517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
5527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
5547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Confirm how to handle the changed data.
5557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5566307a8b6dc054339db3b3d9733f2ce1a248b483cEric Dong  @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.
5577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
5587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN
5597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
5607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongConfirmDataChange (
5617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
5627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
5637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
5647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16                  YesResponse;
5657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16                  NoResponse;
5667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  EFI_INPUT_KEY           Key;
5677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
5697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  YesResponse = gYesResponse[0];
5717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  NoResponse  = gNoResponse[0];
5727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
5747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // If NV flag is up, prompt user
5757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
5767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  do {
5777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    CreateDialog (&Key, gLibEmptyString, gSaveChanges, gAreYouSure, gLibEmptyString, NULL);
5787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } while
5797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  (
5807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    (Key.ScanCode != SCAN_ESC) &&
5817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&
5827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))
5837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  );
5847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  if (Key.ScanCode == SCAN_ESC) {
5866307a8b6dc054339db3b3d9733f2ce1a248b483cEric Dong    return BROWSER_ACTION_NONE;
5877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } else if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {
5886307a8b6dc054339db3b3d9733f2ce1a248b483cEric Dong    return BROWSER_ACTION_SUBMIT;
5897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  } else {
5906307a8b6dc054339db3b3d9733f2ce1a248b483cEric Dong    return BROWSER_ACTION_DISCARD;
5917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
5927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
5937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
5957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  OEM specifies whether Setup exits Page by ESC key.
5967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
5977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This function customized the behavior that whether Setup exits Page so that
5987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  system able to boot when configuration is not changed.
5997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  TRUE     Exits FrontPage
6017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  FALSE    Don't exit FrontPage.
6027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
6037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBOOLEAN
6047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
6057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFormExitPolicy (
6067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
6077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
6087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
6095a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  return gClassOfVfr == FORMSET_CLASS_FRONT_PAGE ? FALSE : TRUE;
6107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
6117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
6137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Set Timeout value for a ceratain Form to get user response.
6147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  This function allows to set timeout value on a ceratain form if necessary.
6167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  If timeout is not zero, the form will exit if user has no response in timeout.
6177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param[in]  FormData   Form Data to be shown in Page
6197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return 0     No timeout for this form.
6217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return > 0   Timeout value in 100 ns units.
6227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
6237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT64
6247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
6257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFormExitTimeout (
6267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN FORM_DISPLAY_ENGINE_FORM      *FormData
6277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
6287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
6297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return 0;
6307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
6317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong//
6327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// Print Functions
6337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong//
6347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
6357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Prints a unicode string to the default console, at
6367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  the supplied cursor position, using L"%s" format.
6377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Column     The cursor position to print the string at. When it is -1, use current Position.
6397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Row        The cursor position to print the string at. When it is -1, use current Position.
6407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  String     String pointer.
6417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return Length of string printed to the console
6437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
6457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN
6467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
6477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongPrintStringAt (
6487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Column,
6497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Row,
6507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN CHAR16    *String
6517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
6527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
6537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PrintAt (0, Column, Row, L"%s", String);
6547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
6557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
6577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Prints a unicode string to the default console, at
6587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  the supplied cursor position, using L"%s" format.
6597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Column     The cursor position to print the string at. When it is -1, use current Position.
6617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Row        The cursor position to print the string at. When it is -1, use current Position.
6627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  String     String pointer.
6637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Width      Width for String.
6647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return Length of string printed to the console
6667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
6687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN
6697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
6707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongPrintStringAtWithWidth (
6717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Column,
6727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Row,
6737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN CHAR16    *String,
6747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Width
6757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
6767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
6777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PrintAt (Width, Column, Row, L"%s", String);
6787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
6797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
6817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Prints a chracter to the default console, at
6827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  the supplied cursor position, using L"%c" format.
6837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Column     The cursor position to print the string at. When it is -1, use current Position.
6857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Row        The cursor position to print the string at. When it is -1, use current Position.
6867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  Character  Character to print.
6877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @return Length of string printed to the console.
6897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
6907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
6917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN
6927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
6937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongPrintCharAt (
6947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Column,
6957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN     Row,
6967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16       Character
6977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
6987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
6997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PrintAt (0, Column, Row, L"%c", Character);
7007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
7017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
7037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Clear retangle with specified text attribute.
7047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  LeftColumn     Left column of retangle.
7067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  RightColumn    Right column of retangle.
7077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  TopRow         Start row of retangle.
7087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  BottomRow      End row of retangle.
7097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  TextAttribute  The character foreground and background.
7107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
7127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID
7137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
7147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongClearLines (
7157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN               LeftColumn,
7167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN               RightColumn,
7177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN               TopRow,
7187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN               BottomRow,
7197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN UINTN               TextAttribute
7207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
7217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
7227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  CHAR16  *Buffer;
7237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  UINTN   Row;
7247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // For now, allocate an arbitrarily long buffer
7277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Buffer = AllocateZeroPool (0x10000);
7297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ASSERT (Buffer != NULL);
7307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // Set foreground and background as defined
7337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetAttribute (gST->ConOut, TextAttribute);
7357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // Much faster to buffer the long string instead of print it a character at a time
7387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  LibSetUnicodeMem (Buffer, RightColumn - LeftColumn, L' ');
7407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  // Clear the desired area with the appropriate foreground/background
7437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  //
7447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  for (Row = TopRow; Row <= BottomRow; Row++) {
7457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong    PrintStringAt (LeftColumn, Row, Buffer);
7467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  }
7477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);
7497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  FreePool (Buffer);
7517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
7527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong//
7547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// Color Setting Functions
7557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong//
7567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
7587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific popup attribute colors.
7597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for popup color.
7617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
7627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
7637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
7647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetPopupColor (
7657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
7667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
7677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
7687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return POPUP_TEXT | POPUP_BACKGROUND;
7697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
7707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
7727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific popup attribute colors.
7737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for popup inverse color.
7757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
7767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
7777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
7787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetPopupInverseColor (
7797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
7807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
7817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
7827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND;
7837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
7847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
7867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific PickList color attribute.
7877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for pick list color.
7897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
7907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
7917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
7927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetPickListColor (
7937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
7947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
7957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
7967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PICKLIST_HIGHLIGHT_TEXT | PICKLIST_HIGHLIGHT_BACKGROUND;
7977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
7987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
7997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific arrow color attribute.
8017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for arrow color.
8037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetArrowColor (
8077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return ARROW_TEXT | ARROW_BACKGROUND;
8117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific info text color attribute.
8157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for info text color.
8177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetInfoTextColor (
8217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return INFO_TEXT | FIELD_BACKGROUND;
8257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific help text color attribute.
8297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for help text color.
8317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetHelpTextColor (
8357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return HELP_TEXT | FIELD_BACKGROUND;
8397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific grayed out text color attribute.
8437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for grayed out text color.
8457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetGrayedTextColor (
8497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return FIELD_TEXT_GRAYED | FIELD_BACKGROUND;
8537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific highlighted text color attribute.
8577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for highlight text color.
8597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetHighlightTextColor (
8637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);
8677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific field text color attribute.
8717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for field text color.
8737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetFieldTextColor (
8777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;
8817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Get OEM/Vendor specific subtitle text color attribute.
8857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval  Byte code color setting for subtitle text color.
8877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
8887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT8
8897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
8907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetSubTitleTextColor (
8917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
8927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
8937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
8947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND;
8957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
8967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
8977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
8987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Clear Screen to the initial state.
8997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
9007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID
9017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
9027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongClearDisplayPage (
9037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  VOID
9047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
9057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
9067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
9077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  gST->ConOut->ClearScreen (gST->ConOut);
9085a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong  gLibIsFirstForm = TRUE;
9097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
9107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
9127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Constructor of Customized Display Library Instance.
9137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  ImageHandle   The firmware allocated handle for the EFI image.
9157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  SystemTable   A pointer to the EFI System Table.
9167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
9187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
9207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS
9217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
9227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCustomizedDisplayLibConstructor (
9237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN      EFI_HANDLE                ImageHandle,
9247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN      EFI_SYSTEM_TABLE          *SystemTable
9257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
9267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
9277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  mCDLStringPackHandle = HiiAddPackages (&gCustomizedDisplayLibGuid, ImageHandle, CustomizedDisplayLibStrings, NULL);
9287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  ASSERT (mCDLStringPackHandle != NULL);
9297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  InitializeLibStrings();
9317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return EFI_SUCCESS;
9337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
9347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/**
9367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  Destructor of Customized Display Library Instance.
9377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  ImageHandle   The firmware allocated handle for the EFI image.
9397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @param  SystemTable   A pointer to the EFI System Table.
9407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval EFI_SUCCESS   The destructor completed successfully.
9427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  @retval Other value   The destructor did not complete successfully.
9437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/
9457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS
9467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI
9477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCustomizedDisplayLibDestructor (
9487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN EFI_HANDLE        ImageHandle,
9497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  IN EFI_SYSTEM_TABLE  *SystemTable
9507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  )
9517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{
9527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  HiiRemovePackages(mCDLStringPackHandle);
9537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  FreeLibStrings ();
9557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
9567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong  return EFI_SUCCESS;
9577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}
9587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong
959