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