//\r
// Input value is not valid, restore Question Value\r
//\r
- GetQuestionValue (FormSet, Form, Question, TRUE);\r
+ GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
} else {\r
- SetQuestionValue (FormSet, Form, Question, TRUE);\r
+ SetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
if (!DateOrTime || (Question->Storage != NULL)) {\r
//\r
// NV flag is unnecessary for RTC type of Date/Time\r
}\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
+ continue;\r
+ } else {\r
+ PopUpMenuLines++;\r
+ }\r
+ }\r
}\r
\r
//\r
Link = GetFirstNode (&Question->OptionListHead);\r
for (Index = 0; Index < PopUpMenuLines; Index++) {\r
OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+ Index--;\r
+ continue;\r
+ }\r
\r
StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
if (StrLen (StringPtr) > PopUpWidth) {\r
//\r
HighlightOptionIndex = Index;\r
}\r
-\r
- Link = GetNextNode (&Question->OptionListHead, Link);\r
}\r
\r
//\r
Link = GetFirstNode (&Question->OptionListHead);\r
for (Index = 0; Index < TopOptionIndex; Index++) {\r
Link = GetNextNode (&Question->OptionListHead, Link);\r
+\r
+ OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
+ if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+ Index--;\r
+ continue;\r
+ }\r
}\r
\r
//\r
OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
Link = GetNextNode (&Question->OptionListHead, Link);\r
\r
+ if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
+ EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
+ Index--;\r
+ continue;\r
+ }\r
+\r
StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
ASSERT (StringPtr != NULL);\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
//\r
// Input value is not valid, restore Question Value\r
//\r
- GetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);\r
+ GetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
} else {\r
- SetQuestionValue (Selection->FormSet, Selection->Form, Question, TRUE);\r
+ SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
}\r
\r
{\r
EFI_STATUS Status;\r
\r
- do {\r
- UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);\r
+ while (TRUE) {\r
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
- } while (EFI_ERROR(Status));\r
+ if (!EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+\r
+ if (Status != EFI_NOT_READY) {\r
+ continue;\r
+ }\r
\r
+ UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);\r
+ }\r
return Status;\r
}\r