EFI_IFR_DATE *DateOp;\r
EFI_IFR_TIME *TimeOp;\r
BOOLEAN HexDisplay;\r
+ UINTN ColumnWidth1;\r
+ UINTN ColumnWidth2;\r
+ UINTN ColumnWidth3;\r
+ CHAR16 *ColumnStr1;\r
+ CHAR16 *ColumnStr2;\r
+ CHAR16 *ColumnStr3;\r
\r
ASSERT (FormData != NULL);\r
if (FormData == NULL) {\r
\r
StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
LeftColumnOfHelp = gScreenDimensions.LeftColumn + 1;\r
- RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\r
+ RightColumnOfHelp = gScreenDimensions.RightColumn - 1;\r
TopRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
BottomRowOfHelp = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
\r
- ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
+ ColumnWidth1 = SecCol - StartColumnOfHelp;\r
+ ColumnWidth2 = ThdCol - SecCol;\r
+ ColumnWidth3 = RightColumnOfHelp - ThdCol;\r
+ ColumnStr1 = gLibEmptyString;\r
+ ColumnStr2 = gLibEmptyString;\r
+ ColumnStr3 = gLibEmptyString;\r
+\r
if (Statement == NULL) {\r
//\r
// Print Key for Form without showable statement.\r
//\r
- PrintHotKeyHelpString (FormData);\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+ PrintHotKeyHelpString (FormData, TRUE);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEscapeString, ColumnWidth3);\r
+\r
return;\r
}\r
\r
case EFI_IFR_TIME_OP:\r
case EFI_IFR_DATE_OP:\r
if (!Selected) {\r
- PrintHotKeyHelpString (FormData);\r
+ PrintHotKeyHelpString (FormData, TRUE);\r
\r
if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+ ColumnStr3 = gEscapeString;\r
}\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
\r
if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
(Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
PrintAt (\r
- 0, \r
+ ColumnWidth1, \r
StartColumnOfHelp,\r
BottomRowOfHelp,\r
L"%c%c%c%c%s",\r
ARROW_LEFT,\r
gMoveHighlight\r
);\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1);\r
} else {\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+ PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
- } \r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+ ColumnStr1 = gAdjustNumber;\r
+ }\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
}\r
} else {\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
+ PrintHotKeyHelpString (FormData, FALSE);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2);\r
\r
//\r
// If it is a selected numeric with manual input, display different message\r
if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || \r
(Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
(Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
- PrintStringAt (\r
- SecCol,\r
- TopRowOfHelp,\r
- HexDisplay ? gHexNumericInput : gDecNumericInput\r
- );\r
- } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) {\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+ ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput;\r
+ PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+ } else {\r
+ PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
}\r
\r
if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
+ ColumnStr1 = gPlusString;\r
+ ColumnStr3 = gMinusString;\r
}\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+ PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3);\r
+ PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2);\r
\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3);\r
}\r
break;\r
\r
case EFI_IFR_CHECKBOX_OP:\r
- PrintHotKeyHelpString (FormData);\r
+ PrintHotKeyHelpString (FormData, TRUE);\r
\r
if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+ ColumnStr3 = gEscapeString;\r
}\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
- PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
+ PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
break;\r
\r
case EFI_IFR_REF_OP:\r
case EFI_IFR_RESET_BUTTON_OP:\r
case EFI_IFR_SUBTITLE_OP:\r
if (!Selected) {\r
- PrintHotKeyHelpString (FormData);\r
+ PrintHotKeyHelpString (FormData, TRUE);\r
\r
if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+ ColumnStr3 = gEscapeString;\r
}\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
\r
- PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+ PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {\r
- PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+ ColumnStr2 = gEnterString;\r
}\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
} else {\r
- if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
- PrintStringAt (\r
- (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2,\r
- BottomRowOfHelp,\r
- gEnterCommitString\r
- );\r
- PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+ PrintHotKeyHelpString (FormData, FALSE);\r
+ if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
+ ColumnStr2 = gEnterCommitString;\r
+ ColumnStr3 = gEnterEscapeString;\r
}\r
+ PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+ PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1);\r
+ PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+ PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
}\r
break;\r
\r
CHAR16 *Buffer;\r
UINTN Row;\r
CHAR16 *TitleStr;\r
+ UINTN TitleColumn;\r
\r
if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
//\r
//\r
// Print Form Title\r
//\r
- ClearLines (\r
- gScreenDimensions.LeftColumn + 1,\r
- gScreenDimensions.RightColumn - 1,\r
- gScreenDimensions.TopRow + 1,\r
- gScreenDimensions.TopRow + 1,\r
- TITLE_TEXT | TITLE_BACKGROUND\r
- );\r
-\r
TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
ASSERT (TitleStr != NULL);\r
- PrintStringAt (\r
- (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
+ TitleColumn = (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2;\r
+ PrintStringAtWithWidth (gScreenDimensions.LeftColumn + 1, gScreenDimensions.TopRow + 1, gLibEmptyString, TitleColumn - gScreenDimensions.LeftColumn - 1);\r
+ PrintStringAtWithWidth (\r
+ TitleColumn,\r
gScreenDimensions.TopRow + 1,\r
- TitleStr\r
+ TitleStr,\r
+ gScreenDimensions.RightColumn - 1 - TitleColumn\r
);\r
FreePool (TitleStr);\r
\r
Show all registered HotKey help strings on bottom Rows.\r
\r
@param FormData The curent input form data info.\r
+ @param SetState Set HotKey or Clear HotKey\r
\r
**/\r
VOID\r
PrintHotKeyHelpString (\r
- IN FORM_DISPLAY_ENGINE_FORM *FormData\r
+ IN FORM_DISPLAY_ENGINE_FORM *FormData,\r
+ IN BOOLEAN SetState\r
)\r
{\r
UINTN CurrentCol;\r
UINTN CurrentRow;\r
UINTN BottomRowOfHotKeyHelp;\r
+ UINTN ColumnIndexWidth;\r
UINTN ColumnWidth;\r
+ UINTN ColumnIndex;\r
UINTN Index;\r
EFI_SCREEN_DESCRIPTOR LocalScreen;\r
LIST_ENTRY *Link;\r
BROWSER_HOT_KEY *HotKey;\r
-\r
- if (IsListEmpty (&FormData->HotKeyListHead)) {\r
- return;\r
- }\r
+ CHAR16 BakChar;\r
+ CHAR16 *ColumnStr;\r
\r
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
ColumnWidth = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
BottomRowOfHotKeyHelp = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 3;\r
+ ColumnStr = gLibEmptyString;\r
\r
//\r
// Calculate total number of Register HotKeys. \r
while (!IsNull (&FormData->HotKeyListHead, Link)) {\r
HotKey = BROWSER_HOT_KEY_FROM_LINK (Link);\r
//\r
- // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
- //\r
- if (StrLen (HotKey->HelpString) > ColumnWidth) {\r
- HotKey->HelpString[ColumnWidth] = L'\0';\r
- }\r
- //\r
// Calculate help information Column and Row.\r
//\r
- if ((Index % 3) != 2) {\r
- CurrentCol = LocalScreen.LeftColumn + (2 - Index % 3) * ColumnWidth;\r
+ ColumnIndex = Index % 3;\r
+ if (ColumnIndex == 0) {\r
+ CurrentCol = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+ ColumnIndexWidth = ColumnWidth - 1;\r
+ } else if (ColumnIndex == 1) {\r
+ CurrentCol = LocalScreen.LeftColumn + ColumnWidth;\r
+ ColumnIndexWidth = ColumnWidth;\r
} else {\r
- CurrentCol = LocalScreen.LeftColumn + 2;\r
+ CurrentCol = LocalScreen.LeftColumn + 2;\r
+ ColumnIndexWidth = ColumnWidth - 2;\r
}\r
CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
+\r
+ //\r
+ // Help string can't exceed ColumnWidth. One Row will show three Help information. \r
+ //\r
+ BakChar = L'\0';\r
+ if (StrLen (HotKey->HelpString) > ColumnIndexWidth) {\r
+ BakChar = HotKey->HelpString[ColumnIndexWidth];\r
+ HotKey->HelpString[ColumnIndexWidth] = L'\0';\r
+ }\r
+\r
//\r
// Print HotKey help string on bottom Row.\r
//\r
- PrintStringAt (CurrentCol, CurrentRow, HotKey->HelpString);\r
+ if (SetState) {\r
+ ColumnStr = HotKey->HelpString;\r
+ }\r
+ PrintStringAtWithWidth (CurrentCol, CurrentRow, ColumnStr, ColumnIndexWidth);\r
\r
+ if (BakChar != L'\0') {\r
+ HotKey->HelpString[ColumnIndexWidth] = BakChar;\r
+ }\r
//\r
// Get Next Hot Key.\r
//\r
Index ++;\r
}\r
\r
+ if (SetState) {\r
+ //\r
+ // Clear KeyHelp\r
+ //\r
+ CurrentRow = BottomRowOfHotKeyHelp - Index / 3;\r
+ ColumnIndex = Index % 3;\r
+ if (ColumnIndex == 0) {\r
+ CurrentCol = LocalScreen.LeftColumn + 2 * ColumnWidth;\r
+ ColumnIndexWidth = ColumnWidth - 1;\r
+ ColumnIndex ++;\r
+ PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+ }\r
+ if (ColumnIndex == 1) {\r
+ CurrentCol = LocalScreen.LeftColumn + ColumnWidth;\r
+ ColumnIndexWidth = ColumnWidth;\r
+ PrintStringAtWithWidth (CurrentCol, CurrentRow, gLibEmptyString, ColumnIndexWidth);\r
+ }\r
+ }\r
+ \r
return;\r
}\r
\r
UINTN Index;\r
UINTN PreviousIndex;\r
UINTN Count;\r
+ UINTN TotalCount;\r
UINTN PrintWidth;\r
UINTN CharWidth;\r
\r
Index = 0;\r
PreviousIndex = 0;\r
Count = 0;\r
+ TotalCount = 0;\r
PrintWidth = 0;\r
CharWidth = 1;\r
\r
if (Buffer[Index] == 0) {\r
break;\r
}\r
- //\r
- // Null-terminate the temporary string\r
- //\r
- BackupBuffer[Index] = 0;\r
\r
//\r
// Print this out, we are about to switch widths\r
//\r
Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
- Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+ Count = StrLen (&BackupBuffer[PreviousIndex]);\r
PrintWidth += Count * CharWidth;\r
+ TotalCount += Count;\r
\r
//\r
// Preserve the current index + 1, since this is where we will start printing from next\r
// We hit the end of the string - print it\r
//\r
Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
- Count += StrLen (&BackupBuffer[PreviousIndex]);\r
+ Count = StrLen (&BackupBuffer[PreviousIndex]);\r
PrintWidth += Count * CharWidth;\r
+ TotalCount += Count;\r
if (PrintWidth < Width) {\r
Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
Out->SetAttribute (Out, Out->Mode->Attribute);\r
\r
FreePool (Buffer);\r
FreePool (BackupBuffer);\r
- return Count;\r
+ return TotalCount;\r
}\r
\r
/**\r
CHAR16 *gFormSuppress;\r
CHAR16 *gProtocolNotFound;\r
\r
+CHAR16 gModalSkipColumn;\r
CHAR16 gPromptBlockWidth;\r
CHAR16 gOptionBlockWidth;\r
CHAR16 gHelpBlockWidth;\r
Get the supported width for a particular op-code\r
\r
@param Statement The curent statement.\r
+ @param AdjustWidth The width which is saved for the space.\r
\r
@return Returns the number of CHAR16 characters that is support.\r
\r
**/\r
UINT16\r
GetWidth (\r
- IN FORM_DISPLAY_ENGINE_STATEMENT *Statement\r
+ IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
+ OUT UINT16 *AdjustWidth\r
)\r
{\r
CHAR16 *String;\r
UINTN Size;\r
- UINT16 Width;\r
EFI_IFR_TEXT *TestOp;\r
\r
+ //\r
+ // For modal form, clean the entire row.\r
+ //\r
+ if ((gFormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
+ return (UINT16)(gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - gModalSkipColumn - SCROLL_ARROW_HEIGHT);\r
+ }\r
+\r
Size = 0;\r
\r
//\r
//\r
((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0))\r
) {\r
- Width = (UINT16) (gPromptBlockWidth + gOptionBlockWidth);\r
- } else {\r
- Width = (UINT16) gPromptBlockWidth;\r
+ \r
+ //\r
+ // Return the space width.\r
+ // \r
+ if (AdjustWidth != NULL) {\r
+ *AdjustWidth = 2;\r
+ }\r
+ //\r
+ // Keep consistent with current behavior.\r
+ //\r
+ return (UINT16) (gPromptBlockWidth + gOptionBlockWidth - 2);\r
}\r
\r
- return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
+ if (AdjustWidth != NULL) {\r
+ *AdjustWidth = 1;\r
+ }\r
+ return (UINT16) (gPromptBlockWidth - 1);\r
}\r
\r
/**\r
String = GetToken (PromptId, gFormData->HiiHandle);\r
ASSERT (String != NULL);\r
\r
- Width = GetWidth (Statement);\r
+ Width = GetWidth (Statement, NULL);\r
for (; GetLineByWidth (String, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
}\r
}\r
\r
+/**\r
+ Update highlight menu info.\r
+\r
+ @param MenuOption The menu opton which is highlight.\r
+\r
+**/\r
+VOID\r
+UpdateHighlightMenuInfo (\r
+ IN UI_MENU_OPTION *MenuOption\r
+ )\r
+{\r
+ FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+\r
+ //\r
+ // This is the current selected statement\r
+ //\r
+ Statement = MenuOption->ThisTag;\r
+\r
+ //\r
+ // Get the highlight statement.\r
+ //\r
+ gUserInput->SelectedStatement = Statement;\r
+ gSequence = (UINT16) MenuOption->Sequence;\r
+\r
+ //\r
+ // Record highlight row info for date/time opcode.\r
+ //\r
+ if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+ gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
+ gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
+ } else {\r
+ gHighligthMenuInfo.QuestionId = 0;\r
+ gHighligthMenuInfo.DisplayRow = 0;\r
+ }\r
+\r
+ RefreshKeyHelp(gFormData, Statement, FALSE);\r
+}\r
+\r
+/**\r
+ Update attribut for this menu.\r
+\r
+ @param MenuOption The menu opton which this attribut used to.\r
+ @param Highlight Whether this menu will be highlight.\r
+\r
+**/\r
+VOID\r
+SetDisplayAttribute (\r
+ IN UI_MENU_OPTION *MenuOption,\r
+ IN BOOLEAN Highlight\r
+ )\r
+{\r
+ FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+ \r
+ Statement = MenuOption->ThisTag;\r
+\r
+ if (Highlight) {\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetHighlightTextColor ());\r
+ return;\r
+ }\r
+\r
+ if (MenuOption->GrayOut) {\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
+ } else {\r
+ if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
+ } else {\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Print string for this menu option.\r
+\r
+ @param MenuOption The menu opton which this attribut used to.\r
+ @param Col The column that this string will be print at.\r
+ @param Row The row that this string will be print at.\r
+ @param String The string which need to print.\r
+ @param Width The width need to print, if string is less than the\r
+ width, the block space will be used.\r
+ @param Highlight Whether this menu will be highlight.\r
+\r
+**/\r
+VOID\r
+DisplayMenuString (\r
+ IN UI_MENU_OPTION *MenuOption,\r
+ IN UINTN Col,\r
+ IN UINTN Row,\r
+ IN CHAR16 *String,\r
+ IN UINTN Width,\r
+ IN BOOLEAN Highlight\r
+ )\r
+{\r
+ UINTN Length;\r
+\r
+ //\r
+ // Print string with normal color.\r
+ //\r
+ if (!Highlight) {\r
+ PrintStringAtWithWidth (Col, Row, String, Width);\r
+ return;\r
+ }\r
+ \r
+ //\r
+ // Print the highlight menu string.\r
+ // First print the highlight string.\r
+ // \r
+ SetDisplayAttribute(MenuOption, TRUE);\r
+ Length = PrintStringAt (Col, Row, String);\r
+\r
+ //\r
+ // Second, clean the empty after the string.\r
+ //\r
+ SetDisplayAttribute(MenuOption, FALSE);\r
+ PrintStringAtWithWidth (Col + Length, Row, L"", Width - Length);\r
+}\r
+\r
+/**\r
+ Print string for this menu option.\r
+\r
+ @param MenuOption The menu opton which this attribut used to.\r
+ @param SkipWidth The skip width between the left to the start of the prompt.\r
+ @param BeginCol The begin column for one menu.\r
+ @param SkipLine The skip line for this menu. \r
+ @param BottomRow The bottom row for this form.\r
+ @param Highlight Whether this menu will be highlight.\r
+\r
+ @retval EFI_SUCESSS Process the user selection success.\r
+\r
+**/\r
+EFI_STATUS\r
+DisplayOneMenu (\r
+ IN UI_MENU_OPTION *MenuOption,\r
+ IN UINTN SkipWidth,\r
+ IN UINTN BeginCol,\r
+ IN UINTN SkipLine,\r
+ IN UINTN BottomRow,\r
+ IN BOOLEAN Highlight\r
+ )\r
+{\r
+ FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+ UINTN Index;\r
+ UINT16 Width;\r
+ UINT16 PromptWidth;\r
+ CHAR16 *StringPtr;\r
+ CHAR16 *OptionString;\r
+ CHAR16 *OutputString;\r
+ UINTN OriginalRow;\r
+ UINT16 GlyphWidth;\r
+ UINTN Temp;\r
+ UINTN Temp2;\r
+ UINTN Temp3;\r
+ EFI_STATUS Status;\r
+ UINTN Row;\r
+ UINTN Col;\r
+ UINTN PromptLineNum;\r
+ CHAR16 AdjustValue;\r
+\r
+ Statement = MenuOption->ThisTag;\r
+ Col = MenuOption->Col;\r
+ Row = MenuOption->Row;\r
+ Temp = SkipLine;\r
+ Temp2 = SkipLine;\r
+ Temp3 = SkipLine;\r
+ AdjustValue = 0;\r
+\r
+ //\r
+ // Set default color.\r
+ //\r
+ SetDisplayAttribute (MenuOption, FALSE);\r
+\r
+ //\r
+ // 1. Paint the option string.\r
+ //\r
+ Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (OptionString != NULL) {\r
+ if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+ //\r
+ // Adjust option string for date/time opcode.\r
+ //\r
+ ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
+ }\r
+ \r
+ Width = (UINT16) gOptionBlockWidth - 1;\r
+ OriginalRow = Row;\r
+ GlyphWidth = 1;\r
+ \r
+ for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
+ if (((Temp2 == 0)) && (Row <= BottomRow)) {\r
+ if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
+ //\r
+ // For date/time question, it has three menu options for this qustion.\r
+ // The first/second menu options with the skip value is 0. the last one\r
+ // with skip value is 1.\r
+ //\r
+ if (MenuOption->Skip != 0) {\r
+ //\r
+ // For date/ time, print the last past (year for date and second for time)\r
+ // - 7 means skip [##/##/ for date and [##:##: for time.\r
+ //\r
+ DisplayMenuString (MenuOption,MenuOption->OptCol, Row, OutputString, Width + 1 - 7, Highlight);\r
+ } else {\r
+ //\r
+ // For date/ time, print the first and second past (year for date and second for time)\r
+ // \r
+ DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, StrLen (OutputString), Highlight);\r
+ }\r
+ } else {\r
+ DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight);\r
+ }\r
+ }\r
+ \r
+ //\r
+ // If there is more string to process print on the next row and increment the Skip value\r
+ //\r
+ if (StrLen (&OptionString[Index]) != 0) {\r
+ if (Temp2 == 0) {\r
+ Row++;\r
+ //\r
+ // Since the Number of lines for this menu entry may or may not be reflected accurately\r
+ // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
+ // some testing to ensure we are keeping this in-sync.\r
+ //\r
+ // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
+ //\r
+ if ((Row - OriginalRow) >= MenuOption->Skip) {\r
+ MenuOption->Skip++;\r
+ }\r
+ }\r
+ }\r
+ \r
+ FreePool (OutputString);\r
+ if (Temp2 != 0) {\r
+ Temp2--;\r
+ }\r
+ }\r
+ \r
+ Row = OriginalRow;\r
+ Highlight = FALSE;\r
+\r
+ FreePool (OptionString);\r
+ }\r
+ Temp2 = 0;\r
+\r
+\r
+ //\r
+ // 2. Pre calculate the skip value.\r
+ //\r
+ if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
+ StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
+ \r
+ Width = (UINT16) gOptionBlockWidth - 1;\r
+ OriginalRow = Row;\r
+ GlyphWidth = 1;\r
+ for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { \r
+ if (StrLen (&StringPtr[Index]) != 0) {\r
+ Row++;\r
+ if ((Row - OriginalRow) >= MenuOption->Skip) {\r
+ MenuOption->Skip++;\r
+ }\r
+ }\r
+ FreePool (OutputString);\r
+ }\r
+ \r
+ Row = OriginalRow;\r
+ FreePool (StringPtr);\r
+ }\r
+\r
+\r
+ //\r
+ // 3. Paint the description.\r
+ //\r
+ PromptWidth = GetWidth (Statement, &AdjustValue);\r
+ OriginalRow = Row;\r
+ GlyphWidth = 1;\r
+ PromptLineNum = 0;\r
+\r
+ if (MenuOption->Description == NULL || MenuOption->Description[0] == '\0') {\r
+ while (Temp++ < MenuOption->Skip) {\r
+ PrintStringAtWithWidth (BeginCol, Row++, L"", PromptWidth + AdjustValue + SkipWidth);\r
+ } \r
+ } else {\r
+ for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth, &GlyphWidth, &Index, &OutputString) != 0x0000;) { \r
+ if ((Temp == 0) && (Row <= BottomRow)) { \r
+ //\r
+ // 1.Clean the start LEFT_SKIPPED_COLUMNS \r
+ //\r
+ PrintStringAtWithWidth (BeginCol, Row, L"", SkipWidth);\r
+ \r
+ if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
+ //\r
+ // Print Arrow for Goto button.\r
+ //\r
+ PrintCharAt (\r
+ MenuOption->Col - 2,\r
+ Row,\r
+ GEOMETRICSHAPE_RIGHT_TRIANGLE\r
+ );\r
+ }\r
+ DisplayMenuString (MenuOption, MenuOption->Col, Row, OutputString, PromptWidth + AdjustValue, Highlight);\r
+ PromptLineNum ++;\r
+ }\r
+ //\r
+ // If there is more string to process print on the next row and increment the Skip value\r
+ //\r
+ if (StrLen (&MenuOption->Description[Index]) != 0) {\r
+ if (Temp == 0) {\r
+ Row++;\r
+ }\r
+ }\r
+\r
+ FreePool (OutputString);\r
+ if (Temp != 0) {\r
+ Temp--;\r
+ }\r
+ }\r
+\r
+ Highlight = FALSE;\r
+\r
+ //\r
+ // Clean the empty prompt line.\r
+ // These line is used by option string but not prompt, so clean them here.\r
+ //\r
+ Row = OriginalRow + PromptLineNum;\r
+ while (PromptLineNum + SkipLine < MenuOption->Skip && Row <= BottomRow) {\r
+ PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue + SkipWidth);\r
+ PromptLineNum ++;\r
+ Row ++;\r
+ }\r
+ }\r
+ Row = OriginalRow;\r
+\r
+\r
+ //\r
+ // 4. If this is a text op with secondary text information\r
+ //\r
+ if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
+ StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
+ \r
+ Width = (UINT16) gOptionBlockWidth - 1;\r
+ OriginalRow = Row;\r
+ GlyphWidth = 1;\r
+\r
+ for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) { \r
+ if ((Temp3 == 0) && (Row <= BottomRow)) {\r
+ DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString, Width + 1, Highlight);\r
+ }\r
+ //\r
+ // If there is more string to process print on the next row and increment the Skip value\r
+ //\r
+ if (StrLen (&StringPtr[Index]) != 0) {\r
+ if (Temp3 == 0) {\r
+ Row++;\r
+ }\r
+ }\r
+ \r
+ FreePool (OutputString);\r
+ if (Temp3 != 0) {\r
+ Temp3--;\r
+ }\r
+ }\r
+ \r
+ Row = OriginalRow;\r
+ FreePool (StringPtr);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Display menu and wait for user to select one menu option, then return it.\r
If AutoBoot is enabled, then if user doesn't select any option,\r
UINTN DistanceValue;\r
UINTN Row;\r
UINTN Col;\r
- UINTN TempRightCol;\r
UINTN Temp;\r
UINTN Temp2;\r
- UINTN Temp3;\r
UINTN TopRow;\r
UINTN BottomRow;\r
UINTN OriginalRow;\r
UI_SCREEN_OPERATION ScreenOperation;\r
UINT16 DefaultId;\r
FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
- UINTN ModalSkipColumn;\r
BROWSER_HOT_KEY *HotKey;\r
UINTN HelpPageIndex;\r
UINTN HelpPageCount;\r
EFI_STRING_ID HelpInfo;\r
UI_EVENT_TYPE EventType;\r
FORM_DISPLAY_ENGINE_STATEMENT *InitialHighlight;\r
+ BOOLEAN SkipHighLight;\r
\r
EventType = UIEventNone;\r
Status = EFI_SUCCESS;\r
UpArrow = FALSE;\r
DownArrow = FALSE;\r
SkipValue = 0;\r
+ SkipHighLight = FALSE;\r
\r
NextMenuOption = NULL;\r
PreviousMenuOption = NULL;\r
HotKey = NULL;\r
Repaint = TRUE;\r
MenuOption = NULL;\r
- ModalSkipColumn = (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
+ gModalSkipColumn = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
InitialHighlight = gFormData->HighLightedStatement;\r
\r
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
\r
- gOptionBlockWidth = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
- gPromptBlockWidth = (CHAR16) (gOptionBlockWidth + LEFT_SKIPPED_COLUMNS);\r
- gHelpBlockWidth = (CHAR16) (gOptionBlockWidth - LEFT_SKIPPED_COLUMNS);\r
+ //\r
+ // Left right\r
+ // |<-.->|<-.........->|<- .........->|<-...........->|\r
+ // Skip Prompt Option Help \r
+ //\r
+ Width = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
+ gOptionBlockWidth = Width + 1; \r
+ gHelpBlockWidth = (CHAR16) (Width - LEFT_SKIPPED_COLUMNS);\r
+ gPromptBlockWidth = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * Width - 1);\r
\r
TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;\r
BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT - 1;\r
\r
Row = TopRow;\r
if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;\r
+ Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gModalSkipColumn;\r
} else {\r
Col = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS;\r
}\r
while (TRUE) {\r
switch (ControlFlag) {\r
case CfInitialization:\r
- if (IsListEmpty (&gMenuOption)) {\r
- \r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) == 0) {\r
- //\r
- // Clear Statement range.\r
- //\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
- );\r
- \r
- //\r
- // Clear Key Range\r
- //\r
- RefreshKeyHelp (gFormData, NULL, FALSE);\r
- }\r
+ if ((gOldFormEntry.HiiHandle != FormData->HiiHandle) || \r
+ (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))) {\r
+ //\r
+ // Clear Statement range if different formset is painted.\r
+ //\r
+ ClearLines (\r
+ gStatementDimensions.LeftColumn,\r
+ gStatementDimensions.RightColumn,\r
+ TopRow - SCROLL_ARROW_HEIGHT,\r
+ BottomRow + SCROLL_ARROW_HEIGHT,\r
+ GetFieldTextColor ()\r
+ );\r
\r
- ControlFlag = CfReadKey;\r
- } else {\r
- ControlFlag = CfRepaint;\r
}\r
+ ControlFlag = CfRepaint;\r
break;\r
\r
case CfRepaint:\r
UpArrow = FALSE;\r
Row = TopRow;\r
\r
- Temp = (UINTN) SkipValue;\r
- Temp2 = (UINTN) SkipValue;\r
- Temp3 = (UINTN) SkipValue;\r
-\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+ \r
//\r
- // 1. Clear the screen.\r
+ // 1. Check whether need to print the arrow up.\r
//\r
- if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- ClearLines (\r
- gStatementDimensions.LeftColumn + ModalSkipColumn,\r
- gStatementDimensions.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
- );\r
- } else {\r
- TempRightCol = gStatementDimensions.RightColumn;\r
- if (!mStatementLayoutIsChanged) {\r
- TempRightCol = gStatementDimensions.RightColumn - gHelpBlockWidth;\r
- }\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
+ if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
+ UpArrow = TRUE;\r
+ }\r
+ \r
+ PrintStringAtWithWidth(gStatementDimensions.LeftColumn, TopRow - 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+\r
+ if (UpArrow) {\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
+ PrintCharAt (\r
+ gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
TopRow - SCROLL_ARROW_HEIGHT,\r
- TopRow - 1,\r
- GetFieldTextColor ()\r
- );\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- TempRightCol,\r
- TopRow,\r
- BottomRow,\r
- GetFieldTextColor ()\r
- );\r
- ClearLines (\r
- gStatementDimensions.LeftColumn,\r
- gStatementDimensions.RightColumn,\r
- BottomRow + 1,\r
- BottomRow + SCROLL_ARROW_HEIGHT,\r
- GetFieldTextColor ()\r
+ ARROW_UP\r
);\r
+ gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
}\r
\r
//\r
MenuOption->Row = Row;\r
MenuOption->Col = Col;\r
if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
- MenuOption->OptCol = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn + ModalSkipColumn;\r
+ MenuOption->OptCol = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth + gModalSkipColumn;\r
} else {\r
- MenuOption->OptCol = gPromptBlockWidth + 1 + gStatementDimensions.LeftColumn;\r
+ MenuOption->OptCol = gStatementDimensions.LeftColumn + LEFT_SKIPPED_COLUMNS + gPromptBlockWidth;\r
}\r
\r
- Statement = MenuOption->ThisTag;\r
if (MenuOption->NestInStatement) {\r
MenuOption->Col += SUBTITLE_INDENT;\r
}\r
\r
- if (MenuOption->GrayOut) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetGrayedTextColor ());\r
- } else {\r
- if (Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetSubTitleTextColor ());\r
- }\r
- }\r
-\r
- Width = GetWidth (Statement);\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- if (Statement->OpCode->OpCode == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
- //\r
- // Print Arrow for Goto button.\r
- //\r
- PrintCharAt (\r
- MenuOption->Col - 2,\r
- Row,\r
- GEOMETRICSHAPE_RIGHT_TRIANGLE\r
- );\r
- }\r
-\r
- //\r
- // 2.1. Paint the description.\r
- //\r
- for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- //\r
- // Temp means need to skip how many lines from the start.\r
- //\r
- if ((Temp == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->Col, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&MenuOption->Description[Index]) != 0) {\r
- if (Temp == 0) {\r
- Row++;\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp != 0) {\r
- Temp--;\r
- }\r
- }\r
-\r
- Temp = 0;\r
- Row = OriginalRow;\r
-\r
- //\r
- // 2.2. Paint the option string.\r
- //\r
- Status = ProcessOptions (MenuOption, FALSE, &OptionString, FALSE);\r
- //\r
- // If Error occur, question value update in ProcessOptions.\r
- // Exit current FormDisplay with new question value.\r
- //\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (OptionString != NULL) {\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
- }\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp2 == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&OptionString[Index]) != 0) {\r
- if (Temp2 == 0) {\r
- Row++;\r
- //\r
- // Since the Number of lines for this menu entry may or may not be reflected accurately\r
- // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
- // some testing to ensure we are keeping this in-sync.\r
- //\r
- // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
- //\r
- if ((Row - OriginalRow) >= MenuOption->Skip) {\r
- MenuOption->Skip++;\r
- }\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp2 != 0) {\r
- Temp2--;\r
- }\r
- }\r
-\r
- Row = OriginalRow;\r
-\r
- FreePool (OptionString);\r
- }\r
- Temp2 = 0;\r
-\r
//\r
- // If this is a text op with secondary text information\r
+ // Save the highlight menu, will be used in CfRefreshHighLight case.\r
//\r
- if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {\r
- StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo, gFormData->HiiHandle);\r
-\r
- Width = (UINT16) gOptionBlockWidth;\r
- OriginalRow = Row;\r
- GlyphWidth = 1;\r
-\r
- for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
- if ((Temp3 == 0) && (Row <= BottomRow)) {\r
- PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
- }\r
- //\r
- // If there is more string to process print on the next row and increment the Skip value\r
- //\r
- if (StrLen (&StringPtr[Index]) != 0) {\r
- if (Temp3 == 0) {\r
- Row++;\r
- //\r
- // Since the Number of lines for this menu entry may or may not be reflected accurately\r
- // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
- // some testing to ensure we are keeping this in-sync.\r
- //\r
- // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
- //\r
- if ((Row - OriginalRow) >= MenuOption->Skip) {\r
- MenuOption->Skip++;\r
- }\r
- }\r
- }\r
-\r
- FreePool (OutputString);\r
- if (Temp3 != 0) {\r
- Temp3--;\r
- }\r
- }\r
-\r
- Row = OriginalRow;\r
- FreePool (StringPtr);\r
+ if (Link == NewPos) {\r
+ SavedMenuOption = MenuOption;\r
+ SkipHighLight = TRUE;\r
}\r
- Temp3 = 0;\r
-\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+ \r
+ DisplayOneMenu (MenuOption, \r
+ ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) ? LEFT_SKIPPED_COLUMNS + gModalSkipColumn : LEFT_SKIPPED_COLUMNS,\r
+ gStatementDimensions.LeftColumn, \r
+ Link == TopOfScreen ? SkipValue : 0, \r
+ BottomRow,\r
+ Link == NewPos && IsSelectable(MenuOption)\r
+ );\r
\r
//\r
// 3. Update the row info which will be used by next menu.\r
}\r
}\r
\r
- if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
- UpArrow = TRUE;\r
- }\r
-\r
- if (UpArrow) {\r
- gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
- PrintCharAt (\r
- gStatementDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
- TopRow - SCROLL_ARROW_HEIGHT,\r
- ARROW_UP\r
- );\r
- gST->ConOut->SetAttribute (gST->ConOut, GetFieldTextColor ());\r
+ //\r
+ // 3. Menus in this form may not cover all form, clean the remain field.\r
+ //\r
+ while (Row <= BottomRow) {\r
+ if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
+ PrintStringAtWithWidth(gStatementDimensions.LeftColumn, Row++, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+ } else {\r
+ PrintStringAtWithWidth(gStatementDimensions.LeftColumn, Row++, L"", gStatementDimensions.RightColumn - gHelpBlockWidth - gStatementDimensions.LeftColumn);\r
+ }\r
}\r
\r
+ //\r
+ // 4. Print the down arrow row.\r
+ //\r
+ PrintStringAtWithWidth(gStatementDimensions.LeftColumn, BottomRow + 1, L"", gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn);\r
+ \r
if (DownArrow) {\r
gST->ConOut->SetAttribute (gST->ConOut, GetArrowColor ());\r
PrintCharAt (\r
}\r
\r
MenuOption = NULL;\r
+\r
+ if (IsListEmpty (&gMenuOption)) { \r
+ ControlFlag = CfReadKey;\r
+ }\r
}\r
break;\r
\r
//\r
ControlFlag = CfUpdateHelpString;\r
\r
+ if (SkipHighLight) {\r
+ MenuOption = SavedMenuOption;\r
+ SkipHighLight = FALSE;\r
+ UpdateHighlightMenuInfo (MenuOption);\r
+ break;\r
+ }\r
+\r
if (MenuOption != NULL && TopOfScreen == &MenuOption->Link) {\r
Temp = SkipValue;\r
} else {\r
}\r
\r
OriginalRow = MenuOption->Row;\r
- Width = GetWidth (MenuOption->ThisTag);\r
+ Width = GetWidth (MenuOption->ThisTag, NULL);\r
GlyphWidth = 1;\r
\r
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
Statement = MenuOption->ThisTag;\r
\r
- //\r
- // Get the highlight statement.\r
- //\r
- gUserInput->SelectedStatement = Statement;\r
- gSequence = (UINT16) MenuOption->Sequence;\r
-\r
- //\r
- // Record highlight row info for date/time opcode.\r
- //\r
- if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
- gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
- gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
- } else {\r
- gHighligthMenuInfo.QuestionId = 0;\r
- gHighligthMenuInfo.DisplayRow = 0;\r
- }\r
+ UpdateHighlightMenuInfo (MenuOption);\r
\r
if (!IsSelectable (MenuOption)) {\r
- RefreshKeyHelp(gFormData, Statement, FALSE);\r
break;\r
}\r
\r
if (NewLine) {\r
OriginalRow = MenuOption->Row;\r
\r
- Width = GetWidth (Statement);\r
+ Width = GetWidth (Statement, NULL);\r
GlyphWidth = 1;\r
\r
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
}\r
}\r
\r
- RefreshKeyHelp(gFormData, MenuOption->ThisTag, FALSE);\r
-\r
//\r
// Clear reverse attribute\r
//\r