/** @file\r
Implementation for handling user input from the User Interfaces.\r
\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2012, 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
EnterCarriageReturn:\r
\r
case CHAR_CARRIAGE_RETURN:\r
+ //\r
+ // Validate input value with Minimum value.\r
+ //\r
+ if (EditValue < Minimum) {\r
+ UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
+ break;\r
+ } else {\r
+ UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);\r
+ }\r
+\r
//\r
// Store Edit value back to Question\r
//\r
//\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
QUESTION_OPTION *OneOfOption;\r
QUESTION_OPTION *CurrentOption;\r
FORM_BROWSER_STATEMENT *Question;\r
+ INTN Result;\r
\r
DimensionsWidth = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
\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
- (OneOfOption->SuppressExpression->Result.Value.b)) {\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
FreePool (StringPtr);\r
\r
- if (!OrderedList && CompareHiiValue (&Question->HiiValue, &OneOfOption->Value, NULL) == 0) {\r
+ if (!OrderedList && (CompareHiiValue (&Question->HiiValue, &OneOfOption->Value, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
//\r
// Find current selected Option for OneOf\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