]> 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 93267f0fdeecfce49ad10287fa1769be543eea80..a89bb2f50b28029cecd252a1a8c1a70ac7a78a88 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
 Utility functions for UI presentation.\r
 \r
-Copyright (c) 2004 - 2009, 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
@@ -110,6 +109,8 @@ NewStrCat (
   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
@@ -124,6 +125,11 @@ GetStringWidth (
   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
@@ -209,7 +215,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 +296,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 +331,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
@@ -388,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
@@ -473,7 +481,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 +599,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 +641,7 @@ FreeBrowserStrings (
   FreePool (gAdjustNumber);\r
   FreePool (gSaveChanges);\r
   FreePool (gOptionMismatch);\r
+  FreePool (gFormSuppress);\r
   return ;\r
 }\r
 \r
@@ -684,7 +694,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 +751,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 +772,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 +865,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 +931,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 +969,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 +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
-        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 +1115,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