]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / CustomizedDisplayLib / CustomizedDisplayLib.c
index aa28146b0255405b8c846870e7d0fd53c4e824d2..e97a2b94e96a9f3f2ae302ad9e844bac5cb600c9 100644 (file)
@@ -2,14 +2,8 @@
 \r
   This library class defines a set of interfaces to customize Display module\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed and made available under \r
-the terms and conditions of the BSD License that accompanies this distribution.  \r
-The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php.                                            \r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include "CustomizedDisplayLibInternal.h"\r
@@ -44,14 +38,14 @@ Statement
 **/\r
 \r
 /**\r
-  This funtion defines Page Frame and Backgroud. \r
-  \r
-  Based on the above layout, it will be responsible for HeaderHeight, FooterHeight, \r
-  StatusBarHeight and Backgroud. And, it will reserve Screen for Statement. \r
+  This funtion defines Page Frame and Backgroud.\r
+\r
+  Based on the above layout, it will be responsible for HeaderHeight, FooterHeight,\r
+  StatusBarHeight and Backgroud. And, it will reserve Screen for Statement.\r
 \r
   @param[in]  FormData             Form Data to be shown in Page.\r
   @param[out] ScreenForStatement   Screen to be used for Statement. (Prompt, Value and Help)\r
-  \r
+\r
   @return Status\r
 **/\r
 EFI_STATUS\r
@@ -120,8 +114,8 @@ DisplayPageFrame (
   This function updates customized key panel's help information.\r
   The library will prepare those Strings for the basic key, ESC, Enter, Up/Down/Left/Right, +/-.\r
   and arrange them in Footer panel.\r
-  \r
-  @param[in]  FormData       Form Data to be shown in Page. FormData has the highlighted statement. \r
+\r
+  @param[in]  FormData       Form Data to be shown in Page. FormData has the highlighted statement.\r
   @param[in]  Statement      The statement current selected.\r
   @param[in]  Selected       Whether or not a tag be selected. TRUE means Enter has hit this question.\r
 **/\r
@@ -135,7 +129,6 @@ RefreshKeyHelp (
 {\r
   UINTN                  SecCol;\r
   UINTN                  ThdCol;\r
-  UINTN                  LeftColumnOfHelp;\r
   UINTN                  RightColumnOfHelp;\r
   UINTN                  TopRowOfHelp;\r
   UINTN                  BottomRowOfHelp;\r
@@ -144,6 +137,12 @@ RefreshKeyHelp (
   EFI_IFR_DATE           *DateOp;\r
   EFI_IFR_TIME           *TimeOp;\r
   BOOLEAN                HexDisplay;\r
+  UINTN                  ColumnWidth1;\r
+  UINTN                  ColumnWidth2;\r
+  UINTN                  ColumnWidth3;\r
+  CHAR16                 *ColumnStr1;\r
+  CHAR16                 *ColumnStr2;\r
+  CHAR16                 *ColumnStr3;\r
 \r
   ASSERT (FormData != NULL);\r
   if (FormData == NULL) {\r
@@ -159,19 +158,40 @@ RefreshKeyHelp (
   SecCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3;\r
   ThdCol            = gScreenDimensions.LeftColumn + (gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn) / 3 * 2;\r
 \r
+  //\r
+  // + 2 means leave 1 space before the first hotkey info.\r
+  //\r
   StartColumnOfHelp = gScreenDimensions.LeftColumn + 2;\r
-  LeftColumnOfHelp  = gScreenDimensions.LeftColumn + 1;\r
-  RightColumnOfHelp = gScreenDimensions.RightColumn - 2;\r
+  RightColumnOfHelp = gScreenDimensions.RightColumn - 1;\r
   TopRowOfHelp      = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
   BottomRowOfHelp   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
 \r
-  ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
+  ColumnWidth1      = SecCol - StartColumnOfHelp;\r
+  ColumnWidth2      = ThdCol - SecCol;\r
+  ColumnWidth3      = RightColumnOfHelp - ThdCol;\r
+  ColumnStr1        = gLibEmptyString;\r
+  ColumnStr2        = gLibEmptyString;\r
+  ColumnStr3        = gLibEmptyString;\r
+\r
+  //\r
+  // Clean the space at gScreenDimensions.LeftColumn + 1.\r
+  //\r
+  PrintStringAtWithWidth (StartColumnOfHelp - 1, BottomRowOfHelp, gLibEmptyString, 1);\r
+  PrintStringAtWithWidth (StartColumnOfHelp - 1, TopRowOfHelp, gLibEmptyString, 1);\r
+\r
   if (Statement == NULL) {\r
     //\r
     // Print Key for Form without showable statement.\r
     //\r
-    PrintHotKeyHelpString (FormData);\r
-    PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gLibEmptyString, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
+      ColumnStr3 = gEscapeString;\r
+    }\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
+\r
     return;\r
   }\r
 \r
@@ -188,7 +208,7 @@ RefreshKeyHelp (
   } else if (Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {\r
     TimeOp  = (EFI_IFR_TIME *) Statement->OpCode;\r
     HexDisplay = (TimeOp->Flags & EFI_IFR_DISPLAY_UINT_HEX) == EFI_IFR_DISPLAY_UINT_HEX;\r
-  }  \r
+  }\r
   switch (Statement->OpCode->OpCode) {\r
   case EFI_IFR_ORDERED_LIST_OP:\r
   case EFI_IFR_ONE_OF_OP:\r
@@ -196,16 +216,17 @@ RefreshKeyHelp (
   case EFI_IFR_TIME_OP:\r
   case EFI_IFR_DATE_OP:\r
     if (!Selected) {\r
-        PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
       if ((Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
         PrintAt (\r
-          0, \r
+          ColumnWidth1,\r
           StartColumnOfHelp,\r
           BottomRowOfHelp,\r
           L"%c%c%c%c%s",\r
@@ -215,51 +236,55 @@ RefreshKeyHelp (
           ARROW_LEFT,\r
           gMoveHighlight\r
           );\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber, ColumnWidth1);\r
       } else {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
         if (Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP && NumericOp != NULL && LibGetFieldFromNum(Statement->OpCode) != 0) {\r
-          PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gAdjustNumber);\r
-        } \r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+          ColumnStr1 = gAdjustNumber;\r
+        }\r
+        PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+        PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterString, ColumnWidth2);\r
       }\r
     } else {\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gEnterCommitString, ColumnWidth2);\r
 \r
       //\r
       // If it is a selected numeric with manual input, display different message\r
       //\r
-      if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) || \r
+      if ((Statement->OpCode->OpCode == EFI_IFR_NUMERIC_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_DATE_OP) ||\r
           (Statement->OpCode->OpCode == EFI_IFR_TIME_OP)) {\r
-        PrintStringAt (\r
-          SecCol,\r
-          TopRowOfHelp,\r
-          HexDisplay ? gHexNumericInput : gDecNumericInput\r
-          );\r
-      } else if (Statement->OpCode->OpCode != EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+        ColumnStr2 = HexDisplay ? gHexNumericInput : gDecNumericInput;\r
+        PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, gLibEmptyString, ColumnWidth1);\r
+      } else {\r
+        PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       }\r
 \r
       if (Statement->OpCode->OpCode == EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
+        ColumnStr1 = gPlusString;\r
+        ColumnStr3 = gMinusString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (ThdCol, TopRowOfHelp, ColumnStr3, ColumnWidth3);\r
+      PrintStringAtWithWidth (SecCol, TopRowOfHelp, ColumnStr2, ColumnWidth2);\r
 \r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, gEnterEscapeString, ColumnWidth3);\r
     }\r
     break;\r
 \r
   case EFI_IFR_CHECKBOX_OP:\r
-    PrintHotKeyHelpString (FormData);\r
+    PrintHotKeyHelpString (FormData, TRUE);\r
 \r
     if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+      ColumnStr3 = gEscapeString;\r
     }\r
+    PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-    PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
+    PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+    PrintStringAtWithWidth (SecCol, BottomRowOfHelp, gToggleCheckBox, ColumnWidth2);\r
+    PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, gLibEmptyString, ColumnWidth1);\r
     break;\r
 \r
   case EFI_IFR_REF_OP:\r
@@ -270,40 +295,44 @@ RefreshKeyHelp (
   case EFI_IFR_RESET_BUTTON_OP:\r
   case EFI_IFR_SUBTITLE_OP:\r
      if (!Selected) {\r
-      PrintHotKeyHelpString (FormData);\r
+      PrintHotKeyHelpString (FormData, TRUE);\r
 \r
       if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
+        ColumnStr3 = gEscapeString;\r
       }\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
 \r
-      PrintAt (0, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
+      PrintAt (ColumnWidth1, StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
       if (Statement->OpCode->OpCode != EFI_IFR_TEXT_OP && Statement->OpCode->OpCode != EFI_IFR_SUBTITLE_OP) {\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
+        ColumnStr2 = gEnterString;\r
       }\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
     } else {\r
-      if (Statement->OpCode->OpCode  != EFI_IFR_REF_OP) {\r
-        PrintStringAt (\r
-          (gScreenDimensions.RightColumn - LibGetStringWidth (gEnterCommitString) / 2) / 2,\r
-          BottomRowOfHelp,\r
-          gEnterCommitString\r
-          );\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEnterEscapeString);\r
+      PrintHotKeyHelpString (FormData, FALSE);\r
+      if (Statement->OpCode->OpCode != EFI_IFR_REF_OP) {\r
+        ColumnStr2 = gEnterCommitString;\r
+        ColumnStr3 = gEnterEscapeString;\r
       }\r
+      PrintStringAtWithWidth (StartColumnOfHelp, TopRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (StartColumnOfHelp, BottomRowOfHelp, ColumnStr1, ColumnWidth1);\r
+      PrintStringAtWithWidth (SecCol, BottomRowOfHelp, ColumnStr2, ColumnWidth2);\r
+      PrintStringAtWithWidth (ThdCol, BottomRowOfHelp, ColumnStr3, ColumnWidth3);\r
     }\r
     break;\r
 \r
   default:\r
     break;\r
-  }  \r
+  }\r
 }\r
 \r
 /**\r
   Update status bar.\r
 \r
-  This function updates the status bar on the bottom of menu screen. It just shows StatusBar. \r
+  This function updates the status bar on the bottom of menu screen. It just shows StatusBar.\r
   Original logic in this function should be splitted out.\r
 \r
-  @param[in]  MessageType            The type of message to be shown. InputError or Configuration Changed. \r
+  @param[in]  MessageType            The type of message to be shown. InputError or Configuration Changed.\r
   @param[in]  State                  Show or Clear Message.\r
 **/\r
 VOID\r
@@ -360,17 +389,17 @@ UpdateStatusBar (
 \r
   default:\r
     break;\r
-  } \r
+  }\r
 }\r
 \r
 /**\r
-  Create popup window. It will replace CreateDialog(). \r
+  Create popup window. It will replace CreateDialog().\r
 \r
   This function draws OEM/Vendor specific pop up windows.\r
 \r
   @param[out]  Key    User Input Key\r
   @param       ...    String to be shown in Popup. The variable argument list is terminated by a NULL.\r
-  \r
+\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -395,6 +424,7 @@ CreateDialog (
   UINTN   DimensionsWidth;\r
   UINTN   DimensionsHeight;\r
   UINTN   CurrentAttribute;\r
+  BOOLEAN CursorVisible;\r
 \r
   //\r
   // If screen dimension info is not ready, get it from console.\r
@@ -417,18 +447,19 @@ CreateDialog (
   VA_START (Marker, Key);\r
   while  ((String = VA_ARG (Marker, CHAR16 *)) != NULL) {\r
     LineNum ++;\r
-    \r
+\r
     if ((LibGetStringWidth (String) / 2) > LargestString) {\r
       LargestString = (LibGetStringWidth (String) / 2);\r
     }\r
-  } \r
+  }\r
   VA_END (Marker);\r
 \r
   if ((LargestString + 2) > DimensionsWidth) {\r
     LargestString = DimensionsWidth - 2;\r
   }\r
-  \r
-  CurrentAttribute  = gST->ConOut->Mode->Attribute;  \r
+\r
+  CurrentAttribute  = gST->ConOut->Mode->Attribute;\r
+  CursorVisible     = gST->ConOut->Mode->CursorVisible;\r
   gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
   gST->ConOut->SetAttribute (gST->ConOut, GetPopupColor ());\r
 \r
@@ -510,12 +541,12 @@ CreateDialog (
   }\r
 \r
   gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
+  gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
 }\r
 \r
 /**\r
-  Confirm how to handle the changed data. \r
-  \r
+  Confirm how to handle the changed data.\r
+\r
   @return Action BROWSER_ACTION_SUBMIT, BROWSER_ACTION_DISCARD or other values.\r
 **/\r
 UINTN\r
@@ -529,10 +560,10 @@ ConfirmDataChange (
   EFI_INPUT_KEY           Key;\r
 \r
   gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-  \r
+\r
   YesResponse = gYesResponse[0];\r
   NoResponse  = gNoResponse[0];\r
-  \r
+\r
   //\r
   // If NV flag is up, prompt user\r
   //\r
@@ -544,7 +575,7 @@ ConfirmDataChange (
     ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
     ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
   );\r
-  \r
+\r
   if (Key.ScanCode == SCAN_ESC) {\r
     return BROWSER_ACTION_NONE;\r
   } else if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
@@ -557,7 +588,7 @@ ConfirmDataChange (
 /**\r
   OEM specifies whether Setup exits Page by ESC key.\r
 \r
-  This function customized the behavior that whether Setup exits Page so that \r
+  This function customized the behavior that whether Setup exits Page so that\r
   system able to boot when configuration is not changed.\r
 \r
   @retval  TRUE     Exits FrontPage\r
@@ -573,14 +604,14 @@ FormExitPolicy (
 }\r
 \r
 /**\r
-  Set Timeout value for a ceratain Form to get user response. \r
-  \r
+  Set Timeout value for a ceratain Form to get user response.\r
+\r
   This function allows to set timeout value on a ceratain form if necessary.\r
-  If timeout is not zero, the form will exit if user has no response in timeout. \r
-  \r
+  If timeout is not zero, the form will exit if user has no response in timeout.\r
+\r
   @param[in]  FormData   Form Data to be shown in Page\r
 \r
-  @return 0     No timeout for this form. \r
+  @return 0     No timeout for this form.\r
   @return > 0   Timeout value in 100 ns units.\r
 **/\r
 UINT64\r
@@ -641,7 +672,7 @@ PrintStringAtWithWidth (
 }\r
 \r
 /**\r
-  Prints a chracter to the default console, at\r
+  Prints a character to the default console, at\r
   the supplied cursor position, using L"%c" format.\r
 \r
   @param  Column     The cursor position to print the string at. When it is -1, use current Position.\r
@@ -861,7 +892,7 @@ GetSubTitleTextColor (
   Clear Screen to the initial state.\r
 **/\r
 VOID\r
-EFIAPI \r
+EFIAPI\r
 ClearDisplayPage (\r
   VOID\r
   )\r
@@ -913,7 +944,7 @@ CustomizedDisplayLibDestructor (
   )\r
 {\r
   HiiRemovePackages(mCDLStringPackHandle);\r
-  \r
+\r
   FreeLibStrings ();\r
 \r
   return EFI_SUCCESS;\r