]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the logic, only check the value change status for user input action, not detec...
authorEric Dong <eric.dong@intel.com>
Wed, 12 Feb 2014 01:45:35 +0000 (01:45 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 12 Feb 2014 01:45:35 +0000 (01:45 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
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@15229 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

index f8b1d5067eb50bab79d7ca100bde88bf49886091..cdd32c0ed0ff42ffce83dca206027ca4075f047b 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Utility functions for UI presentation.\r
 \r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
 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
@@ -963,6 +963,99 @@ GetBrowserStatement (
   return NULL;\r
 }\r
 \r
+/**\r
+  Update the ValueChanged status for questions in this form.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+\r
+**/\r
+VOID \r
+UpdateStatementStatusForForm (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form\r
+  )\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  FORM_BROWSER_STATEMENT      *Question;\r
+\r
+  Link = GetFirstNode (&Form->StatementListHead);\r
+  while (!IsNull (&Form->StatementListHead, Link)) {\r
+    Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
+    Link = GetNextNode (&Form->StatementListHead, Link);\r
+\r
+    IsQuestionValueChanged(FormSet, Form, Question, GetSetValueWithBuffer);\r
+  }\r
+}\r
+\r
+/**\r
+  Update the ValueChanged status for questions in this formset.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+\r
+**/\r
+VOID \r
+UpdateStatementStatusForFormSet (\r
+  IN FORM_BROWSER_FORMSET                *FormSet\r
+  )\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  FORM_BROWSER_FORM           *Form;\r
+\r
+  Link = GetFirstNode (&FormSet->FormListHead);\r
+  while (!IsNull (&FormSet->FormListHead, Link)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+    Link = GetNextNode (&FormSet->FormListHead, Link);\r
+\r
+    UpdateStatementStatusForForm (FormSet, Form);\r
+  }\r
+}\r
+\r
+/**\r
+  Update the ValueChanged status for questions.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Default action.\r
+\r
+**/\r
+VOID \r
+UpdateStatementStatus (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form, \r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  )\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  FORM_BROWSER_FORMSET        *LocalFormSet;\r
+\r
+  switch (SettingScope) {\r
+  case SystemLevel:\r
+    Link = GetFirstNode (&gBrowserFormSetList);\r
+    while (!IsNull (&gBrowserFormSetList, Link)) {\r
+      LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
+      Link = GetNextNode (&gBrowserFormSetList, Link);\r
+      if (!ValidateFormSet(LocalFormSet)) {\r
+        continue;\r
+      }\r
+\r
+      UpdateStatementStatusForFormSet (LocalFormSet);\r
+    }\r
+    break;\r
+\r
+  case FormSetLevel:\r
+    UpdateStatementStatusForFormSet (FormSet);\r
+    break;\r
+\r
+  case FormLevel:\r
+    UpdateStatementStatusForForm (FormSet, Form);\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+}\r
+\r
 /**\r
 \r
   Process the action request in user input.\r
@@ -998,6 +1091,7 @@ ProcessAction (
 \r
   if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {\r
     ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);\r
+    UpdateStatementStatus (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);\r
   }\r
 \r
   if ((Action & BROWSER_ACTION_SUBMIT) == BROWSER_ACTION_SUBMIT) {\r
@@ -1618,6 +1712,7 @@ ProcessUserInput (
       // Reset Question to default value specified by DefaultId\r
       //\r
       Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);\r
+      UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel);\r
       break;\r
 \r
     default:\r
@@ -2493,6 +2588,11 @@ SetupBrowser (
       } else if (Statement->Operand != EFI_IFR_PASSWORD_OP) {\r
         SetQuestionValue (gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithEditBuffer);\r
       }\r
+\r
+      //\r
+      // Verify whether question value has checked, update the ValueChanged flag in Question.\r
+      //\r
+      IsQuestionValueChanged(gCurrentSelection->FormSet, gCurrentSelection->Form, Statement, GetSetValueWithBuffer);\r
     }\r
 \r
     //\r
index 9b6111c03bcb353160b1ae2272da4b0817f7a5e3..cf1d57549a69d9d851c75bb00afdd475dbd16f69 100644 (file)
@@ -1787,14 +1787,6 @@ SetQuestionValue (
         //     \r
         CopyMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
       }\r
-      //\r
-      // Check whether question value has been changed.\r
-      //\r
-      if (CompareMem (Storage->Buffer + Question->VarStoreInfo.VarOffset, Storage->EditBuffer + Question->VarStoreInfo.VarOffset, StorageWidth) != 0) {\r
-        Question->ValueChanged = TRUE;\r
-      } else {\r
-        Question->ValueChanged = FALSE;\r
-      }\r
     } else {\r
       if (IsString) {\r
         //\r
@@ -1831,14 +1823,6 @@ SetQuestionValue (
       if (EFI_ERROR (Status)) {\r
         return Status;\r
       }\r
-      //\r
-      // Check whether question value has been changed.\r
-      //\r
-      if (StrCmp (Node->Value, Node->EditValue) != 0) {\r
-        Question->ValueChanged = TRUE;\r
-      } else {\r
-        Question->ValueChanged = FALSE;\r
-      }\r
     }\r
   } else if (SetValueTo == GetSetValueWithHiiDriver) {\r
     //\r
@@ -3453,6 +3437,8 @@ IsQuestionValueChanged (
     FreePool (BackUpBuffer);\r
   }\r
 \r
+  Question->ValueChanged = ValueChanged;\r
+\r
   return ValueChanged;\r
 }\r
 \r
@@ -3534,11 +3520,6 @@ LoadFormConfig (
       Status = ProcessCallBackFunction(Selection, FormSet, Form, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
     }\r
 \r
-    //\r
-    // Update Question Value changed flag.\r
-    //\r
-    Question->ValueChanged = IsQuestionValueChanged(FormSet, Form, Question, GetSetValueWithBuffer);\r
-\r
     Link = GetNextNode (&Form->StatementListHead, Link);\r
   }\r
 \r
@@ -4174,6 +4155,94 @@ LoadStorage (
   }\r
 }\r
 \r
+/**\r
+  Get Value changed status from old question.\r
+\r
+  @param  NewFormSet                FormSet data structure.\r
+  @param  OldQuestion               Old question which has value changed.\r
+\r
+**/\r
+VOID\r
+SyncStatusForQuestion (\r
+  IN OUT FORM_BROWSER_FORMSET             *NewFormSet,\r
+  IN     FORM_BROWSER_STATEMENT           *OldQuestion\r
+  )\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  LIST_ENTRY                  *QuestionLink;\r
+  FORM_BROWSER_FORM           *Form;\r
+  FORM_BROWSER_STATEMENT      *Question;\r
+\r
+  //\r
+  // For each form in one formset.\r
+  //\r
+  Link = GetFirstNode (&NewFormSet->FormListHead);\r
+  while (!IsNull (&NewFormSet->FormListHead, Link)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+    Link = GetNextNode (&NewFormSet->FormListHead, Link);\r
+\r
+    //\r
+    // for each question in one form.\r
+    //\r
+    QuestionLink = GetFirstNode (&Form->StatementListHead);\r
+    while (!IsNull (&Form->StatementListHead, QuestionLink)) {\r
+      Question = FORM_BROWSER_STATEMENT_FROM_LINK (QuestionLink);\r
+      QuestionLink = GetNextNode (&Form->StatementListHead, QuestionLink);\r
+\r
+      if (Question->QuestionId == OldQuestion->QuestionId) {\r
+        Question->ValueChanged = TRUE;\r
+        return;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  Get Value changed status from old formset.\r
+\r
+  @param  NewFormSet                FormSet data structure.\r
+  @param  OldFormSet                FormSet data structure.\r
+\r
+**/\r
+VOID\r
+SyncStatusForFormSet (\r
+  IN OUT FORM_BROWSER_FORMSET             *NewFormSet,\r
+  IN     FORM_BROWSER_FORMSET             *OldFormSet\r
+  )\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  LIST_ENTRY                  *QuestionLink;\r
+  FORM_BROWSER_FORM           *Form;\r
+  FORM_BROWSER_STATEMENT      *Question;\r
+\r
+  //\r
+  // For each form in one formset.\r
+  //\r
+  Link = GetFirstNode (&OldFormSet->FormListHead);\r
+  while (!IsNull (&OldFormSet->FormListHead, Link)) {\r
+    Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
+    Link = GetNextNode (&OldFormSet->FormListHead, Link);\r
+\r
+    //\r
+    // for each question in one form.\r
+    //\r
+    QuestionLink = GetFirstNode (&Form->StatementListHead);\r
+    while (!IsNull (&Form->StatementListHead, QuestionLink)) {\r
+      Question = FORM_BROWSER_STATEMENT_FROM_LINK (QuestionLink);\r
+      QuestionLink = GetNextNode (&Form->StatementListHead, QuestionLink);\r
+\r
+      if (!Question->ValueChanged) {\r
+        continue;\r
+      }\r
+\r
+      //\r
+      // Find the same question in new formset and update the value changed flag.\r
+      //\r
+      SyncStatusForQuestion (NewFormSet, Question);\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   Get current setting of Questions.\r
 \r
@@ -4195,6 +4264,7 @@ InitializeCurrentSetting (
   //\r
   OldFormSet = GetFormSetFromHiiHandle (FormSet->HiiHandle);\r
   if (OldFormSet != NULL) {\r
+    SyncStatusForFormSet (FormSet, OldFormSet);\r
     RemoveEntryList (&OldFormSet->Link);\r
     DestroyFormSet (OldFormSet);\r
   }\r
@@ -5000,6 +5070,7 @@ ExecuteAction (
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
+    UpdateStatementStatus (FormSet, Form, gBrowserSettingScope);\r
   }\r
 \r
   //\r
index 87305bad689dc8fdf19cfcb3c4b6f26c7605d787..8fe9e98e63d0fd4952c8e2147413c85c76782d18 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Private MACRO, structure and function definitions for Setup Browser module.\r
 \r
-Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
 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
@@ -712,6 +712,35 @@ IsQuestionValueChanged (
   IN GET_SET_QUESTION_VALUE_WITH      GetValueFrom\r
   );\r
 \r
+/**\r
+  Validate the FormSet. If the formset is not validate, remove it from the list.\r
+\r
+  @param  FormSet                The input FormSet which need to validate.\r
+\r
+  @retval TRUE                   The handle is validate.\r
+  @retval FALSE                  The handle is invalidate.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateFormSet (\r
+  FORM_BROWSER_FORMSET    *FormSet\r
+  );\r
+\r
+/**\r
+  Update the ValueChanged status for questions.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Default action.\r
+\r
+**/\r
+VOID \r
+UpdateStatementStatus (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form, \r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  );\r
+\r
 /**\r
   Get Question's current Value.\r
 \r