**/\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
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
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
VOID\r
)\r
{\r
- FreePool (gFunctionOneString);\r
FreePool (gFunctionNineString);\r
FreePool (gFunctionTenString);\r
FreePool (gEnterString);\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
\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 (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 (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
- PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
- PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
- PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ if (Selection->FormEditable) {\r
+ PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+ PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ }\r
PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
}\r
\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 (Selection->FormEditable) {\r
+ PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
+ PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
+ }\r
PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
}\r
\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
+ 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 Status;\r
}\r
\r
+ //\r
+ // Displays the Header and Footer borders\r
+ //\r
+ DisplayPageFrame ();\r
+\r
//\r
// Display form\r
//\r
HiiValue->Value.string = NewString ((CHAR16 *) Statement->BufferValue, Selection->FormSet->HiiHandle);\r
}\r
\r
- ConfigAccess = Selection->FormSet->ConfigAccess;\r
if (ConfigAccess == NULL) {\r
return EFI_UNSUPPORTED;\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
} 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