From 184f3a02d60e994a1a78a7f16ea8cc0b9d0df3e9 Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Mon, 16 Sep 2013 09:50:32 +0000 Subject: Export one interface to support 3rd party to change question attribute, such as hide/gray out. Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14678 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Include/Protocol/DisplayProtocol.h | 2 + MdeModulePkg/Include/Protocol/FormBrowserEx2.h | 19 ++++++++ .../Universal/SetupBrowserDxe/Presentation.c | 55 ++++++++++++++++++++++ MdeModulePkg/Universal/SetupBrowserDxe/Setup.c | 3 +- MdeModulePkg/Universal/SetupBrowserDxe/Setup.h | 1 + 5 files changed, 79 insertions(+), 1 deletion(-) (limited to 'MdeModulePkg') diff --git a/MdeModulePkg/Include/Protocol/DisplayProtocol.h b/MdeModulePkg/Include/Protocol/DisplayProtocol.h index d4f0debf9c..f8b80f5e4a 100644 --- a/MdeModulePkg/Include/Protocol/DisplayProtocol.h +++ b/MdeModulePkg/Include/Protocol/DisplayProtocol.h @@ -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; diff --git a/MdeModulePkg/Include/Protocol/FormBrowserEx2.h b/MdeModulePkg/Include/Protocol/FormBrowserEx2.h index 105ac0308f..df583ef860 100644 --- a/MdeModulePkg/Include/Protocol/FormBrowserEx2.h +++ b/MdeModulePkg/Include/Protocol/FormBrowserEx2.h @@ -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; diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index 4f8d4ee61b..5318290144 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -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. diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index 6dcb4aa77e..63f86809fa 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -766,7 +766,8 @@ InitializeSetup ( // // Install FormBrowserEx2 protocol // - InitializeListHead (&mPrivateData.FormBrowserEx2.FormViewHistoryHead); + InitializeListHead (&mPrivateData.FormBrowserEx2.FormViewHistoryHead); + InitializeListHead (&mPrivateData.FormBrowserEx2.OverrideQestListHead); mPrivateData.Handle = NULL; Status = gBS->InstallProtocolInterface ( &mPrivateData.Handle, diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h index 99418543df..bd19ae6cb7 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h @@ -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 // -- cgit v1.2.3