]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
Enable SetupBrowser to support multiple form class guid.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Presentation.c
index 5b8fc89de0c758b54815c58a60f790507fdf04c6..4e3e9811df11c9e8140161e7abf5c88b9aafea07 100644 (file)
@@ -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
@@ -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
@@ -117,7 +116,7 @@ NewStrCat (
 **/\r
 UINTN\r
 GetStringWidth (\r
-  CHAR16                                      *String\r
+  IN CHAR16               *String\r
   )\r
 {\r
   UINTN Index;\r
@@ -209,7 +208,7 @@ DisplayPageFrame (
     Buffer[Index] = Character;\r
   }\r
 \r
-  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\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
@@ -290,7 +289,7 @@ DisplayPageFrame (
     KEYHELP_TEXT | KEYHELP_BACKGROUND\r
     );\r
 \r
-  if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
+  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
     ClearLines (\r
       LocalScreen.LeftColumn,\r
       LocalScreen.RightColumn,\r
@@ -325,7 +324,7 @@ DisplayPageFrame (
     Character = BOXDRAW_UP_LEFT;\r
     PrintChar (Character);\r
 \r
-    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
+    if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
       //\r
       // Print Bottom border line\r
       // +------------------------------------------------------------------------------+\r
@@ -460,6 +459,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
@@ -472,7 +472,7 @@ DisplayForm (
 \r
   StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
 \r
-  if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\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
@@ -494,6 +494,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
@@ -530,8 +531,15 @@ DisplayForm (
       // 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
@@ -553,7 +561,6 @@ InitializeBrowserStrings (
   VOID\r
   )\r
 {\r
-  gFunctionOneString    = GetToken (STRING_TOKEN (FUNCTION_ONE_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
@@ -583,6 +590,7 @@ InitializeBrowserStrings (
   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
@@ -596,7 +604,6 @@ FreeBrowserStrings (
   VOID\r
   )\r
 {\r
-  FreePool (gFunctionOneString);\r
   FreePool (gFunctionNineString);\r
   FreePool (gFunctionTenString);\r
   FreePool (gEnterString);\r
@@ -625,6 +632,7 @@ FreeBrowserStrings (
   FreePool (gAdjustNumber);\r
   FreePool (gSaveChanges);\r
   FreePool (gOptionMismatch);\r
+  FreePool (gFormSuppress);\r
   return ;\r
 }\r
 \r
@@ -632,12 +640,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
@@ -675,10 +685,11 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\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
@@ -731,10 +742,11 @@ UpdateKeyHelp (
   case EFI_IFR_CHECKBOX_OP:\r
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
-    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\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
@@ -751,10 +763,11 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\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
@@ -843,9 +856,11 @@ 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
 \r
   gMenuRefreshHead = NULL;\r
   gResetRequired = FALSE;\r
@@ -907,6 +922,7 @@ SetupBrowser (
       //\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
@@ -944,14 +960,49 @@ SetupBrowser (
       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 = LoadFormSetConfig (Selection->FormSet);\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
@@ -982,23 +1033,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
-        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
@@ -1048,6 +1106,7 @@ SetupBrowser (
         //\r
         // Force to reparse IFR binary of target Formset\r
         //\r
+        mHiiPackageListUpdated = FALSE;\r
         Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
       }\r
     }\r