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

566 lines
17 KiB
C

/** @file
UI time 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_TIME_ITEM_CLASS *mTimeItemClass = NULL;
#define CURRENT_CLASS mTimeItemClass
CHAR16 *mTimeItemChilds = L""
L"<HorizontalLayout height='156'>"
L"<NumberPicker background-color='@menucolor' name='Hour'/>"
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='Minute'/>"
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='Second'/>"
L"</HorizontalLayout>";
EFI_STATUS
H2OTimeItemNumberPickerUpdate (
IN H2O_TIME_ITEM *This,
IN EFI_TIME *EfiTime
)
{
UI_CONTROL *ChildControl;
CHAR16 Str[20];
CHAR16 **ListStr;
UINT32 MinValue;
UINT32 MaxValue;
//
// Hour
//
ChildControl = (UI_CONTROL *) This->HourNumberPicker;
MinValue = 0;
MaxValue = 23;
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->Hour);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
//
// Minute and second
//
MinValue = 0;
MaxValue = 59;
ListStr = CreateStrArrayByNumRange (MinValue, MaxValue, 1, L"%02d");
ChildControl = (UI_CONTROL *) This->MinuteNumberPicker;
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%d", EfiTime->Minute);
UiSetAttribute (ChildControl, L"currentindex", Str);
ChildControl = (UI_CONTROL *) This->SecondNumberPicker;
UnicodeSPrint (Str, sizeof (Str), L"0x%p", ListStr);
UiSetAttribute (ChildControl, L"list", Str);
UnicodeSPrint (Str, sizeof (Str), L"%02d", EfiTime->Second);
UiSetAttribute (ChildControl, L"currentindex", Str);
FreeStringArray (ListStr, (MaxValue - MinValue + 1));
CONTROL_CLASS_INVALIDATE (This);
return EFI_SUCCESS;
}
VOID
H2OTimeItemSetSelectedControl (
IN H2O_TIME_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);
}
This->SelectedControl = SelectedControl;
SetFocus (((UI_CONTROL *)This)->Wnd);
}
EFI_STATUS
H2OTimeItemSetNextValue (
IN H2O_TIME_ITEM *This,
IN BOOLEAN Increasement
)
{
H2O_DATE_TIME_ITEM DateTimeItem;
EFI_STATUS Status;
if (This->SelectedControl == This->HourNumberPicker) {
DateTimeItem = HourItem;
} else if (This->SelectedControl == This->MinuteNumberPicker) {
DateTimeItem = MinuteItem;
} else if (This->SelectedControl == This->SecondNumberPicker) {
DateTimeItem = SecondItem;
} else {
return EFI_UNSUPPORTED;
}
Status = GetNextDateTimeValue (DateTimeItem, Increasement, &This->EfiTime);
if (EFI_ERROR (Status)) {
return Status;
}
H2OTimeItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnTimeChange != NULL) {
This->OnTimeChange (This, &This->EfiTime);
}
return EFI_SUCCESS;
}
VOID
H2OTimeItemNumberPickerOnCurrentIndexChange (
UI_NUMBER_PICKER *This,
INT32 CurrentIndex
)
{
EFI_STATUS Status;
UINT8 Value;
UI_CONTROL *Control;
H2O_TIME_ITEM *TimeItem;
EFI_TIME EfiTime;
Control = (UI_CONTROL *) This;
TimeItem = (H2O_TIME_ITEM *) GetWindowLongPtr (Control->Wnd, GWLP_USERDATA);
Value = (UINT8) StrToUInt (This->List[CurrentIndex], 10, &Status);
CopyMem (&EfiTime, &TimeItem->EfiTime, sizeof (EFI_TIME));
if (StrCmp (Control->Name, L"Hour") == 0) {
EfiTime.Hour = Value;
} else if (StrCmp (Control->Name, L"Minute") == 0) {
EfiTime.Minute = Value;
} else if (StrCmp (Control->Name, L"Second") == 0) {
EfiTime.Second = Value;
} else {
return;
}
CopyMem (&TimeItem->EfiTime, &EfiTime, sizeof (EFI_TIME));
if (TimeItem->OnTimeChange != NULL) {
TimeItem->OnTimeChange (TimeItem, &TimeItem->EfiTime);
}
return;
}
VOID
H2OTimeItemNumberPickerOnItemSelected (
UI_NUMBER_PICKER *This
)
{
UI_CONTROL *Control;
H2O_TIME_ITEM *TimeItem;
Control = (UI_CONTROL *) This;
TimeItem = (H2O_TIME_ITEM *) GetWindowLongPtr (Control->Wnd, GWLP_USERDATA);
if (TimeItem->SelectedControl != NULL) {
CONTROL_CLASS_SET_STATE (TimeItem->SelectedControl, 0, UISTATE_SELECTED);
}
CONTROL_CLASS_SET_STATE (This, UISTATE_SELECTED, 0);
TimeItem->SelectedControl = This;
}
VOID
EFIAPI
H2OTimeNumberPickOnSetState (
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
H2OTimeItemCreate (
IN OUT H2O_TIME_ITEM *This
)
{
UI_CONTROL *ChildControl;
This->HourNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Hour" );
This->MinuteNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Minute");
This->SecondNumberPicker = (UI_NUMBER_PICKER *) UiFindChildByName (This, L"Second");
This->HourNumberPicker->OnItemSelected = H2OTimeItemNumberPickerOnItemSelected;
This->MinuteNumberPicker->OnItemSelected = H2OTimeItemNumberPickerOnItemSelected;
This->SecondNumberPicker->OnItemSelected = H2OTimeItemNumberPickerOnItemSelected;
((UI_CONTROL *)(This->HourNumberPicker))->OnSetState = H2OTimeNumberPickOnSetState;
((UI_CONTROL *)(This->MinuteNumberPicker))->OnSetState = H2OTimeNumberPickOnSetState;
((UI_CONTROL *)(This->SecondNumberPicker))->OnSetState = H2OTimeNumberPickOnSetState;
This->HourNumberPicker->OnCurrentIndexChange = H2OTimeItemNumberPickerOnCurrentIndexChange;
This->MinuteNumberPicker->OnCurrentIndexChange = H2OTimeItemNumberPickerOnCurrentIndexChange;
This->SecondNumberPicker->OnCurrentIndexChange = H2OTimeItemNumberPickerOnCurrentIndexChange;
ChildControl = (UI_CONTROL *) This->HourNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
ChildControl = (UI_CONTROL *) This->MinuteNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
ChildControl = (UI_CONTROL *) This->SecondNumberPicker;
SetWindowLongPtr (ChildControl->Wnd, GWLP_USERDATA, (INTN) This);
SetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE , GetWindowLongPtr (ChildControl->Wnd, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
H2OTimeItemSetSelectedControl (This, This->HourNumberPicker);
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
H2OTimeItemCharPress (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_TIME_ITEM *This;
CHAR16 Char;
UINT8 Number;
EFI_TIME EfiTime;
CHAR16 NumberPickStr[20];
UINTN ValueLen;
CHAR16 *ValueStr;
UINT16 CurrentValue;
EFI_STATUS Status;
This = (H2O_TIME_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->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->HourNumberPicker) {
EfiTime.Hour = (UINT8)CurrentValue;
} else if (This->SelectedControl == This->MinuteNumberPicker) {
EfiTime.Minute = (UINT8)CurrentValue;
} else if (This->SelectedControl == This->SecondNumberPicker) {
EfiTime.Second = (UINT8)CurrentValue;
}
if (ValueLen == 2) {
if (!IsTimeValid (&EfiTime)) {
This->Editing = FALSE;
H2OTimeItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnTimeChange != NULL) {
This->OnTimeChange (This, &This->EfiTime);
}
return ;
}
This->Editing = FALSE;
CopyMem (&This->EfiTime, &EfiTime, sizeof (EFI_TIME));
H2OTimeItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnTimeChange != NULL) {
This->OnTimeChange (This, &This->EfiTime);
}
} else {
CopyMem (&This->EditEfiTime, &EfiTime, sizeof (EFI_TIME));
UiSetAttribute (This->SelectedControl, L"text", NumberPickStr);
}
}
VOID
H2OTimeItemKeyDown (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_TIME_ITEM *This;
UI_CONTROL *Control;
UI_MANAGER *Manager;
This = (H2O_TIME_ITEM *) GetWindowLongPtr (Wnd, 0);
if (This == NULL) {
ASSERT (FALSE);
return;
}
Control = (UI_CONTROL *) This;
if (This->Editing) {
if (WParam == VK_RETURN) {
if (IsTimeValid (&This->EditEfiTime)) {
CopyMem (&This->EfiTime, &This->EditEfiTime, sizeof (EFI_TIME));
}
WParam = VK_TAB;
}
if (!IsDecChar (LOWORD (WParam))) {
This->Editing = FALSE;
H2OTimeItemNumberPickerUpdate (This, &This->EfiTime);
if (This->OnTimeChange != NULL) {
This->OnTimeChange (This, &This->EfiTime);
}
}
}
if ((WParam == VK_RETURN) && ((This->SelectedControl == This->HourNumberPicker) ||
(This->SelectedControl == This->MinuteNumberPicker))) {
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->HourNumberPicker) {
H2OTimeItemSetSelectedControl (This, This->MinuteNumberPicker);
} else if (This->SelectedControl == This->MinuteNumberPicker) {
H2OTimeItemSetSelectedControl (This, This->SecondNumberPicker);
}
break;
case VK_LEFT:
if (This->SelectedControl == This->SecondNumberPicker) {
H2OTimeItemSetSelectedControl (This, This->MinuteNumberPicker);
} else if (This->SelectedControl == This->MinuteNumberPicker) {
H2OTimeItemSetSelectedControl (This, This->HourNumberPicker);
}
break;
case VK_F5:
H2OTimeItemSetNextValue (This, FALSE);
break;
case VK_F6:
H2OTimeItemSetNextValue (This, TRUE);
break;
default:
if (This->SelectedControl != NULL) {
CONTROL_CLASS_WNDPROC (This->SelectedControl, ((UI_CONTROL *) This->SelectedControl)->Wnd, Msg, WParam, LParam);
}
break;
}
}
BOOLEAN
EFIAPI
H2OTimeItemSetAttribute (
UI_CONTROL *Control,
CHAR16 *Name,
CHAR16 *Value
)
{
H2O_TIME_ITEM *This;
EFI_STATUS Status;
EFI_TIME *EfiTime;
This = (H2O_TIME_ITEM *) Control;
if (StrCmp (Name, L"efitime") == 0) {
EfiTime = (EFI_TIME *) (UINTN) StrToUInt (Value, 16, &Status);
CopyMem (&This->EfiTime, EfiTime, sizeof(EFI_TIME));
H2OTimeItemNumberPickerUpdate (This, &This->EfiTime);
} else {
return PARENT_CLASS_SET_ATTRIBUTE (CURRENT_CLASS, Control, Name, Value);
}
CONTROL_CLASS_INVALIDATE (This);
return TRUE;
}
VOID
EFIAPI
H2OTimeItemSetState (
UI_CONTROL *Control,
UI_STATE SetState,
UI_STATE ClearState
)
{
H2O_TIME_ITEM *This;
UI_CONTROL *ChildControl;
This = (H2O_TIME_ITEM *) Control;
if (SetState & UISTATE_FOCUSED) {
if (This->SelectedControl == NULL) {
This->SelectedControl = This->HourNumberPicker;
}
H2OTimeItemSetSelectedControl (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");
H2OTimeItemSetSelectedControl (This, NULL);
}
PARENT_CONTROL_CLASS(CURRENT_CLASS)->SetState (Control, SetState, ClearState);
}
LRESULT
EFIAPI
H2OTimeItemProc (
HWND Wnd,
UINT32 Msg,
WPARAM WParam,
LPARAM LParam
)
{
H2O_TIME_ITEM *This;
UI_CONTROL *Control;
This = (H2O_TIME_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_TIME_ITEM *) AllocateZeroPool (sizeof (H2O_TIME_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 (mTimeItemChilds, Control);
SetWindowLongPtr (Control->Wnd, GWL_EXSTYLE, GetWindowLongPtr (Control->Wnd, GWL_EXSTYLE) & ~WS_EX_NOACTIVATE);
H2OTimeItemCreate (This);
break;
case WM_KEYDOWN:
H2OTimeItemKeyDown (Wnd, Msg, WParam, LParam);
break;
case WM_CHAR:
H2OTimeItemCharPress (Wnd, Msg, WParam, LParam);
break;
case WM_GETDLGCODE:
if (This->SelectedControl == This->SecondNumberPicker) {
return 0;
}
return DLGC_WANTTAB;
case WM_NCHITTEST:
return HTCLIENT;
default:
return PARENT_CLASS_WNDPROC (CURRENT_CLASS, Wnd, Msg, WParam, LParam);
}
return 0;
}
H2O_TIME_ITEM_CLASS *
EFIAPI
GetTimeItemClass (
VOID
)
{
if (CURRENT_CLASS != NULL) {
return CURRENT_CLASS;
}
InitUiClass ((UI_CONTROL_CLASS **)&CURRENT_CLASS, sizeof (*CURRENT_CLASS), L"TimeItem", (UI_CONTROL_CLASS *)GetControlClass());
if (CURRENT_CLASS == NULL) {
return NULL;
}
((UI_CONTROL_CLASS *)CURRENT_CLASS)->WndProc = H2OTimeItemProc;
((UI_CONTROL_CLASS *)CURRENT_CLASS)->SetState = H2OTimeItemSetState;
((UI_CONTROL_CLASS *)CURRENT_CLASS)->SetAttribute = H2OTimeItemSetAttribute;
return CURRENT_CLASS;
}