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

Reply via email to