+ //\r
+ // Compute the starting row and starting column for the popup\r
+ //\r
+ Row = (Rows - (NumberOfLines + 3)) / 2;\r
+ Column = (Columns - (MaxLength + 2)) / 2;\r
+\r
+ //\r
+ // Allocate a buffer for a single line of the popup with borders and a Null-terminator\r
+ //\r
+ Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));\r
+ ASSERT (Line != NULL);\r
+\r
+ //\r
+ // Draw top of popup box \r
+ //\r
+ SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+ Line[0] = BOXDRAW_DOWN_RIGHT;\r
+ Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+\r
+ //\r
+ // Draw middle of the popup with strings\r
+ //\r
+ VA_START (Args, FirstString);\r
+ String = FirstString;\r
+ while ((String != NULL) && (NumberOfLines > 0)) {\r
+ Length = StrLen (String);\r
+ SetMem16 (Line, (MaxLength + 2) * 2, L' ');\r
+ if (Length <= MaxLength) {\r
+ //\r
+ // Length <= MaxLength\r
+ //\r
+ CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));\r
+ } else {\r
+ //\r
+ // Length > MaxLength\r
+ //\r
+ CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));\r
+ }\r
+ Line[0] = BOXDRAW_VERTICAL;\r
+ Line[MaxLength + 1] = BOXDRAW_VERTICAL;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+ String = VA_ARG (Args, CHAR16 *);\r
+ NumberOfLines--;\r
+ }\r
+ VA_END (Args);\r
+\r
+ //\r
+ // Draw bottom of popup box\r
+ //\r
+ SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+ Line[0] = BOXDRAW_UP_RIGHT;\r
+ Line[MaxLength + 1] = BOXDRAW_UP_LEFT;\r
+ Line[MaxLength + 2] = L'\0';\r
+ ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+ ConOut->OutputString (ConOut, Line);\r
+\r
+ //\r
+ // Free the allocated line buffer\r
+ //\r
+ FreePool (Line);\r
+\r
+ //\r
+ // Restore the cursor visibility, position, and attributes\r
+ //\r
+ ConOut->EnableCursor (ConOut, SavedConsoleMode.CursorVisible);\r
+ ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);\r
+ ConOut->SetAttribute (ConOut, SavedConsoleMode.Attribute);\r
+\r
+ //\r
+ // Wait for a keystroke\r
+ //\r
+ if (Key != NULL) {\r
+ gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
+ gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
+ }\r