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 DatePickerPattern; 34 class ACE_EXPORT DatePickerDialogView { 35 public: 36 static RefPtr<FrameNode> Show(const DialogProperties& dialogProps, const DatePickerSettingData& settingData, 37 const std::vector<ButtonInfo>& buttonInfos, std::map<std::string, NG::DialogEvent> dialogEvent, 38 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent); 39 static void SetStartDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value); 40 static void SetEndDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value); 41 static void SetSelectedDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value); 42 static void SetMode(const RefPtr<FrameNode>& frameNode, const DatePickerMode& mode); 43 static void SetShowLunar(const RefPtr<FrameNode>& frameNode, bool lunar = false); 44 static void SetCanLoop(const RefPtr<FrameNode>& frameNode, bool isLoop = true); 45 static void SetDateTextProperties(const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties); 46 static void SetTimeTextProperties(const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties); 47 static void SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange); 48 static void SetDialogDateChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange); 49 static void SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange); 50 static void SetDialogDateAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange); 51 static void SetDialogSwitchEvent(std::function<bool()> switchEvent, const RefPtr<FrameNode>& pickerStack); 52 static RefPtr<FrameNode> CreateButtonNode(const RefPtr<FrameNode>& dateNode, 53 const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos, 54 std::map<std::string, NG::DialogEvent> dialogEvent, 55 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent); 56 static RefPtr<FrameNode> CreateTitleButtonNode(const RefPtr<FrameNode>& dateNode); 57 static RefPtr<FrameNode> CreateTitleButtonRowNode(); 58 static void CreateTitleIconNode(const RefPtr<FrameNode>& titleNode); 59 static RefPtr<FrameNode> CreateDividerNode(const RefPtr<FrameNode>& dateNode, bool isCreateDivider = false); 60 static RefPtr<FrameNode> CreateConfirmNode(const RefPtr<FrameNode>& dateNode, 61 const RefPtr<FrameNode>& datePickerNode, DialogEvent& acceptEvent, const std::vector<ButtonInfo>& buttonInfos); 62 static RefPtr<FrameNode> CreateCancelNode(NG::DialogGestureEvent& cancelEvent, 63 const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos); 64 static RefPtr<FrameNode> CreateDateNode(int32_t dateNodeId, const DatePickerSettingData& settingData, bool hasTime); 65 static RefPtr<FrameNode> CreateColumnNode(int32_t nodeId, uint32_t showCount, bool isDate = true); 66 static void CreateNormalDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount); 67 static void CreateSingleDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount); 68 static RefPtr<FrameNode> CreateTimeNode(std::map<std::string, PickerTime> timePickerProperty, 69 const PickerTextProperties& properties, bool useMilitaryTime); 70 static RefPtr<FrameNode> CreateLunarSwitchTextNode(); 71 72 static bool switchFlag_; 73 74 private: 75 static RefPtr<FrameNode> CreateStackNode(); 76 static RefPtr<FrameNode> CreateColumnNode(); 77 static RefPtr<FrameNode> CreateButtonNode(); 78 static void UpdateCheckboxPaintProperty(const RefPtr<CheckBoxPaintProperty>& checkboxPaintProps, 79 bool isLunar, const CheckboxSettingData& checkboxSettingData); 80 static void CreateLunarswitchNode(const RefPtr<FrameNode>& contentColumn, const RefPtr<FrameNode>& dateNode, 81 std::function<void(const bool)>&& changeEvent, bool isLunar, const CheckboxSettingData& checkboxSettingData); 82 static void SetTitleMouseHoverEvent(const RefPtr<FrameNode>& titleRow); 83 static void HandleMouseEvent(const RefPtr<FrameNode>& titleButton, bool isHover); 84 static void PlayHoverAnimation(const RefPtr<FrameNode>& titleButton, const Color& color); 85 static void MountColumnNodeToPicker( 86 const RefPtr<FrameNode>& columnNode, const RefPtr<FrameNode>& pickerNode, uint32_t columnWeight = 1); 87 static void UpdateTitleRowLayoutProps(const RefPtr<FrameNode>& titleRow); 88 static void SetTimeNodeColumnWeight(const RefPtr<FrameNode>& timeNode, const DatePickerSettingData& settingData); 89 static RefPtr<FrameNode> CreateAndMountDateNode( 90 const DatePickerSettingData& settingData, const RefPtr<FrameNode>& pickerStack); 91 static RefPtr<FrameNode> CreateAndMountButtonTitleNode( 92 const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& contentColumn); 93 static std::function<void(bool)> CreateLunarChangeEvent(const RefPtr<FrameNode>& dateNode); 94 static RefPtr<FrameNode> CreateAndMountMonthDaysNode(const DatePickerSettingData& settingData, 95 const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& pickerRow, 96 std::function<void(bool)>&& lunarChangeEvent); 97 static bool SetSelectedDateAndFocus(const RefPtr<FrameNode>& monthDaysNode, const RefPtr<FrameNode>& dateNode); 98 static RefPtr<FrameNode> CreateAndMountTimeNode(const DatePickerSettingData& settingData, 99 const RefPtr<FrameNode>& monthDaysNode, const RefPtr<FrameNode>& pickerRow); 100 static std::function<void()> CreateAndSetDialogSwitchEvent(const RefPtr<FrameNode>& pickerStack, 101 const RefPtr<FrameNode>& contentColumn, const DatePickerSettingData& settingData); 102 static void SwitchPickerPage(const RefPtr<FrameNode>& pickerStack, const RefPtr<FrameNode>& contentColumn, 103 const RefPtr<DateTimeAnimationController>& animationController, bool useMilitary = false); 104 static void SwitchDatePickerPage(const RefPtr<FrameNode>& dateNode, bool isSwitchByTitle = false); 105 static void UpdateDateNodeVisibilityAndWeight(const RefPtr<LayoutProperty>& layoutProperty, 106 const RefPtr<LayoutProperty>& dateChildNodeLayoutProperty, bool isSwitchByTitle, uint32_t index); 107 static void HideContentChildrenButton(const RefPtr<FrameNode>& contentRow); 108 static void SwitchContentRowButton(const RefPtr<FrameNode>& contentRow, bool useMilitary = false); 109 static void ShowContentRowButton(const RefPtr<FrameNode>& contentRow, bool isFirstPage = true); 110 static bool InitContentRowVisibility(const RefPtr<FrameNode>& contentRow); 111 static bool UpdateButtonVisibility(const RefPtr<FrameNode>& buttonNode); 112 static void CreateAndAddTitleClickEvent( 113 std::function<void()>& titleSwitchEvent, const RefPtr<FrameNode>& buttonTitleNode); 114 static void BuildDialogAcceptAndCancelButton(const std::vector<ButtonInfo>& buttonInfos, 115 const DatePickerSettingData& settingData, const RefPtr<FrameNode>& acceptNode, 116 const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& dialogNode, const RefPtr<FrameNode>& contentColumn, 117 std::map<std::string, NG::DialogEvent> dialogEvent, 118 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent); 119 static void UpdateConfirmButtonTextLayoutProperty( 120 const RefPtr<TextLayoutProperty>& textLayoutProperty, const RefPtr<PickerTheme>& pickerTheme); 121 static void UpdateButtonLayoutProperty( 122 const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<PickerTheme>& pickerTheme); 123 static void UpdateConfirmButtonMargin( 124 const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<DialogTheme>& dialogTheme); 125 static void UpdateCancelButtonMargin( 126 const RefPtr<ButtonLayoutProperty>& buttonCancelLayoutProperty, const RefPtr<DialogTheme>& dialogTheme); 127 static void UpdateNextButtonMargin(const RefPtr<ButtonLayoutProperty>& buttonNextLayoutProperty); 128 static void UpdateButtonStyles(const std::vector<ButtonInfo>& buttonInfos, size_t index, 129 const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext); 130 static void UpdateButtonStyleAndRole(const std::vector<ButtonInfo>& buttonInfos, size_t index, 131 const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext, 132 const RefPtr<ButtonTheme>& buttonTheme); 133 static void UpdateContentPadding(const RefPtr<FrameNode>& contentColumn); 134 static void UpdateButtonDefaultFocus(const std::vector<ButtonInfo>& buttonInfos, 135 const RefPtr<FrameNode>& buttonNode, bool isConfirm); 136 static RefPtr<FrameNode> CreateNextPrevButtonNode( 137 std::function<void()> & switchEvent, 138 const RefPtr<FrameNode>& dateNode, const std::vector<ButtonInfo> &buttonInfos, 139 const RefPtr<FrameNode>& contentRow); 140 static void BuildDialogAcceptAndCancelButtonForAging( 141 const std::vector<ButtonInfo> &buttonInfos, const DatePickerSettingData &settingData, 142 const RefPtr<FrameNode> &timePickerNode, const RefPtr<FrameNode> &acceptNode, 143 const RefPtr<FrameNode> &dateNode, const RefPtr<FrameNode> &dialogNode, 144 const RefPtr<FrameNode> &contentColumn, std::map<std::string, NG::DialogEvent> dialogEvent, 145 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent); 146 static bool NeedAdaptForAging(); 147 static RefPtr<FrameNode> CreateButtonNodeForAging(const DatePickerSettingData& settingData, 148 const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayNode, 149 const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos, 150 std::map<std::string, NG::DialogEvent> dialogEvent, 151 std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent); 152 static std::function<void()> CreateAndSetTimePickerSwitchEvent( 153 const RefPtr<FrameNode>& monthAndDayPickerNode, const RefPtr<FrameNode>& timePickerNode, 154 const RefPtr<FrameNode>& contentRow); 155 static std::function<void(const GestureEvent&)> CreateNextPrevClickEvent( 156 const RefPtr<FrameNode>& textNextPrevNode, const RefPtr<FrameNode>& nextPrevButtonNode, 157 const RefPtr<DialogTheme>& dialogTheme, const RefPtr<FrameNode>& dateNode, 158 std::function<void()>& switchEvent, const RefPtr<FrameNode>& contentRow); 159 static void SwitchTimePickerPage( 160 const RefPtr<FrameNode> &monthAndDayPickerNode, const RefPtr<FrameNode> &timePickerNode, 161 const RefPtr<FrameNode> &contentRow); 162 static bool GetIsUserSetTextProperties(const PickerTextProperties& properties); 163 static void SetAnimationProperty(const RefPtr<FrameNode>& pickerStack, 164 const RefPtr<FrameNode>& contentColumn, const RefPtr<DateTimeAnimationController>& animationController); 165 static std::function<void()> CloseDialogEvent(const RefPtr<FrameNode>& dateNode, 166 const RefPtr<FrameNode>& dialogNode); 167 static const Dimension ConvertFontSizeLimit(const Dimension& fontSizeValue, 168 const Dimension& fontSizeLimit, bool isUserSetFont = false); 169 static const Dimension ConvertFontScaleValue(const Dimension& fontSizeValue, 170 const Dimension& fontSizeLimit = 0.0_vp, bool isUserSetFont = false); 171 static const Dimension ConvertTitleFontScaleValue(const Dimension& fontSizeValue); 172 static const Dimension AdjustFontSizeScale(const Dimension& fontSizeValue, double fontScale); 173 static void GetUserSettingLimit(); 174 static void UpdateCancelButtonTextLayoutProperty( 175 const RefPtr<TextLayoutProperty>& textCancelLayoutProperty, const RefPtr<PickerTheme>& pickerTheme); 176 static void UpdateTimePickerChildrenStatus(const RefPtr<FrameNode>& timePickerNode); 177 static void SwitchFocusStatus( 178 const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayPickerNode); 179 static DialogEvent GetDateChangeEvent(const RefPtr<FrameNode>& frameNode, 180 const std::map<std::string, NG::DialogEvent>& dialogEvent); 181 static void ToggleTitleDisplay( 182 RefPtr<DatePickerPattern>& datePickerPattern, RefPtr<DatePickerPattern>& monthDaysPickerPattern); 183 static std::string GetDialogAgingButtonText(bool isNext); 184 static std::string GetDialogNormalButtonText(bool isConfirm); 185 static bool switchTimePickerFlag_; 186 static bool switchDatePickerFlag_; 187 static bool isShowTime_; 188 static bool isUserSetFont_; 189 static bool isEnableHapticFeedback_; 190 static Dimension selectedTextStyleFont_; 191 static Dimension normalTextStyleFont_; 192 static Dimension disappearTextStyleFont_; 193 static DatePickerMode datePickerMode_; 194 }; 195 } // namespace OHOS::Ace::NG 196 197 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_DATE_PICKER_DATE_PICKER_DIALOG_VIEW_H 198