]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
Bug description:
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / InputHandler.c
index 48f5815e4360de4660e5784389e7a1478c2e9e09..360a6d75ecff552d852d05298d4f1558488aa121 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
 Implementation for handling user input from the User Interfaces.\r
 \r
-Copyright (c) 2004 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\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
 http://opensource.org/licenses/bsd-license.php\r
@@ -12,7 +12,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include "Ui.h"\r
 #include "Setup.h"\r
 \r
 \r
@@ -92,7 +91,7 @@ ReadString (
   //\r
   // Display prompt for string\r
   //\r
-  CreatePopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);\r
+  CreateMultiStringPopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);\r
 \r
   gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
 \r
@@ -271,6 +270,12 @@ GetNumericInput (
   Minimum       = Question->Minimum;\r
   Maximum       = Question->Maximum;\r
 \r
+  //\r
+  // Only two case, user can enter to this function: Enter and +/- case.\r
+  // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT\r
+  //\r
+  ManualInput        = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
+\r
   if ((Question->Operand == EFI_IFR_DATE_OP) || (Question->Operand == EFI_IFR_TIME_OP)) {\r
     DateOrTime = TRUE;\r
   } else {\r
@@ -345,12 +350,6 @@ GetNumericInput (
     }\r
   }\r
 \r
-  if (Step == 0) {\r
-    ManualInput = TRUE;\r
-  } else {\r
-    ManualInput = FALSE;\r
-  }\r
-\r
   if ((Question->Operand == EFI_IFR_NUMERIC_OP) &&\r
       ((Question->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX)) {\r
     HexInput = TRUE;\r
@@ -358,41 +357,96 @@ GetNumericInput (
     HexInput = FALSE;\r
   }\r
 \r
+  //\r
+  // Enter from "Enter" input, clear the old word showing.\r
+  //\r
   if (ManualInput) {\r
-    if (HexInput) {\r
-      InputWidth = Question->StorageWidth * 2;\r
-    } else {\r
-      switch (Question->StorageWidth) {\r
-      case 1:\r
-        InputWidth = 3;\r
-        break;\r
+    if (Question->Operand == EFI_IFR_NUMERIC_OP) {\r
+      if (HexInput) {\r
+        InputWidth = Question->StorageWidth * 2;\r
+      } else {\r
+        switch (Question->StorageWidth) {\r
+        case 1:\r
+          InputWidth = 3;\r
+          break;\r
 \r
-      case 2:\r
-        InputWidth = 5;\r
-        break;\r
+        case 2:\r
+          InputWidth = 5;\r
+          break;\r
 \r
-      case 4:\r
-        InputWidth = 10;\r
-        break;\r
+        case 4:\r
+          InputWidth = 10;\r
+          break;\r
 \r
-      case 8:\r
-        InputWidth = 20;\r
-        break;\r
+        case 8:\r
+          InputWidth = 20;\r
+          break;\r
 \r
-      default:\r
-        InputWidth = 0;\r
-        break;\r
+        default:\r
+          InputWidth = 0;\r
+          break;\r
+        }\r
       }\r
+\r
+      InputText[0] = LEFT_NUMERIC_DELIMITER;\r
+      SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
+      ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH);\r
+      InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
+      InputText[InputWidth + 2] = L'\0';\r
+\r
+      PrintAt (Column, Row, InputText);\r
+      Column++;\r
     }\r
 \r
-    InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-    SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-    ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH); \r
-    InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-    InputText[InputWidth + 2] = L'\0';\r
+    if (Question->Operand == EFI_IFR_DATE_OP) {\r
+      if (MenuOption->Sequence == 2) {\r
+        InputWidth = 4;\r
+      } else {\r
+        InputWidth = 2;\r
+      }\r
+\r
+      if (MenuOption->Sequence == 0) {\r
+        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
+        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
+      } else {\r
+        SetUnicodeMem (InputText, InputWidth, L' ');\r
+      }\r
 \r
-    PrintAt (Column, Row, InputText);\r
-    Column++;\r
+      if (MenuOption->Sequence == 2) {\r
+        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
+      } else {\r
+        InputText[InputWidth + 1] = DATE_SEPARATOR;\r
+      }\r
+      InputText[InputWidth + 2] = L'\0';\r
+\r
+      PrintAt (Column, Row, InputText);\r
+      if (MenuOption->Sequence == 0) {\r
+        Column++;\r
+      }\r
+    }\r
+\r
+    if (Question->Operand == EFI_IFR_TIME_OP) {\r
+      InputWidth = 2;\r
+\r
+      if (MenuOption->Sequence == 0) {\r
+        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
+        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
+      } else {\r
+        SetUnicodeMem (InputText, InputWidth, L' ');\r
+      }\r
+\r
+      if (MenuOption->Sequence == 2) {\r
+        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
+      } else {\r
+        InputText[InputWidth + 1] = TIME_SEPARATOR;\r
+      }\r
+      InputText[InputWidth + 2] = L'\0';\r
+\r
+      PrintAt (Column, Row, InputText);\r
+      if (MenuOption->Sequence == 0) {\r
+        Column++;\r
+      }\r
+    }\r
   }\r
 \r
   //\r
@@ -426,7 +480,7 @@ TheKey2:
       switch (Key.ScanCode) {\r
       case SCAN_LEFT:\r
       case SCAN_RIGHT:\r
-        if (DateOrTime) {\r
+        if (DateOrTime && !ManualInput) {\r
           //\r
           // By setting this value, we will return back to the caller.\r
           // We need to do this since an auto-refresh will destroy the adjustment\r
@@ -436,7 +490,7 @@ TheKey2:
           gDirection = SCAN_DOWN;\r
         }\r
 \r
-        if (!ManualInput) {\r
+        if ((Step != 0) && !ManualInput) {\r
           if (Key.ScanCode == SCAN_LEFT) {\r
             if (EditValue > Step) {\r
               EditValue = EditValue - Step;\r
@@ -456,25 +510,29 @@ TheKey2:
               //\r
               // Year\r
               //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", EditValue);\r
+              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);\r
             } else {\r
               //\r
               // Month/Day\r
               //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", EditValue);\r
+              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
             }\r
 \r
             if (MenuOption->Sequence == 0) {\r
+              ASSERT (EraseLen >= 2);\r
               FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
             } else if (MenuOption->Sequence == 1) {\r
+              ASSERT (EraseLen >= 1);\r
               FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
             }\r
           } else if (Question->Operand == EFI_IFR_TIME_OP) {\r
-            UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", EditValue);\r
+            UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
 \r
             if (MenuOption->Sequence == 0) {\r
+              ASSERT (EraseLen >= 2);\r
               FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
             } else if (MenuOption->Sequence == 1) {\r
+              ASSERT (EraseLen >= 1);\r
               FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
             }\r
           } else {\r
@@ -482,11 +540,11 @@ TheKey2:
             PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
           }\r
 \r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
           for (Loop = 0; Loop < EraseLen; Loop++) {\r
             PrintAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
           }\r
-          gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_HIGHLIGHT | FIELD_BACKGROUND_HIGHLIGHT);\r
+          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));\r
 \r
           if (MenuOption->Sequence == 0) {\r
             PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
@@ -605,7 +663,13 @@ EnterCarriageReturn:
     default:\r
       if (ManualInput) {\r
         if (HexInput) {\r
-          if (!IsHexDigit (&Digital, Key.UnicodeChar)) {\r
+          if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'0');\r
+          } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);\r
+          } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);\r
+          } else {\r
             UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE);\r
             break;\r
           }\r
@@ -701,6 +765,7 @@ GetSelectionInputPopUp (
   LIST_ENTRY              *Link;\r
   BOOLEAN                 OrderedList;\r
   UINT8                   *ValueArray;\r
+  UINT8                   ValueType;\r
   EFI_HII_VALUE           HiiValue;\r
   EFI_HII_VALUE           *HiiValueArray;\r
   UINTN                   OptionCount;\r
@@ -711,6 +776,7 @@ GetSelectionInputPopUp (
   DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
 \r
   ValueArray        = NULL;\r
+  ValueType         = 0;\r
   CurrentOption     = NULL;\r
   ShowDownArrow     = FALSE;\r
   ShowUpArrow       = FALSE;\r
@@ -721,6 +787,7 @@ GetSelectionInputPopUp (
   Question = MenuOption->ThisTag;\r
   if (Question->Operand == EFI_IFR_ORDERED_LIST_OP) {\r
     ValueArray = Question->BufferValue;\r
+    ValueType = Question->ValueType;\r
     OrderedList = TRUE;\r
   } else {\r
     OrderedList = FALSE;\r
@@ -731,7 +798,7 @@ GetSelectionInputPopUp (
   //\r
   if (OrderedList) {\r
     for (Index = 0; Index < Question->MaxContainers; Index++) {\r
-      if (ValueArray[Index] == 0) {\r
+      if (GetArrayData (ValueArray, ValueType, Index) == 0) {\r
         break;\r
       }\r
     }\r
@@ -757,8 +824,8 @@ GetSelectionInputPopUp (
   Link = GetFirstNode (&Question->OptionListHead);\r
   for (Index = 0; Index < OptionCount; Index++) {\r
     if (OrderedList) {\r
-      HiiValueArray[Index].Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
-      HiiValueArray[Index].Value.u8 = ValueArray[Index];\r
+      HiiValueArray[Index].Type = ValueType;\r
+      HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
     } else {\r
       OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
       CopyMem (&HiiValueArray[Index], &OneOfOption->Value, sizeof (EFI_HII_VALUE));\r
@@ -1054,11 +1121,11 @@ TheKey:
         // Restore link list order for orderedlist\r
         //\r
         if (OrderedList) {\r
-          HiiValue.Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
+          HiiValue.Type = ValueType;\r
           HiiValue.Value.u64 = 0;\r
           for (Index = 0; Index < Question->MaxContainers; Index++) {\r
-            HiiValue.Value.u8 = ValueArray[Index];\r
-            if (HiiValue.Value.u8 != 0) {\r
+            HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
+            if (HiiValue.Value.u64 == 0) {\r
               break;\r
             }\r
 \r
@@ -1091,7 +1158,7 @@ TheKey:
         while (!IsNull (&Question->OptionListHead, Link)) {\r
           OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
 \r
-          Question->BufferValue[Index] = OneOfOption->Value.Value.u8;\r
+          SetArrayData (ValueArray, ValueType, Index, OneOfOption->Value.Value.u64);\r
 \r
           Index++;\r
           if (Index > Question->MaxContainers) {\r