}\r
\r
//\r
- // Prepare HiiValue array\r
+ // Move valid Option to list head.\r
//\r
- HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));\r
- ASSERT (HiiValueArray != NULL);\r
- Link = GetFirstNode (&Question->OptionListHead);\r
- for (Index = 0; Index < OptionCount; Index++) {\r
- if (OrderedList) {\r
+ PopUpMenuLines = 0;\r
+ if (OrderedList) {\r
+ //\r
+ // Prepare HiiValue array\r
+ // \r
+ HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));\r
+ ASSERT (HiiValueArray != NULL);\r
+ for (Index = 0; Index < OptionCount; Index++) {\r
HiiValueArray[Index].Type = ValueType;\r
HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
- } else {\r
- OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
- CopyMem (&HiiValueArray[Index], &OneOfOption->Value, sizeof (EFI_HII_VALUE));\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
- }\r
\r
- //\r
- // Move Suppressed Option to list tail\r
- //\r
- PopUpMenuLines = 0;\r
- for (Index = 0; Index < OptionCount; Index++) {\r
- OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);\r
- if (OneOfOption == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
+ for (Index = 0; Index < OptionCount; Index++) {\r
+ OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);\r
+ if (OneOfOption == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
\r
- RemoveEntryList (&OneOfOption->Link);\r
+ RemoveEntryList (&OneOfOption->Link);\r
\r
- if ((OneOfOption->SuppressExpression != NULL) &&\r
- EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
- //\r
- // This option is suppressed, insert to tail\r
//\r
- InsertTailList (&Question->OptionListHead, &OneOfOption->Link);\r
- } else {\r
- //\r
- // Insert to head\r
+ // Insert to head.\r
//\r
InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
\r
PopUpMenuLines++;\r
}\r
+\r
+ FreePool (HiiValueArray);\r
+ } else {\r
+ Link = GetFirstNode (&Question->OptionListHead);\r
+ for (Index = 0; Index < OptionCount; Index++) {\r
+ OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+ if ((OneOfOption->SuppressExpression == NULL) ||\r
+ EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse) {\r
+ RemoveEntryList (&OneOfOption->Link);\r
+ InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
+ PopUpMenuLines++;\r
+ }\r
+ }\r
}\r
\r
//\r
}\r
}\r
\r
- FreePool (HiiValueArray);\r
return EFI_DEVICE_ERROR;\r
\r
default:\r
Link = GetFirstNode (&Question->OptionListHead);\r
while (!IsNull (&Question->OptionListHead, Link)) {\r
OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ if ((OneOfOption->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+ continue;\r
+ }\r
\r
SetArrayData (ValueArray, ValueType, Index, OneOfOption->Value.Value.u64);\r
\r
if (Index > Question->MaxContainers) {\r
break;\r
}\r
-\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
} else {\r
ASSERT (CurrentOption != NULL);\r
}\r
\r
gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
- FreePool (HiiValueArray);\r
\r
Status = ValidateQuestion (Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
if (EFI_ERROR (Status)) {\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
\r
if ((CompareHiiValue (&Option->Value, OptionValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
- return Option;\r
+ //\r
+ // Check the suppressif condition, only a valid option can be return.\r
+ //\r
+ if ((Option->SuppressExpression == NULL) ||\r
+ ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse))) {\r
+ return Option;\r
+ }\r
}\r
\r
Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
}\r
\r
+/**\r
+ Check whether this value already in the array, if yes, return the index.\r
+\r
+ @param Array The data array.\r
+ @param Type Type of the data in this array.\r
+ @param Value The value to be find.\r
+ @param Index The index in the array which has same value with Value.\r
+ \r
+ @retval TRUE Found the value in the array.\r
+ @retval FALSE Not found the value.\r
+\r
+**/\r
+BOOLEAN \r
+FindArrayData (\r
+ IN VOID *Array,\r
+ IN UINT8 Type,\r
+ IN UINT64 Value,\r
+ OUT UINTN *Index OPTIONAL\r
+ )\r
+{\r
+ UINTN Count;\r
+ UINT64 TmpValue;\r
+ \r
+ ASSERT (Array != NULL);\r
+\r
+ Count = 0;\r
+ TmpValue = 0;\r
+\r
+ while ((TmpValue = GetArrayData (Array, Type, Count)) != 0) {\r
+ if (Value == TmpValue) {\r
+ if (Index != NULL) {\r
+ *Index = Count;\r
+ }\r
+ return TRUE;\r
+ }\r
+\r
+ Count ++;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
\r
/**\r
Print Question Value according to it's storage width and display attributes.\r
LIST_ENTRY *Link;\r
EFI_HII_VALUE HiiValue;\r
EFI_HII_VALUE *QuestionValue;\r
- BOOLEAN Suppress;\r
UINT16 Maximum;\r
QUESTION_OPTION *Option;\r
UINTN Index2;\r
Index2 = 0;\r
while (!IsNull (&Question->OptionListHead, Link) && Index2 < Question->MaxContainers) {\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+ if ((Option->SuppressExpression != NULL) &&\r
+ ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
+ continue;\r
+ }\r
SetArrayData (ValueArray, ValueType, Index2, Option->Value.Value.u64);\r
Index2++;\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
SetArrayData (ValueArray, ValueType, Index2, 0);\r
\r
return EFI_NOT_FOUND;\r
}\r
\r
- Suppress = FALSE;\r
+ Character[0] = LEFT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
+ StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+ ASSERT (StringPtr != NULL);\r
+ NewStrCat (OptionString[0], StringPtr);\r
+ Character[0] = RIGHT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
+ Character[0] = CHAR_CARRIAGE_RETURN;\r
+ NewStrCat (OptionString[0], Character);\r
+ FreePool (StringPtr);\r
+ }\r
+\r
+ //\r
+ // Search the other options, try to find the one not in the container.\r
+ //\r
+ Link = GetFirstNode (&Question->OptionListHead);\r
+ while (!IsNull (&Question->OptionListHead, Link)) {\r
+ OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
if ((OneOfOption->SuppressExpression != NULL) &&\r
- (EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress)) {\r
- //\r
- // This option is suppressed\r
- //\r
- Suppress = TRUE;\r
+ ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
+ continue;\r
}\r
\r
- if (!Suppress) {\r
- Character[0] = LEFT_ONEOF_DELIMITER;\r
- NewStrCat (OptionString[0], Character);\r
- StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
- ASSERT (StringPtr != NULL);\r
- NewStrCat (OptionString[0], StringPtr);\r
- Character[0] = RIGHT_ONEOF_DELIMITER;\r
- NewStrCat (OptionString[0], Character);\r
- Character[0] = CHAR_CARRIAGE_RETURN;\r
- NewStrCat (OptionString[0], Character);\r
-\r
- FreePool (StringPtr);\r
+ if (FindArrayData (ValueArray, ValueType, OneOfOption->Value.Value.u64, NULL)) {\r
+ continue;\r
}\r
+\r
+ SetArrayData (ValueArray, ValueType, Index++, OneOfOption->Value.Value.u64);\r
+\r
+ Character[0] = LEFT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
+ StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+ ASSERT (StringPtr != NULL);\r
+ NewStrCat (OptionString[0], StringPtr);\r
+ Character[0] = RIGHT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
+ Character[0] = CHAR_CARRIAGE_RETURN;\r
+ NewStrCat (OptionString[0], Character);\r
+ FreePool (StringPtr);\r
}\r
}\r
break;\r
return EFI_NOT_FOUND;\r
}\r
\r
- if ((OneOfOption->SuppressExpression != NULL) &&\r
- ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
- //\r
- // This option is suppressed\r
- //\r
- Suppress = TRUE;\r
- } else {\r
- Suppress = FALSE;\r
- }\r
-\r
- if (Suppress) {\r
- //\r
- // Current selected option happen to be suppressed,\r
- // enforce to select on a non-suppressed option\r
- //\r
- Link = GetFirstNode (&Question->OptionListHead);\r
- while (!IsNull (&Question->OptionListHead, Link)) {\r
- OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ Character[0] = LEFT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
+ StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
+ ASSERT (StringPtr != NULL);\r
+ NewStrCat (OptionString[0], StringPtr);\r
+ Character[0] = RIGHT_ONEOF_DELIMITER;\r
+ NewStrCat (OptionString[0], Character);\r
\r
- if ((OneOfOption->SuppressExpression == NULL) ||\r
- (EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse)) {\r
- Suppress = FALSE;\r
- CopyMem (QuestionValue, &OneOfOption->Value, sizeof (EFI_HII_VALUE));\r
- SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
- UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
- gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
- break;\r
- }\r
-\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
- }\r
- }\r
-\r
- if (!Suppress) {\r
- Character[0] = LEFT_ONEOF_DELIMITER;\r
- NewStrCat (OptionString[0], Character);\r
- StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
- ASSERT (StringPtr != NULL);\r
- NewStrCat (OptionString[0], StringPtr);\r
- Character[0] = RIGHT_ONEOF_DELIMITER;\r
- NewStrCat (OptionString[0], Character);\r
-\r
- FreePool (StringPtr);\r
- }\r
+ FreePool (StringPtr);\r
}\r
break;\r
\r
Link = GetFirstNode (&Question->OptionListHead);\r
while (!IsNull (&Question->OptionListHead, Link)) {\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ if ((Option->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+ continue;\r
+ }\r
\r
if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT) != 0)) ||\r
((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && ((Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG) != 0))\r
\r
return EFI_SUCCESS;\r
}\r
-\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
}\r
}\r
//\r
if (ValueToOption (Question, HiiValue) == NULL) {\r
Link = GetFirstNode (&Question->OptionListHead);\r
- if (!IsNull (&Question->OptionListHead, Link)) {\r
+ while (!IsNull (&Question->OptionListHead, Link)) {\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ if ((Option->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+ continue;\r
+ }\r
+\r
CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
Status = EFI_SUCCESS;\r
+ break;\r
}\r
}\r
break;\r
while (!IsNull (&Question->OptionListHead, Link)) {\r
Status = EFI_SUCCESS;\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ if ((Option->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
+ continue;\r
+ }\r
\r
SetArrayData (Question->BufferValue, Question->ValueType, Index, Option->Value.Value.u64);\r
\r
if (Index >= Question->MaxContainers) {\r
break;\r
}\r
-\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
break;\r
\r