/** @file\r
Utility functions for UI presentation.\r
\r
-Copyright (c) 2004 - 2009, Intel Corporation\r
+Copyright (c) 2004 - 2010, 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
\r
#include "Setup.h"\r
-#include "Ui.h"\r
\r
BOOLEAN mHiiPackageListUpdated;\r
UI_MENU_SELECTION *gCurrentSelection;\r
**/\r
VOID\r
ClearLines (\r
- UINTN LeftColumn,\r
- UINTN RightColumn,\r
- UINTN TopRow,\r
- UINTN BottomRow,\r
- UINTN TextAttribute\r
+ IN UINTN LeftColumn,\r
+ IN UINTN RightColumn,\r
+ IN UINTN TopRow,\r
+ IN UINTN BottomRow,\r
+ IN UINTN TextAttribute\r
)\r
{\r
CHAR16 *Buffer;\r
**/\r
VOID\r
NewStrCat (\r
- CHAR16 *Destination,\r
- CHAR16 *Source\r
+ IN OUT CHAR16 *Destination,\r
+ IN CHAR16 *Source\r
)\r
{\r
UINTN Length;\r
**/\r
UINTN\r
GetStringWidth (\r
- CHAR16 *String\r
+ IN CHAR16 *String\r
)\r
{\r
UINTN Index;\r
Buffer[Index] = Character;\r
}\r
\r
- if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
+ if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
//\r
// ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
//\r
KEYHELP_TEXT | KEYHELP_BACKGROUND\r
);\r
\r
- if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
+ if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
ClearLines (\r
LocalScreen.LeftColumn,\r
LocalScreen.RightColumn,\r
Character = BOXDRAW_UP_LEFT;\r
PrintChar (Character);\r
\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
+ if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
//\r
// Print Bottom border line\r
// +------------------------------------------------------------------------------+\r
FORM_BROWSER_STATEMENT *Statement;\r
UINT16 NumberOfLines;\r
EFI_STATUS Status;\r
+ UI_MENU_OPTION *MenuOption;\r
\r
Handle = Selection->Handle;\r
MenuItemCount = 0;\r
\r
StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
\r
- if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
+ if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != 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
return Status;\r
}\r
\r
+ Selection->FormEditable = FALSE;\r
Link = GetFirstNode (&Selection->Form->StatementListHead);\r
while (!IsNull (&Selection->Form->StatementListHead, Link)) {\r
Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
// We are NOT!! removing this StringPtr buffer via FreePool since it is being used in the menuoptions, we will do\r
// it in UiFreeMenu.\r
//\r
- UiAddMenuOption (StringPtr, Selection->Handle, Statement, NumberOfLines, MenuItemCount);\r
+ MenuOption = UiAddMenuOption (StringPtr, Selection->Handle, Statement, NumberOfLines, MenuItemCount);\r
MenuItemCount++;\r
+\r
+ if (MenuOption->IsQuestion && !MenuOption->ReadOnly) {\r
+ //\r
+ // At least one item is not readonly, this Form is considered as editable\r
+ //\r
+ Selection->FormEditable = TRUE;\r
+ }\r
}\r
\r
Link = GetNextNode (&Selection->Form->StatementListHead, Link);\r
VOID\r
)\r
{\r
- gFunctionOneString = GetToken (STRING_TOKEN (FUNCTION_ONE_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
gAdjustNumber = GetToken (STRING_TOKEN (ADJUST_NUMBER), gHiiHandle);\r
gSaveChanges = GetToken (STRING_TOKEN (SAVE_CHANGES), gHiiHandle);\r
gOptionMismatch = GetToken (STRING_TOKEN (OPTION_MISMATCH), gHiiHandle);\r
+ gFormSuppress = GetToken (STRING_TOKEN (FORM_SUPPRESSED), gHiiHandle);\r
return ;\r
}\r
\r
VOID\r
)\r
{\r
- FreePool (gFunctionOneString);\r
FreePool (gFunctionNineString);\r
FreePool (gFunctionTenString);\r
FreePool (gEnterString);\r
FreePool (gAdjustNumber);\r
FreePool (gSaveChanges);\r
FreePool (gOptionMismatch);\r
+ FreePool (gFormSuppress);\r
return ;\r
}\r
\r
/**\r
Update key's help imformation.\r
\r
+ @param Selection Tell setup browser the information about the Selection\r
@param MenuOption The Menu option\r
@param Selected Whether or not a tag be selected\r
\r
**/\r
VOID\r
UpdateKeyHelp (\r
+ IN UI_MENU_SELECTION *Selection,\r
IN UI_MENU_OPTION *MenuOption,\r
IN BOOLEAN Selected\r
)\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
- PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+ if (Selection->FormEditable) {\r
+ PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+ PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ }\r
PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
}\r
\r
case EFI_IFR_CHECKBOX_OP:\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
- PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+ if (Selection->FormEditable) {\r
+ PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+ PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ }\r
PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
}\r
\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
- PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+ if (Selection->FormEditable) {\r
+ PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+ PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ }\r
PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
}\r
\r
EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
EFI_HANDLE NotifyHandle;\r
EFI_HII_VALUE *HiiValue;\r
+ EFI_IFR_TYPE_VALUE *TypeValue;\r
FORM_BROWSER_STATEMENT *Statement;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
FORM_BROWSER_FORMSET *FormSet;\r
+ EFI_INPUT_KEY Key;\r
\r
gMenuRefreshHead = NULL;\r
gResetRequired = FALSE;\r
return Status;\r
}\r
\r
+ //\r
+ // Before display the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_OPEN\r
+ //\r
+ ConfigAccess = Selection->FormSet->ConfigAccess;\r
+ if ((ConfigAccess != NULL) && (Selection->Action != UI_ACTION_REFRESH_FORMSET)) {\r
+ ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+ mHiiPackageListUpdated = FALSE;\r
+ Status = ConfigAccess->Callback (\r
+ ConfigAccess,\r
+ EFI_BROWSER_ACTION_FORM_OPEN,\r
+ 0,\r
+ EFI_IFR_TYPE_UNDEFINED,\r
+ NULL,\r
+ &ActionRequest\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ switch (ActionRequest) {\r
+ case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+ gResetRequired = TRUE;\r
+ break;\r
+\r
+ case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+ //\r
+ // Till now there is no uncommitted data, so ignore this request\r
+ //\r
+ break;\r
+\r
+ case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+ Selection->Action = UI_ACTION_EXIT;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (mHiiPackageListUpdated) {\r
+ //\r
+ // IFR is updated during callback, force to reparse the IFR binary\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+ goto Done;\r
+ }\r
+ }\r
+\r
//\r
// Initialize current settings of Questions in this FormSet\r
//\r
}\r
\r
do {\r
- //\r
- // Displays the Header and Footer borders\r
- //\r
- DisplayPageFrame ();\r
-\r
//\r
// Initialize Selection->Form\r
//\r
return EFI_NOT_FOUND;\r
}\r
\r
+ //\r
+ // Check Form is suppressed.\r
+ //\r
+ if (Selection->Form->SuppressExpression != NULL) {\r
+ Status = EvaluateExpression (Selection->FormSet, Selection->Form, Selection->Form->SuppressExpression);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (Selection->Form->SuppressExpression->Result.Value.b) {\r
+ //\r
+ // Form is suppressed. \r
+ //\r
+ do {\r
+ CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ }\r
+ \r
+ //\r
+ // Reset FormPackage update flag\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+\r
//\r
// Load Questions' Value for display\r
//\r
- Status = LoadFormSetConfig (Selection->FormSet);\r
+ Status = LoadFormSetConfig (Selection, Selection->FormSet);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
+ //\r
+ // IFR is updated during callback of read value, force to reparse the IFR binary\r
+ //\r
+ if (mHiiPackageListUpdated) {\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+ mHiiPackageListUpdated = FALSE;\r
+ goto Done;\r
+ }\r
+\r
+ //\r
+ // Displays the Header and Footer borders\r
+ //\r
+ DisplayPageFrame ();\r
+\r
//\r
// Display form\r
//\r
if (((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK) && (Statement->Operand != EFI_IFR_PASSWORD_OP)) {\r
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
\r
+ if (ConfigAccess == NULL) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
HiiValue = &Statement->HiiValue;\r
+ TypeValue = &HiiValue->Value;\r
if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
//\r
// Create String in HII database for Configuration Driver to retrieve\r
//\r
HiiValue->Value.string = NewString ((CHAR16 *) Statement->BufferValue, Selection->FormSet->HiiHandle);\r
+ } else if (HiiValue->Type == EFI_IFR_TYPE_BUFFER) {\r
+ //\r
+ // For OrderedList, passing in the value buffer to Callback()\r
+ //\r
+ TypeValue = (EFI_IFR_TYPE_VALUE *) Statement->BufferValue;\r
}\r
\r
- ConfigAccess = Selection->FormSet->ConfigAccess;\r
- if (ConfigAccess == NULL) {\r
- return EFI_UNSUPPORTED;\r
- }\r
Status = ConfigAccess->Callback (\r
ConfigAccess,\r
EFI_BROWSER_ACTION_CHANGING,\r
Statement->QuestionId,\r
HiiValue->Type,\r
- &HiiValue->Value,\r
+ TypeValue,\r
&ActionRequest\r
);\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
//\r
// Force to reparse IFR binary of target Formset\r
//\r
+ mHiiPackageListUpdated = FALSE;\r
Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
}\r
}\r
} while (Selection->Action == UI_ACTION_REFRESH_FORM);\r
\r
+ //\r
+ // Before exit the formset, invoke ConfigAccess.Callback() with EFI_BROWSER_ACTION_FORM_CLOSE\r
+ //\r
+ if ((ConfigAccess != NULL) && (Selection->Action == UI_ACTION_EXIT)) {\r
+ ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+ Status = ConfigAccess->Callback (\r
+ ConfigAccess,\r
+ EFI_BROWSER_ACTION_FORM_CLOSE,\r
+ 0,\r
+ EFI_IFR_TYPE_UNDEFINED,\r
+ NULL,\r
+ &ActionRequest\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ switch (ActionRequest) {\r
+ case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+ gResetRequired = TRUE;\r
+ break;\r
+\r
+ case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+ SubmitForm (Selection->FormSet, Selection->Form);\r
+ break;\r
+\r
+ case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+ gNvUpdateRequired = FALSE;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
//\r
// Record the old formset\r
//\r