]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Presentation.c
index 404bb31e1011c1471442a98b268969674a40dde3..a89bb2f50b28029cecd252a1a8c1a70ac7a78a88 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
 Utility functions for UI presentation.\r
 \r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2010, 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
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "Setup.h"\r
-#include "Ui.h"\r
 \r
 BOOLEAN            mHiiPackageListUpdated;\r
 UI_MENU_SELECTION  *gCurrentSelection;\r
@@ -31,11 +30,11 @@ UI_MENU_SELECTION  *gCurrentSelection;
 **/\r
 VOID\r
 ClearLines (\r
-  UINTN                                       LeftColumn,\r
-  UINTN                                       RightColumn,\r
-  UINTN                                       TopRow,\r
-  UINTN                                       BottomRow,\r
-  UINTN                                       TextAttribute\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
@@ -66,7 +65,7 @@ ClearLines (
 \r
   gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);\r
 \r
-  gBS->FreePool (Buffer);\r
+  FreePool (Buffer);\r
   return ;\r
 }\r
 \r
@@ -80,8 +79,8 @@ ClearLines (
 **/\r
 VOID\r
 NewStrCat (\r
-  CHAR16                                      *Destination,\r
-  CHAR16                                      *Source\r
+  IN OUT CHAR16               *Destination,\r
+  IN     CHAR16               *Source\r
   )\r
 {\r
   UINTN Length;\r
@@ -106,10 +105,12 @@ NewStrCat (
 \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
+  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
@@ -117,13 +118,18 @@ NewStrCat (
 **/\r
 UINTN\r
 GetStringWidth (\r
-  CHAR16                                      *String\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
@@ -188,6 +194,8 @@ DisplayPageFrame (
   CHAR16                 *StrFrontPageBanner;\r
   UINTN                  Row;\r
   EFI_SCREEN_DESCRIPTOR  LocalScreen;\r
+  UINT8                  RowIdx;\r
+  UINT8                  ColumnIdx;\r
 \r
   ZeroMem (&LocalScreen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
   gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);\r
@@ -207,7 +215,7 @@ DisplayPageFrame (
     Buffer[Index] = Character;\r
   }\r
 \r
-  if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
+  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
     //\r
     //    ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
     //\r
@@ -229,10 +237,16 @@ DisplayPageFrame (
            Alignment < BANNER_COLUMNS + (UINT8) LocalScreen.LeftColumn;\r
            Alignment++\r
           ) {\r
-        if (BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn] != 0x0000) {\r
+        RowIdx = (UINT8) (Line - (UINT8) LocalScreen.TopRow);\r
+        ColumnIdx = (UINT8) (Alignment - (UINT8) LocalScreen.LeftColumn);\r
+\r
+        ASSERT (RowIdx < BANNER_HEIGHT);\r
+        ASSERT (ColumnIdx < BANNER_COLUMNS);\r
+\r
+        if (gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
           StrFrontPageBanner = GetToken (\r
-                                BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn],\r
-                                FrontPageHandle\r
+                                gBannerData->Banner[RowIdx][ColumnIdx],\r
+                                gFrontPageHandle\r
                                 );\r
         } else {\r
           continue;\r
@@ -269,7 +283,7 @@ DisplayPageFrame (
           break;\r
         }\r
 \r
-        gBS->FreePool (StrFrontPageBanner);\r
+        FreePool (StrFrontPageBanner);\r
       }\r
     }\r
   }\r
@@ -282,7 +296,7 @@ DisplayPageFrame (
     KEYHELP_TEXT | KEYHELP_BACKGROUND\r
     );\r
 \r
-  if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
     ClearLines (\r
       LocalScreen.LeftColumn,\r
       LocalScreen.RightColumn,\r
@@ -317,7 +331,7 @@ DisplayPageFrame (
     Character = BOXDRAW_UP_LEFT;\r
     PrintChar (Character);\r
 \r
-    if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+    if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
       //\r
       // Print Bottom border line\r
       // +------------------------------------------------------------------------------+\r
@@ -350,7 +364,7 @@ DisplayPageFrame (
     }\r
   }\r
 \r
-  gBS->FreePool (Buffer);\r
+  FreePool (Buffer);\r
 \r
 }\r
 \r
@@ -380,9 +394,11 @@ EvaluateFormExpressions (
     Link = GetNextNode (&Form->ExpressionListHead, Link);\r
 \r
     if (Expression->Type == EFI_HII_EXPRESSION_INCONSISTENT_IF ||\r
-        Expression->Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF) {\r
+        Expression->Type == EFI_HII_EXPRESSION_NO_SUBMIT_IF ||\r
+        Expression->Type == EFI_HII_EXPRESSION_WRITE ||\r
+        (Expression->Type == EFI_HII_EXPRESSION_READ && Form->FormType != STANDARD_MAP_FORM_TYPE)) {\r
       //\r
-      // Postpone Form validation to Question editing or Form submiting\r
+      // Postpone Form validation to Question editing or Form submitting or Question Write or Question Read for nonstandard form.\r
       //\r
       continue;\r
     }\r
@@ -398,7 +414,7 @@ EvaluateFormExpressions (
 \r
 /*\r
 +------------------------------------------------------------------------------+\r
-?F2=Previous Page                 Setup Page                                  ?\r
+?                                 Setup Page                                  ?\r
 +------------------------------------------------------------------------------+\r
 \r
 \r
@@ -425,9 +441,9 @@ EvaluateFormExpressions (
 \r
 /**\r
 \r
-  \r
+\r
   Display form and wait for user to select one menu option, then return it.\r
-  \r
+\r
   @param Selection       On input, Selection tell setup browser the information\r
                          about the Selection, form and formset to be displayed.\r
                          On output, Selection return the screen item that is selected\r
@@ -452,6 +468,7 @@ DisplayForm (
   FORM_BROWSER_STATEMENT *Statement;\r
   UINT16                 NumberOfLines;\r
   EFI_STATUS             Status;\r
+  UI_MENU_OPTION         *MenuOption;\r
 \r
   Handle        = Selection->Handle;\r
   MenuItemCount = 0;\r
@@ -464,7 +481,7 @@ DisplayForm (
 \r
   StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
 \r
-  if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
     gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
     PrintStringAt (\r
       (LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,\r
@@ -473,38 +490,10 @@ DisplayForm (
       );\r
   }\r
 \r
-  if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-    gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-    //\r
-    // Display the infrastructure strings\r
-    //\r
-    if (!IsListEmpty (&gMenuList)) {\r
-      PrintStringAt (LocalScreen.LeftColumn + 2, LocalScreen.TopRow + 1, gFunctionTwoString);\r
-    }\r
-\r
-    PrintStringAt (LocalScreen.LeftColumn + 2, LocalScreen.BottomRow - 4, gFunctionOneString);\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3,\r
-      LocalScreen.BottomRow - 4,\r
-      gFunctionNineString\r
-      );\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) * 2 / 3,\r
-      LocalScreen.BottomRow - 4,\r
-      gFunctionTenString\r
-      );\r
-    PrintAt (LocalScreen.LeftColumn + 2, LocalScreen.BottomRow - 3, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3,\r
-      LocalScreen.BottomRow - 3,\r
-      gEscapeString\r
-      );\r
-  }\r
   //\r
   // Remove Buffer allocated for StringPtr after it has been used.\r
   //\r
-  gBS->FreePool (StringPtr);\r
+  FreePool (StringPtr);\r
 \r
   //\r
   // Evaluate all the Expressions in this Form\r
@@ -514,6 +503,7 @@ DisplayForm (
     return Status;\r
   }\r
 \r
+  Selection->FormEditable = FALSE;\r
   Link = GetFirstNode (&Selection->Form->StatementListHead);\r
   while (!IsNull (&Selection->Form->StatementListHead, Link)) {\r
     Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
@@ -524,6 +514,10 @@ DisplayForm (
       Suppress = FALSE;\r
     }\r
 \r
+    if (Statement->DisableExpression != NULL) {\r
+      Suppress = (BOOLEAN) (Suppress || Statement->DisableExpression->Result.Value.b);\r
+    }\r
+\r
     if (!Suppress) {\r
       StringPtr = GetToken (Statement->Prompt, Handle);\r
 \r
@@ -535,19 +529,26 @@ DisplayForm (
         //\r
         // If there is more string to process print on the next row and increment the Skip value\r
         //\r
-        if (StrLen (&StringPtr[ArrayEntry])) {\r
+        if (StrLen (&StringPtr[ArrayEntry]) != 0) {\r
           NumberOfLines++;\r
         }\r
 \r
-        gBS->FreePool (OutputString);\r
+        FreePool (OutputString);\r
       }\r
 \r
       //\r
       // We are NOT!! removing this StringPtr buffer via FreePool since it is being used in the menuoptions, we will do\r
       // it in UiFreeMenu.\r
       //\r
-      UiAddMenuOption (StringPtr, Selection->Handle, Statement, NumberOfLines, MenuItemCount);\r
+      MenuOption = UiAddMenuOption (StringPtr, Selection->Handle, Statement, NumberOfLines, MenuItemCount);\r
       MenuItemCount++;\r
+\r
+      if (MenuOption->IsQuestion && !MenuOption->ReadOnly) {\r
+        //\r
+        // At least one item is not readonly, this Form is considered as editable\r
+        //\r
+        Selection->FormEditable = TRUE;\r
+      }\r
     }\r
 \r
     Link = GetNextNode (&Selection->Form->StatementListHead, Link);\r
@@ -569,12 +570,11 @@ InitializeBrowserStrings (
   VOID\r
   )\r
 {\r
-  gFunctionOneString    = GetToken (STRING_TOKEN (FUNCTION_ONE_STRING), gHiiHandle);\r
-  gFunctionTwoString    = GetToken (STRING_TOKEN (FUNCTION_TWO_STRING), gHiiHandle);\r
   gFunctionNineString   = GetToken (STRING_TOKEN (FUNCTION_NINE_STRING), gHiiHandle);\r
   gFunctionTenString    = GetToken (STRING_TOKEN (FUNCTION_TEN_STRING), gHiiHandle);\r
   gEnterString          = GetToken (STRING_TOKEN (ENTER_STRING), gHiiHandle);\r
   gEnterCommitString    = GetToken (STRING_TOKEN (ENTER_COMMIT_STRING), gHiiHandle);\r
+  gEnterEscapeString    = GetToken (STRING_TOKEN (ENTER_ESCAPE_STRING), gHiiHandle);\r
   gEscapeString         = GetToken (STRING_TOKEN (ESCAPE_STRING), gHiiHandle);\r
   gSaveFailed           = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
   gMoveHighlight        = GetToken (STRING_TOKEN (MOVE_HIGHLIGHT), gHiiHandle);\r
@@ -598,6 +598,8 @@ InitializeBrowserStrings (
   gMinusString          = GetToken (STRING_TOKEN (MINUS_STRING), gHiiHandle);\r
   gAdjustNumber         = GetToken (STRING_TOKEN (ADJUST_NUMBER), gHiiHandle);\r
   gSaveChanges          = GetToken (STRING_TOKEN (SAVE_CHANGES), gHiiHandle);\r
+  gOptionMismatch       = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle);\r
+  gFormSuppress         = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle);\r
   return ;\r
 }\r
 \r
@@ -611,34 +613,35 @@ FreeBrowserStrings (
   VOID\r
   )\r
 {\r
-  SafeFreePool (gFunctionOneString);\r
-  SafeFreePool (gFunctionTwoString);\r
-  SafeFreePool (gFunctionNineString);\r
-  SafeFreePool (gFunctionTenString);\r
-  SafeFreePool (gEnterString);\r
-  SafeFreePool (gEnterCommitString);\r
-  SafeFreePool (gEscapeString);\r
-  SafeFreePool (gMoveHighlight);\r
-  SafeFreePool (gMakeSelection);\r
-  SafeFreePool (gDecNumericInput);\r
-  SafeFreePool (gHexNumericInput);\r
-  SafeFreePool (gToggleCheckBox);\r
-  SafeFreePool (gPromptForData);\r
-  SafeFreePool (gPromptForPassword);\r
-  SafeFreePool (gPromptForNewPassword);\r
-  SafeFreePool (gConfirmPassword);\r
-  SafeFreePool (gPassowordInvalid);\r
-  SafeFreePool (gConfirmError);\r
-  SafeFreePool (gPressEnter);\r
-  SafeFreePool (gEmptyString);\r
-  SafeFreePool (gAreYouSure);\r
-  SafeFreePool (gYesResponse);\r
-  SafeFreePool (gNoResponse);\r
-  SafeFreePool (gMiniString);\r
-  SafeFreePool (gPlusString);\r
-  SafeFreePool (gMinusString);\r
-  SafeFreePool (gAdjustNumber);\r
-  SafeFreePool (gSaveChanges);\r
+  FreePool (gFunctionNineString);\r
+  FreePool (gFunctionTenString);\r
+  FreePool (gEnterString);\r
+  FreePool (gEnterCommitString);\r
+  FreePool (gEnterEscapeString);\r
+  FreePool (gEscapeString);\r
+  FreePool (gMoveHighlight);\r
+  FreePool (gMakeSelection);\r
+  FreePool (gDecNumericInput);\r
+  FreePool (gHexNumericInput);\r
+  FreePool (gToggleCheckBox);\r
+  FreePool (gPromptForData);\r
+  FreePool (gPromptForPassword);\r
+  FreePool (gPromptForNewPassword);\r
+  FreePool (gConfirmPassword);\r
+  FreePool (gPassowordInvalid);\r
+  FreePool (gConfirmError);\r
+  FreePool (gPressEnter);\r
+  FreePool (gEmptyString);\r
+  FreePool (gAreYouSure);\r
+  FreePool (gYesResponse);\r
+  FreePool (gNoResponse);\r
+  FreePool (gMiniString);\r
+  FreePool (gPlusString);\r
+  FreePool (gMinusString);\r
+  FreePool (gAdjustNumber);\r
+  FreePool (gSaveChanges);\r
+  FreePool (gOptionMismatch);\r
+  FreePool (gFormSuppress);\r
   return ;\r
 }\r
 \r
@@ -646,12 +649,14 @@ FreeBrowserStrings (
 /**\r
   Update key's help imformation.\r
 \r
+  @param Selection       Tell setup browser the information about the Selection\r
   @param  MenuOption     The Menu option\r
   @param  Selected       Whether or not a tag be selected\r
 \r
 **/\r
 VOID\r
 UpdateKeyHelp (\r
+  IN  UI_MENU_SELECTION           *Selection,\r
   IN  UI_MENU_OPTION              *MenuOption,\r
   IN  BOOLEAN                     Selected\r
   )\r
@@ -677,10 +682,6 @@ UpdateKeyHelp (
   TopRowOfHelp      = LocalScreen.BottomRow - 4;\r
   BottomRowOfHelp   = LocalScreen.BottomRow - 3;\r
 \r
-  if (gClassOfVfr == EFI_GENERAL_APPLICATION_SUBCLASS) {\r
-    return ;\r
-  }\r
-\r
   gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
   Statement = MenuOption->ThisTag;\r
@@ -693,16 +694,16 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-        PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+      if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+        if (Selection->FormEditable) {\r
+          PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+          PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+        }\r
         PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
       }\r
 \r
       if ((Statement->Operand == EFI_IFR_DATE_OP) ||\r
-          (Statement->Operand == EFI_IFR_TIME_OP) ||\r
-          (Statement->Operand == EFI_IFR_NUMERIC_OP && Statement->Step != 0)) {\r
+          (Statement->Operand == EFI_IFR_TIME_OP)) {\r
         PrintAt (\r
           StartColumnOfHelp,\r
           BottomRowOfHelp,\r
@@ -716,7 +717,11 @@ UpdateKeyHelp (
         PrintStringAt (SecCol, BottomRowOfHelp, gAdjustNumber);\r
       } else {\r
         PrintAt (StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+        if (Statement->Operand == EFI_IFR_NUMERIC_OP && Statement->Step != 0) {\r
+          PrintStringAt (SecCol, BottomRowOfHelp, gAdjustNumber);\r
+        } else {\r
+          PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+        }\r
       }\r
     } else {\r
       PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
@@ -739,17 +744,18 @@ UpdateKeyHelp (
         PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
       }\r
 \r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+      PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
     }\r
     break;\r
 \r
   case EFI_IFR_CHECKBOX_OP:\r
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
-    if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-      PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-      PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-      PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+    if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+      if (Selection->FormEditable) {\r
+        PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+        PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+      }\r
       PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
     }\r
 \r
@@ -766,10 +772,11 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-        PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+      if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+        if (Selection->FormEditable) {\r
+          PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+          PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+        }\r
         PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
       }\r
 \r
@@ -784,7 +791,7 @@ UpdateKeyHelp (
           BottomRowOfHelp,\r
           gEnterCommitString\r
           );\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
       }\r
     }\r
     break;\r
@@ -821,6 +828,7 @@ UpdateKeyHelp (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 FormUpdateNotify (\r
   IN UINT8                              PackageType,\r
   IN CONST EFI_GUID                     *PackageGuid,\r
@@ -857,24 +865,22 @@ SetupBrowser (
   EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
   EFI_HANDLE                      NotifyHandle;\r
   EFI_HII_VALUE                   *HiiValue;\r
+  EFI_IFR_TYPE_VALUE              *TypeValue;\r
   FORM_BROWSER_STATEMENT          *Statement;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
+  FORM_BROWSER_FORMSET            *FormSet;\r
   EFI_INPUT_KEY                   Key;\r
-  CHAR16                          YesResponse;\r
-  CHAR16                          NoResponse;\r
 \r
   gMenuRefreshHead = NULL;\r
   gResetRequired = FALSE;\r
-  gNvUpdateRequired = FALSE;\r
-\r
-  UiInitMenuList ();\r
+  FormSet = Selection->FormSet;\r
 \r
   //\r
   // Register notify for Form package update\r
   //\r
   Status = mHiiDatabase->RegisterPackageNotify (\r
                            mHiiDatabase,\r
-                           EFI_HII_PACKAGE_FORM,\r
+                           EFI_HII_PACKAGE_FORMS,\r
                            NULL,\r
                            FormUpdateNotify,\r
                            EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
@@ -884,12 +890,63 @@ SetupBrowser (
     return Status;\r
   }\r
 \r
-  do {\r
-    //\r
-    // Displays the Header and Footer borders\r
-    //\r
-    DisplayPageFrame ();\r
+  //\r
+  // Before display the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_OPEN\r
+  //\r
+  ConfigAccess = Selection->FormSet->ConfigAccess;\r
+  if ((ConfigAccess != NULL) && (Selection->Action != UI_ACTION_REFRESH_FORMSET)) {\r
+    ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+    mHiiPackageListUpdated = FALSE;\r
+    Status = ConfigAccess->Callback (\r
+                             ConfigAccess,\r
+                             EFI_BROWSER_ACTION_FORM_OPEN,\r
+                             0,\r
+                             EFI_IFR_TYPE_UNDEFINED,\r
+                             NULL,\r
+                             &ActionRequest\r
+                             );\r
+\r
+    if (!EFI_ERROR (Status)) {\r
+      switch (ActionRequest) {\r
+      case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+        gResetRequired = TRUE;\r
+        break;\r
 \r
+      case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+        //\r
+        // Till now there is no uncommitted data, so ignore this request\r
+        //\r
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+        Selection->Action = UI_ACTION_EXIT;\r
+        break;\r
+\r
+      default:\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (mHiiPackageListUpdated) {\r
+      //\r
+      // IFR is updated during callback, force to reparse the IFR binary\r
+      //\r
+      mHiiPackageListUpdated = FALSE;\r
+      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Initialize current settings of Questions in this FormSet\r
+  //\r
+  Status = InitializeCurrentSetting (Selection->FormSet);\r
+  if (EFI_ERROR (Status)) {\r
+    Selection->Action = UI_ACTION_EXIT;\r
+    goto Done;\r
+  }\r
+\r
+  do {\r
     //\r
     // Initialize Selection->Form\r
     //\r
@@ -905,14 +962,61 @@ SetupBrowser (
       Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);\r
     }\r
 \r
+    if (Selection->Form == NULL) {\r
+      //\r
+      // No Form to display\r
+      //\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    //\r
+    // Check Form is suppressed.\r
+    //\r
+    if (Selection->Form->SuppressExpression != NULL) {\r
+      Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+\r
+      if (Selection->Form->SuppressExpression->Result.Value.b) {\r
+        //\r
+        // Form is suppressed. \r
+        //\r
+        do {\r
+          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
+        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+        return EFI_NOT_FOUND;\r
+      }\r
+    }\r
+    \r
+    //\r
+    // Reset FormPackage update flag\r
+    //\r
+    mHiiPackageListUpdated = FALSE;\r
+\r
     //\r
     // Load Questions' Value for display\r
     //\r
-    Status = LoadFormConfig (Selection->FormSet, Selection->Form);\r
+    Status = LoadFormSetConfig (Selection, Selection->FormSet);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
 \r
+    //\r
+    // IFR is updated during callback of read value, force to reparse the IFR binary\r
+    //\r
+    if (mHiiPackageListUpdated) {\r
+      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+      mHiiPackageListUpdated = FALSE;\r
+      goto Done;\r
+    }\r
+\r
+    //\r
+    // Displays the Header and Footer borders\r
+    //\r
+    DisplayPageFrame ();\r
+\r
     //\r
     // Display form\r
     //\r
@@ -938,24 +1042,30 @@ SetupBrowser (
       if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) && (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
         ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
 \r
+        if (ConfigAccess == NULL) {\r
+          return EFI_UNSUPPORTED;\r
+        }\r
+\r
         HiiValue = &Statement->HiiValue;\r
+        TypeValue = &HiiValue->Value;\r
         if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
           //\r
           // Create String in HII database for Configuration Driver to retrieve\r
           //\r
           HiiValue->Value.string = NewString ((CHAR16 *) Statement->BufferValue, Selection->FormSet->HiiHandle);\r
+        } else if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
+          //\r
+          // For OrderedList, passing in the value buffer to Callback()\r
+          //\r
+          TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
         }\r
 \r
-        ConfigAccess = Selection->FormSet->ConfigAccess;\r
-        if (ConfigAccess == NULL) {\r
-          return EFI_UNSUPPORTED;\r
-        }\r
         Status = ConfigAccess->Callback (\r
                                  ConfigAccess,\r
                                  EFI_BROWSER_ACTION_CHANGING,\r
                                  Statement->QuestionId,\r
                                  HiiValue->Type,\r
-                                 &HiiValue->Value,\r
+                                 TypeValue,\r
                                  &ActionRequest\r
                                  );\r
 \r
@@ -984,6 +1094,17 @@ SetupBrowser (
           default:\r
             break;\r
           }\r
+        } else if (Status != EFI_UNSUPPORTED) {\r
+          //\r
+          // Callback return error status other than EFI_UNSUPPORTED\r
+          //\r
+          if (Statement->Operand == EFI_IFR_REF_OP) {\r
+            //\r
+            // Cross reference will not be taken\r
+            //\r
+            Selection->FormId = Selection->Form->FormId;\r
+            Selection->QuestionId = 0;\r
+          }\r
         }\r
       }\r
 \r
@@ -994,37 +1115,55 @@ SetupBrowser (
         //\r
         // Force to reparse IFR binary of target Formset\r
         //\r
+        mHiiPackageListUpdated = FALSE;\r
         Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+      }\r
+    }\r
+  } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
 \r
-        //\r
-        // Uncommitted data will be lost after IFR binary re-pasing, so confirm on whether to save\r
-        //\r
-        if (gNvUpdateRequired) {\r
-          Status      = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-\r
-          YesResponse = gYesResponse[0];\r
-          NoResponse  = gNoResponse[0];\r
-\r
-          do {\r
-            CreateDialog (3, TRUE, 0, NULL, &Key, gEmptyString, gSaveChanges, gEmptyString);\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
+  // Before exit the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE\r
+  //\r
+  if ((ConfigAccess != NULL) && (Selection->Action == UI_ACTION_EXIT)) {\r
+    ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+    Status = ConfigAccess->Callback (\r
+                             ConfigAccess,\r
+                             EFI_BROWSER_ACTION_FORM_CLOSE,\r
+                             0,\r
+                             EFI_IFR_TYPE_UNDEFINED,\r
+                             NULL,\r
+                             &ActionRequest\r
+                             );\r
+\r
+    if (!EFI_ERROR (Status)) {\r
+      switch (ActionRequest) {\r
+      case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+        gResetRequired = TRUE;\r
+        break;\r
 \r
-          if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
-            //\r
-            // If the user hits the YesResponse key\r
-            //\r
-            SubmitForm (Selection->FormSet, Selection->Form);\r
-          }\r
-        }\r
+      case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+        SubmitForm (Selection->FormSet, Selection->Form);\r
+        break;\r
+\r
+      case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+        gNvUpdateRequired = FALSE;\r
+        break;\r
+\r
+      default:\r
+        break;\r
       }\r
     }\r
-  } while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
+  }\r
+\r
+  //\r
+  // Record the old formset\r
+  //\r
+  if (gOldFormSet != NULL) {\r
+    DestroyFormSet (gOldFormSet);\r
+  }\r
+  gOldFormSet = FormSet;\r
 \r
+Done:\r
   //\r
   // Unregister notify for Form package update\r
   //\r