0xE38C1029, 0xE38F, 0x45b9, {0x8F, 0x0D, 0xE2, 0xE6, 0x0B, 0xC9, 0xB2, 0x62}\r
};\r
\r
-FORM_ENTRY_INFO gFormEntryInfo;\r
-UINTN gSequence;\r
+BOOLEAN gMisMatch;\r
EFI_SCREEN_DESCRIPTOR gStatementDimensions;\r
BOOLEAN mStatementLayoutIsChanged = TRUE;\r
USER_INPUT *gUserInput;\r
return TopOfScreen;\r
}\r
\r
+/**\r
+ Get the index info for this opcode.\r
+\r
+ @param OpCode The input opcode for the statement.\r
+\r
+ @retval The index of this statement.\r
+\r
+**/\r
+UINTN\r
+GetIndexInfoForOpcode (\r
+ IN EFI_IFR_OP_HEADER *OpCode\r
+ )\r
+{\r
+ LIST_ENTRY *NewPos;\r
+ UI_MENU_OPTION *MenuOption;\r
+ UINTN Index;\r
+\r
+ NewPos = gMenuOption.ForwardLink;\r
+ Index = 0;\r
+\r
+ for (NewPos = gMenuOption.ForwardLink; NewPos != &gMenuOption; NewPos = NewPos->ForwardLink){\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+\r
+ if (CompareMem (MenuOption->ThisTag->OpCode, OpCode, OpCode->Length) == 0) {\r
+ if (MenuOption->ThisTag->OpCode == OpCode) {\r
+ return Index;\r
+ }\r
+\r
+ Index ++;\r
+ }\r
+ }\r
+\r
+ return Index;\r
+}\r
+\r
+/**\r
+ Is this the saved highlight statement.\r
+\r
+ @param HighLightedStatement The input highlight statement.\r
+\r
+ @retval TRUE This is the highlight statement.\r
+ @retval FALSE This is not the highlight statement.\r
+\r
+**/\r
+BOOLEAN \r
+IsSavedHighlightStatement (\r
+ IN FORM_DISPLAY_ENGINE_STATEMENT *HighLightedStatement\r
+ )\r
+{\r
+ if ((gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle) &&\r
+ (gFormData->FormId == gHighligthMenuInfo.FormId)) {\r
+ if (gHighligthMenuInfo.HLTQuestionId != 0) {\r
+ return (gHighligthMenuInfo.HLTQuestionId == GetQuestionIdInfo (HighLightedStatement->OpCode));\r
+ } else {\r
+ if (CompareMem (gHighligthMenuInfo.HLTOpCode, HighLightedStatement->OpCode, gHighligthMenuInfo.HLTOpCode->Length) == 0) {\r
+ if (gHighligthMenuInfo.HLTIndex == 0 || gHighligthMenuInfo.HLTIndex == GetIndexInfoForOpcode(HighLightedStatement->OpCode)) {\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Is this the highlight menu.\r
+\r
+ @param MenuOption The input Menu option.\r
+\r
+ @retval TRUE This is the highlight menu option.\r
+ @retval FALSE This is not the highlight menu option.\r
+\r
+**/\r
+BOOLEAN\r
+IsHighLightMenuOption (\r
+ IN UI_MENU_OPTION *MenuOption\r
+ )\r
+{\r
+ if (gHighligthMenuInfo.HLTQuestionId != 0) {\r
+ if (GetQuestionIdInfo(MenuOption->ThisTag->OpCode) == gHighligthMenuInfo.HLTQuestionId) {\r
+ return (MenuOption->Sequence == gHighligthMenuInfo.HLTSequence);\r
+ }\r
+ } else {\r
+ if(CompareMem (gHighligthMenuInfo.HLTOpCode, MenuOption->ThisTag->OpCode, gHighligthMenuInfo.HLTOpCode->Length) == 0) {\r
+ if (gHighligthMenuInfo.HLTIndex == 0 || gHighligthMenuInfo.HLTIndex == GetIndexInfoForOpcode(MenuOption->ThisTag->OpCode)) {\r
+ return (MenuOption->Sequence == gHighligthMenuInfo.HLTSequence);\r
+ } else {\r
+ return FALSE;\r
+ }\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Find the highlight menu.\r
+\r
+ If the input is NULL, base on the record highlight info in\r
+ gHighligthMenuInfo to find the last highlight menu.\r
+\r
+ @param HighLightedStatement The input highlight statement.\r
+\r
+ @retval The highlight menu index.\r
+\r
+**/\r
+LIST_ENTRY *\r
+FindHighLightMenuOption (\r
+ IN FORM_DISPLAY_ENGINE_STATEMENT *HighLightedStatement\r
+ )\r
+{\r
+ LIST_ENTRY *NewPos;\r
+ UI_MENU_OPTION *MenuOption;\r
+\r
+ NewPos = gMenuOption.ForwardLink;\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+\r
+ if (HighLightedStatement != NULL) {\r
+ while (MenuOption->ThisTag != HighLightedStatement) {\r
+ NewPos = NewPos->ForwardLink;\r
+ if (NewPos == &gMenuOption) {\r
+ //\r
+ // Not Found it, break\r
+ //\r
+ break;\r
+ }\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+ }\r
+\r
+ //\r
+ // Must find the highlight statement.\r
+ //\r
+ ASSERT (NewPos != &gMenuOption);\r
+\r
+ } else {\r
+ while (!IsHighLightMenuOption (MenuOption)) {\r
+ NewPos = NewPos->ForwardLink;\r
+ if (NewPos == &gMenuOption) {\r
+ //\r
+ // Not Found it, break\r
+ //\r
+ break;\r
+ }\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+ }\r
+\r
+ //\r
+ // Highlight statement has disappear (suppressed/disableed)\r
+ //\r
+ if (NewPos == &gMenuOption) {\r
+ NewPos = NULL;\r
+ }\r
+ }\r
+\r
+ return NewPos;\r
+}\r
+\r
+/**\r
+ Is this the Top of screen menu.\r
+\r
+ @param MenuOption The input Menu option.\r
+\r
+ @retval TRUE This is the Top of screen menu option.\r
+ @retval FALSE This is not the Top of screen menu option.\r
+\r
+**/\r
+BOOLEAN\r
+IsTopOfScreeMenuOption (\r
+ IN UI_MENU_OPTION *MenuOption\r
+ )\r
+{\r
+ if (gHighligthMenuInfo.TOSQuestionId != 0) {\r
+ return (GetQuestionIdInfo(MenuOption->ThisTag->OpCode) == gHighligthMenuInfo.TOSQuestionId);\r
+ } \r
+\r
+ if(CompareMem (gHighligthMenuInfo.TOSOpCode, MenuOption->ThisTag->OpCode, gHighligthMenuInfo.TOSOpCode->Length) == 0) {\r
+ if (gHighligthMenuInfo.TOSIndex == 0 || gHighligthMenuInfo.TOSIndex == GetIndexInfoForOpcode(MenuOption->ThisTag->OpCode)) {\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Find the Top of screen menu.\r
+\r
+ If the input is NULL, base on the record highlight info in\r
+ gHighligthMenuInfo to find the last highlight menu.\r
+\r
+ @param HighLightedStatement The input highlight statement.\r
+\r
+ @retval The highlight menu index.\r
+\r
+**/\r
+LIST_ENTRY *\r
+FindTopOfScreenMenuOption (\r
+ VOID\r
+ )\r
+{\r
+ LIST_ENTRY *NewPos;\r
+ UI_MENU_OPTION *MenuOption;\r
+\r
+ NewPos = gMenuOption.ForwardLink;\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+\r
+ while (!IsTopOfScreeMenuOption(MenuOption)) {\r
+ NewPos = NewPos->ForwardLink;\r
+ if (NewPos == &gMenuOption) {\r
+ //\r
+ // Not Found it, break\r
+ //\r
+ break;\r
+ }\r
+ MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+ }\r
+\r
+ //\r
+ // Last time top of screen menu has disappeared.\r
+ //\r
+ if (NewPos == &gMenuOption) {\r
+ NewPos = NULL;\r
+ }\r
+\r
+ return NewPos;\r
+}\r
+\r
/**\r
Find the first menu which will be show at the top.\r
\r
OUT UINTN *SkipValue\r
)\r
{\r
- LIST_ENTRY *NewPos;\r
UINTN TopRow;\r
UINTN BottomRow;\r
- UI_MENU_OPTION *SavedMenuOption;\r
+ UI_MENU_OPTION *MenuOption;\r
UINTN TmpValue;\r
\r
- TmpValue = 0;\r
TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;\r
BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;\r
\r
- //\r
- // If not has input highlight statement, just return the first one in this form.\r
- //\r
- if (FormData->HighLightedStatement == NULL) {\r
- *TopOfScreen = gMenuOption.ForwardLink;\r
- *HighlightMenu = gMenuOption.ForwardLink;\r
- if (!IsListEmpty (&gMenuOption)) {\r
- MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow, TRUE);\r
- }\r
- *SkipValue = 0;\r
- return;\r
- }\r
-\r
- //\r
- // Now base on the input highlight menu to find the top menu in this page.\r
- // Will base on the highlight menu show at the bottom to find the top menu.\r
- //\r
- NewPos = gMenuOption.ForwardLink;\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+ if (gMisMatch) {\r
+ //\r
+ // Reenter caused by option mismatch or auto exit caused by refresh form(refresh interval/guid), \r
+ // base on the record highlight info to find the highlight menu.\r
+ //\r
+ ASSERT (gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle &&\r
+ gFormData->FormId == gHighligthMenuInfo.FormId);\r
\r
- while ((SavedMenuOption->ThisTag != FormData->HighLightedStatement) ||\r
- (SavedMenuOption->Sequence != gSequence)) {\r
- NewPos = NewPos->ForwardLink;\r
- if (NewPos == &gMenuOption) {\r
+ *HighlightMenu = FindHighLightMenuOption(NULL);\r
+ if (*HighlightMenu != NULL) {\r
//\r
- // Not Found it, break\r
+ // Update skip info for this highlight menu.\r
//\r
- break;\r
- }\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- }\r
- ASSERT (SavedMenuOption->ThisTag == FormData->HighLightedStatement);\r
+ MenuOption = MENU_OPTION_FROM_LINK (*HighlightMenu);\r
+ UpdateOptionSkipLines (MenuOption);\r
\r
- *HighlightMenu = NewPos;\r
-\r
- AdjustDateAndTimePosition(FALSE, &NewPos);\r
- SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- UpdateOptionSkipLines (SavedMenuOption);\r
+ //\r
+ // Found the last time highlight menu.\r
+ //\r
+ *TopOfScreen = FindTopOfScreenMenuOption();\r
+ if (*TopOfScreen != NULL) {\r
+ //\r
+ // Found the last time selectable top of screen menu.\r
+ //\r
+ AdjustDateAndTimePosition(TRUE, TopOfScreen);\r
+ MenuOption = MENU_OPTION_FROM_LINK (*TopOfScreen);\r
+ UpdateOptionSkipLines (MenuOption);\r
\r
- //\r
- // FormRefreshEvent != NULL means this form will auto exit at an interval, display engine \r
- // will try to keep highlight on the current position after this form exit and re-enter.\r
- //\r
- // HiiHandle + QuestionId can find the only one question in the system.\r
- //\r
- // If this question has question id, save the question id info to find the question.\r
- // else save the opcode buffer to find it.\r
- //\r
- if (gFormData->FormRefreshEvent != NULL && gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle) {\r
- if (gHighligthMenuInfo.QuestionId != 0) { \r
- if (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode)) {\r
- BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;\r
+ *SkipValue = gHighligthMenuInfo.SkipValue;\r
+ } else {\r
//\r
- // SkipValue only used for menu at the top of the form.\r
- // If Highlight menu is not at the top, this value will be update later.\r
+ // Not found last time top of screen menu, so base on current highlight menu\r
+ // to find the new top of screen menu.\r
+ // Make the current highlight menu at the bottom of the form to calculate the\r
+ // top of screen menu.\r
//\r
- TmpValue = gHighligthMenuInfo.SkipValue;\r
+ if (MenuOption->Skip >= BottomRow - TopRow) {\r
+ *TopOfScreen = *HighlightMenu;\r
+ TmpValue = 0;\r
+ } else {\r
+ *TopOfScreen = FindTopOfScreenMenu(*HighlightMenu, BottomRow - TopRow - MenuOption->Skip, &TmpValue);\r
+ }\r
+\r
+ *SkipValue = TmpValue;\r
}\r
- } else if (gHighligthMenuInfo.OpCode != NULL){\r
- if (!CompareMem (gHighligthMenuInfo.OpCode, SavedMenuOption->ThisTag->OpCode, gHighligthMenuInfo.OpCode->Length)) {\r
- BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;\r
+ } else {\r
+ //\r
+ // Last time highlight menu has disappear, find the first highlightable menu as the defalut one.\r
+ //\r
+ *HighlightMenu = gMenuOption.ForwardLink;\r
+ if (!IsListEmpty (&gMenuOption)) {\r
+ MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow, TRUE);\r
+ }\r
+ *TopOfScreen = gMenuOption.ForwardLink;\r
+ *SkipValue = 0;\r
+ }\r
+\r
+ gMisMatch = FALSE;\r
+ } else if (FormData->HighLightedStatement != NULL) {\r
+ if (IsSavedHighlightStatement (FormData->HighLightedStatement)) {\r
+ //\r
+ // Input highlight menu is same as last time highlight menu.\r
+ // Base on last time highlight menu to set the top of screen menu and highlight menu.\r
+ //\r
+ *HighlightMenu = FindHighLightMenuOption(NULL);\r
+ ASSERT (*HighlightMenu != NULL);\r
+\r
+ //\r
+ // Update skip info for this highlight menu.\r
+ //\r
+ MenuOption = MENU_OPTION_FROM_LINK (*HighlightMenu);\r
+ UpdateOptionSkipLines (MenuOption);\r
+ \r
+ *TopOfScreen = FindTopOfScreenMenuOption();\r
+ if (*TopOfScreen == NULL) {\r
//\r
- // SkipValue only used for menu at the top of the form.\r
- // If Highlight menu is not at the top, this value will be update later.\r
+ // Not found last time top of screen menu, so base on current highlight menu\r
+ // to find the new top of screen menu.\r
+ // Make the current highlight menu at the bottom of the form to calculate the\r
+ // top of screen menu.\r
//\r
- TmpValue = gHighligthMenuInfo.SkipValue;\r
+ if (MenuOption->Skip >= BottomRow - TopRow) {\r
+ *TopOfScreen = *HighlightMenu;\r
+ TmpValue = 0;\r
+ } else {\r
+ *TopOfScreen = FindTopOfScreenMenu(*HighlightMenu, BottomRow - TopRow - MenuOption->Skip, &TmpValue);\r
+ }\r
+\r
+ *SkipValue = TmpValue;\r
+ } else {\r
+ AdjustDateAndTimePosition(TRUE, TopOfScreen);\r
+ MenuOption = MENU_OPTION_FROM_LINK (*TopOfScreen);\r
+ UpdateOptionSkipLines (MenuOption);\r
+\r
+ *SkipValue = gHighligthMenuInfo.SkipValue;\r
}\r
- }\r
- }\r
+ AdjustDateAndTimePosition(TRUE, TopOfScreen);\r
+ } else {\r
+ //\r
+ // Input highlight menu is not save as last time highlight menu.\r
+ //\r
+ *HighlightMenu = FindHighLightMenuOption(FormData->HighLightedStatement);\r
+ MenuOption = MENU_OPTION_FROM_LINK (*HighlightMenu);\r
+ UpdateOptionSkipLines (MenuOption);\r
\r
- if (SavedMenuOption->Skip >= BottomRow - TopRow) {\r
- *TopOfScreen = NewPos;\r
+ //\r
+ // Make the current highlight menu at the bottom of the form to calculate the\r
+ // top of screen menu.\r
+ //\r
+ if (MenuOption->Skip >= BottomRow - TopRow) {\r
+ *TopOfScreen = *HighlightMenu;\r
+ TmpValue = 0;\r
+ } else {\r
+ *TopOfScreen = FindTopOfScreenMenu(*HighlightMenu, BottomRow - TopRow - MenuOption->Skip, &TmpValue);\r
+ }\r
+\r
+ *SkipValue = TmpValue;\r
+ }\r
+ AdjustDateAndTimePosition(TRUE, TopOfScreen);\r
} else {\r
- *TopOfScreen = FindTopOfScreenMenu(NewPos, BottomRow - TopRow - SavedMenuOption->Skip, &TmpValue);\r
+ //\r
+ // If not has input highlight statement, just return the first one in this form.\r
+ //\r
+ *TopOfScreen = gMenuOption.ForwardLink;\r
+ *HighlightMenu = gMenuOption.ForwardLink;\r
+ if (!IsListEmpty (&gMenuOption)) {\r
+ MoveToNextStatement (FALSE, HighlightMenu, BottomRow - TopRow, TRUE);\r
+ }\r
+ *SkipValue = 0;\r
}\r
- AdjustDateAndTimePosition(TRUE, TopOfScreen);\r
-\r
- *SkipValue = TmpValue;\r
}\r
\r
/**\r
- Update highlight menu info.\r
+ Record the highlight menu and top of screen menu info.\r
\r
- @param MenuOption The menu opton which is highlight.\r
- @param SkipValue The skipvalue info for this menu.\r
- SkipValue only used for the menu at the top of the form.\r
+ @param Highlight The menu opton which is highlight.\r
+ @param TopOfScreen The menu opton which is at the top of the form.\r
+ @param SkipValue The skip line info for the top of screen menu.\r
\r
**/\r
VOID\r
UpdateHighlightMenuInfo (\r
- IN UI_MENU_OPTION *MenuOption,\r
- IN UINTN SkipValue\r
+ IN LIST_ENTRY *Highlight,\r
+ IN LIST_ENTRY *TopOfScreen,\r
+ IN UINTN SkipValue\r
)\r
{\r
+ UI_MENU_OPTION *MenuOption;\r
FORM_DISPLAY_ENGINE_STATEMENT *Statement;\r
\r
- //\r
- // This is the current selected statement\r
- //\r
- Statement = MenuOption->ThisTag;\r
+ gHighligthMenuInfo.HiiHandle = gFormData->HiiHandle;\r
+ gHighligthMenuInfo.FormId = gFormData->FormId;\r
+ gHighligthMenuInfo.SkipValue = (UINT16)SkipValue;\r
\r
- //\r
- // Get the highlight statement.\r
- //\r
- gUserInput->SelectedStatement = Statement;\r
- gSequence = (UINT16) MenuOption->Sequence;\r
+ if (!IsListEmpty (&gMenuOption)) {\r
+ MenuOption = MENU_OPTION_FROM_LINK (Highlight);\r
+ Statement = MenuOption->ThisTag;\r
\r
- //\r
- // FormRefreshEvent != NULL means this form will auto exit at an interval, display engine \r
- // will try to keep highlight on the current position after this form exit and re-enter.\r
- //\r
- // HiiHandle + QuestionId can find the only one question in the system.\r
- //\r
- // If this question has question id, base on the question id info to find the question.\r
- // else base on the opcode buffer to find it.\r
- //\r
- if (gFormData->FormRefreshEvent != NULL) {\r
- gHighligthMenuInfo.HiiHandle = gFormData->HiiHandle;\r
- gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);\r
+ gUserInput->SelectedStatement = Statement;\r
\r
- //\r
- // if question id == 0, save the opcode buffer for later use.\r
- //\r
- if (gHighligthMenuInfo.QuestionId == 0) {\r
- if (gHighligthMenuInfo.OpCode != NULL) {\r
- FreePool (gHighligthMenuInfo.OpCode);\r
+ gHighligthMenuInfo.HLTSequence = MenuOption->Sequence;\r
+ gHighligthMenuInfo.HLTQuestionId = GetQuestionIdInfo(Statement->OpCode);\r
+ if (gHighligthMenuInfo.HLTQuestionId == 0) {\r
+ //\r
+ // if question id == 0, save the opcode buffer..\r
+ //\r
+ if (gHighligthMenuInfo.HLTOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.HLTOpCode);\r
}\r
- gHighligthMenuInfo.OpCode = AllocateCopyPool (Statement->OpCode->Length, Statement->OpCode);\r
- ASSERT (gHighligthMenuInfo.OpCode != NULL);\r
+ gHighligthMenuInfo.HLTOpCode = AllocateCopyPool (Statement->OpCode->Length, Statement->OpCode);\r
+ ASSERT (gHighligthMenuInfo.HLTOpCode != NULL);\r
+\r
+ gHighligthMenuInfo.HLTIndex = GetIndexInfoForOpcode(Statement->OpCode);\r
+ }\r
+\r
+ MenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
+ Statement = MenuOption->ThisTag;\r
+\r
+ gHighligthMenuInfo.TOSQuestionId = GetQuestionIdInfo(Statement->OpCode);\r
+ if (gHighligthMenuInfo.TOSQuestionId == 0) {\r
+ //\r
+ // if question id == 0, save the opcode buffer..\r
+ //\r
+ if (gHighligthMenuInfo.TOSOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.TOSOpCode);\r
+ }\r
+ gHighligthMenuInfo.TOSOpCode = AllocateCopyPool (Statement->OpCode->Length, Statement->OpCode);\r
+ ASSERT (gHighligthMenuInfo.TOSOpCode != NULL);\r
+\r
+ gHighligthMenuInfo.TOSIndex = GetIndexInfoForOpcode(Statement->OpCode);\r
}\r
- gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;\r
- gHighligthMenuInfo.SkipValue = (UINT16) SkipValue;\r
} else {\r
- gHighligthMenuInfo.HiiHandle = NULL;\r
- gHighligthMenuInfo.QuestionId = 0;\r
- if (gHighligthMenuInfo.OpCode != NULL) {\r
- FreePool (gHighligthMenuInfo.OpCode);\r
- gHighligthMenuInfo.OpCode = NULL;\r
+ gUserInput->SelectedStatement = NULL;\r
+\r
+ gHighligthMenuInfo.HLTSequence = 0;\r
+ gHighligthMenuInfo.HLTQuestionId = 0;\r
+ if (gHighligthMenuInfo.HLTOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.HLTOpCode);\r
}\r
- gHighligthMenuInfo.DisplayRow = 0;\r
- gHighligthMenuInfo.SkipValue = 0;\r
- }\r
+ gHighligthMenuInfo.HLTOpCode = NULL;\r
+ gHighligthMenuInfo.HLTIndex = 0;\r
\r
- RefreshKeyHelp(gFormData, Statement, FALSE);\r
+ gHighligthMenuInfo.TOSQuestionId = 0;\r
+ if (gHighligthMenuInfo.TOSOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.TOSOpCode);\r
+ }\r
+ gHighligthMenuInfo.TOSOpCode = NULL;\r
+ gHighligthMenuInfo.TOSIndex = 0;\r
+ }\r
}\r
\r
/**\r
}\r
\r
FindTopMenu(FormData, &TopOfScreen, &NewPos, &SkipValue);\r
+ if (!IsListEmpty (&gMenuOption)) {\r
+ NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
+ gUserInput->SelectedStatement = NextMenuOption->ThisTag;\r
+ }\r
\r
gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
\r
}\r
\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ if (gMisMatch) {\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ return Status;\r
+ }\r
}\r
//\r
// 3. Update the row info which will be used by next menu.\r
//\r
ControlFlag = CfUpdateHelpString;\r
\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
+\r
if (SkipHighLight) {\r
- MenuOption = SavedMenuOption;\r
SkipHighLight = FALSE;\r
- UpdateHighlightMenuInfo (MenuOption, TopOfScreen == &MenuOption->Link ? SkipValue : 0);\r
+ MenuOption = SavedMenuOption;\r
+ RefreshKeyHelp(gFormData, SavedMenuOption->ThisTag, FALSE);\r
break;\r
}\r
\r
// This is the current selected statement\r
//\r
MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
- Statement = MenuOption->ThisTag;\r
-\r
- UpdateHighlightMenuInfo (MenuOption, Temp2);\r
+ RefreshKeyHelp(gFormData, MenuOption->ThisTag, FALSE);\r
\r
if (!IsSelectable (MenuOption)) {\r
break;\r
}\r
\r
if (EventType == UIEventDriver) {\r
+ gMisMatch = TRUE;\r
gUserInput->Action = BROWSER_ACTION_NONE;\r
ControlFlag = CfExit;\r
break;\r
break;\r
}\r
\r
- //\r
- // When user press ESC, it will try to show another menu, should clean the gSequence info.\r
- //\r
- if (gSequence != 0) {\r
- gSequence = 0;\r
- }\r
-\r
gUserInput->Action = BROWSER_ACTION_FORM_EXIT;\r
ControlFlag = CfExit;\r
break;\r
//\r
AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
AdjustDateAndTimePosition (TRUE, &NewPos);\r
+\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
break;\r
\r
case CfUiPageUp:\r
//\r
AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
AdjustDateAndTimePosition (TRUE, &NewPos);\r
+\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
break;\r
\r
case CfUiPageDown:\r
//\r
AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
AdjustDateAndTimePosition (TRUE, &NewPos);\r
+\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
break;\r
\r
case CfUiDown:\r
//\r
AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
AdjustDateAndTimePosition (TRUE, &NewPos);\r
+\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
break;\r
} \r
\r
//\r
AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
AdjustDateAndTimePosition (TRUE, &NewPos);\r
+\r
+ UpdateHighlightMenuInfo(NewPos, TopOfScreen, SkipValue);\r
break;\r
\r
case CfUiNoOperation:\r
\r
FreeDisplayStrings ();\r
\r
- if (gHighligthMenuInfo.OpCode != NULL) {\r
- FreePool (gHighligthMenuInfo.OpCode);\r
+ if (gHighligthMenuInfo.HLTOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.HLTOpCode);\r
+ }\r
+\r
+ if (gHighligthMenuInfo.TOSOpCode != NULL) {\r
+ FreePool (gHighligthMenuInfo.TOSOpCode);\r
}\r
\r
return EFI_SUCCESS;\r
Process the user input data.\r
\r
@param UserInput The user input data.\r
- @param ChangeHighlight Whether need to change the highlight statement. \r
\r
@retval EFI_SUCESSS This function always return successfully for now.\r
\r
**/\r
EFI_STATUS\r
ProcessUserInput (\r
- IN USER_INPUT *UserInput,\r
- IN BOOLEAN ChangeHighlight\r
+ IN USER_INPUT *UserInput\r
)\r
{\r
EFI_STATUS Status;\r
FORM_BROWSER_STATEMENT *Statement;\r
\r
- Status = EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
+ Statement = NULL;\r
\r
//\r
// When Exit from FormDisplay function, one of the below two cases must be true.\r
// Remove the last highligh question id, this id will update when show next form.\r
//\r
gCurrentSelection->QuestionId = 0;\r
+ if (UserInput->SelectedStatement != NULL){\r
+ Statement = GetBrowserStatement(UserInput->SelectedStatement);\r
+ ASSERT (Statement != NULL);\r
+\r
+ //\r
+ // This question is the current user select one,record it and later\r
+ // show it as the highlight question.\r
+ //\r
+ gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
+ //\r
+ // For statement like text, actio, it not has question id.\r
+ // So use FakeQuestionId to save the question.\r
+ //\r
+ if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
+ mCurFakeQestId = Statement->FakeQuestionId;\r
+ } else {\r
+ mCurFakeQestId = 0;\r
+ }\r
+ }\r
\r
//\r
// First process the Action field in USER_INPUT.\r
//\r
if (UserInput->Action != 0) {\r
Status = ProcessAction (UserInput->Action, UserInput->DefaultId);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Clear the highlight info.\r
- //\r
gCurrentSelection->Statement = NULL;\r
-\r
- if (UserInput->SelectedStatement != NULL) {\r
- Statement = GetBrowserStatement(UserInput->SelectedStatement);\r
- ASSERT (Statement != NULL);\r
- //\r
- // Save the current highlight menu in the menu history data.\r
- // which will be used when later browse back to this form.\r
- //\r
- gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
- //\r
- // For statement like text, actio, it not has question id.\r
- // So use FakeQuestionId to save the question.\r
- //\r
- if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
- mCurFakeQestId = Statement->FakeQuestionId;\r
- } else {\r
- mCurFakeQestId = 0;\r
- }\r
- }\r
} else {\r
- Statement = GetBrowserStatement(UserInput->SelectedStatement);\r
ASSERT (Statement != NULL);\r
-\r
gCurrentSelection->Statement = Statement;\r
-\r
- if (ChangeHighlight) {\r
- //\r
- // This question is the current user select one,record it and later\r
- // show it as the highlight question.\r
- //\r
- gCurrentSelection->CurrentMenu->QuestionId = Statement->QuestionId;\r
- //\r
- // For statement like text, actio, it not has question id.\r
- // So use FakeQuestionId to save the question.\r
- //\r
- if (gCurrentSelection->CurrentMenu->QuestionId == 0) {\r
- mCurFakeQestId = Statement->FakeQuestionId;\r
- } else {\r
- mCurFakeQestId = 0;\r
- }\r
- }\r
-\r
switch (Statement->Operand) {\r
case EFI_IFR_REF_OP:\r
Status = ProcessGotoOpCode(Statement, gCurrentSelection);\r
EFI_STATUS Status;\r
USER_INPUT UserInput;\r
FORM_ENTRY_INFO *CurrentMenu;\r
- BOOLEAN ChangeHighlight;\r
\r
ZeroMem (&UserInput, sizeof (USER_INPUT));\r
\r
\r
gCurrentSelection->CurrentMenu = CurrentMenu;\r
\r
- //\r
- // Find currrent highlight statement.\r
- //\r
if (gCurrentSelection->QuestionId == 0) {\r
//\r
// Highlight not specified, fetch it from cached menu\r
gCurrentSelection->QuestionId = CurrentMenu->QuestionId;\r
}\r
\r
- //\r
- // Evaluate all the Expressions in this Form\r
- //\r
Status = EvaluateFormExpressions (gCurrentSelection->FormSet, gCurrentSelection->Form);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
\r
UpdateDisplayFormData ();\r
\r
- //\r
- // Three possible status maybe return.\r
- //\r
- // EFI_INVALID_PARAMETER: The input dimension info is not valid.\r
- // EFI_NOT_FOUND: The input value for oneof/orderedlist opcode is not valid\r
- // and an valid value has return.\r
- // EFI_SUCCESS: Success shows form and get user input in UserInput paramenter.\r
- //\r
ASSERT (gDisplayFormData.BrowserStatus == BROWSER_SUCCESS);\r
Status = mFormDisplay->FormDisplay (&gDisplayFormData, &UserInput);\r
- if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {\r
+ if (EFI_ERROR (Status)) {\r
FreeDisplayFormData();\r
return Status;\r
}\r
\r
- //\r
- // If status is EFI_SUCCESS, means user has change the highlight menu and new user input return.\r
- // in this case, browser need to change the highlight menu.\r
- // If status is EFI_NOT_FOUND, means the input DisplayFormData has error for oneof/orderedlist \r
- // opcode and new valid value has return, browser core need to adjust\r
- // value for this opcode and shows this form again.\r
- //\r
- ChangeHighlight = (Status == EFI_SUCCESS ? TRUE :FALSE);\r
-\r
- Status = ProcessUserInput (&UserInput, ChangeHighlight);\r
-\r
+ Status = ProcessUserInput (&UserInput);\r
FreeDisplayFormData();\r
-\r
return Status;\r
}\r
\r