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:
@ -477,6 +477,7 @@ DisplayForm (
|
|||||||
UINT16 NumberOfLines;
|
UINT16 NumberOfLines;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UI_MENU_OPTION *MenuOption;
|
UI_MENU_OPTION *MenuOption;
|
||||||
|
UINT16 GlyphWidth;
|
||||||
|
|
||||||
Handle = Selection->Handle;
|
Handle = Selection->Handle;
|
||||||
MenuItemCount = 0;
|
MenuItemCount = 0;
|
||||||
@ -528,7 +529,8 @@ DisplayForm (
|
|||||||
|
|
||||||
NumberOfLines = 1;
|
NumberOfLines = 1;
|
||||||
ArrayEntry = 0;
|
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
|
// 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 StringPtr The entire help string.
|
||||||
@param FormattedString The oupput formatted 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.
|
@param RowCount TRUE: if Question is selected.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
@ -985,6 +986,7 @@ UINTN
|
|||||||
ProcessHelpString (
|
ProcessHelpString (
|
||||||
IN CHAR16 *StringPtr,
|
IN CHAR16 *StringPtr,
|
||||||
OUT CHAR16 **FormattedString,
|
OUT CHAR16 **FormattedString,
|
||||||
|
OUT UINT16 *EachLineWidth,
|
||||||
IN UINTN RowCount
|
IN UINTN RowCount
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -992,27 +994,49 @@ ProcessHelpString (
|
|||||||
CHAR16 *OutputString;
|
CHAR16 *OutputString;
|
||||||
UINTN TotalRowNum;
|
UINTN TotalRowNum;
|
||||||
UINTN CheckedNum;
|
UINTN CheckedNum;
|
||||||
|
UINT16 GlyphWidth;
|
||||||
|
UINT16 LineWidth;
|
||||||
|
UINT16 MaxStringLen;
|
||||||
|
UINT16 StringLen;
|
||||||
|
|
||||||
TotalRowNum = 0;
|
TotalRowNum = 0;
|
||||||
CheckedNum = 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.
|
// 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 ++;
|
TotalRowNum ++;
|
||||||
FreePool (OutputString);
|
FreePool (OutputString);
|
||||||
}
|
}
|
||||||
|
*EachLineWidth = MaxStringLen;
|
||||||
*FormattedString = AllocateZeroPool (TotalRowNum * gHelpBlockWidth * sizeof (CHAR16) * 2);
|
|
||||||
|
*FormattedString = AllocateZeroPool (TotalRowNum * MaxStringLen * sizeof (CHAR16));
|
||||||
ASSERT (*FormattedString != NULL);
|
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);
|
FreePool (OutputString);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (CheckedNum == TotalRowNum);
|
|
||||||
|
|
||||||
return TotalRowNum;
|
return TotalRowNum;
|
||||||
}
|
}
|
||||||
|
@ -1308,102 +1308,174 @@ GetWidth (
|
|||||||
/**
|
/**
|
||||||
Will copy LineWidth amount of a string in the OutputString buffer and return the
|
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.
|
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.
|
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 InputString String description for this option.
|
||||||
@param LineWidth Width of the desired string to extract in CHAR16
|
@param LineWidth Width of the desired string to extract in CHAR16
|
||||||
characters
|
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 Index Where in InputString to start the copy process
|
||||||
@param OutputString Buffer to copy the string into
|
@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
|
UINT16
|
||||||
GetLineByWidth (
|
GetLineByWidth (
|
||||||
IN CHAR16 *InputString,
|
IN CHAR16 *InputString,
|
||||||
IN UINT16 LineWidth,
|
IN UINT16 LineWidth,
|
||||||
|
IN OUT UINT16 *GlyphWidth,
|
||||||
IN OUT UINTN *Index,
|
IN OUT UINTN *Index,
|
||||||
OUT CHAR16 **OutputString
|
OUT CHAR16 **OutputString
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT16 Count;
|
UINT16 StrOffset;
|
||||||
UINT16 Count2;
|
UINT16 GlyphOffset;
|
||||||
|
UINT16 OriginalGlyphWidth;
|
||||||
|
BOOLEAN ReturnFlag;
|
||||||
|
UINT16 LastSpaceOffset;
|
||||||
|
UINT16 LastGlyphWidth;
|
||||||
|
|
||||||
if (GetLineByWidthFinished) {
|
if (InputString == NULL || Index == NULL || OutputString == NULL) {
|
||||||
GetLineByWidthFinished = FALSE;
|
return 0;
|
||||||
return (UINT16) 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Count = LineWidth;
|
if (LineWidth == 0 || *GlyphWidth == 0) {
|
||||||
Count2 = 0;
|
return 0;
|
||||||
|
}
|
||||||
*OutputString = AllocateZeroPool (((UINTN) (LineWidth + 1) * 2));
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// 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.
|
// 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.
|
// 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)) {
|
if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {
|
||||||
*Index = *Index + 2;
|
*Index = *Index + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fast-forward the string and see if there is a carriage-return or linefeed in the string
|
// Fast-forward the string and see if there is a carriage-return in the string
|
||||||
//
|
//
|
||||||
for (; (InputString[*Index + Count2] != CHAR_LINEFEED) && (InputString[*Index + Count2] != CHAR_CARRIAGE_RETURN) && (Count2 != LineWidth); Count2++)
|
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 ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) {
|
||||||
;
|
LastSpaceOffset = StrOffset;
|
||||||
if (LineWidth == 0) {
|
LastGlyphWidth = *GlyphWidth;
|
||||||
LineWidth = Count;
|
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
LineWidth = Count2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 (;
|
if (LastSpaceOffset != 0) {
|
||||||
(InputString[*Index + LineWidth] == CHAR_SPACE) || (InputString[*Index + LineWidth] == CHAR_CARRIAGE_RETURN)|| (InputString[*Index + LineWidth] == CHAR_LINEFEED);
|
StrOffset = LastSpaceOffset;
|
||||||
(*Index)++
|
*GlyphWidth = LastGlyphWidth;
|
||||||
)
|
} else {
|
||||||
;
|
//
|
||||||
*Index = (UINT16) (*Index + LineWidth);
|
// Roll back to last char in the line width.
|
||||||
return LineWidth;
|
//
|
||||||
} else {
|
StrOffset--;
|
||||||
return (UINT16) 0;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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;
|
UINTN OriginalRow;
|
||||||
CHAR16 *OutputString;
|
CHAR16 *OutputString;
|
||||||
CHAR16 *OptionString;
|
CHAR16 *OptionString;
|
||||||
|
UINT16 GlyphWidth;
|
||||||
|
|
||||||
Row = 0;
|
Row = 0;
|
||||||
OptionString = NULL;
|
OptionString = NULL;
|
||||||
@ -1435,8 +1508,9 @@ UpdateOptionSkipLines (
|
|||||||
Width = (UINT16) gOptionBlockWidth;
|
Width = (UINT16) gOptionBlockWidth;
|
||||||
|
|
||||||
OriginalRow = Row;
|
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
|
// 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 HelpHeaderLine;
|
||||||
UINTN HelpBottomLine;
|
UINTN HelpBottomLine;
|
||||||
BOOLEAN MultiHelpPage;
|
BOOLEAN MultiHelpPage;
|
||||||
|
UINT16 GlyphWidth;
|
||||||
|
UINT16 EachLineWidth;
|
||||||
|
UINT16 HeaderLineWidth;
|
||||||
|
UINT16 BottomLineWidth;
|
||||||
|
|
||||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||||
|
|
||||||
@ -2147,7 +2225,9 @@ UiDisplayMenu (
|
|||||||
HelpHeaderLine = 0;
|
HelpHeaderLine = 0;
|
||||||
HelpPageIndex = 0;
|
HelpPageIndex = 0;
|
||||||
MultiHelpPage = FALSE;
|
MultiHelpPage = FALSE;
|
||||||
|
EachLineWidth = 0;
|
||||||
|
HeaderLineWidth = 0;
|
||||||
|
BottomLineWidth = 0;
|
||||||
OutputString = NULL;
|
OutputString = NULL;
|
||||||
UpArrow = FALSE;
|
UpArrow = FALSE;
|
||||||
DownArrow = FALSE;
|
DownArrow = FALSE;
|
||||||
@ -2298,6 +2378,7 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
Width = GetWidth (Statement, MenuOption->Handle);
|
Width = GetWidth (Statement, MenuOption->Handle);
|
||||||
OriginalRow = Row;
|
OriginalRow = Row;
|
||||||
|
GlyphWidth = 1;
|
||||||
|
|
||||||
if (Statement->Operand == EFI_IFR_REF_OP && MenuOption->Col >= 2) {
|
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)) {
|
if ((Temp == 0) && (Row <= BottomRow)) {
|
||||||
PrintStringAt (MenuOption->Col, Row, OutputString);
|
PrintStringAt (MenuOption->Col, Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2351,8 +2432,9 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
Width = (UINT16) gOptionBlockWidth;
|
Width = (UINT16) gOptionBlockWidth;
|
||||||
OriginalRow = Row;
|
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)) {
|
if ((Temp2 == 0) && (Row <= BottomRow)) {
|
||||||
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2459,8 +2541,9 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
Width = (UINT16) gOptionBlockWidth;
|
Width = (UINT16) gOptionBlockWidth;
|
||||||
OriginalRow = Row;
|
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)) {
|
if ((Temp == 0) && (Row <= BottomRow)) {
|
||||||
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
PrintStringAt (MenuOption->OptCol, Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2688,8 +2771,9 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
Width = (UINT16) gOptionBlockWidth;
|
Width = (UINT16) gOptionBlockWidth;
|
||||||
OriginalRow = MenuOption->Row;
|
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) {
|
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||||
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2716,8 +2800,9 @@ UiDisplayMenu (
|
|||||||
|
|
||||||
OriginalRow = MenuOption->Row;
|
OriginalRow = MenuOption->Row;
|
||||||
Width = GetWidth (MenuOption->ThisTag, MenuOption->Handle);
|
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) {
|
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||||
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2787,8 +2872,9 @@ UiDisplayMenu (
|
|||||||
Width = (UINT16) gOptionBlockWidth;
|
Width = (UINT16) gOptionBlockWidth;
|
||||||
|
|
||||||
OriginalRow = MenuOption->Row;
|
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) {
|
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||||
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2810,8 +2896,9 @@ UiDisplayMenu (
|
|||||||
OriginalRow = MenuOption->Row;
|
OriginalRow = MenuOption->Row;
|
||||||
|
|
||||||
Width = GetWidth (Statement, MenuOption->Handle);
|
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) {
|
if (MenuOption->Row >= TopRow && MenuOption->Row <= BottomRow) {
|
||||||
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);
|
||||||
}
|
}
|
||||||
@ -2866,13 +2953,22 @@ UiDisplayMenu (
|
|||||||
//
|
//
|
||||||
// 1.Calculate how many line the help string need to print.
|
// 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) {
|
if (HelpLine > RowCount) {
|
||||||
MultiHelpPage = TRUE;
|
MultiHelpPage = TRUE;
|
||||||
StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);
|
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);
|
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.
|
// Calculate the help page count.
|
||||||
//
|
//
|
||||||
@ -2900,7 +2996,6 @@ UiDisplayMenu (
|
|||||||
PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND
|
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.
|
// 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.
|
// Base on current direct info, here shows aligned to the right side of the column.
|
||||||
@ -2908,13 +3003,14 @@ UiDisplayMenu (
|
|||||||
// add ASSERT code here.
|
// add ASSERT code here.
|
||||||
//
|
//
|
||||||
if (HelpPageIndex > 0) {
|
if (HelpPageIndex > 0) {
|
||||||
|
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||||
for (Index = 0; Index < HelpHeaderLine; Index++) {
|
for (Index = 0; Index < HelpHeaderLine; Index++) {
|
||||||
ASSERT (HelpHeaderLine == 1);
|
ASSERT (HelpHeaderLine == 1);
|
||||||
ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
LocalScreen.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,
|
LocalScreen.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,
|
||||||
Index + TopRow,
|
Index + TopRow,
|
||||||
&HelpHeaderString[Index * gHelpBlockWidth * 2]
|
&HelpHeaderString[Index * HeaderLineWidth]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2928,16 +3024,17 @@ UiDisplayMenu (
|
|||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||||
Index + TopRow,
|
Index + TopRow,
|
||||||
&HelpString[Index * gHelpBlockWidth * 2]
|
&HelpString[Index * EachLineWidth]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
gST->ConOut->SetCursorPosition(gST->ConOut, LocalScreen.RightColumn-1, BottomRow);
|
||||||
} else {
|
} else {
|
||||||
if (HelpPageIndex == 0) {
|
if (HelpPageIndex == 0) {
|
||||||
for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {
|
for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {
|
||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||||
Index + TopRow,
|
Index + TopRow,
|
||||||
&HelpString[Index * gHelpBlockWidth * 2]
|
&HelpString[Index * EachLineWidth]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -2946,13 +3043,15 @@ UiDisplayMenu (
|
|||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||||
Index + TopRow + HelpHeaderLine,
|
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.
|
// 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.
|
// Base on current direct info, here shows aligned to the right side of the column.
|
||||||
@ -2960,13 +3059,14 @@ UiDisplayMenu (
|
|||||||
// add ASSERT code here.
|
// add ASSERT code here.
|
||||||
//
|
//
|
||||||
if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {
|
if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {
|
||||||
|
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);
|
||||||
for (Index = 0; Index < HelpBottomLine; Index++) {
|
for (Index = 0; Index < HelpBottomLine; Index++) {
|
||||||
ASSERT (HelpBottomLine == 1);
|
ASSERT (HelpBottomLine == 1);
|
||||||
ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1));
|
||||||
PrintStringAt (
|
PrintStringAt (
|
||||||
LocalScreen.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,
|
LocalScreen.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,
|
||||||
Index + BottomRow - HelpBottomLine,
|
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->SetCursorPosition (gST->ConOut, 0, Row + 4);
|
||||||
gST->ConOut->EnableCursor (gST->ConOut, TRUE);
|
gST->ConOut->EnableCursor (gST->ConOut, TRUE);
|
||||||
gST->ConOut->OutputString (gST->ConOut, L"\n");
|
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;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
@ -604,14 +604,16 @@ ProcessOptions (
|
|||||||
|
|
||||||
@param StringPtr The entire help string.
|
@param StringPtr The entire help string.
|
||||||
@param FormattedString The oupput formatted 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.
|
@param RowCount TRUE: if Question is selected.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
ProcessHelpString (
|
ProcessHelpString (
|
||||||
IN CHAR16 *StringPtr,
|
IN CHAR16 *StringPtr,
|
||||||
OUT CHAR16 **FormattedString,
|
OUT CHAR16 **FormattedString,
|
||||||
IN UINTN RowCount
|
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
|
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.
|
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 InputString String description for this option.
|
||||||
@param LineWidth Width of the desired string to extract in CHAR16
|
@param LineWidth Width of the desired string to extract in CHAR16
|
||||||
characters
|
characters
|
||||||
|
@param GlyphWidth The glyph width of the beging char in the string.
|
||||||
@param Index Where in InputString to start the copy process
|
@param Index Where in InputString to start the copy process
|
||||||
@param OutputString Buffer to copy the string into
|
@param OutputString Buffer to copy the string into
|
||||||
|
|
||||||
@ -686,6 +690,7 @@ UINT16
|
|||||||
GetLineByWidth (
|
GetLineByWidth (
|
||||||
IN CHAR16 *InputString,
|
IN CHAR16 *InputString,
|
||||||
IN UINT16 LineWidth,
|
IN UINT16 LineWidth,
|
||||||
|
IN OUT UINT16 *GlyphWidth,
|
||||||
IN OUT UINTN *Index,
|
IN OUT UINTN *Index,
|
||||||
OUT CHAR16 **OutputString
|
OUT CHAR16 **OutputString
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user