Revision: 14749
http://sourceforge.net/p/edk2/code/14749
Author: vanjeff
Date: 2013-10-08 06:37:17 +0000 (Tue, 08 Oct 2013)
Log Message:
-----------
Sync patches r14747 and r14748 from main trunk.
1. Fix display engine driver paint some menu error.
2. Fix orderedlist opcode shows abnormal.
Revision Links:
--------------
http://sourceforge.net/p/edk2/code/14747
http://sourceforge.net/p/edk2/code/14748
Modified Paths:
--------------
branches/UDK2010.SR1/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
Modified:
branches/UDK2010.SR1/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
===================================================================
--- branches/UDK2010.SR1/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
2013-10-08 06:26:37 UTC (rev 14748)
+++ branches/UDK2010.SR1/MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
2013-10-08 06:37:17 UTC (rev 14749)
@@ -1578,6 +1578,58 @@
}
/**
+ Check whether this menu can has option string.
+
+ @param MenuOption The menu opton which this attribut used to.
+
+ @retval TRUE This menu option can have option string.
+ @retval FALSE This menu option can't have option string.
+
+**/
+BOOLEAN
+HasOptionString (
+ IN UI_MENU_OPTION *MenuOption
+ )
+{
+ FORM_DISPLAY_ENGINE_STATEMENT *Statement;
+ CHAR16 *String;
+ UINTN Size;
+ EFI_IFR_TEXT *TestOp;
+
+ Size = 0;
+ Statement = MenuOption->ThisTag;
+
+ //
+ // See if the second text parameter is really NULL
+ //
+ if (Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) {
+ TestOp = (EFI_IFR_TEXT *) Statement->OpCode;
+ if (TestOp->TextTwo != 0) {
+ String = GetToken (TestOp->TextTwo, gFormData->HiiHandle);
+ Size = StrLen (String);
+ FreePool (String);
+ }
+ }
+
+ if ((Statement->OpCode->OpCode == EFI_IFR_SUBTITLE_OP) ||
+ (Statement->OpCode->OpCode == EFI_IFR_REF_OP) ||
+ (Statement->OpCode->OpCode == EFI_IFR_PASSWORD_OP) ||
+ (Statement->OpCode->OpCode == EFI_IFR_ACTION_OP) ||
+ (Statement->OpCode->OpCode == EFI_IFR_RESET_BUTTON_OP) ||
+ //
+ // Allow a wide display if text op-code and no secondary text op-code
+ //
+ ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) && (Size == 0))
+ ) {
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/**
Print string for this menu option.
@param MenuOption The menu opton which this attribut used to.
@@ -1607,7 +1659,6 @@
CHAR16 *StringPtr;
CHAR16 *OptionString;
CHAR16 *OutputString;
- UINTN OriginalRow;
UINT16 GlyphWidth;
UINTN Temp;
UINTN Temp2;
@@ -1616,15 +1667,18 @@
UINTN Row;
UINTN Col;
UINTN PromptLineNum;
+ UINTN OptionLineNum;
CHAR16 AdjustValue;
+ UINTN MaxRow;
Statement = MenuOption->ThisTag;
- Col = MenuOption->Col;
- Row = MenuOption->Row;
Temp = SkipLine;
Temp2 = SkipLine;
Temp3 = SkipLine;
- AdjustValue = 0;
+ AdjustValue = 0;
+ PromptLineNum = 0;
+ OptionLineNum = 0;
+ MaxRow = 0;
//
// Set default color.
@@ -1648,8 +1702,9 @@
}
Width = (UINT16) gOptionBlockWidth - 1;
- OriginalRow = Row;
+ Row = MenuOption->Row;
GlyphWidth = 1;
+ OptionLineNum = 0;
for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index,
&OutputString) != 0x0000;) {
if (((Temp2 == 0)) && (Row <= BottomRow)) {
@@ -1674,6 +1729,7 @@
} else {
DisplayMenuString (MenuOption, MenuOption->OptCol, Row,
OutputString, Width + 1, Highlight);
}
+ OptionLineNum++;
}
//
@@ -1689,7 +1745,7 @@
//
// If the difference in rows is greater than or equal to the skip
value, increase the skip value
//
- if ((Row - OriginalRow) >= MenuOption->Skip) {
+ if ((Row - MenuOption->Row) >= MenuOption->Skip) {
MenuOption->Skip++;
}
}
@@ -1701,50 +1757,22 @@
}
}
- Row = OriginalRow;
Highlight = FALSE;
FreePool (OptionString);
}
- Temp2 = 0;
-
//
- // 2. Pre calculate the skip value.
+ // 2. Paint the description.
//
- if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) &&
(((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {
- StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo,
gFormData->HiiHandle);
-
- Width = (UINT16) gOptionBlockWidth - 1;
- OriginalRow = Row;
- GlyphWidth = 1;
- for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index,
&OutputString) != 0x0000;) {
- if (StrLen (&StringPtr[Index]) != 0) {
- Row++;
- if ((Row - OriginalRow) >= MenuOption->Skip) {
- MenuOption->Skip++;
- }
- }
- FreePool (OutputString);
- }
-
- Row = OriginalRow;
- FreePool (StringPtr);
- }
-
-
- //
- // 3. Paint the description.
- //
PromptWidth = GetWidth (Statement, &AdjustValue);
- OriginalRow = Row;
+ Row = MenuOption->Row;
GlyphWidth = 1;
PromptLineNum = 0;
if (MenuOption->Description == NULL || MenuOption->Description[0] == '\0') {
- while (Temp++ < MenuOption->Skip) {
- PrintStringAtWithWidth (BeginCol, Row++, L"", PromptWidth + AdjustValue
+ SkipWidth);
- }
+ PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue +
SkipWidth);
+ PromptLineNum++;
} else {
for (Index = 0; GetLineByWidth (MenuOption->Description, PromptWidth,
&GlyphWidth, &Index, &OutputString) != 0x0000;) {
if ((Temp == 0) && (Row <= BottomRow)) {
@@ -1782,34 +1810,24 @@
}
Highlight = FALSE;
-
- //
- // Clean the empty prompt line.
- // These line is used by option string but not prompt, so clean them here.
- //
- Row = OriginalRow + PromptLineNum;
- while (PromptLineNum + SkipLine < MenuOption->Skip && Row <= BottomRow) {
- PrintStringAtWithWidth (BeginCol, Row, L"", PromptWidth + AdjustValue +
SkipWidth);
- PromptLineNum ++;
- Row ++;
- }
}
- Row = OriginalRow;
//
- // 4. If this is a text op with secondary text information
+ // 3. If this is a text op with secondary text information
//
if ((Statement->OpCode->OpCode == EFI_IFR_TEXT_OP) &&
(((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo != 0)) {
StringPtr = GetToken (((EFI_IFR_TEXT*)Statement->OpCode)->TextTwo,
gFormData->HiiHandle);
Width = (UINT16) gOptionBlockWidth - 1;
- OriginalRow = Row;
+ Row = MenuOption->Row;
GlyphWidth = 1;
+ OptionLineNum = 0;
for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index,
&OutputString) != 0x0000;) {
if ((Temp3 == 0) && (Row <= BottomRow)) {
DisplayMenuString (MenuOption, MenuOption->OptCol, Row, OutputString,
Width + 1, Highlight);
+ OptionLineNum++;
}
//
// If there is more string to process print on the next row and
increment the Skip value
@@ -1825,11 +1843,25 @@
Temp3--;
}
}
-
- Row = OriginalRow;
+
FreePool (StringPtr);
}
+ //
+ // 4.Line number for Option string and prompt string are not equal.
+ // Clean the column whose line number is less.
+ //
+ if (HasOptionString(MenuOption) && (OptionLineNum != PromptLineNum)) {
+ Col = OptionLineNum < PromptLineNum ? MenuOption->OptCol : BeginCol;
+ Row = (OptionLineNum < PromptLineNum ? OptionLineNum : PromptLineNum) +
MenuOption->Row;
+ Width = (UINT16) (OptionLineNum < PromptLineNum ? gOptionBlockWidth :
PromptWidth + AdjustValue + SkipWidth);
+ MaxRow = (OptionLineNum < PromptLineNum ? PromptLineNum : OptionLineNum) +
MenuOption->Row - 1;
+
+ while (Row <= MaxRow) {
+ DisplayMenuString (MenuOption, Col, Row++, L"", Width, FALSE);
+ }
+ }
+
return EFI_SUCCESS;
}
@@ -2044,7 +2076,7 @@
}
if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {
- DisplayOneMenu (MenuOption,
+ Status = DisplayOneMenu (MenuOption,
LEFT_SKIPPED_COLUMNS,
gStatementDimensions.LeftColumn +
gModalSkipColumn,
Link == TopOfScreen ? SkipValue : 0,
@@ -2052,7 +2084,7 @@
(BOOLEAN) ((Link == NewPos) &&
IsSelectable(MenuOption))
);
} else {
- DisplayOneMenu (MenuOption,
+ Status = DisplayOneMenu (MenuOption,
LEFT_SKIPPED_COLUMNS,
gStatementDimensions.LeftColumn,
Link == TopOfScreen ? SkipValue : 0,
@@ -2061,6 +2093,9 @@
);
}
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
//
// 3. Update the row info which will be used by next menu.
//
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits