FormDisplay.c revision f0c5095b274b2b35867d5245119aa1aba0acc87e
17c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** @file 27c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEntry and initialization module for the browser. 37c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4f0c5095b274b2b35867d5245119aa1aba0acc87eEric DongCopyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> 57c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongThis program and the accompanying materials 67c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dongare licensed and made available under the terms and conditions of the BSD License 77c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dongwhich accompanies this distribution. The full text of the license may be found at 87c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Donghttp://opensource.org/licenses/bsd-license.php 97c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong#include "FormDisplay.h" 167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// 187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// Search table for UiDisplayMenu() 197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// 207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongSCAN_CODE_TO_SCREEN_OPERATION gScanCodeToOperation[] = { 217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_UP, 237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiUp, 247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_DOWN, 277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiDown, 287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_PAGE_UP, 317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiPageUp, 327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_PAGE_DOWN, 357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiPageDown, 367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_ESC, 397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiReset, 407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_LEFT, 437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiLeft, 447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SCAN_RIGHT, 477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiRight, 487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}; 507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN mScanCodeNumber = sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]); 527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongSCREEN_OPERATION_T0_CONTROL_FLAG gScreenOperationToControlFlag[] = { 547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiNoOperation, 567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiNoOperation, 577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiSelect, 607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiSelect, 617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiUp, 647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiUp, 657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiDown, 687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiDown, 697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiLeft, 727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiLeft, 737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiRight, 767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiRight, 777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiReset, 807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiReset, 817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiPageUp, 847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiPageUp, 857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiPageDown, 887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiPageDown 897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong }, 907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiHotKey, 927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CfUiHotKey 937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}; 957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_GUID gDisplayEngineGuid = { 977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 0xE38C1029, 0xE38F, 0x45b9, {0x8F, 0x0D, 0xE2, 0xE6, 0x0B, 0xC9, 0xB2, 0x62} 987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}; 997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1005a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongFORM_ENTRY_INFO gFormEntryInfo; 1017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN gSequence; 1027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_SCREEN_DESCRIPTOR gStatementDimensions; 1037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBOOLEAN mStatementLayoutIsChanged = TRUE; 1047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUSER_INPUT *gUserInput; 1057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFORM_DISPLAY_ENGINE_FORM *gFormData; 1067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_HII_HANDLE gHiiHandle; 1077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT16 gDirection; 1087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongLIST_ENTRY gMenuOption; 1097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongDISPLAY_HIGHLIGHT_MENU_INFO gHighligthMenuInfo = {0}; 1105a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongBOOLEAN mIsFirstForm = TRUE; 1115a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongFORM_ENTRY_INFO gOldFormEntry = {0}; 1127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// 1147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// Browser Global Strings 1157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong// 1167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gFormNotFound; 1177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gNoSubmitIf; 1187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gBrwoserError; 1197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gSaveFailed; 1207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gPromptForData; 1217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gPromptForPassword; 1227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gPromptForNewPassword; 1237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gConfirmPassword; 1247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gConfirmError; 1257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gPassowordInvalid; 1267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gPressEnter; 1277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gEmptyString; 1287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gMiniString; 1297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gOptionMismatch; 1307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gFormSuppress; 1317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *gProtocolNotFound; 1327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 133af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongCHAR16 gModalSkipColumn; 1347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 gPromptBlockWidth; 1357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 gOptionBlockWidth; 1367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 gHelpBlockWidth; 1377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 *mUnknownString; 1387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFORM_DISPLAY_DRIVER_PRIVATE_DATA mPrivateData = { 1407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_DRIVER_SIGNATURE, 1417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NULL, 1427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong { 1437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FormDisplay, 1445a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong DriverClearDisplayPage, 1457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ConfirmDataChange 1467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 1477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong}; 1487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 1517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Get the string based on the StringId and HII Package List Handle. 1527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param Token The String's ID. 1547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param HiiHandle The package list in the HII database to search for 1557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong the specified string. 1567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return The output string. 1587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 1607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongCHAR16 * 1617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetToken ( 1627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_STRING_ID Token, 1637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_HII_HANDLE HiiHandle 1647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 1657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 1667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STRING String; 1677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong String = HiiGetString (HiiHandle, Token, NULL); 1697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (String == NULL) { 1707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong String = AllocateCopyPool (StrSize (mUnknownString), mUnknownString); 1717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (String != NULL); 1727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 1737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return (CHAR16 *) String; 1757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 1767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 1797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Initialize the HII String Token to the correct values. 1807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 1827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 1837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongInitializeDisplayStrings ( 1847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong VOID 1857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 1867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 1877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong mUnknownString = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle); 1887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gSaveFailed = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle); 1897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gPromptForData = GetToken (STRING_TOKEN (PROMPT_FOR_DATA), gHiiHandle); 1907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gPromptForPassword = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle); 1917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle); 1927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gConfirmPassword = GetToken (STRING_TOKEN (CONFIRM_PASSWORD), gHiiHandle); 1937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gConfirmError = GetToken (STRING_TOKEN (CONFIRM_ERROR), gHiiHandle); 1947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gPassowordInvalid = GetToken (STRING_TOKEN (PASSWORD_INVALID), gHiiHandle); 1957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gPressEnter = GetToken (STRING_TOKEN (PRESS_ENTER), gHiiHandle); 1967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gEmptyString = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle); 1977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gMiniString = GetToken (STRING_TOKEN (MINI_STRING), gHiiHandle); 1987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gOptionMismatch = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle); 1997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gFormSuppress = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle); 2007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gProtocolNotFound = GetToken (STRING_TOKEN (PROTOCOL_NOT_FOUND), gHiiHandle); 2017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gFormNotFound = GetToken (STRING_TOKEN (STATUS_BROWSER_FORM_NOT_FOUND), gHiiHandle); 2027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gNoSubmitIf = GetToken (STRING_TOKEN (STATUS_BROWSER_NO_SUBMIT_IF), gHiiHandle); 2037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gBrwoserError = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle); 2047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 2057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 2077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Free up the resource allocated for all strings required 2087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong by Setup Browser. 2097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 2117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 2127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFreeDisplayStrings ( 2137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong VOID 2147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 2157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 2167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (mUnknownString); 2177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gEmptyString); 2187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gSaveFailed); 2197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gPromptForData); 2207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gPromptForPassword); 2217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gPromptForNewPassword); 2227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gConfirmPassword); 2237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gConfirmError); 2247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gPassowordInvalid); 2257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gPressEnter); 2267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gMiniString); 2277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gOptionMismatch); 2287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gFormSuppress); 2297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gProtocolNotFound); 2307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gBrwoserError); 2317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gNoSubmitIf); 2327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (gFormNotFound); 2337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 2347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 2367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Get prompt string id from the opcode data buffer. 2377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param OpCode The input opcode buffer. 2397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return The prompt string id. 2417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 2437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STRING_ID 2447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetPrompt ( 2457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_IFR_OP_HEADER *OpCode 2467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 2477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 2487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_IFR_STATEMENT_HEADER *Header; 2497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OpCode->Length <= sizeof (EFI_IFR_OP_HEADER)) { 2517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 2527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 2537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Header = (EFI_IFR_STATEMENT_HEADER *) (OpCode + 1); 2557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Header->Prompt; 2577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 2587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 2607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Get the supported width for a particular op-code 2617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2626f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong @param MenuOption The menu option. 263af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param AdjustWidth The width which is saved for the space. 2647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return Returns the number of CHAR16 characters that is support. 2667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 2687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT16 2697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetWidth ( 2706f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong IN UI_MENU_OPTION *MenuOption, 2716f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong OUT UINT16 *AdjustWidth 2727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 2737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 2746f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong CHAR16 *String; 2756f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong UINTN Size; 2766f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong EFI_IFR_TEXT *TestOp; 2776f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong UINT16 ReturnWidth; 2786f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 2796f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 2806f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong Statement = MenuOption->ThisTag; 2817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 282af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 283af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // For modal form, clean the entire row. 284af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 285af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((gFormData->Attribute & HII_DISPLAY_MODAL) != 0) { 286ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong if (AdjustWidth != NULL) { 287ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong *AdjustWidth = LEFT_SKIPPED_COLUMNS; 288ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } 289ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong return (UINT16)(gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * (gModalSkipColumn + LEFT_SKIPPED_COLUMNS)); 290af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 291af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 2927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Size = 0; 2937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // See if the second text parameter is really NULL 2967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) { 2987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TestOp = (EFI_IFR_TEXT *) Statement->OpCode; 2997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (TestOp->TextTwo != 0) { 3007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong String = GetToken (TestOp->TextTwo, gFormData->HiiHandle); 3017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Size = StrLen (String); 3027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (String); 3037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) || 3077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (Statement->OpCode->OpCode == EFI_IFR_REF_OP) || 3087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (Statement->OpCode->OpCode == EFI_IFR_PASSWORD_OP) || 3097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (Statement->OpCode->OpCode == EFI_IFR_ACTION_OP) || 3107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (Statement->OpCode->OpCode == EFI_IFR_RESET_BUTTON_OP) || 3117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Allow a wide display if text op-code and no secondary text op-code 3137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0)) 3157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) { 316af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 317af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 318af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Return the space width. 319af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 320af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (AdjustWidth != NULL) { 321af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong *AdjustWidth = 2; 322af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 323af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 324af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Keep consistent with current behavior. 325af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 3266f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong ReturnWidth = (UINT16) (gPromptBlockWidth + gOptionBlockWidth - 2); 3276f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } else { 3286f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong if (AdjustWidth != NULL) { 3296f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong *AdjustWidth = 1; 3306f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 3316f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 3326f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong ReturnWidth = (UINT16) (gPromptBlockWidth - 1); 3337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3356f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 3366f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // For nest in statement, should the subtitle indent. 3376f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 3386f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong if (MenuOption->NestInStatement) { 3396f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong ReturnWidth -= SUBTITLE_INDENT; 340af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 3416f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 3426f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong return ReturnWidth; 3437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 3447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 3467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Will copy LineWidth amount of a string in the OutputString buffer and return the 3477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong number of CHAR16 characters that were copied into the OutputString buffer. 3487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong The output string format is: 3497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Glyph Info + String info + '\0'. 3507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g. 3527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param InputString String description for this option. 3547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param LineWidth Width of the desired string to extract in CHAR16 3557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong characters 3567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param GlyphWidth The glyph width of the begin of the char in the string. 3577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param Index Where in InputString to start the copy process 3587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param OutputString Buffer to copy the string into 3597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return Returns the number of CHAR16 characters that were copied into the OutputString 3617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong buffer, include extra glyph info and '\0' info. 3627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 3647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT16 3657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetLineByWidth ( 3667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN CHAR16 *InputString, 3677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN UINT16 LineWidth, 3687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN OUT UINT16 *GlyphWidth, 3697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN OUT UINTN *Index, 3707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OUT CHAR16 **OutputString 3717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 3727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 3737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 StrOffset; 3747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 GlyphOffset; 3757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 OriginalGlyphWidth; 3767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN ReturnFlag; 3777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 LastSpaceOffset; 3787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 LastGlyphWidth; 3797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (InputString == NULL || Index == NULL || OutputString == NULL) { 3817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 3827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (LineWidth == 0 || *GlyphWidth == 0) { 3857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 3867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Save original glyph width. 3907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OriginalGlyphWidth = *GlyphWidth; 3927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LastGlyphWidth = OriginalGlyphWidth; 3937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ReturnFlag = FALSE; 3947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LastSpaceOffset = 0; 3957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 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. 3987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // To avoid displaying this empty line in screen, just skip the two CHARs here. 3997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) { 4017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = *Index + 2; 4027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Fast-forward the string and see if there is a carriage-return in the string 4067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (StrOffset = 0, GlyphOffset = 0; GlyphOffset <= LineWidth; StrOffset++) { 4087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (InputString[*Index + StrOffset]) { 4097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case NARROW_CHAR: 4107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *GlyphWidth = 1; 4117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 4127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case WIDE_CHAR: 4147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *GlyphWidth = 2; 4157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 4167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CHAR_CARRIAGE_RETURN: 4187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CHAR_LINEFEED: 4197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CHAR_NULL: 4207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ReturnFlag = TRUE; 4217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 4227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 4247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong GlyphOffset = GlyphOffset + *GlyphWidth; 4257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Record the last space info in this line. Will be used in rewind. 4287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) { 4307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LastSpaceOffset = StrOffset; 4317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LastGlyphWidth = *GlyphWidth; 4327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 4347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (ReturnFlag) { 4377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 4387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Rewind the string from the maximum size until we see a space to break the line 4437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (GlyphOffset > LineWidth) { 4457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Rewind the string to last space char in this line. 4477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (LastSpaceOffset != 0) { 4497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong StrOffset = LastSpaceOffset; 4507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *GlyphWidth = LastGlyphWidth; 4517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 4527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Roll back to last char in the line width. 4547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong StrOffset--; 4567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // The CHAR_NULL has process last time, this time just return 0 to stand for the end. 4617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (StrOffset == 0 && (InputString[*Index + StrOffset] == CHAR_NULL)) { 4637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 4647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Need extra glyph info and '\0' info, so +2. 4687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *OutputString = AllocateZeroPool (((UINTN) (StrOffset + 2) * sizeof(CHAR16))); 4707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (*OutputString == NULL) { 4717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 4727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Save the glyph info at the begin of the string, will used by Print function. 4767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OriginalGlyphWidth == 1) { 4787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *(*OutputString) = NARROW_CHAR; 4797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 4807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *(*OutputString) = WIDE_CHAR; 4817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CopyMem ((*OutputString) + 1, &InputString[*Index], StrOffset * sizeof(CHAR16)); 4847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 4857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (InputString[*Index + StrOffset] == CHAR_SPACE) { 4867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip the space info at the begin of next line. 4887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset + 1); 4907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if (InputString[*Index + StrOffset] == CHAR_LINEFEED) { 4917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip the /n or /n/r info. 4937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (InputString[*Index + StrOffset + 1] == CHAR_CARRIAGE_RETURN) { 4957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset + 2); 4967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 4977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset + 1); 4987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 4997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if (InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN) { 5007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip the /r or /r/n info. 5027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) { 5047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset + 2); 5057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 5067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset + 1); 5077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 5097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *Index = (UINT16) (*Index + StrOffset); 5107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Include extra glyph info and '\0' info, so +2. 5147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return StrOffset + 2; 5167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 5177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 5197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Add one menu option by specified description and context. 5207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param Statement Statement of this Menu Option. 5227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param MenuItemCount The index for this Option in the Menu. 5237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param NestIn Whether this statement is nest in another statement. 5247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 5267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 5277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUiAddMenuOption ( 5287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN FORM_DISPLAY_ENGINE_STATEMENT *Statement, 5297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN UINT16 *MenuItemCount, 5307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN BOOLEAN NestIn 5317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 5327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 5337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *MenuOption; 5347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 5357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Count; 5367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *String; 5377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 NumberOfLines; 5387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 GlyphWidth; 5397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 Width; 5407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN ArrayEntry; 5417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OutputString; 5427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STRING_ID PromptId; 5437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NumberOfLines = 1; 5457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ArrayEntry = 0; 5467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong GlyphWidth = 1; 5477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count = 1; 5487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = NULL; 5497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PromptId = GetPrompt (Statement->OpCode); 5517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (PromptId != 0); 5527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong String = GetToken (PromptId, gFormData->HiiHandle); 5547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (String != NULL); 5557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 5577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count = 3; 5587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < Count; Index++) { 5617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = AllocateZeroPool (sizeof (UI_MENU_OPTION)); 5627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (MenuOption); 5637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Signature = UI_MENU_OPTION_SIGNATURE; 5657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Description = String; 5667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Handle = gFormData->HiiHandle; 5677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->ThisTag = Statement; 5687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->NestInStatement = NestIn; 5697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->EntryNumber = *MenuItemCount; 5707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Sequence = Index; 5727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Statement->Attribute & HII_DISPLAY_GRAYOUT) != 0) { 5747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = TRUE; 5757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 5767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = FALSE; 5777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Statement->Attribute & HII_DISPLAY_LOCK) != 0 || (gFormData->Attribute & HII_DISPLAY_LOCK) != 0) { 5807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = TRUE; 5817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If the form or the question has the lock attribute, deal same as grayout. 5857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 5867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((gFormData->Attribute & HII_DISPLAY_LOCK) != 0 || (Statement->Attribute & HII_DISPLAY_LOCK) != 0) { 5877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = TRUE; 5887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 5897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 5907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (Statement->OpCode->OpCode) { 5917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_ORDERED_LIST_OP: 5927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_ONE_OF_OP: 5937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_NUMERIC_OP: 5947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_TIME_OP: 5957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_DATE_OP: 5967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_CHECKBOX_OP: 5977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_PASSWORD_OP: 5987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_STRING_OP: 5997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // User could change the value of these items 6017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->IsQuestion = TRUE; 6037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 6047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_TEXT_OP: 6057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) { 6067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Initializing GrayOut option as TRUE for Text setup options 6087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // so that those options will be Gray in colour and un selectable. 6097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = TRUE; 6117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 6137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 6147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->IsQuestion = FALSE; 6157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 6167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Statement->Attribute & HII_DISPLAY_READONLY) != 0) { 6197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->ReadOnly = TRUE; 6207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (FeaturePcdGet (PcdBrowerGrayOutReadOnlyMenu)) { 6217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->GrayOut = TRUE; 6227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6256f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong if (Index == 0 && 6266f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong (Statement->OpCode->OpCode != EFI_IFR_DATE_OP) && 6276f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong (Statement->OpCode->OpCode != EFI_IFR_TIME_OP)) { 6286f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong Width = GetWidth (MenuOption, NULL); 6296f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) { 6306f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6316f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // If there is more string to process print on the next row and increment the Skip value 6326f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6336f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong if (StrLen (&String[ArrayEntry]) != 0) { 6346f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong NumberOfLines++; 6356f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 6366f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong FreePool (OutputString); 6376f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 6386f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } else { 6396f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6406f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // Add three MenuOptions for Date/Time 6416f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // Data format : [01/02/2004] [11:22:33] 6426f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // Line number : 0 0 1 0 0 1 6436f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6446f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong NumberOfLines = 0; 6456f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 6466f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 6476f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong if (Index == 2) { 6486f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6496f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // Override LineNumber for the MenuOption in Date/Time sequence 6506f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong // 6516f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong MenuOption->Skip = 1; 6526f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } else { 6536f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong MenuOption->Skip = NumberOfLines; 6546f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 6556f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 6567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong InsertTailList (&gMenuOption, &MenuOption->Link); 6577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (*MenuItemCount)++; 6607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 6617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 6637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Create the menu list base on the form data info. 6647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 6667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 6677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongConvertStatementToMenu ( 6687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong VOID 6697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 6707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 6717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 MenuItemCount; 6727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *Link; 6737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *NestLink; 6747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 6757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *NestStatement; 6767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuItemCount = 0; 6787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong InitializeListHead (&gMenuOption); 6797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = GetFirstNode (&gFormData->StatementListHead); 6817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (!IsNull (&gFormData->StatementListHead, Link)) { 6827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Statement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (Link); 6837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = GetNextNode (&gFormData->StatementListHead, Link); 6847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip the opcode not recognized by Display core. 6877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_GUID_OP) { 6897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong continue; 6907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 6917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiAddMenuOption (Statement, &MenuItemCount, FALSE); 6937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 6947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Check the statement nest in this host statement. 6967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 6977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NestLink = GetFirstNode (&Statement->NestStatementList); 6987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (!IsNull (&Statement->NestStatementList, NestLink)) { 6997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink); 7007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NestLink = GetNextNode (&Statement->NestStatementList, NestLink); 7017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 702077c7aeec07361fc36f8090be46959adb7d38873Eric Dong // 703077c7aeec07361fc36f8090be46959adb7d38873Eric Dong // Skip the opcode not recognized by Display core. 704077c7aeec07361fc36f8090be46959adb7d38873Eric Dong // 705077c7aeec07361fc36f8090be46959adb7d38873Eric Dong if (NestStatement->OpCode->OpCode == EFI_IFR_GUID_OP) { 706077c7aeec07361fc36f8090be46959adb7d38873Eric Dong continue; 707077c7aeec07361fc36f8090be46959adb7d38873Eric Dong } 708077c7aeec07361fc36f8090be46959adb7d38873Eric Dong 7097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UiAddMenuOption (NestStatement, &MenuItemCount, TRUE); 7107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 7117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 7127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 7137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 7157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count the storage space of a Unicode string. 7167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This function handles the Unicode string with NARROW_CHAR 7187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR 7197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong does not count in the resultant output. If a WIDE_CHAR is 7207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong hit, then 2 Unicode character will consume an output storage 7217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong space with size of CHAR16 till a NARROW_CHAR is hit. 7227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong If String is NULL, then ASSERT (). 7247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param String The input string to be counted. 7267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return Storage space for the input string. 7287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 7307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN 7317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetStringWidth ( 7327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN CHAR16 *String 7337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 7347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 7357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 7367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Count; 7377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN IncrementValue; 7387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (String != NULL); 7407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (String == NULL) { 7417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 7427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 7437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index = 0; 7457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count = 0; 7467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IncrementValue = 1; 7477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong do { 7497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Advance to the null-terminator or to the first width directive 7517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (; 7537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0); 7547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index++, Count = Count + IncrementValue 7557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 7567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ; 7577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // We hit the null-terminator, we now have a count 7607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (String[Index] == 0) { 7627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 7637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 7647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed 7667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2) 7677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (String[Index] == NARROW_CHAR) { 7697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip to the next character 7717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index++; 7737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IncrementValue = 1; 7747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 7757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Skip to the next character 7777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index++; 7797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IncrementValue = 2; 7807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 7817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } while (String[Index] != 0); 7827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Increment by one to include the null-terminator in the size 7857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 7867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count++; 7877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Count * sizeof (CHAR16); 7897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 7907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 7927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Base on the input option string to update the skip value for a menu option. 7937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param MenuOption The MenuOption to be checked. 7957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param OptionString The input option string. 7967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 7977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 7987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 7997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUpdateSkipInfoForMenu ( 8007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN UI_MENU_OPTION *MenuOption, 8017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN CHAR16 *OptionString 8027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 8037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 8047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 8057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 Width; 8067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Row; 8077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OutputString; 8087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 GlyphWidth; 8097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Width = (UINT16) gOptionBlockWidth; 8117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong GlyphWidth = 1; 8127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row = 1; 8137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { 8157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (StrLen (&OptionString[Index]) != 0) { 8167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row++; 8177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (OutputString); 8207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Row > MenuOption->Skip) && 8237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_DATE_OP) && 8247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (MenuOption->ThisTag->OpCode->OpCode != EFI_IFR_TIME_OP)) { 8257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Skip = Row; 8267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 8287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 8307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Update display lines for a Menu Option. 8317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param MenuOption The MenuOption to be checked. 8337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 8357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 8367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUpdateOptionSkipLines ( 8377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN UI_MENU_OPTION *MenuOption 8387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 8397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 8407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OptionString; 8417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OptionString = NULL; 8437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ProcessOptions (MenuOption, FALSE, &OptionString, TRUE); 8457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OptionString != NULL) { 8467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpdateSkipInfoForMenu (MenuOption, OptionString); 8477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (OptionString); 8497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo != 0)) { 8527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OptionString = GetToken (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo, gFormData->HiiHandle); 8537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OptionString != NULL) { 8557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpdateSkipInfoForMenu (MenuOption, OptionString); 8567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (OptionString); 8587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 8607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 8617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 8627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 863ab369468265cd29a90b385a6e950eda3da16636dEric Dong Check whether this Menu Option could be print. 864ab369468265cd29a90b385a6e950eda3da16636dEric Dong 865ab369468265cd29a90b385a6e950eda3da16636dEric Dong Check Prompt string, option string or text two string not NULL. 866ab369468265cd29a90b385a6e950eda3da16636dEric Dong 867ab369468265cd29a90b385a6e950eda3da16636dEric Dong This is an internal function. 868ab369468265cd29a90b385a6e950eda3da16636dEric Dong 869ab369468265cd29a90b385a6e950eda3da16636dEric Dong @param MenuOption The MenuOption to be checked. 870ab369468265cd29a90b385a6e950eda3da16636dEric Dong 871ab369468265cd29a90b385a6e950eda3da16636dEric Dong @retval TRUE This Menu Option is printable. 872ab369468265cd29a90b385a6e950eda3da16636dEric Dong @retval FALSE This Menu Option could not be printable. 873ab369468265cd29a90b385a6e950eda3da16636dEric Dong 874ab369468265cd29a90b385a6e950eda3da16636dEric Dong**/ 875ab369468265cd29a90b385a6e950eda3da16636dEric DongBOOLEAN 876ab369468265cd29a90b385a6e950eda3da16636dEric DongPrintableMenu ( 877ab369468265cd29a90b385a6e950eda3da16636dEric Dong UI_MENU_OPTION *MenuOption 878ab369468265cd29a90b385a6e950eda3da16636dEric Dong ) 879ab369468265cd29a90b385a6e950eda3da16636dEric Dong{ 880ab369468265cd29a90b385a6e950eda3da16636dEric Dong EFI_STATUS Status; 881ab369468265cd29a90b385a6e950eda3da16636dEric Dong EFI_STRING OptionString; 882ab369468265cd29a90b385a6e950eda3da16636dEric Dong 883ab369468265cd29a90b385a6e950eda3da16636dEric Dong OptionString = NULL; 884ab369468265cd29a90b385a6e950eda3da16636dEric Dong 885ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (MenuOption->Description[0] != '\0') { 886ab369468265cd29a90b385a6e950eda3da16636dEric Dong return TRUE; 887ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 888ab369468265cd29a90b385a6e950eda3da16636dEric Dong 889ab369468265cd29a90b385a6e950eda3da16636dEric Dong Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE); 890ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (EFI_ERROR (Status)) { 891ab369468265cd29a90b385a6e950eda3da16636dEric Dong return FALSE; 892ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 893ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (OptionString != NULL && OptionString[0] != '\0') { 894ab369468265cd29a90b385a6e950eda3da16636dEric Dong FreePool (OptionString); 895ab369468265cd29a90b385a6e950eda3da16636dEric Dong return TRUE; 896ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 897ab369468265cd29a90b385a6e950eda3da16636dEric Dong 898ab369468265cd29a90b385a6e950eda3da16636dEric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo != 0)) { 899ab369468265cd29a90b385a6e950eda3da16636dEric Dong OptionString = GetToken (((EFI_IFR_TEXT*)MenuOption->ThisTag->OpCode)->TextTwo, gFormData->HiiHandle); 900ab369468265cd29a90b385a6e950eda3da16636dEric Dong ASSERT (OptionString != NULL); 901ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (OptionString[0] != '\0'){ 902ab369468265cd29a90b385a6e950eda3da16636dEric Dong FreePool (OptionString); 903ab369468265cd29a90b385a6e950eda3da16636dEric Dong return TRUE; 904ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 905ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 906ab369468265cd29a90b385a6e950eda3da16636dEric Dong 907ab369468265cd29a90b385a6e950eda3da16636dEric Dong return FALSE; 908ab369468265cd29a90b385a6e950eda3da16636dEric Dong} 909ab369468265cd29a90b385a6e950eda3da16636dEric Dong 910ab369468265cd29a90b385a6e950eda3da16636dEric Dong/** 9117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Check whether this Menu Option could be highlighted. 9127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This is an internal function. 9147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param MenuOption The MenuOption to be checked. 9167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval TRUE This Menu Option is selectable. 9187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval FALSE This Menu Option could not be selected. 9197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 9217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBOOLEAN 9227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongIsSelectable ( 9237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *MenuOption 9247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 9257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 9267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) || 927ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption->GrayOut || MenuOption->ReadOnly || !PrintableMenu (MenuOption)) { 9287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return FALSE; 9297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 9307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return TRUE; 9317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 9327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 9337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 9357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Move to next selectable statement. 9367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This is an internal function. 9387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param GoUp The navigation direction. TRUE: up, FALSE: down. 9407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param CurrentPosition Current position. 9417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param GapToTop Gap position to top or bottom. 942ab369468265cd29a90b385a6e950eda3da16636dEric Dong @param FindInForm Whether find menu in current form or beyond. 9437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return The row distance from current MenuOption to next selectable MenuOption. 9457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval -1 Reach the begin of the menu, still can't find the selectable menu. 947ab369468265cd29a90b385a6e950eda3da16636dEric Dong @retval Value Find the selectable menu, maybe the truly selectable, maybe the 948ab369468265cd29a90b385a6e950eda3da16636dEric Dong first menu showing beyond current form or last menu showing in 949ab369468265cd29a90b385a6e950eda3da16636dEric Dong current form. 950ab369468265cd29a90b385a6e950eda3da16636dEric Dong The value is the line number between the new selected menu and the 951ab369468265cd29a90b385a6e950eda3da16636dEric Dong current select menu, not include the new selected menu. 9527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 9547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongINTN 9557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongMoveToNextStatement ( 9567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN BOOLEAN GoUp, 9577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN OUT LIST_ENTRY **CurrentPosition, 958ab369468265cd29a90b385a6e950eda3da16636dEric Dong IN UINTN GapToTop, 959ab369468265cd29a90b385a6e950eda3da16636dEric Dong IN BOOLEAN FindInForm 9607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 9617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 9627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong INTN Distance; 9637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *Pos; 9647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *NextMenuOption; 9657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *PreMenuOption; 9667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Distance = 0; 9687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Pos = *CurrentPosition; 969ab369468265cd29a90b385a6e950eda3da16636dEric Dong 970ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Pos == &gMenuOption) { 971ab369468265cd29a90b385a6e950eda3da16636dEric Dong return -1; 972ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 973ab369468265cd29a90b385a6e950eda3da16636dEric Dong 9747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PreMenuOption = MENU_OPTION_FROM_LINK (Pos); 9757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 9767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (TRUE) { 9777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NextMenuOption = MENU_OPTION_FROM_LINK (Pos); 9787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 9797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // NextMenuOption->Row == 0 means this menu has not calculate 9807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // the NextMenuOption->Skip value yet, just calculate here. 9817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 9827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (NextMenuOption->Row == 0) { 9837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpdateOptionSkipLines (NextMenuOption); 9847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 9857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 986ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (IsSelectable (NextMenuOption)) { 987ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 9887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 9897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 990ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 991ab369468265cd29a90b385a6e950eda3da16636dEric Dong // In this case, still can't find the selectable menu, 992ab369468265cd29a90b385a6e950eda3da16636dEric Dong // return the first one beyond the showing form. 993ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 994ab369468265cd29a90b385a6e950eda3da16636dEric Dong if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) { 995ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (FindInForm) { 996ab369468265cd29a90b385a6e950eda3da16636dEric Dong NextMenuOption = PreMenuOption; 997ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 9987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 9997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1001ab369468265cd29a90b385a6e950eda3da16636dEric Dong Distance += NextMenuOption->Skip; 1002ab369468265cd29a90b385a6e950eda3da16636dEric Dong 10037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Arrive at begin of the menu list. 10057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) { 10077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Distance = -1; 10087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 10097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Pos = (GoUp ? Pos->BackLink : Pos->ForwardLink); 1012ab369468265cd29a90b385a6e950eda3da16636dEric Dong PreMenuOption = NextMenuOption; 10137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *CurrentPosition = &NextMenuOption->Link; 10167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Distance; 10177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 10187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 10217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Process option string for date/time opcode. 10227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param MenuOption Menu option point to date/time. 10247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param OptionString Option string input for process. 10257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param AddOptCol Whether need to update MenuOption->OptCol. 10267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 10287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 10297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongProcessStringForDateTime ( 10307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *MenuOption, 10317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OptionString, 10327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN AddOptCol 10337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 10347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 10357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 10367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Count; 10377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 10387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_IFR_DATE *Date; 10397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_IFR_TIME *Time; 10407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (MenuOption != NULL && OptionString != NULL); 10427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Statement = MenuOption->ThisTag; 10447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Date = NULL; 10457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Time = NULL; 10467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) { 10477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Date = (EFI_IFR_DATE *) Statement->OpCode; 10487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 10497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Time = (EFI_IFR_TIME *) Statement->OpCode; 10507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If leading spaces on OptionString - remove the spaces 10547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; OptionString[Index] == L' '; Index++) { 10567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Base on the blockspace to get the option column info. 10587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (AddOptCol) { 10607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->OptCol++; 10617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) { 10657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OptionString[Count] = OptionString[Index]; 10667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count++; 10677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OptionString[Count] = CHAR_NULL; 10697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 10707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Enable to suppress field in the opcode base on the flag. 10727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) { 10747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // OptionString format is: <**: **: ****> 10767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // |month|day|year| 10777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4 3 5 10787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Date->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) { 10807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "<**:" in the optionstring. 10827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the day's ** field, after clean, the format is "< :" 10837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[1], 2, L' '); 10857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if ((Date->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) { 10867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "**:" in the optionstring. 10887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the month's "**" field, after clean, the format is " :" 10897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[0], 2, L' '); 10917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if ((Date->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) { 10927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "****>" in the optionstring. 10947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the year's "****" field, after clean, the format is " >" 10957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 10967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[0], 4, L' '); 10977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 10987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 10997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // OptionString format is: <**: **: **> 11017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // |hour|minute|second| 11027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 4 3 3 11037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Time->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) { 11057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "<**:" in the optionstring. 11077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the hour's ** field, after clean, the format is "< :" 11087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[1], 2, L' '); 11107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if ((Time->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) { 11117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "**:" in the optionstring. 11137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the minute's "**" field, after clean, the format is " :" 11147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[0], 2, L' '); 11167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if ((Time->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) { 11177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // At this point, only "**>" in the optionstring. 11197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Clean the second's "**" field, after clean, the format is " >" 11207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SetUnicodeMem (&OptionString[0], 2, L' '); 11227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 11257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 11287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Adjust Data and Time position accordingly. 11297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Data format : [01/02/2004] [11:22:33] 11307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Line number : 0 0 1 0 0 1 11317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This is an internal function. 11337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param DirectionUp the up or down direction. False is down. True is 11357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong up. 11367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param CurrentPosition Current position. On return: Point to the last 11377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Option (Year or Second) if up; Point to the first 11387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Option (Month or Hour) if down. 11397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return Return line number to pad. It is possible that we stand on a zero-advance 11417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return data or time opcode, so pad one line when we judge if we are going to scroll outside. 11427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 11447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINTN 11457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongAdjustDateAndTimePosition ( 11467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN BOOLEAN DirectionUp, 11477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN OUT LIST_ENTRY **CurrentPosition 11487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 11497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 11507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Count; 11517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *NewPosition; 11527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *MenuOption; 11537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN PadLineNumber; 11547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PadLineNumber = 0; 11567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPosition = *CurrentPosition; 11577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = MENU_OPTION_FROM_LINK (NewPosition); 11587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || 11607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) { 11617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Calculate the distance from current position to the last Date/Time MenuOption 11637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count = 0; 11657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (MenuOption->Skip == 0) { 11667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Count++; 11677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPosition = NewPosition->ForwardLink; 11687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = MENU_OPTION_FROM_LINK (NewPosition); 11697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PadLineNumber = 1; 11707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPosition = *CurrentPosition; 11737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (DirectionUp) { 11747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Since the behavior of hitting the up arrow on a Date/Time MenuOption is intended 11767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // to be one that back to the previous set of MenuOptions, we need to advance to the first 11777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Date/Time MenuOption and leave the remaining logic in CfUiUp intact so the appropriate 11787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // checking can be done. 11797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (Count++ < 2) { 11817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPosition = NewPosition->BackLink; 11827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 11847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Since the behavior of hitting the down arrow on a Date/Time MenuOption is intended 11867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // to be one that progresses to the next set of MenuOptions, we need to advance to the last 11877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Date/Time MenuOption and leave the remaining logic in CfUiDown intact so the appropriate 11887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // checking can be done. 11897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 11907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (Count-- > 0) { 11917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPosition = NewPosition->ForwardLink; 11927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *CurrentPosition = NewPosition; 11967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 11977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 11987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return PadLineNumber; 11997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 12007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 12027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Get step info from numeric opcode. 12037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param[in] OpCode The input numeric op code. 12057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return step info for this opcode. 12077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 12087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUINT64 12097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetFieldFromNum ( 12107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_IFR_OP_HEADER *OpCode 12117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 12127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 12137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_IFR_NUMERIC *NumericOp; 12147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT64 Step; 12157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NumericOp = (EFI_IFR_NUMERIC *) OpCode; 12177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (NumericOp->Flags & EFI_IFR_NUMERIC_SIZE) { 12197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_NUMERIC_SIZE_1: 12207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Step = NumericOp->data.u8.Step; 12217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 12227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_NUMERIC_SIZE_2: 12247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Step = NumericOp->data.u16.Step; 12257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 12267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_NUMERIC_SIZE_4: 12287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Step = NumericOp->data.u32.Step; 12297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 12307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_NUMERIC_SIZE_8: 12327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Step = NumericOp->data.u64.Step; 12337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 12347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 12367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Step = 0; 12377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 12387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 12397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Step; 12417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 12427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 12447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Find the registered HotKey based on KeyData. 12457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param[in] KeyData A pointer to a buffer that describes the keystroke 12477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong information for the hot key. 12487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return The registered HotKey context. If no found, NULL will return. 12507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 12517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBROWSER_HOT_KEY * 12527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetHotKeyFromRegisterList ( 12537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_INPUT_KEY *KeyData 12547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 12557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 12567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *Link; 12577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BROWSER_HOT_KEY *HotKey; 12587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = GetFirstNode (&gFormData->HotKeyListHead); 12607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (!IsNull (&gFormData->HotKeyListHead, Link)) { 12617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey = BROWSER_HOT_KEY_FROM_LINK (Link); 12627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HotKey->KeyData->ScanCode == KeyData->ScanCode) { 12647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return HotKey; 12657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 12667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = GetNextNode (&gFormData->HotKeyListHead, Link); 12687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 12697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return NULL; 12717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 12727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 12757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Determine if the menu is the last menu that can be selected. 12767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This is an internal function. 12787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param Direction The scroll direction. False is down. True is up. 12807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param CurrentPos The current focus. 12817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return FALSE -- the menu isn't the last menu that can be selected. 12837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return TRUE -- the menu is the last menu that can be selected. 12847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 12867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBOOLEAN 12877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongValueIsScroll ( 12887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN BOOLEAN Direction, 12897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN LIST_ENTRY *CurrentPos 12907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 12917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 12927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *Temp; 12937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink; 12957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 12967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Temp == &gMenuOption) { 12977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return TRUE; 12987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 12997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return FALSE; 13017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 13027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 13047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Wait for a given event to fire, or for an optional timeout to expire. 13057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param Event The event to wait for 13077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval UI_EVENT_TYPE The type of the event which is trigged. 13097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 13117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUI_EVENT_TYPE 13127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUiWaitForEvent ( 13137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_EVENT Event 13147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 13157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 13167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STATUS Status; 13177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 13187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN EventNum; 13197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT64 Timeout; 13207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_EVENT TimerEvent; 13217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_EVENT WaitList[3]; 13227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_EVENT_TYPE EventType; 13237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TimerEvent = NULL; 13257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Timeout = FormExitTimeout(gFormData); 13267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Timeout != 0) { 13287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent); 13297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 13317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Set the timer event 13327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 13337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gBS->SetTimer ( 13347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TimerEvent, 13357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TimerRelative, 13367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Timeout 13377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 13387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong WaitList[0] = Event; 13417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventNum = 1; 13427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (gFormData->FormRefreshEvent != NULL) { 13437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong WaitList[EventNum] = gFormData->FormRefreshEvent; 13447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventNum ++; 13457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Timeout != 0) { 13487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong WaitList[EventNum] = TimerEvent; 13497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventNum ++; 13507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = gBS->WaitForEvent (EventNum, WaitList, &Index); 13537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT_EFI_ERROR (Status); 13547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (Index) { 13567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 0: 13577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventKey; 13587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 13597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 1: 13617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (gFormData->FormRefreshEvent != NULL) { 13627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventDriver; 13637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 13647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (Timeout != 0 && EventNum == 2); 13657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventTimeOut; 13667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 13687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 13707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (Index == 2 && EventNum == 3); 13717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventTimeOut; 13727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 13737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Timeout != 0) { 13767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gBS->CloseEvent (TimerEvent); 13777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 13787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EventType; 13807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 13817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 13837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Get question id info from the input opcode header. 13847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param OpCode The input opcode header pointer. 13867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval The question id for this opcode. 13887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 13907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_QUESTION_ID 13917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongGetQuestionIdInfo ( 13927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_IFR_OP_HEADER *OpCode 13937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 13947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 13957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_IFR_QUESTION_HEADER *QuestionHeader; 13967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 13977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OpCode->Length < sizeof (EFI_IFR_OP_HEADER) + sizeof (EFI_IFR_QUESTION_HEADER)) { 13987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return 0; 13997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 14007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong QuestionHeader = (EFI_IFR_QUESTION_HEADER *)((UINT8 *) OpCode + sizeof(EFI_IFR_OP_HEADER)); 14027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return QuestionHeader->QuestionId; 14047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 14057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1406ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1407ab369468265cd29a90b385a6e950eda3da16636dEric Dong/** 1408ab369468265cd29a90b385a6e950eda3da16636dEric Dong Find the top of screen menu base on the current menu. 1409ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1410ab369468265cd29a90b385a6e950eda3da16636dEric Dong @param CurPos Current input menu. 1411ab369468265cd29a90b385a6e950eda3da16636dEric Dong @param Rows Totol screen rows. 1412ab369468265cd29a90b385a6e950eda3da16636dEric Dong @param SkipValue SkipValue for this new form. 1413ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1414ab369468265cd29a90b385a6e950eda3da16636dEric Dong @retval TopOfScreen Top of screen menu for the new form. 1415ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1416ab369468265cd29a90b385a6e950eda3da16636dEric Dong**/ 1417ab369468265cd29a90b385a6e950eda3da16636dEric DongLIST_ENTRY * 1418ab369468265cd29a90b385a6e950eda3da16636dEric DongFindTopOfScreenMenu ( 1419ab369468265cd29a90b385a6e950eda3da16636dEric Dong IN LIST_ENTRY *CurPos, 1420ab369468265cd29a90b385a6e950eda3da16636dEric Dong IN UINTN Rows, 1421ab369468265cd29a90b385a6e950eda3da16636dEric Dong OUT UINTN *SkipValue 1422ab369468265cd29a90b385a6e950eda3da16636dEric Dong ) 1423ab369468265cd29a90b385a6e950eda3da16636dEric Dong{ 1424ab369468265cd29a90b385a6e950eda3da16636dEric Dong LIST_ENTRY *Link; 1425ab369468265cd29a90b385a6e950eda3da16636dEric Dong LIST_ENTRY *TopOfScreen; 1426ab369468265cd29a90b385a6e950eda3da16636dEric Dong UI_MENU_OPTION *PreviousMenuOption; 1427ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1428ab369468265cd29a90b385a6e950eda3da16636dEric Dong Link = CurPos; 1429ab369468265cd29a90b385a6e950eda3da16636dEric Dong PreviousMenuOption = NULL; 1430ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1431ab369468265cd29a90b385a6e950eda3da16636dEric Dong while (Link->BackLink != &gMenuOption) { 1432ab369468265cd29a90b385a6e950eda3da16636dEric Dong Link = Link->BackLink; 1433ab369468265cd29a90b385a6e950eda3da16636dEric Dong PreviousMenuOption = MENU_OPTION_FROM_LINK (Link); 1434ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (PreviousMenuOption->Row == 0) { 1435ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateOptionSkipLines (PreviousMenuOption); 1436ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 1437ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Rows <= PreviousMenuOption->Skip) { 1438ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 1439ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 1440ab369468265cd29a90b385a6e950eda3da16636dEric Dong Rows = Rows - PreviousMenuOption->Skip; 1441ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 1442ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1443ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Link->BackLink == &gMenuOption) { 1444ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = gMenuOption.ForwardLink; 1445ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (PreviousMenuOption != NULL && Rows < PreviousMenuOption->Skip) { 1446ab369468265cd29a90b385a6e950eda3da16636dEric Dong *SkipValue = PreviousMenuOption->Skip - Rows; 1447ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 1448ab369468265cd29a90b385a6e950eda3da16636dEric Dong *SkipValue = 0; 1449ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 1450ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 1451ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = Link; 1452ab369468265cd29a90b385a6e950eda3da16636dEric Dong *SkipValue = PreviousMenuOption->Skip - Rows; 1453ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 1454ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1455ab369468265cd29a90b385a6e950eda3da16636dEric Dong return TopOfScreen; 1456ab369468265cd29a90b385a6e950eda3da16636dEric Dong} 1457ab369468265cd29a90b385a6e950eda3da16636dEric Dong 14587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 14597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Find the first menu which will be show at the top. 14607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param FormData The data info for this form. 14627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param TopOfScreen The link_entry pointer to top menu. 14637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param HighlightMenu The menu which will be highlight. 14647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param SkipValue The skip value for the top menu. 14657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 14677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 14687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFindTopMenu ( 14697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN FORM_DISPLAY_ENGINE_FORM *FormData, 14707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OUT LIST_ENTRY **TopOfScreen, 14717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OUT LIST_ENTRY **HighlightMenu, 1472ab369468265cd29a90b385a6e950eda3da16636dEric Dong OUT UINTN *SkipValue 14737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 14747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 14757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *NewPos; 14767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN TopRow; 14777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN BottomRow; 14787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *SavedMenuOption; 1479ab369468265cd29a90b385a6e950eda3da16636dEric Dong UINTN TmpValue; 14807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT; 14827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT; 14837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 14857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If not has input highlight statement, just return the first one in this form. 14867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 14877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (FormData->HighLightedStatement == NULL) { 14887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *TopOfScreen = gMenuOption.ForwardLink; 14897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *HighlightMenu = gMenuOption.ForwardLink; 14907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!IsListEmpty (&gMenuOption)) { 1491ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow, TRUE); 14927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 14937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *SkipValue = 0; 14947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return; 14957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 14967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 14977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 14987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Now base on the input highlight menu to find the top menu in this page. 14997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Will base on the highlight menu show at the bottom to find the top menu. 15007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPos = gMenuOption.ForwardLink; 15027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos); 15037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 15047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while ((SavedMenuOption->ThisTag != FormData->HighLightedStatement) || 15057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (SavedMenuOption->Sequence != gSequence)) { 15067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPos = NewPos->ForwardLink; 15077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (NewPos == &gMenuOption) { 15087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Not Found it, break 15107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 15127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 15137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos); 15147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 15157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (SavedMenuOption->ThisTag == FormData->HighLightedStatement); 15167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 15177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong *HighlightMenu = NewPos; 15187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 15197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition(FALSE, &NewPos); 15207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos); 15217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpdateOptionSkipLines (SavedMenuOption); 15227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 15237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If highlight opcode is date/time, keep the highlight row info not change. 15257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP || SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP) && 15277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (gHighligthMenuInfo.QuestionId != 0) && 15287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode))) { 15297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 15307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Still show the highlight menu before exit from display engine. 15317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 1532ab369468265cd29a90b385a6e950eda3da16636dEric Dong BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip; 15337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 15347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 1535ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (SavedMenuOption->Skip >= BottomRow - TopRow) { 1536ab369468265cd29a90b385a6e950eda3da16636dEric Dong TmpValue = 0; 1537ab369468265cd29a90b385a6e950eda3da16636dEric Dong *TopOfScreen = NewPos; 15387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 1539ab369468265cd29a90b385a6e950eda3da16636dEric Dong *TopOfScreen = FindTopOfScreenMenu(NewPos, BottomRow - TopRow - SavedMenuOption->Skip, &TmpValue); 15407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 1541ab369468265cd29a90b385a6e950eda3da16636dEric Dong 1542ab369468265cd29a90b385a6e950eda3da16636dEric Dong *SkipValue = TmpValue; 15437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 15447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 15457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 1546af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Update highlight menu info. 1547af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1548af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param MenuOption The menu opton which is highlight. 1549af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1550af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong**/ 1551af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongVOID 1552af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongUpdateHighlightMenuInfo ( 1553af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UI_MENU_OPTION *MenuOption 1554af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ) 1555af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong{ 1556af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 1557af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1558af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1559af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // This is the current selected statement 1560af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1561af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Statement = MenuOption->ThisTag; 1562af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1563af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1564af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Get the highlight statement. 1565af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1566af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gUserInput->SelectedStatement = Statement; 1567af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gSequence = (UINT16) MenuOption->Sequence; 1568af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1569af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1570af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Record highlight row info for date/time opcode. 1571af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1572af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 1573af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode); 1574af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row; 1575af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1576af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gHighligthMenuInfo.QuestionId = 0; 1577af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gHighligthMenuInfo.DisplayRow = 0; 1578af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1579af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1580af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong RefreshKeyHelp(gFormData, Statement, FALSE); 1581af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong} 1582af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1583af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong/** 1584af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Update attribut for this menu. 1585af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1586af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param MenuOption The menu opton which this attribut used to. 1587af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Highlight Whether this menu will be highlight. 1588af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1589af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong**/ 1590af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongVOID 1591af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongSetDisplayAttribute ( 1592af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UI_MENU_OPTION *MenuOption, 1593af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN BOOLEAN Highlight 1594af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ) 1595af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong{ 1596af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 1597af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1598af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Statement = MenuOption->ThisTag; 1599af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1600af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Highlight) { 1601af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ()); 1602af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong return; 1603af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1604af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1605af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (MenuOption->GrayOut) { 1606af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ()); 1607af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1608af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) { 1609af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ()); 1610af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1611af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ()); 1612af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1613af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1614af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong} 1615af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1616af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong/** 1617af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Print string for this menu option. 1618af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1619af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param MenuOption The menu opton which this attribut used to. 1620af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Col The column that this string will be print at. 1621af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Row The row that this string will be print at. 1622af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param String The string which need to print. 1623af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Width The width need to print, if string is less than the 1624af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong width, the block space will be used. 1625af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Highlight Whether this menu will be highlight. 1626af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1627af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong**/ 1628af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongVOID 1629af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongDisplayMenuString ( 1630af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UI_MENU_OPTION *MenuOption, 1631af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN Col, 1632af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN Row, 1633af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN CHAR16 *String, 1634af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN Width, 1635af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN BOOLEAN Highlight 1636af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ) 1637af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong{ 1638af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Length; 1639af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1640af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1641af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Print string with normal color. 1642af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1643af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (!Highlight) { 1644af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintStringAtWithWidth (Col, Row, String, Width); 1645af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong return; 1646af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1647af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1648af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1649af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Print the highlight menu string. 1650af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // First print the highlight string. 1651af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1652af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SetDisplayAttribute(MenuOption, TRUE); 1653af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Length = PrintStringAt (Col, Row, String); 1654af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1655af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1656af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Second, clean the empty after the string. 1657af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1658af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SetDisplayAttribute(MenuOption, FALSE); 1659af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintStringAtWithWidth (Col + Length, Row, L"", Width - Length); 1660af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong} 1661af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1662af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong/** 166328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Check whether this menu can has option string. 166428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 166528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong @param MenuOption The menu opton which this attribut used to. 166628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 166728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong @retval TRUE This menu option can have option string. 166828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong @retval FALSE This menu option can't have option string. 166928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 167028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong**/ 167128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric DongBOOLEAN 167228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric DongHasOptionString ( 167328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong IN UI_MENU_OPTION *MenuOption 167428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong ) 167528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong{ 167628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 167728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong CHAR16 *String; 167828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong UINTN Size; 167928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong EFI_IFR_TEXT *TestOp; 168028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 168128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Size = 0; 168228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Statement = MenuOption->ThisTag; 168328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 168428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 168528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // See if the second text parameter is really NULL 168628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 168728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) { 168828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong TestOp = (EFI_IFR_TEXT *) Statement->OpCode; 168928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong if (TestOp->TextTwo != 0) { 169028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong String = GetToken (TestOp->TextTwo, gFormData->HiiHandle); 169128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Size = StrLen (String); 169228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong FreePool (String); 169328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong } 169428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong } 169528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 169628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong if ((Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) || 169728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong (Statement->OpCode->OpCode == EFI_IFR_REF_OP) || 169828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong (Statement->OpCode->OpCode == EFI_IFR_PASSWORD_OP) || 169928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong (Statement->OpCode->OpCode == EFI_IFR_ACTION_OP) || 170028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong (Statement->OpCode->OpCode == EFI_IFR_RESET_BUTTON_OP) || 170128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 170228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // Allow a wide display if text op-code and no secondary text op-code 170328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 170428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0)) 170528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong ) { 170628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 170728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong return FALSE; 170828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong } 170928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 171028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong return TRUE; 171128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong} 171228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 171328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 171428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong/** 1715af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Print string for this menu option. 1716af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1717af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param MenuOption The menu opton which this attribut used to. 1718af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param SkipWidth The skip width between the left to the start of the prompt. 1719af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param BeginCol The begin column for one menu. 1720af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param SkipLine The skip line for this menu. 1721af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param BottomRow The bottom row for this form. 1722af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @param Highlight Whether this menu will be highlight. 1723f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong @param UpdateCol Whether need to update the column info for Date/Time. 1724af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1725af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong @retval EFI_SUCESSS Process the user selection success. 1726af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1727af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong**/ 1728af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongEFI_STATUS 1729af047db78d297ca33dd74e5e749166bb17a4cc4eEric DongDisplayOneMenu ( 1730af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UI_MENU_OPTION *MenuOption, 1731af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN SkipWidth, 1732af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN BeginCol, 1733af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN SkipLine, 1734af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong IN UINTN BottomRow, 1735f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong IN BOOLEAN Highlight, 1736f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong IN BOOLEAN UpdateCol 1737af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ) 1738af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong{ 1739af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 1740af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Index; 1741af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINT16 Width; 1742af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINT16 PromptWidth; 1743af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong CHAR16 *StringPtr; 1744af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong CHAR16 *OptionString; 1745af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong CHAR16 *OutputString; 1746af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINT16 GlyphWidth; 1747af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Temp; 1748af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Temp2; 1749af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Temp3; 1750af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong EFI_STATUS Status; 1751af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Row; 1752af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN Col; 1753af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UINTN PromptLineNum; 175428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong UINTN OptionLineNum; 1755af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong CHAR16 AdjustValue; 175628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong UINTN MaxRow; 1757af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1758af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Statement = MenuOption->ThisTag; 1759af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp = SkipLine; 1760af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp2 = SkipLine; 1761af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp3 = SkipLine; 176228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong AdjustValue = 0; 176328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong PromptLineNum = 0; 176428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong OptionLineNum = 0; 176528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong MaxRow = 0; 1766af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1767af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1768af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Set default color. 1769af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1770af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SetDisplayAttribute (MenuOption, FALSE); 1771af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1772af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1773af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1. Paint the option string. 1774af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1775af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE); 1776af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (EFI_ERROR (Status)) { 1777af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong return Status; 1778af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1779af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1780af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (OptionString != NULL) { 1781af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 1782af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1783af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Adjust option string for date/time opcode. 1784af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1785f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong ProcessStringForDateTime(MenuOption, OptionString, UpdateCol); 1786af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1787af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1788af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Width = (UINT16) gOptionBlockWidth - 1; 178928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Row = MenuOption->Row; 1790af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong GlyphWidth = 1; 179128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong OptionLineNum = 0; 1792af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1793af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { 1794af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (((Temp2 == 0)) && (Row <= BottomRow)) { 1795af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { 1796af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1797af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // For date/time question, it has three menu options for this qustion. 1798af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // The first/second menu options with the skip value is 0. the last one 1799af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // with skip value is 1. 1800af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1801af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (MenuOption->Skip != 0) { 1802af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1803af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // For date/ time, print the last past (year for date and second for time) 1804af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // - 7 means skip [##/##/ for date and [##:##: for time. 1805af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1806af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong DisplayMenuString (MenuOption,MenuOption->OptCol, Row, OutputString, Width + 1 - 7, Highlight); 1807af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1808af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1809af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // For date/ time, print the first and second past (year for date and second for time) 1810f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong // The OutputString has a NARROW_CHAR or WIDE_CHAR at the begin of the string, 1811f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong // so need to - 1 to remove it, otherwise, it will clean 1 extr char follow it. 1812f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, StrLen (OutputString) - 1, Highlight); 1813af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1814af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1815af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight); 1816af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 181728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong OptionLineNum++; 1818af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1819af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1820af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1821af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // If there is more string to process print on the next row and increment the Skip value 1822af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1823af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (StrLen (&OptionString[Index]) != 0) { 1824af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp2 == 0) { 1825af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Row++; 1826af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1827af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Since the Number of lines for this menu entry may or may not be reflected accurately 1828af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // since the prompt might be 1 lines and option might be many, and vice versa, we need to do 1829af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // some testing to ensure we are keeping this in-sync. 1830af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1831af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // If the difference in rows is greater than or equal to the skip value, increase the skip value 1832af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 183328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong if ((Row - MenuOption->Row) >= MenuOption->Skip) { 1834af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong MenuOption->Skip++; 1835af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1836af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1837af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1838af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1839af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FreePool (OutputString); 1840af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp2 != 0) { 1841af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp2--; 1842af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1843af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1844af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1845af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Highlight = FALSE; 1846af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1847af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FreePool (OptionString); 1848af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1849af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1850af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 185128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 2. Paint the description. 1852af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 18536f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong PromptWidth = GetWidth (MenuOption, &AdjustValue); 185428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Row = MenuOption->Row; 1855af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong GlyphWidth = 1; 1856af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PromptLineNum = 0; 1857af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1858af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (MenuOption->Description == NULL || MenuOption->Description[0] == '\0') { 185928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue + SkipWidth); 186028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong PromptLineNum++; 1861af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 1862af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth, &GlyphWidth, &Index, &OutputString) != 0x0000;) { 1863af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((Temp == 0) && (Row <= BottomRow)) { 1864af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1865af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1.Clean the start LEFT_SKIPPED_COLUMNS 1866af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1867af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintStringAtWithWidth (BeginCol, Row, L"", SkipWidth); 1868af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1869af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) { 1870af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1871af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Print Arrow for Goto button. 1872af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1873af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintCharAt ( 1874af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong MenuOption->Col - 2, 1875af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Row, 1876af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong GEOMETRICSHAPE_RIGHT_TRIANGLE 1877af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ); 1878af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1879af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong DisplayMenuString (MenuOption, MenuOption->Col, Row, OutputString, PromptWidth + AdjustValue, Highlight); 1880af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PromptLineNum ++; 1881af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1882af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1883af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // If there is more string to process print on the next row and increment the Skip value 1884af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1885af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (StrLen (&MenuOption->Description[Index]) != 0) { 1886af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp == 0) { 1887af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Row++; 1888af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1889af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1890af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1891af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FreePool (OutputString); 1892af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp != 0) { 1893af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp--; 1894af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1895af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1896af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1897af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Highlight = FALSE; 1898af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1899af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1900af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1901af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 190228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 3. If this is a text op with secondary text information 1903af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1904af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) { 1905af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle); 1906af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1907af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Width = (UINT16) gOptionBlockWidth - 1; 190828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Row = MenuOption->Row; 1909af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong GlyphWidth = 1; 191028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong OptionLineNum = 0; 1911af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1912af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { 1913af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((Temp3 == 0) && (Row <= BottomRow)) { 1914af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight); 191528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong OptionLineNum++; 1916af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1917af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1918af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // If there is more string to process print on the next row and increment the Skip value 1919af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1920af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (StrLen (&StringPtr[Index]) != 0) { 1921af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp3 == 0) { 1922af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Row++; 1923a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong // 1924a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong // If the rows for text two is greater than or equal to the skip value, increase the skip value 1925a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong // 1926a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong if ((Row - MenuOption->Row) >= MenuOption->Skip) { 1927a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong MenuOption->Skip++; 1928a6a2a95632172022229f0c3d20f0b9adb15dc2faEric Dong } 1929af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1930af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1931af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1932af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FreePool (OutputString); 1933af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Temp3 != 0) { 1934af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Temp3--; 1935af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1936af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 193728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 1938af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong FreePool (StringPtr); 1939af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 1940af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 194128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 194228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 4.Line number for Option string and prompt string are not equal. 194328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // Clean the column whose line number is less. 194428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong // 194528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong if (HasOptionString(MenuOption) && (OptionLineNum != PromptLineNum)) { 194628401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Col = OptionLineNum < PromptLineNum ? MenuOption->OptCol : BeginCol; 194728401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Row = (OptionLineNum < PromptLineNum ? OptionLineNum : PromptLineNum) + MenuOption->Row; 194828401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong Width = (UINT16) (OptionLineNum < PromptLineNum ? gOptionBlockWidth : PromptWidth + AdjustValue + SkipWidth); 194928401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong MaxRow = (OptionLineNum < PromptLineNum ? PromptLineNum : OptionLineNum) + MenuOption->Row - 1; 195028401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 195128401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong while (Row <= MaxRow) { 195228401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong DisplayMenuString (MenuOption, Col, Row++, L"", Width, FALSE); 195328401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong } 195428401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong } 195528401a651c65cc3004fbd5a6e9f56fd89c41dbb4Eric Dong 1956af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong return EFI_SUCCESS; 1957af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong} 1958af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 1959af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong/** 19607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Display menu and wait for user to select one menu option, then return it. 19617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong If AutoBoot is enabled, then if user doesn't select any option, 19627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong after period of time, it will automatically return the first menu option. 19637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 19647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param FormData The current form data info. 19657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 19667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_SUCESSS Process the user selection success. 19677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_NOT_FOUND Process option string for orderedlist/Oneof fail. 19687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 19697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 19707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS 19717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUiDisplayMenu ( 19727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN FORM_DISPLAY_ENGINE_FORM *FormData 19737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 19747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 1975ab369468265cd29a90b385a6e950eda3da16636dEric Dong UINTN SkipValue; 19767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong INTN Difference; 19777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN DistanceValue; 19787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Row; 19797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Col; 19807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Temp; 19817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Temp2; 19827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN TopRow; 19837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN BottomRow; 19847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN Index; 19857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 Width; 19867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *StringPtr; 19877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OptionString; 19887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *OutputString; 19897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *HelpString; 19907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *HelpHeaderString; 19917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *HelpBottomString; 19927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN NewLine; 19937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN Repaint; 19947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN UpArrow; 19957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN DownArrow; 19967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STATUS Status; 19977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_INPUT_KEY Key; 19987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *Link; 19997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *NewPos; 20007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *TopOfScreen; 20017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong LIST_ENTRY *SavedListEntry; 20027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *MenuOption; 20037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *NextMenuOption; 20047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *SavedMenuOption; 20057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_MENU_OPTION *PreviousMenuOption; 20067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_CONTROL_FLAG ControlFlag; 20077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_SCREEN_OPERATION ScreenOperation; 20087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 DefaultId; 20097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *Statement; 20107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BROWSER_HOT_KEY *HotKey; 20117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN HelpPageIndex; 20127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN HelpPageCount; 20137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN RowCount; 20147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN HelpLine; 20157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN HelpHeaderLine; 20167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINTN HelpBottomLine; 20177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BOOLEAN MultiHelpPage; 20187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 EachLineWidth; 20197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 HeaderLineWidth; 20207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UINT16 BottomLineWidth; 20217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STRING_ID HelpInfo; 20227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UI_EVENT_TYPE EventType; 20237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FORM_DISPLAY_ENGINE_STATEMENT *InitialHighlight; 2024af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong BOOLEAN SkipHighLight; 20257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventNone; 20277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = EFI_SUCCESS; 20287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpString = NULL; 20297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpHeaderString = NULL; 20307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpBottomString = NULL; 20317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OptionString = NULL; 20327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiNoOperation; 20337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewLine = TRUE; 20347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong DefaultId = 0; 20357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageCount = 0; 20367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpLine = 0; 20377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong RowCount = 0; 20387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpBottomLine = 0; 20397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpHeaderLine = 0; 20407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageIndex = 0; 20417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MultiHelpPage = FALSE; 20427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EachLineWidth = 0; 20437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HeaderLineWidth = 0; 20447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomLineWidth = 0; 20457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OutputString = NULL; 20467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpArrow = FALSE; 20477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong DownArrow = FALSE; 20487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SkipValue = 0; 2049af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SkipHighLight = FALSE; 20507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NextMenuOption = NULL; 20527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PreviousMenuOption = NULL; 20537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedMenuOption = NULL; 20547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey = NULL; 20557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = TRUE; 20567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = NULL; 2057af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gModalSkipColumn = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6; 20587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong InitialHighlight = gFormData->HighLightedStatement; 20597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ZeroMem (&Key, sizeof (EFI_INPUT_KEY)); 20617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2062af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2063af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Left right 2064af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // |<-.->|<-.........->|<- .........->|<-...........->| 2065af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Skip Prompt Option Help 2066af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2067af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Width = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3); 2068af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gOptionBlockWidth = Width + 1; 2069af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gHelpBlockWidth = (CHAR16) (Width - LEFT_SKIPPED_COLUMNS); 2070af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gPromptBlockWidth = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * Width - 1); 20717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT; 20737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT - 1; 20747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row = TopRow; 20767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 2077af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gModalSkipColumn; 20787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 20797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS; 20807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 20817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FindTopMenu(FormData, &TopOfScreen, &NewPos, &SkipValue); 20837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->EnableCursor (gST->ConOut, FALSE); 20857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 20867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfInitialization; 20877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (TRUE) { 20887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (ControlFlag) { 20897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfInitialization: 2090af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((gOldFormEntry.HiiHandle != FormData->HiiHandle) || 2091af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))) { 2092af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2093af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Clear Statement range if different formset is painted. 2094af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2095af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ClearLines ( 2096af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gStatementDimensions.LeftColumn, 2097af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gStatementDimensions.RightColumn, 2098af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong TopRow - SCROLL_ARROW_HEIGHT, 2099af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong BottomRow + SCROLL_ARROW_HEIGHT, 2100af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong GetFieldTextColor () 2101af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ); 21027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 2104af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ControlFlag = CfRepaint; 21057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 21067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfRepaint: 21087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRefreshHighLight; 21097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Repaint) { 21117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Display menu 21137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong DownArrow = FALSE; 21157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong UpArrow = FALSE; 21167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row = TopRow; 21177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2118af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ()); 2119af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 21207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2121af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 1. Check whether need to print the arrow up. 21227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2123af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (!ValueIsScroll (TRUE, TopOfScreen)) { 2124af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UpArrow = TRUE; 2125af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 2126af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 2127ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 2128ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn + gModalSkipColumn, TopRow - 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * gModalSkipColumn); 2129ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } else { 2130ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn, TopRow - 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn); 2131ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } 2132af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (UpArrow) { 2133af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ()); 2134af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintCharAt ( 2135af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1, 21367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TopRow - SCROLL_ARROW_HEIGHT, 2137af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong ARROW_UP 21387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 2139af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ()); 21407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 21417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2.Paint the menu. 21447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) { 21467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = MENU_OPTION_FROM_LINK (Link); 21477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Row = Row; 21487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Col = Col; 21497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 2150af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong MenuOption->OptCol = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth + gModalSkipColumn; 21517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 2152af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong MenuOption->OptCol = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth; 21537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 21547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption->NestInStatement) { 21567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption->Col += SUBTITLE_INDENT; 21577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 21587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2160af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // Save the highlight menu, will be used in CfRefreshHighLight case. 21617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2162af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (Link == NewPos) { 2163af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SavedMenuOption = MenuOption; 2164af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SkipHighLight = TRUE; 21657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 2166ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong 2167ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 216872f2eca287ec08dcc32adbf1bb6756b5b97b6f34Eric Dong Status = DisplayOneMenu (MenuOption, 21696f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong MenuOption->Col - gStatementDimensions.LeftColumn, 2170ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong gStatementDimensions.LeftColumn + gModalSkipColumn, 2171ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong Link == TopOfScreen ? SkipValue : 0, 2172ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong BottomRow, 2173f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong (BOOLEAN) ((Link == NewPos) && IsSelectable(MenuOption)), 2174f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong TRUE 2175ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong ); 2176ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } else { 217772f2eca287ec08dcc32adbf1bb6756b5b97b6f34Eric Dong Status = DisplayOneMenu (MenuOption, 21786f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong MenuOption->Col - gStatementDimensions.LeftColumn, 2179ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong gStatementDimensions.LeftColumn, 2180ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong Link == TopOfScreen ? SkipValue : 0, 2181ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong BottomRow, 2182f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong (BOOLEAN) ((Link == NewPos) && IsSelectable(MenuOption)), 2183f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong TRUE 2184f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong ); 2185ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } 21867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 218772f2eca287ec08dcc32adbf1bb6756b5b97b6f34Eric Dong if (EFI_ERROR (Status)) { 218872f2eca287ec08dcc32adbf1bb6756b5b97b6f34Eric Dong return Status; 218972f2eca287ec08dcc32adbf1bb6756b5b97b6f34Eric Dong } 21907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3. Update the row info which will be used by next menu. 21927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 21937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Link == TopOfScreen) { 21947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row += MenuOption->Skip - SkipValue; 21957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 21967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row += MenuOption->Skip; 21977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 21987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 21997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Row > BottomRow) { 22007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!ValueIsScroll (FALSE, Link)) { 22017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong DownArrow = TRUE; 22027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Row = BottomRow + 1; 22057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 22067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2209af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2210af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 3. Menus in this form may not cover all form, clean the remain field. 2211af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2212af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong while (Row <= BottomRow) { 2213af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 2214ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn + gModalSkipColumn, Row++, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * gModalSkipColumn); 2215af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } else { 2216af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn, Row++, L"", gStatementDimensions.RightColumn - gHelpBlockWidth - gStatementDimensions.LeftColumn); 2217af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 22187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2220af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2221af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 4. Print the down arrow row. 2222af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong // 2223ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 2224ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn + gModalSkipColumn, BottomRow + 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * + gModalSkipColumn); 2225ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } else { 2226ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong PrintStringAtWithWidth(gStatementDimensions.LeftColumn, BottomRow + 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn); 2227ae4f5746efc0dde9bb64b537f3a41e66c8729f4dEric Dong } 22287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (DownArrow) { 22297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ()); 22307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintCharAt ( 22317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1, 22327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomRow + SCROLL_ARROW_HEIGHT, 22337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ARROW_DOWN 22347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 22357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ()); 22367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = NULL; 22397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 22417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfRefreshHighLight: 22437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 22457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // MenuOption: Last menu option that need to remove hilight 22467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // MenuOption is set to NULL in Repaint 22477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // NewPos: Current menu option that need to hilight 22487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 22497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfUpdateHelpString; 22507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2251af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong if (SkipHighLight) { 2252af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong MenuOption = SavedMenuOption; 2253af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong SkipHighLight = FALSE; 2254af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UpdateHighlightMenuInfo (MenuOption); 2255af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong break; 2256af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong } 2257af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong 22588924aecd470f84968369982a69aa30acc7c387dfEric Dong if (IsListEmpty (&gMenuOption)) { 22598924aecd470f84968369982a69aa30acc7c387dfEric Dong // 22608924aecd470f84968369982a69aa30acc7c387dfEric Dong // No menu option, just update the hotkey filed. 22618924aecd470f84968369982a69aa30acc7c387dfEric Dong // 22628924aecd470f84968369982a69aa30acc7c387dfEric Dong RefreshKeyHelp(gFormData, NULL, FALSE); 22638924aecd470f84968369982a69aa30acc7c387dfEric Dong break; 22648924aecd470f84968369982a69aa30acc7c387dfEric Dong } 22658924aecd470f84968369982a69aa30acc7c387dfEric Dong 22667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption != NULL && TopOfScreen == &MenuOption->Link) { 22677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Temp = SkipValue; 22687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 22697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Temp = 0; 22707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (NewPos == TopOfScreen) { 22727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Temp2 = SkipValue; 22737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 22747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Temp2 = 0; 22757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (NewPos != NULL && (MenuOption == NULL || NewPos != &MenuOption->Link)) { 22787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption != NULL) { 22797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2280ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Remove the old highlight menu. 22817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2282ab369468265cd29a90b385a6e950eda3da16636dEric Dong Status = DisplayOneMenu (MenuOption, 2283ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption->Col - gStatementDimensions.LeftColumn, 2284ab369468265cd29a90b385a6e950eda3da16636dEric Dong gStatementDimensions.LeftColumn, 2285ab369468265cd29a90b385a6e950eda3da16636dEric Dong Temp, 2286ab369468265cd29a90b385a6e950eda3da16636dEric Dong BottomRow, 2287f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong FALSE, 2288ab369468265cd29a90b385a6e950eda3da16636dEric Dong FALSE 2289ab369468265cd29a90b385a6e950eda3da16636dEric Dong ); 22907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 22917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 22927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 22937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // This is the current selected statement 22947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 22957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = MENU_OPTION_FROM_LINK (NewPos); 22967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Statement = MenuOption->ThisTag; 22977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2298af047db78d297ca33dd74e5e749166bb17a4cc4eEric Dong UpdateHighlightMenuInfo (MenuOption); 22997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 23007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!IsSelectable (MenuOption)) { 23017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 23027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2304ab369468265cd29a90b385a6e950eda3da16636dEric Dong Status = DisplayOneMenu (MenuOption, 2305ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption->Col - gStatementDimensions.LeftColumn, 2306ab369468265cd29a90b385a6e950eda3da16636dEric Dong gStatementDimensions.LeftColumn, 2307ab369468265cd29a90b385a6e950eda3da16636dEric Dong Temp2, 2308ab369468265cd29a90b385a6e950eda3da16636dEric Dong BottomRow, 2309f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong TRUE, 2310f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong FALSE 2311ab369468265cd29a90b385a6e950eda3da16636dEric Dong ); 23127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 23147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 23157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUpdateHelpString: 23167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfPrepareToReadKey; 23177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { 23187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 23197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2321ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2322ab369468265cd29a90b385a6e950eda3da16636dEric Dong // NewLine means only update highlight menu (remove old highlight and highlith 2323ab369468265cd29a90b385a6e950eda3da16636dEric Dong // the new one), not need to full repain the form. 2324ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 23257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Repaint || NewLine) { 23268924aecd470f84968369982a69aa30acc7c387dfEric Dong if (IsListEmpty (&gMenuOption)) { 23278924aecd470f84968369982a69aa30acc7c387dfEric Dong // 23288924aecd470f84968369982a69aa30acc7c387dfEric Dong // Don't print anything if no mwnu option. 23298924aecd470f84968369982a69aa30acc7c387dfEric Dong // 23307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle); 23317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 23328924aecd470f84968369982a69aa30acc7c387dfEric Dong // 23338924aecd470f84968369982a69aa30acc7c387dfEric Dong // Don't print anything if it is a NULL help token 23348924aecd470f84968369982a69aa30acc7c387dfEric Dong // 23358924aecd470f84968369982a69aa30acc7c387dfEric Dong ASSERT(MenuOption != NULL); 23368924aecd470f84968369982a69aa30acc7c387dfEric Dong HelpInfo = ((EFI_IFR_STATEMENT_HEADER *) ((CHAR8 *)MenuOption->ThisTag->OpCode + sizeof (EFI_IFR_OP_HEADER)))->Help; 23378924aecd470f84968369982a69aa30acc7c387dfEric Dong if (HelpInfo == 0 || !IsSelectable (MenuOption)) { 23388924aecd470f84968369982a69aa30acc7c387dfEric Dong StringPtr = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle); 23398924aecd470f84968369982a69aa30acc7c387dfEric Dong } else { 23408924aecd470f84968369982a69aa30acc7c387dfEric Dong StringPtr = GetToken (HelpInfo, gFormData->HiiHandle); 23418924aecd470f84968369982a69aa30acc7c387dfEric Dong } 23427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 23447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong RowCount = BottomRow - TopRow + 1; 23457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageIndex = 0; 23467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 1.Calculate how many line the help string need to print. 23487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpString != NULL) { 23507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpString); 23517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpString = NULL; 23527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpLine = ProcessHelpString (StringPtr, &HelpString, &EachLineWidth, RowCount); 23547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (StringPtr); 23557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 23567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpLine > RowCount) { 23577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MultiHelpPage = TRUE; 23587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle); 23597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpHeaderString != NULL) { 23607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpHeaderString); 23617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpHeaderString = NULL; 23627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, &HeaderLineWidth, 0); 23647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (StringPtr); 23657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle); 23667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpBottomString != NULL) { 23677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpBottomString); 23687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpBottomString = NULL; 23697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, &BottomLineWidth, 0); 23717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (StringPtr); 23727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Calculate the help page count. 23747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpLine > 2 * RowCount - 2) { 23767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1; 23777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) { 23787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageCount += 1; 23797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 23817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageCount = 2; 23827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 23847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MultiHelpPage = FALSE; 23857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 23877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 23887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Check whether need to show the 'More(U/u)' at the begin. 23907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Base on current direct info, here shows aligned to the right side of the column. 23917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If the direction is multi line and aligned to right side may have problem, so 23927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // add ASSERT code here. 23937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 23947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpPageIndex > 0) { 23957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ()); 23967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < HelpHeaderLine; Index++) { 23977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (HelpHeaderLine == 1); 23987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1)); 23997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow, 24027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gEmptyString, 24037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAt ( 24067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1, 24077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow, 24087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &HelpHeaderString[Index * HeaderLineWidth] 24097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 24137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetAttribute (gST->ConOut, GetHelpTextColor ()); 24147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Print the help string info. 24167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!MultiHelpPage) { 24187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < HelpLine; Index++) { 24197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow, 24227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &HelpString[Index * EachLineWidth], 24237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (; Index < RowCount; Index ++) { 24277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow, 24307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gEmptyString, 24317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow); 24357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 24367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpPageIndex == 0) { 24377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < RowCount - HelpBottomLine; Index++) { 24387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow, 24417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &HelpString[Index * EachLineWidth], 24427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 24467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && 24477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) { 24487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow + HelpHeaderLine, 24517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* EachLineWidth], 24527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpPageIndex == HelpPageCount - 1) { 24567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (; Index < RowCount - HelpHeaderLine; Index ++) { 24577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index + TopRow + HelpHeaderLine, 24607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gEmptyString, 24617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetCursorPosition(gST->ConOut, gStatementDimensions.RightColumn-1, BottomRow); 24657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 24697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Check whether need to print the 'More(D/d)' at the bottom. 24717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Base on current direct info, here shows aligned to the right side of the column. 24727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If the direction is multi line and aligned to right side may have problem, so 24737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // add ASSERT code here. 24747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) { 24767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConOut->SetAttribute (gST->ConOut, GetInfoTextColor ()); 24777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < HelpBottomLine; Index++) { 24787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (HelpBottomLine == 1); 24797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1)); 24807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAtWithWidth ( 24817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - gHelpBlockWidth, 24827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomRow + Index - HelpBottomLine + 1, 24837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gEmptyString, 24847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHelpBlockWidth 24857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong PrintStringAt ( 24877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gStatementDimensions.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1, 24887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BottomRow + Index - HelpBottomLine + 1, 24897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &HelpBottomString[Index * BottomLineWidth] 24907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 24917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 24937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Reset this flag every time we finish using it. 24957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 24967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = FALSE; 24977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewLine = FALSE; 24987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 24997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfPrepareToReadKey: 25017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 25027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiNoOperation; 25037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfReadKey: 25067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfScreenOperation; 25077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Wait for user's selection 25107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while (TRUE) { 25127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); 25137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!EFI_ERROR (Status)) { 25147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UIEventKey; 25157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If we encounter error, continue to read another key in. 25207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Status != EFI_NOT_READY) { 25227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong continue; 25237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EventType = UiWaitForEvent(gST->ConIn->WaitForKey); 25267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EventType == UIEventKey) { 25277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); 25287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EventType == UIEventDriver) { 25337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gUserInput->Action = BROWSER_ACTION_NONE; 25347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 25357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EventType == UIEventTimeOut) { 25397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gUserInput->Action = BROWSER_ACTION_FORM_EXIT; 25407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 25417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (Key.UnicodeChar) { 25457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CHAR_CARRIAGE_RETURN: 25467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if(MenuOption == NULL || MenuOption->GrayOut || MenuOption->ReadOnly) { 25477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 25487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiSelect; 25527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gDirection = 0; 25537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // We will push the adjustment of these numeric values directly to the input handler 25577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // NOTE: we won't handle manual input numeric 25587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case '+': 25607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case '-': 25617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If the screen has no menu items, and the user didn't select UiReset 25637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // ignore the selection and go back to reading keys. 25647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 256505de47ef04864cd9d55228b2065d7397387e54acEric Dong ASSERT(MenuOption != NULL); 25667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if(IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) { 25677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 25687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Statement = MenuOption->ThisTag; 25727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) 25737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) 25747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong || ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) && (GetFieldFromNum(Statement->OpCode) != 0)) 25757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ){ 25767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Key.UnicodeChar == '+') { 25777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gDirection = SCAN_RIGHT; 25787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 25797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gDirection = SCAN_LEFT; 25807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE); 25837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OptionString != NULL) { 25847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (OptionString); 25857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EFI_ERROR (Status)) { 25877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Repaint to clear possible error prompt pop-up 25897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 25907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = TRUE; 25917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewLine = TRUE; 25927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 25937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 25947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 25967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 25977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 25987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case '^': 25997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiUp; 26007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'V': 26037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'v': 26047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiDown; 26057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case ' ': 26087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if(IsListEmpty (&gMenuOption)) { 26097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 26107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(MenuOption != NULL); 26147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) { 26157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiSelect; 26167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'D': 26207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'd': 26217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!MultiHelpPage) { 26227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 26237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfUpdateHelpString; 26267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageIndex = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1; 26277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'U': 26307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case 'u': 26317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!MultiHelpPage) { 26327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 26337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfUpdateHelpString; 26367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HelpPageIndex = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0; 26377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CHAR_NULL: 26407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; Index < mScanCodeNumber; Index++) { 26417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) { 26427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = gScanCodeToOperation[Index].ScreenOperation; 26437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (((FormData->Attribute & HII_DISPLAY_MODAL) != 0) && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) { 26487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // ModalForm has no ESC key and Hot Key. 26507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 26527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else if (Index == mScanCodeNumber) { 26537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Check whether Key matches the registered hot key. 26557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey = NULL; 26577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey = GetHotKeyFromRegisterList (&Key); 26587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HotKey != NULL) { 26597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ScreenOperation = UiHotKey; 26607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfScreenOperation: 26678924aecd470f84968369982a69aa30acc7c387dfEric Dong if ((ScreenOperation != UiReset) && (ScreenOperation != UiHotKey)) { 26687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26698924aecd470f84968369982a69aa30acc7c387dfEric Dong // If the screen has no menu items, and the user didn't select UiReset or UiHotKey 26707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // ignore the selection and go back to reading keys. 26717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 26727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (IsListEmpty (&gMenuOption)) { 26737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfReadKey; 26747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong for (Index = 0; 26797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index < sizeof (gScreenOperationToControlFlag) / sizeof (gScreenOperationToControlFlag[0]); 26807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index++ 26817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) { 26827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (ScreenOperation == gScreenOperationToControlFlag[Index].ScreenOperation) { 26837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = gScreenOperationToControlFlag[Index].ControlFlag; 26847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiSelect: 26907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 26917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(MenuOption != NULL); 26937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Statement = MenuOption->ThisTag; 26947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) { 26957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 26967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 26977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 26987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (Statement->OpCode->OpCode) { 26997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_REF_OP: 27007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_ACTION_OP: 27017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case EFI_IFR_RESET_BUTTON_OP: 27027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 27037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 27067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Editable Questions: oneof, ordered list, checkbox, numeric, string, password 27087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong RefreshKeyHelp (gFormData, Statement, TRUE); 27107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = ProcessOptions (MenuOption, TRUE, &OptionString, TRUE); 27117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (OptionString != NULL) { 27137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (OptionString); 27147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EFI_ERROR (Status)) { 27177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = TRUE; 27187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewLine = TRUE; 27197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong RefreshKeyHelp (gFormData, Statement, FALSE); 27207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 27227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 27237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiReset: 27297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // We come here when someone press ESC 27317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If the policy is not exit front page when user press ESC, process here. 27327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!FormExitPolicy()) { 27347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = TRUE; 27357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewLine = TRUE; 27367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 27377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // When user press ESC, it will try to show another menu, should clean the gSequence info. 27427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (gSequence != 0) { 27447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gSequence = 0; 27457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gUserInput->Action = BROWSER_ACTION_FORM_EXIT; 27487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 27497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiHotKey: 27527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 275305de47ef04864cd9d55228b2065d7397387e54acEric Dong 275405de47ef04864cd9d55228b2065d7397387e54acEric Dong ASSERT (HotKey != NULL); 27557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gUserInput->Action = HotKey->Action; 27567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfExit; 27577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiLeft: 27607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 27617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(MenuOption != NULL); 27627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) { 27637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption->Sequence != 0) { 27647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // In the middle or tail of the Date/Time op-code set, go left. 27667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(NewPos != NULL); 27687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPos = NewPos->BackLink; 27697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiRight: 27747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 27757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(MenuOption != NULL); 27767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP)) { 27777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (MenuOption->Sequence != 2) { 27787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // In the middle or tail of the Date/Time op-code set, go left. 27807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(NewPos != NULL); 27827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPos = NewPos->ForwardLink; 27837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 27857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 27867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiUp: 27887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 2789ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewLine = TRUE; 27907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 27917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedListEntry = NewPos; 27927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT(NewPos != NULL); 2793f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong 2794f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong MenuOption = MENU_OPTION_FROM_LINK (NewPos); 2795f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong ASSERT (MenuOption != NULL); 2796f0c5095b274b2b35867d5245119aa1aba0acc87eEric Dong 27977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 27987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Adjust Date/Time position before we advance forward. 27997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 28017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2802ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = NewPos->BackLink; 2803ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2804ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Find next selectable menu or the first menu beyond current form. 2805ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2806ab369468265cd29a90b385a6e950eda3da16636dEric Dong Difference = MoveToNextStatement (TRUE, &NewPos, MenuOption->Row - TopRow, FALSE); 2807ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Difference < 0) { 2808ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2809ab369468265cd29a90b385a6e950eda3da16636dEric Dong // We hit the begining MenuOption that can be focused 2810ab369468265cd29a90b385a6e950eda3da16636dEric Dong // so we simply scroll to the top. 2811ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2812ab369468265cd29a90b385a6e950eda3da16636dEric Dong Repaint = TRUE; 2813ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (TopOfScreen != gMenuOption.ForwardLink || SkipValue != 0) { 2814ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = gMenuOption.ForwardLink; 2815ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = SavedListEntry; 2816ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue = 0; 2817ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 28187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2819ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Scroll up to the last page when we have arrived at top page. 28207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2821ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = FindTopOfScreenMenu (gMenuOption.BackLink, BottomRow - TopRow, &SkipValue); 2822ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = gMenuOption.BackLink; 2823ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (TRUE, &NewPos, BottomRow - TopRow, TRUE); 2824ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 2825ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 2826ab369468265cd29a90b385a6e950eda3da16636dEric Dong NextMenuOption = MENU_OPTION_FROM_LINK (NewPos); 2827ab369468265cd29a90b385a6e950eda3da16636dEric Dong 2828ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (MenuOption->Row < TopRow + Difference + NextMenuOption->Skip) { 28297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Previous focus MenuOption is above the TopOfScreen, so we need to scroll 28317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TopOfScreen = NewPos; 28337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = TRUE; 2834ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue = 0; 28357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 28367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 28377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2838ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Check whether new highlight menu is selectable, if not, keep highlight on the old one. 28397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2840ab369468265cd29a90b385a6e950eda3da16636dEric Dong // BottomRow - TopRow + 1 means the total rows current forms supported. 2841ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu 2842ab369468265cd29a90b385a6e950eda3da16636dEric Dong // and new top menu. New top menu will all shows in next form, but last highlight menu 2843ab369468265cd29a90b385a6e950eda3da16636dEric Dong // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the 2844ab369468265cd29a90b385a6e950eda3da16636dEric Dong // last highlight menu. 2845ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2846ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (!IsSelectable(NextMenuOption) && IsSelectable(MenuOption) && 2847ab369468265cd29a90b385a6e950eda3da16636dEric Dong (BottomRow - TopRow + 1 >= Difference + NextMenuOption->Skip + 1)) { 2848ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = SavedListEntry; 28496f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 28507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 28517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2852ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateStatusBar (INPUT_ERROR, FALSE); 28537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 28547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2855ab369468265cd29a90b385a6e950eda3da16636dEric Dong // If we encounter a Date/Time op-code set, rewind to the first op-code of the set. 28567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2857ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (TRUE, &TopOfScreen); 2858ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 2859ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 28607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2861ab369468265cd29a90b385a6e950eda3da16636dEric Dong case CfUiPageUp: 28627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2863ab369468265cd29a90b385a6e950eda3da16636dEric Dong // SkipValue means lines is skipped when show the top menu option. 28647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2865ab369468265cd29a90b385a6e950eda3da16636dEric Dong ControlFlag = CfRepaint; 2866ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewLine = TRUE; 2867ab369468265cd29a90b385a6e950eda3da16636dEric Dong Repaint = TRUE; 28687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 28697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = TopOfScreen; 28707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // First minus the menu of the top screen, it's value is SkipValue. 28727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28732e7183ba91b90ac0a257a206080fe84849887cdcEric Dong if (SkipValue >= BottomRow - TopRow + 1) { 28747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2875ab369468265cd29a90b385a6e950eda3da16636dEric Dong // SkipValue > (BottomRow - TopRow + 1) means current menu has more than one 2876ab369468265cd29a90b385a6e950eda3da16636dEric Dong // form of options to be show, so just update the SkipValue to show the next 2877ab369468265cd29a90b385a6e950eda3da16636dEric Dong // parts of options. 28787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2879ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue -= BottomRow - TopRow + 1; 2880ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = TopOfScreen; 2881ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 2882ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 2883ab369468265cd29a90b385a6e950eda3da16636dEric Dong Index = (BottomRow + 1) - SkipValue - TopRow; 28847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 2885ab369468265cd29a90b385a6e950eda3da16636dEric Dong 2886ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = FindTopOfScreenMenu(TopOfScreen, Index, &SkipValue); 2887ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = TopOfScreen; 2888ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow, FALSE); 2889ab369468265cd29a90b385a6e950eda3da16636dEric Dong 2890ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateStatusBar (INPUT_ERROR, FALSE); 28917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 28927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If we encounter a Date/Time op-code set, rewind to the first op-code of the set. 28947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Don't do this when we are already in the first page. 28957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 28967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &TopOfScreen); 28977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 28987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 28997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 29007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiPageDown: 29017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // SkipValue means lines is skipped when show the top menu option. 29037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2904ab369468265cd29a90b385a6e950eda3da16636dEric Dong ControlFlag = CfRepaint; 2905ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewLine = TRUE; 2906ab369468265cd29a90b385a6e950eda3da16636dEric Dong Repaint = TRUE; 29077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 29087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = TopOfScreen; 29097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NextMenuOption = MENU_OPTION_FROM_LINK (Link); 29107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index = TopRow + NextMenuOption->Skip - SkipValue; 29117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Count to the menu option which will show at the top of the next form. 29137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong while ((Index <= BottomRow + 1) && (Link->ForwardLink != &gMenuOption)) { 29157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Link = Link->ForwardLink; 29167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NextMenuOption = MENU_OPTION_FROM_LINK (Link); 29177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Index = Index + NextMenuOption->Skip; 29187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 29197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 29207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if ((Link->ForwardLink == &gMenuOption) && (Index <= BottomRow + 1)) { 29217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2922ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Highlight on the last menu which can be highlight. 29237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Repaint = FALSE; 2925ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (TRUE, &Link, Index - TopRow, TRUE); 29267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 29277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Calculate the skip line for top of screen menu. 29297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (Link == TopOfScreen) { 29317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // The top of screen menu option occupies the entire form. 29337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SkipValue += BottomRow - TopRow + 1; 29357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 29367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SkipValue = NextMenuOption->Skip - (Index - (BottomRow + 1)); 29377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 29387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong TopOfScreen = Link; 29397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong MenuOption = NULL; 29407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Move to the Next selectable menu. 29427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 2943ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (FALSE, &Link, BottomRow - TopRow, TRUE); 29447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 29457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 29467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Save the menu as the next highlight menu. 29487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewPos = Link; 29507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2951ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateStatusBar (INPUT_ERROR, FALSE); 2952ab369468265cd29a90b385a6e950eda3da16636dEric Dong 29537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If we encounter a Date/Time op-code set, rewind to the first op-code of the set. 29557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Don't do this when we are already in the last page. 29567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &TopOfScreen); 29587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 29597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 29607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 29617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiDown: 29627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // SkipValue means lines is skipped when show the top menu option. 29647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // NewPos points to the menu which is highlighted now. 29657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 2967ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewLine = TRUE; 29687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2969ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (NewPos == TopOfScreen) { 2970ab369468265cd29a90b385a6e950eda3da16636dEric Dong Temp2 = SkipValue; 2971ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 2972ab369468265cd29a90b385a6e950eda3da16636dEric Dong Temp2 = 0; 2973ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 2974ab369468265cd29a90b385a6e950eda3da16636dEric Dong 2975ab369468265cd29a90b385a6e950eda3da16636dEric Dong SavedListEntry = NewPos; 29767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Since the behavior of hitting the down arrow on a Date/Time op-code is intended 29787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // to be one that progresses to the next set of op-codes, we need to advance to the last 29797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Date/Time op-code and leave the remaining logic in UiDown intact so the appropriate 29807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // checking can be done. The only other logic we need to introduce is that if a Date/Time 29817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // op-code is the last entry in the menu, we need to rewind back to the first op-code of 29827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // the Date/Time op-code. 29837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 29847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (FALSE, &NewPos); 29857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2986ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption = MENU_OPTION_FROM_LINK (NewPos); 2987ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = NewPos->ForwardLink; 2988ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2989ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Find the next selectable menu. 2990ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 2991ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (MenuOption->Row + MenuOption->Skip - Temp2 > BottomRow + 1) { 2992ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (gMenuOption.ForwardLink == NewPos || &gMenuOption == NewPos) { 2993ab369468265cd29a90b385a6e950eda3da16636dEric Dong Difference = -1; 2994ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 2995ab369468265cd29a90b385a6e950eda3da16636dEric Dong Difference = 0; 2996ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 2997ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 2998ab369468265cd29a90b385a6e950eda3da16636dEric Dong Difference = MoveToNextStatement (FALSE, &NewPos, BottomRow + 1 - (MenuOption->Row + MenuOption->Skip - Temp2), FALSE); 2999ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 3000ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Difference < 0) { 3001ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3002ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Scroll to the first page. 3003ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3004ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (TopOfScreen != gMenuOption.ForwardLink || SkipValue != 0) { 3005ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = gMenuOption.ForwardLink; 3006ab369468265cd29a90b385a6e950eda3da16636dEric Dong Repaint = TRUE; 3007ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption = NULL; 30086f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } else { 3009ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry); 30106f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong } 3011ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = gMenuOption.ForwardLink; 3012ab369468265cd29a90b385a6e950eda3da16636dEric Dong MoveToNextStatement (FALSE, &NewPos, BottomRow - TopRow, TRUE); 30136f05c02325fff475d695edacd0b0b003e5b1fcf3Eric Dong 3014ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue = 0; 3015ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3016ab369468265cd29a90b385a6e950eda3da16636dEric Dong // If we are at the end of the list and sitting on a Date/Time op, rewind to the head. 3017ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3018ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (TRUE, &TopOfScreen); 3019ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 3020ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 3021ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 30227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3023ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3024ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Get next selected menu info. 3025ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3026ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (FALSE, &NewPos); 3027ab369468265cd29a90b385a6e950eda3da16636dEric Dong NextMenuOption = MENU_OPTION_FROM_LINK (NewPos); 3028ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (NextMenuOption->Row == 0) { 3029ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateOptionSkipLines (NextMenuOption); 3030ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 3031ab369468265cd29a90b385a6e950eda3da16636dEric Dong 3032ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3033ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Calculate new highlight menu end row. 3034ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3035ab369468265cd29a90b385a6e950eda3da16636dEric Dong Temp = (MenuOption->Row + MenuOption->Skip - Temp2) + Difference + NextMenuOption->Skip - 1; 3036ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (Temp > BottomRow) { 30377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3038ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Get the top screen menu info. 30397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3040ab369468265cd29a90b385a6e950eda3da16636dEric Dong AdjustDateAndTimePosition (FALSE, &TopOfScreen); 3041ab369468265cd29a90b385a6e950eda3da16636dEric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen); 3042ab369468265cd29a90b385a6e950eda3da16636dEric Dong 3043ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3044ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Current Top screen menu occupy (SavedMenuOption->Skip - SkipValue) rows. 3045ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Full shows the new selected menu need to skip (Temp - BottomRow - 1) rows. 3046ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3047ab369468265cd29a90b385a6e950eda3da16636dEric Dong if ((Temp - BottomRow) >= (SavedMenuOption->Skip - SkipValue)) { 30487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3049ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Skip the top op-code 30507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3051ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = TopOfScreen->ForwardLink; 3052ab369468265cd29a90b385a6e950eda3da16636dEric Dong DistanceValue = (Temp - BottomRow) - (SavedMenuOption->Skip - SkipValue); 30537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3054ab369468265cd29a90b385a6e950eda3da16636dEric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen); 30557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3056ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3057ab369468265cd29a90b385a6e950eda3da16636dEric Dong // If we have a remainder, skip that many more op-codes until we drain the remainder 3058ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Special case is the selected highlight menu has more than one form of menus. 3059ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3060ab369468265cd29a90b385a6e950eda3da16636dEric Dong while (DistanceValue >= SavedMenuOption->Skip && TopOfScreen != NewPos) { 30617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3062ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Since the Difference is greater than or equal to this op-code's skip value, skip it 30637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3064ab369468265cd29a90b385a6e950eda3da16636dEric Dong DistanceValue = DistanceValue - (INTN) SavedMenuOption->Skip; 3065ab369468265cd29a90b385a6e950eda3da16636dEric Dong TopOfScreen = TopOfScreen->ForwardLink; 30667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen); 3067ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 30687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3069ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Since we will act on this op-code in the next routine, and increment the 3070ab369468265cd29a90b385a6e950eda3da16636dEric Dong // SkipValue, set the skips to one less than what is required. 30717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3072ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (TopOfScreen != NewPos) { 3073ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue = DistanceValue; 3074ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else { 3075ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue = 0; 3076ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 30777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 30787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3079ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Since we will act on this op-code in the next routine, and increment the 3080ab369468265cd29a90b385a6e950eda3da16636dEric Dong // SkipValue, set the skips to one less than what is required. 30817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3082ab369468265cd29a90b385a6e950eda3da16636dEric Dong SkipValue += Temp - BottomRow; 30837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 3084ab369468265cd29a90b385a6e950eda3da16636dEric Dong Repaint = TRUE; 3085ab369468265cd29a90b385a6e950eda3da16636dEric Dong } else if (!IsSelectable (NextMenuOption)) { 30867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3087ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Continue to go down until scroll to next page or the selectable option is found. 30887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 3089ab369468265cd29a90b385a6e950eda3da16636dEric Dong ScreenOperation = UiDown; 3090ab369468265cd29a90b385a6e950eda3da16636dEric Dong ControlFlag = CfScreenOperation; 3091ab369468265cd29a90b385a6e950eda3da16636dEric Dong break; 3092ab369468265cd29a90b385a6e950eda3da16636dEric Dong } 3093ab369468265cd29a90b385a6e950eda3da16636dEric Dong 3094ab369468265cd29a90b385a6e950eda3da16636dEric Dong MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry); 3095ab369468265cd29a90b385a6e950eda3da16636dEric Dong 3096ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3097ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Check whether new highlight menu is selectable, if not, keep highlight on the old one. 3098ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3099ab369468265cd29a90b385a6e950eda3da16636dEric Dong // BottomRow - TopRow + 1 means the total rows current forms supported. 3100ab369468265cd29a90b385a6e950eda3da16636dEric Dong // Difference + NextMenuOption->Skip + 1 means the distance between last highlight menu 3101ab369468265cd29a90b385a6e950eda3da16636dEric Dong // and new top menu. New top menu will all shows in next form, but last highlight menu 3102ab369468265cd29a90b385a6e950eda3da16636dEric Dong // may only shows 1 line. + 1 at right part means at least need to keep 1 line for the 3103ab369468265cd29a90b385a6e950eda3da16636dEric Dong // last highlight menu. 3104ab369468265cd29a90b385a6e950eda3da16636dEric Dong // 3105ab369468265cd29a90b385a6e950eda3da16636dEric Dong if (!IsSelectable (NextMenuOption) && IsSelectable (MenuOption) && 3106ab369468265cd29a90b385a6e950eda3da16636dEric Dong (BottomRow - TopRow + 1 >= Difference + NextMenuOption->Skip + 1)) { 3107ab369468265cd29a90b385a6e950eda3da16636dEric Dong NewPos = SavedListEntry; 31087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 3110ab369468265cd29a90b385a6e950eda3da16636dEric Dong UpdateStatusBar (INPUT_ERROR, FALSE); 3111ab369468265cd29a90b385a6e950eda3da16636dEric Dong 31127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 31137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // If we are at the end of the list and sitting on a Date/Time op, rewind to the head. 31147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 31157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &TopOfScreen); 31167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong AdjustDateAndTimePosition (TRUE, &NewPos); 31177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfUiNoOperation: 31207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ControlFlag = CfRepaint; 31217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case CfExit: 31245a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); 31257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpString != NULL) { 31267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpString); 31277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpHeaderString != NULL) { 31297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpHeaderString); 31307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (HelpBottomString != NULL) { 31327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreePool (HelpBottomString); 31337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EFI_SUCCESS; 31357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 31377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 31417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 31437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Base on the browser status info to show an pop up message. 31457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 31477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongVOID 31487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongBrowserStatusProcess ( 31497c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong VOID 31507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 31517c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 31527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CHAR16 *ErrorInfo; 31537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_INPUT_KEY Key; 31547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (gFormData->BrowserStatus == BROWSER_SUCCESS) { 31567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return; 31577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (gFormData->ErrorString != NULL) { 31607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gFormData->ErrorString; 31617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } else { 31627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong switch (gFormData->BrowserStatus) { 31637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case BROWSER_SUBMIT_FAIL: 31647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gSaveFailed; 31657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case BROWSER_NO_SUBMIT_IF: 31687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gNoSubmitIf; 31697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case BROWSER_FORM_NOT_FOUND: 31727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gFormNotFound; 31737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case BROWSER_FORM_SUPPRESS: 31767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gFormSuppress; 31777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong case BROWSER_PROTOCOL_NOT_FOUND: 31807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gProtocolNotFound; 31817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong default: 31847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ErrorInfo = gBrwoserError; 31857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong break; 31867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 31887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 31907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Error occur, prompt error message. 31917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 31927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong do { 31937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL); 31947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN); 31957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 31967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 31977c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 31987c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Display one form, and return user input. 31997c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32007c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param FormData Form Data to be shown. 32017c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param UserInputData User input data. 32027c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32037c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_SUCCESS 1.Form Data is shown, and user input is got. 32047c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 2.Error info has show and return. 32057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_INVALID_PARAMETER The input screen dimension is not valid 32067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_NOT_FOUND New form data has some error. 32077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 32087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS 32097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI 32107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongFormDisplay ( 32117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN FORM_DISPLAY_ENGINE_FORM *FormData, 32127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong OUT USER_INPUT *UserInputData 32137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 32147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 32157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STATUS Status; 32167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (FormData != NULL); 32187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (FormData == NULL) { 32197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EFI_INVALID_PARAMETER; 32207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 32217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gUserInput = UserInputData; 32237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gFormData = FormData; 32247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 32267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Process the status info first. 32277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 32287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong BrowserStatusProcess(); 32297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (UserInputData == NULL) { 32307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 32317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // UserInputData == NULL, means only need to print the error info, return here. 32327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 32337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EFI_SUCCESS; 32347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 32357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ConvertStatementToMenu(); 32377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = DisplayPageFrame (FormData, &gStatementDimensions); 32397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (EFI_ERROR (Status)) { 32407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Status; 32417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 32427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32435a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // 32445a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // Check whether layout is changed. 32455a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // 32465a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong if (mIsFirstForm 32475a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong || (gOldFormEntry.HiiHandle != FormData->HiiHandle) 32485a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid)) 32495a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong || (gOldFormEntry.FormId != FormData->FormId)) { 32507c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong mStatementLayoutIsChanged = TRUE; 32515a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong } else { 32525a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong mStatementLayoutIsChanged = FALSE; 32537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 32547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = UiDisplayMenu(FormData); 32565a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 32575a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // 32585a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // Backup last form info. 32595a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong // 32605a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong mIsFirstForm = FALSE; 32615a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong gOldFormEntry.HiiHandle = FormData->HiiHandle; 32625a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid); 32635a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong gOldFormEntry.FormId = FormData->FormId; 32647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return Status; 32667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 32677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 32687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 32695a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong Clear Screen to the initial state. 32705a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong**/ 32715a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongVOID 32725a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongEFIAPI 32735a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongDriverClearDisplayPage ( 32745a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong VOID 32755a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong ) 32765a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong{ 32775a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong ClearDisplayPage (); 32785a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong mIsFirstForm = TRUE; 32795a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong} 32805a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 32815a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong/** 32825a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong Set Buffer to Value for Size bytes. 32835a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 32845a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong @param Buffer Memory to set. 32855a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong @param Size Number of bytes to set 32865a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong @param Value Value of the set operation. 32875a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 32885a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong**/ 32895a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongVOID 32905a9f73bf065eda6b830445dc907e778f4a13d8d7Eric DongSetUnicodeMem ( 32915a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong IN VOID *Buffer, 32925a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong IN UINTN Size, 32935a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong IN CHAR16 Value 32945a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong ) 32955a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong{ 32965a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong CHAR16 *Ptr; 32975a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 32985a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong Ptr = Buffer; 32995a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong while ((Size--) != 0) { 33005a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong *(Ptr++) = Value; 33015a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong } 33025a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong} 33035a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 33045a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong/** 33057c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Initialize Setup Browser driver. 33067c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33077c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param ImageHandle The image handle. 33087c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param SystemTable The system table. 33097c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33107c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_SUCCESS The Setup Browser module is initialized correctly.. 33117c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @return Other value if failed to initialize the Setup Browser module. 33127c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33137c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 33147c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS 33157c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI 33167c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongInitializeDisplayEngine ( 33177c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_HANDLE ImageHandle, 33187c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_SYSTEM_TABLE *SystemTable 33197c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 33207c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 33217c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STATUS Status; 33227c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_INPUT_KEY HotKey; 33237c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_STRING NewString; 33247c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL *FormBrowserEx2; 33257c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33267c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33277c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Publish our HII data 33287c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33297c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong gHiiHandle = HiiAddPackages ( 33307c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &gDisplayEngineGuid, 33317c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ImageHandle, 33327c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong DisplayEngineStrings, 33337c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NULL 33347c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 33357c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (gHiiHandle != NULL); 33367c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33377c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33387c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Install Form Display protocol 33397c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33407c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = gBS->InstallProtocolInterface ( 33417c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &mPrivateData.Handle, 33427c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &gEdkiiFormDisplayEngineProtocolGuid, 33437c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong EFI_NATIVE_INTERFACE, 33447c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong &mPrivateData.FromDisplayProt 33457c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ); 33467c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT_EFI_ERROR (Status); 33477c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33487c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong InitializeDisplayStrings(); 33495a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong 33505a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong ZeroMem (&gHighligthMenuInfo, sizeof (gHighligthMenuInfo)); 33515a9f73bf065eda6b830445dc907e778f4a13d8d7Eric Dong ZeroMem (&gOldFormEntry, sizeof (gOldFormEntry)); 33527c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33537c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33547c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Use BrowserEx2 protocol to register HotKey. 33557c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33567c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong Status = gBS->LocateProtocol (&gEdkiiFormBrowserEx2ProtocolGuid, NULL, (VOID **) &FormBrowserEx2); 33577c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong if (!EFI_ERROR (Status)) { 33587c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33597c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // Register the default HotKey F9 and F10 again. 33607c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong // 33617c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey.UnicodeChar = CHAR_NULL; 33627c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey.ScanCode = SCAN_F10; 33637c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_TEN_STRING), NULL); 33647c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (NewString != NULL); 33657c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_SUBMIT, 0, NewString); 33667c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33677c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HotKey.ScanCode = SCAN_F9; 33687c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong NewString = HiiGetString (gHiiHandle, STRING_TOKEN (FUNCTION_NINE_STRING), NULL); 33697c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ASSERT (NewString != NULL); 33707c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FormBrowserEx2->RegisterHotKey (&HotKey, BROWSER_ACTION_DEFAULT, EFI_HII_DEFAULT_CLASS_STANDARD, NewString); 33717c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong } 33727c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33737c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EFI_SUCCESS; 33747c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 33757c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33767c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong/** 33777c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong This is the default unload handle for display core drivers. 33787c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33797c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @param[in] ImageHandle The drivers' driver image. 33807c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33817c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval EFI_SUCCESS The image is unloaded. 33827c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong @retval Others Failed to unload the image. 33837c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33847c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong**/ 33857c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFI_STATUS 33867c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongEFIAPI 33877c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric DongUnloadDisplayEngine ( 33887c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong IN EFI_HANDLE ImageHandle 33897c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong ) 33907c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong{ 33917c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong HiiRemovePackages(gHiiHandle); 33927c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33937c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong FreeDisplayStrings (); 33947c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong 33957c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong return EFI_SUCCESS; 33967c6c064ca8ebb5baf5104e8a4764cd3c19ef8bf1Eric Dong} 3397