/** @file\r
Utility functions for UI presentation.\r
\r
-Copyright (c) 2004 - 2008, Intel Corporation\r
+Copyright (c) 2004 - 2009, Intel Corporation\r
All rights reserved. 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
\r
gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);\r
\r
- gBS->FreePool (Buffer);\r
+ FreePool (Buffer);\r
return ;\r
}\r
\r
\r
This function handles the Unicode string with NARROW_CHAR\r
and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
- does not count in the resultant output. If a WIDE_CHAR is \r
+ does not count in the resultant output. If a WIDE_CHAR is\r
hit, then 2 Unicode character will consume an output storage\r
space with size of CHAR16 till a NARROW_CHAR is hit.\r
\r
CHAR16 *StrFrontPageBanner;\r
UINTN Row;\r
EFI_SCREEN_DESCRIPTOR LocalScreen;\r
+ UINT8 RowIdx;\r
+ UINT8 ColumnIdx;\r
\r
ZeroMem (&LocalScreen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);\r
Buffer[Index] = Character;\r
}\r
\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
//\r
// ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
//\r
Alignment < BANNER_COLUMNS + (UINT8) LocalScreen.LeftColumn;\r
Alignment++\r
) {\r
- if (BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn] != 0x0000) {\r
+ RowIdx = (UINT8) (Line - (UINT8) LocalScreen.TopRow);\r
+ ColumnIdx = (UINT8) (Alignment - (UINT8) LocalScreen.LeftColumn);\r
+\r
+ ASSERT (RowIdx < BANNER_HEIGHT);\r
+ ASSERT (ColumnIdx < BANNER_COLUMNS);\r
+\r
+ if (gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
StrFrontPageBanner = GetToken (\r
- BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn],\r
- FrontPageHandle\r
+ gBannerData->Banner[RowIdx][ColumnIdx],\r
+ gFrontPageHandle\r
);\r
} else {\r
continue;\r
break;\r
}\r
\r
- gBS->FreePool (StrFrontPageBanner);\r
+ FreePool (StrFrontPageBanner);\r
}\r
}\r
}\r
KEYHELP_TEXT | KEYHELP_BACKGROUND\r
);\r
\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
ClearLines (\r
LocalScreen.LeftColumn,\r
LocalScreen.RightColumn,\r
Character = BOXDRAW_UP_LEFT;\r
PrintChar (Character);\r
\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
//\r
// Print Bottom border line\r
// +------------------------------------------------------------------------------+\r
}\r
}\r
\r
- gBS->FreePool (Buffer);\r
+ FreePool (Buffer);\r
\r
}\r
\r
\r
/*\r
+------------------------------------------------------------------------------+\r
-?F2=Previous Page Setup Page ?\r
+? Setup Page ?\r
+------------------------------------------------------------------------------+\r
\r
\r
\r
/**\r
\r
- \r
+\r
Display form and wait for user to select one menu option, then return it.\r
- \r
+\r
@param Selection On input, Selection tell setup browser the information\r
about the Selection, form and formset to be displayed.\r
On output, Selection return the screen item that is selected\r
\r
StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
PrintStringAt (\r
(LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,\r
);\r
}\r
\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
- gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
- //\r
- // Display the infrastructure strings\r
- //\r
- if (!IsListEmpty (&gMenuList)) {\r
- PrintStringAt (LocalScreen.LeftColumn + 2, LocalScreen.TopRow + 1, gFunctionTwoString);\r
- }\r
- }\r
//\r
// Remove Buffer allocated for StringPtr after it has been used.\r
//\r
- gBS->FreePool (StringPtr);\r
+ FreePool (StringPtr);\r
\r
//\r
// Evaluate all the Expressions in this Form\r
Suppress = FALSE;\r
}\r
\r
+ if (Statement->DisableExpression != NULL) {\r
+ Suppress = (BOOLEAN) (Suppress || Statement->DisableExpression->Result.Value.b);\r
+ }\r
+\r
if (!Suppress) {\r
StringPtr = GetToken (Statement->Prompt, Handle);\r
\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&StringPtr[ArrayEntry])) {\r
+ if (StrLen (&StringPtr[ArrayEntry]) != 0) {\r
NumberOfLines++;\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
}\r
\r
//\r
)\r
{\r
gFunctionOneString = GetToken (STRING_TOKEN (FUNCTION_ONE_STRING), gHiiHandle);\r
- gFunctionTwoString = GetToken (STRING_TOKEN (FUNCTION_TWO_STRING), gHiiHandle);\r
gFunctionNineString = GetToken (STRING_TOKEN (FUNCTION_NINE_STRING), gHiiHandle);\r
gFunctionTenString = GetToken (STRING_TOKEN (FUNCTION_TEN_STRING), gHiiHandle);\r
gEnterString = GetToken (STRING_TOKEN (ENTER_STRING), gHiiHandle);\r
)\r
{\r
FreePool (gFunctionOneString);\r
- FreePool (gFunctionTwoString);\r
FreePool (gFunctionNineString);\r
FreePool (gFunctionTenString);\r
FreePool (gEnterString);\r
TopRowOfHelp = LocalScreen.BottomRow - 4;\r
BottomRowOfHelp = LocalScreen.BottomRow - 3;\r
\r
- if (gClassOfVfr == EFI_GENERAL_APPLICATION_SUBCLASS) {\r
- return ;\r
- }\r
-\r
gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
Statement = MenuOption->ThisTag;\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
case EFI_IFR_CHECKBOX_OP:\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
FormUpdateNotify (\r
IN UINT8 PackageType,\r
IN CONST EFI_GUID *PackageGuid,\r
EFI_HII_VALUE *HiiValue;\r
FORM_BROWSER_STATEMENT *Statement;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
- EFI_INPUT_KEY Key;\r
- CHAR16 YesResponse;\r
- CHAR16 NoResponse;\r
+ FORM_BROWSER_FORMSET *FormSet;\r
\r
gMenuRefreshHead = NULL;\r
gResetRequired = FALSE;\r
- gNvUpdateRequired = FALSE;\r
-\r
- UiInitMenuList ();\r
+ FormSet = Selection->FormSet;\r
\r
//\r
// Register notify for Form package update\r
return Status;\r
}\r
\r
- do {\r
- //\r
- // Displays the Header and Footer borders\r
- //\r
- DisplayPageFrame ();\r
+ //\r
+ // Initialize current settings of Questions in this FormSet\r
+ //\r
+ Status = InitializeCurrentSetting (Selection->FormSet);\r
+ if (EFI_ERROR (Status)) {\r
+ Selection->Action = UI_ACTION_EXIT;\r
+ goto Done;\r
+ }\r
\r
+ do {\r
//\r
// Initialize Selection->Form\r
//\r
Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);\r
}\r
\r
+ if (Selection->Form == NULL) {\r
+ //\r
+ // No Form to display\r
+ //\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
//\r
// Load Questions' Value for display\r
//\r
- Status = LoadFormConfig (Selection->FormSet, Selection->Form);\r
+ Status = LoadFormSetConfig (Selection->FormSet);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
+ //\r
+ // Displays the Header and Footer borders\r
+ //\r
+ DisplayPageFrame ();\r
+\r
//\r
// Display form\r
//\r
default:\r
break;\r
}\r
+ } else if (Status != EFI_UNSUPPORTED) {\r
+ //\r
+ // Callback return error status other than EFI_UNSUPPORTED\r
+ //\r
+ if (Statement->Operand == EFI_IFR_REF_OP) {\r
+ //\r
+ // Cross reference will not be taken\r
+ //\r
+ Selection->FormId = Selection->Form->FormId;\r
+ Selection->QuestionId = 0;\r
+ }\r
}\r
}\r
\r
// Force to reparse IFR binary of target Formset\r
//\r
Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
- //\r
- // Uncommitted data will be lost after IFR binary re-pasing, so confirm on whether to save\r
- //\r
- if (gNvUpdateRequired) {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-\r
- YesResponse = gYesResponse[0];\r
- NoResponse = gNoResponse[0];\r
-\r
- do {\r
- CreateDialog (3, TRUE, 0, NULL, &Key, gEmptyString, gSaveChanges, gEmptyString);\r
- } while\r
- (\r
- (Key.ScanCode != SCAN_ESC) &&\r
- ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (NoResponse | UPPER_LOWER_CASE_OFFSET)) &&\r
- ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (YesResponse | UPPER_LOWER_CASE_OFFSET))\r
- );\r
-\r
- if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (YesResponse | UPPER_LOWER_CASE_OFFSET)) {\r
- //\r
- // If the user hits the YesResponse key\r
- //\r
- SubmitForm (Selection->FormSet, Selection->Form);\r
- }\r
- }\r
}\r
}\r
} while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
\r
+ //\r
+ // Record the old formset\r
+ //\r
+ if (gOldFormSet != NULL) {\r
+ DestroyFormSet (gOldFormSet);\r
+ }\r
+ gOldFormSet = FormSet;\r
+\r
+Done:\r
//\r
// Unregister notify for Form package update\r
//\r