4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUtility functions for User Interface functions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Setup.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY gMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY gMenuList = INITIALIZE_LIST_HEAD_VARIABLE (gMenuList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMENU_REFRESH_ENTRY *gMenuRefreshHead; // Menu list used for refresh timer opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMENU_REFRESH_ENTRY *gMenuEventGuidRefreshHead; // Menu list used for refresh event guid opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Search table for UiDisplayMenu()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSCAN_CODE_TO_SCREEN_OPERATION gScanCodeToOperation[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_UP,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_DOWN,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiDown,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_PAGE_UP,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiPageUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_PAGE_DOWN,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiPageDown,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_ESC,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiReset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_LEFT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiLeft,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCAN_RIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiRight,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mScanCodeNumber = sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSCREEN_OPERATION_T0_CONTROL_FLAG gScreenOperationToControlFlag[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiNoOperation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiNoOperation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiSelect,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiSelect,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiDown,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiDown,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiLeft,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiLeft,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiRight,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiRight,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiReset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiReset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiPageUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiPageUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiPageDown,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiPageDown
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiHotKey,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CfUiHotKey
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN mInputError;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN GetLineByWidthFinished = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set Buffer to Value for Size bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Memory to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size Number of bytes to set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value Value of the set operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetUnicodeMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Ptr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ptr = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Size--) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Ptr++) = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize Menu option list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiInitMenu (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&gMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free Menu option linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiFreeMenu (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (gMenuOption.ForwardLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&MenuOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We allocated space for this description when we did a GetToken, free it here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Skip != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For date/time, MenuOption->Description is shared by three Menu Options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Data format : [01/02/2004] [11:22:33]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Line number : 0 0 1 0 0 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (MenuOption->Description);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (MenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create a menu with specified formset GUID and form ID, and add it as a child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the given parent menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Parent The parent of menu to be added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HiiHandle Hii handle related to this formset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSetGuid The Formset Guid of menu to be added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormId The Form ID of menu to be added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the newly added menu or NULL if memory is insufficient.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUI_MENU_LIST *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiAddMenuList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UI_MENU_LIST *Parent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 FormId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList = AllocateZeroPool (sizeof (UI_MENU_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList->Signature = UI_MENU_LIST_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&MenuList->ChildListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList->HiiHandle = HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&MenuList->FormSetGuid, FormSetGuid, sizeof (EFI_GUID));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList->FormId = FormId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList->Parent = Parent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Parent == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If parent is not specified, it is the root Form of a Formset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&gMenuList, &MenuList->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&Parent->ChildListHead, &MenuList->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search Menu with given FormId and FormSetGuid in all cached menu list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Parent The parent of menu to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSetGuid The Formset GUID of the menu to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormId The Form ID of menu to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to menu found or NULL if not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUI_MENU_LIST *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiFindChildMenuList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_LIST *Parent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 FormId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *Child;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Parent != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Parent->FormId == FormId && CompareGuid (FormSetGuid, &Parent->FormSetGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Parent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Parent->ChildListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Parent->ChildListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Child = UI_MENU_LIST_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList = UiFindChildMenuList (Child, FormSetGuid, FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Parent->ChildListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search Menu with given FormSetGuid and FormId in all cached menu list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormSetGuid The Formset GUID of the menu to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FormId The Form ID of menu to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to menu found or NULL if not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUI_MENU_LIST *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiFindMenuList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 FormId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *Child;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&gMenuList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&gMenuList, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList = UI_MENU_LIST_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Child = UiFindChildMenuList(MenuList, FormSetGuid, FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Child != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Child;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&gMenuList, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free Menu option linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiFreeRefreshList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MENU_REFRESH_ENTRY *OldMenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (gMenuRefreshHead != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldMenuRefreshEntry = gMenuRefreshHead->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (gMenuRefreshHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gMenuRefreshHead = OldMenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (gMenuEventGuidRefreshHead != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldMenuRefreshEntry = gMenuEventGuidRefreshHead->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gMenuEventGuidRefreshHead != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent(gMenuEventGuidRefreshHead->Event);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (gMenuEventGuidRefreshHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gMenuEventGuidRefreshHead = OldMenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Process option string for date/time opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption Menu option point to date/time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OptionString Option string input for process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AddOptCol Whether need to update MenuOption->OptCol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncProcessStringForDateTime (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OptionString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN AddOptCol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Statement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuOption != NULL && OptionString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If leading spaces on OptionString - remove the spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; OptionString[Index] == L' '; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on the blockspace to get the option column info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddOptCol) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->OptCol++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionString[Count] = OptionString[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionString[Count] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enable to suppress field in the opcode base on the flag.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OptionString format is: <**: **: ****>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // |month|day|year|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 4 3 5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "<**:" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the day's ** field, after clean, the format is "< :"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[1], 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Statement->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "**:" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the month's "**" field, after clean, the format is " :"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[0], 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Statement->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "****>" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the year's "****" field, after clean, the format is " >"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[0], 4, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Statement->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OptionString format is: <**: **: **>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // |hour|minute|second|
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 4 3 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "<**:" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the hour's ** field, after clean, the format is "< :"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[1], 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Statement->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "**:" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the minute's "**" field, after clean, the format is " :"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[0], 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Statement->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point, only "**>" in the optionstring.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the second's "**" field, after clean, the format is " >"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (&OptionString[0], 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Refresh question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuRefreshEntry Menu refresh structure which has info about the refresh question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRefreshQuestion (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN MENU_REFRESH_ENTRY *MenuRefreshEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OptionString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_SELECTION *Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection = MenuRefreshEntry->Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = MenuRefreshEntry->MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If old Text is longer than new string, need to clean the old string before paint the newer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This option is no need for time/date opcode, because time/data opcode has fixed string length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuRefreshEntry->MenuOption->ThisTag->Operand != EFI_IFR_DATE_OP) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (MenuRefreshEntry->MenuOption->ThisTag->Operand != EFI_IFR_TIME_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentColumn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentColumn + gOptionBlockWidth - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, MenuRefreshEntry->CurrentAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessStringForDateTime(MenuRefreshEntry->MenuOption, OptionString, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Question value may be changed, need invoke its Callback()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessCallBackFunction (Selection, Question, EFI_BROWSER_ACTION_CHANGING, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Refresh the question which has refresh guid event attribute.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Event The event which has this function related.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Context The input context info related to this event or the status code return to the caller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRefreshQuestionNotify(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MENU_REFRESH_ENTRY *MenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_SELECTION *Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset FormPackage update flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiPackageListUpdated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = (MENU_REFRESH_ENTRY *)Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuRefreshEntry != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection = MenuRefreshEntry->Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RefreshQuestion (MenuRefreshEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mHiiPackageListUpdated) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Package list is updated, force to reparse IFR binary of target Formset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiPackageListUpdated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORMSET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Refresh screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRefreshForm (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MENU_REFRESH_ENTRY *MenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_SELECTION *Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gMenuRefreshHead != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // call from refresh interval process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = gMenuRefreshHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection = MenuRefreshEntry->Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset FormPackage update flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiPackageListUpdated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RefreshQuestion (MenuRefreshEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = MenuRefreshEntry->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (MenuRefreshEntry != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mHiiPackageListUpdated) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Package list is updated, force to reparse IFR binary of target Formset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiPackageListUpdated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORMSET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_TIMEOUT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Wait for a given event to fire, or for an optional timeout to expire.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Event The event to wait for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Timeout An optional timeout value in 100 ns units.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RefreshInterval Menu refresh interval (in seconds).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Event fired before Timeout expired.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIME_OUT Timout expired before Event fired.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiWaitForSingleEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Timeout, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 RefreshInterval OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT TimerEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT WaitList[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Timeout != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create a timer event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the timer event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SetTimer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimerEvent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimerRelative,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Timeout
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Wait for the original event or the timer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WaitList[0] = Event;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WaitList[1] = TimerEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->WaitForEvent (2, WaitList, &Index);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (TimerEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the timer expired, change the return to timed out
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && Index == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_TIMEOUT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update screen every second
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RefreshInterval == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Timeout = ONE_SECOND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Timeout = RefreshInterval * ONE_SECOND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the timer event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SetTimer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimerEvent,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimerRelative,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Timeout
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Wait for the original event or the timer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WaitList[0] = Event;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WaitList[1] = TimerEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->WaitForEvent (2, WaitList, &Index);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the timer expired, update anything that needs a refresh and keep waiting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && Index == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_TIMEOUT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RefreshInterval != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RefreshForm ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (TimerEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Status == EFI_TIMEOUT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Add one menu option by specified description and context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String String description for this option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Handle Hii handle for the package list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Form The form this statement belong to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Statement Statement of this Menu Option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumberOfLines Display lines for this Menu Option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuItemCount The index for this Option in the Menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Pointer Pointer to the added Menu Option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUI_MENU_OPTION *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiAddMenuOption (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_FORM *Form,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_STATEMENT *Statement,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 NumberOfLines,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 MenuItemCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add three MenuOptions for Date/Time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Data format : [01/02/2004] [11:22:33]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Line number : 0 0 1 0 0 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberOfLines = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Storage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For RTC type of date/time, set default refresh interval to be 1 second
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->RefreshInterval == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement->RefreshInterval = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Count; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = AllocateZeroPool (sizeof (UI_MENU_OPTION));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Signature = UI_MENU_OPTION_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Description = String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Handle = Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->ThisTag = Statement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->EntryNumber = MenuItemCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Override LineNumber for the MenuOption in Date/Time sequence
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Skip = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Skip = NumberOfLines;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Sequence = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EvaluateExpressionList(Statement->Expression, FALSE, NULL, NULL) == ExpressGrayOut ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->GrayOut = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->GrayOut = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the form or the question has the lock attribute, deal same as grayout.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Form->Locked || Statement->Locked) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->GrayOut = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Statement->Operand) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ORDERED_LIST_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TIME_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DATE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_CHECKBOX_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_PASSWORD_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // User could change the value of these items
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->IsQuestion = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_TEXT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initializing GrayOut option as TRUE for Text setup options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so that those options will be Gray in colour and un selectable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->GrayOut = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->IsQuestion = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->ValueExpression != NULL) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((Statement->QuestionFlags & EFI_IFR_FLAG_READ_ONLY) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->ReadOnly = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&gMenuOption, &MenuOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Routine used to abstract a generic dialog interface and return the selected key or string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumberOfLines The number of lines for the dialog box
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HotKey Defines whether a single character is parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TRUE) and returned in KeyValue or a string is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned in StringBuffer. Two special characters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are considered when entering a string, a SCAN_ESC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and an CHAR_CARRIAGE_RETURN. SCAN_ESC terminates
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string input and returns
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MaximumStringSize The maximum size in bytes of a typed in string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (each character is a CHAR16) and the minimum
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string returned is two bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StringBuffer The passed in pointer to the buffer which will
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hold the typed in string if HotKey is FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param KeyValue The EFI_KEY value returned if HotKey is TRUE..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ... A series of (quantity == NumberOfLines) text
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strings which will be used to construct the dialog
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync box
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Displayed dialog and received user interaction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One of the parameters was invalid (e.g.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (StringBuffer == NULL) && (HotKey == FALSE))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR User typed in an ESC character to exit the routine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateDialog (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN NumberOfLines,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN HotKey,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MaximumStringSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 *StringBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_INPUT_KEY *KeyValue,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LargestString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *BufferedString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StackString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 KeyPad[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Start;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Top;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN SelectionComplete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN InputOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CurrentAttribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsHeight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsHeight = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SelectionComplete = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputOffset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = AllocateZeroPool (MaximumStringSize * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferedString = AllocateZeroPool (MaximumStringSize * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAttribute = gST->ConOut->Mode->Attribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Zero the outgoing buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (StringBuffer, MaximumStringSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HotKey) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (KeyValue == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Disable cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LargestString = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, KeyValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine the largest string in the dialog box
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Notice we are starting with 1 since String is the first string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0; Count < NumberOfLines; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StackString = VA_ARG (Marker, CHAR16 *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StackString[0] == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputOffset = Count + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((GetStringWidth (StackString) / 2) > LargestString) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Size of the string visually and subtract the width by one for the null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LargestString = (GetStringWidth (StackString) / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = (DimensionsWidth - LargestString - 2) / 2 + gScreenDimensions.LeftColumn + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Top = ((DimensionsHeight - NumberOfLines - 2) / 2) + gScreenDimensions.TopRow - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the Popup
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, KeyValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateSharedPopUp (LargestString, NumberOfLines, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Take the first key typed and report it back?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HotKey) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = WaitForKeyStroke (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (KeyValue, &Key, sizeof (EFI_INPUT_KEY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = WaitForKeyStroke (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_NULL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_ESC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SelectionComplete = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_BACKSPACE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringBuffer[0] != CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; StringBuffer[Index] != CHAR_NULL; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = StringBuffer[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Effectively truncate string by 1 character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index - 1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringBuffer, TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If it is the beginning of the string, don't worry about checking maximum limits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StringBuffer[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy (StringBuffer, &Key.UnicodeChar, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy (TempString, &Key.UnicodeChar, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((GetStringWidth (StringBuffer) < MaximumStringSize) && (Key.UnicodeChar != CHAR_BACKSPACE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyPad[0] = Key.UnicodeChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyPad[1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (StringBuffer, KeyPad);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempString, KeyPad);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the width of the input string is now larger than the screen, we nee to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // adjust the index to start printing portions of the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (BufferedString, LargestString, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + InputOffset, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((GetStringWidth (StringBuffer) / 2) > (DimensionsWidth - 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (GetStringWidth (StringBuffer) / 2) - DimensionsWidth + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0; Index + 1 < GetStringWidth (StringBuffer) / 2; Index++, Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferedString[Count] = StringBuffer[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + InputOffset, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (!SelectionComplete);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Draw a pop up windows based on the dimension, number of lines and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strings specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestedWidth The width of the pop-up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumberOfLines The number of lines.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Marker The variable argument list for the list of string to be printed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateSharedPopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN RequestedWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN NumberOfLines,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VA_LIST Marker
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 Character;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Start;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN End;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Top;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Bottom;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsHeight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsHeight = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((RequestedWidth + 2) > DimensionsWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequestedWidth = DimensionsWidth - 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Subtract the PopUp width from total Columns, allow for one space extra on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // each end plus a border.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = (DimensionsWidth - RequestedWidth - 2) / 2 + gScreenDimensions.LeftColumn + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync End = Start + RequestedWidth + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Top = ((DimensionsHeight - NumberOfLines - 2) / 2) + gScreenDimensions.TopRow - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bottom = Top + NumberOfLines + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_DOWN_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Top, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_HORIZONTAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Start; Index + 2 < End; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_DOWN_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_VERTICAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Top; Index + 2 < Bottom; Index++, Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = VA_ARG (Marker, CHAR16*);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This will clear the background of the line - we never know who might have been
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // here before us. This differs from the next clear in that it used the non-reverse
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // video for normal printing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetStringWidth (String) / 2 > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (Start, End, Index + 1, Index + 1, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Passing in a space results in the assumption that this is where typing will occur
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (Start + 1, End - 1, Index + 1, Index + 1, POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Passing in a NULL results in a blank space
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String[0] == CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (Start, End, Index + 1, Index + 1, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((DimensionsWidth - GetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Index + 1, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (End - 1, Index + 1, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_UP_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Bottom - 1, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_HORIZONTAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Start; Index + 2 < End; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_UP_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Draw a pop up windows based on the dimension, number of lines and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync strings specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestedWidth The width of the pop-up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NumberOfLines The number of lines.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ... A series of text strings that displayed in the pop-up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateMultiStringPopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN RequestedWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN NumberOfLines,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, NumberOfLines);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateSharedPopUp (RequestedWidth, NumberOfLines, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update status bar on the bottom of menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection Current Selction info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MessageType The type of message to be shown.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Flags The flags in Question header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param State Set or clear.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUpdateStatusBar (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MessageType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN State
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NvUpdateMessage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *InputErrorMessage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORMSET *LocalFormSet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NvUpdateMessage = GetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), gHiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputErrorMessage = GetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), gHiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (MessageType) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case INPUT_ERROR:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (State) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, ERROR_TEXT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gScreenDimensions.LeftColumn + gPromptBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gScreenDimensions.BottomRow - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputErrorMessage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mInputError = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < (GetStringWidth (InputErrorMessage) - 2) / 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (gScreenDimensions.LeftColumn + gPromptBlockWidth + Index, gScreenDimensions.BottomRow - 1, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mInputError = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case NV_UPDATE_REQUIRED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Global setting support. Show configuration change on every form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (State) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gResetRequired = (BOOLEAN) (gResetRequired | ((Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection != NULL && Selection->Statement != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = Selection->Statement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Storage != NULL || Question->Operand == EFI_IFR_DATE_OP || Question->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update only for Question value that need to be saved into Storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Form->NvUpdateRequired = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection == NULL || IsNvUpdateRequired (Selection->FormSet)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gScreenDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gScreenDimensions.BottomRow - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NvUpdateMessage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < (GetStringWidth (NvUpdateMessage) - 2) / 2; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gScreenDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + Index),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gScreenDimensions.BottomRow - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L" "
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case REFRESH_STATUS_BAR:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mInputError) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Flags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (gBrowserSettingScope) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SystemLevel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the maintain list to see whether there is any change.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&gBrowserFormSetList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&gBrowserFormSetList, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNvUpdateRequired(LocalFormSet)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (NULL, NV_UPDATE_REQUIRED, Flags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&gBrowserFormSetList, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FormSetLevel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FormLevel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Flags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (InputErrorMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NvUpdateMessage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the supported width for a particular op-code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Statement The FORM_BROWSER_STATEMENT structure passed in.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Handle The handle in the HII database being used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Returns the number of CHAR16 characters that is support.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetWidth (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_STATEMENT *Statement,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if the second text parameter is really NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Operand == EFI_IFR_TEXT_OP) && (Statement->TextTwo != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = GetToken (Statement->TextTwo, Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Operand == EFI_IFR_SUBTITLE_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Statement->Operand == EFI_IFR_REF_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Statement->Operand == EFI_IFR_PASSWORD_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Statement->Operand == EFI_IFR_ACTION_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Statement->Operand == EFI_IFR_RESET_BUTTON_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allow a wide display if text op-code and no secondary text op-code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((Statement->Operand == EFI_IFR_TEXT_OP) && (Size == 0))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) (gPromptBlockWidth + gOptionBlockWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gPromptBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->InSubtitle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width -= SUBTITLE_INDENT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Will copy LineWidth amount of a string in the OutputString buffer and return the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync number of CHAR16 characters that were copied into the OutputString buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param InputString String description for this option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param LineWidth Width of the desired string to extract in CHAR16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync characters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Index Where in InputString to start the copy process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OutputString Buffer to copy the string into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Returns the number of CHAR16 characters that were copied into the OutputString buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetLineByWidth (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *InputString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 LineWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Index,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **OutputString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Count2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetLineByWidthFinished) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetLineByWidthFinished = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = LineWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count2 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *OutputString = AllocateZeroPool (((UINTN) (LineWidth + 1) * 2));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ensure we have got a valid buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*OutputString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //NARROW_CHAR can not be printed in screen, so if a line only contain the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line in Screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //To avoid displaying this empty line in screen, just skip the two CHARs here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Index = *Index + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fast-forward the string and see if there is a carriage-return or linefeed in the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; (InputString[*Index + Count2] != CHAR_LINEFEED) && (InputString[*Index + Count2] != CHAR_CARRIAGE_RETURN) && (Count2 != LineWidth); Count2++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the desired LineWidth of data to the output buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Also make sure that we don't copy more than the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Also make sure that if there are linefeeds, we account for them.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StrSize (&InputString[*Index]) <= ((UINTN) (LineWidth + 1) * 2)) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (StrSize (&InputString[*Index]) <= ((UINTN) (Count2 + 1) * 2))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert to CHAR16 value and show that we are done with this operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineWidth = (UINT16) ((StrSize (&InputString[*Index]) - 2) / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LineWidth != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetLineByWidthFinished = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count2 == LineWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Rewind the string from the maximum size until we see a space to break the line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; (InputString[*Index + LineWidth] != CHAR_SPACE) && (LineWidth != 0); LineWidth--)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LineWidth == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineWidth = Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineWidth = Count2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (*OutputString, &InputString[*Index], LineWidth * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If currently pointing to a space or carriage-return or linefeed, increment the index to the first non-space character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (InputString[*Index + LineWidth] == CHAR_SPACE) || (InputString[*Index + LineWidth] == CHAR_CARRIAGE_RETURN)|| (InputString[*Index + LineWidth] == CHAR_LINEFEED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Index)++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Index = (UINT16) (*Index + LineWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return LineWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update display lines for a Menu Option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection The user's selection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption The MenuOption to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUpdateOptionSkipLines (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_OPTION *MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OutputString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OptionString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessOptions (Selection, MenuOption, FALSE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&OptionString[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the Number of lines for this menu entry may or may not be reflected accurately
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // since the prompt might be 1 lines and option might be many, and vice versa, we need to do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // some testing to ensure we are keeping this in-sync.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the difference in rows is greater than or equal to the skip value, increase the skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Row - OriginalRow) >= MenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Skip++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether this Menu Option could be highlighted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption The MenuOption to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE This Menu Option is selectable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE This Menu Option could not be selected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsSelectable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->ThisTag->Operand == EFI_IFR_SUBTITLE_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->GrayOut || MenuOption->ReadOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determine if the menu is the last menu that can be selected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Direction The scroll direction. False is down. True is up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CurrentPos The current focus.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return FALSE -- the menu isn't the last menu that can be selected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE -- the menu is the last menu that can be selected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncValueIsScroll (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Direction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN LIST_ENTRY *CurrentPos
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move to next selectable statement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection Menu selection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param GoUp The navigation direction. TRUE: up, FALSE: down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CurrentPosition Current position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param GapToTop Gap position to top or bottom.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The row distance from current MenuOption to next selectable MenuOption.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMoveToNextStatement (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN GoUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY **CurrentPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN GapToTop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Distance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Pos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *NextMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *PreMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Distance = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pos = *CurrentPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreMenuOption = MENU_OPTION_FROM_LINK (Pos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (TRUE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = MENU_OPTION_FROM_LINK (Pos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NextMenuOption->Row == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, NextMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GoUp && (PreMenuOption != NextMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Current Position doesn't need to be caculated when go up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Caculate distanct at first when go up
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = PreMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Distance += NextMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsSelectable (NextMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Arrive at top.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Distance = -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GoUp) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Caculate distanct at later when go down
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = PreMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Distance += NextMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreMenuOption = NextMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pos = (GoUp ? Pos->BackLink : Pos->ForwardLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CurrentPosition = &NextMenuOption->Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Distance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Adjust Data and Time position accordingly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data format : [01/02/2004] [11:22:33]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line number : 0 0 1 0 0 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DirectionUp the up or down direction. False is down. True is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CurrentPosition Current position. On return: Point to the last
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Option (Year or Second) if up; Point to the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Option (Month or Hour) if down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Return line number to pad. It is possible that we stand on a zero-advance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return data or time opcode, so pad one line when we judge if we are going to scroll outside.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAdjustDateAndTimePosition (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN DirectionUp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY **CurrentPosition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *NewPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PadLineNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PadLineNumber = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPosition = *CurrentPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (NewPosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate the distance from current position to the last Date/Time MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (MenuOption->Skip == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPosition = NewPosition->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (NewPosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PadLineNumber = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPosition = *CurrentPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DirectionUp) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the behavior of hitting the up arrow on a Date/Time MenuOption is intended
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to be one that back to the previous set of MenuOptions, we need to advance to the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Date/Time MenuOption and leave the remaining logic in CfUiUp intact so the appropriate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // checking can be done.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Count++ < 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPosition = NewPosition->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the behavior of hitting the down arrow on a Date/Time MenuOption is intended
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to be one that progresses to the next set of MenuOptions, we need to advance to the last
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Date/Time MenuOption and leave the remaining logic in CfUiDown intact so the appropriate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // checking can be done.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Count-- > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPosition = NewPosition->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CurrentPosition = NewPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PadLineNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find HII Handle in the HII database associated with given Device Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePath is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath Device Path associated with the HII package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Handle HII package list Handle associated with the Device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Hii Package list handle is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDevicePathToHiiHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE *HiiHandles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (DevicePath != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpDevicePath = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate Device Path Protocol handle buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TmpDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || !IsDevicePathEnd (TmpDevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve all HII Handles from HII database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0x1000;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandles != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->ListPackageLists (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_TYPE_ALL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandles != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->ListPackageLists (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_TYPE_ALL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search Hii Handle by Driver Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HandleCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->GetPackageListHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = HiiHandles[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find HII Handle in the HII database associated with given form set guid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FormSetGuid is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ComparingGuid FormSet Guid associated with the HII package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Handle HII package list Handle associated with the Device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Hii Package list handle is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFormSetGuidToHiiHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID *ComparingGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE *HiiHandles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Offset2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PackageListLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER PackageHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Package;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *OpCodeData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ComparingGuid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all the Hii handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandles = HiiGetHiiHandles (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandles != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search for formset of each class type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; HiiHandles[Index] != NULL; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiPackageList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || HiiPackageList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Form package from this HII package List
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset2 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Offset < PackageListLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Package = ((UINT8 *) HiiPackageList) + Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search FormSet in this Form Package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Offset2 < PackageHeader.Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeData = Package + Offset2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to compare against formset GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid (ComparingGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = HiiHandles[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += PackageHeader.Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Process the goto op code, update the info in the selection structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Statement The statement belong to goto op code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection The selection info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Repaint Whether need to repaint the menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NewLine Whether need to create new line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The menu process successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Other value if the process failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncProcessGotoOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT FORM_BROWSER_STATEMENT *Statement,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *Repaint,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *NewLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StringLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DevicePathBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORM *RefForm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *MenuList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN UpdateFormInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateFormInfo = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare the device path check, get the device path info first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->HiiValue.Value.ref.DevicePath != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringLen = StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether the device path string is a valid string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL && StringLen != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Goto another Hii Package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORMSET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = StrLen (StringPtr) / 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (DevicePath != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert from Device Path String to DevicePath Buffer in the reverse order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer = (UINT8 *) DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = StringPtr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DigitUint8 == 0 && TemStr[0] != L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Hex Char as the tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer [Index/2] = DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Handle = DevicePathToHiiHandle (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Handle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If target Hii Handle not found, exit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->FormId = Statement->HiiValue.Value.ref.FormId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &gZeroGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Goto another Formset, check for uncommitted data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORMSET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Handle = FormSetGuidToHiiHandle(&Statement->HiiValue.Value.ref.FormSetGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Handle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If target Hii Handle not found, exit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->FormId = Statement->HiiValue.Value.ref.FormId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Statement->HiiValue.Value.ref.FormId != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether target From is suppressed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RefForm = IdToForm (Selection->FormSet, Statement->HiiValue.Value.ref.FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EvaluateExpressionList(RefForm->SuppressExpression, TRUE, Selection->FormSet, RefForm) != ExpressFalse) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Form is suppressed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Repaint != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Goto another form inside this formset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->FormId = Statement->HiiValue.Value.ref.FormId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Statement->HiiValue.Value.ref.QuestionId != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Goto another Question
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Repaint != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewLine != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateFormInfo = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateFormInfo = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UpdateFormInfo) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Link current form so that we can always go back when someone hits the ESC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList = UiFindMenuList (&Selection->FormSetGuid, Selection->FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuList == NULL && Selection->CurrentMenu != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuList = UiAddMenuList (Selection->CurrentMenu, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Display menu and wait for user to select one menu option, then return it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If AutoBoot is enabled, then if user doesn't select any option,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync after period of time, it will automatically return the first menu option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection Menu selection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCESSS This function always return successfully for now.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUiDisplayMenu (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UI_MENU_SELECTION *Selection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Difference;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN OldSkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DistanceValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Col;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Temp2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BottomRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OptionString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OutputString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *HelpString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *HelpHeaderString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *HelpBottomString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN NewLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Repaint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN SavedValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN UpArrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN DownArrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InitializedFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *TopOfScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *SavedListEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *NextMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *SavedMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_OPTION *PreviousMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_CONTROL_FLAG ControlFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SCREEN_DESCRIPTOR LocalScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MENU_REFRESH_ENTRY *MenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MENU_REFRESH_ENTRY *MenuUpdateEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_SCREEN_OPERATION ScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 MinRefreshInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Statement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI_MENU_LIST *CurrentMenu;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ModalSkipColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BROWSER_HOT_KEY *HotKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpPageIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpPageCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN RowCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpHeaderLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpBottomLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN MultiHelpPage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpHeaderString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpBottomString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiNoOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MinRefreshInterval = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpLine = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RowCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpBottomLine = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpHeaderLine = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiHelpPage = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = gMenuRefreshHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousMenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HotKey = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModalSkipColumn = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Key, sizeof (EFI_INPUT_KEY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BottomRow = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight - SCROLL_ARROW_HEIGHT - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->TopRow = TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->BottomRow = BottomRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->PromptCol = Col;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->OptionCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find current Menu
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentMenu = UiFindMenuList (&Selection->FormSetGuid, Selection->FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentMenu == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Current menu not found, add it to the menu tree
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentMenu = UiAddMenuList (NULL, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (CurrentMenu != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->CurrentMenu = CurrentMenu;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->QuestionId == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight not specified, fetch it from cached menu
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = CurrentMenu->QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Sequence = CurrentMenu->Sequence;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Init option as the current user's selection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializedFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, REFRESH_STATUS_BAR, (UINT8) 0, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfInitialization;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_NONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (TRUE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ControlFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfInitialization:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (&gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfCheckSelection:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Action != UI_ACTION_NONE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfExit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfRepaint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfRepaint:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfRefreshHighLight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Repaint) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display menu
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = (UINTN) SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp2 = (UINTN) SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.LeftColumn + ModalSkipColumn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow - SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BottomRow + SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.LeftColumn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow - SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BottomRow + SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiFreeRefreshList ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MinRefreshInterval = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row = Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Col = Col;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->OptCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn + ModalSkipColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->OptCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->InSubtitle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Col += SUBTITLE_INDENT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->GrayOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_SUBTITLE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = GetWidth (Statement, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_REF_OP && MenuOption->Col >= 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print Arrow for Goto button.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Col - 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%c",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GEOMETRICSHAPE_RIGHT_TRIANGLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Temp == 0) && (Row <= BottomRow)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->Col, Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&MenuOption->Description[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessOptions (Selection, MenuOption, FALSE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Repaint to clear possible error prompt pop-up
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfRepaint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessStringForDateTime(MenuOption, OptionString, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Temp2 == 0) && (Row <= BottomRow)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->OptCol, Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&OptionString[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp2 == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the Number of lines for this menu entry may or may not be reflected accurately
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // since the prompt might be 1 lines and option might be many, and vice versa, we need to do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // some testing to ensure we are keeping this in-sync.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the difference in rows is greater than or equal to the skip value, increase the skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Row - OriginalRow) >= MenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Skip++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp2 != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp2--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp2 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Question has refresh guid, register the op-code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gMenuEventGuidRefreshHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gMenuEventGuidRefreshHead = MenuUpdateEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry = gMenuEventGuidRefreshHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (MenuUpdateEntry->Next != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry = MenuUpdateEntry->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->Next = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry = MenuUpdateEntry->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuUpdateEntry != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, RefreshQuestionNotify, MenuUpdateEntry, &Statement->RefreshGuid, &MenuUpdateEntry->Event);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (!EFI_ERROR (Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->MenuOption = MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->Selection = Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->CurrentColumn = MenuOption->OptCol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->CurrentRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->GrayOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuUpdateEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Question request refresh, register the op-code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->RefreshInterval != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Menu will be refreshed at minimal interval of all Questions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // which have refresh request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MinRefreshInterval == 0 || Statement->RefreshInterval < MinRefreshInterval) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MinRefreshInterval = Statement->RefreshInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gMenuRefreshHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gMenuRefreshHead = MenuRefreshEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = gMenuRefreshHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (MenuRefreshEntry->Next != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = MenuRefreshEntry->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->Next = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry = MenuRefreshEntry->Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuRefreshEntry != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->MenuOption = MenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->Selection = Selection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentColumn = MenuOption->OptCol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->GrayOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If this is a text op with secondary text information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Operand == EFI_IFR_TEXT_OP) && (Statement->TextTwo != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (Statement->TextTwo, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (StringPtr, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Temp == 0) && (Row <= BottomRow)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->OptCol, Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&StringPtr[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp2 == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the Number of lines for this menu entry may or may not be reflected accurately
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // since the prompt might be 1 lines and option might be many, and vice versa, we need to do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // some testing to ensure we are keeping this in-sync.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the difference in rows is greater than or equal to the skip value, increase the skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Row - OriginalRow) >= MenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Skip++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp2 != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp2--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Need to handle the bottom of the display
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Skip > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row += MenuOption->Skip - SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row += MenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Row > BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!ValueIsScroll (FALSE, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DownArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = BottomRow + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!ValueIsScroll (TRUE, TopOfScreen)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UpArrow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow - SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%c",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ARROW_UP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DownArrow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BottomRow + SCROLL_ARROW_HEIGHT,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%c",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ARROW_DOWN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfRefreshHighLight:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // MenuOption: Last menu option that need to remove hilight
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // MenuOption is set to NULL in Repaint
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NewPos: Current menu option that need to hilight
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfUpdateHelpString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InitializedFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializedFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Repaint flag is normally reset when finish processing CfUpdateHelpString. Temporarily
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reset Repaint flag because we may break halfway and skip CfUpdateHelpString processing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedValue = Repaint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->QuestionId != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((SavedMenuOption->ThisTag->QuestionId != Selection->QuestionId ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption->Sequence != Selection->Sequence) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos->ForwardLink != &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = NewPos->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SavedMenuOption->ThisTag->QuestionId == Selection->QuestionId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Target Question found, find its MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = TopOfScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = TopRow; Index <= BottomRow && Link != NewPos;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index += SavedMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Link == TopOfScreen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index -= OldSkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos == Link) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not find the selected menu in current show page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Have two case to enter this if:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Not find the menu at current page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Find the menu in current page, but the menu shows at the bottom and not all info shows.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For case 2, has an exception: The menu can show more than one pages and now only this menu shows.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on the selected menu will show at the bottom of the page,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // select the menu which will show at the top of the page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Link != NewPos || Index > BottomRow ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Link == NewPos && (SavedMenuOption->Row + SavedMenuOption->Skip - 1 > BottomRow) && (Link != TopOfScreen))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the MenuOption which has the skip value for Date/Time opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition(FALSE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NewPos is not in the current page, simply scroll page so that NewPos is in the end of the page
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SavedMenuOption->Row == 0 means the menu not show yet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SavedMenuOption->Row == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, SavedMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on the selected menu will show at the bottome of next page,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // select the menu show at the top of the next page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = TopRow + SavedMenuOption->Skip; Index <= BottomRow + 1; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SavedMenuOption->Row == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, SavedMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index += SavedMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Found the menu which will show at the top of the page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Link == NewPos) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The menu can show more than one pages, just show the menu at the top of the page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether need to skip some line for menu shows at the top of the page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = Index - BottomRow - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SkipValue > 0 && SkipValue < (INTN) SavedMenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfRepaint;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Target Question not found, highlight the default menu option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = TopOfScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos != NULL && (MenuOption == NULL || NewPos != &MenuOption->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove highlight on last Menu Option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessOptions (Selection, MenuOption, FALSE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessStringForDateTime(MenuOption, OptionString, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&OptionString[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewLine) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->GrayOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (MenuOption->ThisTag->Operand == EFI_IFR_SUBTITLE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = GetWidth (MenuOption->ThisTag, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&MenuOption->Description[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This is the current selected statement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = Statement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsSelectable (MenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = SavedValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateKeyHelp (Selection, MenuOption, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Record highlight for current menu
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentMenu->QuestionId = Statement->QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentMenu->Sequence = MenuOption->Sequence;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set reverse attribute
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assuming that we have a refresh linked-list created, lets annotate the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // appropriate entry that we are highlighting with its new attribute. Just prior to this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // lets reset all of the entries' attribute so we do not get multiple highlights in he refresh
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gMenuRefreshHead != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (MenuRefreshEntry = gMenuRefreshHead; MenuRefreshEntry != NULL; MenuRefreshEntry = MenuRefreshEntry->Next) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuRefreshEntry->MenuOption->GrayOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuRefreshEntry->MenuOption == MenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessOptions (Selection, MenuOption, FALSE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessStringForDateTime(MenuOption, OptionString, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&OptionString[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewLine) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalRow = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = GetWidth (Statement, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is more string to process print on the next row and increment the Skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (&MenuOption->Description[Index]) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OutputString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption->Row = OriginalRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateKeyHelp (Selection, MenuOption, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear reverse attribute
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Repaint flag will be used when process CfUpdateHelpString, so restore its value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we didn't break halfway when process CfRefreshHighLight.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = SavedValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUpdateHelpString:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfPrepareToReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Repaint || NewLine) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Don't print anything if it is a NULL help token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->ThisTag->Help == 0 || !IsSelectable (MenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = L"\0";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (MenuOption->ThisTag->Help, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RowCount = BottomRow - TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1.Calculate how many line the help string need to print.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpLine = ProcessHelpString (StringPtr, &HelpString, RowCount);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpLine > RowCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiHelpPage = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, RowCount);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, RowCount);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate the help page count.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpLine > 2 * RowCount - 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageCount += 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageCount = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiHelpPage = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the help field first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - gHelpBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BottomRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether need to show the 'More(U/u)' at the begin.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on current direct info, here shows aligned to the right side of the column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the direction is multi line and aligned to right side may have problem, so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add ASSERT code here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpPageIndex > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HelpHeaderLine; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HelpHeaderLine == 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + TopRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HelpHeaderString[Index * gHelpBlockWidth * 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, HELP_TEXT | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the help string info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MultiHelpPage) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HelpLine; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - gHelpBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + TopRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HelpString[Index * gHelpBlockWidth * 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpPageIndex == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - gHelpBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + TopRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HelpString[Index * gHelpBlockWidth * 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - gHelpBlockWidth,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + TopRow + HelpHeaderLine,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* gHelpBlockWidth * 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether need to print the 'More(D/d)' at the bottom.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Base on current direct info, here shows aligned to the right side of the column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the direction is multi line and aligned to right side may have problem, so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add ASSERT code here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HelpBottomLine; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HelpBottomLine == 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalScreen.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index + BottomRow - HelpBottomLine,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HelpBottomString[Index * gHelpBlockWidth * 2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset this flag every time we finish using it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfPrepareToReadKey:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiNoOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfReadKey:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Wait for user's selection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, MinRefreshInterval);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Status == EFI_TIMEOUT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Action == UI_ACTION_REFRESH_FORMSET) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // IFR is updated in Callback of refresh opcode, re-parse it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we encounter error, continue to read another key in.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(MenuOption->GrayOut || MenuOption->ReadOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiSelect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We will push the adjustment of these numeric values directly to the input handler
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NOTE: we won't handle manual input numeric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '+':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '-':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the screen has no menu items, and the user didn't select UiReset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore the selection and go back to reading keys.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Statement->Operand == EFI_IFR_DATE_OP)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (Statement->Operand == EFI_IFR_TIME_OP)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ((Statement->Operand == EFI_IFR_NUMERIC_OP) && (Statement->Step != 0))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == '+') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = SCAN_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = SCAN_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Repaint to clear possible error prompt pop-up
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '^':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiUp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'V':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'v':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiDown;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ' ':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the screen has no menu items, and the user didn't select UiReset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore the selection and go back to reading keys.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if(IsListEmpty (&gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->ThisTag->Operand == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiSelect;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'D':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'd':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MultiHelpPage) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfUpdateHelpString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageIndex = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'U':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'u':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!MultiHelpPage) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfUpdateHelpString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpPageIndex = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_NULL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < mScanCodeNumber; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = gScanCodeToOperation[Index].ScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Selection->Form->ModalForm && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ModalForm has no ESC key and Hot Key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Index == mScanCodeNumber) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether Key matches the registered hot key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HotKey = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((gBrowserSettingScope == SystemLevel) || (gFunctionKeySetting != NONE_FUNCTION_KEY_SETTING)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HotKey = GetHotKeyFromRegisterList (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HotKey != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiHotKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfScreenOperation:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ScreenOperation != UiReset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the screen has no menu items, and the user didn't select UiReset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore the selection and go back to reading keys.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (&gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfReadKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index < sizeof (gScreenOperationToControlFlag) / sizeof (gScreenOperationToControlFlag[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ScreenOperation == gScreenOperationToControlFlag[Index].ScreenOperation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = gScreenOperationToControlFlag[Index].ControlFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiSelect:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Statement = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Statement->Operand == EFI_IFR_TEXT_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Keep highlight on current MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->QuestionId = Statement->QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Statement->Operand) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_REF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProcessGotoOpCode(Statement, Selection, &Repaint, &NewLine);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ACTION_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Process the Config string <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessQuestionConfig (Selection, Statement);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The action button may change some Question value, so refresh the form
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_RESET_BUTTON_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset Question to default value specified by DefaultId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfUiDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId = Statement->DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Editable Questions: oneof, ordered list, checkbox, numeric, string, password
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateKeyHelp (Selection, MenuOption, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateKeyHelp (Selection, MenuOption, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptionString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptionString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiReset:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We come here when someone press ESC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FindNextMenu (Selection, &Repaint, &NewLine);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiLeft:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // In the middle or tail of the Date/Time op-code set, go left.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewPos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = NewPos->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiRight:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence != 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // In the middle or tail of the Date/Time op-code set, go left.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewPos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = NewPos->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiUp:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedListEntry = NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewPos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust Date/Time position before we advance forward.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos->BackLink != &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = NewPos->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PreviousMenuOption->Row == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, PreviousMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DistanceValue = PreviousMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Row >= DistanceValue + TopRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = MoveToNextStatement (Selection, TRUE, &NewPos, MenuOption->Row - TopRow - DistanceValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Difference < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We hit the begining MenuOption that can be focused
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so we simply scroll to the top.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOfScreen != gMenuOption.ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Scroll up to the last page when we have arrived at top page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = &gMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = &gMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiPageUp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (MenuOption->Row < TopRow + DistanceValue + Difference) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Previous focus MenuOption is above the TopOfScreen, so we need to scroll
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!IsSelectable (NextMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Continue to go up until scroll to next page or the selectable option is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiUp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Scroll up to the last page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = &gMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = &gMenuOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiPageUp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiPageUp:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewPos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos->BackLink == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = TopOfScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = BottomRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Index >= TopRow) && (Link->BackLink != &gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PreviousMenuOption->Row == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, PreviousMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index < PreviousMenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = Index - PreviousMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Link->BackLink == &gMenuOption) && (Index >= TopRow)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOfScreen == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, TRUE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (TopOfScreen != Link) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Finally we know that NewPos is the last MenuOption can be focused.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index + 1 < TopRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Back up the previous option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move to the option in Next page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOfScreen == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, TRUE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There are more MenuOption needing scrolling up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Don't do this when we are already in the first page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiPageDown:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (NewPos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos->ForwardLink == &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = TopOfScreen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Index <= BottomRow) && (Link->ForwardLink != &gMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = Index + NextMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = MENU_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Link->ForwardLink == &gMenuOption) && (Index <= BottomRow)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Finally we know that NewPos is the last MenuOption can be focused.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, TRUE, &Link, Index - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index - 1 > BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Back up the previous option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There are more MenuOption needing scrolling down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move to the option in Next page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &Link, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Don't do this when we are already in the last page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiDown:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the behavior of hitting the down arrow on a Date/Time op-code is intended
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to be one that progresses to the next set of op-codes, we need to advance to the last
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Date/Time op-code and leave the remaining logic in UiDown intact so the appropriate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // checking can be done. The only other logic we need to introduce is that if a Date/Time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // op-code is the last entry in the menu, we need to rewind back to the first op-code of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the Date/Time op-code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedListEntry = NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (FALSE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos->ForwardLink != &gMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = NewPos->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BottomRow >= MenuOption->Row + MenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - MenuOption->Row - MenuOption->Skip);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We hit the end of MenuOption that can be focused
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so we simply scroll to the first page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Difference < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Scroll to the first page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOfScreen != gMenuOption.ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // An option might be multi-line, so we need to reflect that data in the overall skip value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateOptionSkipLines (Selection, NextMenuOption);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DistanceValue = Difference + NextMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = MenuOption->Row + MenuOption->Skip + DistanceValue - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MenuOption->Row + MenuOption->Skip == BottomRow + 1) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (NextMenuOption->ThisTag->Operand == EFI_IFR_DATE_OP ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextMenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp ++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are going to scroll, update TopOfScreen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Temp > BottomRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Is the current top of screen a zero-advance op-code?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If so, keep moving forward till we hit a >0 advance op-code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If bottom op-code is more than one line or top op-code is more than one line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DistanceValue > 1) || (MenuOption->Skip > 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Is the bottom op-code greater than or equal in size to the top op-code?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Temp - BottomRow) >= (SavedMenuOption->Skip - OldSkipValue)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the top op-code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = TopOfScreen->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = (Temp - BottomRow) - (SavedMenuOption->Skip - OldSkipValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = Difference;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we have a remainder, skip that many more op-codes until we drain the remainder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Difference >= (INTN) SavedMenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since the Difference is greater than or equal to this op-code's skip value, skip it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Difference = Difference - (INTN) SavedMenuOption->Skip;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = TopOfScreen->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since we will act on this op-code in the next routine, and increment the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SkipValue, set the skips to one less than what is required.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = Difference - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since we will act on this op-code in the next routine, and increment the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SkipValue, set the skips to one less than what is required.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = OldSkipValue + (Temp - BottomRow) - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OldSkipValue + 1) == (INTN) SavedMenuOption->Skip) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = TopOfScreen->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = OldSkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the op-code at the top of the screen is more than one line, let's not skip it yet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Let's set a skip flag to smoothly scroll the top of the screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SavedMenuOption->Skip > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SavedMenuOption == NextMenuOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (SavedMenuOption->Skip == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = TopOfScreen->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (SavedMenuOption->Skip == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldSkipValue = SkipValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!IsSelectable (NextMenuOption)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Continue to go down until scroll to next page or the selectable option is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenOperation = UiDown;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfScreenOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Scroll to the first page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOfScreen != gMenuOption.ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOfScreen = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = gMenuOption.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &TopOfScreen);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustDateAndTimePosition (TRUE, &NewPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiHotKey:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Discard changes. After it, no NV flag is showed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HotKey->Action & BROWSER_ACTION_DISCARD) == BROWSER_ACTION_DISCARD) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = DiscardForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gResetRequired = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gDiscardFailed, gPressEnter, gEmptyString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Still show current page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_NONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reterieve default setting. After it. NV flag will be showed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HotKey->Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ExtractDefault (Selection->FormSet, Selection->Form, HotKey->DefaultId, gBrowserSettingScope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gResetRequired = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gDefaultFailed, gPressEnter, gEmptyString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Still show current page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_NONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save changes. After it, no NV flag is showed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HotKey->Action & BROWSER_ACTION_SUBMIT) == BROWSER_ACTION_SUBMIT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SubmitForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MenuOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, MenuOption->ThisTag->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gSaveFailed, gPressEnter, gEmptyString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Still show current page.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_NONE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Repaint = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewLine = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Reset required Flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HotKey->Action & BROWSER_ACTION_RESET) == BROWSER_ACTION_RESET) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gResetRequired = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Exit Action
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HotKey->Action & BROWSER_ACTION_EXIT) == BROWSER_ACTION_EXIT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Form Exit without saving, Similar to ESC Key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // FormSet Exit without saving, Exit SendForm.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // System Exit without saving, CallExitHandler and Exit SendForm.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DiscardForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gBrowserSettingScope == FormLevel) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfUiReset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gBrowserSettingScope == FormSetLevel) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gBrowserSettingScope == SystemLevel) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ExitHandlerFunction != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExitHandlerFunction ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiDefault:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset to default value for all forms in the whole system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ExtractDefault (Selection->FormSet, NULL, DefaultId, FormSetLevel);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Action = UI_ACTION_REFRESH_FORM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Selection->Statement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gResetRequired = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfUiNoOperation:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ControlFlag = CfCheckSelection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CfExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiFreeRefreshList ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, 0, Row + 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->OutputString (gST->ConOut, L"\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}