]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
Add new call back return value; also add some sample code to use it.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Ui.c
index 3ab63be2d61749f593c4ed8cf4e1acfc119f80f4..d5f726b0cefec550c26612fa2e09618b9c58565c 100644 (file)
@@ -340,8 +340,6 @@ RefreshForm (
   EFI_STATUS                      Status;\r
   UI_MENU_SELECTION               *Selection;\r
   FORM_BROWSER_STATEMENT          *Question;\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
-  EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
 \r
   if (gMenuRefreshHead != NULL) {\r
 \r
@@ -394,36 +392,9 @@ RefreshForm (
       //\r
       // Question value may be changed, need invoke its Callback()\r
       //\r
-      ConfigAccess = Selection->FormSet->ConfigAccess;\r
-      if (((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) && (ConfigAccess != NULL)) {\r
-        ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-        Status = ConfigAccess->Callback (\r
-                                 ConfigAccess,\r
-                                 EFI_BROWSER_ACTION_CHANGING,\r
-                                 Question->QuestionId,\r
-                                 Question->HiiValue.Type,\r
-                                 &Question->HiiValue.Value,\r
-                                 &ActionRequest\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
-            SubmitForm (Selection->FormSet, Selection->Form);\r
-            break;\r
-\r
-          case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
-            Selection->Action = UI_ACTION_EXIT;\r
-            gNvUpdateRequired = FALSE;\r
-            break;\r
-\r
-          default:\r
-            break;\r
-          }\r
-        }\r
+      Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_CHANGING, FALSE);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
       }\r
 \r
       MenuRefreshEntry = MenuRefreshEntry->Next;\r
@@ -1004,6 +975,7 @@ CreateMultiStringPopUp (
 /**\r
   Update status bar on the bottom of menu.\r
 \r
+  @param  Selection              Current Selction info.\r
   @param  MessageType            The type of message to be shown.\r
   @param  Flags                  The flags in Question header.\r
   @param  State                  Set or clear.\r
@@ -1011,6 +983,7 @@ CreateMultiStringPopUp (
 **/\r
 VOID\r
 UpdateStatusBar (\r
+  IN  UI_MENU_SELECTION           *Selection,\r
   IN  UINTN                       MessageType,\r
   IN  UINT8                       Flags,\r
   IN  BOOLEAN                     State\r
@@ -1054,7 +1027,9 @@ UpdateStatusBar (
           );\r
         gResetRequired    = (BOOLEAN) (gResetRequired | ((Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED));\r
 \r
-        gNvUpdateRequired = TRUE;\r
+        if (Selection != NULL) {\r
+          Selection->Form->NvUpdateRequired = TRUE;\r
+        }\r
       } else {\r
         gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));\r
         for (Index = 0; Index < (GetStringWidth (NvUpdateMessage) - 2) / 2; Index++) {\r
@@ -1065,18 +1040,20 @@ UpdateStatusBar (
             );\r
         }\r
 \r
-        gNvUpdateRequired = FALSE;\r
+        if (Selection != NULL) {\r
+          Selection->Form->NvUpdateRequired = FALSE;\r
+        }\r
       }\r
     }\r
     break;\r
 \r
   case REFRESH_STATUS_BAR:\r
     if (mInputError) {\r
-      UpdateStatusBar (INPUT_ERROR, Flags, TRUE);\r
+      UpdateStatusBar (Selection, INPUT_ERROR, Flags, TRUE);\r
     }\r
 \r
-    if (gNvUpdateRequired) {\r
-      UpdateStatusBar (NV_UPDATE_REQUIRED, Flags, TRUE);\r
+    if (IsNvUpdateRequired(Selection->FormSet)) {\r
+      UpdateStatusBar (NULL, NV_UPDATE_REQUIRED, Flags, TRUE);\r
     }\r
     break;\r
 \r
@@ -1640,8 +1617,6 @@ UiDisplayMenu (
   CHAR16                          *OptionString;\r
   CHAR16                          *OutputString;\r
   CHAR16                          *FormattedString;\r
-  CHAR16                          YesResponse;\r
-  CHAR16                          NoResponse;\r
   BOOLEAN                         NewLine;\r
   BOOLEAN                         Repaint;\r
   BOOLEAN                         SavedValue;\r
@@ -1730,6 +1705,7 @@ UiDisplayMenu (
     CurrentMenu = UiAddMenuList (NULL, &Selection->FormSetGuid, Selection->FormId);\r
   }\r
   ASSERT (CurrentMenu != NULL);\r
+  Selection->CurrentMenu = CurrentMenu;\r
 \r
   if (Selection->QuestionId == 0) {\r
     //\r
@@ -1745,7 +1721,7 @@ UiDisplayMenu (
   NewPos = gMenuOption.ForwardLink;\r
 \r
   gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-  UpdateStatusBar (REFRESH_STATUS_BAR, (UINT8) 0, TRUE);\r
+  UpdateStatusBar (Selection, REFRESH_STATUS_BAR, (UINT8) 0, TRUE);\r
 \r
   ControlFlag = CfInitialization;\r
   Selection->Action = UI_ACTION_NONE;\r
@@ -2697,84 +2673,10 @@ UiDisplayMenu (
       // We come here when someone press ESC\r
       //\r
       ControlFlag = CfCheckSelection;\r
-\r
-      if (CurrentMenu->Parent != NULL) {\r
-        //\r
-        // we have a parent, so go to the parent menu\r
-        //\r
-        if (CompareGuid (&CurrentMenu->FormSetGuid, &CurrentMenu->Parent->FormSetGuid)) {\r
-          //\r
-          // The parent menu and current menu are in the same formset\r
-          //\r
-          Selection->Action = UI_ACTION_REFRESH_FORM;\r
-        } else {\r
-          Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-        }\r
-        Selection->Statement = NULL;\r
-\r
-        Selection->FormId = CurrentMenu->Parent->FormId;\r
-        Selection->QuestionId = CurrentMenu->Parent->QuestionId;\r
-\r
-        //\r
-        // Clear highlight record for this menu\r
-        //\r
-        CurrentMenu->QuestionId = 0;\r
-        break;\r
-      }\r
-\r
-      if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
-        //\r
-        // We never exit FrontPage, so skip the ESC\r
-        //\r
-        Selection->Action = UI_ACTION_NONE;\r
-        break;\r
-      }\r
-\r
-      //\r
-      // We are going to leave current FormSet, so check uncommited data in this FormSet\r
-      //\r
-      if (gNvUpdateRequired) {\r
-        Status      = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-\r
-        YesResponse = gYesResponse[0];\r
-        NoResponse  = gNoResponse[0];\r
-\r
-        //\r
-        // If NV flag is up, prompt user\r
-        //\r
-        do {\r
-          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gSaveChanges, gAreYouSure, 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
-        if (Key.ScanCode == SCAN_ESC) {\r
-          //\r
-          // User hits the ESC key\r
-          //\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-\r
-          Selection->Action = UI_ACTION_NONE;\r
-          break;\r
-        }\r
-\r
-        //\r
-        // If the user hits the YesResponse key\r
-        //\r
-        if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
-          Status = SubmitForm (Selection->FormSet, Selection->Form);\r
-        }\r
-      }\r
-\r
-      Selection->Action = UI_ACTION_EXIT;\r
-      Selection->Statement = NULL;\r
-      CurrentMenu->QuestionId = 0;\r
-\r
-      return EFI_SUCCESS;\r
+      if (FindNextMenu (Selection, &Repaint, &NewLine)) {\r
+        return EFI_SUCCESS;\r
+      } \r
+      break;\r
 \r
     case CfUiLeft:\r
       ControlFlag = CfCheckSelection;\r
@@ -2869,7 +2771,7 @@ UiDisplayMenu (
         AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
         AdjustDateAndTimePosition (TRUE, &NewPos);\r
         MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        UpdateStatusBar (INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
+        UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
       } else {\r
         //\r
         // Scroll up to the last page.\r
@@ -3166,7 +3068,7 @@ UiDisplayMenu (
 \r
         MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
 \r
-        UpdateStatusBar (INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
+        UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
 \r
       } else {\r
         //\r
@@ -3197,12 +3099,12 @@ UiDisplayMenu (
       //\r
       // Submit the form\r
       //\r
-      Status = SubmitForm (Selection->FormSet, Selection->Form);\r
+      Status = SubmitForm (Selection->FormSet, Selection->Form, FALSE);\r
 \r
       if (!EFI_ERROR (Status)) {\r
         ASSERT(MenuOption != NULL);\r
-        UpdateStatusBar (INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
-        UpdateStatusBar (NV_UPDATE_REQUIRED, MenuOption->ThisTag->QuestionFlags, FALSE);\r
+        UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
+        UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, MenuOption->ThisTag->QuestionFlags, FALSE);\r
       } else {\r
         do {\r
           CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gSaveFailed, gPressEnter, gEmptyString);\r
@@ -3231,7 +3133,7 @@ UiDisplayMenu (
         //\r
         // Show NV update flag on status bar\r
         //\r
-        gNvUpdateRequired = TRUE;\r
+        UpdateNvInfoInForm(Selection->FormSet, TRUE);\r
         gResetRequired = TRUE;\r
       }\r
       break;\r