]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
OvmfPkg/XenPvBlkDxe: fix VS2010 build failures
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / FormDisplay.c
index df0fbfee7c21284f7b059ca23d9878b58323776e..4be8a964641271bf7f0c41e613c7d46d8653caaa 100644 (file)
@@ -2,6 +2,7 @@
 Entry and initialization module for the browser.\r
 \r
 Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<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
@@ -117,6 +118,12 @@ CHAR16            *gFormNotFound;
 CHAR16            *gNoSubmitIf;\r
 CHAR16            *gBrwoserError;\r
 CHAR16            *gSaveFailed;\r
+CHAR16            *gNoSubmitIfFailed;\r
+CHAR16            *gSaveProcess;\r
+CHAR16            *gSaveNoSubmitProcess;\r
+CHAR16            *gDiscardChange;\r
+CHAR16            *gJumpToFormSet;\r
+CHAR16            *gCheckError;\r
 CHAR16            *gPromptForData;\r
 CHAR16            *gPromptForPassword;\r
 CHAR16            *gPromptForNewPassword;\r
@@ -186,6 +193,12 @@ InitializeDisplayStrings (
 {\r
   mUnknownString        = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);\r
   gSaveFailed           = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
+  gNoSubmitIfFailed     = GetToken (STRING_TOKEN (NO_SUBMIT_IF_CHECK_FAILED), gHiiHandle);\r
+  gSaveProcess          = GetToken (STRING_TOKEN (DISCARD_OR_JUMP), gHiiHandle);\r
+  gSaveNoSubmitProcess  = GetToken (STRING_TOKEN (DISCARD_OR_CHECK), gHiiHandle);\r
+  gDiscardChange        = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_DISCARD), gHiiHandle);\r
+  gJumpToFormSet        = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_JUMP), gHiiHandle);\r
+  gCheckError           = GetToken (STRING_TOKEN (DISCARD_OR_CHECK_CHECK), gHiiHandle);\r
   gPromptForData        = GetToken (STRING_TOKEN (PROMPT_FOR_DATA), gHiiHandle);\r
   gPromptForPassword    = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle);\r
   gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle);\r
@@ -216,6 +229,12 @@ FreeDisplayStrings (
   FreePool (mUnknownString);\r
   FreePool (gEmptyString);\r
   FreePool (gSaveFailed);\r
+  FreePool (gNoSubmitIfFailed);\r
+  FreePool (gSaveProcess);\r
+  FreePool (gSaveNoSubmitProcess);\r
+  FreePool (gDiscardChange);\r
+  FreePool (gJumpToFormSet);\r
+  FreePool (gCheckError);\r
   FreePool (gPromptForData);\r
   FreePool (gPromptForPassword);\r
   FreePool (gPromptForNewPassword);\r
@@ -2030,10 +2049,8 @@ UiDisplayMenu (
   UINTN                           TopRow;\r
   UINTN                           BottomRow;\r
   UINTN                           Index;\r
-  UINT16                          Width;\r
   CHAR16                          *StringPtr;\r
   CHAR16                          *OptionString;\r
-  CHAR16                          *OutputString;\r
   CHAR16                          *HelpString;\r
   CHAR16                          *HelpHeaderString;\r
   CHAR16                          *HelpBottomString;\r
@@ -2050,10 +2067,8 @@ UiDisplayMenu (
   UI_MENU_OPTION                  *MenuOption;\r
   UI_MENU_OPTION                  *NextMenuOption;\r
   UI_MENU_OPTION                  *SavedMenuOption;\r
-  UI_MENU_OPTION                  *PreviousMenuOption;\r
   UI_CONTROL_FLAG                 ControlFlag;\r
   UI_SCREEN_OPERATION             ScreenOperation;\r
-  UINT16                          DefaultId;\r
   FORM_DISPLAY_ENGINE_STATEMENT   *Statement;\r
   BROWSER_HOT_KEY                 *HotKey;\r
   UINTN                           HelpPageIndex;\r
@@ -2068,7 +2083,6 @@ UiDisplayMenu (
   UINT16                          BottomLineWidth;\r
   EFI_STRING_ID                   HelpInfo;\r
   UI_EVENT_TYPE                   EventType;\r
-  FORM_DISPLAY_ENGINE_STATEMENT   *InitialHighlight;\r
   BOOLEAN                         SkipHighLight;\r
 \r
   EventType           = UIEventNone;\r
@@ -2079,7 +2093,6 @@ UiDisplayMenu (
   OptionString        = NULL;\r
   ScreenOperation     = UiNoOperation;\r
   NewLine             = TRUE;\r
-  DefaultId           = 0;\r
   HelpPageCount       = 0;\r
   HelpLine            = 0;\r
   RowCount            = 0;\r
@@ -2090,33 +2103,20 @@ UiDisplayMenu (
   EachLineWidth       = 0;\r
   HeaderLineWidth     = 0;\r
   BottomLineWidth     = 0;\r
-  OutputString        = NULL;\r
   UpArrow             = FALSE;\r
   DownArrow           = FALSE;\r
   SkipValue           = 0;\r
   SkipHighLight       = FALSE;\r
 \r
   NextMenuOption      = NULL;\r
-  PreviousMenuOption  = NULL;\r
   SavedMenuOption     = NULL;\r
   HotKey              = NULL;\r
   Repaint             = TRUE;\r
   MenuOption          = NULL;\r
   gModalSkipColumn    = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 6;\r
-  InitialHighlight    = gFormData->HighLightedStatement;\r
 \r
   ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
 \r
-  //\r
-  //  Left                                              right\r
-  //   |<-.->|<-.........->|<- .........->|<-...........->|\r
-  //     Skip    Prompt         Option         Help \r
-  //\r
-  Width             = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3);\r
-  gOptionBlockWidth = Width + 1; \r
-  gHelpBlockWidth   = (CHAR16) (Width - LEFT_SKIPPED_COLUMNS);\r
-  gPromptBlockWidth = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * Width - 1);\r
-\r
   TopRow    = gStatementDimensions.TopRow    + SCROLL_ARROW_HEIGHT;\r
   BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT - 1;\r
 \r
@@ -3208,6 +3208,9 @@ BrowserStatusProcess (
   WARNING_IF_CONTEXT EventContext;\r
   EFI_IFR_OP_HEADER  *OpCodeBuf;\r
   EFI_STRING_ID      StringToken;\r
+  CHAR16             DiscardChange;\r
+  CHAR16             JumpToFormSet;\r
+  CHAR16             *PrintString;\r
 \r
   if (gFormData->BrowserStatus == BROWSER_SUCCESS) {\r
     return;\r
@@ -3263,63 +3266,95 @@ BrowserStatusProcess (
       ErrorInfo = gProtocolNotFound;\r
       break;\r
 \r
+    case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:\r
+      ErrorInfo = gNoSubmitIfFailed;\r
+      break;\r
+\r
     default:\r
       ErrorInfo = gBrwoserError;\r
       break;\r
     }\r
   }\r
 \r
-  if (TimeOut == 0) {\r
+  switch (gFormData->BrowserStatus) {\r
+  case BROWSER_SUBMIT_FAIL:\r
+  case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:\r
+    ASSERT (gUserInput != NULL);\r
+    if (gFormData->BrowserStatus == (BROWSER_SUBMIT_FAIL)) {\r
+      PrintString = gSaveProcess;\r
+      JumpToFormSet = gJumpToFormSet[0];\r
+    } else {\r
+      PrintString = gSaveNoSubmitProcess;\r
+      JumpToFormSet = gCheckError[0];\r
+    }\r
+    DiscardChange = gDiscardChange[0];\r
+\r
     do {\r
-      CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
-    } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-  } else {\r
-    Status = gBS->CreateEvent (EVT_NOTIFY_WAIT, TPL_CALLBACK, EmptyEventProcess, NULL, &TimeOutEvent);\r
-    ASSERT_EFI_ERROR (Status);\r
+      CreateDialog (&Key, gEmptyString, ErrorInfo, PrintString, gEmptyString, NULL);\r
+    } while (((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (DiscardChange | UPPER_LOWER_CASE_OFFSET)) &&\r
+             ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (JumpToFormSet | UPPER_LOWER_CASE_OFFSET)));\r
 \r
-    EventContext.SyncEvent = TimeOutEvent;\r
-    EventContext.TimeOut   = &TimeOut;\r
-    EventContext.ErrorInfo = ErrorInfo;\r
+    if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (DiscardChange | UPPER_LOWER_CASE_OFFSET)) {\r
+      gUserInput->Action = BROWSER_ACTION_DISCARD;\r
+    } else {\r
+      gUserInput->Action = BROWSER_ACTION_GOTO;\r
+    }\r
+    break;\r
 \r
-    Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);\r
-    ASSERT_EFI_ERROR (Status);\r
+  default:\r
+    if (TimeOut == 0) {\r
+      do {\r
+        CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
+      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+    } else {\r
+      Status = gBS->CreateEvent (EVT_NOTIFY_WAIT, TPL_CALLBACK, EmptyEventProcess, NULL, &TimeOutEvent);\r
+      ASSERT_EFI_ERROR (Status);\r
 \r
-    //\r
-    // Show the dialog first to avoid long time not reaction.\r
-    //\r
-    gBS->SignalEvent (RefreshIntervalEvent);\r
+      EventContext.SyncEvent = TimeOutEvent;\r
+      EventContext.TimeOut   = &TimeOut;\r
+      EventContext.ErrorInfo = ErrorInfo;\r
 \r
-    Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND);\r
-    ASSERT_EFI_ERROR (Status);\r
+      Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);\r
+      ASSERT_EFI_ERROR (Status);\r
 \r
-    while (TRUE) {\r
-      Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-      if (!EFI_ERROR (Status) && Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
-        break;\r
-      }\r
+      //\r
+      // Show the dialog first to avoid long time not reaction.\r
+      //\r
+      gBS->SignalEvent (RefreshIntervalEvent);\r
+    \r
+      Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND);\r
+      ASSERT_EFI_ERROR (Status);\r
 \r
-      if (Status != EFI_NOT_READY) {\r
-        continue;\r
-      }\r
+      while (TRUE) {\r
+        Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+        if (!EFI_ERROR (Status) && Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
+          break;\r
+        }\r
 \r
-      WaitList[0] = TimeOutEvent;\r
-      WaitList[1] = gST->ConIn->WaitForKey;\r
+        if (Status != EFI_NOT_READY) {\r
+          continue;\r
+        }\r
 \r
-      Status = gBS->WaitForEvent (2, WaitList, &Index);\r
-      ASSERT_EFI_ERROR (Status);\r
+        WaitList[0] = TimeOutEvent;\r
+        WaitList[1] = gST->ConIn->WaitForKey;\r
 \r
-      if (Index == 0) {\r
-        //\r
-        // Timeout occur, close the hoot time out event.\r
-        //\r
-        break;\r
+        Status = gBS->WaitForEvent (2, WaitList, &Index);\r
+        ASSERT_EFI_ERROR (Status);\r
+\r
+        if (Index == 0) {\r
+          //\r
+          // Timeout occur, close the hoot time out event.\r
+          //\r
+          break;\r
+        }\r
       }\r
+\r
+      gBS->CloseEvent (TimeOutEvent);\r
+      gBS->CloseEvent (RefreshIntervalEvent);\r
     }\r
+    break;\r
   }\r
 \r
-  gBS->CloseEvent (TimeOutEvent);\r
-  gBS->CloseEvent (RefreshIntervalEvent);\r
-\r
   if (StringToken != 0) {\r
     FreePool (ErrorInfo);\r
   }\r
@@ -3357,20 +3392,33 @@ FormDisplay (
   // Process the status info first.\r
   //\r
   BrowserStatusProcess();\r
-  if (UserInputData == NULL) {\r
+  if (gFormData->BrowserStatus != BROWSER_SUCCESS) {\r
     //\r
-    // UserInputData == NULL, means only need to print the error info, return here.\r
+    // gFormData->BrowserStatus != BROWSER_SUCCESS, means only need to print the error info, return here.\r
     //\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  ConvertStatementToMenu();\r
-\r
   Status = DisplayPageFrame (FormData, &gStatementDimensions);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
+  //\r
+  // Global Widths should be initialized before any MenuOption creation\r
+  // or the GetWidth() used in UiAddMenuOption() will return incorrect value.\r
+  //\r
+  //\r
+  //  Left                                              right\r
+  //   |<-.->|<-.........->|<- .........->|<-...........->|\r
+  //     Skip    Prompt         Option         Help \r
+  //\r
+  gOptionBlockWidth = (CHAR16) ((gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn) / 3) + 1;\r
+  gHelpBlockWidth   = (CHAR16) (gOptionBlockWidth - 1 - LEFT_SKIPPED_COLUMNS);\r
+  gPromptBlockWidth = (CHAR16) (gStatementDimensions.RightColumn - gStatementDimensions.LeftColumn - 2 * (gOptionBlockWidth - 1) - 1);\r
+\r
+  ConvertStatementToMenu();\r
+\r
   //\r
   // Check whether layout is changed.\r
   //\r