]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
Bug description:
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Ui.c
index a77d4a9e02de6c90cbfd1eec42de228ef619abaa..553c2546b29a172a6d7d307eee95be094d1b8de4 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Utility functions for User Interface functions.\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -341,8 +341,8 @@ RefreshForm (
   UI_MENU_SELECTION               *Selection;\r
   FORM_BROWSER_STATEMENT          *Question;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
-  EFI_HII_VALUE                   *HiiValue;\r
   EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
+  CHAR16                          *PadString;\r
 \r
   if (gMenuRefreshHead != NULL) {\r
 \r
@@ -374,6 +374,11 @@ RefreshForm (
         for (Index = 0; OptionString[Index] == L' '; Index++)\r
           ;\r
 \r
+        PadString = AllocatePool (gOptionBlockWidth * sizeof (CHAR16));\r
+        SetMem16 (PadString, (gOptionBlockWidth - 1) * sizeof (CHAR16), CHAR_SPACE);\r
+        PadString[gOptionBlockWidth - 1] = 0;\r
+        PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, PadString);\r
+        FreePool (PadString);\r
         PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, &OptionString[Index]);\r
         FreePool (OptionString);\r
       }\r
@@ -384,31 +389,14 @@ RefreshForm (
       ConfigAccess = Selection->FormSet->ConfigAccess;\r
       if (((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) && (ConfigAccess != NULL)) {\r
         ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-\r
-        HiiValue = &Question->HiiValue;\r
-        if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
-          //\r
-          // Create String in HII database for Configuration Driver to retrieve\r
-          //\r
-          HiiValue->Value.string = NewString ((CHAR16 *) Question->BufferValue, Selection->FormSet->HiiHandle);\r
-        }\r
-\r
         Status = ConfigAccess->Callback (\r
                                  ConfigAccess,\r
                                  EFI_BROWSER_ACTION_CHANGING,\r
                                  Question->QuestionId,\r
-                                 HiiValue->Type,\r
-                                 &HiiValue->Value,\r
+                                 Question->HiiValue.Type,\r
+                                 &Question->HiiValue.Value,\r
                                  &ActionRequest\r
                                  );\r
-\r
-        if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
-          //\r
-          // Clean the String in HII Database\r
-          //\r
-          DeleteString (HiiValue->Value.string, Selection->FormSet->HiiHandle);\r
-        }\r
-\r
         if (!EFI_ERROR (Status)) {\r
           switch (ActionRequest) {\r
           case EFI_BROWSER_ACTION_REQUEST_RESET:\r
@@ -1029,7 +1017,7 @@ UpdateStatusBar (
         );\r
       mInputError = TRUE;\r
     } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_HIGHLIGHT);\r
+      gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));\r
       for (Index = 0; Index < (GetStringWidth (InputErrorMessage) - 2) / 2; Index++) {\r
         PrintAt (gScreenDimensions.LeftColumn + gPromptBlockWidth + Index, gScreenDimensions.BottomRow - 1, L"  ");\r
       }\r
@@ -1051,7 +1039,7 @@ UpdateStatusBar (
 \r
         gNvUpdateRequired = TRUE;\r
       } else {\r
-        gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_HIGHLIGHT);\r
+        gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));\r
         for (Index = 0; Index < (GetStringWidth (NvUpdateMessage) - 2) / 2; Index++) {\r
           PrintAt (\r
             (gScreenDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + Index),\r
@@ -1134,7 +1122,7 @@ GetWidth (
     Width -= SUBTITLE_INDENT;\r
   }\r
 \r
-  return Width - LEFT_SKIPPED_COLUMNS;\r
+  return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
 }\r
 \r
 /**\r
@@ -1783,7 +1771,7 @@ UiDisplayMenu (
           LocalScreen.RightColumn,\r
           TopRow - SCROLL_ARROW_HEIGHT,\r
           BottomRow + SCROLL_ARROW_HEIGHT,\r
-          FIELD_TEXT | FIELD_BACKGROUND\r
+          PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND\r
           );\r
 \r
         UiFreeRefreshList ();\r
@@ -1804,13 +1792,26 @@ UiDisplayMenu (
             gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);\r
           } else {\r
             if (Statement->Operand == EFI_IFR_SUBTITLE_OP) {\r
-              gST->ConOut->SetAttribute (gST->ConOut, SUBTITLE_TEXT | FIELD_BACKGROUND);\r
+              gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);\r
             }\r
           }\r
 \r
           Width       = GetWidth (Statement, MenuOption->Handle);\r
           OriginalRow = Row;\r
 \r
+          if (Statement->Operand == EFI_IFR_REF_OP && \r
+            MenuOption->Col >= 2) {\r
+            //\r
+            // Print Arrow for Goto button.\r
+            //\r
+            PrintAt (\r
+              MenuOption->Col - 2,\r
+              Row,\r
+              L"%c",\r
+              GEOMETRICSHAPE_RIGHT_TRIANGLE\r
+              );\r
+          }\r
+\r
           for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &Index, &OutputString) != 0x0000;) {\r
             if ((Temp == 0) && (Row <= BottomRow)) {\r
               PrintStringAt (MenuOption->Col, Row, OutputString);\r
@@ -1880,7 +1881,11 @@ UiDisplayMenu (
                 MenuRefreshEntry->Selection         = Selection;\r
                 MenuRefreshEntry->CurrentColumn     = MenuOption->OptCol;\r
                 MenuRefreshEntry->CurrentRow        = MenuOption->Row;\r
-                MenuRefreshEntry->CurrentAttribute  = FIELD_TEXT | FIELD_BACKGROUND;\r
+                if (MenuOption->GrayOut) {\r
+                  MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
+                } else {               \r
+                  MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
+                }\r
                 gMenuRefreshHead                    = MenuRefreshEntry;\r
               } else {\r
                 //\r
@@ -1898,7 +1903,11 @@ UiDisplayMenu (
                 MenuRefreshEntry->Selection         = Selection;\r
                 MenuRefreshEntry->CurrentColumn     = MenuOption->OptCol;\r
                 MenuRefreshEntry->CurrentRow        = MenuOption->Row;\r
-                MenuRefreshEntry->CurrentAttribute  = FIELD_TEXT | FIELD_BACKGROUND;\r
+                if (MenuOption->GrayOut) {\r
+                  MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
+                } else {               \r
+                  MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
+                }\r
               }\r
             }\r
 \r
@@ -1980,7 +1989,7 @@ UiDisplayMenu (
             Row = OriginalRow;\r
             FreePool (StringPtr);\r
           }\r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
 \r
           //\r
           // Need to handle the bottom of the display\r
@@ -2014,7 +2023,7 @@ UiDisplayMenu (
             L"%c",\r
             ARROW_UP\r
             );\r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
         }\r
 \r
         if (DownArrow) {\r
@@ -2025,7 +2034,7 @@ UiDisplayMenu (
             L"%c",\r
             ARROW_DOWN\r
             );\r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
         }\r
 \r
         MenuOption = NULL;\r
@@ -2101,7 +2110,7 @@ UiDisplayMenu (
           //\r
           gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
           ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
           if (OptionString != NULL) {\r
             if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) ||\r
                 (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)\r
@@ -2145,7 +2154,7 @@ UiDisplayMenu (
               if (MenuOption->GrayOut) {\r
                 gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);\r
               } else if (MenuOption->ThisTag->Operand == EFI_IFR_SUBTITLE_OP) {\r
-                gST->ConOut->SetAttribute (gST->ConOut, SUBTITLE_TEXT | FIELD_BACKGROUND);\r
+                gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);\r
               }\r
 \r
               OriginalRow = MenuOption->Row;\r
@@ -2166,7 +2175,7 @@ UiDisplayMenu (
               }\r
 \r
               MenuOption->Row = OriginalRow;\r
-              gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+              gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
             }\r
           }\r
         }\r
@@ -2196,7 +2205,7 @@ UiDisplayMenu (
         //\r
         // Set reverse attribute\r
         //\r
-        gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_HIGHLIGHT | FIELD_BACKGROUND_HIGHLIGHT);\r
+        gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));\r
         gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
 \r
         //\r
@@ -2206,9 +2215,13 @@ UiDisplayMenu (
         //\r
         if (gMenuRefreshHead != NULL) {\r
           for (MenuRefreshEntry = gMenuRefreshHead; MenuRefreshEntry != NULL; MenuRefreshEntry = MenuRefreshEntry->Next) {\r
-            MenuRefreshEntry->CurrentAttribute = FIELD_TEXT | FIELD_BACKGROUND;\r
+            if (MenuRefreshEntry->MenuOption->GrayOut) {\r
+              MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
+            } else {               \r
+              MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
+            }\r
             if (MenuRefreshEntry->MenuOption == MenuOption) {\r
-              MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_HIGHLIGHT | FIELD_BACKGROUND_HIGHLIGHT;\r
+              MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);\r
             }\r
           }\r
         }\r
@@ -2280,7 +2293,7 @@ UiDisplayMenu (
         //\r
         // Clear reverse attribute\r
         //\r
-        gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+        gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
       }\r
       //\r
       // Repaint flag will be used when process CfUpdateHelpString, so restore its value\r
@@ -2400,6 +2413,8 @@ UiDisplayMenu (
             //\r
             Repaint = TRUE;\r
             NewLine = TRUE;\r
+          } else {\r
+            Selection->Action = UI_ACTION_REFRESH_FORM;\r
           }\r
           if (OptionString != NULL) {\r
             FreePool (OptionString);\r
@@ -2501,10 +2516,7 @@ UiDisplayMenu (
 \r
       ASSERT(MenuOption != NULL);\r
       Statement = MenuOption->ThisTag;\r
-      if ((Statement->Operand == EFI_IFR_TEXT_OP) ||\r
-          (Statement->Operand == EFI_IFR_DATE_OP) ||\r
-          (Statement->Operand == EFI_IFR_TIME_OP) ||\r
-          (Statement->Operand == EFI_IFR_NUMERIC_OP && Statement->Step != 0)) {\r
+      if (Statement->Operand == EFI_IFR_TEXT_OP) {\r
         break;\r
       }\r
 \r
@@ -2824,7 +2836,8 @@ UiDisplayMenu (
         // checking can be done.\r
         //\r
         DistanceValue += AdjustDateAndTimePosition (TRUE, &NewPos);\r
-\r
+        \r
+        ASSERT (MenuOption != NULL);\r
         if (Difference < 0) {\r
           //\r
           // We want to goto previous MenuOption, but finally we go down.\r
@@ -3152,6 +3165,7 @@ UiDisplayMenu (
         // Show NV update flag on status bar\r
         //\r
         gNvUpdateRequired = TRUE;\r
+        gResetRequired = TRUE;\r
       }\r
       break;\r
 \r