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
//\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
/**\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
**/\r
VOID\r
UpdateStatusBar (\r
+ IN UI_MENU_SELECTION *Selection,\r
IN UINTN MessageType,\r
IN UINT8 Flags,\r
IN BOOLEAN State\r
);\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
);\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
CHAR16 *OptionString;\r
CHAR16 *OutputString;\r
CHAR16 *FormattedString;\r
- CHAR16 YesResponse;\r
- CHAR16 NoResponse;\r
BOOLEAN NewLine;\r
BOOLEAN Repaint;\r
BOOLEAN SavedValue;\r
CurrentMenu = UiAddMenuList (NULL, &Selection->FormSetGuid, Selection->FormId);\r
}\r
ASSERT (CurrentMenu != NULL);\r
+ Selection->CurrentMenu = CurrentMenu;\r
\r
if (Selection->QuestionId == 0) {\r
//\r
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
// 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
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
\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
//\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
//\r
// Show NV update flag on status bar\r
//\r
- gNvUpdateRequired = TRUE;\r
+ UpdateNvInfoInForm(Selection->FormSet, TRUE);\r
gResetRequired = TRUE;\r
}\r
break;\r