Export one interface to support 3rd party to change question attribute, such as hide/gray out.

Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14678 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Eric Dong 2013-09-16 09:50:32 +00:00 committed by ydong10
parent b7dbd9c27a
commit 184f3a02d6
5 changed files with 79 additions and 1 deletions

View File

@ -137,10 +137,12 @@ EFI_STATUS
//
// Attribute for Statement and Form
//
#define HII_DISPLAY_NONE 0
#define HII_DISPLAY_GRAYOUT BIT0
#define HII_DISPLAY_LOCK BIT1
#define HII_DISPLAY_READONLY BIT2
#define HII_DISPLAY_MODAL BIT3
#define HII_DISPLAY_SUPPRESS BIT4
struct _FORM_DISPLAY_ENGINE_STATEMENT{
UINTN Signature;

View File

@ -68,6 +68,21 @@ typedef struct {
#define FORM_ENTRY_INFO_FROM_LINK(a) CR (a, FORM_ENTRY_INFO, Link, FORM_ENTRY_INFO_SIGNATURE)
#define FORM_QUESTION_ATTRIBUTE_OVERRIDE_SIGNATURE SIGNATURE_32 ('f', 'q', 'o', 's')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
EFI_QUESTION_ID QuestionId; // Find the question
EFI_FORM_ID FormId; // Find the form
EFI_GUID FormSetGuid; // Find the formset.
EFI_HII_HANDLE HiiHandle; // Find the HII handle
UINT32 Attribute; // Hide or grayout ...
} QUESTION_ATTRIBUTE_OVERRIDE;
#define FORM_QUESTION_ATTRIBUTE_OVERRIDE_FROM_LINK(a) CR (a, QUESTION_ATTRIBUTE_OVERRIDE, Link, FORM_QUESTION_ATTRIBUTE_OVERRIDE_SIGNATURE)
struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL {
///
/// Version for protocol future extension.
@ -82,6 +97,10 @@ struct _EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL {
/// A list of type FORMID_INFO is Browser View Form History List.
///
LIST_ENTRY FormViewHistoryHead;
///
/// A list of type QUESTION_ATTRIBUTE_OVERRIDE.
///
LIST_ENTRY OverrideQestListHead;
};
extern EFI_GUID gEdkiiFormBrowserEx2ProtocolGuid;

View File

@ -569,6 +569,47 @@ UpdateHotkeyList (
}
}
/**
Get the extra question attribute from override question list.
@param QuestionId The question id for this request question.
@retval The attribute for this question or NULL if not found this
question in the list.
**/
UINT32
ProcessQuestionExtraAttr (
IN EFI_QUESTION_ID QuestionId
)
{
LIST_ENTRY *Link;
QUESTION_ATTRIBUTE_OVERRIDE *QuestionDesc;
//
// Return HII_DISPLAY_NONE if input a invalid question id.
//
if (QuestionId == 0) {
return HII_DISPLAY_NONE;
}
Link = GetFirstNode (&mPrivateData.FormBrowserEx2.OverrideQestListHead);
while (!IsNull (&mPrivateData.FormBrowserEx2.OverrideQestListHead, Link)) {
QuestionDesc = FORM_QUESTION_ATTRIBUTE_OVERRIDE_FROM_LINK (Link);
Link = GetNextNode (&mPrivateData.FormBrowserEx2.OverrideQestListHead, Link);
if ((QuestionDesc->QuestionId == QuestionId) &&
(QuestionDesc->FormId == gCurrentSelection->FormId) &&
(QuestionDesc->HiiHandle == gCurrentSelection->Handle) &&
CompareGuid (&QuestionDesc->FormSetGuid, &gCurrentSelection->FormSetGuid)) {
return QuestionDesc->Attribute;
}
}
return HII_DISPLAY_NONE;
}
/**
Enum all statement in current form, find all the statement can be display and
@ -589,6 +630,7 @@ AddStatementToDisplayForm (
EFI_EVENT RefreshIntervalEvent;
FORM_BROWSER_REFRESH_EVENT_NODE *EventNode;
BOOLEAN FormEditable;
UINT32 ExtraAttribute;
HostDisplayStatement = NULL;
MinRefreshInterval = 0;
@ -630,6 +672,14 @@ AddStatementToDisplayForm (
continue;
}
//
// Check the extra attribute.
//
ExtraAttribute = ProcessQuestionExtraAttr (Statement->QuestionId);
if ((ExtraAttribute & HII_DISPLAY_SUPPRESS) != 0) {
continue;
}
DisplayStatement = AllocateZeroPool (sizeof (FORM_DISPLAY_ENGINE_STATEMENT));
ASSERT (DisplayStatement != NULL);
@ -638,6 +688,11 @@ AddStatementToDisplayForm (
//
InitializeDisplayStatement(DisplayStatement, Statement, HostDisplayStatement);
//
// Set the extra attribute.
//
DisplayStatement->Attribute |= ExtraAttribute;
//
// Save the Host statement info.
// Host statement may has nest statement follow it.

View File

@ -767,6 +767,7 @@ InitializeSetup (
// Install FormBrowserEx2 protocol
//
InitializeListHead (&mPrivateData.FormBrowserEx2.FormViewHistoryHead);
InitializeListHead (&mPrivateData.FormBrowserEx2.OverrideQestListHead);
mPrivateData.Handle = NULL;
Status = gBS->InstallProtocolInterface (
&mPrivateData.Handle,

View File

@ -548,6 +548,7 @@ extern LIST_ENTRY gBrowserHotKeyList;
extern BROWSER_SETTING_SCOPE gBrowserSettingScope;
extern EXIT_HANDLER ExitHandlerFunction;
extern EFI_HII_HANDLE mCurrentHiiHandle;
extern SETUP_DRIVER_PRIVATE_DATA mPrivateData;
//
// Browser Global Strings
//