alder_lake_bios/Insyde/InsydeSetupPkg/Drivers/H2ODisplayEngineLocalMetroDxe/H2OControls/H2ODateItem.c

621 lines
19 KiB
C

/** @file
UI date item Controls
;******************************************************************************
;* Copyright (c) 2014 - 2020, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "H2OControls.h"
#include "H2ODisplayEngineLocalMetro.h"
#include "MetroUi.h"
STATIC H2O_DATE_ITEM_CLASS *mDateItemClass = NULL;
#define CURRENT_CLASS mDateItemClass
CHAR16 *mDateItemChilds = L""
L"<HorizontalLayout height='156'>"
L"<NumberPicker background-color='@menucolor' name='Year'/>"
L"<VerticalLayout width='5' background-color='0xFF333333'>"
L"<Label height='52'/>"
L"<Label name='Separation1' text=':' text-align='singleline|center' height='39' font-size='29' background-color='0xFF787878' textcolor='0xFF999999'/>"
L"<Label height='65'/>"
L"</VerticalLayout>"
L"<NumberPicker background-color='@menucolor' name='Month'/>"
L"<VerticalLayout width='5' background-color='0xFF333333'>"
L"<Label height='52'/>"
L"<Label name='Separation2' text=':' text-align='singleline|center' height='39' font-size='29' background-color='0xFF787878' textcolor='0xFF999999'/>"
L"<Label height='65'/>"
L"</VerticalLayout>"
L"<NumberPicker background-color='@menucolor' name='Day'/>"
L"</HorizontalLayout>";
EFI_STATUS
H2ODateItemNumberPickerUpdate (
IN H2O_DATE_ITEM *This,
IN EFI_TIME *EfiTime
)
{
UI_CONTROL *ChildControl;
CHAR16 Str[20];
CHAR16 **ListStr;
UINT32 MinValue;
UINT32 MaxValue;
UINT8 DayOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//
// Year
//
ChildControl = (UI_CONTROL *) This->YearNumberPicker;
MinValue = PcdGet16 (PcdRealTimeClockYearMin);
MaxValue = PcdGet16 (PcdRealTimeClockYearMax);
ListStr = CreateStrArrayByNumRange (MinValue, MaxValue, 1, L"%04d");
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%02d", EfiTime->Year - MinValue);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
//
// Month
//
ChildControl = (UI_CONTROL *) This->MonthNumberPicker;
MinValue = 1;
MaxValue = 12;
ListStr = CreateStrArrayByNumRange (MinValue, MaxValue, 1, L"%02d");
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%d", EfiTime->Month - 1);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
//
// Day
//
ChildControl = (UI_CONTROL *) This->DayNumberPicker;
MinValue = 1;
if (EfiTime->Month == 2 && IsLeapYear (EfiTime->Year)) {
MaxValue = 29;
} else {
MaxValue = (UINT32) DayOfMonth[EfiTime->Month - 1];
}
ListStr = CreateStrArrayByNumRange (MinValue, MaxValue, 1, L"%02d");
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%02d", EfiTime->Day - 1);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
CONTROL_CLASS_INVALIDATE (This);
return EFI_SUCCESS;
}
VOID
H2ODateItemSetSelectedControl (
IN H2O_DATE_ITEM *This,
IN UI_NUMBER_PICKER *SelectedControl
)
{
if (This->SelectedControl != NULL) {
CONTROL_CLASS_SET_STATE (This->SelectedControl, 0, UISTATE_SELECTED);
}
if (SelectedControl != NULL) {
CONTROL_CLASS_SET_STATE (SelectedControl, UISTATE_SELECTED, 0);
SetFocus (((UI_CONTROL *)This)->Wnd);
}
This->SelectedControl = SelectedControl;
}
EFI_STATUS
H2ODateItemSetNextValue (
IN H2O_DATE_ITEM *This,
IN BOOLEAN Increasement
)
{
H2O_DATE_TIME_ITEM DateTimeItem;
EFI_STATUS Status;
if (This->SelectedControl == This->YearNumberPicker) {
DateTimeItem = YearItem;
} else if (This->SelectedControl == This->MonthNumberPicker) {
DateTimeItem = MonthItem;
} else if (This->SelectedControl == This->DayNumberPicker) {
DateTimeItem = DayItem;
} else {
return EFI_UNSUPPORTED;
}
Status = GetNextDateTimeValue (DateTimeItem, Increasement, &This->EfiTime);
if (EFI_ERROR (Status)) {
return Status;
}
H2ODateItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnDateChange != NULL) {
This->OnDateChange (This, &This->EfiTime);
}
return EFI_SUCCESS;
}
VOID
H2ODateItemNumberPickerOnCurrentIndexChange (
UI_NUMBER_PICKER *This,
INT32 CurrentIndex
)
{
BOOLEAN IsDay;
BOOLEAN IsYear;
EFI_STATUS Status;
UINT16 Value;
UINT8 DayOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
CHAR16 Str[20];
UINT16 MinValue;
UINT16 MaxValue;
UI_CONTROL *Control;
UI_CONTROL *ChildControl;
H2O_DATE_ITEM *DateItem;
EFI_TIME EfiTime;
CHAR16 **ListStr;
IsDay = FALSE;
IsYear = FALSE;
Control = (UI_CONTROL *) This;
DateItem = (H2O_DATE_ITEM *) GetWindowLongPtr (Control->Wnd, GWLP_USERDATA);
Value = (UINT16) StrToUInt (This->List[CurrentIndex], 10, &Status);
CopyMem (&EfiTime, &DateItem->EfiTime, sizeof (EFI_TIME));
if (StrCmp (Control->Name, L"Day") == 0) {
IsDay = TRUE;
EfiTime.Day = (UINT8) Value;
} else if (StrCmp (Control->Name, L"Month") == 0) {
EfiTime.Month = (UINT8) Value;
} else if (StrCmp (Control->Name, L"Year") == 0) {
IsYear = TRUE;
EfiTime.Year = Value;
} else {
return;
}
while (!IsDayValid (&EfiTime)) {
EfiTime.Day--;
if (EfiTime.Day == 0) {
ASSERT(FALSE);
return;
}
}
CopyMem (&DateItem->EfiTime, &EfiTime, sizeof (EFI_TIME));
if (DateItem->OnDateChange != NULL) {
DateItem->OnDateChange (DateItem, &DateItem->EfiTime);
}
if (IsDay || (IsYear && EfiTime.Month != 2)) {
return;
}
//
// Update string list of day
//
MinValue = 1;
if (EfiTime.Month == 2 && IsLeapYear (EfiTime.Year)) {
MaxValue = 29;
} else {
MaxValue = DayOfMonth[EfiTime.Month - 1];
}
ListStr = CreateStrArrayByNumRange (MinValue, MaxValue, 1, L"%02d");
ChildControl = (UI_CONTROL *) DateItem->DayNumberPicker;
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%02d", EfiTime.Day - 1);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
return;
}
VOID
H2ODateItemNumberPickerOnItemSelected (
UI_NUMBER_PICKER *This
)
{
UI_CONTROL *Control;
H2O_DATE_ITEM *DateItem;
Control = (UI_CONTROL *) This;
DateItem = (H2O_DATE_ITEM *) GetWindowLongPtr (Control->Wnd, GWLP_USERDATA);
if (DateItem->SelectedControl != NULL) {
CONTROL_CLASS_SET_STATE (DateItem->SelectedControl, 0, UISTATE_SELECTED);
}
CONTROL_CLASS_SET_STATE (This, UISTATE_SELECTED, 0);
DateItem->SelectedControl = This;
}
VOID
EFIAPI
H2ODateNumberPickOnSetState (
UI_CONTROL *Control,
UI_STATE SetState,
UI_STATE ClearState
)
{
UI_CONTROL *DateItem;
if (SetState & UISTATE_CAPTURED) {
DateItem = (UI_CONTROL *) GetWindowLongPtr (Control->Wnd, GWLP_USERDATA);
SetFocus (DateItem->Wnd);
}
}
VOID
H2ODateItemCreate (
IN OUT H2O_DATE_ITEM *This
)
{
UI_CONTROL *ChildControl;
This->YearNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Year");
This->MonthNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Month");
This->DayNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Day");
This->YearNumberPicker->OnCurrentIndexChange = H2ODateItemNumberPickerOnCurrentIndexChange;
This->MonthNumberPicker->OnCurrentIndexChange = H2ODateItemNumberPickerOnCurrentIndexChange;
This->DayNumberPicker->OnCurrentIndexChange = H2ODateItemNumberPickerOnCurrentIndexChange;
This->YearNumberPicker->OnItemSelected = H2ODateItemNumberPickerOnItemSelected;
This->MonthNumberPicker->OnItemSelected = H2ODateItemNumberPickerOnItemSelected;
This->DayNumberPicker->OnItemSelected = H2ODateItemNumberPickerOnItemSelected;
((UI_CONTROL *)(This->YearNumberPicker))->OnSetState = H2ODateNumberPickOnSetState;
((UI_CONTROL *)(This->MonthNumberPicker))->OnSetState = H2ODateNumberPickOnSetState;
((UI_CONTROL *)(This->DayNumberPicker))->OnSetState = H2ODateNumberPickOnSetState;
ChildControl = (UI_CONTROL *) This->YearNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
ChildControl = (UI_CONTROL *) This->MonthNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
ChildControl = (UI_CONTROL *) This->DayNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
H2ODateItemSetSelectedControl (This, This->YearNumberPicker);
ChildControl = UiFindChildByName (This, L"Separation1");
UiSetAttribute (ChildControl, L"textcolor", L"0xFFFFFFFF");
ChildControl = UiFindChildByName (This, L"Separation2");
UiSetAttribute (ChildControl, L"textcolor", L"0xFFFFFFFF");
UiSetAttribute (This, L"tabstop", L"true");
}
VOID
H2ODateItemCharPress (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_DATE_ITEM *This;
CHAR16 Char;
UINT8 Number;
EFI_TIME EfiTime;
CHAR16 NumberPickStr[20];
UINTN ValueLen;
CHAR16 *ValueStr;
UINT16 CurrentValue;
EFI_STATUS Status;
This = (H2O_DATE_ITEM *) GetWindowLongPtr (Wnd, 0);
if (This == NULL) {
ASSERT (FALSE);
return;
}
if (This->SelectedControl == NULL) {
return ;
}
Char = LOWORD (WParam);
if (!IsDecChar (Char)) {
return ;
}
Number = (UINT8)(Char - L'0');
ValueStr = ((UI_LABEL *) (This->SelectedControl->CurrentValueControl))->Text;
ValueLen = StrLen (ValueStr);
CurrentValue = (UINT16) StrToUInt (ValueStr, 10, &Status);
//
// begin edit, clear to empty string, otherwise append char
//
if ((ValueLen == 2 && ((This->SelectedControl == This->DayNumberPicker) || (This->SelectedControl == This->MonthNumberPicker))) ||
(ValueLen == 4 && (This->SelectedControl == This->YearNumberPicker))) {
This->Editing = TRUE;
CopyMem (&EfiTime, &This->EfiTime, sizeof (EFI_TIME));
CurrentValue = 0;
ValueLen = 1;
UnicodeSPrint (NumberPickStr, sizeof (NumberPickStr), L"%d", Number);
} else {
CopyMem (&EfiTime, &This->EditEfiTime, sizeof (EFI_TIME));
ValueLen++;
UnicodeSPrint (NumberPickStr, sizeof (NumberPickStr), L"%s%d", ValueStr, Number);
}
CurrentValue = (UINT16) StrToUInt (NumberPickStr, 10, &Status);
if (This->SelectedControl == This->DayNumberPicker) {
EfiTime.Day = (UINT8)CurrentValue;
} else if (This->SelectedControl == This->MonthNumberPicker) {
EfiTime.Month= (UINT8)CurrentValue;
} else if (This->SelectedControl == This->YearNumberPicker) {
EfiTime.Year = (UINT16)CurrentValue;
}
if ((ValueLen == 2 && ((This->SelectedControl == This->DayNumberPicker) || (This->SelectedControl == This->MonthNumberPicker))) ||
(ValueLen == 4 && (This->SelectedControl == This->YearNumberPicker))) {
if (!IsDayValid (&EfiTime)) {
This->Editing = FALSE;
H2ODateItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnDateChange != NULL) {
This->OnDateChange (This, &This->EfiTime);
}
return ;
}
This->Editing = FALSE;
CopyMem (&This->EfiTime, &EfiTime, sizeof (EFI_TIME));
H2ODateItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnDateChange != NULL) {
This->OnDateChange (This, &This->EfiTime);
}
} else {
CopyMem (&This->EditEfiTime, &EfiTime, sizeof (EFI_TIME));
UiSetAttribute (This->SelectedControl, L"text", NumberPickStr);
}
}
VOID
H2ODateItemKeyDown (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_DATE_ITEM *This;
UI_CONTROL *Control;
UI_MANAGER *Manager;
This = (H2O_DATE_ITEM *) GetWindowLongPtr (Wnd, 0);
if (This == NULL) {
ASSERT (FALSE);
return;
}
Control = (UI_CONTROL *) This;
if (This->Editing) {
if (WParam == VK_RETURN) {
if (IsDayValid (&This->EditEfiTime)) {
CopyMem (&This->EfiTime, &This->EditEfiTime, sizeof (EFI_TIME));
WParam = VK_TAB;
} else {
WParam = VK_ESCAPE;
}
}
if (!IsDecChar (LOWORD (WParam))) {
This->Editing = FALSE;
H2ODateItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnDateChange != NULL) {
This->OnDateChange (This, &This->EfiTime);
}
}
}
if ((WParam == VK_RETURN) && ((This->SelectedControl == This->YearNumberPicker) ||
(This->SelectedControl == This->MonthNumberPicker))) {
WParam = VK_TAB;
}
switch (WParam) {
case VK_RETURN:
Manager = Control->Manager;
SendMessage (Manager->MainWnd, UI_NOTIFY_CARRIAGE_RETURN, (WPARAM) Control, 0);
break;
case VK_TAB:
case VK_RIGHT:
if (This->SelectedControl == This->YearNumberPicker) {
H2ODateItemSetSelectedControl (This, This->MonthNumberPicker);
} else if (This->SelectedControl == This->MonthNumberPicker) {
H2ODateItemSetSelectedControl (This, This->DayNumberPicker);
}
break;
case VK_LEFT:
if (This->SelectedControl == This->DayNumberPicker) {
H2ODateItemSetSelectedControl (This, This->MonthNumberPicker);
} else if (This->SelectedControl == This->MonthNumberPicker) {
H2ODateItemSetSelectedControl (This, This->YearNumberPicker);
}
break;
case VK_F5:
H2ODateItemSetNextValue (This, FALSE);
break;
case VK_F6:
H2ODateItemSetNextValue (This, TRUE);
break;
default:
if (This->SelectedControl != NULL) {
CONTROL_CLASS_WNDPROC (This->SelectedControl, ((UI_CONTROL *) This->SelectedControl)->Wnd, Msg, WParam, LParam);
}
break;
}
}
BOOLEAN
EFIAPI
H2ODateItemSetAttribute (
UI_CONTROL *Control,
CHAR16 *Name,
CHAR16 *Value
)
{
H2O_DATE_ITEM *This;
EFI_STATUS Status;
EFI_TIME *EfiTime;
This = (H2O_DATE_ITEM *) Control;
if (StrCmp (Name, L"efitime") == 0) {
EfiTime = (EFI_TIME *) (UINTN) StrToUInt (Value, 16, &Status);
ASSERT(IsDayValid (EfiTime));
CopyMem (&This->EfiTime, EfiTime, sizeof(EFI_TIME));
H2ODateItemNumberPickerUpdate (This, &This->EfiTime);
} else {
return PARENT_CLASS_SET_ATTRIBUTE (CURRENT_CLASS, Control, Name, Value);
}
CONTROL_CLASS_INVALIDATE (This);
return TRUE;
}
VOID
EFIAPI
H2ODateItemSetState (
UI_CONTROL *Control,
UI_STATE SetState,
UI_STATE ClearState
)
{
H2O_DATE_ITEM *This;
UI_CONTROL *ChildControl;
This = (H2O_DATE_ITEM *) Control;
if (SetState & UISTATE_FOCUSED) {
if (This->SelectedControl == NULL) {
This->SelectedControl = This->YearNumberPicker;
}
H2ODateItemSetSelectedControl (This, This->SelectedControl);
}
if (ClearState & UISTATE_FOCUSED) {
ChildControl = UiFindChildByName (This, L"Separation1");
UiSetAttribute (ChildControl, L"textcolor", L"0xFF999999");
ChildControl = UiFindChildByName (This, L"Separation2");
UiSetAttribute (ChildControl, L"textcolor", L"0xFF999999");
H2ODateItemSetSelectedControl (This, NULL);
}
PARENT_CONTROL_CLASS(CURRENT_CLASS)->SetState (Control, SetState, ClearState);
}
LRESULT
EFIAPI
H2ODateItemProc (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_DATE_ITEM *This;
UI_CONTROL *Control;
This = (H2O_DATE_ITEM *) GetWindowLongPtr (Wnd, 0);
if (This == NULL && Msg != WM_CREATE && Msg != WM_NCCALCSIZE) {
ASSERT (FALSE);
return 0;
}
Control = (UI_CONTROL *) This;
switch (Msg) {
case WM_CREATE:
This = (H2O_DATE_ITEM *) AllocateZeroPool (sizeof (H2O_DATE_ITEM));
if (This != NULL) {
CONTROL_CLASS (This) = (UI_CONTROL_CLASS *) GetClassLongPtr (Wnd, 0);
SetWindowLongPtr (Wnd, 0, (INTN)This);
SendMessage (Wnd, UI_NOTIFY_CREATE, WParam, LParam);
}
break;
case UI_NOTIFY_CREATE:
PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, UI_NOTIFY_CREATE, WParam, LParam);
XmlCreateControl (mDateItemChilds, Control);
SetWindowLongPtr (Control->Wnd, GWL_EXSTYLE, GetWindowLongPtr (Control->Wnd, GWL_EXSTYLE) & ~WS_EX_NOACTIVATE);
H2ODateItemCreate (This);
break;
case WM_KEYDOWN:
H2ODateItemKeyDown (Wnd, Msg, WParam, LParam);
break;
case WM_CHAR:
H2ODateItemCharPress (Wnd, Msg, WParam, LParam);
break;
case WM_GETDLGCODE:
if (This->SelectedControl == This->DayNumberPicker) {
return 0;
}
return DLGC_WANTTAB;
case WM_NCHITTEST:
return HTCLIENT;
default:
return PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, Msg, WParam, LParam);
}
return 0;
}
H2O_DATE_ITEM_CLASS *
EFIAPI
GetDateItemClass (
VOID
)
{
if (CURRENT_CLASS != NULL) {
return CURRENT_CLASS;
}
InitUiClass ((UI_CONTROL_CLASS **)&CURRENT_CLASS, sizeof (*CURRENT_CLASS), L"DateItem", (UI_CONTROL_CLASS *)GetControlClass());
if (CURRENT_CLASS == NULL) {
return NULL;
}
((UI_CONTROL_CLASS *)CURRENT_CLASS)->WndProc = H2ODateItemProc;
((UI_CONTROL_CLASS *)CURRENT_CLASS)->SetState = H2ODateItemSetState;
((UI_CONTROL_CLASS *)CURRENT_CLASS)->SetAttribute = H2ODateItemSetAttribute;
return CURRENT_CLASS;
}