/** This function updates customized key panel's help information. The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-. and arrange them in Footer panel. @param[in] FormData Form Data to be shown in Page. FormData has the highlighted statement. @param[in] Statement The statement current selected. @param[in] Selected Whether or not a tag be selected. TRUE means Enter has hit this question. **/ VOID EFIAPI RefreshKeyHelp ( IN FORM_DISPLAY_ENGINE_FORM *FormData, IN FORM_DISPLAY_ENGINE_STATEMENT *Statement, IN BOOLEAN Selected ) { UINTN SecCol; UINTN ThdCol; UINTN RightColumnOfHelp; UINTN TopRowOfHelp; UINTN BottomRowOfHelp; UINTN StartColumnOfHelp; EFI_IFR_NUMERIC *NumericOp; EFI_IFR_DATE *DateOp; EFI_IFR_TIME *TimeOp; BOOLEAN HexDisplay; UINTN ColumnWidth1; UINTN ColumnWidth2; UINTN ColumnWidth3; CHAR16 *ColumnStr1; CHAR16 *ColumnStr2; CHAR16 *ColumnStr3; ASSERT (FormData != NULL); if (FormData == NULL) { return; } gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND); if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { return; } SecCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3; ThdCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2; // // + 2 means leave 1 space before the first hotkey info. // StartColumnOfHelp = gScreenDimensions.LeftColumn + 2; RightColumnOfHelp = gScreenDimensions.RightColumn - 1; TopRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1; BottomRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2; ColumnWidth1 = SecCol - StartColumnOfHelp; ColumnWidth2 = ThdCol - SecCol; ColumnWidth3 = RightColumnOfHelp - ThdCol; ColumnStr1 = gLibEmptyString; ColumnStr2 = gLibEmptyString; ColumnStr3 = gLibEmptyString; // // Clean the space at gScreenDimensions.LeftColumn + 1. // PrintStringAtWithWidth (StartColumnOfHelp - 1, BottomRowOfHelp, gLibEmptyString, 1); PrintStringAtWithWidth (StartColumnOfHelp - 1, TopRowOfHelp, gLibEmptyString, 1); if (Statement == NULL) { // // Print Key for Form without showable statement. // PrintHotKeyHelpString (FormData, TRUE); PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2); PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { ColumnStr3 = gEscapeString; } PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3); return; } HexDisplay = FALSE; NumericOp = NULL; DateOp = NULL; TimeOp = NULL; if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) { NumericOp = (EFI_IFR_NUMERIC *) Statement->OpCode; HexDisplay = (NumericOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } else if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) { DateOp = (EFI_IFR_DATE *) Statement->OpCode; HexDisplay = (DateOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { TimeOp = (EFI_IFR_TIME *) Statement->OpCode; HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } switch (Statement->OpCode->OpCode) { case EFI_IFR_ORDERED_LIST_OP: case EFI_IFR_ONE_OF_OP: case EFI_IFR_NUMERIC_OP: case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: if (!Selected) { PrintHotKeyHelpString (FormData, TRUE); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { ColumnStr3 = gEscapeString; } PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3); if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) { PrintAt ( ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%c%c%s", ARROW_UP, ARROW_DOWN, ARROW_RIGHT, ARROW_LEFT, gMoveHighlight ); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2); PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1); } else { PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) { ColumnStr1 = gAdjustNumber; } PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2); } } else { PrintHotKeyHelpString (FormData, FALSE); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2); // // If it is a selected numeric with manual input, display different message // if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) { ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput; PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1); } else { PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); } if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) { ColumnStr1 = gPlusString; ColumnStr3 = gMinusString; } PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1); PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3); PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2); PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3); } break; case EFI_IFR_CHECKBOX_OP: PrintHotKeyHelpString (FormData, TRUE); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { ColumnStr3 = gEscapeString; } PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3); PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2); PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1); break; case EFI_IFR_REF_OP: case EFI_IFR_PASSWORD_OP: case EFI_IFR_STRING_OP: case EFI_IFR_TEXT_OP: case EFI_IFR_ACTION_OP: case EFI_IFR_RESET_BUTTON_OP: case EFI_IFR_SUBTITLE_OP: if (!Selected) { PrintHotKeyHelpString (FormData, TRUE); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { ColumnStr3 = gEscapeString; } PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3); PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) { ColumnStr2 = gEnterString; } PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2); PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1); } else { PrintHotKeyHelpString (FormData, FALSE); if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) { ColumnStr2 = gEnterCommitString; ColumnStr3 = gEnterEscapeString; } PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1); PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1); PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2); PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3); } break; default: break; } }
/** This function updates customized key panel's help information. The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-. and arrange them in Footer panel. @param[in] FormData Form Data to be shown in Page. FormData has the highlighted statement. @param[in] Statement The statement current selected. @param[in] Selected Whether or not a tag be selected. TRUE means Enter has hit this question. **/ VOID EFIAPI RefreshKeyHelp ( IN FORM_DISPLAY_ENGINE_FORM *FormData, IN FORM_DISPLAY_ENGINE_STATEMENT *Statement, IN BOOLEAN Selected ) { UINTN SecCol; UINTN ThdCol; UINTN LeftColumnOfHelp; UINTN RightColumnOfHelp; UINTN TopRowOfHelp; UINTN BottomRowOfHelp; UINTN StartColumnOfHelp; EFI_IFR_NUMERIC *NumericOp; EFI_IFR_DATE *DateOp; EFI_IFR_TIME *TimeOp; BOOLEAN HexDisplay; ASSERT (FormData != NULL); if (FormData == NULL) { return; } gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND); if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) { return; } SecCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3; ThdCol = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2; StartColumnOfHelp = gScreenDimensions.LeftColumn + 2; LeftColumnOfHelp = gScreenDimensions.LeftColumn + 1; RightColumnOfHelp = gScreenDimensions.RightColumn - 2; TopRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1; BottomRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2; ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND); if (Statement == NULL) { // // Print Key for Form without showable statement. // PrintHotKeyHelpString (FormData); PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString); return; } HexDisplay = FALSE; NumericOp = NULL; DateOp = NULL; TimeOp = NULL; if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) { NumericOp = (EFI_IFR_NUMERIC *) Statement->OpCode; HexDisplay = (NumericOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } else if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) { DateOp = (EFI_IFR_DATE *) Statement->OpCode; HexDisplay = (DateOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) { TimeOp = (EFI_IFR_TIME *) Statement->OpCode; HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX; } switch (Statement->OpCode->OpCode) { case EFI_IFR_ORDERED_LIST_OP: case EFI_IFR_ONE_OF_OP: case EFI_IFR_NUMERIC_OP: case EFI_IFR_TIME_OP: case EFI_IFR_DATE_OP: if (!Selected) { PrintHotKeyHelpString (FormData); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString); } if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) { PrintAt ( 0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%c%c%s", ARROW_UP, ARROW_DOWN, ARROW_RIGHT, ARROW_LEFT, gMoveHighlight ); PrintStringAt (SecCol, BottomRowOfHelp, gEnterString); PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber); } else { PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) { PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber); } PrintStringAt (SecCol, BottomRowOfHelp, gEnterString); } } else { PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString); // // If it is a selected numeric with manual input, display different message // if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) || (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) { PrintStringAt ( SecCol, TopRowOfHelp, HexDisplay ? gHexNumericInput : gDecNumericInput ); } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) { PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); } if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) { PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString); PrintStringAt (ThdCol, TopRowOfHelp, gMinusString); } PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString); } break; case EFI_IFR_CHECKBOX_OP: PrintHotKeyHelpString (FormData); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString); } PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox); break; case EFI_IFR_REF_OP: case EFI_IFR_PASSWORD_OP: case EFI_IFR_STRING_OP: case EFI_IFR_TEXT_OP: case EFI_IFR_ACTION_OP: case EFI_IFR_RESET_BUTTON_OP: case EFI_IFR_SUBTITLE_OP: if (!Selected) { PrintHotKeyHelpString (FormData); if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) { PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString); } PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight); if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) { PrintStringAt (SecCol, BottomRowOfHelp, gEnterString); } } else { if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) { PrintStringAt ( (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2, BottomRowOfHelp, gEnterCommitString ); PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString); } } break; default: break; } }