2 Copyright (c) 2004 - 2007, Intel Corporation
3 All rights reserved. This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 Some presentation routines.
24 BOOLEAN mHiiPackageListUpdated
;
25 UI_MENU_SELECTION
*gCurrentSelection
;
29 Clear retangle with specified text attribute.
31 @param LeftColumn Left column of retangle.
32 @param RightColumn Right column of retangle.
33 @param TopRow Start row of retangle.
34 @param BottomRow End row of retangle.
35 @param TextAttribute The character foreground and background.
53 // For now, allocate an arbitrarily long buffer
55 Buffer
= AllocateZeroPool (0x10000);
56 ASSERT (Buffer
!= NULL
);
59 // Set foreground and background as defined
61 gST
->ConOut
->SetAttribute (gST
->ConOut
, TextAttribute
);
64 // Much faster to buffer the long string instead of print it a character at a time
66 SetUnicodeMem (Buffer
, RightColumn
- LeftColumn
, L
' ');
69 // Clear the desired area with the appropriate foreground/background
71 for (Row
= TopRow
; Row
<= BottomRow
; Row
++) {
72 PrintStringAt (LeftColumn
, Row
, Buffer
);
75 gST
->ConOut
->SetCursorPosition (gST
->ConOut
, LeftColumn
, TopRow
);
77 gBS
->FreePool (Buffer
);
89 for (Length
= 0; Destination
[Length
] != 0; Length
++)
93 // We now have the length of the original string
94 // We can safely assume for now that we are concatenating a narrow value to this string.
95 // For instance, the string is "XYZ" and cat'ing ">"
96 // If this assumption changes, we need to make this routine a bit more complex
98 Destination
[Length
] = NARROW_CHAR
;
101 StrCpy (Destination
+ Length
, Source
);
111 UINTN IncrementValue
;
119 // Advance to the null-terminator or to the first width directive
122 (String
[Index
] != NARROW_CHAR
) && (String
[Index
] != WIDE_CHAR
) && (String
[Index
] != 0);
123 Index
++, Count
= Count
+ IncrementValue
128 // We hit the null-terminator, we now have a count
130 if (String
[Index
] == 0) {
134 // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed
135 // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)
137 if (String
[Index
] == NARROW_CHAR
) {
139 // Skip to the next character
145 // Skip to the next character
150 } while (String
[Index
] != 0);
153 // Increment by one to include the null-terminator in the size
157 return Count
* sizeof (CHAR16
);
170 CHAR16
*StrFrontPageBanner
;
172 EFI_SCREEN_DESCRIPTOR LocalScreen
;
174 ZeroMem (&LocalScreen
, sizeof (EFI_SCREEN_DESCRIPTOR
));
175 gST
->ConOut
->QueryMode (gST
->ConOut
, gST
->ConOut
->Mode
->Mode
, &LocalScreen
.RightColumn
, &LocalScreen
.BottomRow
);
176 ClearLines (0, LocalScreen
.RightColumn
, 0, LocalScreen
.BottomRow
, KEYHELP_BACKGROUND
);
178 CopyMem (&LocalScreen
, &gScreenDimensions
, sizeof (EFI_SCREEN_DESCRIPTOR
));
181 // For now, allocate an arbitrarily long buffer
183 Buffer
= AllocateZeroPool (0x10000);
184 ASSERT (Buffer
!= NULL
);
186 Character
= BOXDRAW_HORIZONTAL
;
188 for (Index
= 0; Index
+ 2 < (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
); Index
++) {
189 Buffer
[Index
] = Character
;
192 if (gClassOfVfr
== EFI_FRONT_PAGE_SUBCLASS
) {
194 // ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);
197 LocalScreen
.LeftColumn
,
198 LocalScreen
.RightColumn
,
200 FRONT_PAGE_HEADER_HEIGHT
- 1 + LocalScreen
.TopRow
,
201 BANNER_TEXT
| BANNER_BACKGROUND
204 // for (Line = 0; Line < BANNER_HEIGHT; Line++) {
206 for (Line
= (UINT8
) LocalScreen
.TopRow
; Line
< BANNER_HEIGHT
+ (UINT8
) LocalScreen
.TopRow
; Line
++) {
208 // for (Alignment = 0; Alignment < BANNER_COLUMNS; Alignment++) {
210 for (Alignment
= (UINT8
) LocalScreen
.LeftColumn
;
211 Alignment
< BANNER_COLUMNS
+ (UINT8
) LocalScreen
.LeftColumn
;
214 if (BannerData
->Banner
[Line
- (UINT8
) LocalScreen
.TopRow
][Alignment
- (UINT8
) LocalScreen
.LeftColumn
] != 0x0000) {
215 StrFrontPageBanner
= GetToken (
216 BannerData
->Banner
[Line
- (UINT8
) LocalScreen
.TopRow
][Alignment
- (UINT8
) LocalScreen
.LeftColumn
],
223 switch (Alignment
- LocalScreen
.LeftColumn
) {
226 // Handle left column
228 PrintStringAt (LocalScreen
.LeftColumn
, Line
, StrFrontPageBanner
);
233 // Handle center column
236 LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) / 3,
244 // Handle right column
247 LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) * 2 / 3,
254 gBS
->FreePool (StrFrontPageBanner
);
260 LocalScreen
.LeftColumn
,
261 LocalScreen
.RightColumn
,
262 LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- FOOTER_HEIGHT
,
263 LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- 1,
264 KEYHELP_TEXT
| KEYHELP_BACKGROUND
267 if (gClassOfVfr
!= EFI_FRONT_PAGE_SUBCLASS
) {
269 LocalScreen
.LeftColumn
,
270 LocalScreen
.RightColumn
,
272 LocalScreen
.TopRow
+ NONE_FRONT_PAGE_HEADER_HEIGHT
- 1,
273 TITLE_TEXT
| TITLE_BACKGROUND
276 // Print Top border line
277 // +------------------------------------------------------------------------------+
279 // +------------------------------------------------------------------------------+
281 Character
= BOXDRAW_DOWN_RIGHT
;
283 PrintChar (Character
);
284 PrintString (Buffer
);
286 Character
= BOXDRAW_DOWN_LEFT
;
287 PrintChar (Character
);
289 Character
= BOXDRAW_VERTICAL
;
290 for (Row
= LocalScreen
.TopRow
+ 1; Row
<= LocalScreen
.TopRow
+ NONE_FRONT_PAGE_HEADER_HEIGHT
- 2; Row
++) {
291 PrintCharAt (LocalScreen
.LeftColumn
, Row
, Character
);
292 PrintCharAt (LocalScreen
.RightColumn
- 1, Row
, Character
);
295 Character
= BOXDRAW_UP_RIGHT
;
296 PrintCharAt (LocalScreen
.LeftColumn
, LocalScreen
.TopRow
+ NONE_FRONT_PAGE_HEADER_HEIGHT
- 1, Character
);
297 PrintString (Buffer
);
299 Character
= BOXDRAW_UP_LEFT
;
300 PrintChar (Character
);
302 if (gClassOfVfr
== EFI_SETUP_APPLICATION_SUBCLASS
) {
304 // Print Bottom border line
305 // +------------------------------------------------------------------------------+
307 // +------------------------------------------------------------------------------+
309 Character
= BOXDRAW_DOWN_RIGHT
;
310 PrintCharAt (LocalScreen
.LeftColumn
, LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- FOOTER_HEIGHT
, Character
);
312 PrintString (Buffer
);
314 Character
= BOXDRAW_DOWN_LEFT
;
315 PrintChar (Character
);
316 Character
= BOXDRAW_VERTICAL
;
317 for (Row
= LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- FOOTER_HEIGHT
+ 1;
318 Row
<= LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- 2;
321 PrintCharAt (LocalScreen
.LeftColumn
, Row
, Character
);
322 PrintCharAt (LocalScreen
.RightColumn
- 1, Row
, Character
);
325 Character
= BOXDRAW_UP_RIGHT
;
326 PrintCharAt (LocalScreen
.LeftColumn
, LocalScreen
.BottomRow
- STATUS_BAR_HEIGHT
- 1, Character
);
328 PrintString (Buffer
);
330 Character
= BOXDRAW_UP_LEFT
;
331 PrintChar (Character
);
335 gBS
->FreePool (Buffer
);
341 Evaluate all expressions in a Form.
343 @param FormSet FormSet this Form belongs to.
344 @param Form The Form.
346 @retval EFI_SUCCESS The expression evaluated successfuly
350 EvaluateFormExpressions (
351 IN FORM_BROWSER_FORMSET
*FormSet
,
352 IN FORM_BROWSER_FORM
*Form
357 FORM_EXPRESSION
*Expression
;
359 Link
= GetFirstNode (&Form
->ExpressionListHead
);
360 while (!IsNull (&Form
->ExpressionListHead
, Link
)) {
361 Expression
= FORM_EXPRESSION_FROM_LINK (Link
);
362 Link
= GetNextNode (&Form
->ExpressionListHead
, Link
);
364 if (Expression
->Type
== EFI_HII_EXPRESSION_INCONSISTENT_IF
||
365 Expression
->Type
== EFI_HII_EXPRESSION_NO_SUBMIT_IF
) {
367 // Postpone Form validation to Question editing or Form submiting
372 Status
= EvaluateExpression (FormSet
, Form
, Expression
);
373 if (EFI_ERROR (Status
)) {
382 +------------------------------------------------------------------------------+
383 ?F2=Previous Page Setup Page ?
384 +------------------------------------------------------------------------------+
402 +------------------------------------------------------------------------------+
403 ?F1=Scroll Help F9=Reset to Defaults F10=Save and Exit ?
404 | ^"=Move Highlight <Spacebar> Toggles Checkbox Esc=Discard Changes |
405 +------------------------------------------------------------------------------+
409 IN OUT UI_MENU_SELECTION
*Selection
413 UINT16 MenuItemCount
;
414 EFI_HII_HANDLE Handle
;
416 EFI_SCREEN_DESCRIPTOR LocalScreen
;
419 CHAR16
*OutputString
;
421 FORM_BROWSER_STATEMENT
*Statement
;
422 UINT16 NumberOfLines
;
425 Handle
= Selection
->Handle
;
432 CopyMem (&LocalScreen
, &gScreenDimensions
, sizeof (EFI_SCREEN_DESCRIPTOR
));
434 StringPtr
= GetToken (Selection
->FormSet
->FormSetTitle
, Handle
);
436 if (gClassOfVfr
!= EFI_FRONT_PAGE_SUBCLASS
) {
437 gST
->ConOut
->SetAttribute (gST
->ConOut
, TITLE_TEXT
| TITLE_BACKGROUND
);
439 (LocalScreen
.RightColumn
+ LocalScreen
.LeftColumn
- GetStringWidth (StringPtr
) / 2) / 2,
440 LocalScreen
.TopRow
+ 1,
445 if (gClassOfVfr
== EFI_SETUP_APPLICATION_SUBCLASS
) {
446 gST
->ConOut
->SetAttribute (gST
->ConOut
, KEYHELP_TEXT
| KEYHELP_BACKGROUND
);
449 // Display the infrastructure strings
451 if (!IsListEmpty (&gMenuList
)) {
452 PrintStringAt (LocalScreen
.LeftColumn
+ 2, LocalScreen
.TopRow
+ 1, gFunctionTwoString
);
455 PrintStringAt (LocalScreen
.LeftColumn
+ 2, LocalScreen
.BottomRow
- 4, gFunctionOneString
);
457 LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) / 3,
458 LocalScreen
.BottomRow
- 4,
462 LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) * 2 / 3,
463 LocalScreen
.BottomRow
- 4,
466 PrintAt (LocalScreen
.LeftColumn
+ 2, LocalScreen
.BottomRow
- 3, L
"%c%c%s", ARROW_UP
, ARROW_DOWN
, gMoveHighlight
);
468 LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) / 3,
469 LocalScreen
.BottomRow
- 3,
474 // Remove Buffer allocated for StringPtr after it has been used.
476 gBS
->FreePool (StringPtr
);
479 // Evaluate all the Expressions in this Form
481 Status
= EvaluateFormExpressions (Selection
->FormSet
, Selection
->Form
);
482 if (EFI_ERROR (Status
)) {
486 Link
= GetFirstNode (&Selection
->Form
->StatementListHead
);
487 while (!IsNull (&Selection
->Form
->StatementListHead
, Link
)) {
488 Statement
= FORM_BROWSER_STATEMENT_FROM_LINK (Link
);
490 if (Statement
->SuppressExpression
!= NULL
) {
491 Suppress
= Statement
->SuppressExpression
->Result
.Value
.b
;
497 StringPtr
= GetToken (Statement
->Prompt
, Handle
);
499 Width
= GetWidth (Statement
, Handle
);
503 for (; GetLineByWidth (StringPtr
, Width
, &ArrayEntry
, &OutputString
) != 0x0000;) {
505 // If there is more string to process print on the next row and increment the Skip value
507 if (StrLen (&StringPtr
[ArrayEntry
])) {
511 gBS
->FreePool (OutputString
);
515 // We are NOT!! removing this StringPtr buffer via FreePool since it is being used in the menuoptions, we will do
518 UiAddMenuOption (StringPtr
, Selection
->Handle
, Statement
, NumberOfLines
, MenuItemCount
);
522 Link
= GetNextNode (&Selection
->Form
->StatementListHead
, Link
);
525 Status
= UiDisplayMenu (Selection
);
533 InitializeBrowserStrings (
537 gFunctionOneString
= GetToken (STRING_TOKEN (FUNCTION_ONE_STRING
), gHiiHandle
);
538 gFunctionTwoString
= GetToken (STRING_TOKEN (FUNCTION_TWO_STRING
), gHiiHandle
);
539 gFunctionNineString
= GetToken (STRING_TOKEN (FUNCTION_NINE_STRING
), gHiiHandle
);
540 gFunctionTenString
= GetToken (STRING_TOKEN (FUNCTION_TEN_STRING
), gHiiHandle
);
541 gEnterString
= GetToken (STRING_TOKEN (ENTER_STRING
), gHiiHandle
);
542 gEnterCommitString
= GetToken (STRING_TOKEN (ENTER_COMMIT_STRING
), gHiiHandle
);
543 gEscapeString
= GetToken (STRING_TOKEN (ESCAPE_STRING
), gHiiHandle
);
544 gSaveFailed
= GetToken (STRING_TOKEN (SAVE_FAILED
), gHiiHandle
);
545 gMoveHighlight
= GetToken (STRING_TOKEN (MOVE_HIGHLIGHT
), gHiiHandle
);
546 gMakeSelection
= GetToken (STRING_TOKEN (MAKE_SELECTION
), gHiiHandle
);
547 gDecNumericInput
= GetToken (STRING_TOKEN (DEC_NUMERIC_INPUT
), gHiiHandle
);
548 gHexNumericInput
= GetToken (STRING_TOKEN (HEX_NUMERIC_INPUT
), gHiiHandle
);
549 gToggleCheckBox
= GetToken (STRING_TOKEN (TOGGLE_CHECK_BOX
), gHiiHandle
);
550 gPromptForData
= GetToken (STRING_TOKEN (PROMPT_FOR_DATA
), gHiiHandle
);
551 gPromptForPassword
= GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD
), gHiiHandle
);
552 gPromptForNewPassword
= GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD
), gHiiHandle
);
553 gConfirmPassword
= GetToken (STRING_TOKEN (CONFIRM_PASSWORD
), gHiiHandle
);
554 gConfirmError
= GetToken (STRING_TOKEN (CONFIRM_ERROR
), gHiiHandle
);
555 gPassowordInvalid
= GetToken (STRING_TOKEN (PASSWORD_INVALID
), gHiiHandle
);
556 gPressEnter
= GetToken (STRING_TOKEN (PRESS_ENTER
), gHiiHandle
);
557 gEmptyString
= GetToken (STRING_TOKEN (EMPTY_STRING
), gHiiHandle
);
558 gAreYouSure
= GetToken (STRING_TOKEN (ARE_YOU_SURE
), gHiiHandle
);
559 gYesResponse
= GetToken (STRING_TOKEN (ARE_YOU_SURE_YES
), gHiiHandle
);
560 gNoResponse
= GetToken (STRING_TOKEN (ARE_YOU_SURE_NO
), gHiiHandle
);
561 gMiniString
= GetToken (STRING_TOKEN (MINI_STRING
), gHiiHandle
);
562 gPlusString
= GetToken (STRING_TOKEN (PLUS_STRING
), gHiiHandle
);
563 gMinusString
= GetToken (STRING_TOKEN (MINUS_STRING
), gHiiHandle
);
564 gAdjustNumber
= GetToken (STRING_TOKEN (ADJUST_NUMBER
), gHiiHandle
);
573 SafeFreePool (gFunctionOneString
);
574 SafeFreePool (gFunctionTwoString
);
575 SafeFreePool (gFunctionNineString
);
576 SafeFreePool (gFunctionTenString
);
577 SafeFreePool (gEnterString
);
578 SafeFreePool (gEnterCommitString
);
579 SafeFreePool (gEscapeString
);
580 SafeFreePool (gMoveHighlight
);
581 SafeFreePool (gMakeSelection
);
582 SafeFreePool (gDecNumericInput
);
583 SafeFreePool (gHexNumericInput
);
584 SafeFreePool (gToggleCheckBox
);
585 SafeFreePool (gPromptForData
);
586 SafeFreePool (gPromptForPassword
);
587 SafeFreePool (gPromptForNewPassword
);
588 SafeFreePool (gConfirmPassword
);
589 SafeFreePool (gPassowordInvalid
);
590 SafeFreePool (gConfirmError
);
591 SafeFreePool (gPressEnter
);
592 SafeFreePool (gEmptyString
);
593 SafeFreePool (gAreYouSure
);
594 SafeFreePool (gYesResponse
);
595 SafeFreePool (gNoResponse
);
596 SafeFreePool (gMiniString
);
597 SafeFreePool (gPlusString
);
598 SafeFreePool (gMinusString
);
599 SafeFreePool (gAdjustNumber
);
605 Update key's help imformation
607 @param MenuOption The Menu option
608 @param Selected Whether or not a tag be selected
615 IN UI_MENU_OPTION
*MenuOption
,
621 UINTN LeftColumnOfHelp
;
622 UINTN RightColumnOfHelp
;
624 UINTN BottomRowOfHelp
;
625 UINTN StartColumnOfHelp
;
626 EFI_SCREEN_DESCRIPTOR LocalScreen
;
627 FORM_BROWSER_STATEMENT
*Statement
;
629 CopyMem (&LocalScreen
, &gScreenDimensions
, sizeof (EFI_SCREEN_DESCRIPTOR
));
631 SecCol
= LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) / 3;
632 ThdCol
= LocalScreen
.LeftColumn
+ (LocalScreen
.RightColumn
- LocalScreen
.LeftColumn
) * 2 / 3;
634 StartColumnOfHelp
= LocalScreen
.LeftColumn
+ 2;
635 LeftColumnOfHelp
= LocalScreen
.LeftColumn
+ 1;
636 RightColumnOfHelp
= LocalScreen
.RightColumn
- 2;
637 TopRowOfHelp
= LocalScreen
.BottomRow
- 4;
638 BottomRowOfHelp
= LocalScreen
.BottomRow
- 3;
640 if (gClassOfVfr
== EFI_GENERAL_APPLICATION_SUBCLASS
) {
644 gST
->ConOut
->SetAttribute (gST
->ConOut
, KEYHELP_TEXT
| KEYHELP_BACKGROUND
);
646 Statement
= MenuOption
->ThisTag
;
647 switch (Statement
->Operand
) {
648 case EFI_IFR_ORDERED_LIST_OP
:
649 case EFI_IFR_ONE_OF_OP
:
650 case EFI_IFR_NUMERIC_OP
:
651 case EFI_IFR_TIME_OP
:
652 case EFI_IFR_DATE_OP
:
653 ClearLines (LeftColumnOfHelp
, RightColumnOfHelp
, TopRowOfHelp
, BottomRowOfHelp
, KEYHELP_TEXT
| KEYHELP_BACKGROUND
);
656 if (gClassOfVfr
== EFI_SETUP_APPLICATION_SUBCLASS
) {
657 PrintStringAt (StartColumnOfHelp
, TopRowOfHelp
, gFunctionOneString
);
658 PrintStringAt (SecCol
, TopRowOfHelp
, gFunctionNineString
);
659 PrintStringAt (ThdCol
, TopRowOfHelp
, gFunctionTenString
);
660 PrintStringAt (ThdCol
, BottomRowOfHelp
, gEscapeString
);
663 if ((Statement
->Operand
== EFI_IFR_DATE_OP
) ||
664 (Statement
->Operand
== EFI_IFR_TIME_OP
) ||
665 (Statement
->Operand
== EFI_IFR_NUMERIC_OP
&& Statement
->Step
!= 0)) {
676 PrintStringAt (SecCol
, BottomRowOfHelp
, gAdjustNumber
);
678 PrintAt (StartColumnOfHelp
, BottomRowOfHelp
, L
"%c%c%s", ARROW_UP
, ARROW_DOWN
, gMoveHighlight
);
679 PrintStringAt (SecCol
, BottomRowOfHelp
, gEnterString
);
682 PrintStringAt (SecCol
, BottomRowOfHelp
, gEnterCommitString
);
685 // If it is a selected numeric with manual input, display different message
687 if ((Statement
->Operand
== EFI_IFR_NUMERIC_OP
) && (Statement
->Step
== 0)) {
691 (Statement
->Flags
& EFI_IFR_DISPLAY_UINT_HEX
) ? gHexNumericInput
: gDecNumericInput
693 } else if (Statement
->Operand
!= EFI_IFR_ORDERED_LIST_OP
) {
694 PrintAt (StartColumnOfHelp
, BottomRowOfHelp
, L
"%c%c%s", ARROW_UP
, ARROW_DOWN
, gMoveHighlight
);
697 if (Statement
->Operand
== EFI_IFR_ORDERED_LIST_OP
) {
698 PrintStringAt (StartColumnOfHelp
, TopRowOfHelp
, gPlusString
);
699 PrintStringAt (ThdCol
, TopRowOfHelp
, gMinusString
);
702 PrintStringAt (ThdCol
, BottomRowOfHelp
, gEscapeString
);
706 case EFI_IFR_CHECKBOX_OP
:
707 ClearLines (LeftColumnOfHelp
, RightColumnOfHelp
, TopRowOfHelp
, BottomRowOfHelp
, KEYHELP_TEXT
| KEYHELP_BACKGROUND
);
709 if (gClassOfVfr
== EFI_SETUP_APPLICATION_SUBCLASS
) {
710 PrintStringAt (StartColumnOfHelp
, TopRowOfHelp
, gFunctionOneString
);
711 PrintStringAt (SecCol
, TopRowOfHelp
, gFunctionNineString
);
712 PrintStringAt (ThdCol
, TopRowOfHelp
, gFunctionTenString
);
713 PrintStringAt (ThdCol
, BottomRowOfHelp
, gEscapeString
);
716 PrintAt (StartColumnOfHelp
, BottomRowOfHelp
, L
"%c%c%s", ARROW_UP
, ARROW_DOWN
, gMoveHighlight
);
717 PrintStringAt (SecCol
, BottomRowOfHelp
, gToggleCheckBox
);
721 case EFI_IFR_PASSWORD_OP
:
722 case EFI_IFR_STRING_OP
:
723 case EFI_IFR_TEXT_OP
:
724 case EFI_IFR_ACTION_OP
:
725 case EFI_IFR_RESET_BUTTON_OP
:
726 ClearLines (LeftColumnOfHelp
, RightColumnOfHelp
, TopRowOfHelp
, BottomRowOfHelp
, KEYHELP_TEXT
| KEYHELP_BACKGROUND
);
729 if (gClassOfVfr
== EFI_SETUP_APPLICATION_SUBCLASS
) {
730 PrintStringAt (StartColumnOfHelp
, TopRowOfHelp
, gFunctionOneString
);
731 PrintStringAt (SecCol
, TopRowOfHelp
, gFunctionNineString
);
732 PrintStringAt (ThdCol
, TopRowOfHelp
, gFunctionTenString
);
733 PrintStringAt (ThdCol
, BottomRowOfHelp
, gEscapeString
);
736 PrintAt (StartColumnOfHelp
, BottomRowOfHelp
, L
"%c%c%s", ARROW_UP
, ARROW_DOWN
, gMoveHighlight
);
737 if (Statement
->Operand
!= EFI_IFR_TEXT_OP
) {
738 PrintStringAt (SecCol
, BottomRowOfHelp
, gEnterString
);
741 if (Statement
->Operand
!= EFI_IFR_REF_OP
) {
743 (LocalScreen
.RightColumn
- GetStringWidth (gEnterCommitString
) / 2) / 2,
747 PrintStringAt (ThdCol
, BottomRowOfHelp
, gEscapeString
);
759 IN UINT8 PackageType
,
760 IN CONST EFI_GUID
*PackageGuid
,
761 IN CONST EFI_HII_PACKAGE_HEADER
*Package
,
762 IN EFI_HII_HANDLE Handle
,
763 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
766 mHiiPackageListUpdated
= TRUE
;
773 IN OUT UI_MENU_SELECTION
*Selection
778 EFI_BROWSER_ACTION_REQUEST ActionRequest
;
779 EFI_HANDLE NotifyHandle
;
780 EFI_HII_VALUE
*HiiValue
;
781 FORM_BROWSER_STATEMENT
*Statement
;
782 EFI_HII_CONFIG_ACCESS_PROTOCOL
*ConfigAccess
;
784 gMenuRefreshHead
= NULL
;
785 gResetRequired
= FALSE
;
786 gNvUpdateRequired
= FALSE
;
791 // Register notify for Form package update
793 Status
= mHiiDatabase
->RegisterPackageNotify (
795 EFI_HII_PACKAGE_FORM
,
798 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
801 if (EFI_ERROR (Status
)) {
807 // Displays the Header and Footer borders
812 // Initialize Selection->Form
814 if (Selection
->FormId
== 0) {
816 // Zero FormId indicates display the first Form in a FormSet
818 Link
= GetFirstNode (&Selection
->FormSet
->FormListHead
);
820 Selection
->Form
= FORM_BROWSER_FORM_FROM_LINK (Link
);
821 Selection
->FormId
= Selection
->Form
->FormId
;
823 Selection
->Form
= IdToForm (Selection
->FormSet
, Selection
->FormId
);
827 // Load Questions' Value for display
829 Status
= LoadFormConfig (Selection
->FormSet
, Selection
->Form
);
830 if (EFI_ERROR (Status
)) {
837 Status
= DisplayForm (Selection
);
838 if (EFI_ERROR (Status
)) {
843 // Check Selected Statement (if press ESC, Selection->Statement will be NULL)
845 Statement
= Selection
->Statement
;
846 if (Statement
!= NULL
) {
847 if (Statement
->QuestionFlags
& EFI_IFR_FLAG_RESET_REQUIRED
) {
848 gResetRequired
= TRUE
;
852 // Reset FormPackage update flag
854 mHiiPackageListUpdated
= FALSE
;
856 if (Statement
->QuestionFlags
& EFI_IFR_FLAG_CALLBACK
&& Statement
->Operand
!= EFI_IFR_PASSWORD_OP
) {
857 ActionRequest
= EFI_BROWSER_ACTION_REQUEST_NONE
;
859 HiiValue
= &Statement
->HiiValue
;
860 if (HiiValue
->Type
== EFI_IFR_TYPE_STRING
) {
862 // Create String in HII database for Configuration Driver to retrieve
864 HiiValue
->Value
.string
= NewString ((CHAR16
*) Statement
->BufferValue
, Selection
->FormSet
->HiiHandle
);
867 ConfigAccess
= Selection
->FormSet
->ConfigAccess
;
868 if (ConfigAccess
== NULL
) {
869 return EFI_UNSUPPORTED
;
871 Status
= ConfigAccess
->Callback (
873 EFI_BROWSER_ACTION_CHANGING
,
874 Statement
->QuestionId
,
880 if (HiiValue
->Type
== EFI_IFR_TYPE_STRING
) {
882 // Clean the String in HII Database
884 DeleteString (HiiValue
->Value
.string
, Selection
->FormSet
->HiiHandle
);
887 if (!EFI_ERROR (Status
)) {
888 switch (ActionRequest
) {
889 case EFI_BROWSER_ACTION_REQUEST_RESET
:
890 gResetRequired
= TRUE
;
893 case EFI_BROWSER_ACTION_REQUEST_SUBMIT
:
894 SubmitForm (Selection
->FormSet
, Selection
->Form
);
897 case EFI_BROWSER_ACTION_REQUEST_EXIT
:
898 Selection
->Action
= UI_ACTION_EXIT
;
899 gNvUpdateRequired
= FALSE
;
909 // Check whether Form Package has been updated during Callback
911 if (mHiiPackageListUpdated
&& (Selection
->Action
== UI_ACTION_REFRESH_FORM
)) {
913 // Force to reparse IFR binary of target Formset
915 Selection
->Action
= UI_ACTION_REFRESH_FORMSET
;
918 } while (Selection
->Action
== UI_ACTION_REFRESH_FORM
);
921 // Unregister notify for Form package update
923 Status
= mHiiDatabase
->UnregisterPackageNotify (