4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncImplementation for handling user input from the User Interfaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Setup.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get string or password input from user.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption Pointer to the current input menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Prompt The prompt string shown on popup window.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StringPtr Old user input and destination for use input string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS If string input is read successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR If operation fails
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReadString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_OPTION *MenuOption,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 *StringPtr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 NullCharacter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ScreenSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 Space[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 KeyPad[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *BufferedString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Start;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Top;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsHeight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CurrentCursor;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN CursorVisible;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsPassword;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsHeight = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NullCharacter = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenSize = GetStringWidth (Prompt) / sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Space[0] = L' ';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Space[1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Minimum = (UINTN) Question->Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = (UINTN) Question->Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_PASSWORD_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsPassword = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsPassword = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = AllocateZeroPool ((Maximum + 1)* sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ScreenSize < (Maximum + 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenSize = Maximum + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ScreenSize + 2) > DimensionsWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ScreenSize = DimensionsWidth - 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferedString = AllocateZeroPool (ScreenSize * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = (DimensionsWidth - ScreenSize - 2) / 2 + gScreenDimensions.LeftColumn + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Top = ((DimensionsHeight - 6) / 2) + gScreenDimensions.TopRow - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display prompt for string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateMultiStringPopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CursorVisible = gST->ConOut->Mode->CursorVisible;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor = GetStringWidth (StringPtr) / 2 - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentCursor != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Show the string which has beed saved before.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + 3, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferedString[Count] = StringPtr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (L'*');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + 3, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Start + GetStringWidth (StringPtr) / 2, Top + 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = WaitForKeyStroke (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_NULL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_LEFT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentCursor > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_RIGHT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_ESC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Simply create a popup to tell the user that they had typed in too few characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // To save code space, we can then treat this as an error and return back to the menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreateDialog (4, TRUE, 0, NULL, &Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_BACKSPACE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr[0] != CHAR_NULL && CurrentCursor != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < CurrentCursor - 1; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = StringPtr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = GetStringWidth (StringPtr) / 2 - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count >= CurrentCursor) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = StringPtr[Index2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Effectively truncate string by 1 character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringPtr, TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor --;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If it is the beginning of the string, don't worry about checking maximum limits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy (StringPtr, &Key.UnicodeChar, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyPad[0] = Key.UnicodeChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync KeyPad[1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = GetStringWidth (StringPtr) / 2 - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentCursor < Count) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < CurrentCursor; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = StringPtr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString[Index] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempString, KeyPad);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempString, StringPtr + CurrentCursor);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringPtr, TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (StringPtr, KeyPad);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentCursor++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the width of the input string is now larger than the screen, we nee to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // adjust the index to start printing portions of the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + 3, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferedString[Count] = StringPtr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (L'*');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsPassword) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 1, Top + 3, BufferedString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Start + CurrentCursor + 1, Top + 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Adjust the value to the correct one. Rules follow the sample:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync like: Year change: 2012.02.29 -> 2013.02.29 -> 2013.02.01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Month change: 2013.03.29 -> 2013.02.29 -> 2013.02.28
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Question Pointer to current question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Sequence The sequence of the field in the question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAdjustQuestionValue (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN FORM_BROWSER_STATEMENT *Question,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Sequence
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Month;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand != EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Month = Question->HiiValue.Value.date.Month;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Year = Question->HiiValue.Value.date.Year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Minimum = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Month) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Year % 4) == 0 && ((Year % 100) != 0 || (Year % 400) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 29;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 28;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 6:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 9:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 11:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 30;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 31;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Change the month area.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->HiiValue.Value.date.Day > Maximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question->HiiValue.Value.date.Day = Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Change the Year area.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->HiiValue.Value.date.Day > Maximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question->HiiValue.Value.date.Day = Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This routine reads a numeric value from the user input.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection Pointer to current selection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption Pointer to the current input menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS If numerical input is read successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR If operation fails
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetNumericInput (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_OPTION *MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Column;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 InputText[MAX_NUMERIC_INPUT_WIDTH];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Loop;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN ManualInput;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN HexInput;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN DateOrTime;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN InputWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN EraseLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Digital;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE *QuestionValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORM *Form;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_FORMSET *FormSet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = MenuOption->OptCol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = MenuOption->Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousNumber[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digital = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormSet = Selection->FormSet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Form = Selection->Form;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue = &Question->HiiValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Step = Question->Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Minimum = Question->Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = Question->Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only two case, user can enter to this function: Enter and +/- case.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualInput = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Question->Operand == EFI_IFR_DATE_OP) || (Question->Operand == EFI_IFR_TIME_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DateOrTime = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DateOrTime = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare Value to be edit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Step = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Minimum = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (MenuOption->Sequence) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 12;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.date.Month;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (QuestionValue->Value.date.Month) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((QuestionValue->Value.date.Year % 4) == 0 &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((QuestionValue->Value.date.Year % 100) != 0 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (QuestionValue->Value.date.Year % 400) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 29;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 28;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 6:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 9:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 11:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 30;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 31;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.date.Day;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 0xffff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.date.Year;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Question->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Step = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Minimum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (MenuOption->Sequence) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 23;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.time.Hour;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 59;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.time.Minute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = 59;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.time.Second;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EraseLen = gOptionBlockWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = QuestionValue->Value.u64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Maximum == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Maximum = (UINT64) -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Question->Operand == EFI_IFR_NUMERIC_OP) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((Question->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexInput = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexInput = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enter from "Enter" input, clear the old word showing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ManualInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_NUMERIC_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HexInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = Question->StorageWidth * 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Question->StorageWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 20;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[0] = LEFT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (InputText + 1, InputWidth, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (Column, Row, InputText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[0] = LEFT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (InputText + 1, InputWidth, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (InputText, InputWidth, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 1] = DATE_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (Column, Row, InputText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputWidth = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[0] = LEFT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (InputText + 1, InputWidth, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetUnicodeMem (InputText, InputWidth, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 1] = TIME_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InputText[InputWidth + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (Column, Row, InputText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First time we enter this handler, we need to check to see if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we were passed an increment or decrement directive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.UnicodeChar = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gDirection != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.ScanCode = gDirection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto TheKey2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = WaitForKeyStroke (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTheKey2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '+':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '-':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == '+') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.ScanCode = SCAN_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.ScanCode = SCAN_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.UnicodeChar = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto TheKey2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_NULL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_LEFT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_RIGHT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DateOrTime && !ManualInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // By setting this value, we will return back to the caller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We need to do this since an auto-refresh will destroy the adjustment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // based on what the real-time-clock is showing. So we always commit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // upon changing the value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = SCAN_DOWN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Step != 0) && !ManualInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.ScanCode == SCAN_LEFT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EditValue >= Minimum + Step) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = EditValue - Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (EditValue > Minimum){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Key.ScanCode == SCAN_RIGHT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EditValue + Step <= Maximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = EditValue + Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (EditValue < Maximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Year
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Month/Day
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (EraseLen >= 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (MenuOption->Sequence == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (EraseLen >= 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Question->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (EraseLen >= 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (MenuOption->Sequence == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (EraseLen >= 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.u64 = EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Loop = 0; Loop < EraseLen; Loop++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuOption->Sequence == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = MenuOption->OptCol + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Column, Row, FormattedNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DateOrTime || MenuOption->Sequence == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (RIGHT_NUMERIC_DELIMITER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto EnterCarriageReturn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_UP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_DOWN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto EnterCarriageReturn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_ESC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEnterCarriageReturn:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate input value with Minimum value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EditValue < Minimum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Store Edit value back to Question
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_DATE_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (MenuOption->Sequence) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.date.Month = (UINT8) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.date.Day = (UINT8) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.date.Year = (UINT16) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Question->Operand == EFI_IFR_TIME_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (MenuOption->Sequence) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.time.Hour = (UINT8) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.time.Minute = (UINT8) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.time.Second = (UINT8) EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QuestionValue->Value.u64 = EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the value to the correct one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Sample like: 2012.02.29 -> 2013.02.29 -> 2013.02.01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2013.03.29 -> 2013.02.29 -> 2013.02.28
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_DATE_OP &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (MenuOption->Sequence == 0 || MenuOption->Sequence == 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AdjustQuestionValue (Question, (UINT8)MenuOption->Sequence);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check to see if the Value is something reasonable against consistency limitations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If not, let's kick the error specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Input value is not valid, restore Question Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetQuestionValue (FormSet, Form, Question, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetQuestionValue (FormSet, Form, Question, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DateOrTime || (Question->Storage != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NV flag is unnecessary for RTC type of Date/Time
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_BACKSPACE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ManualInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove a character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = PreviousNumber[Count - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintAt (Column, Row, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ManualInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HexInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digital = (UINT8) (Key.UnicodeChar - L'0');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar > L'9' || Key.UnicodeChar < L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Count exceed input width, there is no way more is valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count >= InputWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Someone typed something valid!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HexInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = LShiftU64 (EditValue, 4) + Digital;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = MultU64x32 (EditValue, 10) + (Key.UnicodeChar - L'0');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HexInput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Digital;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = Key.UnicodeChar - L'0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EditValue > Maximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Count < sizeof (PreviousNumber) / sizeof (PreviousNumber[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EditValue = PreviousNumber[Count];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Count < (sizeof (PreviousNumber) / sizeof (PreviousNumber[0])));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PreviousNumber[Count] = EditValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Column, Row, Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get selection for OneOf and OrderedList (Left/Right will be ignored).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Selection Pointer to current selection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MenuOption Pointer to the current input menu.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS If Option input is processed successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR If operation fails
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetSelectionInputPopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_SELECTION *Selection,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UI_MENU_OPTION *MenuOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TopOptionIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HighlightOptionIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Start;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN End;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Top;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Bottom;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PopUpMenuLines;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MenuLinesInView;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PopUpWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 Character;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INT32 SavedAttribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN ShowDownArrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN ShowUpArrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DimensionsWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN OrderedList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *ValueArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE HiiValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_VALUE *HiiValueArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OptionCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QUESTION_OPTION *OneOfOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QUESTION_OPTION *CurrentOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORM_BROWSER_STATEMENT *Question;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueArray = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueType = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOption = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowUpArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = AllocateZeroPool ((gOptionBlockWidth + 1) * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Question = MenuOption->ThisTag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Question->Operand == EFI_IFR_ORDERED_LIST_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueArray = Question->BufferValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueType = Question->ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrderedList = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrderedList = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate Option count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Question->MaxContainers; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetArrayData (ValueArray, ValueType, Index) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionCount = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Question->OptionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Question->OptionListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare HiiValue array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiValueArray != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Question->OptionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < OptionCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValueArray[Index].Type = ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&HiiValueArray[Index], &OneOfOption->Value, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move Suppressed Option to list tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpMenuLines = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < OptionCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OneOfOption == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&OneOfOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OneOfOption->SuppressExpression != NULL) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This option is suppressed, insert to tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&Question->OptionListHead, &OneOfOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert to head
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpMenuLines++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the number of one of options present and its size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpWidth = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Question->OptionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < PopUpMenuLines; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (StringPtr) > PopUpWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpWidth = StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!OrderedList && (CompareHiiValue (&Question->HiiValue, &OneOfOption->Value, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find current selected Option for OneOf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Perform popup menu initialization.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpWidth = PopUpWidth + POPUP_PAD_SPACE_COUNT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SavedAttribute = gST->ConOut->Mode->Attribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((PopUpWidth + POPUP_FRAME_WIDTH) > DimensionsWidth) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PopUpWidth = DimensionsWidth - POPUP_FRAME_WIDTH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = (DimensionsWidth - PopUpWidth - POPUP_FRAME_WIDTH) / 2 + gScreenDimensions.LeftColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync End = Start + PopUpWidth + POPUP_FRAME_WIDTH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Top = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bottom = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuLinesInView = Bottom - Top - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MenuLinesInView >= PopUpMenuLines) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Top = Top + (MenuLinesInView - PopUpMenuLines) / 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bottom = Top + PopUpMenuLines + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HighlightOptionIndex > (MenuLinesInView - 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex = HighlightOptionIndex - MenuLinesInView + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clear that portion of the screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ClearLines (Start, End, Top, Bottom, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw "One of" pop-up menu
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_DOWN_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Top, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Start; Index + 2 < End; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ShowUpArrow) && ((Index + 1) == (Start + End) / 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = GEOMETRICSHAPE_UP_TRIANGLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_HORIZONTAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_DOWN_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_VERTICAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Top + 1; Index < Bottom; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Index, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (End - 1, Index, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move to top Option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Question->OptionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < TopOptionIndex; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Display the One of options
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index2 = Top + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = TopOptionIndex; (Index < PopUpMenuLines) && (Index2 < Bottom); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StringPtr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the string occupies multiple lines, truncate it to fit in one line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // and append a "..." for indication.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen (StringPtr) > (PopUpWidth - 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStringPtr = AllocateZeroPool (sizeof (CHAR16) * (PopUpWidth - 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ( TempStringPtr != NULL );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempStringPtr, StringPtr, (sizeof (CHAR16) * (PopUpWidth - 5)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = TempStringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (StringPtr, L"...");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == HighlightOptionIndex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight the selected one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOption = OneOfOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, PICKLIST_HIGHLIGHT_TEXT | PICKLIST_HIGHLIGHT_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 2, Index2, StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintStringAt (Start + 2, Index2, StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_UP_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCharAt (Start, Bottom, Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = Start; Index + 2 < End; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ShowDownArrow) && ((Index + 1) == (Start + End) / 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = GEOMETRICSHAPE_DOWN_TRIANGLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_HORIZONTAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Character = BOXDRAW_UP_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintChar (Character);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get User selection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.UnicodeChar = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((gDirection == SCAN_UP) || (gDirection == SCAN_DOWN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Key.ScanCode = gDirection;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDirection = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto TheKey;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = WaitForKeyStroke (&Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTheKey:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '+':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight reaches the top of the popup window, scroll one menu item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOptionIndex == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowUpArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HighlightOptionIndex > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (CurrentOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SwapListEntries (CurrentOption->Link.BackLink, &CurrentOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '-':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If an ordered list op-code, we will allow for a popup of +/- keys
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to create an ordered list of items
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight reaches the bottom of the popup window, scroll one menu item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowUpArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HighlightOptionIndex < (PopUpMenuLines - 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (CurrentOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SwapListEntries (&CurrentOption->Link, CurrentOption->Link.ForwardLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_NULL:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_UP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_DOWN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.ScanCode == SCAN_UP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight reaches the top of the popup window, scroll one menu item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TopOptionIndex == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowUpArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HighlightOptionIndex > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Highlight reaches the bottom of the popup window, scroll one menu item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TopOptionIndex++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowUpArrow = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShowDownArrow = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HighlightOptionIndex < (PopUpMenuLines - 1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HighlightOptionIndex++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_ESC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore link list order for orderedlist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValue.Type = ValueType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValue.Value.u64 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Question->MaxContainers; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiValue.Value.u64 == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = ValueToOption (Question, &HiiValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OneOfOption == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&OneOfOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&Question->OptionListHead, &OneOfOption->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiValueArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return the current selection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderedList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetFirstNode (&Question->OptionListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsNull (&Question->OptionListHead, Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneOfOption = QUESTION_OPTION_FROM_LINK (Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetArrayData (ValueArray, ValueType, Index, OneOfOption->Value.Value.u64);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index > Question->MaxContainers) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = GetNextNode (&Question->OptionListHead, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (CurrentOption != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Question->HiiValue, &CurrentOption->Value, sizeof (EFI_HII_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiValueArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ValidateQuestion (Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Input value is not valid, restore Question Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Wait for a key to be pressed by user.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Key The key which is pressed by user.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The function always completed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWaitForKeyStroke (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_INPUT_KEY *Key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (EFI_ERROR(Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}