\r
This library class defines a set of interfaces to customize Display module\r
\r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013-2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials are licensed and made available under \r
the terms and conditions of the BSD License that accompanies this distribution. \r
The full text of the license may be found at\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
IN EFI_IFR_OP_HEADER *OpCodeData\r
)\r
{\r
+ EFI_GUID * ClassGuid;\r
+ UINT8 ClassGuidNum;\r
+\r
+ ClassGuid = NULL;\r
+ ClassGuidNum = 0;\r
+\r
switch (OpCodeData->OpCode) {\r
+ case EFI_IFR_FORM_SET_OP:\r
+ //\r
+ // process the statement outside of form,if it is formset op, get its formsetguid or classguid and compared with gFrontPageFormSetGuid\r
+ //\r
+ if (CompareMem (PcdGetPtr (PcdFrontPageFormSetGuid), &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) == 0){\r
+ gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+ } else{\r
+ ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)OpCodeData)->Flags & 0x3);\r
+ ClassGuid = (EFI_GUID *)(VOID *)((UINT8 *)OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+ while (ClassGuidNum-- > 0){\r
+ if (CompareGuid((EFI_GUID*)PcdGetPtr (PcdFrontPageFormSetGuid),ClassGuid)){\r
+ gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+ break;\r
+ }\r
+ ClassGuid ++;\r
+ }\r
+ }\r
+ break;\r
+\r
case EFI_IFR_GUID_OP: \r
if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)((CHAR8*) OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
//\r
)\r
{\r
LIST_ENTRY *Link;\r
+ LIST_ENTRY *NestLink;\r
FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
+ FORM_DISPLAY_ENGINE_STATEMENT *NestStatement;\r
\r
Link = GetFirstNode (&FormData->StatementListOSF);\r
while (!IsNull (&FormData->StatementListOSF, Link)) {\r
Link = GetNextNode (&FormData->StatementListHead, Link);\r
\r
ProcessUserOpcode(Statement->OpCode);\r
+\r
+ NestLink = GetFirstNode (&Statement->NestStatementList);\r
+ while (!IsNull (&Statement->NestStatementList, NestLink)) {\r
+ NestStatement = FORM_DISPLAY_ENGINE_STATEMENT_FROM_LINK (NestLink);\r
+ NestLink = GetNextNode (&Statement->NestStatementList, NestLink);\r
+\r
+ ProcessUserOpcode(NestStatement->OpCode);\r
+ }\r
+\r
}\r
}\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