mirror of https://github.com/acidanthera/audk.git
Enable wide string for title and help string
Sign-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13371 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
2721fabc53
commit
6c310dfb78
|
@ -477,6 +477,7 @@ DisplayForm (
|
|||
UINT16 NumberOfLines;
|
||||
EFI_STATUS Status;
|
||||
UI_MENU_OPTION *MenuOption;
|
||||
UINT16 GlyphWidth;
|
||||
|
||||
Handle = Selection->Handle;
|
||||
MenuItemCount = 0;
|
||||
|
@ -528,7 +529,8 @@ DisplayForm (
|
|||
|
||||
NumberOfLines = 1;
|
||||
ArrayEntry = 0;
|
||||
for (; GetLineByWidth (StringPtr, Width, &ArrayEntry, &OutputString) != 0x0000;) {
|
||||
GlyphWidth = 1;
|
||||
for (; GetLineByWidth (StringPtr, Width, &GlyphWidth,&ArrayEntry, &OutputString) != 0x0000;) {
|
||||
//
|
||||
// If there is more string to process print on the next row and increment the Skip value
|
||||
//
|
||||
|
|
|
@ -978,6 +978,7 @@ ProcessOptions (
|
|||
|
||||
@param StringPtr The entire help string.
|
||||
@param FormattedString The oupput formatted string.
|
||||
@param EachLineWidth The max string length of each line in the formatted string.
|
||||
@param RowCount TRUE: if Question is selected.
|
||||
|
||||
**/
|
||||
|
@ -985,6 +986,7 @@ UINTN
|
|||
ProcessHelpString (
|
||||
IN CHAR16 *StringPtr,
|
||||
OUT CHAR16 **FormattedString,
|
||||
OUT UINT16 *EachLineWidth,
|
||||
IN UINTN RowCount
|
||||
)
|
||||
{
|
||||
|
@ -992,27 +994,49 @@ ProcessHelpString (
|
|||
CHAR16 *OutputString;
|
||||
UINTN TotalRowNum;
|
||||
UINTN CheckedNum;
|
||||
UINT16 GlyphWidth;
|
||||
UINT16 LineWidth;
|
||||
UINT16 MaxStringLen;
|
||||
UINT16 StringLen;
|
||||
|
||||
TotalRowNum = 0;
|
||||
CheckedNum = 0;
|
||||
TotalRowNum = 0;
|
||||
CheckedNum = 0;
|
||||
GlyphWidth = 1;
|
||||
Index = 0;
|
||||
MaxStringLen = 0;
|
||||
StringLen = 0;
|
||||
|
||||
//
|
||||
// Set default help string width.
|
||||
//
|
||||
LineWidth = (UINT16) (gHelpBlockWidth - 1);
|
||||
|
||||
//
|
||||
// Get row number of the String.
|
||||
//
|
||||
for (Index = 0; GetLineByWidth (StringPtr, (UINT16) (gHelpBlockWidth - 1), &Index, &OutputString) != 0x0000; ) {
|
||||
while ((StringLen = GetLineByWidth (StringPtr, LineWidth, &GlyphWidth, &Index, &OutputString)) != 0) {
|
||||
if (StringLen > MaxStringLen) {
|
||||
MaxStringLen = StringLen;
|
||||
}
|
||||
|
||||
TotalRowNum ++;
|
||||
FreePool (OutputString);
|
||||
}
|
||||
|
||||
*FormattedString = AllocateZeroPool (TotalRowNum * gHelpBlockWidth * sizeof (CHAR16) * 2);
|
||||
*EachLineWidth = MaxStringLen;
|
||||
|
||||
*FormattedString = AllocateZeroPool (TotalRowNum * MaxStringLen * sizeof (CHAR16));
|
||||
ASSERT (*FormattedString != NULL);
|
||||
|
||||
for (Index = 0; GetLineByWidth (StringPtr, (UINT16) (gHelpBlockWidth - 1), &Index, &OutputString) != 0x0000; CheckedNum ++) {
|
||||
CopyMem (*FormattedString + CheckedNum * gHelpBlockWidth * sizeof (CHAR16), OutputString, gHelpBlockWidth * sizeof (CHAR16));
|
||||
//
|
||||
// Generate formatted help string array.
|
||||
//
|
||||
GlyphWidth = 1;
|
||||
Index = 0;
|
||||
while((StringLen = GetLineByWidth (StringPtr, LineWidth, &GlyphWidth, &Index, &OutputString)) != 0) {
|
||||
CopyMem (*FormattedString + CheckedNum * MaxStringLen, OutputString, StringLen * sizeof (CHAR16));
|
||||
CheckedNum ++;
|
||||
FreePool (OutputString);
|
||||
}
|
||||
|
||||
ASSERT (CheckedNum == TotalRowNum);
|
||||
|
||||
return TotalRowNum;
|
||||
}
|
||||
|
|
|
@ -1308,102 +1308,174 @@ GetWidth (
|
|||
/**
|
||||
Will copy LineWidth amount of a string in the OutputString buffer and return the
|
||||
number of CHAR16 characters that were copied into the OutputString buffer.
|
||||
The output string format is:
|
||||
Glyph Info + String info + '\0'.
|
||||
|
||||
In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
|
||||
|
||||
@param InputString String description for this option.
|
||||
@param LineWidth Width of the desired string to extract in CHAR16
|
||||
characters
|
||||
@param GlyphWidth The glyph width of the begin of the char in the string.
|
||||
@param Index Where in InputString to start the copy process
|
||||
@param OutputString Buffer to copy the string into
|
||||
|
||||
@return Returns the number of CHAR16 characters that were copied into the OutputString buffer.
|
||||
@return Returns the number of CHAR16 characters that were copied into the OutputString
|
||||
buffer, include extra glyph info and '\0' info.
|
||||
|
||||
**/
|
||||
UINT16
|
||||
GetLineByWidth (
|
||||
IN CHAR16 *InputString,
|
||||
IN UINT16 LineWidth,
|
||||
IN OUT UINT16 *GlyphWidth,
|
||||
IN OUT UINTN *Index,
|
||||
OUT CHAR16 **OutputString
|
||||
)
|
||||
{
|
||||
UINT16 Count;
|
||||
UINT16 Count2;
|
||||
UINT16 StrOffset;
|
||||
UINT16 GlyphOffset;
|
||||
UINT16 OriginalGlyphWidth;
|
||||
BOOLEAN ReturnFlag;
|
||||
UINT16 LastSpaceOffset;
|
||||
UINT16 LastGlyphWidth;
|
||||
|
||||
if (GetLineByWidthFinished) {
|
||||
GetLineByWidthFinished = FALSE;
|
||||
return (UINT16) 0;
|
||||
if (InputString == NULL || Index == NULL || OutputString == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Count = LineWidth;
|
||||
Count2 = 0;
|
||||
|
||||
*OutputString = AllocateZeroPool (((UINTN) (LineWidth + 1) * 2));
|
||||
if (LineWidth == 0 || *GlyphWidth == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Ensure we have got a valid buffer
|
||||
// Save original glyph width.
|
||||
//
|
||||
if (*OutputString != NULL) {
|
||||
OriginalGlyphWidth = *GlyphWidth;
|
||||
LastGlyphWidth = OriginalGlyphWidth;
|
||||
ReturnFlag = FALSE;
|
||||
LastSpaceOffset = 0;
|
||||
|
||||
//
|
||||
//NARROW_CHAR can not be printed in screen, so if a line only contain the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line in Screen.
|
||||
//To avoid displaying this empty line in screen, just skip the two CHARs here.
|
||||
//
|
||||
if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {
|
||||
*Index = *Index + 2;
|
||||
}
|
||||
//
|
||||
// NARROW_CHAR can not be printed in screen, so if a line only contain the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line in Screen.
|
||||
// To avoid displaying this empty line in screen, just skip the two CHARs here.
|
||||
//
|
||||
if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {
|
||||
*Index = *Index + 2;
|
||||
}
|
||||
|
||||
//
|
||||
// Fast-forward the string and see if there is a carriage-return or linefeed in the string
|
||||
//
|
||||
for (; (InputString[*Index + Count2] != CHAR_LINEFEED) && (InputString[*Index + Count2] != CHAR_CARRIAGE_RETURN) && (Count2 != LineWidth); Count2++)
|
||||
;
|
||||
//
|
||||
// Fast-forward the string and see if there is a carriage-return in the string
|
||||
//
|
||||
for (StrOffset = 0, GlyphOffset = 0; GlyphOffset <= LineWidth; StrOffset++) {
|
||||
switch (InputString[*Index + StrOffset]) {
|
||||
case NARROW_CHAR:
|
||||
*GlyphWidth = 1;
|
||||
break;
|
||||
|
||||
case WIDE_CHAR:
|
||||
*GlyphWidth = 2;
|
||||
break;
|
||||
|
||||
case CHAR_CARRIAGE_RETURN:
|
||||
case CHAR_LINEFEED:
|
||||
case CHAR_NULL:
|
||||
ReturnFlag = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
GlyphOffset = GlyphOffset + *GlyphWidth;
|
||||
|
||||
//
|
||||
// Copy the desired LineWidth of data to the output buffer.
|
||||
// Also make sure that we don't copy more than the string.
|
||||
// Also make sure that if there are linefeeds, we account for them.
|
||||
//
|
||||
if ((StrSize (&InputString[*Index]) <= ((UINTN) (LineWidth + 1) * 2)) &&
|
||||
(StrSize (&InputString[*Index]) <= ((UINTN) (Count2 + 1) * 2))
|
||||
) {
|
||||
//
|
||||
// Convert to CHAR16 value and show that we are done with this operation
|
||||
//
|
||||
LineWidth = (UINT16) ((StrSize (&InputString[*Index]) - 2) / 2);
|
||||
if (LineWidth != 0) {
|
||||
GetLineByWidthFinished = TRUE;
|
||||
}
|
||||
} else {
|
||||
if (Count2 == LineWidth) {
|
||||
//
|
||||
// Rewind the string from the maximum size until we see a space to break the line
|
||||
// Record the last space info in this line. Will be used in rewind.
|
||||
//
|
||||
for (; (InputString[*Index + LineWidth] != CHAR_SPACE) && (LineWidth != 0); LineWidth--)
|
||||
;
|
||||
if (LineWidth == 0) {
|
||||
LineWidth = Count;
|
||||
if ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) {
|
||||
LastSpaceOffset = StrOffset;
|
||||
LastGlyphWidth = *GlyphWidth;
|
||||
}
|
||||
} else {
|
||||
LineWidth = Count2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
CopyMem (*OutputString, &InputString[*Index], LineWidth * 2);
|
||||
if (ReturnFlag) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Rewind the string from the maximum size until we see a space to break the line
|
||||
//
|
||||
if (GlyphOffset > LineWidth) {
|
||||
//
|
||||
// If currently pointing to a space or carriage-return or linefeed, increment the index to the first non-space character
|
||||
// Rewind the string to last space char in this line.
|
||||
//
|
||||
for (;
|
||||
(InputString[*Index + LineWidth] == CHAR_SPACE) || (InputString[*Index + LineWidth] == CHAR_CARRIAGE_RETURN)|| (InputString[*Index + LineWidth] == CHAR_LINEFEED);
|
||||
(*Index)++
|
||||
)
|
||||
;
|
||||
*Index = (UINT16) (*Index + LineWidth);
|
||||
return LineWidth;
|
||||
} else {
|
||||
return (UINT16) 0;
|
||||
if (LastSpaceOffset != 0) {
|
||||
StrOffset = LastSpaceOffset;
|
||||
*GlyphWidth = LastGlyphWidth;
|
||||
} else {
|
||||
//
|
||||
// Roll back to last char in the line width.
|
||||
//
|
||||
StrOffset--;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// The CHAR_NULL has process last time, this time just return 0 to stand for the end.
|
||||
//
|
||||
if (StrOffset == 0 && (InputString[*Index + StrOffset] == CHAR_NULL)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Need extra glyph info and '\0' info, so +2.
|
||||
//
|
||||
*OutputString = AllocateZeroPool (((UINTN) (StrOffset + 2) * sizeof(CHAR16)));
|
||||
if (*OutputString == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Save the glyph info at the begin of the string, will used by Print function.
|
||||
//
|
||||
if (OriginalGlyphWidth == 1) {
|
||||
*(*OutputString) = NARROW_CHAR;
|
||||
} else {
|
||||
*(*OutputString) = WIDE_CHAR;
|
||||
}
|
||||
|
||||
CopyMem ((*OutputString) + 1, &InputString[*Index], StrOffset * sizeof(CHAR16));
|
||||
|
||||
if (InputString[*Index + StrOffset] == CHAR_SPACE) {
|
||||
//
|
||||
// Skip the space info at the begin of next line.
|
||||
//
|
||||
*Index = (UINT16) (*Index + StrOffset + 1);
|
||||
} else if ((InputString[*Index + StrOffset] == CHAR_LINEFEED)) {
|
||||
//
|
||||
// Skip the /n or /n/r info.
|
||||
//
|
||||
if (InputString[*Index + StrOffset + 1] == CHAR_CARRIAGE_RETURN) {
|
||||
*Index = (UINT16) (*Index + StrOffset + 2);
|
||||
} else {
|
||||
*Index = (UINT16) (*Index + StrOffset + 1);
|
||||
}
|
||||
} else if ((InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN)) {
|
||||
//
|
||||
// Skip the /r or /r/n info.
|
||||
//
|
||||
if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) {
|
||||
*Index = (UINT16) (*Index + StrOffset + 2);
|
||||
} else {
|
||||
*Index = (UINT16) (*Index + StrOffset + 1);
|
||||
}
|
||||
} else {
|
||||
*Index = (UINT16) (*Index + StrOffset);
|
||||
}
|
||||
|
||||
//
|
||||
// Include extra glyph info and '\0' info, so +2.
|
||||
//
|
||||
return StrOffset + 2;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1426,6 +1498,7 @@ UpdateOptionSkipLines (
|
|||
UINTN OriginalRow;
|
||||
CHAR16 *OutputString;
|
||||
CHAR16 *OptionString;
|
||||
UINT16 GlyphWidth;
|
||||
|
||||
Row = 0;
|
||||
OptionString = NULL;
|
||||
|
@ -1435,8 +1508,9 @@ UpdateOptionSkipLines (
|
|||
Width = (UINT16) gOptionBlockWidth;
|
||||
|
||||
OriginalRow = Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
//
|
||||
// If there is more string to process print on the next row and increment the Skip value
|
||||
//
|
||||
|
@ -2128,6 +2202,10 @@ UiDisplayMenu (
|
|||
UINTN HelpHeaderLine;
|
||||
UINTN HelpBottomLine;
|
||||
BOOLEAN MultiHelpPage;
|
||||
UINT16 GlyphWidth;
|
||||
UINT16 EachLineWidth;
|
||||
UINT16 HeaderLineWidth;
|
||||
UINT16 BottomLineWidth;
|
||||
|
||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||
|
||||
|
@ -2147,7 +2225,9 @@ UiDisplayMenu (
|
|||
HelpHeaderLine = 0;
|
||||
HelpPageIndex = 0;
|
||||
MultiHelpPage = FALSE;
|
||||
|
||||
EachLineWidth = 0;
|
||||
HeaderLineWidth = 0;
|
||||
BottomLineWidth = 0;
|
||||
OutputString = NULL;
|
||||
UpArrow = FALSE;
|
||||
DownArrow = FALSE;
|
||||
|
@ -2298,6 +2378,7 @@ UiDisplayMenu (
|
|||
|
||||
Width = GetWidth (Statement, MenuOption->Handle);
|
||||
OriginalRow = Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
if (Statement->Operand == EFI_IFR_REF_OP && MenuOption->Col >= 2) {
|
||||
//
|
||||
|
@ -2311,7 +2392,7 @@ UiDisplayMenu (
|
|||
);
|
||||
}
|
||||
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if ((Temp == 0) && (Row <= BottomRow)) {
|
||||
PrintStringAt (MenuOption->Col, Row, OutputString);
|
||||
}
|
||||
|
@ -2351,8 +2432,9 @@ UiDisplayMenu (
|
|||
|
||||
Width = (UINT16) gOptionBlockWidth;
|
||||
OriginalRow = Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if ((Temp2 == 0) && (Row <= BottomRow)) {
|
||||
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
||||
}
|
||||
|
@ -2459,8 +2541,9 @@ UiDisplayMenu (
|
|||
|
||||
Width = (UINT16) gOptionBlockWidth;
|
||||
OriginalRow = Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (StringPtr, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if ((Temp == 0) && (Row <= BottomRow)) {
|
||||
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
||||
}
|
||||
|
@ -2688,8 +2771,9 @@ UiDisplayMenu (
|
|||
|
||||
Width = (UINT16) gOptionBlockWidth;
|
||||
OriginalRow = MenuOption->Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
||||
}
|
||||
|
@ -2716,8 +2800,9 @@ UiDisplayMenu (
|
|||
|
||||
OriginalRow = MenuOption->Row;
|
||||
Width = GetWidth (MenuOption->ThisTag, MenuOption->Handle);
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
||||
}
|
||||
|
@ -2787,8 +2872,9 @@ UiDisplayMenu (
|
|||
Width = (UINT16) gOptionBlockWidth;
|
||||
|
||||
OriginalRow = MenuOption->Row;
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
||||
}
|
||||
|
@ -2810,8 +2896,9 @@ UiDisplayMenu (
|
|||
OriginalRow = MenuOption->Row;
|
||||
|
||||
Width = GetWidth (Statement, MenuOption->Handle);
|
||||
GlyphWidth = 1;
|
||||
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {
|
||||
for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {
|
||||
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
||||
}
|
||||
|
@ -2866,13 +2953,22 @@ UiDisplayMenu (
|
|||
//
|
||||
// 1.Calculate how many line the help string need to print.
|
||||
//
|
||||
HelpLine = ProcessHelpString (StringPtr, &HelpString, RowCount);
|
||||
if (HelpString != NULL) {
|
||||
FreePool (HelpString);
|
||||
}
|
||||
HelpLine = ProcessHelpString (StringPtr, &HelpString, &EachLineWidth, RowCount);
|
||||
if (HelpLine > RowCount) {
|
||||
MultiHelpPage = TRUE;
|
||||
StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);
|
||||
HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, RowCount);
|
||||
if (HelpHeaderString != NULL) {
|
||||
FreePool (HelpHeaderString);
|
||||
}
|
||||
HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, &HeaderLineWidth, RowCount);
|
||||
StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);
|
||||
HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, RowCount);
|
||||
if (HelpBottomString != NULL) {
|
||||
FreePool (HelpBottomString);
|
||||
}
|
||||
HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, &BottomLineWidth, RowCount);
|
||||
//
|
||||
// Calculate the help page count.
|
||||
//
|
||||
|
@ -2900,7 +2996,6 @@ UiDisplayMenu (
|
|||
PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
|
||||
);
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||
//
|
||||
// Check whether need to show the 'More(U/u)' at the begin.
|
||||
// Base on current direct info, here shows aligned to the right side of the column.
|
||||
|
@ -2908,13 +3003,14 @@ UiDisplayMenu (
|
|||
// add ASSERT code here.
|
||||
//
|
||||
if (HelpPageIndex > 0) {
|
||||
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||
for (Index = 0; Index < HelpHeaderLine; Index++) {
|
||||
ASSERT (HelpHeaderLine == 1);
|
||||
ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,
|
||||
Index + TopRow,
|
||||
&HelpHeaderString[Index * gHelpBlockWidth * 2]
|
||||
&HelpHeaderString[Index * HeaderLineWidth]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -2928,16 +3024,17 @@ UiDisplayMenu (
|
|||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow,
|
||||
&HelpString[Index * gHelpBlockWidth * 2]
|
||||
&HelpString[Index * EachLineWidth]
|
||||
);
|
||||
}
|
||||
gST->ConOut->SetCursorPosition(gST->ConOut, LocalScreen.RightColumn-1, BottomRow);
|
||||
} else {
|
||||
if (HelpPageIndex == 0) {
|
||||
for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow,
|
||||
&HelpString[Index * gHelpBlockWidth * 2]
|
||||
&HelpString[Index * EachLineWidth]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@ -2946,13 +3043,15 @@ UiDisplayMenu (
|
|||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow + HelpHeaderLine,
|
||||
&HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* gHelpBlockWidth * 2]
|
||||
&HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* EachLineWidth]
|
||||
);
|
||||
}
|
||||
if (HelpPageIndex == HelpPageCount - 1) {
|
||||
gST->ConOut->SetCursorPosition(gST->ConOut, LocalScreen.RightColumn-1, BottomRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||
//
|
||||
// Check whether need to print the 'More(D/d)' at the bottom.
|
||||
// Base on current direct info, here shows aligned to the right side of the column.
|
||||
|
@ -2960,13 +3059,14 @@ UiDisplayMenu (
|
|||
// add ASSERT code here.
|
||||
//
|
||||
if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {
|
||||
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||
for (Index = 0; Index < HelpBottomLine; Index++) {
|
||||
ASSERT (HelpBottomLine == 1);
|
||||
ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,
|
||||
Index + BottomRow - HelpBottomLine,
|
||||
&HelpBottomString[Index * gHelpBlockWidth * 2]
|
||||
&HelpBottomString[Index * BottomLineWidth]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -3785,6 +3885,15 @@ UiDisplayMenu (
|
|||
gST->ConOut->SetCursorPosition (gST->ConOut, 0, Row + 4);
|
||||
gST->ConOut->EnableCursor (gST->ConOut, TRUE);
|
||||
gST->ConOut->OutputString (gST->ConOut, L"\n");
|
||||
if (HelpString != NULL) {
|
||||
FreePool (HelpString);
|
||||
}
|
||||
if (HelpHeaderString != NULL) {
|
||||
FreePool (HelpHeaderString);
|
||||
}
|
||||
if (HelpBottomString != NULL) {
|
||||
FreePool (HelpBottomString);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
|
|
|
@ -604,14 +604,16 @@ ProcessOptions (
|
|||
|
||||
@param StringPtr The entire help string.
|
||||
@param FormattedString The oupput formatted string.
|
||||
@param EachLineWidth The string length of each line in the formatted string.
|
||||
@param RowCount TRUE: if Question is selected.
|
||||
|
||||
**/
|
||||
UINTN
|
||||
ProcessHelpString (
|
||||
IN CHAR16 *StringPtr,
|
||||
OUT CHAR16 **FormattedString,
|
||||
IN UINTN RowCount
|
||||
IN CHAR16 *StringPtr,
|
||||
OUT CHAR16 **FormattedString,
|
||||
OUT UINT16 *EachLineWidth,
|
||||
IN UINTN RowCount
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -672,10 +674,12 @@ GetStringWidth (
|
|||
/**
|
||||
Will copy LineWidth amount of a string in the OutputString buffer and return the
|
||||
number of CHAR16 characters that were copied into the OutputString buffer.
|
||||
In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
|
||||
|
||||
@param InputString String description for this option.
|
||||
@param LineWidth Width of the desired string to extract in CHAR16
|
||||
characters
|
||||
@param GlyphWidth The glyph width of the beging char in the string.
|
||||
@param Index Where in InputString to start the copy process
|
||||
@param OutputString Buffer to copy the string into
|
||||
|
||||
|
@ -686,6 +690,7 @@ UINT16
|
|||
GetLineByWidth (
|
||||
IN CHAR16 *InputString,
|
||||
IN UINT16 LineWidth,
|
||||
IN OUT UINT16 *GlyphWidth,
|
||||
IN OUT UINTN *Index,
|
||||
OUT CHAR16 **OutputString
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue