• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "core/components_ng/pattern/picker/datepicker_dialog_view.h"
16 
17 #include <utility>
18 
19 #include "base/geometry/dimension.h"
20 #include "base/i18n/date_time_sequence.h"
21 #include "base/memory/ace_type.h"
22 #include "base/utils/utils.h"
23 #include "core/components/theme/icon_theme.h"
24 #include "core/components_ng/base/view_stack_processor.h"
25 #include "core/components_ng/pattern/button/button_pattern.h"
26 #include "core/components_ng/pattern/calendar/calendar_paint_property.h"
27 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
28 #include "core/components_ng/pattern/dialog/dialog_view.h"
29 #include "core/components_ng/pattern/divider/divider_pattern.h"
30 #include "core/components_ng/pattern/dialog/dialog_pattern.h"
31 #include "core/components_ng/pattern/image/image_pattern.h"
32 #include "core/components_ng/pattern/picker/datepicker_pattern.h"
33 #include "core/components_ng/pattern/picker/datepicker_row_layout_property.h"
34 #include "core/components_ng/pattern/stack/stack_pattern.h"
35 #include "core/components_ng/property/measure_property.h"
36 #include "core/components_v2/inspector/inspector_constants.h"
37 #include "core/pipeline/pipeline_base.h"
38 
39 namespace OHOS::Ace::NG {
40 namespace {
41 const int32_t MARGIN_HALF = 2;
42 const int32_t NEXT_BUTTON_INDEX = 2;
43 const int32_t DIVIDER_ROWS_THREE = 3;
44 constexpr double MONTHDAYS_WIDTH_PERCENT_ONE = 0.4285;
45 constexpr double TIME_WIDTH_PERCENT_ONE = 0.5714;
46 constexpr double MONTHDAYS_WIDTH_PERCENT_TWO = 0.3636;
47 constexpr double TIME_WIDTH_PERCENT_TWO = 0.6363;
48 constexpr Dimension BUTTON_BOTTOM_TOP_MARGIN = 10.0_vp;
49 constexpr Dimension LUNARSWITCH_HEIGHT = 48.0_vp;
50 constexpr Dimension CHECKBOX_SIZE = 24.0_vp;
51 constexpr Dimension PICKER_DIALOG_MARGIN_FORM_EDGE = 24.0_vp;
52 constexpr Dimension TITLE_HEIGHT = 40.0_vp;
53 constexpr Dimension TITLE_BUTTON_HEIGHT = 32.0_vp;
54 constexpr Dimension TITLE_PADDING_HORIZONTAL = 16.0_vp;
55 constexpr Dimension PICKER_MARGIN_FROM_TITLE_AND_BUTTON = 8.0_vp;
56 constexpr int32_t HOVER_ANIMATION_DURATION = 250;
57 constexpr int32_t BUFFER_NODE_NUMBER = 2;
58 constexpr int32_t RATIO_SEVEN = 7;
59 constexpr int32_t RATIO_FOUR = 4;
60 constexpr int32_t RATIO_THREE = 3;
61 constexpr int32_t RATIO_TWO = 2;
62 constexpr size_t ACCEPT_BUTTON_INDEX = 0;
63 constexpr size_t CANCEL_BUTTON_INDEX = 1;
64 } // namespace
65 bool DatePickerDialogView::switchFlag_ = false;
66 bool DatePickerDialogView::switchTimePickerFlag_ = false;
67 bool DatePickerDialogView::switchDatePickerFlag_ = false;
68 bool DatePickerDialogView::isShowTime_ = false;
69 bool DatePickerDialogView::isUserSetFont_ = false;
70 Dimension DatePickerDialogView::selectedTextStyleFont_ = 40.0_vp;
71 Dimension DatePickerDialogView::normalTextStyleFont_ = 32.0_vp;
72 Dimension DatePickerDialogView::disappearTextStyleFont_ = 28.0_vp;
73 
Show(const DialogProperties & dialogProperties,const DatePickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)74 RefPtr<FrameNode> DatePickerDialogView::Show(const DialogProperties& dialogProperties,
75     const DatePickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
76     std::map<std::string, NG::DialogEvent> dialogEvent, std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
77 {
78     ACE_LAYOUT_SCOPED_TRACE("Create[DatePickerDialogView]");
79     GetUserSettingLimit();
80     auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
81         AceType::MakeRefPtr<LinearLayoutPattern>(true));
82     auto pickerStack = CreateStackNode();
83     auto dateNode = CreateAndMountDateNode(settingData, pickerStack);
84     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
85     CHECK_NULL_RETURN(pickerPattern, nullptr);
86     DateTimeSequence sequence;
87     auto language = AceApplicationInfo::GetInstance().GetLanguage();
88     OrderResult orderResult = sequence.GetDateOrder(language);
89     if (language == "ug") {
90         pickerPattern->SetDateOrder("y-d-M");
91     } else {
92         auto dateOrder = orderResult.dateOrder;
93         pickerPattern->SetDateOrder(dateOrder);
94     }
95     pickerPattern->SetIsShowInDialog(true);
96     pickerPattern->SetShowLunarSwitch(settingData.lunarswitch);
97     pickerPattern->SetTextProperties(settingData.properties);
98     auto buttonTitleNode = CreateAndMountButtonTitleNode(dateNode, contentColumn);
99     CHECK_NULL_RETURN(buttonTitleNode, nullptr);
100 
101     std::function<void(bool)> lunarChangeEvent = CreateLunarChangeEvent(dateNode);
102     RefPtr<FrameNode> acceptNode = dateNode;
103     RefPtr<FrameNode> timePickerNode = dateNode;
104     if (settingData.showTime) {
105         switchFlag_ = false;
106         switchTimePickerFlag_ = false;
107         auto pickerRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
108             AceType::MakeRefPtr<LinearLayoutPattern>(false));
109         CHECK_NULL_RETURN(pickerRow, nullptr);
110 
111         auto monthDaysNode = CreateAndMountMonthDaysNode(settingData, dateNode, pickerRow, std::move(lunarChangeEvent));
112         CHECK_NULL_RETURN(monthDaysNode, nullptr);
113         auto timeNode = CreateAndMountTimeNode(settingData, monthDaysNode, pickerRow);
114         CHECK_NULL_RETURN(timeNode, nullptr);
115         timePickerNode = timeNode;
116         isShowTime_ = true;
117         pickerRow->MountToParent(pickerStack);
118 
119         CreateTitleIconNode(buttonTitleNode);
120         SetTitleMouseHoverEvent(buttonTitleNode);
121         buttonTitleNode->MarkModifyDone();
122         auto titleSwitchEvent = CreateAndSetDialogSwitchEvent(pickerStack, contentColumn, settingData);
123         CreateAndAddTitleClickEvent(titleSwitchEvent, buttonTitleNode);
124         acceptNode = monthDaysNode;
125     } else {
126         isShowTime_ = false;
127     }
128     dateNode->MarkModifyDone();
129 
130     ViewStackProcessor::GetInstance()->Finish();
131     auto stackLayoutProperty = pickerStack->GetLayoutProperty();
132     CHECK_NULL_RETURN(stackLayoutProperty, nullptr);
133     stackLayoutProperty->UpdateUserDefinedIdealSize(
134         CalcSize(NG::CalcLength(Dimension(1, DimensionUnit::PERCENT)), std::nullopt));
135     UpdateContentPadding(pickerStack);
136     pickerStack->MountToParent(contentColumn);
137     // build lunarswitch Node
138     if (settingData.lunarswitch) {
139         CreateLunarswitchNode(contentColumn, dateNode, std::move(lunarChangeEvent), settingData.isLunar,
140             settingData.checkboxSettingData);
141     }
142     auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
143     CHECK_NULL_RETURN(dialogNode, nullptr);
144     auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
145     CHECK_NULL_RETURN(dialogPattern, nullptr);
146     dialogPattern->SetIsPickerDialog(true);
147     // build dialog accept and cancel button
148     if (NeedAdaptForAging()) {
149         BuildDialogAcceptAndCancelButtonForAging(buttonInfos, settingData, timePickerNode, acceptNode, dateNode,
150                                                  dialogNode, contentColumn, dialogEvent, dialogCancelEvent);
151     } else {
152         BuildDialogAcceptAndCancelButton(
153             buttonInfos, settingData, acceptNode, dateNode, dialogNode, contentColumn, dialogEvent, dialogCancelEvent);
154     }
155     dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
156     return dialogNode;
157 }
158 
CreateLunarSwitchTextNode()159 RefPtr<FrameNode> DatePickerDialogView::CreateLunarSwitchTextNode()
160 {
161     auto pipeline = PipelineBase::GetCurrentContext();
162     CHECK_NULL_RETURN(pipeline, nullptr);
163     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
164     CHECK_NULL_RETURN(pickerTheme, nullptr);
165 
166     auto textNode = FrameNode::CreateFrameNode(
167         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
168     CHECK_NULL_RETURN(textNode, nullptr);
169     auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
170     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
171     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("datepicker.lunarSwitch"));
172     textLayoutProperty->UpdateFontSize(ConvertFontScaleValue(pickerTheme->GetLunarSwitchTextSize()));
173     textLayoutProperty->UpdateTextColor(pickerTheme->GetLunarSwitchTextColor());
174     textNode->MarkModifyDone();
175     return textNode;
176 }
177 
SetTimeNodeColumnWeight(const RefPtr<FrameNode> & timeNode,const DatePickerSettingData & settingData)178 void DatePickerDialogView::SetTimeNodeColumnWeight(
179     const RefPtr<FrameNode>& timeNode, const DatePickerSettingData& settingData)
180 {
181     auto timeLayoutProperty = timeNode->GetLayoutProperty();
182     CHECK_NULL_VOID(timeLayoutProperty);
183     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
184         timeLayoutProperty->UpdateLayoutWeight(settingData.useMilitary ? RATIO_FOUR : RATIO_SEVEN);
185         for (const auto& child : timeNode->GetChildren()) {
186             auto frameNodeChild = AceType::DynamicCast<NG::FrameNode>(child);
187             CHECK_NULL_VOID(frameNodeChild);
188             auto timeColumnLayoutProperty = frameNodeChild->GetLayoutProperty();
189             CHECK_NULL_VOID(timeColumnLayoutProperty);
190             timeColumnLayoutProperty->UpdateLayoutWeight(RATIO_TWO);
191         }
192         if (!settingData.useMilitary) {
193             auto child = timeNode->GetFirstChild();
194             CHECK_NULL_VOID(child);
195             auto frameNodeChild = AceType::DynamicCast<NG::FrameNode>(child);
196             CHECK_NULL_VOID(frameNodeChild);
197             auto timeColumnLayoutProperty = frameNodeChild->GetLayoutProperty();
198             CHECK_NULL_VOID(timeColumnLayoutProperty);
199             timeColumnLayoutProperty->UpdateLayoutWeight(RATIO_THREE);
200         }
201     } else {
202         timeLayoutProperty->UpdateUserDefinedIdealSize(
203             CalcSize(NG::CalcLength(Dimension(settingData.useMilitary ? TIME_WIDTH_PERCENT_ONE : TIME_WIDTH_PERCENT_TWO,
204                 DimensionUnit::PERCENT)),
205             std::nullopt));
206     }
207 }
208 
CreateStackNode()209 RefPtr<FrameNode> DatePickerDialogView::CreateStackNode()
210 {
211     auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
212     return FrameNode::GetOrCreateFrameNode(
213         V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
214 }
215 
CreateColumnNode()216 RefPtr<FrameNode> DatePickerDialogView::CreateColumnNode()
217 {
218     auto columnId = ElementRegister::GetInstance()->MakeUniqueId();
219     return FrameNode::GetOrCreateFrameNode(
220         V2::COLUMN_ETS_TAG, columnId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
221 }
222 
CreateButtonNode()223 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode()
224 {
225     auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
226     return FrameNode::GetOrCreateFrameNode(
227         V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
228 }
229 
CreateTitleButtonNode(const RefPtr<FrameNode> & dateNode)230 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonNode(const RefPtr<FrameNode>& dateNode)
231 {
232     auto pipeline = PipelineContext::GetCurrentContext();
233     CHECK_NULL_RETURN(pipeline, nullptr);
234     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
235     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
236     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
237     CHECK_NULL_RETURN(pickerPattern, nullptr);
238     auto titleRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
239         AceType::MakeRefPtr<LinearLayoutPattern>(false));
240     CHECK_NULL_RETURN(titleRow, nullptr);
241     UpdateTitleRowLayoutProps(titleRow);
242 
243     auto buttonTitleNode = FrameNode::GetOrCreateFrameNode(
244         V2::BUTTON_ETS_TAG, pickerPattern->GetButtonTitleId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
245     CHECK_NULL_RETURN(buttonTitleNode, nullptr);
246     auto titleButtonRow = CreateTitleButtonRowNode();
247     CHECK_NULL_RETURN(titleButtonRow, nullptr);
248     auto textTitleNodeId = pickerPattern->GetTitleId();
249     auto textTitleNode =
250         FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, textTitleNodeId, AceType::MakeRefPtr<TextPattern>());
251     CHECK_NULL_RETURN(textTitleNode, nullptr);
252     auto textLayoutProperty = textTitleNode->GetLayoutProperty<TextLayoutProperty>();
253     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
254     textLayoutProperty->UpdateContent("");
255     textLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
256     textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor());
257     textLayoutProperty->UpdateFontSize(ConvertTitleFontScaleValue(pickerTheme->GetTitleStyle().GetFontSize()));
258     textLayoutProperty->UpdateFontWeight(pickerTheme->GetTitleStyle().GetFontWeight());
259     textLayoutProperty->UpdateTextOverflow(pickerTheme->GetTitleStyle().GetTextOverflow());
260     textLayoutProperty->UpdateMaxLines(pickerTheme->GetTitleStyle().GetMaxLines());
261     textLayoutProperty->UpdateFlexShrink(1.0);
262     auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
263     CHECK_NULL_RETURN(buttonTitleRenderContext, nullptr);
264     buttonTitleRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
265     MarginProperty margin;
266     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
267         margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
268         margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
269         margin.top = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
270         margin.bottom = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
271         buttonTitleNode->GetLayoutProperty()->UpdateMargin(margin);
272     } else {
273         buttonTitleNode->GetLayoutProperty()->UpdateUserDefinedIdealSize(CalcSize(
274             CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(TITLE_BUTTON_HEIGHT)));
275         titleButtonRow->GetLayoutProperty()->UpdateUserDefinedIdealSize(CalcSize(
276             CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(TITLE_BUTTON_HEIGHT)));
277     }
278     textTitleNode->MountToParent(titleButtonRow);
279     titleButtonRow->MountToParent(buttonTitleNode);
280     buttonTitleNode->MountToParent(titleRow);
281     titleRow->SetNeedCallChildrenUpdate(false);
282     return titleRow;
283 }
284 
UpdateTitleRowLayoutProps(const RefPtr<FrameNode> & titleRow)285 void DatePickerDialogView::UpdateTitleRowLayoutProps(const RefPtr<FrameNode>& titleRow)
286 {
287     auto layoutProps = titleRow->GetLayoutProperty<LinearLayoutProperty>();
288     CHECK_NULL_VOID(layoutProps);
289     layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
290     layoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
291     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
292 }
293 
CreateTitleButtonRowNode()294 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonRowNode()
295 {
296     auto titleButtonRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
297         AceType::MakeRefPtr<LinearLayoutPattern>(false));
298     CHECK_NULL_RETURN(titleButtonRow, nullptr);
299     auto bottonRowlayoutProps = titleButtonRow->GetLayoutProperty<LinearLayoutProperty>();
300     CHECK_NULL_RETURN(bottonRowlayoutProps, nullptr);
301     bottonRowlayoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
302     bottonRowlayoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
303     bottonRowlayoutProps->UpdateMeasureType(MeasureType::MATCH_CONTENT);
304     return titleButtonRow;
305 }
306 
CreateTitleIconNode(const RefPtr<FrameNode> & titleNode)307 void DatePickerDialogView::CreateTitleIconNode(const RefPtr<FrameNode>& titleNode)
308 {
309     auto pipeline = PipelineContext::GetCurrentContext();
310     CHECK_NULL_VOID(pipeline);
311     auto iconTheme = pipeline->GetTheme<IconTheme>();
312     CHECK_NULL_VOID(iconTheme);
313     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
314     CHECK_NULL_VOID(pickerTheme);
315     auto spinnerNode = FrameNode::CreateFrameNode(
316         V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
317     CHECK_NULL_VOID(spinnerNode);
318     ImageSourceInfo imageSourceInfo;
319     auto iconPath = iconTheme->GetIconPath(InternalResource::ResourceId::SPINNER);
320     imageSourceInfo.SetSrc(iconPath);
321     imageSourceInfo.SetFillColor(pickerTheme->GetTitleStyle().GetTextColor());
322     auto spinnerRenderProperty = spinnerNode->GetPaintProperty<ImageRenderProperty>();
323     CHECK_NULL_VOID(spinnerRenderProperty);
324     spinnerRenderProperty->UpdateSvgFillColor(pickerTheme->GetTitleStyle().GetTextColor());
325 
326     auto spinnerLayoutProperty = spinnerNode->GetLayoutProperty<ImageLayoutProperty>();
327     CHECK_NULL_VOID(spinnerLayoutProperty);
328     spinnerLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
329     CalcSize idealSize = { CalcLength(pickerTheme->GetTitleStyle().GetFontSize()),
330         CalcLength(pickerTheme->GetTitleStyle().GetFontSize()) };
331     MeasureProperty layoutConstraint;
332     layoutConstraint.selfIdealSize = idealSize;
333     spinnerLayoutProperty->UpdateCalcLayoutProperty(layoutConstraint);
334     spinnerNode->MarkModifyDone();
335     auto buttonNode = AceType::DynamicCast<FrameNode>(titleNode->GetFirstChild());
336     CHECK_NULL_VOID(buttonNode);
337     auto buttonRowNode = AceType::DynamicCast<FrameNode>(buttonNode->GetFirstChild());
338     CHECK_NULL_VOID(buttonRowNode);
339     spinnerNode->MountToParent(buttonRowNode);
340 }
341 
CreateDividerNode(const RefPtr<FrameNode> & dateNode,bool isCreateDivider)342 RefPtr<FrameNode> DatePickerDialogView::CreateDividerNode(const RefPtr<FrameNode>& dateNode, bool isCreateDivider)
343 {
344     auto pipeline = PipelineContext::GetCurrentContext();
345     CHECK_NULL_RETURN(pipeline, nullptr);
346     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
347     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
348     CHECK_NULL_RETURN(pickerPattern, nullptr);
349 
350     int32_t dividerNodeId = 0;
351     if (isCreateDivider) {
352         dividerNodeId = ElementRegister::GetInstance()->MakeUniqueId();
353     } else {
354         dividerNodeId = pickerPattern->GetDividerId();
355     }
356 
357     auto dividerNode = FrameNode::GetOrCreateFrameNode(
358         V2::DIVIDER_ETS_TAG, dividerNodeId, []() { return AceType::MakeRefPtr<DividerPattern>(); });
359     CHECK_NULL_RETURN(dividerNode, nullptr);
360 
361     auto dividerPaintProps = dividerNode->GetPaintProperty<DividerRenderProperty>();
362     CHECK_NULL_RETURN(dividerPaintProps, nullptr);
363     dividerPaintProps->UpdateDividerColor(dialogTheme->GetDividerColor());
364 
365     auto dividerLayoutProps = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
366     CHECK_NULL_RETURN(dividerLayoutProps, nullptr);
367     dividerLayoutProps->UpdateVertical(true);
368     dividerLayoutProps->UpdateUserDefinedIdealSize(
369         CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
370 
371     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
372         auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
373         CHECK_NULL_RETURN(buttonTheme, nullptr);
374         auto dividerWrapper = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
375             ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(false));
376         CHECK_NULL_RETURN(dividerWrapper, nullptr);
377         auto layoutProps = dividerWrapper->GetLayoutProperty<LinearLayoutProperty>();
378         CHECK_NULL_RETURN(layoutProps, nullptr);
379         layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
380         layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
381         layoutProps->UpdateUserDefinedIdealSize(
382             CalcSize(CalcLength(dialogTheme->GetActionsPadding().Bottom()), CalcLength(buttonTheme->GetHeight())));
383         dividerNode->MountToParent(dividerWrapper);
384         return dividerWrapper;
385     }
386     return dividerNode;
387 }
388 
CreateButtonNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)389 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode(const RefPtr<FrameNode>& dateNode,
390     const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos,
391     std::map<std::string, NG::DialogEvent> dialogEvent, std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
392 {
393     auto acceptEvent = dialogEvent["acceptId"];
394     auto dateAcceptEvent = dialogEvent["dateAcceptId"];
395     auto cancelEvent = dialogCancelEvent["cancelId"];
396     auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
397         AceType::MakeRefPtr<LinearLayoutPattern>(false));
398     CHECK_NULL_RETURN(contentRow, nullptr);
399     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
400     CHECK_NULL_RETURN(layoutProps, nullptr);
401     layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
402     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
403 
404     contentRow->SetNeedCallChildrenUpdate(false);
405     SetDialogDateAcceptEvent(dateNode, std::move(dateAcceptEvent));
406 
407     auto buttonCancelNode = CreateCancelNode(cancelEvent, datePickerNode, buttonInfos);
408     auto buttonConfirmNode = CreateConfirmNode(dateNode, datePickerNode, acceptEvent, buttonInfos);
409 
410     buttonCancelNode->MountToParent(contentRow);
411     buttonConfirmNode->MountToParent(contentRow);
412 
413     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
414     datePickerPattern->SetContentRowNode(contentRow);
415 
416     return contentRow;
417 }
418 
CreateAndSetTimePickerSwitchEvent(const RefPtr<FrameNode> & monthAndDayPickerNode,const RefPtr<FrameNode> & timePickerNode,const RefPtr<FrameNode> & contentRow)419 std::function<void()> DatePickerDialogView::CreateAndSetTimePickerSwitchEvent(
420     const RefPtr<FrameNode>& monthAndDayPickerNode, const RefPtr<FrameNode>& timePickerNode,
421     const RefPtr<FrameNode>& contentRow)
422 {
423     auto timePickerSwitchEvent = [weakTimePickerNode = AceType::WeakClaim(AceType::RawPtr(timePickerNode)),
424                                      weakMonthAndDayPickerNode =
425                                          AceType::WeakClaim(AceType::RawPtr(monthAndDayPickerNode)),
426                                      weakcontentRow = AceType::WeakClaim(AceType::RawPtr(contentRow))]() {
427         auto timePickerNode = weakTimePickerNode.Upgrade();
428         CHECK_NULL_VOID(timePickerNode);
429         auto monthAndDayPickerNode = weakMonthAndDayPickerNode.Upgrade();
430         CHECK_NULL_VOID(monthAndDayPickerNode);
431         auto contentRow = weakcontentRow.Upgrade();
432         CHECK_NULL_VOID(contentRow);
433         SwitchTimePickerPage(monthAndDayPickerNode, timePickerNode, contentRow);
434     };
435 
436     return timePickerSwitchEvent;
437 }
438 
SwitchTimePickerPage(const RefPtr<FrameNode> & monthAndDayPickerNode,const RefPtr<FrameNode> & timePickerNode,const RefPtr<FrameNode> & contentRow)439 void DatePickerDialogView::SwitchTimePickerPage(const RefPtr<FrameNode> &monthAndDayPickerNode,
440     const RefPtr<FrameNode> &timePickerNode, const RefPtr<FrameNode> &contentRow)
441 {
442     auto monthAndDayLayoutProperty = monthAndDayPickerNode->GetLayoutProperty<LayoutProperty>();
443     CHECK_NULL_VOID(monthAndDayLayoutProperty);
444     monthAndDayLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::VISIBLE : VisibleType::GONE);
445     monthAndDayLayoutProperty->UpdateLayoutWeight(switchTimePickerFlag_ ? RATIO_FOUR : 0);
446     monthAndDayPickerNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
447     SwitchFocusStatus(timePickerNode, monthAndDayPickerNode);
448     UpdateTimePickerChildrenStatus(timePickerNode);
449     auto buttonCancelNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(0));
450     CHECK_NULL_VOID(buttonCancelNode);
451     auto cancelButtonLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
452     CHECK_NULL_VOID(cancelButtonLayoutProperty);
453     cancelButtonLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::VISIBLE : VisibleType::GONE);
454     buttonCancelNode->MarkDirtyNode();
455     auto cancelNextDividerNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(1));
456     CHECK_NULL_VOID(cancelNextDividerNode);
457     auto cancelNextLayoutProperty = cancelNextDividerNode->GetLayoutProperty<LayoutProperty>();
458     CHECK_NULL_VOID(cancelNextLayoutProperty);
459     cancelNextLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::VISIBLE : VisibleType::GONE);
460     cancelNextDividerNode->MarkDirtyNode();
461     auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(contentRow->GetLastChild());
462     CHECK_NULL_VOID(buttonConfirmNode);
463     auto confirmButtonLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
464     CHECK_NULL_VOID(confirmButtonLayoutProperty);
465     confirmButtonLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::GONE : VisibleType::VISIBLE);
466     buttonConfirmNode->MarkDirtyNode();
467     auto nextConfirmDividerNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(DIVIDER_ROWS_THREE));
468     CHECK_NULL_VOID(nextConfirmDividerNode);
469     auto nextConfirmLayoutProperty = nextConfirmDividerNode->GetLayoutProperty<LayoutProperty>();
470     CHECK_NULL_VOID(nextConfirmLayoutProperty);
471     nextConfirmLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::GONE : VisibleType::VISIBLE);
472     nextConfirmDividerNode->MarkDirtyNode();
473     switchTimePickerFlag_ = !switchTimePickerFlag_;
474 }
475 
SwitchFocusStatus(const RefPtr<FrameNode> & timePickerNode,const RefPtr<FrameNode> & monthAndDayPickerNode)476 void DatePickerDialogView::SwitchFocusStatus(
477     const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayPickerNode)
478 {
479     auto timePickerPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
480     CHECK_NULL_VOID(timePickerPattern);
481     auto monthAndDayPickerPattern = monthAndDayPickerNode->GetPattern<DatePickerPattern>();
482     CHECK_NULL_VOID(monthAndDayPickerPattern);
483     if (switchTimePickerFlag_) {
484         timePickerPattern->SetFocusDisable();
485         monthAndDayPickerPattern->SetFocusEnable();
486     } else {
487         timePickerPattern->SetFocusEnable();
488         monthAndDayPickerPattern->SetFocusDisable();
489     }
490 }
491 
SwitchDatePickerPage(const RefPtr<FrameNode> & dateNode,bool IsSwitchByTitle)492 void DatePickerDialogView::SwitchDatePickerPage(const RefPtr<FrameNode>& dateNode, bool IsSwitchByTitle)
493 {
494     for (uint32_t index = 0; index < dateNode->GetChildren().size(); index++) {
495         auto dateStackNode = AceType::DynamicCast<FrameNode>(dateNode->GetChildAtIndex(index));
496         CHECK_NULL_VOID(dateStackNode);
497         auto layoutProperty = dateStackNode->GetLayoutProperty<LayoutProperty>();
498         CHECK_NULL_VOID(layoutProperty);
499         for (uint32_t k = 0; k < dateStackNode->GetChildren().size(); k++) {
500             auto dateChildNode = AceType::DynamicCast<FrameNode>(dateStackNode->GetChildAtIndex(k));
501             CHECK_NULL_VOID(dateChildNode);
502             auto dateChildNodeLayoutProperty = dateChildNode->GetLayoutProperty<LayoutProperty>();
503             CHECK_NULL_VOID(dateChildNodeLayoutProperty);
504             if ((!switchDatePickerFlag_ || IsSwitchByTitle)) {
505                 dateChildNodeLayoutProperty->UpdateVisibility((0 == index) ? VisibleType::VISIBLE : VisibleType::GONE);
506                 switchDatePickerFlag_ = false;
507                 layoutProperty->UpdateLayoutWeight((0 == index) ? RATIO_TWO : 0);
508             } else {
509                 dateChildNodeLayoutProperty->UpdateVisibility((0 == index) ? VisibleType::GONE : VisibleType::VISIBLE);
510                 layoutProperty->UpdateLayoutWeight((0 == index) ? 0 : 1);
511             }
512             dateChildNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT);
513         }
514     }
515     switchDatePickerFlag_ = !switchDatePickerFlag_;
516     dateNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
517 }
518 
UpdateTimePickerChildrenStatus(const RefPtr<FrameNode> & timePickerNode)519 void DatePickerDialogView::UpdateTimePickerChildrenStatus(const RefPtr<FrameNode>& timePickerNode)
520 {
521     auto layoutProperty = timePickerNode->GetLayoutProperty<LayoutProperty>();
522     CHECK_NULL_VOID(layoutProperty);
523     layoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::GONE : VisibleType::VISIBLE);
524     layoutProperty->UpdateLayoutWeight(switchTimePickerFlag_ ? 0 : RATIO_SEVEN);
525     for (uint32_t i = 0; i < timePickerNode->GetChildren().size(); i++) {
526         auto childStackNode = AceType::DynamicCast<FrameNode>(timePickerNode->GetChildAtIndex(i));
527         CHECK_NULL_VOID(childStackNode);
528         auto layoutProperty = childStackNode->GetLayoutProperty<LayoutProperty>();
529         CHECK_NULL_VOID(layoutProperty);
530         layoutProperty->UpdateAlignment(Alignment::CENTER);
531         for (uint32_t j = 0; j < childStackNode->GetChildren().size(); j++) {
532             auto childNode = AceType::DynamicCast<FrameNode>(childStackNode->GetChildAtIndex(j));
533             CHECK_NULL_VOID(childNode);
534             auto childLayoutProperty = childNode->GetLayoutProperty<LayoutProperty>();
535             CHECK_NULL_VOID(childLayoutProperty);
536             childLayoutProperty->UpdateVisibility(switchTimePickerFlag_ ? VisibleType::GONE : VisibleType::VISIBLE);
537             layoutProperty->UpdateLayoutWeight(switchTimePickerFlag_ ? 0 : RATIO_TWO);
538             childNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_PARENT);
539         }
540     }
541 }
542 
HideContentChildrenButton(const RefPtr<FrameNode> & contentRow)543 void DatePickerDialogView::HideContentChildrenButton(const RefPtr<FrameNode>& contentRow)
544 {
545     CHECK_NULL_VOID(contentRow);
546     for (const auto& child : contentRow->GetChildren()) {
547         auto frameNodeChild = AceType::DynamicCast<NG::FrameNode>(child);
548         CHECK_NULL_VOID(frameNodeChild);
549         auto layoutProperty = frameNodeChild->GetLayoutProperty();
550         layoutProperty->UpdateVisibility(VisibleType::GONE);
551     }
552 }
553 
SwitchContentRowButton(const RefPtr<FrameNode> & contentRow,bool useMilitary)554 void DatePickerDialogView::SwitchContentRowButton(const RefPtr<FrameNode>& contentRow, bool useMilitary)
555 {
556     if (!NeedAdaptForAging()) {
557         return;
558     }
559     HideContentChildrenButton(contentRow);
560     auto nextButton = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(2));
561     CHECK_NULL_VOID(nextButton);
562     auto nextButtonLayoutProperty = nextButton->GetLayoutProperty<ButtonLayoutProperty>();
563     CHECK_NULL_VOID(nextButtonLayoutProperty);
564     auto textNextPrevNode = AceType::DynamicCast<FrameNode>(nextButton->GetFirstChild());
565     CHECK_NULL_VOID(textNextPrevNode);
566     auto textLayoutProperty = textNextPrevNode->GetLayoutProperty<TextLayoutProperty>();
567     CHECK_NULL_VOID(textLayoutProperty);
568     if (!switchFlag_) {
569         nextButtonLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
570         UpdateNextButtonMargin(nextButtonLayoutProperty);
571         textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
572         textNextPrevNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
573     } else {
574         auto cancelButton = AceType::DynamicCast<FrameNode>(contentRow->GetFirstChild());
575         CHECK_NULL_VOID(cancelButton);
576         auto cancelLayoutProperty = cancelButton->GetLayoutProperty<LayoutProperty>();
577         CHECK_NULL_VOID(cancelLayoutProperty);
578         cancelLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
579         auto divideNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(1));
580         CHECK_NULL_VOID(divideNode);
581         auto divideLayoutProperty = divideNode->GetLayoutProperty<LayoutProperty>();
582         CHECK_NULL_VOID(divideLayoutProperty);
583         divideLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
584         nextButtonLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
585         textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
586         auto pipeline = PipelineContext::GetCurrentContextSafely();
587         CHECK_NULL_VOID(pipeline);
588         auto dialogTheme = pipeline->GetTheme<DialogTheme>();
589         CHECK_NULL_VOID(dialogTheme);
590         UpdateConfirmButtonMargin(nextButtonLayoutProperty, dialogTheme);
591         textNextPrevNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
592     }
593     contentRow->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF_AND_CHILD);
594 }
595 
ShowContentRowButton(const RefPtr<FrameNode> & contentRow,bool isFirstPage)596 void DatePickerDialogView::ShowContentRowButton(const RefPtr<FrameNode>& contentRow, bool isFirstPage)
597 {
598     for (const auto& child : contentRow->GetChildren()) {
599         auto frameNodeChild = AceType::DynamicCast<NG::FrameNode>(child);
600         CHECK_NULL_VOID(frameNodeChild);
601         auto layoutProperty = frameNodeChild->GetLayoutProperty();
602         layoutProperty->UpdateVisibility(VisibleType::GONE);
603     }
604     if (isFirstPage) {
605         auto buttonCancelNode = AceType::DynamicCast<FrameNode>(contentRow->GetFirstChild());
606         CHECK_NULL_VOID(buttonCancelNode);
607         auto layoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
608         CHECK_NULL_VOID(layoutProperty);
609         layoutProperty->UpdateVisibility(VisibleType::VISIBLE);
610         auto divideNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(1));
611         CHECK_NULL_VOID(divideNode);
612         auto divideLayoutProperty = divideNode->GetLayoutProperty<LayoutProperty>();
613         CHECK_NULL_VOID(divideLayoutProperty);
614         divideLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
615         auto nextButton = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(NEXT_BUTTON_INDEX));
616         CHECK_NULL_VOID(nextButton);
617         auto nextButtonLayoutProperty = nextButton->GetLayoutProperty<LayoutProperty>();
618         CHECK_NULL_VOID(nextButtonLayoutProperty);
619         nextButtonLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
620         auto textNextPrevNode = AceType::DynamicCast<FrameNode>(nextButton->GetFirstChild());
621         CHECK_NULL_VOID(textNextPrevNode);
622         auto textLayoutProperty = textNextPrevNode->GetLayoutProperty<TextLayoutProperty>();
623         CHECK_NULL_VOID(textLayoutProperty);
624         textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
625         textNextPrevNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
626     } else {
627         auto nextButton = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(NEXT_BUTTON_INDEX));
628         CHECK_NULL_VOID(nextButton);
629         auto layoutProperty = nextButton->GetLayoutProperty<LayoutProperty>();
630         CHECK_NULL_VOID(layoutProperty);
631         layoutProperty->UpdateVisibility(VisibleType::VISIBLE);
632         auto divideNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(DIVIDER_ROWS_THREE));
633         CHECK_NULL_VOID(divideNode);
634         auto divideLayoutProperty = divideNode->GetLayoutProperty<LayoutProperty>();
635         CHECK_NULL_VOID(divideLayoutProperty);
636         divideLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
637         auto confirmButton = AceType::DynamicCast<FrameNode>(contentRow->GetLastChild());
638         CHECK_NULL_VOID(confirmButton);
639         auto confirmButtonLayoutProperty = confirmButton->GetLayoutProperty<LayoutProperty>();
640         CHECK_NULL_VOID(confirmButtonLayoutProperty);
641         confirmButtonLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
642     }
643 }
644 
CreateButtonNodeForAging(const DatePickerSettingData & settingData,const RefPtr<FrameNode> & timePickerNode,const RefPtr<FrameNode> & monthAndDayNode,const RefPtr<FrameNode> & datePickerNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)645 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNodeForAging(const DatePickerSettingData& settingData,
646     const RefPtr<FrameNode>& timePickerNode, const RefPtr<FrameNode>& monthAndDayNode,
647     const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos,
648     std::map<std::string, NG::DialogEvent> dialogEvent,
649     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
650 {
651     auto acceptEvent = dialogEvent["acceptId"];
652     auto dateAcceptEvent = dialogEvent["dateAcceptId"];
653     auto cancelEvent = dialogCancelEvent["cancelId"];
654     auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
655         AceType::MakeRefPtr<LinearLayoutPattern>(false));
656     CHECK_NULL_RETURN(contentRow, nullptr);
657     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
658     CHECK_NULL_RETURN(layoutProps, nullptr);
659     layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
660     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
661     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
662         MarginProperty margin;
663         margin.top = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON);
664         layoutProps->UpdateMargin(margin);
665     }
666 
667     contentRow->SetNeedCallChildrenUpdate(false);
668     SetDialogDateAcceptEvent(monthAndDayNode, std::move(dateAcceptEvent));
669 
670     auto buttonCancelNode = CreateCancelNode(cancelEvent, datePickerNode, buttonInfos);
671     CHECK_NULL_RETURN(buttonCancelNode, nullptr);
672     auto buttonConfirmNode = CreateConfirmNode(monthAndDayNode, datePickerNode, acceptEvent, buttonInfos);
673     CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
674     auto cancelNextDividerNode = CreateDividerNode(datePickerNode, true);
675     CHECK_NULL_RETURN(cancelNextDividerNode, nullptr);
676     auto nextConfirmDividerNode = CreateDividerNode(datePickerNode, true);
677     CHECK_NULL_RETURN(nextConfirmDividerNode, nullptr);
678 
679     buttonCancelNode->MountToParent(contentRow);
680     buttonConfirmNode->MountToParent(contentRow);
681 
682     RefPtr<FrameNode> buttonNextPreNode = nullptr;
683 
684     auto timePickerSwitchEvent =
685         CreateAndSetTimePickerSwitchEvent(monthAndDayNode, timePickerNode, contentRow);
686     buttonNextPreNode = CreateNextPrevButtonNode(
687         timePickerSwitchEvent, datePickerNode, buttonInfos, contentRow);
688     CHECK_NULL_RETURN(buttonNextPreNode, nullptr);
689     contentRow->AddChild(buttonNextPreNode, 1);
690     contentRow->AddChild(cancelNextDividerNode, 1);
691     contentRow->AddChild(nextConfirmDividerNode, DIVIDER_ROWS_THREE);
692 
693     auto layoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
694     CHECK_NULL_RETURN(layoutProperty, nullptr);
695     layoutProperty->UpdateVisibility(VisibleType::GONE);
696     auto nextConfirmDividerProperty = nextConfirmDividerNode->GetLayoutProperty<LayoutProperty>();
697     CHECK_NULL_RETURN(nextConfirmDividerProperty, nullptr);
698     nextConfirmDividerProperty->UpdateVisibility(VisibleType::GONE);
699 
700     auto datePickerPattern = monthAndDayNode->GetPattern<DatePickerPattern>();
701     datePickerPattern->SetContentRowNode(contentRow);
702 
703     return contentRow;
704 }
705 
CreateConfirmNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,DialogEvent & acceptEvent,const std::vector<ButtonInfo> & buttonInfos)706 RefPtr<FrameNode> DatePickerDialogView::CreateConfirmNode(const RefPtr<FrameNode>& dateNode,
707     const RefPtr<FrameNode>& datePickerNode, DialogEvent& acceptEvent, const std::vector<ButtonInfo>& buttonInfos)
708 {
709     auto pipeline = PipelineContext::GetCurrentContext();
710     CHECK_NULL_RETURN(pipeline, nullptr);
711     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
712     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
713 
714     auto buttonConfirmNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
715         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
716     auto textConfirmNode = FrameNode::CreateFrameNode(
717         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
718     CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
719     CHECK_NULL_RETURN(textConfirmNode, nullptr);
720     auto textLayoutProperty = textConfirmNode->GetLayoutProperty<TextLayoutProperty>();
721     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
722     UpdateConfirmButtonTextLayoutProperty(textLayoutProperty, pickerTheme);
723     auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
724     datePickerPattern->SetConfirmNode(buttonConfirmNode);
725     auto buttonConfirmEventHub = buttonConfirmNode->GetEventHub<ButtonEventHub>();
726     CHECK_NULL_RETURN(buttonConfirmEventHub, nullptr);
727     buttonConfirmEventHub->SetStateEffect(true);
728 
729     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
730     CHECK_NULL_RETURN(buttonConfirmLayoutProperty, nullptr);
731     UpdateButtonLayoutProperty(buttonConfirmLayoutProperty, pickerTheme);
732     auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext();
733     buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
734     UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext);
735     UpdateButtonDefaultFocus(buttonInfos, buttonConfirmNode, true);
736     textConfirmNode->MountToParent(buttonConfirmNode);
737     auto eventConfirmHub = buttonConfirmNode->GetOrCreateGestureEventHub();
738     CHECK_NULL_RETURN(eventConfirmHub, nullptr);
739     CHECK_NULL_RETURN(dateNode, nullptr);
740     SetDialogAcceptEvent(dateNode, std::move(acceptEvent));
741     auto clickCallback = [weak = WeakPtr<FrameNode>(dateNode)](const GestureEvent& /* info */) {
742         auto dateNode = weak.Upgrade();
743         CHECK_NULL_VOID(dateNode);
744         auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
745         CHECK_NULL_VOID(pickerPattern);
746         auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
747         CHECK_NULL_VOID(datePickerEventHub);
748         datePickerEventHub->FireDialogAcceptEvent(pickerPattern->GetSelectedObject(true));
749     };
750     eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
751     buttonConfirmNode->MarkModifyDone();
752     return buttonConfirmNode;
753 }
754 
UpdateConfirmButtonTextLayoutProperty(const RefPtr<TextLayoutProperty> & textLayoutProperty,const RefPtr<PickerTheme> & pickerTheme)755 void DatePickerDialogView::UpdateConfirmButtonTextLayoutProperty(
756     const RefPtr<TextLayoutProperty>& textLayoutProperty, const RefPtr<PickerTheme>& pickerTheme)
757 {
758     CHECK_NULL_VOID(textLayoutProperty);
759     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.ok"));
760     textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
761     if (!NeedAdaptForAging()) {
762         textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
763     }
764     textLayoutProperty->UpdateFontSize(
765         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
766     textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
767 }
768 
UpdateCancelButtonTextLayoutProperty(const RefPtr<TextLayoutProperty> & textCancelLayoutProperty,const RefPtr<PickerTheme> & pickerTheme)769 void DatePickerDialogView::UpdateCancelButtonTextLayoutProperty(
770     const RefPtr<TextLayoutProperty>& textCancelLayoutProperty, const RefPtr<PickerTheme>& pickerTheme)
771 {
772     CHECK_NULL_VOID(textCancelLayoutProperty);
773     textCancelLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.cancel"));
774     textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
775     if (!NeedAdaptForAging()) {
776         textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
777     }
778     textCancelLayoutProperty->UpdateFontSize(pickerTheme->GetOptionStyle(false, false).GetFontSize());
779     textCancelLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
780 }
781 
UpdateButtonLayoutProperty(const RefPtr<ButtonLayoutProperty> & buttonConfirmLayoutProperty,const RefPtr<PickerTheme> & pickerTheme)782 void DatePickerDialogView::UpdateButtonLayoutProperty(
783     const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<PickerTheme>& pickerTheme)
784 {
785     CHECK_NULL_VOID(buttonConfirmLayoutProperty);
786     buttonConfirmLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.ok"));
787     buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
788     buttonConfirmLayoutProperty->UpdateType(ButtonType::CAPSULE);
789     buttonConfirmLayoutProperty->UpdateFlexShrink(1.0);
790     auto pipeline = PipelineBase::GetCurrentContext();
791     CHECK_NULL_VOID(pipeline);
792     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
793     CHECK_NULL_VOID(dialogTheme);
794     UpdateConfirmButtonMargin(buttonConfirmLayoutProperty, dialogTheme);
795     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
796         buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
797             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
798     } else {
799         auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
800         CHECK_NULL_VOID(buttonTheme);
801         buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
802             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
803     }
804 }
805 
UpdateConfirmButtonMargin(const RefPtr<ButtonLayoutProperty> & buttonConfirmLayoutProperty,const RefPtr<DialogTheme> & dialogTheme)806 void DatePickerDialogView::UpdateConfirmButtonMargin(
807     const RefPtr<ButtonLayoutProperty>& buttonConfirmLayoutProperty, const RefPtr<DialogTheme>& dialogTheme)
808 {
809     MarginProperty margin;
810     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
811         margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
812         margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
813         margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
814         margin.left = CalcLength(0.0_vp);
815     } else {
816         margin.right = CalcLength(TITLE_PADDING_HORIZONTAL);
817         margin.top = CalcLength(TITLE_PADDING_HORIZONTAL);
818         margin.bottom = CalcLength(TITLE_PADDING_HORIZONTAL);
819         margin.left = CalcLength(0.0_vp);
820     }
821     buttonConfirmLayoutProperty->UpdateMargin(margin);
822 }
823 
UpdateCancelButtonMargin(const RefPtr<ButtonLayoutProperty> & buttonCancelLayoutProperty,const RefPtr<DialogTheme> & dialogTheme)824 void DatePickerDialogView::UpdateCancelButtonMargin(
825     const RefPtr<ButtonLayoutProperty>& buttonCancelLayoutProperty, const RefPtr<DialogTheme>& dialogTheme)
826 {
827     MarginProperty margin;
828     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
829         margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
830         margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
831         margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
832         margin.right = CalcLength(0.0_vp);
833     } else {
834         margin.left = CalcLength(TITLE_PADDING_HORIZONTAL);
835         margin.top = CalcLength(TITLE_PADDING_HORIZONTAL);
836         margin.bottom = CalcLength(TITLE_PADDING_HORIZONTAL);
837         margin.right = CalcLength(0.0_vp);
838     }
839     buttonCancelLayoutProperty->UpdateMargin(margin);
840 }
841 
UpdateNextButtonMargin(const RefPtr<ButtonLayoutProperty> & buttonNextLayoutProperty)842 void DatePickerDialogView::UpdateNextButtonMargin(const RefPtr<ButtonLayoutProperty>& buttonNextLayoutProperty)
843 {
844     auto pipeline = PipelineContext::GetCurrentContextSafely();
845     CHECK_NULL_VOID(pipeline);
846     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
847     CHECK_NULL_VOID(dialogTheme);
848     MarginProperty margin;
849     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
850         margin.right = CalcLength(dialogTheme->GetDividerPadding().Left());
851         margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
852         margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
853         margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
854     } else {
855         margin.right = CalcLength(TITLE_PADDING_HORIZONTAL);
856         margin.left = CalcLength(TITLE_PADDING_HORIZONTAL);
857         margin.top = CalcLength(TITLE_PADDING_HORIZONTAL);
858         margin.bottom = CalcLength(TITLE_PADDING_HORIZONTAL);
859     }
860     buttonNextLayoutProperty->UpdateMargin(margin);
861 }
862 
UpdateButtonStyles(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext)863 void DatePickerDialogView::UpdateButtonStyles(const std::vector<ButtonInfo>& buttonInfos, size_t index,
864     const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext)
865 {
866     if (index >= buttonInfos.size()) {
867         return;
868     }
869     CHECK_NULL_VOID(buttonLayoutProperty);
870     CHECK_NULL_VOID(buttonRenderContext);
871     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
872     CHECK_NULL_VOID(pipeline);
873     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
874     CHECK_NULL_VOID(buttonTheme);
875     if (buttonInfos[index].type.has_value()) {
876         buttonLayoutProperty->UpdateType(buttonInfos[index].type.value());
877     }
878     UpdateButtonStyleAndRole(buttonInfos, index, buttonLayoutProperty, buttonRenderContext, buttonTheme);
879     if (buttonInfos[index].fontSize.has_value()) {
880         buttonLayoutProperty->UpdateFontSize(ConvertFontScaleValue(buttonInfos[index].fontSize.value()));
881     }
882     if (buttonInfos[index].fontColor.has_value()) {
883         buttonLayoutProperty->UpdateFontColor(buttonInfos[index].fontColor.value());
884     }
885     if (buttonInfos[index].fontWeight.has_value()) {
886         buttonLayoutProperty->UpdateFontWeight(buttonInfos[index].fontWeight.value());
887     }
888     if (buttonInfos[index].fontStyle.has_value()) {
889         buttonLayoutProperty->UpdateFontStyle(buttonInfos[index].fontStyle.value());
890     }
891     if (buttonInfos[index].fontFamily.has_value()) {
892         buttonLayoutProperty->UpdateFontFamily(buttonInfos[index].fontFamily.value());
893     }
894     if (buttonInfos[index].borderRadius.has_value()) {
895         buttonLayoutProperty->UpdateBorderRadius(buttonInfos[index].borderRadius.value());
896     }
897     if (buttonInfos[index].backgroundColor.has_value()) {
898         buttonRenderContext->UpdateBackgroundColor(buttonInfos[index].backgroundColor.value());
899     }
900 }
901 
UpdateButtonStyleAndRole(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext,const RefPtr<ButtonTheme> & buttonTheme)902 void DatePickerDialogView::UpdateButtonStyleAndRole(const std::vector<ButtonInfo>& buttonInfos, size_t index,
903     const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext,
904     const RefPtr<ButtonTheme>& buttonTheme)
905 {
906     if (index >= buttonInfos.size()) {
907         return;
908     }
909     CHECK_NULL_VOID(buttonLayoutProperty);
910     CHECK_NULL_VOID(buttonRenderContext);
911     CHECK_NULL_VOID(buttonTheme);
912     if (buttonInfos[index].role.has_value()) {
913         buttonLayoutProperty->UpdateButtonRole(buttonInfos[index].role.value());
914         ButtonStyleMode buttonStyleMode;
915         if (buttonInfos[index].buttonStyle.has_value()) {
916             buttonStyleMode = buttonInfos[index].buttonStyle.value();
917         } else {
918             buttonStyleMode = buttonLayoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
919         }
920         auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonInfos[index].role.value());
921         auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonInfos[index].role.value());
922         buttonRenderContext->UpdateBackgroundColor(bgColor);
923         buttonLayoutProperty->UpdateFontColor(textColor);
924     }
925     if (buttonInfos[index].buttonStyle.has_value()) {
926         buttonLayoutProperty->UpdateButtonStyle(buttonInfos[index].buttonStyle.value());
927         ButtonRole buttonRole = buttonLayoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
928         auto bgColor = buttonTheme->GetBgColor(buttonInfos[index].buttonStyle.value(), buttonRole);
929         auto textColor = buttonTheme->GetTextColor(buttonInfos[index].buttonStyle.value(), buttonRole);
930         buttonRenderContext->UpdateBackgroundColor(bgColor);
931         buttonLayoutProperty->UpdateFontColor(textColor);
932     }
933 }
934 
CreateDateNode(int32_t dateNodeId,std::map<std::string,PickerDate> datePickerProperty,const PickerTextProperties & properties,bool isLunar,bool showTime)935 RefPtr<FrameNode> DatePickerDialogView::CreateDateNode(int32_t dateNodeId,
936     std::map<std::string, PickerDate> datePickerProperty, const PickerTextProperties& properties, bool isLunar,
937     bool showTime)
938 {
939     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::DATE_PICKER_ETS_TAG, dateNodeId);
940     auto dateNode = FrameNode::GetOrCreateFrameNode(
941         V2::DATE_PICKER_ETS_TAG, dateNodeId, []() { return AceType::MakeRefPtr<DatePickerPattern>(); });
942     CHECK_NULL_RETURN(dateNode, nullptr);
943     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
944     CHECK_NULL_RETURN(datePickerPattern, nullptr);
945 
946     auto pipeline = PipelineBase::GetCurrentContext();
947     CHECK_NULL_RETURN(pipeline, nullptr);
948     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
949     CHECK_NULL_RETURN(dialogTheme, nullptr);
950     datePickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
951     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
952     CHECK_NULL_RETURN(pickerTheme, nullptr);
953     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
954     datePickerPattern->SetShowCount(showCount);
955     datePickerPattern->SetIsShowInDialog(true);
956     if (showTime) {
957         CreateSingleDateNode(dateNode, showCount);
958     } else {
959         CreateNormalDateNode(dateNode, showCount);
960     }
961 
962     PickerDate parseStartDate;
963     PickerDate parseEndDate;
964     PickerDate parseSelectedDate;
965     SetShowLunar(dateNode, isLunar);
966     SetDateTextProperties(dateNode, properties);
967     auto iterStart = datePickerProperty.find("start");
968     if (iterStart != datePickerProperty.end()) {
969         parseStartDate = iterStart->second;
970         SetStartDate(dateNode, parseStartDate);
971     }
972     auto iterEnd = datePickerProperty.find("end");
973     if (iterEnd != datePickerProperty.end()) {
974         parseEndDate = iterEnd->second;
975         SetEndDate(dateNode, parseEndDate);
976     }
977     auto iterSelected = datePickerProperty.find("selected");
978     if (iterSelected != datePickerProperty.end()) {
979         parseSelectedDate = iterSelected->second;
980         SetSelectedDate(dateNode, parseSelectedDate);
981     }
982     return dateNode;
983 }
984 
CreateColumnNode(int32_t nodeId,uint32_t showCount,bool isDate)985 RefPtr<FrameNode> DatePickerDialogView::CreateColumnNode(int32_t nodeId, uint32_t showCount, bool isDate)
986 {
987     RefPtr<FrameNode> columnNode;
988     if (isDate) {
989         columnNode = FrameNode::GetOrCreateFrameNode(
990             V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<DatePickerColumnPattern>(); });
991     } else {
992         columnNode = FrameNode::GetOrCreateFrameNode(
993             V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
994     }
995     CHECK_NULL_RETURN(columnNode, nullptr);
996     columnNode->Clean();
997     for (uint32_t index = 0; index < showCount; index++) {
998         auto textNode = FrameNode::CreateFrameNode(
999             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1000         CHECK_NULL_RETURN(textNode, nullptr);
1001         textNode->MountToParent(columnNode);
1002     }
1003     columnNode->MarkModifyDone();
1004     return columnNode;
1005 }
1006 
CreateNormalDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)1007 void DatePickerDialogView::CreateNormalDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
1008 {
1009     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1010     CHECK_NULL_VOID(datePickerPattern);
1011     datePickerPattern->SetShowMonthDaysFlag(false);
1012 
1013     auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
1014     auto monthColumnNode = CreateColumnNode(datePickerPattern->GetMonthId(), showCount);
1015     auto dayColumnNode = CreateColumnNode(datePickerPattern->GetDayId(), showCount);
1016     CHECK_NULL_VOID(yearColumnNode);
1017     CHECK_NULL_VOID(monthColumnNode);
1018     CHECK_NULL_VOID(dayColumnNode);
1019     datePickerPattern->SetColumn(yearColumnNode);
1020     datePickerPattern->SetColumn(monthColumnNode);
1021     datePickerPattern->SetColumn(dayColumnNode);
1022 
1023     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1024         MountColumnNodeToPicker(yearColumnNode, dateNode, RATIO_THREE);
1025         MountColumnNodeToPicker(monthColumnNode, dateNode, RATIO_TWO);
1026         MountColumnNodeToPicker(dayColumnNode, dateNode, RATIO_TWO);
1027     } else {
1028         MountColumnNodeToPicker(yearColumnNode, dateNode);
1029         MountColumnNodeToPicker(monthColumnNode, dateNode);
1030         MountColumnNodeToPicker(dayColumnNode, dateNode);
1031     }
1032 }
1033 
CreateSingleDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)1034 void DatePickerDialogView::CreateSingleDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
1035 {
1036     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1037     CHECK_NULL_VOID(datePickerPattern);
1038     datePickerPattern->SetShowMonthDaysFlag(true);
1039 
1040     auto monthDaysColumnNode = CreateColumnNode(datePickerPattern->GetMonthDaysId(), showCount);
1041     auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
1042     CHECK_NULL_VOID(monthDaysColumnNode);
1043     CHECK_NULL_VOID(yearColumnNode);
1044     datePickerPattern->SetColumn(monthDaysColumnNode);
1045     datePickerPattern->SetColumn(yearColumnNode);
1046 
1047     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1048         MountColumnNodeToPicker(monthDaysColumnNode, dateNode, RATIO_FOUR);
1049     } else {
1050         MountColumnNodeToPicker(monthDaysColumnNode, dateNode);
1051     }
1052 
1053     {
1054         auto stackYearNode = CreateStackNode();
1055         auto blendYearNode = CreateColumnNode();
1056         auto buttonYearNode = CreateButtonNode();
1057         buttonYearNode->MountToParent(stackYearNode);
1058         yearColumnNode->MountToParent(blendYearNode);
1059         blendYearNode->MountToParent(stackYearNode);
1060         auto layoutProperty = stackYearNode->GetLayoutProperty<LayoutProperty>();
1061         layoutProperty->UpdateAlignment(Alignment::CENTER);
1062         if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1063             auto blendYearNodeLayoutProperty = blendYearNode->GetLayoutProperty<LayoutProperty>();
1064             CHECK_NULL_VOID(blendYearNodeLayoutProperty);
1065             blendYearNodeLayoutProperty->UpdateVisibility(VisibleType::GONE);
1066             auto buttonYearNodeLayoutProperty = buttonYearNode->GetLayoutProperty<LayoutProperty>();
1067             CHECK_NULL_VOID(buttonYearNodeLayoutProperty);
1068             buttonYearNodeLayoutProperty->UpdateVisibility(VisibleType::GONE);
1069         } else {
1070             layoutProperty->UpdateVisibility(VisibleType::GONE);
1071         }
1072         layoutProperty->UpdateLayoutWeight(0);
1073         stackYearNode->MountToParent(dateNode);
1074     }
1075 }
1076 
CreateTimeNode(std::map<std::string,PickerTime> timePickerProperty,const PickerTextProperties & properties,bool useMilitaryTime)1077 RefPtr<FrameNode> DatePickerDialogView::CreateTimeNode(
1078     std::map<std::string, PickerTime> timePickerProperty, const PickerTextProperties& properties, bool useMilitaryTime)
1079 {
1080     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
1081     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TIME_PICKER_ETS_TAG, nodeId);
1082     auto timePickerNode = FrameNode::GetOrCreateFrameNode(
1083         V2::TIME_PICKER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerRowPattern>(); });
1084     CHECK_NULL_RETURN(timePickerNode, nullptr);
1085     auto timePickerRowPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
1086     CHECK_NULL_RETURN(timePickerRowPattern, nullptr);
1087 
1088     auto pipeline = PipelineBase::GetCurrentContext();
1089     CHECK_NULL_RETURN(pipeline, nullptr);
1090     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1091     CHECK_NULL_RETURN(pickerTheme, nullptr);
1092     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
1093     timePickerRowPattern->SetShowCount(showCount);
1094     timePickerRowPattern->SetIsShowInDatePickerDialog(true);
1095 
1096     auto hasHourNode = timePickerRowPattern->HasHourNode();
1097     auto hasMinuteNode = timePickerRowPattern->HasMinuteNode();
1098 
1099     auto hourColumnNode = CreateColumnNode(timePickerRowPattern->GetHourId(), showCount, false);
1100     auto minuteColumnNode = CreateColumnNode(timePickerRowPattern->GetMinuteId(), showCount, false);
1101     CHECK_NULL_RETURN(hourColumnNode, nullptr);
1102     CHECK_NULL_RETURN(minuteColumnNode, nullptr);
1103     timePickerRowPattern->SetColumn(hourColumnNode);
1104     timePickerRowPattern->SetColumn(minuteColumnNode);
1105 
1106     if (!hasHourNode) {
1107         MountColumnNodeToPicker(hourColumnNode, timePickerNode);
1108     }
1109     if (!hasMinuteNode) {
1110         MountColumnNodeToPicker(minuteColumnNode, timePickerNode);
1111     }
1112     auto it = timePickerProperty.find("selected");
1113     if (it != timePickerProperty.end()) {
1114         auto selectedTime = it->second;
1115         timePickerRowPattern->SetSelectedTime(selectedTime);
1116     }
1117     timePickerRowPattern->SetHour24(useMilitaryTime);
1118 
1119     SetTimeTextProperties(timePickerNode, properties);
1120     return timePickerNode;
1121 }
1122 
MountColumnNodeToPicker(const RefPtr<FrameNode> & columnNode,const RefPtr<FrameNode> & pickerNode,uint32_t columnWeight)1123 void DatePickerDialogView::MountColumnNodeToPicker(
1124     const RefPtr<FrameNode>& columnNode, const RefPtr<FrameNode>& pickerNode, uint32_t columnWeight)
1125 {
1126     auto stackNode = CreateStackNode();
1127     auto blendNode = CreateColumnNode();
1128     auto buttonNode = CreateButtonNode();
1129     buttonNode->MountToParent(stackNode);
1130     columnNode->MountToParent(blendNode);
1131     blendNode->MountToParent(stackNode);
1132     auto layoutProperty = stackNode->GetLayoutProperty<LayoutProperty>();
1133     layoutProperty->UpdateAlignment(Alignment::CENTER);
1134     layoutProperty->UpdateLayoutWeight(columnWeight);
1135     stackNode->MountToParent(pickerNode);
1136 }
1137 
CreateCancelNode(NG::DialogGestureEvent & cancelEvent,const RefPtr<FrameNode> & datePickerNode,const std::vector<ButtonInfo> & buttonInfos)1138 RefPtr<FrameNode> DatePickerDialogView::CreateCancelNode(NG::DialogGestureEvent& cancelEvent,
1139     const RefPtr<FrameNode>& datePickerNode, const std::vector<ButtonInfo>& buttonInfos)
1140 {
1141     auto pipeline = PipelineContext::GetCurrentContext();
1142     CHECK_NULL_RETURN(pipeline, nullptr);
1143     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
1144     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
1145     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1146     auto buttonCancelNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1147         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1148     CHECK_NULL_RETURN(buttonCancelNode, nullptr);
1149     auto textCancelNode = FrameNode::CreateFrameNode(
1150         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1151     CHECK_NULL_RETURN(textCancelNode, nullptr);
1152     auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
1153     CHECK_NULL_RETURN(textCancelLayoutProperty, nullptr);
1154     UpdateCancelButtonTextLayoutProperty(textCancelLayoutProperty, pickerTheme);
1155     auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
1156     datePickerPattern->SetCancelNode(buttonCancelNode);
1157     textCancelNode->MountToParent(buttonCancelNode);
1158     auto eventCancelHub = buttonCancelNode->GetOrCreateGestureEventHub();
1159     CHECK_NULL_RETURN(eventCancelHub, nullptr);
1160     eventCancelHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(cancelEvent)));
1161 
1162     auto buttonCancelEventHub = buttonCancelNode->GetEventHub<ButtonEventHub>();
1163     CHECK_NULL_RETURN(buttonCancelEventHub, nullptr);
1164     buttonCancelEventHub->SetStateEffect(true);
1165 
1166     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
1167     buttonCancelLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.cancel"));
1168     buttonCancelLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
1169     buttonCancelLayoutProperty->UpdateType(ButtonType::CAPSULE);
1170     buttonCancelLayoutProperty->UpdateFlexShrink(1.0);
1171     UpdateCancelButtonMargin(buttonCancelLayoutProperty, dialogTheme);
1172     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1173         buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
1174             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
1175     } else {
1176         buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
1177             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
1178     }
1179 
1180     auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext();
1181     buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1182     UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext);
1183     UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false);
1184     buttonCancelNode->MarkModifyDone();
1185     return buttonCancelNode;
1186 }
1187 
UpdateCheckboxPaintProperty(const RefPtr<CheckBoxPaintProperty> & checkboxPaintProps,bool isLunar,const CheckboxSettingData & checkboxSettingData)1188 void DatePickerDialogView::UpdateCheckboxPaintProperty(const RefPtr<CheckBoxPaintProperty>& checkboxPaintProps,
1189     bool isLunar, const CheckboxSettingData& checkboxSettingData)
1190 {
1191     checkboxPaintProps->UpdateCheckBoxSelect(isLunar);
1192     if (checkboxSettingData.selectedColor.has_value()) {
1193         checkboxPaintProps->UpdateCheckBoxSelectedColor(checkboxSettingData.selectedColor.value());
1194     }
1195     if (checkboxSettingData.unselectedColor.has_value()) {
1196         checkboxPaintProps->UpdateCheckBoxUnSelectedColor(checkboxSettingData.unselectedColor.value());
1197     }
1198     if (checkboxSettingData.strokeColor.has_value()) {
1199         checkboxPaintProps->UpdateCheckBoxCheckMarkColor(checkboxSettingData.strokeColor.value());
1200     }
1201 }
1202 
CreateLunarswitchNode(const RefPtr<FrameNode> & contentColumn,const RefPtr<FrameNode> & dateNode,std::function<void (const bool)> && changeEvent,bool isLunar,const CheckboxSettingData & checkboxSettingData)1203 void DatePickerDialogView::CreateLunarswitchNode(const RefPtr<FrameNode>& contentColumn,
1204     const RefPtr<FrameNode>& dateNode, std::function<void(const bool)>&& changeEvent, bool isLunar,
1205     const CheckboxSettingData& checkboxSettingData)
1206 {
1207     auto pipeline = PipelineBase::GetCurrentContext();
1208     CHECK_NULL_VOID(pipeline);
1209     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1210     CHECK_NULL_VOID(pickerTheme);
1211     auto contentRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
1212         AceType::MakeRefPtr<LinearLayoutPattern>(false));
1213     CHECK_NULL_VOID(contentRow);
1214     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
1215     CHECK_NULL_VOID(layoutProps);
1216     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1217         MarginProperty margin;
1218         margin.bottom = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON);
1219         layoutProps->UpdateMargin(margin);
1220     }
1221     layoutProps->UpdateUserDefinedIdealSize(
1222         CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(LUNARSWITCH_HEIGHT)));
1223 
1224     auto checkbox = FrameNode::CreateFrameNode(
1225         V2::CHECK_BOX_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<CheckBoxPattern>());
1226     CHECK_NULL_VOID(checkbox);
1227     auto eventHub = checkbox->GetEventHub<CheckBoxEventHub>();
1228     CHECK_NULL_VOID(eventHub);
1229     eventHub->SetOnChange(std::move(changeEvent));
1230     auto checkboxPaintProps = checkbox->GetPaintProperty<CheckBoxPaintProperty>();
1231     CHECK_NULL_VOID(checkboxPaintProps);
1232     UpdateCheckboxPaintProperty(checkboxPaintProps, isLunar, checkboxSettingData);
1233     auto checkboxPattern = checkbox->GetPattern<CheckBoxPattern>();
1234     checkboxPattern->SaveCheckboxSettingData(checkboxSettingData);
1235     auto checkboxLayoutProps = checkbox->GetLayoutProperty<LayoutProperty>();
1236     CHECK_NULL_VOID(checkboxLayoutProps);
1237     MarginProperty marginCheckbox;
1238     marginCheckbox.left = CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE);
1239     marginCheckbox.right = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON);
1240     checkboxLayoutProps->UpdateMargin(marginCheckbox);
1241     checkboxLayoutProps->UpdateUserDefinedIdealSize(CalcSize(CalcLength(CHECKBOX_SIZE), CalcLength(CHECKBOX_SIZE)));
1242     checkbox->MarkModifyDone();
1243     checkbox->MountToParent(contentRow);
1244 
1245     auto textNode = CreateLunarSwitchTextNode();
1246     CHECK_NULL_VOID(textNode);
1247     textNode->MountToParent(contentRow);
1248     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1249     CHECK_NULL_VOID(datePickerPattern);
1250     datePickerPattern->SetLunarSwitchTextNode(textNode);
1251 
1252     contentRow->MountToParent(contentColumn);
1253 }
1254 
SetStartDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)1255 void DatePickerDialogView::SetStartDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
1256 {
1257     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
1258     CHECK_NULL_VOID(datePickerPattern);
1259     datePickerPattern->SetStartDate(value);
1260     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
1261     CHECK_NULL_VOID(pickerProperty);
1262     pickerProperty->UpdateStartDate(datePickerPattern->GetStartDateLunar());
1263 }
1264 
SetEndDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)1265 void DatePickerDialogView::SetEndDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
1266 {
1267     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
1268     CHECK_NULL_VOID(datePickerPattern);
1269     datePickerPattern->SetEndDate(value);
1270     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
1271     CHECK_NULL_VOID(pickerProperty);
1272     pickerProperty->UpdateEndDate(datePickerPattern->GetEndDateLunar());
1273 }
1274 
SetSelectedDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)1275 void DatePickerDialogView::SetSelectedDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
1276 {
1277     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
1278     CHECK_NULL_VOID(datePickerPattern);
1279     datePickerPattern->SetSelectDate(value);
1280     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
1281     CHECK_NULL_VOID(pickerProperty);
1282     pickerProperty->UpdateSelectedDate(datePickerPattern->GetSelectDate());
1283 }
1284 
SetShowLunar(const RefPtr<FrameNode> & frameNode,bool lunar)1285 void DatePickerDialogView::SetShowLunar(const RefPtr<FrameNode>& frameNode, bool lunar)
1286 {
1287     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
1288     CHECK_NULL_VOID(pickerProperty);
1289     pickerProperty->UpdateLunar(lunar);
1290 }
1291 
SetDialogChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)1292 void DatePickerDialogView::SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
1293 {
1294     CHECK_NULL_VOID(frameNode);
1295     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
1296     CHECK_NULL_VOID(eventHub);
1297     eventHub->SetDialogChange(std::move(onChange));
1298 }
1299 
SetDialogDateChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)1300 void DatePickerDialogView::SetDialogDateChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
1301 {
1302     CHECK_NULL_VOID(frameNode);
1303     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
1304     CHECK_NULL_VOID(eventHub);
1305     eventHub->SetDialogDateChange(std::move(onChange));
1306 }
1307 
SetDialogAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)1308 void DatePickerDialogView::SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
1309 {
1310     CHECK_NULL_VOID(frameNode);
1311     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
1312     CHECK_NULL_VOID(eventHub);
1313     eventHub->SetDialogAcceptEvent(std::move(onChange));
1314 }
1315 
SetDialogDateAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)1316 void DatePickerDialogView::SetDialogDateAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
1317 {
1318     CHECK_NULL_VOID(frameNode);
1319     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
1320     CHECK_NULL_VOID(eventHub);
1321     eventHub->SetDialogDateAcceptEvent(std::move(onChange));
1322 }
1323 
SetDialogSwitchEvent(std::function<bool ()> switchEvent,const RefPtr<FrameNode> & pickerStack)1324 void DatePickerDialogView::SetDialogSwitchEvent(std::function<bool()> switchEvent, const RefPtr<FrameNode>& pickerStack)
1325 {
1326     CHECK_NULL_VOID(pickerStack);
1327     auto pipeline = pickerStack->GetContext();
1328     CHECK_NULL_VOID(pipeline);
1329     auto overlayManger = pipeline->GetOverlayManager();
1330     CHECK_NULL_VOID(overlayManger);
1331     overlayManger->SetBackPressEvent(switchEvent);
1332 }
1333 
SetDateTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)1334 void DatePickerDialogView::SetDateTextProperties(
1335     const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
1336 {
1337     auto pipeline = PipelineContext::GetCurrentContext();
1338     CHECK_NULL_VOID(pipeline);
1339     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1340     CHECK_NULL_VOID(pickerTheme);
1341     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
1342     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
1343     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
1344     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
1345     CHECK_NULL_VOID(pickerProperty);
1346 
1347     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
1348         pickerProperty->UpdateDisappearFontSize(
1349             ConvertFontScaleValue(properties.disappearTextStyle_.fontSize.value(), disappearTextStyleFont_, true));
1350     } else {
1351         pickerProperty->UpdateDisappearFontSize(ConvertFontScaleValue(disappearStyle.GetFontSize()));
1352     }
1353     pickerProperty->UpdateDisappearColor(
1354         properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
1355     pickerProperty->UpdateDisappearWeight(
1356         properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
1357     pickerProperty->UpdateDisappearFontFamily(
1358         properties.disappearTextStyle_.fontFamily.value_or(disappearStyle.GetFontFamilies()));
1359     pickerProperty->UpdateDisappearFontStyle(
1360         properties.disappearTextStyle_.fontStyle.value_or(disappearStyle.GetFontStyle()));
1361 
1362     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
1363         pickerProperty->UpdateFontSize(
1364             ConvertFontScaleValue(properties.normalTextStyle_.fontSize.value(), normalTextStyleFont_, true));
1365     } else {
1366         pickerProperty->UpdateFontSize(ConvertFontScaleValue(normalStyle.GetFontSize()));
1367     }
1368     pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
1369     pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
1370     pickerProperty->UpdateFontFamily(properties.normalTextStyle_.fontFamily.value_or(normalStyle.GetFontFamilies()));
1371     pickerProperty->UpdateFontStyle(properties.normalTextStyle_.fontStyle.value_or(normalStyle.GetFontStyle()));
1372 
1373     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
1374         pickerProperty->UpdateSelectedFontSize(
1375             ConvertFontScaleValue(properties.selectedTextStyle_.fontSize.value(), selectedTextStyleFont_, true));
1376     } else {
1377         pickerProperty->UpdateSelectedFontSize(ConvertFontScaleValue(selectedStyle.GetFontSize()));
1378     }
1379     pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
1380     pickerProperty->UpdateSelectedWeight(
1381         properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
1382     pickerProperty->UpdateSelectedFontFamily(
1383         properties.selectedTextStyle_.fontFamily.value_or(selectedStyle.GetFontFamilies()));
1384     pickerProperty->UpdateSelectedFontStyle(
1385         properties.selectedTextStyle_.fontStyle.value_or(selectedStyle.GetFontStyle()));
1386 }
1387 
SetTimeTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)1388 void DatePickerDialogView::SetTimeTextProperties(
1389     const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
1390 {
1391     auto pipeline = PipelineContext::GetCurrentContext();
1392     CHECK_NULL_VOID(pipeline);
1393     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1394     CHECK_NULL_VOID(pickerTheme);
1395     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
1396     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
1397     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
1398     auto pickerProperty = frameNode->GetLayoutProperty<TimePickerLayoutProperty>();
1399     CHECK_NULL_VOID(pickerProperty);
1400 
1401     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
1402         pickerProperty->UpdateDisappearFontSize(
1403             ConvertFontScaleValue(properties.disappearTextStyle_.fontSize.value(), disappearTextStyleFont_, true));
1404     } else {
1405         pickerProperty->UpdateDisappearFontSize(ConvertFontScaleValue(disappearStyle.GetFontSize()));
1406     }
1407     pickerProperty->UpdateDisappearColor(
1408         properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
1409     pickerProperty->UpdateDisappearWeight(
1410         properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
1411 
1412     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
1413         pickerProperty->UpdateFontSize(
1414             ConvertFontScaleValue(properties.normalTextStyle_.fontSize.value(), normalTextStyleFont_, true));
1415     } else {
1416         pickerProperty->UpdateFontSize(ConvertFontScaleValue(normalStyle.GetFontSize()));
1417     }
1418     pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
1419     pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
1420 
1421     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
1422         pickerProperty->UpdateSelectedFontSize(
1423             ConvertFontScaleValue(properties.selectedTextStyle_.fontSize.value(), selectedTextStyleFont_, true));
1424     } else {
1425         pickerProperty->UpdateSelectedFontSize(ConvertFontScaleValue(selectedStyle.GetFontSize()));
1426     }
1427     pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
1428     pickerProperty->UpdateSelectedWeight(
1429         properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
1430 }
1431 
SetTitleMouseHoverEvent(const RefPtr<FrameNode> & titleRow)1432 void DatePickerDialogView::SetTitleMouseHoverEvent(const RefPtr<FrameNode>& titleRow)
1433 {
1434     auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
1435     CHECK_NULL_VOID(titleButtonNode);
1436     auto eventHub = titleButtonNode->GetEventHub<EventHub>();
1437     CHECK_NULL_VOID(eventHub);
1438     auto inputHub = eventHub->GetOrCreateInputEventHub();
1439     auto mouseTask = [weak = WeakPtr<FrameNode>(titleButtonNode)](bool isHover) {
1440         auto titleButtonNode = weak.Upgrade();
1441         CHECK_NULL_VOID(titleButtonNode);
1442         HandleMouseEvent(titleButtonNode, isHover);
1443     };
1444     auto mouseEvent = AceType::MakeRefPtr<InputEvent>(std::move(mouseTask));
1445     CHECK_NULL_VOID(mouseEvent);
1446     inputHub->AddOnHoverEvent(mouseEvent);
1447 }
1448 
HandleMouseEvent(const RefPtr<FrameNode> & titleButton,bool isHover)1449 void DatePickerDialogView::HandleMouseEvent(const RefPtr<FrameNode>& titleButton, bool isHover)
1450 {
1451     if (isHover) {
1452         auto pipeline = PipelineBase::GetCurrentContext();
1453         CHECK_NULL_VOID(pipeline);
1454         auto theme = pipeline->GetTheme<PickerTheme>();
1455         CHECK_NULL_VOID(theme);
1456         PlayHoverAnimation(titleButton, theme->GetHoverColor());
1457     } else {
1458         PlayHoverAnimation(titleButton, Color::TRANSPARENT);
1459     }
1460 }
1461 
PlayHoverAnimation(const RefPtr<FrameNode> & titleButton,const Color & color)1462 void DatePickerDialogView::PlayHoverAnimation(const RefPtr<FrameNode>& titleButton, const Color& color)
1463 {
1464     AnimationOption option = AnimationOption();
1465     option.SetDuration(HOVER_ANIMATION_DURATION);
1466     option.SetCurve(Curves::FRICTION);
1467     option.SetFillMode(FillMode::FORWARDS);
1468     AnimationUtils::Animate(option, [weak = WeakPtr<FrameNode>(titleButton), color]() {
1469         auto titleButton = weak.Upgrade();
1470         auto buttonTitleNode = AceType::DynamicCast<FrameNode>(titleButton);
1471         CHECK_NULL_VOID(buttonTitleNode);
1472         auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
1473         buttonTitleRenderContext->UpdateBackgroundColor(color);
1474         buttonTitleNode->MarkDirtyNode();
1475     });
1476 }
1477 
CreateAndMountDateNode(const DatePickerSettingData & settingData,const RefPtr<FrameNode> & pickerStack)1478 RefPtr<FrameNode> DatePickerDialogView::CreateAndMountDateNode(
1479     const DatePickerSettingData& settingData, const RefPtr<FrameNode>& pickerStack)
1480 {
1481     auto dateNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1482     auto dateNode =
1483         CreateDateNode(dateNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, false);
1484     ViewStackProcessor::GetInstance()->Push(dateNode);
1485     dateNode->MountToParent(pickerStack);
1486     return dateNode;
1487 }
1488 
CreateAndMountButtonTitleNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & contentColumn)1489 RefPtr<FrameNode> DatePickerDialogView::CreateAndMountButtonTitleNode(
1490     const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& contentColumn)
1491 {
1492     // create title node and bind title text id to date picker, then mark picker node modify done
1493     auto buttonTitleNode = CreateTitleButtonNode(dateNode);
1494     CHECK_NULL_RETURN(buttonTitleNode, nullptr);
1495 
1496     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1497     datePickerPattern->SetbuttonTitleNode(buttonTitleNode);
1498 
1499     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1500         auto layoutProps = buttonTitleNode->GetLayoutProperty<LinearLayoutProperty>();
1501         CHECK_NULL_RETURN(layoutProps, nullptr);
1502         PaddingProperty padding;
1503         padding.left = CalcLength(TITLE_PADDING_HORIZONTAL);
1504         padding.right = CalcLength(TITLE_PADDING_HORIZONTAL);
1505         layoutProps->UpdatePadding(padding);
1506         MarginProperty margin;
1507         margin.top = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON);
1508         margin.bottom = CalcLength(PICKER_MARGIN_FROM_TITLE_AND_BUTTON);
1509         layoutProps->UpdateMargin(margin);
1510         layoutProps->UpdateUserDefinedIdealSize(
1511             CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(TITLE_HEIGHT)));
1512     }
1513 
1514     buttonTitleNode->MountToParent(contentColumn);
1515     return buttonTitleNode;
1516 }
1517 
CreateLunarChangeEvent(const RefPtr<FrameNode> & dateNode)1518 std::function<void(bool)> DatePickerDialogView::CreateLunarChangeEvent(const RefPtr<FrameNode>& dateNode)
1519 {
1520     return [weak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
1521         auto datePicker = weak.Upgrade();
1522         CHECK_NULL_VOID(datePicker);
1523         auto datePickerPattern = datePicker->GetPattern<DatePickerPattern>();
1524         CHECK_NULL_VOID(datePickerPattern);
1525         SetSelectedDate(datePicker, datePickerPattern->GetCurrentDate());
1526         auto layoutProp = datePicker->GetLayoutProperty<DataPickerRowLayoutProperty>();
1527         CHECK_NULL_VOID(layoutProp);
1528         layoutProp->UpdateLunar(selected);
1529         datePicker->MarkModifyDone();
1530     };
1531 }
1532 
CreateAndMountMonthDaysNode(const DatePickerSettingData & settingData,const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & pickerRow,std::function<void (bool)> && lunarChangeEvent)1533 RefPtr<FrameNode> DatePickerDialogView::CreateAndMountMonthDaysNode(const DatePickerSettingData& settingData,
1534     const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& pickerRow, std::function<void(bool)>&& lunarChangeEvent)
1535 {
1536     auto layoutProperty = dateNode->GetLayoutProperty<LayoutProperty>();
1537     CHECK_NULL_RETURN(layoutProperty, nullptr);
1538     layoutProperty->UpdateVisibility(VisibleType::INVISIBLE);
1539     auto monthDaysNodeId = ElementRegister::GetInstance()->MakeUniqueId();
1540     auto monthDaysNode = CreateDateNode(
1541         monthDaysNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, true);
1542     lunarChangeEvent = [monthDaysNodeWeak = AceType::WeakClaim(AceType::RawPtr(monthDaysNode)),
1543                            dateNodeWeak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
1544         auto monthDaysNode = monthDaysNodeWeak.Upgrade();
1545         auto dateNode = dateNodeWeak.Upgrade();
1546         CHECK_NULL_VOID(monthDaysNode);
1547         CHECK_NULL_VOID(dateNode);
1548         auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1549         CHECK_NULL_VOID(datePickerPattern);
1550         auto monthDaysPattern = monthDaysNode->GetPattern<DatePickerPattern>();
1551         CHECK_NULL_VOID(monthDaysPattern);
1552         PickerDate selectedDate =
1553             switchFlag_ ? datePickerPattern->GetCurrentDate() : monthDaysPattern->GetCurrentDate();
1554         SetSelectedDate(dateNode, selectedDate);
1555         SetSelectedDate(monthDaysNode, selectedDate);
1556         SetShowLunar(monthDaysNode, selected);
1557         SetShowLunar(dateNode, selected);
1558         monthDaysNode->MarkModifyDone();
1559         dateNode->MarkModifyDone();
1560     };
1561     auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
1562     CHECK_NULL_RETURN(monthDaysPickerPattern, nullptr);
1563     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
1564     CHECK_NULL_RETURN(pickerPattern, nullptr);
1565     monthDaysPickerPattern->SetTitleId(pickerPattern->GetTitleId());
1566     monthDaysPickerPattern->SetShowTimeFlag(true);
1567     monthDaysPickerPattern->SetTextProperties(settingData.properties);
1568     pickerPattern->SetShowTimeFlag(true);
1569     auto monthDaysLayoutProperty = monthDaysNode->GetLayoutProperty();
1570     CHECK_NULL_RETURN(monthDaysLayoutProperty, nullptr);
1571     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1572         monthDaysLayoutProperty->UpdateLayoutWeight(settingData.useMilitary ? RATIO_THREE : RATIO_FOUR);
1573     } else {
1574         monthDaysLayoutProperty->UpdateUserDefinedIdealSize(
1575             CalcSize(NG::CalcLength(
1576                 Dimension(settingData.useMilitary ? MONTHDAYS_WIDTH_PERCENT_ONE : MONTHDAYS_WIDTH_PERCENT_TWO,
1577                 DimensionUnit::PERCENT)), std::nullopt));
1578     }
1579     monthDaysNode->MarkModifyDone();
1580     monthDaysNode->MountToParent(pickerRow);
1581     return monthDaysNode;
1582 }
1583 
CreateAndMountTimeNode(const DatePickerSettingData & settingData,const RefPtr<FrameNode> & monthDaysNode,const RefPtr<FrameNode> & pickerRow)1584 RefPtr<FrameNode> DatePickerDialogView::CreateAndMountTimeNode(const DatePickerSettingData& settingData,
1585     const RefPtr<FrameNode>& monthDaysNode, const RefPtr<FrameNode>& pickerRow)
1586 {
1587     auto timeNode = CreateTimeNode(settingData.timePickerProperty, settingData.properties, settingData.useMilitary);
1588     auto timePickerEventHub = timeNode->GetEventHub<TimePickerEventHub>();
1589     CHECK_NULL_RETURN(timePickerEventHub, nullptr);
1590     auto timePickerRowPattern = timeNode->GetPattern<TimePickerRowPattern>();
1591     CHECK_NULL_RETURN(timePickerRowPattern, nullptr);
1592     timePickerRowPattern->SetTextProperties(settingData.properties);
1593     timePickerRowPattern->SetShowLunarSwitch(settingData.lunarswitch);
1594     auto timePickerLayout = timeNode->GetLayoutProperty<TimePickerLayoutProperty>();
1595     CHECK_NULL_RETURN(timePickerLayout, nullptr);
1596     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1597         ZeroPrefixType hourOptions = settingData.dateTimeOptions.hourType;
1598         ZeroPrefixType minuteOptions = settingData.dateTimeOptions.minuteType;
1599         if ((timePickerRowPattern->GetPrefixHour() != hourOptions) ||
1600             (timePickerRowPattern->GetPrefixMinute() != minuteOptions)) {
1601             timePickerRowPattern->SetDateTimeOptionUpdate(true);
1602         }
1603         timePickerRowPattern->SetPrefixHour(hourOptions);
1604         timePickerRowPattern->SetPrefixMinute(minuteOptions);
1605         timePickerLayout->UpdatePrefixHour(static_cast<int32_t>(hourOptions));
1606         timePickerLayout->UpdatePrefixMinute(static_cast<int32_t>(minuteOptions));
1607     }
1608     auto onChangeCallback = [weak = WeakPtr<FrameNode>(monthDaysNode)]() {
1609         auto monthDaysNode = weak.Upgrade();
1610         CHECK_NULL_VOID(monthDaysNode);
1611         auto pickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
1612         CHECK_NULL_VOID(pickerPattern);
1613         auto str = pickerPattern->GetSelectedObject(true);
1614         auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
1615         CHECK_NULL_VOID(datePickerEventHub);
1616         datePickerEventHub->FireDialogChangeEvent(str);
1617     };
1618     timePickerEventHub->SetOnChangeForDatePicker(std::move(onChangeCallback));
1619     timeNode->MarkModifyDone();
1620     SetTimeNodeColumnWeight(timeNode, settingData);
1621     timeNode->MountToParent(pickerRow);
1622     if (NeedAdaptForAging()) {
1623         timePickerLayout->UpdateVisibility(VisibleType::GONE);
1624     }
1625     return timeNode;
1626 }
1627 
CreateAndSetDialogSwitchEvent(const RefPtr<FrameNode> & pickerStack,const RefPtr<FrameNode> & contentColumn,const DatePickerSettingData & settingData)1628 std::function<void()> DatePickerDialogView::CreateAndSetDialogSwitchEvent(const RefPtr<FrameNode>& pickerStack,
1629     const RefPtr<FrameNode>& contentColumn, const DatePickerSettingData& settingData)
1630 {
1631     RefPtr<DateTimeAnimationController> animationController = AceType::MakeRefPtr<DateTimeAnimationController>();
1632     auto titleSwitchEvent = [weakContentColumn = AceType::WeakClaim(AceType::RawPtr(contentColumn)),
1633                                 weakPickerStack = AceType::WeakClaim(AceType::RawPtr(pickerStack)),
1634                                 animationController,
1635                                 useMilitary = settingData.useMilitary]() {
1636         auto contentColumn = weakContentColumn.Upgrade();
1637         CHECK_NULL_VOID(contentColumn);
1638         auto pickerStack = weakPickerStack.Upgrade();
1639         CHECK_NULL_VOID(pickerStack);
1640         // switch picker page.
1641         SwitchPickerPage(pickerStack, contentColumn, animationController, useMilitary);
1642     };
1643     auto switchEvent = [func = titleSwitchEvent]() {
1644         if (switchFlag_) {
1645             func();
1646             return true;
1647         }
1648         return false;
1649     };
1650     SetDialogSwitchEvent(switchEvent, pickerStack);
1651     return titleSwitchEvent;
1652 }
1653 
SwitchPickerPage(const RefPtr<FrameNode> & pickerStack,const RefPtr<FrameNode> & contentColumn,const RefPtr<DateTimeAnimationController> & animationController,bool useMilitary)1654 void DatePickerDialogView::SwitchPickerPage(const RefPtr<FrameNode>& pickerStack,
1655     const RefPtr<FrameNode>& contentColumn, const RefPtr<DateTimeAnimationController>& animationController,
1656     bool useMilitary)
1657 {
1658     auto pickerRow = pickerStack->GetLastChild();
1659     CHECK_NULL_VOID(pickerRow);
1660     auto dateNode = AceType::DynamicCast<FrameNode>(pickerStack->GetChildAtIndex(0));
1661     CHECK_NULL_VOID(dateNode);
1662     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1663     CHECK_NULL_VOID(datePickerPattern);
1664     auto monthDaysNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(0));
1665     auto timeNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(1));
1666     CHECK_NULL_VOID(monthDaysNode);
1667     CHECK_NULL_VOID(timeNode);
1668     auto timePickerPattern = timeNode->GetPattern<TimePickerRowPattern>();
1669     CHECK_NULL_VOID(timePickerPattern);
1670     auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
1671     CHECK_NULL_VOID(monthDaysPickerPattern);
1672     PickerDate selectedDate =
1673         switchFlag_ ? datePickerPattern->GetCurrentDate() : monthDaysPickerPattern->GetCurrentDate();
1674     SetSelectedDate(switchFlag_ ? monthDaysNode : dateNode, selectedDate);
1675     animationController->SetDatePickerButtonHide(false);
1676     auto contentRow = AceType::DynamicCast<FrameNode>(contentColumn->GetLastChild());
1677     if (switchFlag_) {
1678         if (NeedAdaptForAging()) {
1679             switchTimePickerFlag_ = true;
1680             SwitchTimePickerPage(monthDaysNode, timeNode, contentRow);
1681         }
1682         datePickerPattern->SetFocusDisable();
1683         timePickerPattern->SetFocusDisable();
1684         monthDaysPickerPattern->SetFocusEnable();
1685         monthDaysNode->MarkModifyDone();
1686     } else {
1687         monthDaysPickerPattern->SetFocusDisable();
1688         timePickerPattern->SetFocusDisable();
1689         datePickerPattern->SetFocusEnable();
1690         if (NeedAdaptForAging()) {
1691             SwitchDatePickerPage(dateNode, true);
1692             animationController->SetDatePickerButtonHide(true);
1693         }
1694         dateNode->MarkModifyDone();
1695     }
1696     SwitchContentRowButton(contentRow, useMilitary);
1697     SetAnimationProperty(pickerStack, contentColumn, animationController);
1698     switchFlag_ = !switchFlag_;
1699     animationController->Play(switchFlag_);
1700 }
1701 
SetAnimationProperty(const RefPtr<FrameNode> & pickerStack,const RefPtr<FrameNode> & contentColumn,const RefPtr<DateTimeAnimationController> & animationController)1702 void DatePickerDialogView::SetAnimationProperty(const RefPtr<FrameNode>& pickerStack,
1703     const RefPtr<FrameNode>& contentColumn, const RefPtr<DateTimeAnimationController>& animationController)
1704 {
1705     auto pickerRow = pickerStack->GetLastChild();
1706     CHECK_NULL_VOID(pickerRow);
1707     auto dateNode = AceType::DynamicCast<FrameNode>(pickerStack->GetChildAtIndex(0));
1708     CHECK_NULL_VOID(dateNode);
1709     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1710     CHECK_NULL_VOID(datePickerPattern);
1711     auto monthDaysNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(0));
1712     auto timeNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(1));
1713     CHECK_NULL_VOID(monthDaysNode);
1714     CHECK_NULL_VOID(timeNode);
1715     auto titleRow = AceType::DynamicCast<FrameNode>(contentColumn->GetChildAtIndex(0));
1716     CHECK_NULL_VOID(titleRow);
1717     auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
1718     CHECK_NULL_VOID(titleButtonNode);
1719     auto titleButtonRowNode = AceType::DynamicCast<FrameNode>(titleButtonNode->GetFirstChild());
1720     CHECK_NULL_VOID(titleButtonRowNode);
1721     auto spinnerNode = AceType::DynamicCast<FrameNode>(titleButtonRowNode->GetLastChild());
1722     CHECK_NULL_VOID(spinnerNode);
1723     auto contentRow = AceType::DynamicCast<FrameNode>(contentColumn->GetLastChild());
1724     CHECK_NULL_VOID(contentRow);
1725     animationController->SetButtonIcon(spinnerNode);
1726     animationController->SetMonthDays(monthDaysNode);
1727     animationController->SetDatePicker(dateNode);
1728     animationController->SetTimePicker(timeNode);
1729     animationController->SetButtonRow(contentRow);
1730 }
1731 
CreateAndAddTitleClickEvent(std::function<void ()> & titleSwitchEvent,const RefPtr<FrameNode> & buttonTitleNode)1732 void DatePickerDialogView::CreateAndAddTitleClickEvent(
1733     std::function<void()>& titleSwitchEvent, const RefPtr<FrameNode>& buttonTitleNode)
1734 {
1735     auto titleClickEvent = [func = std::move(titleSwitchEvent)](const GestureEvent& /* info */) { func(); };
1736     auto titleButtonNode = AceType::DynamicCast<FrameNode>(buttonTitleNode->GetFirstChild());
1737     CHECK_NULL_VOID(titleButtonNode);
1738     auto titleEventHub = titleButtonNode->GetOrCreateGestureEventHub();
1739     auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(titleClickEvent));
1740     titleEventHub->AddClickEvent(onClick);
1741 }
1742 
BuildDialogAcceptAndCancelButton(const std::vector<ButtonInfo> & buttonInfos,const DatePickerSettingData & settingData,const RefPtr<FrameNode> & acceptNode,const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & dialogNode,const RefPtr<FrameNode> & contentColumn,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)1743 void DatePickerDialogView::BuildDialogAcceptAndCancelButton(const std::vector<ButtonInfo>& buttonInfos,
1744     const DatePickerSettingData& settingData, const RefPtr<FrameNode>& acceptNode, const RefPtr<FrameNode>& dateNode,
1745     const RefPtr<FrameNode>& dialogNode, const RefPtr<FrameNode>& contentColumn,
1746     std::map<std::string, NG::DialogEvent> dialogEvent, std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
1747 {
1748     auto changeEvent = dialogEvent["changeId"];
1749     auto dateChangeEvent = dialogEvent["dateChangeId"];
1750     if (settingData.showTime) {
1751         auto changeEventSame = changeEvent;
1752         auto dateChangeEventSame = dateChangeEvent;
1753         SetDialogChange(acceptNode, std::move(changeEventSame));
1754         SetDialogDateChange(acceptNode, std::move(dateChangeEventSame));
1755     }
1756     SetDialogChange(dateNode, std::move(changeEvent));
1757     SetDialogDateChange(dateNode, std::move(dateChangeEvent));
1758     auto contentRow = CreateButtonNode(acceptNode, dateNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent));
1759     CHECK_NULL_VOID(contentRow);
1760     auto closeDiaglogEvent = CloseDialogEvent(dateNode, dialogNode);
1761     auto event = [func = std::move(closeDiaglogEvent)](const GestureEvent& /* info */) {
1762         func();
1763     };
1764     for (const auto& child : contentRow->GetChildren()) {
1765         auto firstChild = AceType::DynamicCast<FrameNode>(child);
1766         auto gesturHub = firstChild->GetOrCreateGestureEventHub();
1767         auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(event);
1768         gesturHub->AddClickEvent(onClick);
1769     }
1770     contentRow->AddChild(CreateDividerNode(dateNode), 1);
1771     contentRow->MountToParent(contentColumn);
1772 }
1773 
CloseDialogEvent(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & dialogNode)1774 std::function<void()> DatePickerDialogView::CloseDialogEvent(const RefPtr<FrameNode>& dateNode,
1775     const RefPtr<FrameNode>& dialogNode)
1776 {
1777     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
1778     auto event = [weak = WeakPtr<FrameNode>(dialogNode),
1779         weakDatePickerPattern = WeakPtr<DatePickerPattern>(datePickerPattern)]() {
1780         auto dialogNode = weak.Upgrade();
1781         CHECK_NULL_VOID(dialogNode);
1782         auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
1783         CHECK_NULL_VOID(dialogPattern);
1784         dialogPattern->SetIsPickerDialog(false);
1785         auto datePickerPattern = weakDatePickerPattern.Upgrade();
1786         CHECK_NULL_VOID(datePickerPattern);
1787 
1788         if (datePickerPattern->GetIsShowInDialog()) {
1789             auto pipeline = dialogNode->GetContext();
1790             CHECK_NULL_VOID(pipeline);
1791             auto overlayManager = pipeline->GetOverlayManager();
1792             CHECK_NULL_VOID(overlayManager);
1793             overlayManager->CloseDialog(dialogNode);
1794             datePickerPattern->SetIsShowInDialog(false);
1795         }
1796     };
1797     datePickerPattern->updateFontConfigurationEvent(event);
1798     return event;
1799 }
1800 
BuildDialogAcceptAndCancelButtonForAging(const std::vector<ButtonInfo> & buttonInfos,const DatePickerSettingData & settingData,const RefPtr<FrameNode> & timePickerNode,const RefPtr<FrameNode> & acceptNode,const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & dialogNode,const RefPtr<FrameNode> & contentColumn,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)1801 void DatePickerDialogView::BuildDialogAcceptAndCancelButtonForAging(const std::vector<ButtonInfo>& buttonInfos,
1802     const DatePickerSettingData& settingData, const RefPtr<FrameNode>& timePickerNode,
1803     const RefPtr<FrameNode>& acceptNode, const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& dialogNode,
1804     const RefPtr<FrameNode>& contentColumn, std::map<std::string, NG::DialogEvent> dialogEvent,
1805     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
1806 {
1807     auto changeEvent = dialogEvent["changeId"];
1808     auto dateChangeEvent = dialogEvent["dateChangeId"];
1809     if (settingData.showTime) {
1810         auto changeEventSame = changeEvent;
1811         auto dateChangeEventSame = dateChangeEvent;
1812         SetDialogChange(acceptNode, std::move(changeEventSame));
1813         SetDialogDateChange(acceptNode, std::move(dateChangeEventSame));
1814     }
1815     SetDialogChange(dateNode, std::move(changeEvent));
1816     SetDialogDateChange(dateNode, std::move(dateChangeEvent));
1817     auto contentRow = CreateButtonNodeForAging(settingData, timePickerNode, acceptNode,
1818         dateNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent));
1819     if (!isShowTime_) {
1820         SwitchDatePickerPage(dateNode, true);
1821         ShowContentRowButton(contentRow, true);
1822     }
1823     CHECK_NULL_VOID(contentRow);
1824     auto event = [weak = WeakPtr<FrameNode>(dialogNode)](const GestureEvent& /* info */) {
1825         auto dialogNode = weak.Upgrade();
1826         CHECK_NULL_VOID(dialogNode);
1827         auto pipeline = dialogNode->GetContext();
1828         CHECK_NULL_VOID(pipeline);
1829         auto overlayManager = pipeline->GetOverlayManager();
1830         CHECK_NULL_VOID(overlayManager);
1831         overlayManager->CloseDialog(dialogNode);
1832     };
1833 
1834     auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(event);
1835     auto cancelButtonNode = AceType::DynamicCast<FrameNode>(contentRow->GetChildAtIndex(0));
1836     CHECK_NULL_VOID(cancelButtonNode);
1837     auto cancelButtonGestureHub = cancelButtonNode->GetOrCreateGestureEventHub();
1838     cancelButtonGestureHub->AddClickEvent(onClick);
1839     auto confirmButtonNode = AceType::DynamicCast<FrameNode>(contentRow->GetLastChild());
1840     CHECK_NULL_VOID(confirmButtonNode);
1841     auto confirmButtonGestureHub = confirmButtonNode->GetOrCreateGestureEventHub();
1842     confirmButtonGestureHub->AddClickEvent(onClick);
1843     contentRow->MountToParent(contentColumn);
1844 }
1845 
UpdateContentPadding(const RefPtr<FrameNode> & contentColumn)1846 void DatePickerDialogView::UpdateContentPadding(const RefPtr<FrameNode>& contentColumn)
1847 {
1848     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1849         PaddingProperty contentPadding;
1850         contentPadding.left = CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE);
1851         contentPadding.right = CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE);
1852         contentColumn->GetLayoutProperty()->UpdatePadding(contentPadding);
1853     }
1854 }
1855 
UpdateButtonDefaultFocus(const std::vector<ButtonInfo> & buttonInfos,const RefPtr<FrameNode> & buttonNode,bool isConfirm)1856 void DatePickerDialogView::UpdateButtonDefaultFocus(
1857     const std::vector<ButtonInfo>& buttonInfos, const RefPtr<FrameNode>& buttonNode, bool isConfirm)
1858 {
1859     bool setDefaultFocus = false;
1860     if (buttonInfos.size() > CANCEL_BUTTON_INDEX) {
1861         if (buttonInfos[ACCEPT_BUTTON_INDEX].isPrimary && buttonInfos[CANCEL_BUTTON_INDEX].isPrimary) {
1862             return;
1863         }
1864         auto index = isConfirm ? ACCEPT_BUTTON_INDEX : CANCEL_BUTTON_INDEX;
1865         if (buttonInfos[index].isPrimary) {
1866             setDefaultFocus = true;
1867         }
1868     } else if (buttonInfos.size() == CANCEL_BUTTON_INDEX) {
1869         bool isAcceptButtonPrimary = (buttonInfos[0].isAcceptButton && isConfirm && buttonInfos[0].isPrimary);
1870         bool isCancelButtonPrimary = (!buttonInfos[0].isAcceptButton && !isConfirm && buttonInfos[0].isPrimary);
1871         if (isAcceptButtonPrimary || isCancelButtonPrimary) {
1872             setDefaultFocus = true;
1873         }
1874     }
1875     if (setDefaultFocus && buttonNode) {
1876         auto focusHub = buttonNode->GetOrCreateFocusHub();
1877         if (focusHub) {
1878             focusHub->SetIsDefaultFocus(true);
1879         }
1880     }
1881 }
1882 
CreateNextPrevButtonNode(std::function<void ()> & switchEvent,const RefPtr<FrameNode> & dateNode,const std::vector<ButtonInfo> & buttonInfos,const RefPtr<FrameNode> & contentRow)1883 RefPtr<FrameNode> DatePickerDialogView::CreateNextPrevButtonNode(std::function<void()>& switchEvent,
1884     const RefPtr<FrameNode>& dateNode, const std::vector<ButtonInfo>& buttonInfos, const RefPtr<FrameNode>& contentRow)
1885 {
1886     auto pipeline = PipelineContext::GetCurrentContext();
1887     CHECK_NULL_RETURN(pipeline, nullptr);
1888     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
1889     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1890     auto nextPrevButtonNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1891         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1892     CHECK_NULL_RETURN(nextPrevButtonNode, nullptr);
1893     auto textNextPrevNode = FrameNode::CreateFrameNode(
1894         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1895     CHECK_NULL_RETURN(textNextPrevNode, nullptr);
1896     auto textLayoutProperty = textNextPrevNode->GetLayoutProperty<TextLayoutProperty>();
1897     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
1898     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
1899     textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
1900     textLayoutProperty->UpdateFontSize(
1901         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
1902     textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
1903     textNextPrevNode->MountToParent(nextPrevButtonNode);
1904     auto nextPrevEventHub = nextPrevButtonNode->GetEventHub<ButtonEventHub>();
1905     CHECK_NULL_RETURN(nextPrevEventHub, nullptr);
1906     nextPrevEventHub->SetStateEffect(true);
1907     auto buttonNextPrevLayoutProperty = nextPrevButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
1908     buttonNextPrevLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.next"));
1909     buttonNextPrevLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
1910     buttonNextPrevLayoutProperty->UpdateType(ButtonType::CAPSULE);
1911     buttonNextPrevLayoutProperty->UpdateFlexShrink(1.0);
1912     UpdateConfirmButtonMargin(buttonNextPrevLayoutProperty, dialogTheme);
1913     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
1914         buttonNextPrevLayoutProperty->UpdateUserDefinedIdealSize(
1915             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
1916     } else {
1917         auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
1918         CHECK_NULL_RETURN(buttonTheme, nullptr);
1919         buttonNextPrevLayoutProperty->UpdateUserDefinedIdealSize(
1920             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
1921     }
1922     auto eventNextPrevmHub = nextPrevButtonNode->GetOrCreateGestureEventHub();
1923     CHECK_NULL_RETURN(eventNextPrevmHub, nullptr);
1924     auto onClickCallback = CreateNextPrevClickEvent(textNextPrevNode, nextPrevButtonNode, dialogTheme, dateNode,
1925         switchEvent, contentRow);
1926     eventNextPrevmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(onClickCallback));
1927     auto buttonNextPrevRenderContext = nextPrevButtonNode->GetRenderContext();
1928     buttonNextPrevRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1929     UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonNextPrevLayoutProperty, buttonNextPrevRenderContext);
1930     UpdateButtonDefaultFocus(buttonInfos, nextPrevButtonNode, false);
1931     nextPrevButtonNode->MarkModifyDone();
1932     return nextPrevButtonNode;
1933 }
1934 
CreateNextPrevClickEvent(const RefPtr<FrameNode> & textNextPrevNode,const RefPtr<FrameNode> & nextPrevButtonNode,const RefPtr<DialogTheme> & dialogTheme,const RefPtr<FrameNode> & dateNode,std::function<void ()> & switchEvent,const RefPtr<FrameNode> & contentRow)1935 std::function<void(const GestureEvent&)> DatePickerDialogView::CreateNextPrevClickEvent(
1936     const RefPtr<FrameNode>& textNextPrevNode, const RefPtr<FrameNode>& nextPrevButtonNode,
1937     const RefPtr<DialogTheme>& dialogTheme, const RefPtr<FrameNode>& dateNode,
1938     std::function<void()>& switchEvent, const RefPtr<FrameNode>& contentRow)
1939 {
1940     auto onClickCallback = [textWeak = WeakPtr<FrameNode>(textNextPrevNode),
1941                             nextPrevButtonNodeWeak = WeakPtr<FrameNode>(nextPrevButtonNode),
1942                             dialogThemeWeak = WeakPtr<DialogTheme>(dialogTheme),
1943                                dateWeak = WeakPtr<FrameNode>(dateNode),
1944                                func = std::move(switchEvent),
1945                                contentWeak = WeakPtr<FrameNode>(contentRow)](const GestureEvent& /* info */) {
1946         auto dateNode = dateWeak.Upgrade();
1947         CHECK_NULL_VOID(dateNode);
1948         auto textNode = textWeak.Upgrade();
1949         CHECK_NULL_VOID(textNode);
1950         auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
1951         CHECK_NULL_VOID(textLayoutProperty);
1952         auto contentRow = contentWeak.Upgrade();
1953         CHECK_NULL_VOID(contentRow);
1954         auto nextPrevButtonNode = nextPrevButtonNodeWeak.Upgrade();
1955         CHECK_NULL_VOID(nextPrevButtonNode);
1956         auto dialogTheme = dialogThemeWeak.Upgrade();
1957         CHECK_NULL_VOID(dialogTheme);
1958         auto buttonNextPrevLayoutProperty
1959                                 = nextPrevButtonNode->GetLayoutProperty<ButtonLayoutProperty>();
1960         if (!switchFlag_ && isShowTime_) {
1961             func();
1962         } else {
1963             SwitchDatePickerPage(dateNode);
1964         }
1965         if (textLayoutProperty->GetContent() == Localization::GetInstance()->GetEntryLetters("common.next")) {
1966             if (!isShowTime_) {
1967                 ShowContentRowButton(contentRow, false);
1968             }
1969             UpdateCancelButtonMargin(buttonNextPrevLayoutProperty, dialogTheme);
1970             textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.prev"));
1971         } else {
1972             if (!isShowTime_) {
1973                 ShowContentRowButton(contentRow, true);
1974             }
1975             UpdateConfirmButtonMargin(buttonNextPrevLayoutProperty, dialogTheme);
1976             textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
1977         }
1978         if (switchFlag_ && isShowTime_) {
1979             UpdateNextButtonMargin(buttonNextPrevLayoutProperty);
1980         }
1981         textNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
1982     };
1983     return onClickCallback;
1984 }
1985 
GetIsUserSetTextProperties(const PickerTextProperties & properties)1986 bool DatePickerDialogView::GetIsUserSetTextProperties(const PickerTextProperties& properties)
1987 {
1988     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
1989         isUserSetFont_ = true;
1990         return true;
1991     }
1992 
1993     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
1994         isUserSetFont_ = true;
1995         return true;
1996     }
1997 
1998     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
1999         isUserSetFont_ = true;
2000         return true;
2001     }
2002     isUserSetFont_ = false;
2003     return false;
2004 }
2005 
NeedAdaptForAging()2006 bool DatePickerDialogView::NeedAdaptForAging()
2007 {
2008     auto pipeline = PipelineContext::GetCurrentContext();
2009     CHECK_NULL_RETURN(pipeline, false);
2010     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
2011     CHECK_NULL_RETURN(pickerTheme, false);
2012     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
2013     auto follow = pipeline->IsFollowSystem();
2014     if (GreatOrEqual(pipeline->GetFontScale(), pickerTheme->GetMaxOneFontScale()) &&
2015         Dimension(pipeline->GetRootHeight()).ConvertToVp() > pickerTheme->GetDeviceHeightLimit() &&
2016         (follow && (GreatOrEqual(maxAppFontScale, pickerTheme->GetMaxOneFontScale())))) {
2017         return true;
2018     }
2019     return false;
2020 }
2021 
AdjustFontSizeScale(const Dimension & fontSizeValue,double fontScale)2022 const Dimension DatePickerDialogView::AdjustFontSizeScale(const Dimension& fontSizeValue, double fontScale)
2023 {
2024     auto pipeline = PipelineContext::GetCurrentContextSafely();
2025     CHECK_NULL_RETURN(pipeline, fontSizeValue);
2026     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
2027     CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
2028 
2029     auto adjustedScale = std::clamp(fontScale, pickerTheme->GetNormalFontScale(),
2030         pickerTheme->GetMaxTwoFontScale());
2031     return fontSizeValue * adjustedScale;
2032 }
2033 
ConvertFontScaleValue(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)2034 const Dimension DatePickerDialogView::ConvertFontScaleValue(
2035     const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
2036 {
2037     auto pipeline = PipelineContext::GetCurrentContextPtrSafelyWithCheck();
2038     CHECK_NULL_RETURN(pipeline, fontSizeValue);
2039     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
2040     CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
2041     float fontSizeScale = pipeline->GetFontScale();
2042     Dimension fontSizeValueResult = fontSizeValue;
2043     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
2044     if (pipeline->IsFollowSystem() && (!NearZero(maxAppFontScale))) {
2045         fontSizeScale = std::min(fontSizeScale, maxAppFontScale);
2046     }
2047     if (NeedAdaptForAging()) {
2048         if (fontSizeValue.Unit() == DimensionUnit::VP) {
2049             if (isUserSetFont) {
2050                 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
2051             }
2052             fontSizeValueResult = AdjustFontSizeScale(fontSizeValueResult, fontSizeScale);
2053         } else {
2054             if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxThirdFontScale())) {
2055                 fontSizeScale = pickerTheme->GetMaxTwoFontScale() / pickerTheme->GetMaxThirdFontScale();
2056                 fontSizeValueResult = fontSizeValue * fontSizeScale;
2057             }
2058             if (isUserSetFont) {
2059                 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValueResult, fontSizeLimit, isUserSetFont);
2060             }
2061         }
2062     } else {
2063         if (isUserSetFont) {
2064             fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
2065         }
2066 
2067         if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxOneFontScale()) &&
2068             fontSizeValueResult.Unit() != DimensionUnit::VP) {
2069             if (!NearZero(fontSizeScale)) {
2070                 fontSizeValueResult = fontSizeValueResult / fontSizeScale;
2071             }
2072         }
2073     }
2074     return fontSizeValueResult;
2075 }
2076 
ConvertFontSizeLimit(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)2077 const Dimension DatePickerDialogView::ConvertFontSizeLimit(
2078     const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
2079 {
2080     if (isUserSetFont == false) {
2081         return fontSizeValue;
2082     }
2083     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
2084     CHECK_NULL_RETURN(pipeline, fontSizeValue);
2085     auto fontScale = pipeline->GetFontScale();
2086     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
2087     if (pipeline->IsFollowSystem() && (!NearZero(maxAppFontScale))) {
2088         fontScale = std::min(fontScale, maxAppFontScale);
2089         fontScale = std::min(2.0f, fontScale);
2090     }
2091     Dimension fontSizeValueResult = fontSizeValue;
2092     if (fontSizeValue.Unit() == DimensionUnit::VP) {
2093         if (!NearZero(fontScale) &&
2094             GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx() / fontScale)) {
2095             fontSizeValueResult = fontSizeLimit / fontScale;
2096         } else {
2097             fontSizeValueResult = fontSizeValue;
2098         }
2099     } else {
2100         if (GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx())) {
2101             fontSizeValueResult = fontSizeLimit;
2102         } else {
2103             fontSizeValueResult = fontSizeValue;
2104         }
2105     }
2106 
2107     return fontSizeValueResult;
2108 }
2109 
ConvertTitleFontScaleValue(const Dimension & fontSizeValue)2110 const Dimension DatePickerDialogView::ConvertTitleFontScaleValue(const Dimension& fontSizeValue)
2111 {
2112     auto pipeline = PipelineContext::GetCurrentContextSafely();
2113     CHECK_NULL_RETURN(pipeline, fontSizeValue);
2114     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
2115     CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
2116     auto fontScale = pipeline->GetFontScale();
2117     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
2118     if (pipeline->IsFollowSystem() && (!NearZero(maxAppFontScale))) {
2119         fontScale = std::min(fontScale, maxAppFontScale);
2120     }
2121     if (NearZero(fontScale)) {
2122         return fontSizeValue;
2123     }
2124     if (NeedAdaptForAging()) {
2125         if (fontSizeValue.Unit() == DimensionUnit::VP) {
2126             return (fontSizeValue * pickerTheme->GetTitleFontScaleLimit());
2127         } else {
2128             if (GreatOrEqualCustomPrecision(fontScale, pickerTheme->GetTitleFontScaleLimit()) &&
2129              (!NearZero(fontScale))) {
2130                 auto fontSizeScale = pickerTheme->GetTitleFontScaleLimit() / fontScale;
2131                 return (fontSizeValue * fontSizeScale);
2132             }
2133         }
2134     } else {
2135         if (GreatOrEqualCustomPrecision(fontScale, pickerTheme->GetMaxOneFontScale()) &&
2136             fontSizeValue.Unit() != DimensionUnit::VP && (!NearZero(fontScale))) {
2137             return (fontSizeValue / fontScale);
2138         }
2139     }
2140     return fontSizeValue;
2141 }
2142 
GetUserSettingLimit()2143 void DatePickerDialogView::GetUserSettingLimit()
2144 {
2145     auto pipeline = PipelineContext::GetCurrentContextSafely();
2146     CHECK_NULL_VOID(pipeline);
2147     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
2148     CHECK_NULL_VOID(pickerTheme);
2149     selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle();
2150     normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle();
2151     disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle();
2152 }
2153 
2154 } // namespace OHOS::Ace::NG
2155