]> 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 93267f0fdeecfce49ad10287fa1769be543eea80..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
@@ -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
@@ -473,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
@@ -591,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
@@ -632,6 +632,7 @@ FreeBrowserStrings (
   FreePool (gAdjustNumber);\r
   FreePool (gSaveChanges);\r
   FreePool (gOptionMismatch);\r
+  FreePool (gFormSuppress);\r
   return ;\r
 }\r
 \r
@@ -684,7 +685,7 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\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
@@ -741,7 +742,7 @@ 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
+    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
@@ -762,7 +763,7 @@ UpdateKeyHelp (
     ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
 \r
     if (!Selected) {\r
-      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\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
@@ -855,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
@@ -919,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
@@ -956,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
@@ -994,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
@@ -1060,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