diff options
Diffstat (limited to 'EDK/MiniSetup/TseLite/ordlistbox.c')
-rw-r--r-- | EDK/MiniSetup/TseLite/ordlistbox.c | 1080 |
1 files changed, 1080 insertions, 0 deletions
diff --git a/EDK/MiniSetup/TseLite/ordlistbox.c b/EDK/MiniSetup/TseLite/ordlistbox.c new file mode 100644 index 0000000..4d388e1 --- /dev/null +++ b/EDK/MiniSetup/TseLite/ordlistbox.c @@ -0,0 +1,1080 @@ +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +//** **// +//** (C)Copyright 2013, American Megatrends, Inc. **// +//** **// +//** All Rights Reserved. **// +//** **// +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **// +//** **// +//** Phone (770)-246-8600 **// +//** **// +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +// $Archive: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/TseLite/ordlistbox.c $ +// +// $Author: Premkumara $ +// +// $Revision: 22 $ +// +// $Date: 5/01/14 3:44p $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/TseLite/ordlistbox.c $ +// +// 22 5/01/14 3:44p Premkumara +// [TAG] EIP123727 +// [Category] Bug Fix +// [Severity] Normal +// [Symptom] Enabling Multiline and in Boot option priorities, Clicking +// on second or third line of the boot item is not selecting boot options +// menu +// [RootCause] Proper Condition was not there to check whether Mouse +// Click +// is within the Width and Height of Control or not. +// [Solution] Added Proper Condition to check whether Mouse Click +// is within the Width and Height of Control or not. +// [Files] Date.c, time.c, frame.c, SubMenu.c, numeric.c, +// PopupString.c, PopupSel.c, ordlistbox.c, PopupPassword.c, UefiAction.c, +// +// 21 7/03/13 10:29a Premkumara +// [TAG] EIP127000 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] After suppressing any of items in orderlist, the listbox is +// showing blank space. If items are changing using +/- then Empty list +// item appear +// [RootCause] Since items are suppressing in listbox and the +// listbox->ItemCount, listbox->Sel, listbox options value and ptrtoken +// value are not updated properly +// [Solution] Handling orderedlistbox items and itemcount properly after +// items are suppressed +// [Files] OrdListBox.c +// -$/Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/TseLite/ordlistbox.c (ver +// 20) +// +// 20 7/02/13 10:19a Premkumara +// [TAG] EIP127000 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] After suppressing any of items in orderlist, the listbox is +// showing blank space. If items are changing using +/- then Empty list +// item appear +// [RootCause] Since items are suppressing in listbox and the +// listbox->ItemCount, listbox->Sel, listbox options value and ptrtoken +// value are not updated properly +// [Solution] Handling orderedlistbox items and itemcount properly after +// items are suppressed +// [Files] OrdListBox.c +// +// 19 10/18/12 8:58a Rajashakerg +// [TAG] EIP103568 +// [Category] Improvement +// [Description] Help string support for ordered list +// [Files] Uefi21Wapper.c, ordlistbox.c +// +// 18 10/18/12 6:02a Arunsb +// Updated for 2.16.1235 QA submission +// +// 9 10/10/12 12:38p Arunsb +// Synched the source for v2.16.1232, backup with Aptio +// +// 17 5/28/12 12:35p Premkumara +// [TAG] EIP67049 & 90224 +// [Category] New Feature +// [Description] Support mouse drag operation in frame and list box +// [Files] CommonHelper.c, Frame.c, ListBox.c, Minisetupext +// +// 16 5/09/12 1:37p Arunsb +// [TAG] EIP86885 +// [Category] Bug Fix +// [Severity] Important +// [Symptom] ISCSI attempt order is not changing on setup +// [RootCause] Orderlist maxcontainers value and ordered list size not +// handled properly +// [Solution] Orderlist maxcontainers value is 0xff, but TSE changed the +// cache value for only the added attempts(dynamic orderlist creation) +// remaining buffer left as is, Now the remaining buffers made as 0. +// [Files] HiiCallback.c and ordlistbox. +// +// 15 2/03/12 4:45a Rajashakerg +// [TAG] EIP75066 +// [Category] Improvement +// [Description] _OrdListGetSelection logic changed to support the +// special controls(Boot Order). +// [Files] Ordlistbox.c, Uefi21Wapper.c, CtrlCond.c, HiiCallback.c, +// Parse.c, Uefi20Wapper.c and TseUefihiil.h +// +// 14 2/02/12 2:50a Premkumara +// [TAG] EIP75066 +// [Category] Improvement +// [Description] Support loading defaults for Ordelist controls +// [Files] Ordlistbox.c, Uefi21Wapper.c, CtrlCond.c, HiiCallback.c, +// Parse.c, Uefi20Wapper.c, TseUefihiil.h +// +// 13 2/01/12 1:49a Arunsb +// [TAG] EIP74968 +// [Category] Improvement +// [Description] Support for mouse drag and drop to rearrange the items +// in the Orderlist. +// [Files] Ordlistbox.c, commonoem.c and commonoem.h +// +// 12 12/10/11 4:45a Arunsb +// Header corrected +// +// 11 12/01/11 7:42a Arunsb +// [TAG] EIP70966 +// UefiGetValidOptionSize fnc declaration added for avoiding build error +// in 2.0. +// +// 10 11/28/11 4:59a Rajashakerg +// [TAG] EIP73231 +// [Category] Improvement +// [Description] Callback handling :For interactive controls updating +// the currnet vaule in cache even when hii callback returns error status. +// [Files] Date.c, SubMenu.c, ordlistbox.c, time.c, UefiAction.c, +// hii.h, uefi20Wapper.c, HiiCallback.c, TseUefiHii.h, Uefi21Wapper.c +// +// 9 11/21/11 11:18a Premkumara +// [TAG] EIP72610 +// [Category] Improvement +// [Description] Moving TSE_MULTILINE_CONTROLS to Binary +// [Files] AMITSE-CommonHelper.c, AMITSE.sdl, +// TSELITE-UefiAction.c, TseLite.sdl, Time.h, Text.c, +// SubMenu.c, ResetButton.c, PopupString.c, PopupSel.h, PopupSel.c, +// PopupPassword.c, OrderListBox.c, Numeric.c, Label.c, Frame.c, Edit.c, +// Date.h, Date.c, +// LEGACY-Legacy.c, +// BOOTONLY- Minisetup.h +// +// 8 11/21/11 8:54a Rajashakerg +// [TAG] EIP69104 +// [Category] Improvement +// [Description] Not to destroy the controls if it is NULL +// [Files] control.c, edit.c, Label.c, memo.c, menu.c, ordlistbox.c, +// popup.c, PopupSel.c, PopupString.c, SubMenu.c, Text.c. +// +// 7 11/14/11 6:55p Blaines +// [TAG] - EIP 75486 +// [Category]- Function Request +// [Synopsis]- Support grayout condition for readonly controls. +// [Description] - Display readonly controls as grayout, non-selectable. +// [Files] +// AMITSE.sdl, CommonHelper.c, Minisetupext.h, stylecommon.c, Legacy.c, +// date.c, edit.c, label.c, memo.c, menu.c,, numeric.c, ordlistbox.c, +// PopupPassword.c, +// PopupSel.c, PopupString.c, ResetButton.c, SubMenu.c, Text.c, Time.c, +// UefiAction.c, ctrlcond.c, +// +// 6 11/03/11 4:29a Premkumara +// [TAG] EIP70966 +// [Category] Improvement +// [Description] Hii orderlist item can't update priority from value in +// Setup menu for both enable and disable TSE_MULTILINE_CONTROLS token +// [Files] Ordlistbox.c, ordlistbox.h, TseUefiHii.h, Uefi21Wrapper.c +// +// 5 3/09/11 7:23p Madhans +// [TAG] EIP48615 +// [Category] Improvement +// [Description] To support UEFI 2.1 RefreshOp. Based in Refersh Rate +// Controls are refershed periodically. +// [Files] minisetupext.h +// SubMenu.h +// SubMenu.c +// Memo.c +// Memo.h +// numeric.c +// numeric.h +// time.c +// Date.c +// PopupSel.c +// PopupSel.h +// PopupString.c +// PopupString.h +// ordlistbox.c +// minisetupext.c +// UefiAction.c +// hii.h +// Uefi20wapper.c +// hiicallback.c +// Parse.c +// tseuefihii.h +// Uefi21wapper.c +// +// 4 4/16/10 5:13p Madhans +// Changes for Tse 2.02. Please see Changelog.log for more details. +// +// 3 2/19/10 1:04p Madhans +// Updated for TSE 2.01. Refer Changelog.log for File change history. +// +// 5 2/19/10 8:18a Mallikarjunanv +// updated year in copyright message +// +// 4 2/17/10 7:03p Madhans +// To suppor readonly control +// +// 3 6/23/09 6:52p Blaines +// Coding standard update, +// Remove spaces from file header to allow proper chm function list +// creation. +// +// 2 6/12/09 7:44p Presannar +// Initial implementation of coding standards for AMITSE2.0 +// +// 1 6/04/09 8:05p Madhans +// +// 1 4/28/09 11:05p Madhans +// Tse 2.0 Code complete Checkin. +// +// 3 3/31/09 4:12p Madhans +// TSE Lite Special control support +// +// 2 1/30/09 6:06p Madhans +// Function headers added. +// +// 1 12/18/08 7:58p Madhans +// Intial version of TSE Lite sources +//*****************************************************************// +//*****************************************************************// + +//<AMI_FHDR_START> +//---------------------------------------------------------------------------- +// +// Name: orderlistbox.c +// +// Description: This file contains code to handle ordered list box controls +// +//---------------------------------------------------------------------------- +//<AMI_FHDR_END> + +#include "minisetup.h" + +VOID _PopupSelGetSelection( POPUPSEL_DATA *popupSel ); +EFI_STATUS _OrdListMultiLIneDraw(ORD_LISTBOX_DATA *OrdList); +UINT16 gOrderlistcount; +extern BOOLEAN lButtonOnListBoxScroll;//EIP-67049 + +ORD_LISTBOX_METHODS gOrdListBox = +{ + OrdListBoxCreate, + OrdListBoxDestroy, + OrdListBoxInitialize, + OrdListBoxDraw, + OrdListBoxHandleAction, + OrdListBoxSetCallback, + OrdListBoxSetFocus, + OrdListBoxSetPosition, + OrdListBoxSetDimensions, + OrdListBoxSetAttributes, + OrdListGetControlHeight +}; +VOID UefiGetValidOptionType(CONTROL_INFO *CtrlInfo, UINTN *Type, UINT32 *SizeOfData); +BOOLEAN FirstDownEvent = FALSE; //EIP74968 Change Order in Orderlist using Mouse drag +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxCreate +// +// Description: function to Create a Order List Box, which uses the PopupSel Fucntions +// +// Input: ORD_LISTBOX_DATA **object +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxCreate( ORD_LISTBOX_DATA **object ) +{ + EFI_STATUS Status = EFI_OUT_OF_RESOURCES; + + if ( *object == NULL ) + { + *object = EfiLibAllocateZeroPool( sizeof(ORD_LISTBOX_DATA) ); + + if ( *object == NULL ) + return Status; + } + + Status = gPopupSel.Create( object ); + if ( ! EFI_ERROR(Status) ) + (*object)->Methods = &gOrdListBox; + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxDestroy +// +// Description: function to Destroy a Order List Box, which uses the PopupSel Fucntions +// +// Input: ORD_LISTBOX_DATA *listbox, BOOLEAN freeMem +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxDestroy( ORD_LISTBOX_DATA *listbox, BOOLEAN freeMem ) +{ + if(NULL == listbox) + return EFI_SUCCESS; + + gPopupSel.Destroy( listbox, FALSE ); + + if( freeMem ) + { + MemFreePointer( (VOID **)&(listbox->PtrTokens) ); + MemFreePointer( (VOID **)&listbox ); + } + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxDestroy +// +// Description: function to initialize a Order List Box, which uses the PopupSel Fucntions +// +// Input: ORD_LISTBOX_DATA *listbox, VOID *data +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxInitialize( ORD_LISTBOX_DATA *listbox, VOID *data ) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + + Status = gPopupSel.Initialize( listbox, data ); +// _OrdListGetSelection(listbox); // make sure data is correct. + listbox->ControlData.ControlHelp = UefiGetHelpField(listbox->ControlData.ControlPtr);//EIP:103568 Updated the Help field for order list control. + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxDraw +// +// Description: function to draw a ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxDraw( ORD_LISTBOX_DATA *listbox ) +{ + EFI_STATUS Status = EFI_SUCCESS; + + Status = _OrdListMultiLIneDraw(listbox); //EIP-70966 Draw OrderListBox + + return Status; +} + +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: UpdateOrderlistcount +// +// Description: Function to update the orderlist count. +// +// Input: UINT16 ItemCount +// +// Output: VOID +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _UpdateOrderlistcount(UINT16 ItemCount) +{ + gOrderlistcount = ItemCount; +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: DoOrdListCallBack +// +// Description: Call back function of ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID DoOrdListCallBack(ORD_LISTBOX_DATA *listbox) +{ + UINT8 i=0; + VOID *Data = (VOID *)NULL; //EIP70966 + + if ( listbox->Cookie != NULL ) + { + VOID *ifrData = listbox->ControlData.ControlPtr; + CALLBACK_VARIABLE *callbackData = (CALLBACK_VARIABLE *)listbox->Cookie; + + callbackData->Variable = listbox->ControlData.ControlVariable; + callbackData->Offset = UefiGetQuestionOffset(ifrData); + callbackData->Length = UefiGetMaxEntries(ifrData); + + if( (listbox->ControlData.ControlVariable == VARIABLE_ID_BOOT_ORDER) || + (listbox->ControlData.ControlVariable == VARIABLE_ID_BBS_ORDER) ) + { + // Special Handling for Boot Order variable change + Data = (UINT8*)EfiLibAllocateZeroPool( listbox->ItemCount * sizeof(UINT16) ); + for(i=0;i<listbox->ItemCount;i++) + ((UINT16*)Data)[i] = (UINT16)(listbox->PtrTokens[i].Value); + callbackData->Length = listbox->ItemCount * sizeof(UINT16); + } + else + { + //EIP70966_START + UINT32 sizeOfData = 0; + UINTN type = 0; + UINT8 *tempData = (UINT8 *)NULL; + + //To find the Type and Size of OrderList based on EFI_IFR_TYPE + UefiGetValidOptionType(&listbox->ControlData, &type, &sizeOfData); + + Data = (UINT8*)EfiLibAllocateZeroPool( listbox->ItemCount * sizeOfData); + tempData = Data; + + for(i=0;i<listbox->ItemCount;i++) + { + //Data[i] = (UINT8)(listbox->PtrTokens[i].Value); + //Copy Data based on EFI_IFR_TYPE and Size + MemCopy(tempData, &listbox->PtrTokens[i].Value, sizeOfData); + tempData = (UINT8 *)tempData + sizeOfData; + } + //Fix the length of Data based on EFI_IFR_TYPE + callbackData->Length = UefiGetMaxEntries(ifrData) * sizeOfData; + if (callbackData->Length > (listbox->ItemCount * sizeOfData)) //EIP86885, Filling all the dynamic forming datas with 0's + { + Data = MemReallocateZeroPool (Data, (listbox->ItemCount * sizeOfData), callbackData->Length); + } + //EIP70966_END + } + + callbackData->Data = Data; //must send actual array of UINT8 values + } + _UpdateOrderlistcount(listbox->ItemCount); //Initializing gOrderlistcount + UefiPreControlUpdate(&(listbox->ControlData)); + listbox->Callback( listbox->Container, listbox, listbox->Cookie ); + + //For interactive orderedlist control invoke the callback functions + if(UefiIsInteractive(&listbox->ControlData)){ + EFI_STATUS Status = EFI_SUCCESS; + Status = CallFormCallBack(&listbox->ControlData, UefiGetControlKey(&listbox->ControlData), FALSE, AMI_CALLBACK_CONTROL_UPDATE); + } + //_OrdListGetSelection(listbox); + + if(Data!=NULL) + MemFreePointer((VOID **)&Data); + +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxHandleAction +// +// Description: Function to handle the ordered List Box actions +// +// Input: ORD_LISTBOX_DATA *listbox, ACTION_DATA *Data +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxHandleAction( ORD_LISTBOX_DATA *listbox, ACTION_DATA *Data) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + UINT8 i=0; + CONTROL_ACTION Action; + + + if ( Data->Input.Type == ACTION_TYPE_TIMER ) + { + // List box is active don't refresh + if ( listbox->ListBoxCtrl != NULL ) + return Status; + + if (listbox->Interval == 0) + return Status; + + if(IsActiveControlPresent(gApp->PageList[gApp->CurrentPage])) + return Status; + + if ( --(listbox->Interval) == 0 ) + { + // initialize the interval + listbox->Interval = (UINT8)(listbox->ControlData.ControlFlags.ControlRefresh); + return UefiRefershQuestionValueNvRAM(&(listbox->ControlData)); + } + else + return Status; + } + + if(listbox->ControlData.ControlFlags.ControlReadOnly) + return EFI_UNSUPPORTED; + + if(!listbox->ControlFocus) + return Status; + + if(Data->Input.Type == ACTION_TYPE_MOUSE) //EIP74968 Change Order in Orderlist using Mouse drag + { + if((listbox->Top <= (UINT16)Data->Input.Data.MouseInfo.Top ) && + ((listbox->Top + listbox->Height) > (UINT16)Data->Input.Data.MouseInfo.Top )&& + (listbox->Left <= Data->Input.Data.MouseInfo.Left) && + ((listbox->Left + listbox->Width) > (UINT16)Data->Input.Data.MouseInfo.Left) ) + Action = MapControlMouseActionHook(&Data->Input.Data.MouseInfo); + } + + if(Data->Input.Type == ACTION_TYPE_KEY) + Action = MapControlKeysHook(Data->Input.Data.AmiKey); + + if ( listbox->ListBoxCtrl != NULL ) + { + Status = gListBox.HandleAction(listbox->ListBoxCtrl,Data); + // special case, we need ot get the Sel from the listbox and put it into ordlistbox + listbox->Sel = listbox->ListBoxCtrl->Sel; + if ( listbox->ListBoxEnd ) + { + gListBox.Destroy(listbox->ListBoxCtrl,TRUE); + listbox->ListBoxCtrl = NULL; + listbox->ListBoxEnd = FALSE; + listbox->ControlActive = FALSE; + DoOrdListCallBack(listbox); + } + } + else + { + if(ControlActionSelect == Action) + { + if ( gListBox.Create( &(listbox->ListBoxCtrl) ) == EFI_SUCCESS ) + { + UINT16 TempLength=0; + + listbox->ControlActive = TRUE; + gListBox.Initialize( listbox->ListBoxCtrl, &(listbox->ControlData) ); + //The next for loop should not be necessary after the callback + //updates NVRAM properly + //EIP70966 + //if(TseLiteIsSpecialOptionList((CONTROL_DATA *)listbox) == TRUE) // EIP70966 - + { + for( i = 0 ; i < listbox->ItemCount; i++ ) + { + listbox->ListBoxCtrl->PtrTokens[i] = listbox->PtrTokens[i].Option; + TempLength = (UINT16)HiiMyGetStringLength( listbox->ListBoxCtrl->ListHandle, listbox->ListBoxCtrl->PtrTokens[i] ); + TempLength+=5; // to included barders + if ( TempLength > listbox->ListBoxCtrl->Width ) + listbox->ListBoxCtrl->Width = TempLength; + + } + } + if ( listbox->Sel > (listbox->ItemCount-1) ) //EIP-127000 If selected item is suppresed then reset the focus to first item + listbox->ListBoxCtrl->Sel = listbox->Sel = 0; + else + listbox->ListBoxCtrl->Sel = listbox->Sel; + gListBox.SetCallback(listbox->ListBoxCtrl, listbox, _OrdListBoxCallback, NULL); + gListBox.Draw( listbox->ListBoxCtrl ); + } + + Status = EFI_SUCCESS; + } + } + + if(Data->Input.Type == ACTION_TYPE_MOUSE && !lButtonOnListBoxScroll)//EIP74968 Change Order in Orderlist using Mouse drag && EIP-67049 + { + if ( listbox->ListBoxCtrl != NULL ) + { + Action = MapControlMouseActionHook(&Data->Input.Data.MouseInfo); + // Check if the Mouse action is on top of list box. + if( + (Data->Input.Data.MouseInfo.Top >= (UINT32)(listbox->ListBoxCtrl->Top - 1)) && + (ControlActionSelect != Action) && + (Data->Input.Data.MouseInfo.Top <= (UINT32)(listbox->ListBoxCtrl->Top + listbox->ListBoxCtrl->Height)) && + (Data->Input.Data.MouseInfo.Left >= listbox->ListBoxCtrl->Left) && + (Data->Input.Data.MouseInfo.Left <= (UINT32)(listbox->ListBoxCtrl->Left + listbox->ListBoxCtrl->Width - 1)) + ) + { + //Note MOUSE_LEFT_DOWN position + if(Action==ControlMouseActionLeftDown) + { + if(FirstDownEvent == FALSE ) + { + if(Data->Input.Data.MouseInfo.Top == (UINT32)(listbox->ListBoxCtrl->Top + listbox->Sel - listbox->ListBoxCtrl->FirstVisibleSel + 1)) + FirstDownEvent = TRUE; + } + else + { + if(Data->Input.Data.MouseInfo.Top > (UINT32)(listbox->ListBoxCtrl->Top + listbox->Sel - listbox->ListBoxCtrl->FirstVisibleSel + 1)) + Action = ControlActionDecreament; + + if(Data->Input.Data.MouseInfo.Top < (UINT32)(listbox->ListBoxCtrl->Top + listbox->Sel - listbox->ListBoxCtrl->FirstVisibleSel + 1)) + Action = ControlActionIncreament; + } + } + else + { + FirstDownEvent = FALSE; + } + } + } + } + switch ( Action ) + { + case ControlActionDecreament: + // eip : B12674 Don't allow +/- until it is selected. + if ( listbox->ListBoxCtrl != NULL ) + { + if(!EFI_ERROR(_OrdListBoxShift(listbox, FALSE))) + { + if ( (INTN)(listbox->Sel) < listbox->ItemCount - 1 ) + listbox->Sel++; + } + Status = EFI_SUCCESS; + } + break; + + case ControlActionIncreament: + // eip : B12674 Don't allow +/- until it is selected. + if ( listbox->ListBoxCtrl != NULL ) + { + if(!EFI_ERROR(_OrdListBoxShift(listbox, TRUE))) + { + if ( listbox->Sel > 0 ) + listbox->Sel--; + } + Status = EFI_SUCCESS; + } + break; + } + + return Status; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxSetCallback +// +// Description: Function to set callback for ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox, OBJECT_DATA *container, OBJECT_CALLBACK callback, VOID *cookie +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxSetCallback( ORD_LISTBOX_DATA *listbox, OBJECT_DATA *container, OBJECT_CALLBACK callback, VOID *cookie ) +{ + return gPopupSel.SetCallback( listbox, container, callback, cookie ); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxSetFocus +// +// Description: Function to set focus for ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox, BOOLEAN focus +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxSetFocus(ORD_LISTBOX_DATA *listbox, BOOLEAN focus) +{ + return gPopupSel.SetFocus(listbox,focus); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxSetPosition +// +// Description: Function to set position for ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox, UINT16 Left, UINT16 Top +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxSetPosition(ORD_LISTBOX_DATA *listbox, UINT16 Left, UINT16 Top ) +{ + return gPopupSel.SetPosition( listbox, Left, Top ); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxSetDimensions +// +// Description: Function to set dimension for ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox, UINT16 Width, UINT16 Height +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxSetDimensions(ORD_LISTBOX_DATA *listbox, UINT16 Width, UINT16 Height ) +{ + return gPopupSel.SetDimensions( listbox, Width, Height ); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListBoxSetAttributes +// +// Description: Function to set atributes for ordered List Box +// +// Input: ORD_LISTBOX_DATA *listbox, UINT8 FGColor, UINT8 BGColor +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListBoxSetAttributes(ORD_LISTBOX_DATA *listbox, UINT8 FGColor, UINT8 BGColor ) +{ + return gPopupSel.SetAttributes( listbox, FGColor, BGColor ); +} +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _OrdListBoxCallback +// +// Description: Ordered List Box callback function +// +// Input: ORD_LISTBOX_DATA *container, CONTROL_DATA *listbox, VOID *cookie +// +// Output: VOID +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _OrdListBoxCallback( ORD_LISTBOX_DATA *container, CONTROL_DATA *listbox, VOID *cookie ) +{ + container->ListBoxEnd = TRUE; + if ( cookie != NULL ) + container->Sel = *((UINT16*)cookie); +} + +/* + Please note that the following function is non-rotatary or non-circular + This is an internal function to ordered list control,so we need to: + 1-add underscore to the name + 2-do not put it in control_methods + This function is not used by any one else outside the control. +*/ + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _OrdListBoxShift +// +// Description: Function used in OrdListBoxHandleAction to handle actions +// +// Input: ORD_LISTBOX_DATA *listbox, UINT8 bShiftUp +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _OrdListBoxShift(ORD_LISTBOX_DATA *listbox, UINT8 bShiftUp) +{ + PTRTOKENS unSwap; + UINT8 i=0; + + if(TRUE == bShiftUp) + { + //move up + if ( listbox->Sel > 0 ) + { + unSwap = listbox->PtrTokens[listbox->Sel]; + listbox->PtrTokens[listbox->Sel] = listbox->PtrTokens[listbox->Sel-1]; + listbox->PtrTokens[listbox->Sel-1] = unSwap; + if( listbox->ListBoxCtrl !=NULL) + { + // update string tokens into listbox area + for( i = 0 ; i < listbox->ItemCount; i++ ) + listbox->ListBoxCtrl->PtrTokens[i] = listbox->PtrTokens[i].Option; + listbox->ListBoxCtrl->Sel--; + gPopupSel.Draw(listbox); + } + return EFI_SUCCESS; + } + } + else + { + //move dn + if ( (INTN)(listbox->Sel) < listbox->ItemCount - 1 ) + { + unSwap = listbox->PtrTokens[listbox->Sel]; + listbox->PtrTokens[listbox->Sel] = listbox->PtrTokens[listbox->Sel+1]; + listbox->PtrTokens[listbox->Sel+1] = unSwap; + if( listbox->ListBoxCtrl !=NULL) + { // update string tokens into listbox area + for( i = 0 ; i < listbox->ItemCount; i++ ) + listbox->ListBoxCtrl->PtrTokens[i] = listbox->PtrTokens[i].Option; + listbox->ListBoxCtrl->Sel++; + gPopupSel.Draw(listbox); + } + + return EFI_SUCCESS; + } + } + + return EFI_NOT_FOUND; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: OrdListGetControlHeight +// +// Description: Function used get the hight of control +// +// Input: ORD_LISTBOX_DATA *OrdList, VOID* frame, UINT16 *height +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS OrdListGetControlHeight( ORD_LISTBOX_DATA *OrdList, VOID* frame, UINT16 *height ) +{ + //EIP-72610 TSE_MULTILINE_CONTROLS moved to binary + if(IsTSEMultilineControlSupported()) + { + CHAR16 *newText = NULL,*text=NULL; + UINT16 Width; + + Width = (UINT16)(OrdList->LabelMargin - (((FRAME_DATA*)frame)->FrameData.Left + (UINT8)gLabelLeftMargin)); + + text = HiiGetString( OrdList->ControlData.ControlHandle, OrdList->Title ); + if ( text == NULL ) + return EFI_OUT_OF_RESOURCES; + + newText = StringWrapText( text, Width, height ); + + (*height) = (*height) ? (*height):1; + + MemFreePointer( (VOID **)&newText ); + MemFreePointer( (VOID **)&text ); + + *height = (*height < OrdList->ItemCount)? OrdList->ItemCount : *height ; + } + else + { + *height = 1; + } + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// Procedure: _OrdListMultiLIneDraw +// +// Description: Function used to draw teh Ordered list box +// +// Input: ORD_LISTBOX_DATA *OrdList +// +// Output: status +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS _OrdListMultiLIneDraw(ORD_LISTBOX_DATA *OrdList) +{ + EFI_STATUS Status = EFI_SUCCESS; + UINT8 ColorNSel = OrdList->NSelFGColor; + UINT8 ColorLabel = (OrdList->ControlFocus) ? OrdList->LabelFGColor : OrdList->NSelLabelFGColor ; + CHAR16 *text1, *text; + UINTN i=0,Len, oldSize = 0; + BOOLEAN MultilineSupport = FALSE; + UINT16 *OptionList=NULL, Index = 0; + UINT64 *ValueList=NULL; + + //Draw the list box alone if the control is active + if( OrdList->ListBoxCtrl != NULL) + { + gListBox.Draw( OrdList->ListBoxCtrl ); + } + else + { + // check conditional + //EIP 75486 Support grayout condition for readonly controls + //if( OrdList->ControlData.ControlConditionalPtr != 0x0) + //{ + switch( CheckControlCondition( &OrdList->ControlData ) ) + { + case COND_NONE: + break; + case COND_GRAYOUT: + Status = EFI_WARN_WRITE_FAILURE; + ColorNSel = ColorLabel = CONTROL_GRAYOUT_COLOR; + break; + default: + return EFI_UNSUPPORTED; + break; + } + //} + if(TseLiteIsSpecialOptionList((CONTROL_DATA *)OrdList) != TRUE) //EIP-127000 Fix options and option count in listbox if any item is suppressed + { + oldSize = OrdList->ItemCount; + + Status = UefiGetOneOfOptions(&OrdList->ControlData,&OrdList->PopupSelHandle, + &OptionList, &ValueList, &OrdList->ItemCount,NULL,NULL); + + if (OrdList->ItemCount!=oldSize) + { + OrdList->PtrTokens = MemReallocateZeroPool(OrdList->PtrTokens, oldSize*sizeof(PTRTOKENS), OrdList->ItemCount * sizeof(PTRTOKENS)); + if (NULL == OrdList->PtrTokens) + return EFI_OUT_OF_RESOURCES; + } + + if (EFI_ERROR(Status)) + return Status; + for( Index = 0; Index < OrdList->ItemCount; Index++ ) + { + OrdList->PtrTokens[Index].Option = OptionList[Index]; + OrdList->PtrTokens[Index].Value = ValueList[Index]; + } + MemFreePointer( (VOID **)&(OptionList)); + MemFreePointer( (VOID **)&(ValueList)); + } + _OrdListGetSelection(OrdList); //EIP70966 To handle OrderList Items + //_PopupSelGetSelection((POPUPSEL_DATA *)OrdList); + + //Draw label in left column + text1 = HiiGetString( OrdList->ControlData.ControlHandle, OrdList->Title ); + if ( text1 != NULL ) + { + //EIP-72610 TSE_MULTILINE_CONTROLS moved to binary + if(OrdList->Height>1 && IsTSEMultilineControlSupported()) + { + DrawMultiLineStringWithAttribute( OrdList->Left, OrdList->Top, + (UINTN)(OrdList->LabelMargin - OrdList->Left),(UINTN) OrdList->Height, + text1, OrdList->BGColor | ColorLabel ); + } + else + { + // boundary overflow check + if((TestPrintLength( text1) / (NG_SIZE))> (UINTN)(OrdList->LabelMargin - OrdList->Left )) + text1[HiiFindStrPrintBoundary(text1 ,(UINTN)(OrdList->LabelMargin - OrdList->Left ))] = L'\0'; + + DrawStringWithAttribute( OrdList->Left , OrdList->Top, (CHAR16*)text1, + OrdList->BGColor | ColorLabel ); + } + + MemFreePointer( (VOID **)&text1 ); + } + if(IsTSEMultilineControlSupported()) //TSE_MULTILINE_CONTROLS moved to binary + MultilineSupport = TRUE; + + do + { + text1 = HiiGetString( OrdList->PopupSelHandle, OrdList->PtrTokens[i].Option); + + if(!text1) //EIP-70966 To handle NULL items in orderlistbox + text1 = EfiLibAllocateZeroPool(2); + + Len = TestPrintLength( text1 ) / (NG_SIZE); + if ( Len > (UINTN)(OrdList->Width - OrdList->Left - OrdList->LabelMargin -2) ) + EfiStrCpy(&text1[HiiFindStrPrintBoundary(text1 ,(UINTN)(OrdList->Width - OrdList->Left - OrdList->LabelMargin -4))],L"..." ); + + //Enclose the string with [ ] + text = EfiLibAllocateZeroPool( (Len+3)*2 ); + SPrint( text,(UINTN)( (Len+3)*2 ), L"[%s]", text1 ); + MemFreePointer( (VOID **)&text1 ); + + DrawStringWithAttribute( + OrdList->Left + OrdList->LabelMargin, + OrdList->Top+i, + (CHAR16*)text, + (UINT8)(OrdList->ControlFocus ? OrdList->SelBGColor|OrdList->SelFGColor : OrdList->BGColor|ColorNSel) + ); + i++; + }while(i<OrdList->ItemCount && MultilineSupport); + + /* + i=TestPrintLength(text) / (NG_SIZE); + MemFreePointer( (VOID **)&text ); + + // erase extra spaces if neccessary + for(;(UINT16)(popupSel->Left + popupSel->LabelMargin + i+2) <= (popupSel->Width-1);i++) + DrawStringWithAttribute( popupSel->Left + popupSel->LabelMargin +i +2 , popupSel->Top, L" ", + popupSel->BGColor | ColorNSel ); + */ + + FlushLines( OrdList->Top, OrdList->Top+i-1 ); + } + + return Status; +} + +// EIP70966_START +//<AMI_PHDR_START> +//--------------------------------------------------------------------------- +// Procedure: _OrdListGetSelection +// +// Description: Function to ordering the option in OrderList +// +// Input: ORD_LISTBOX_DATA *ordlist +// +// Output: +//--------------------------------------------------------------------------- +//<AMI_PHDR_END> +VOID _OrdListGetSelection( ORD_LISTBOX_DATA *ordlist ) +{ + EFI_STATUS Status = EFI_UNSUPPORTED; + UINT8 *temp=NULL; + VOID *ifrData = ordlist->ControlData.ControlPtr; + int i=0,j=0; + PTRTOKENS *OrdPtrTokens=NULL, TempOrdPtrTokens; + + + + UINT32 sizeOfData = 0; + UINTN type = 0; + UINTN dataLen = 0; + //Find the size of OrderList based on EFI_IFR_TYPE of EFI_IFR_ONE_OF_OPTION +// UefiGetValidOptionSize(&ordlist->ControlData, &sizeOfData); +// dataLen = ordlist->ItemCount * sizeOfData; + + UefiGetValidOptionType(&ordlist->ControlData, &type, &sizeOfData); + dataLen = UefiGetMaxEntries(ifrData) * sizeOfData; + + temp = EfiLibAllocateZeroPool( dataLen ); + if ( temp == NULL ) + return; + + OrdPtrTokens = ordlist->PtrTokens; + + Status = VarGetValue( ordlist->ControlData.ControlVariable, UefiGetQuestionOffset(ifrData), dataLen, temp ); + + // Check variable data and adjust item order. + if ( Status == EFI_SUCCESS ) + { + for (i=0 ; i<ordlist->ItemCount-1 ; i++) + { + for (j=i+1 ; j<ordlist->ItemCount ; j++) + { + if ( MemCmp( (VOID *)&(OrdPtrTokens[j].Value),(VOID *)(temp + (i * sizeOfData)), sizeOfData ) == 0) + { + TempOrdPtrTokens = OrdPtrTokens[i]; + OrdPtrTokens[i] = OrdPtrTokens[j]; + OrdPtrTokens[j] = TempOrdPtrTokens; + break; + } + } + } + } + MemFreePointer( (VOID **)&temp ); + +} +// EIP70966_END + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** |