1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_DATE_PICKER_DATE_PICKER_DIALOG_VIEW_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_DATE_PICKER_DATE_PICKER_DIALOG_VIEW_H
18 
19 #include "base/utils/macros.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/picker/picker_base_component.h"
22 #include "core/components_ng/pattern/button/button_layout_property.h"
23 #include "core/components_ng/pattern/picker/datepicker_event_hub.h"
24 #include "core/components_ng/pattern/picker/datepicker_layout_property.h"
25 #include "core/components_ng/pattern/picker/datepicker_pattern.h"
26 #include "core/components_ng/pattern/picker/picker_type_define.h"
27 #include "core/components_ng/pattern/time_picker/timepicker_row_pattern.h"
28 #include "core/components_ng/pattern/picker/date_time_animation_controller.h"
29 
30 namespace OHOS::Ace::NG {
31 class DateTimeAnimationController;
32 class CheckBoxPaintProperty;
33 class ACE_EXPORT DatePickerDialogView {
34 public:
35     static RefPtr<FrameNode> Show(const DialogProperties& dialogProps, const DatePickerSettingData& settingData,
36         const std::vector<ButtonInfo>& buttonInfos, std::map<std::string, NG::DialogEvent> dialogEvent,
37         std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent);
38     static void SetStartDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value);
39     static void SetEndDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value);
40     static void SetSelectedDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value);
41     static void SetShowLunar(const RefPtr<FrameNode>& frameNode, bool lunar = false);
42     static void SetDateTextProperties(const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties);
43     static void SetTimeTextProperties(const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties);
44     static void SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange);
45     static void SetDialogDateChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange);
46     static void SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange);
47     static void SetDialogDateAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange);
48     static void SetDialogSwitchEvent(std::function<bool()> switchEvent, const RefPtr<FrameNode>& pickerStack);
49     static RefPtr<FrameNode> CreateButtonNode(const RefPtr<FrameNode>& dateNode,
50         const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos,
51         std::map<std::string, NG::DialogEvent> dialogEvent,
52         std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent);
53     static RefPtr<FrameNode> CreateTitleButtonNode(const RefPtr<FrameNode>& dateNode);
54     static RefPtr<FrameNode> CreateTitleButtonRowNode();
55     static void CreateTitleIconNode(const RefPtr<FrameNode>& titleNode);
56     static RefPtr<FrameNode> CreateDividerNode(const RefPtr<FrameNode>& dateNode, bool isCreateDivider = false);
57     static RefPtr<FrameNode> CreateConfirmNode(const RefPtr<FrameNode>& dateNode,
58         const RefPtr<FrameNode>& datePickerNode, DialogEvent& acceptEvent, const std::vector<ButtonInfo>& buttonInfos);
59     static RefPtr<FrameNode> CreateCancelNode(NG::DialogGestureEvent& cancelEvent,
60         const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos);
61     static RefPtr<FrameNode> CreateDateNode(int32_t dateNodeId, std::map<std::string, PickerDate> datePickerProperty,
62         const PickerTextProperties& properties, bool isLunar, bool hasTime);
63     static RefPtr<FrameNode> CreateColumnNode(int32_t nodeId, uint32_t showCount, bool isDate = true);
64     static void CreateNormalDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount);
65     static void CreateSingleDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount);
66     static RefPtr<FrameNode> CreateTimeNode(std::map<std::string, PickerTime> timePickerProperty,
67         const PickerTextProperties& properties, bool useMilitaryTime);
68     static RefPtr<FrameNode> CreateLunarSwitchTextNode();
69 
70     static bool switchFlag_;
71 
72 private:
73     static RefPtr<FrameNode> CreateStackNode();
74     static RefPtr<FrameNode> CreateColumnNode();
75     static RefPtr<FrameNode> CreateButtonNode();
76     static void UpdateCheckboxPaintProperty(const RefPtr<CheckBoxPaintProperty>& checkboxPaintProps,
77     bool isLunar, const CheckboxSettingData& checkboxSettingData);
78     static void CreateLunarswitchNode(const RefPtr<FrameNode>& contentColumn, const RefPtr<FrameNode>& dateNode,
79         std::function<void(const bool)>&& changeEvent, bool isLunar, const CheckboxSettingData& checkboxSettingData);
80     static void SetTitleMouseHoverEvent(const RefPtr<FrameNode>& titleRow);
81     static void HandleMouseEvent(const RefPtr<FrameNode>& titleButton, bool isHover);
82     static void PlayHoverAnimation(const RefPtr<FrameNode>& titleButton, const Color& color);
83     static void MountColumnNodeToPicker(
84         const RefPtr<FrameNode>& columnNode, const RefPtr<FrameNode>& pickerNode, uint32_t columnWeight = 1);
85     static void UpdateTitleRowLayoutProps(const RefPtr<FrameNode>& titleRow);
86     static void SetTimeNodeColumnWeight(const RefPtr<FrameNode>& timeNode, const DatePickerSettingData& settingData);
87     static RefPtr<FrameNode> CreateAndMountDateNode(
88         const DatePickerSettingData& settingData, const RefPtr<FrameNode>& pickerStack);
89     static RefPtr<FrameNode> CreateAndMountButtonTitleNode(
90         const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& contentColumn);
91     static std::function<void(bool)> CreateLunarChangeEvent(const RefPtr<FrameNode>& dateNode);
92     static RefPtr<FrameNode> CreateAndMountMonthDaysNode(const DatePickerSettingData& settingData,
93         const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& pickerRow,
94         std::function<void(bool)>&& lunarChangeEvent);
95     static RefPtr<FrameNode> CreateAndMountTimeNode(const DatePickerSettingData& settingData,
96         const RefPtr<FrameNode>& monthDaysNode, const RefPtr<FrameNode>& pickerRow);
97     static std::function<void()> CreateAndSetDialogSwitchEvent(const RefPtr<FrameNode>& pickerStack,
98         const RefPtr<FrameNode>& contentColumn, const DatePickerSettingData& settingData);
99     static void SwitchPickerPage(const RefPtr<FrameNode>& pickerStack, const RefPtr<FrameNode>& contentColumn,
100         const RefPtr<DateTimeAnimationController>& animationController, bool useMilitary = false);
101     static void SwitchDatePickerPage(const RefPtr<FrameNode>& dateNode, bool IsSwitchByTitle = false);
102     static void HideContentChildrenButton(const RefPtr<FrameNode>& contentRow);
103     static void SwitchContentRowButton(const RefPtr<FrameNode>& contentRow, bool useMilitary = false);
104     static void ShowContentRowButton(const RefPtr<FrameNode>& contentRow, bool isFirstPage = true);
105     static void CreateAndAddTitleClickEvent(
106         std::function<void()>& titleSwitchEvent, const RefPtr<FrameNode>& buttonTitleNode);
107     static void BuildDialogAcceptAndCancelButton(const std::vector<ButtonInfo>& buttonInfos,
108         const DatePickerSettingData& settingData, const RefPtr<FrameNode>& acceptNode,
109         const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& dialogNode, const RefPtr<FrameNode>& contentColumn,
110         std::map<std::string, NG::DialogEvent> dialogEvent,
111         std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent);
112     static void UpdateConfirmButtonTextLayoutProperty(
113         const RefPtr<TextLayoutProperty>& textLayoutProperty, const RefPtr<PickerTheme>& pickerTheme);
114     static void UpdateButtonLayoutProperty(
115         const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<PickerTheme>& pickerTheme);
116     static void UpdateConfirmButtonMargin(
117         const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<DialogTheme>& dialogTheme);
118     static void UpdateCancelButtonMargin(
119         const RefPtr<ButtonLayoutProperty>& buttonCancelLayoutProperty, const RefPtr<DialogTheme>& dialogTheme);
120     static void UpdateNextButtonMargin(const RefPtr<ButtonLayoutProperty>& buttonNextLayoutProperty);
121     static void UpdateButtonStyles(const std::vector<ButtonInfo>& buttonInfos, size_t index,
122         const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext);
123     static void UpdateButtonStyleAndRole(const std::vector<ButtonInfo>& buttonInfos, size_t index,
124         const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext,
125         const RefPtr<ButtonTheme>& buttonTheme);
126     static void UpdateContentPadding(const RefPtr<FrameNode>& contentColumn);
127     static void UpdateButtonDefaultFocus(const std::vector<ButtonInfo>& buttonInfos,
128         const RefPtr<FrameNode>& buttonNode, bool isConfirm);
129     static RefPtr<FrameNode> CreateNextPrevButtonNode(
130         std::function<void()> & switchEvent,
131         const RefPtr<FrameNode>& dateNode, const std::vector<ButtonInfo> &buttonInfos,
132         const RefPtr<FrameNode>& contentRow);
133     static void BuildDialogAcceptAndCancelButtonForAging(
134         const std::vector<ButtonInfo> &buttonInfos, const DatePickerSettingData &settingData,
135         const RefPtr<FrameNode> &timePickerNode, const RefPtr<FrameNode> &acceptNode,
136         const RefPtr<FrameNode> &dateNode, const RefPtr<FrameNode> &dialogNode,
137         const RefPtr<FrameNode> &contentColumn, std::map<std::string, NG::DialogEvent> dialogEvent,
138         std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent);
139     static bool NeedAdaptForAging();
140     static RefPtr<FrameNode> CreateButtonNodeForAging(const DatePickerSettingData& settingData,
141         const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayNode,
142         const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos,
143         std::map<std::string, NG::DialogEvent> dialogEvent,
144         std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent);
145     static std::function<void()> CreateAndSetTimePickerSwitchEvent(
146         const RefPtr<FrameNode>& monthAndDayPickerNode, const RefPtr<FrameNode>& timePickerNode,
147         const RefPtr<FrameNode>& contentRow);
148     static std::function<void(const GestureEvent&)> CreateNextPrevClickEvent(
149         const RefPtr<FrameNode>& textNextPrevNode, const RefPtr<FrameNode>& nextPrevButtonNode,
150         const RefPtr<DialogTheme>& dialogTheme, const RefPtr<FrameNode>& dateNode,
151         std::function<void()>& switchEvent, const RefPtr<FrameNode>& contentRow);
152     static void SwitchTimePickerPage(
153         const RefPtr<FrameNode> &monthAndDayPickerNode, const RefPtr<FrameNode> &timePickerNode,
154         const RefPtr<FrameNode> &contentRow);
155     static bool GetIsUserSetTextProperties(const PickerTextProperties& properties);
156     static void SetAnimationProperty(const RefPtr<FrameNode>& pickerStack,
157         const RefPtr<FrameNode>& contentColumn, const RefPtr<DateTimeAnimationController>& animationController);
158     static std::function<void()> CloseDialogEvent(const RefPtr<FrameNode>& dateNode,
159         const RefPtr<FrameNode>& dialogNode);
160     static const Dimension ConvertFontSizeLimit(const Dimension& fontSizeValue,
161         const Dimension& fontSizeLimit, bool isUserSetFont = false);
162     static const Dimension ConvertFontScaleValue(const Dimension& fontSizeValue,
163         const Dimension& fontSizeLimit = 0.0_vp, bool isUserSetFont = false);
164     static const Dimension ConvertTitleFontScaleValue(const Dimension& fontSizeValue);
165     static const Dimension AdjustFontSizeScale(const Dimension& fontSizeValue, double fontScale);
166     static void GetUserSettingLimit();
167     static void UpdateCancelButtonTextLayoutProperty(
168         const RefPtr<TextLayoutProperty>& textCancelLayoutProperty, const RefPtr<PickerTheme>& pickerTheme);
169     static void UpdateTimePickerChildrenStatus(const RefPtr<FrameNode>& timePickerNode);
170     static void SwitchFocusStatus(
171         const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayPickerNode);
172     static bool switchTimePickerFlag_;
173     static bool switchDatePickerFlag_;
174     static bool isShowTime_;
175     static bool isUserSetFont_;
176     static Dimension selectedTextStyleFont_;
177     static Dimension normalTextStyleFont_;
178     static Dimension disappearTextStyleFont_;
179 };
180 } // namespace OHOS::Ace::NG
181 
182 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_DATE_PICKER_DATE_PICKER_DIALOG_VIEW_H
183