mirror of https://github.com/acidanthera/audk.git
Enable Help string scroll when the help info can't show all at current page.
Signed-off-by: Dong Eric <eric.dong@intel.com> Reviewed-by: Gao Liming <liming.gao@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13184 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
fcbccedb28
commit
ba46ab9479
|
@ -981,7 +981,7 @@ ProcessOptions (
|
|||
@param RowCount TRUE: if Question is selected.
|
||||
|
||||
**/
|
||||
VOID
|
||||
UINTN
|
||||
ProcessHelpString (
|
||||
IN CHAR16 *StringPtr,
|
||||
OUT CHAR16 **FormattedString,
|
||||
|
@ -1182,4 +1182,6 @@ ProcessHelpString (
|
|||
}
|
||||
|
||||
FreePool (IndexArray);
|
||||
|
||||
return LineCount;
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -2090,7 +2090,9 @@ UiDisplayMenu (
|
|||
CHAR16 *StringPtr;
|
||||
CHAR16 *OptionString;
|
||||
CHAR16 *OutputString;
|
||||
CHAR16 *FormattedString;
|
||||
CHAR16 *HelpString;
|
||||
CHAR16 *HelpHeaderString;
|
||||
CHAR16 *HelpBottomString;
|
||||
BOOLEAN NewLine;
|
||||
BOOLEAN Repaint;
|
||||
BOOLEAN SavedValue;
|
||||
|
@ -2118,16 +2120,32 @@ UiDisplayMenu (
|
|||
UI_MENU_LIST *CurrentMenu;
|
||||
UINTN ModalSkipColumn;
|
||||
BROWSER_HOT_KEY *HotKey;
|
||||
UINTN HelpPageIndex;
|
||||
UINTN HelpPageCount;
|
||||
UINTN RowCount;
|
||||
UINTN HelpLine;
|
||||
UINTN HelpHeaderLine;
|
||||
UINTN HelpBottomLine;
|
||||
BOOLEAN MultiHelpPage;
|
||||
|
||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
FormattedString = NULL;
|
||||
HelpString = NULL;
|
||||
HelpHeaderString = NULL;
|
||||
HelpBottomString = NULL;
|
||||
OptionString = NULL;
|
||||
ScreenOperation = UiNoOperation;
|
||||
NewLine = TRUE;
|
||||
MinRefreshInterval = 0;
|
||||
DefaultId = 0;
|
||||
HelpPageCount = 0;
|
||||
HelpLine = 0;
|
||||
RowCount = 0;
|
||||
HelpBottomLine = 0;
|
||||
HelpHeaderLine = 0;
|
||||
HelpPageIndex = 0;
|
||||
MultiHelpPage = FALSE;
|
||||
|
||||
OutputString = NULL;
|
||||
UpArrow = FALSE;
|
||||
|
@ -2842,22 +2860,112 @@ UiDisplayMenu (
|
|||
StringPtr = GetToken (MenuOption->ThisTag->Help, MenuOption->Handle);
|
||||
}
|
||||
|
||||
ProcessHelpString (StringPtr, &FormattedString, BottomRow - TopRow);
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, HELP_TEXT | FIELD_BACKGROUND);
|
||||
|
||||
for (Index = 0; Index < BottomRow - TopRow; Index++) {
|
||||
RowCount = BottomRow - TopRow;
|
||||
HelpPageIndex = 0;
|
||||
//
|
||||
// 1.Calculate how many line the help string need to print.
|
||||
//
|
||||
HelpLine = ProcessHelpString (StringPtr, &HelpString, RowCount);
|
||||
if (HelpLine > RowCount) {
|
||||
MultiHelpPage = TRUE;
|
||||
StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);
|
||||
HelpHeaderLine = ProcessHelpString (StringPtr, &HelpHeaderString, RowCount);
|
||||
StringPtr = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);
|
||||
HelpBottomLine = ProcessHelpString (StringPtr, &HelpBottomString, RowCount);
|
||||
//
|
||||
// Pad String with spaces to simulate a clearing of the previous line
|
||||
// Calculate the help page count.
|
||||
//
|
||||
for (; GetStringWidth (&FormattedString[Index * gHelpBlockWidth * 2]) / 2 < gHelpBlockWidth;) {
|
||||
StrCat (&FormattedString[Index * gHelpBlockWidth * 2], L" ");
|
||||
if (HelpLine > 2 * RowCount - 2) {
|
||||
HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;
|
||||
if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {
|
||||
HelpPageCount += 1;
|
||||
}
|
||||
} else {
|
||||
HelpPageCount = 2;
|
||||
}
|
||||
} else {
|
||||
MultiHelpPage = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Clean the help field first.
|
||||
//
|
||||
ClearLines (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
LocalScreen.RightColumn,
|
||||
TopRow,
|
||||
BottomRow,
|
||||
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.
|
||||
// If the direction is multi line and aligned to right side may have problem, so
|
||||
// add ASSERT code here.
|
||||
//
|
||||
if (HelpPageIndex > 0) {
|
||||
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]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, HELP_TEXT | FIELD_BACKGROUND);
|
||||
//
|
||||
// Print the help string info.
|
||||
//
|
||||
if (!MultiHelpPage) {
|
||||
for (Index = 0; Index < RowCount; Index++) {
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow,
|
||||
&FormattedString[Index * gHelpBlockWidth * 2]
|
||||
&HelpString[Index * gHelpBlockWidth * 2]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (HelpPageIndex == 0) {
|
||||
for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow,
|
||||
&HelpString[Index * gHelpBlockWidth * 2]
|
||||
);
|
||||
}
|
||||
} else {
|
||||
for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) &&
|
||||
(Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) {
|
||||
PrintStringAt (
|
||||
LocalScreen.RightColumn - gHelpBlockWidth,
|
||||
Index + TopRow + HelpHeaderLine,
|
||||
&HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* gHelpBlockWidth * 2]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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.
|
||||
// If the direction is multi line and aligned to right side may have problem, so
|
||||
// add ASSERT code here.
|
||||
//
|
||||
if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {
|
||||
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]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -2981,6 +3089,26 @@ UiDisplayMenu (
|
|||
}
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
case 'd':
|
||||
if (!MultiHelpPage) {
|
||||
ControlFlag = CfReadKey;
|
||||
break;
|
||||
}
|
||||
ControlFlag = CfUpdateHelpString;
|
||||
HelpPageIndex = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1;
|
||||
break;
|
||||
|
||||
case 'U':
|
||||
case 'u':
|
||||
if (!MultiHelpPage) {
|
||||
ControlFlag = CfReadKey;
|
||||
break;
|
||||
}
|
||||
ControlFlag = CfUpdateHelpString;
|
||||
HelpPageIndex = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0;
|
||||
break;
|
||||
|
||||
case CHAR_NULL:
|
||||
for (Index = 0; Index < mScanCodeNumber; Index++) {
|
||||
if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {
|
||||
|
|
|
@ -607,7 +607,7 @@ ProcessOptions (
|
|||
@param RowCount TRUE: if Question is selected.
|
||||
|
||||
**/
|
||||
VOID
|
||||
UINTN
|
||||
ProcessHelpString (
|
||||
IN CHAR16 *StringPtr,
|
||||
OUT CHAR16 **FormattedString,
|
||||
|
|
Loading…
Reference in New Issue