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:
ydong10 2012-04-11 05:44:40 +00:00
parent fcbccedb28
commit ba46ab9479
4 changed files with 143 additions and 13 deletions

View File

@ -981,7 +981,7 @@ ProcessOptions (
@param RowCount TRUE: if Question is selected. @param RowCount TRUE: if Question is selected.
**/ **/
VOID UINTN
ProcessHelpString ( ProcessHelpString (
IN CHAR16 *StringPtr, IN CHAR16 *StringPtr,
OUT CHAR16 **FormattedString, OUT CHAR16 **FormattedString,
@ -1182,4 +1182,6 @@ ProcessHelpString (
} }
FreePool (IndexArray); FreePool (IndexArray);
return LineCount;
} }

View File

@ -2090,7 +2090,9 @@ UiDisplayMenu (
CHAR16 *StringPtr; CHAR16 *StringPtr;
CHAR16 *OptionString; CHAR16 *OptionString;
CHAR16 *OutputString; CHAR16 *OutputString;
CHAR16 *FormattedString; CHAR16 *HelpString;
CHAR16 *HelpHeaderString;
CHAR16 *HelpBottomString;
BOOLEAN NewLine; BOOLEAN NewLine;
BOOLEAN Repaint; BOOLEAN Repaint;
BOOLEAN SavedValue; BOOLEAN SavedValue;
@ -2118,16 +2120,32 @@ UiDisplayMenu (
UI_MENU_LIST *CurrentMenu; UI_MENU_LIST *CurrentMenu;
UINTN ModalSkipColumn; UINTN ModalSkipColumn;
BROWSER_HOT_KEY *HotKey; 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)); CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
FormattedString = NULL; HelpString = NULL;
HelpHeaderString = NULL;
HelpBottomString = NULL;
OptionString = NULL; OptionString = NULL;
ScreenOperation = UiNoOperation; ScreenOperation = UiNoOperation;
NewLine = TRUE; NewLine = TRUE;
MinRefreshInterval = 0; MinRefreshInterval = 0;
DefaultId = 0; DefaultId = 0;
HelpPageCount = 0;
HelpLine = 0;
RowCount = 0;
HelpBottomLine = 0;
HelpHeaderLine = 0;
HelpPageIndex = 0;
MultiHelpPage = FALSE;
OutputString = NULL; OutputString = NULL;
UpArrow = FALSE; UpArrow = FALSE;
@ -2842,22 +2860,112 @@ UiDisplayMenu (
StringPtr = GetToken (MenuOption->ThisTag->Help, MenuOption->Handle); StringPtr = GetToken (MenuOption->ThisTag->Help, MenuOption->Handle);
} }
ProcessHelpString (StringPtr, &FormattedString, BottomRow - TopRow); RowCount = BottomRow - TopRow;
HelpPageIndex = 0;
gST->ConOut->SetAttribute (gST->ConOut, HELP_TEXT | FIELD_BACKGROUND); //
// 1.Calculate how many line the help string need to print.
for (Index = 0; Index < BottomRow - TopRow; Index++) { //
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;) { if (HelpLine > 2 * RowCount - 2) {
StrCat (&FormattedString[Index * gHelpBlockWidth * 2], L" "); 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 ( PrintStringAt (
LocalScreen.RightColumn - gHelpBlockWidth, LocalScreen.RightColumn - gHelpBlockWidth,
Index + TopRow, 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; 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: case CHAR_NULL:
for (Index = 0; Index < mScanCodeNumber; Index++) { for (Index = 0; Index < mScanCodeNumber; Index++) {
if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) { if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {

View File

@ -607,7 +607,7 @@ ProcessOptions (
@param RowCount TRUE: if Question is selected. @param RowCount TRUE: if Question is selected.
**/ **/
VOID UINTN
ProcessHelpString ( ProcessHelpString (
IN CHAR16 *StringPtr, IN CHAR16 *StringPtr,
OUT CHAR16 **FormattedString, OUT CHAR16 **FormattedString,