• 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/memory/ace_type.h"
21 #include "base/utils/utils.h"
22 #include "core/components/theme/icon_theme.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/button/button_pattern.h"
25 #include "core/components_ng/pattern/calendar/calendar_paint_property.h"
26 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
27 #include "core/components_ng/pattern/dialog/dialog_view.h"
28 #include "core/components_ng/pattern/divider/divider_pattern.h"
29 #include "core/components_ng/pattern/image/image_pattern.h"
30 #include "core/components_ng/pattern/picker/date_time_animation_controller.h"
31 #include "core/components_ng/pattern/picker/datepicker_pattern.h"
32 #include "core/components_ng/pattern/picker/datepicker_row_layout_property.h"
33 #include "core/components_ng/pattern/stack/stack_pattern.h"
34 #include "core/components_ng/property/measure_property.h"
35 #include "core/components_v2/inspector/inspector_constants.h"
36 #include "core/pipeline/pipeline_base.h"
37 
38 namespace OHOS::Ace::NG {
39 namespace {
40 const int32_t MARGIN_HALF = 2;
41 constexpr double MONTHDAYS_WIDTH_PERCENT_ONE = 0.4285;
42 constexpr double TIME_WIDTH_PERCENT_ONE = 0.5714;
43 constexpr double MONTHDAYS_WIDTH_PERCENT_TWO = 0.3636;
44 constexpr double TIME_WIDTH_PERCENT_TWO = 0.6363;
45 constexpr Dimension BUTTON_BOTTOM_TOP_MARGIN = 10.0_vp;
46 constexpr Dimension LUNARSWITCH_HEIGHT = 48.0_vp;
47 constexpr Dimension CHECKBOX_SIZE = 24.0_vp;
48 constexpr Dimension PICKER_DIALOG_MARGIN_FORM_EDGE = 24.0_vp;
49 constexpr Dimension LUNARSWITCH_MARGIN_TO_BUTTON = 8.0_vp;
50 constexpr int32_t HOVER_ANIMATION_DURATION = 250;
51 } // namespace
52 bool DatePickerDialogView::switchFlag_ = false;
53 
Show(const DialogProperties & dialogProperties,const DatePickerSettingData & settingData,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)54 RefPtr<FrameNode> DatePickerDialogView::Show(const DialogProperties& dialogProperties,
55     const DatePickerSettingData& settingData, std::map<std::string, NG::DialogEvent> dialogEvent,
56     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
57 {
58     auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
59         AceType::MakeRefPtr<LinearLayoutPattern>(true));
60     auto pickerStack = CreateStackNode();
61     auto dateNodeId = ElementRegister::GetInstance()->MakeUniqueId();
62     auto monthDaysNodeId = ElementRegister::GetInstance()->MakeUniqueId();
63     auto dateNode =
64         CreateDateNode(dateNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, false);
65     ViewStackProcessor::GetInstance()->Push(dateNode);
66     dateNode->MountToParent(pickerStack);
67     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
68     CHECK_NULL_RETURN(pickerPattern, nullptr);
69     pickerPattern->SetIsShowInDialog(true);
70 
71     // create title node and bind title text id to date picker, then mark picker node modify done
72     auto buttonTitleNode = CreateTitleButtonNode(dateNode);
73     CHECK_NULL_RETURN(buttonTitleNode, nullptr);
74 
75     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
76     datePickerPattern->SetbuttonTitleNode(buttonTitleNode);
77 
78     buttonTitleNode->MountToParent(contentColumn);
79     std::function<void(bool)> lunarChangeEvent = [weak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
80         auto datePicker = weak.Upgrade();
81         CHECK_NULL_VOID(datePicker);
82         auto layoutProp = datePicker->GetLayoutProperty<DataPickerRowLayoutProperty>();
83         CHECK_NULL_VOID(layoutProp);
84         layoutProp->UpdateLunar(selected);
85         datePicker->MarkModifyDone();
86     };
87     RefPtr<FrameNode> acceptNode = dateNode;
88     if (settingData.showTime) {
89         switchFlag_ = false;
90         auto pickerRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
91             AceType::MakeRefPtr<LinearLayoutPattern>(false));
92         CHECK_NULL_RETURN(pickerRow, nullptr);
93         auto layoutProperty = dateNode->GetLayoutProperty<LayoutProperty>();
94         CHECK_NULL_RETURN(layoutProperty, nullptr);
95         layoutProperty->UpdateVisibility(VisibleType::INVISIBLE);
96         auto monthDaysNode = CreateDateNode(
97             monthDaysNodeId, settingData.datePickerProperty, settingData.properties, settingData.isLunar, true);
98         lunarChangeEvent = [monthDaysNodeWeak = AceType::WeakClaim(AceType::RawPtr(monthDaysNode)),
99                                dateNodeWeak = AceType::WeakClaim(AceType::RawPtr(dateNode))](bool selected) {
100             auto monthDaysNode = monthDaysNodeWeak.Upgrade();
101             auto dateNode = dateNodeWeak.Upgrade();
102             CHECK_NULL_VOID(monthDaysNode);
103             CHECK_NULL_VOID(dateNode);
104             SetShowLunar(monthDaysNode, selected);
105             SetShowLunar(dateNode, selected);
106             monthDaysNode->MarkModifyDone();
107             dateNode->MarkModifyDone();
108         };
109         auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
110         CHECK_NULL_RETURN(monthDaysPickerPattern, nullptr);
111         monthDaysPickerPattern->SetTitleId(pickerPattern->GetTitleId());
112         monthDaysPickerPattern->SetShowTimeFlag(true);
113         pickerPattern->SetShowTimeFlag(true);
114         auto monthDaysLayoutProperty = monthDaysNode->GetLayoutProperty();
115         CHECK_NULL_RETURN(monthDaysLayoutProperty, nullptr);
116         monthDaysLayoutProperty->UpdateUserDefinedIdealSize(
117             CalcSize(NG::CalcLength(
118                          Dimension(settingData.useMilitary ? MONTHDAYS_WIDTH_PERCENT_ONE : MONTHDAYS_WIDTH_PERCENT_TWO,
119                              DimensionUnit::PERCENT)),
120                 std::nullopt));
121         monthDaysNode->MarkModifyDone();
122         monthDaysNode->MountToParent(pickerRow);
123         auto timeNode = CreateTimeNode(settingData.timePickerProperty, settingData.properties, settingData.useMilitary);
124         auto timePickerEventHub = timeNode->GetEventHub<TimePickerEventHub>();
125         CHECK_NULL_RETURN(timePickerEventHub, nullptr);
126         auto onChangeCallback = [monthDaysNode]() {
127             auto pickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
128             CHECK_NULL_VOID(pickerPattern);
129             auto str = pickerPattern->GetSelectedObject(true);
130             auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
131             CHECK_NULL_VOID(datePickerEventHub);
132             datePickerEventHub->FireDialogChangeEvent(str);
133         };
134         timePickerEventHub->SetOnChangeForDatePicker(std::move(onChangeCallback));
135         auto timeLayoutProperty = timeNode->GetLayoutProperty();
136         CHECK_NULL_RETURN(timeLayoutProperty, nullptr);
137         timeLayoutProperty->UpdateUserDefinedIdealSize(
138             CalcSize(NG::CalcLength(Dimension(settingData.useMilitary ? TIME_WIDTH_PERCENT_ONE : TIME_WIDTH_PERCENT_TWO,
139                          DimensionUnit::PERCENT)),
140                 std::nullopt));
141         timeNode->MarkModifyDone();
142         timeNode->MountToParent(pickerRow);
143         pickerRow->MountToParent(pickerStack);
144 
145         CreateTitleIconNode(buttonTitleNode);
146         SetTitleMouseHoverEvent(buttonTitleNode);
147         buttonTitleNode->MarkModifyDone();
148         RefPtr<DateTimeAnimationController> animationController = AceType::MakeRefPtr<DateTimeAnimationController>();
149         auto titleSwitchEvent = [contentColumn, pickerStack, animationController]() {
150             // switch picker page.
151             auto pickerRow = pickerStack->GetLastChild();
152             CHECK_NULL_VOID(pickerRow);
153             auto dateNode = AceType::DynamicCast<FrameNode>(pickerStack->GetChildAtIndex(0));
154             CHECK_NULL_VOID(dateNode);
155             auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
156             CHECK_NULL_VOID(datePickerPattern);
157             auto monthDaysNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(0));
158             auto timeNode = AceType::DynamicCast<FrameNode>(pickerRow->GetChildAtIndex(1));
159             CHECK_NULL_VOID(monthDaysNode);
160             CHECK_NULL_VOID(timeNode);
161             auto timePickerPattern = timeNode->GetPattern<TimePickerRowPattern>();
162             CHECK_NULL_VOID(timePickerPattern);
163             auto monthDaysPickerPattern = monthDaysNode->GetPattern<DatePickerPattern>();
164             CHECK_NULL_VOID(monthDaysPickerPattern);
165 
166             PickerDate selectedDate =
167                 switchFlag_ ? datePickerPattern->GetCurrentDate() : monthDaysPickerPattern->GetCurrentDate();
168             SetSelectedDate(switchFlag_ ? monthDaysNode : dateNode, selectedDate);
169             if (switchFlag_) {
170                 datePickerPattern->SetFocusDisable();
171                 timePickerPattern->SetFocusEnable();
172                 monthDaysPickerPattern->SetFocusEnable();
173                 monthDaysNode->MarkModifyDone();
174             } else {
175                 monthDaysPickerPattern->SetFocusDisable();
176                 timePickerPattern->SetFocusDisable();
177                 datePickerPattern->SetFocusEnable();
178                 dateNode->MarkModifyDone();
179             }
180 
181             auto contentRow = AceType::DynamicCast<FrameNode>(contentColumn->GetLastChild());
182             auto titleRow = AceType::DynamicCast<FrameNode>(contentColumn->GetChildAtIndex(0));
183             CHECK_NULL_VOID(titleRow);
184             auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
185             CHECK_NULL_VOID(titleButtonNode);
186             auto titleButtonRowNode = AceType::DynamicCast<FrameNode>(titleButtonNode->GetFirstChild());
187             CHECK_NULL_VOID(titleButtonRowNode);
188             auto spinnerNode = AceType::DynamicCast<FrameNode>(titleButtonRowNode->GetLastChild());
189             CHECK_NULL_VOID(spinnerNode);
190             animationController->SetButtonIcon(spinnerNode);
191             animationController->SetMonthDays(monthDaysNode);
192             animationController->SetDatePicker(dateNode);
193             animationController->SetTimePicker(timeNode);
194             animationController->SetButtonRow(contentRow);
195             switchFlag_ = !switchFlag_;
196 
197             animationController->Play(switchFlag_);
198         };
199         auto switchEvent = [func = titleSwitchEvent]() {
200             if (switchFlag_) {
201                 func();
202                 return true;
203             }
204             return false;
205         };
206         SetDialogSwitchEvent(switchEvent);
207         auto titleClickEvent = [func = std::move(titleSwitchEvent)](const GestureEvent& /* info */) { func(); };
208         auto titleButtonNode = AceType::DynamicCast<FrameNode>(buttonTitleNode->GetFirstChild());
209         CHECK_NULL_RETURN(titleButtonNode, nullptr);
210         auto titleEventHub = titleButtonNode->GetOrCreateGestureEventHub();
211         auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(titleClickEvent));
212         titleEventHub->AddClickEvent(onClick);
213         acceptNode = monthDaysNode;
214     }
215     dateNode->MarkModifyDone();
216 
217     ViewStackProcessor::GetInstance()->Finish();
218     auto stackLayoutProperty = pickerStack->GetLayoutProperty();
219     CHECK_NULL_RETURN(stackLayoutProperty, nullptr);
220     stackLayoutProperty->UpdateUserDefinedIdealSize(
221         CalcSize(NG::CalcLength(Dimension(1, DimensionUnit::PERCENT)), std::nullopt));
222     pickerStack->MountToParent(contentColumn);
223     // build lunarswitch Node
224     if (settingData.lunarswitch) {
225         CreateLunarswitchNode(contentColumn, std::move(lunarChangeEvent), settingData.isLunar);
226     }
227     auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
228     CHECK_NULL_RETURN(dialogNode, nullptr);
229 
230     // build dialog accept and cancel button
231     auto changeEvent = dialogEvent["changeId"];
232     auto dateChangeEvent = dialogEvent["dateChangeId"];
233     if (settingData.showTime) {
234         auto changeEventSame = changeEvent;
235         auto dateChangeEventSame = dateChangeEvent;
236         SetDialogChange(acceptNode, std::move(changeEventSame));
237         SetDialogDateChange(acceptNode, std::move(dateChangeEventSame));
238     }
239     SetDialogChange(dateNode, std::move(changeEvent));
240     SetDialogDateChange(dateNode, std::move(dateChangeEvent));
241     auto contentRow = CreateButtonNode(acceptNode, dateNode, dialogEvent, std::move(dialogCancelEvent));
242     CHECK_NULL_RETURN(contentRow, nullptr);
243     auto event = [dialogNode](const GestureEvent& /* info */) {
244         auto pipeline = PipelineContext::GetCurrentContext();
245         auto overlayManager = pipeline->GetOverlayManager();
246         overlayManager->CloseDialog(dialogNode);
247     };
248     for (const auto& child : contentRow->GetChildren()) {
249         auto firstChild = AceType::DynamicCast<FrameNode>(child);
250         auto gesturHub = firstChild->GetOrCreateGestureEventHub();
251         auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(event);
252         gesturHub->AddClickEvent(onClick);
253     }
254     contentRow->AddChild(CreateDividerNode(dateNode), 1);
255     contentRow->MountToParent(contentColumn);
256     dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
257     return dialogNode;
258 }
259 
CreateStackNode()260 RefPtr<FrameNode> DatePickerDialogView::CreateStackNode()
261 {
262     auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
263     return FrameNode::GetOrCreateFrameNode(
264         V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
265 }
266 
CreateButtonNode()267 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode()
268 {
269     auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
270     return FrameNode::GetOrCreateFrameNode(
271         V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
272 }
273 
CreateTitleButtonNode(const RefPtr<FrameNode> & dateNode)274 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonNode(const RefPtr<FrameNode>& dateNode)
275 {
276     auto pipeline = PipelineContext::GetCurrentContext();
277     CHECK_NULL_RETURN(pipeline, nullptr);
278     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
279     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
280     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
281     CHECK_NULL_RETURN(pickerPattern, nullptr);
282     auto titleRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
283         AceType::MakeRefPtr<LinearLayoutPattern>(false));
284     CHECK_NULL_RETURN(titleRow, nullptr);
285     auto layoutProps = titleRow->GetLayoutProperty<LinearLayoutProperty>();
286     CHECK_NULL_RETURN(layoutProps, nullptr);
287     layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
288     layoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
289     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
290 
291     auto buttonTitleNode = FrameNode::GetOrCreateFrameNode(
292         V2::BUTTON_ETS_TAG, pickerPattern->GetButtonTitleId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
293     CHECK_NULL_RETURN(buttonTitleNode, nullptr);
294     auto titleButtonRow = CreateTitleButtonRowNode();
295     CHECK_NULL_RETURN(titleButtonRow, nullptr);
296     auto textTitleNodeId = pickerPattern->GetTitleId();
297     auto textTitleNode =
298         FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, textTitleNodeId, AceType::MakeRefPtr<TextPattern>());
299     CHECK_NULL_RETURN(textTitleNode, nullptr);
300     auto textLayoutProperty = textTitleNode->GetLayoutProperty<TextLayoutProperty>();
301     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
302     textLayoutProperty->UpdateContent("");
303     textLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
304 
305     textLayoutProperty->UpdateTextColor(pickerTheme->GetTitleStyle().GetTextColor());
306     textLayoutProperty->UpdateFontSize(pickerTheme->GetTitleStyle().GetFontSize());
307     textLayoutProperty->UpdateFontWeight(pickerTheme->GetTitleStyle().GetFontWeight());
308     textLayoutProperty->UpdateTextOverflow(pickerTheme->GetTitleStyle().GetTextOverflow());
309     textLayoutProperty->UpdateMaxLines(pickerTheme->GetTitleStyle().GetMaxLines());
310     auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
311     CHECK_NULL_RETURN(buttonTitleRenderContext, nullptr);
312     buttonTitleRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
313     MarginProperty margin;
314     margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
315     margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
316     margin.top = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
317     margin.bottom = CalcLength(dialogTheme->GetDividerHeight() / MARGIN_HALF);
318     buttonTitleNode->GetLayoutProperty()->UpdateMargin(margin);
319     textTitleNode->MountToParent(titleButtonRow);
320     titleButtonRow->MountToParent(buttonTitleNode);
321     buttonTitleNode->MountToParent(titleRow);
322     titleRow->SetNeedCallChildrenUpdate(false);
323     return titleRow;
324 }
325 
CreateTitleButtonRowNode()326 RefPtr<FrameNode> DatePickerDialogView::CreateTitleButtonRowNode()
327 {
328     auto titleButtonRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
329         AceType::MakeRefPtr<LinearLayoutPattern>(false));
330     CHECK_NULL_RETURN(titleButtonRow, nullptr);
331     auto bottonRowlayoutProps = titleButtonRow->GetLayoutProperty<LinearLayoutProperty>();
332     CHECK_NULL_RETURN(bottonRowlayoutProps, nullptr);
333     bottonRowlayoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
334     bottonRowlayoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
335     bottonRowlayoutProps->UpdateMeasureType(MeasureType::MATCH_CONTENT);
336     return titleButtonRow;
337 }
338 
CreateTitleIconNode(const RefPtr<FrameNode> & titleNode)339 void DatePickerDialogView::CreateTitleIconNode(const RefPtr<FrameNode>& titleNode)
340 {
341     auto pipeline = PipelineContext::GetCurrentContext();
342     CHECK_NULL_VOID(pipeline);
343     auto iconTheme = pipeline->GetTheme<IconTheme>();
344     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
345     auto spinnerNode = FrameNode::CreateFrameNode(
346         V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
347     CHECK_NULL_VOID(spinnerNode);
348     ImageSourceInfo imageSourceInfo;
349     auto iconPath = iconTheme->GetIconPath(InternalResource::ResourceId::SPINNER);
350     imageSourceInfo.SetSrc(iconPath);
351     imageSourceInfo.SetFillColor(pickerTheme->GetTitleStyle().GetTextColor());
352 
353     auto spinnerLayoutProperty = spinnerNode->GetLayoutProperty<ImageLayoutProperty>();
354     CHECK_NULL_VOID(spinnerLayoutProperty);
355     spinnerLayoutProperty->UpdateImageSourceInfo(imageSourceInfo);
356     CalcSize idealSize = { CalcLength(pickerTheme->GetTitleStyle().GetFontSize()),
357         CalcLength(pickerTheme->GetTitleStyle().GetFontSize()) };
358     MeasureProperty layoutConstraint;
359     layoutConstraint.selfIdealSize = idealSize;
360     spinnerLayoutProperty->UpdateCalcLayoutProperty(layoutConstraint);
361     spinnerNode->MarkModifyDone();
362     auto buttonNode = AceType::DynamicCast<FrameNode>(titleNode->GetFirstChild());
363     CHECK_NULL_VOID(buttonNode);
364     auto buttonRowNode = AceType::DynamicCast<FrameNode>(buttonNode->GetFirstChild());
365     CHECK_NULL_VOID(buttonRowNode);
366     spinnerNode->MountToParent(buttonRowNode);
367 }
368 
CreateDividerNode(const RefPtr<FrameNode> & dateNode)369 RefPtr<FrameNode> DatePickerDialogView::CreateDividerNode(const RefPtr<FrameNode>& dateNode)
370 {
371     auto pipeline = PipelineContext::GetCurrentContext();
372     CHECK_NULL_RETURN(pipeline, nullptr);
373     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
374     auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
375     CHECK_NULL_RETURN(pickerPattern, nullptr);
376     auto dividerNode = FrameNode::GetOrCreateFrameNode(
377         V2::DIVIDER_ETS_TAG, pickerPattern->GetDividerId(), []() { return AceType::MakeRefPtr<DividerPattern>(); });
378     CHECK_NULL_RETURN(dividerNode, nullptr);
379 
380     auto dividerPaintProps = dividerNode->GetPaintProperty<DividerRenderProperty>();
381     CHECK_NULL_RETURN(dividerPaintProps, nullptr);
382     dividerPaintProps->UpdateDividerColor(dialogTheme->GetDividerColor());
383 
384     auto dividerLayoutProps = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
385     CHECK_NULL_RETURN(dividerLayoutProps, nullptr);
386     dividerLayoutProps->UpdateVertical(true);
387     dividerLayoutProps->UpdateUserDefinedIdealSize(
388         CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
389 
390     return dividerNode;
391 }
392 
CreateButtonNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,std::map<std::string,NG::DialogEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)393 RefPtr<FrameNode> DatePickerDialogView::CreateButtonNode(const RefPtr<FrameNode>& dateNode,
394     const RefPtr<FrameNode>& datePickerNode, std::map<std::string, NG::DialogEvent> dialogEvent,
395     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
396 {
397     auto acceptEvent = dialogEvent["acceptId"];
398     auto dateAcceptEvent = dialogEvent["dateAcceptId"];
399     auto cancelEvent = dialogCancelEvent["cancelId"];
400     auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
401         AceType::MakeRefPtr<LinearLayoutPattern>(false));
402     CHECK_NULL_RETURN(contentRow, nullptr);
403     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
404     CHECK_NULL_RETURN(layoutProps, nullptr);
405     layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
406     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
407 
408     contentRow->SetNeedCallChildrenUpdate(false);
409     SetDialogDateAcceptEvent(dateNode, std::move(dateAcceptEvent));
410 
411     auto buttonCancelNode = CreateCancelNode(cancelEvent, datePickerNode);
412     auto buttonConfirmNode = CreateConfirmNode(dateNode, datePickerNode, acceptEvent);
413 
414     buttonCancelNode->MountToParent(contentRow);
415     buttonConfirmNode->MountToParent(contentRow);
416 
417     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
418     datePickerPattern->SetContentRowNode(contentRow);
419 
420     return contentRow;
421 }
422 
CreateConfirmNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & datePickerNode,DialogEvent & acceptEvent)423 RefPtr<FrameNode> DatePickerDialogView::CreateConfirmNode(
424     const RefPtr<FrameNode>& dateNode, const RefPtr<FrameNode>& datePickerNode, DialogEvent& acceptEvent)
425 {
426     auto pipeline = PipelineContext::GetCurrentContext();
427     CHECK_NULL_RETURN(pipeline, nullptr);
428     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
429     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
430 
431     auto buttonConfirmNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
432         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
433     auto textConfirmNode = FrameNode::CreateFrameNode(
434         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
435     CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
436     CHECK_NULL_RETURN(textConfirmNode, nullptr);
437     auto textLayoutProperty = textConfirmNode->GetLayoutProperty<TextLayoutProperty>();
438     CHECK_NULL_RETURN(textLayoutProperty, nullptr);
439     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.ok"));
440     textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
441     textLayoutProperty->UpdateFontSize(pickerTheme->GetOptionStyle(false, false).GetFontSize());
442     textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
443     auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
444     datePickerPattern->SetConfirmNode(buttonConfirmNode);
445     auto buttonConfirmEventHub = buttonConfirmNode->GetEventHub<ButtonEventHub>();
446     CHECK_NULL_RETURN(buttonConfirmEventHub, nullptr);
447     buttonConfirmEventHub->SetStateEffect(true);
448 
449     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
450     buttonConfirmLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.ok"));
451     buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
452     buttonConfirmLayoutProperty->UpdateType(ButtonType::CAPSULE);
453     buttonConfirmLayoutProperty->UpdateFlexShrink(1.0);
454     buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
455         CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
456     auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext();
457     buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
458 
459     MarginProperty margin;
460     margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
461     margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
462     margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
463     buttonConfirmNode->GetLayoutProperty()->UpdateMargin(margin);
464     textConfirmNode->MountToParent(buttonConfirmNode);
465     auto eventConfirmHub = buttonConfirmNode->GetOrCreateGestureEventHub();
466     CHECK_NULL_RETURN(eventConfirmHub, nullptr);
467     CHECK_NULL_RETURN(dateNode, nullptr);
468     SetDialogAcceptEvent(dateNode, std::move(acceptEvent));
469     auto clickCallback = [dateNode](const GestureEvent& /* info */) {
470         auto pickerPattern = dateNode->GetPattern<DatePickerPattern>();
471         CHECK_NULL_VOID(pickerPattern);
472         auto datePickerEventHub = pickerPattern->GetEventHub<DatePickerEventHub>();
473         CHECK_NULL_VOID(datePickerEventHub);
474         datePickerEventHub->FireDialogAcceptEvent(pickerPattern->GetSelectedObject(true));
475     };
476     eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
477     buttonConfirmNode->MarkModifyDone();
478     return buttonConfirmNode;
479 }
480 
CreateDateNode(int32_t dateNodeId,std::map<std::string,PickerDate> datePickerProperty,const PickerTextProperties & properties,bool isLunar,bool showTime)481 RefPtr<FrameNode> DatePickerDialogView::CreateDateNode(int32_t dateNodeId,
482     std::map<std::string, PickerDate> datePickerProperty, const PickerTextProperties& properties, bool isLunar,
483     bool showTime)
484 {
485     auto dateNode = FrameNode::GetOrCreateFrameNode(
486         V2::DATE_PICKER_ETS_TAG, dateNodeId, []() { return AceType::MakeRefPtr<DatePickerPattern>(); });
487     CHECK_NULL_RETURN(dateNode, nullptr);
488     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
489     CHECK_NULL_RETURN(datePickerPattern, nullptr);
490 
491     auto pipeline = PipelineBase::GetCurrentContext();
492     CHECK_NULL_RETURN(pipeline, nullptr);
493     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
494     CHECK_NULL_RETURN(dialogTheme, nullptr);
495     datePickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
496     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
497     CHECK_NULL_RETURN(pickerTheme, nullptr);
498     uint32_t showCount = pickerTheme->GetShowOptionCount();
499     datePickerPattern->SetShowCount(showCount);
500 
501     if (showTime) {
502         CreateSingleDateNode(dateNode, showCount);
503     } else {
504         CreateNormalDateNode(dateNode, showCount);
505     }
506 
507     PickerDate parseStartDate;
508     PickerDate parseEndDate;
509     PickerDate parseSelectedDate;
510     SetShowLunar(dateNode, isLunar);
511     SetDateTextProperties(dateNode, properties);
512     if (datePickerProperty.find("start") != datePickerProperty.end()) {
513         parseStartDate = datePickerProperty["start"];
514         SetStartDate(dateNode, parseStartDate);
515     }
516     if (datePickerProperty.find("end") != datePickerProperty.end()) {
517         parseEndDate = datePickerProperty["end"];
518         SetEndDate(dateNode, parseEndDate);
519     }
520     if (datePickerProperty.find("selected") != datePickerProperty.end()) {
521         parseSelectedDate = datePickerProperty["selected"];
522         SetSelectedDate(dateNode, parseSelectedDate);
523     }
524     return dateNode;
525 }
526 
CreateColumnNode(int32_t nodeId,uint32_t showCount,bool isDate)527 RefPtr<FrameNode> DatePickerDialogView::CreateColumnNode(int32_t nodeId, uint32_t showCount, bool isDate)
528 {
529     RefPtr<FrameNode> columnNode;
530     if (isDate) {
531         columnNode = FrameNode::GetOrCreateFrameNode(
532             V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<DatePickerColumnPattern>(); });
533     } else {
534         columnNode = FrameNode::GetOrCreateFrameNode(
535             V2::COLUMN_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TimePickerColumnPattern>(); });
536     }
537     CHECK_NULL_RETURN(columnNode, nullptr);
538     columnNode->Clean();
539     for (uint32_t index = 0; index < showCount; index++) {
540         auto textNode = FrameNode::CreateFrameNode(
541             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
542         CHECK_NULL_RETURN(textNode, nullptr);
543         textNode->MountToParent(columnNode);
544     }
545     columnNode->MarkModifyDone();
546     return columnNode;
547 }
548 
CreateNormalDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)549 void DatePickerDialogView::CreateNormalDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
550 {
551     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
552     CHECK_NULL_VOID(datePickerPattern);
553     datePickerPattern->SetShowMonthDaysFlag(false);
554 
555     auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
556     auto monthColumnNode = CreateColumnNode(datePickerPattern->GetMonthId(), showCount);
557     auto dayColumnNode = CreateColumnNode(datePickerPattern->GetDayId(), showCount);
558     CHECK_NULL_VOID(yearColumnNode);
559     CHECK_NULL_VOID(monthColumnNode);
560     CHECK_NULL_VOID(dayColumnNode);
561     datePickerPattern->SetColumn(yearColumnNode);
562     datePickerPattern->SetColumn(monthColumnNode);
563     datePickerPattern->SetColumn(dayColumnNode);
564 
565     {
566         auto stackYearNode = CreateStackNode();
567         auto buttonYearNode = CreateButtonNode();
568         buttonYearNode->MountToParent(stackYearNode);
569         yearColumnNode->MountToParent(stackYearNode);
570         auto layoutProperty = stackYearNode->GetLayoutProperty<LayoutProperty>();
571         layoutProperty->UpdateAlignment(Alignment::CENTER);
572         layoutProperty->UpdateLayoutWeight(1);
573         stackYearNode->MountToParent(dateNode);
574     }
575     {
576         auto stackMonthNode = CreateStackNode();
577         auto buttonMonthNode = CreateButtonNode();
578         buttonMonthNode->MountToParent(stackMonthNode);
579         monthColumnNode->MountToParent(stackMonthNode);
580         auto layoutProperty = stackMonthNode->GetLayoutProperty<LayoutProperty>();
581         layoutProperty->UpdateAlignment(Alignment::CENTER);
582         layoutProperty->UpdateLayoutWeight(1);
583         stackMonthNode->MountToParent(dateNode);
584     }
585     {
586         auto stackDayNode = CreateStackNode();
587         auto buttonDayNode = CreateButtonNode();
588         buttonDayNode->MountToParent(stackDayNode);
589         dayColumnNode->MountToParent(stackDayNode);
590         auto layoutProperty = stackDayNode->GetLayoutProperty<LayoutProperty>();
591         layoutProperty->UpdateAlignment(Alignment::CENTER);
592         layoutProperty->UpdateLayoutWeight(1);
593         stackDayNode->MountToParent(dateNode);
594     }
595 }
596 
CreateSingleDateNode(const RefPtr<FrameNode> & dateNode,uint32_t showCount)597 void DatePickerDialogView::CreateSingleDateNode(const RefPtr<FrameNode>& dateNode, uint32_t showCount)
598 {
599     auto datePickerPattern = dateNode->GetPattern<DatePickerPattern>();
600     CHECK_NULL_VOID(datePickerPattern);
601     datePickerPattern->SetShowMonthDaysFlag(true);
602 
603     auto monthDaysColumnNode = CreateColumnNode(datePickerPattern->GetMonthDaysId(), showCount);
604     auto yearColumnNode = CreateColumnNode(datePickerPattern->GetYearId(), showCount);
605     CHECK_NULL_VOID(monthDaysColumnNode);
606     CHECK_NULL_VOID(yearColumnNode);
607     datePickerPattern->SetColumn(monthDaysColumnNode);
608     datePickerPattern->SetColumn(yearColumnNode);
609 
610     {
611         auto stackMonthNode = CreateStackNode();
612         auto buttonMonthNode = CreateButtonNode();
613         buttonMonthNode->MountToParent(stackMonthNode);
614         monthDaysColumnNode->MountToParent(stackMonthNode);
615         auto layoutProperty = stackMonthNode->GetLayoutProperty<LayoutProperty>();
616         layoutProperty->UpdateAlignment(Alignment::CENTER);
617         layoutProperty->UpdateLayoutWeight(1);
618         stackMonthNode->MountToParent(dateNode);
619     }
620 
621     {
622         auto stackYearNode = CreateStackNode();
623         auto buttonYearNode = CreateButtonNode();
624         buttonYearNode->MountToParent(stackYearNode);
625         yearColumnNode->MountToParent(stackYearNode);
626         auto layoutProperty = stackYearNode->GetLayoutProperty<LayoutProperty>();
627         layoutProperty->UpdateAlignment(Alignment::CENTER);
628         layoutProperty->UpdateVisibility(VisibleType::GONE);
629         stackYearNode->MountToParent(dateNode);
630     }
631 }
632 
CreateTimeNode(std::map<std::string,PickerTime> timePickerProperty,const PickerTextProperties & properties,bool useMilitaryTime)633 RefPtr<FrameNode> DatePickerDialogView::CreateTimeNode(
634     std::map<std::string, PickerTime> timePickerProperty, const PickerTextProperties& properties, bool useMilitaryTime)
635 {
636     auto timePickerNode = FrameNode::GetOrCreateFrameNode(V2::TIME_PICKER_ETS_TAG,
637         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<TimePickerRowPattern>(); });
638     CHECK_NULL_RETURN(timePickerNode, nullptr);
639     auto timePickerRowPattern = timePickerNode->GetPattern<TimePickerRowPattern>();
640     CHECK_NULL_RETURN(timePickerRowPattern, nullptr);
641 
642     auto pipeline = PipelineBase::GetCurrentContext();
643     CHECK_NULL_RETURN(pipeline, nullptr);
644     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
645     CHECK_NULL_RETURN(pickerTheme, nullptr);
646     uint32_t showCount = pickerTheme->GetShowOptionCount();
647     timePickerRowPattern->SetShowCount(showCount);
648 
649     auto hasHourNode = timePickerRowPattern->HasHourNode();
650     auto hasMinuteNode = timePickerRowPattern->HasMinuteNode();
651 
652     auto hourColumnNode = CreateColumnNode(timePickerRowPattern->GetHourId(), showCount, false);
653     auto minuteColumnNode = CreateColumnNode(timePickerRowPattern->GetMinuteId(), showCount, false);
654     CHECK_NULL_RETURN(hourColumnNode, nullptr);
655     CHECK_NULL_RETURN(minuteColumnNode, nullptr);
656     timePickerRowPattern->SetColumn(hourColumnNode);
657     timePickerRowPattern->SetColumn(minuteColumnNode);
658 
659     if (!hasHourNode) {
660         auto stackHourNode = CreateStackNode();
661         auto buttonYearNode = CreateButtonNode();
662         buttonYearNode->MountToParent(stackHourNode);
663         hourColumnNode->MountToParent(stackHourNode);
664         auto layoutProperty = stackHourNode->GetLayoutProperty<LayoutProperty>();
665         layoutProperty->UpdateAlignment(Alignment::CENTER);
666         layoutProperty->UpdateLayoutWeight(1);
667         stackHourNode->MountToParent(timePickerNode);
668     }
669     if (!hasMinuteNode) {
670         auto stackMinuteNode = CreateStackNode();
671         auto buttonYearNode = CreateButtonNode();
672         buttonYearNode->MountToParent(stackMinuteNode);
673         minuteColumnNode->MountToParent(stackMinuteNode);
674         auto layoutProperty = stackMinuteNode->GetLayoutProperty<LayoutProperty>();
675         layoutProperty->UpdateAlignment(Alignment::CENTER);
676         layoutProperty->UpdateLayoutWeight(1);
677         stackMinuteNode->MountToParent(timePickerNode);
678     }
679     if (timePickerProperty.find("selected") != timePickerProperty.end()) {
680         auto selectedTime = timePickerProperty["selected"];
681         timePickerRowPattern->SetSelectedTime(selectedTime);
682     }
683     timePickerRowPattern->SetHour24(useMilitaryTime);
684 
685     SetTimeTextProperties(timePickerNode, properties);
686     return timePickerNode;
687 }
688 
CreateCancelNode(NG::DialogGestureEvent & cancelEvent,const RefPtr<FrameNode> & datePickerNode)689 RefPtr<FrameNode> DatePickerDialogView::CreateCancelNode(
690     NG::DialogGestureEvent& cancelEvent, const RefPtr<FrameNode>& datePickerNode)
691 {
692     auto pipeline = PipelineContext::GetCurrentContext();
693     CHECK_NULL_RETURN(pipeline, nullptr);
694     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
695     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
696     auto buttonCancelNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
697         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
698     CHECK_NULL_RETURN(buttonCancelNode, nullptr);
699     auto textCancelNode = FrameNode::CreateFrameNode(
700         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
701     CHECK_NULL_RETURN(textCancelNode, nullptr);
702     auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
703     CHECK_NULL_RETURN(textCancelLayoutProperty, nullptr);
704     textCancelLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.cancel"));
705     textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
706     textCancelLayoutProperty->UpdateFontSize(pickerTheme->GetOptionStyle(false, false).GetFontSize());
707     textCancelLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
708     auto datePickerPattern = datePickerNode->GetPattern<DatePickerPattern>();
709     datePickerPattern->SetCancelNode(buttonCancelNode);
710     textCancelNode->MountToParent(buttonCancelNode);
711     auto eventCancelHub = buttonCancelNode->GetOrCreateGestureEventHub();
712     CHECK_NULL_RETURN(eventCancelHub, nullptr);
713     eventCancelHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(cancelEvent)));
714 
715     auto buttonCancelEventHub = buttonCancelNode->GetEventHub<ButtonEventHub>();
716     CHECK_NULL_RETURN(buttonCancelEventHub, nullptr);
717     buttonCancelEventHub->SetStateEffect(true);
718 
719     MarginProperty margin;
720     margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
721     margin.top = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
722     margin.bottom = CalcLength(BUTTON_BOTTOM_TOP_MARGIN);
723     buttonCancelNode->GetLayoutProperty()->UpdateMargin(margin);
724 
725     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
726     buttonCancelLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.cancel"));
727     buttonCancelLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
728     buttonCancelLayoutProperty->UpdateType(ButtonType::CAPSULE);
729     buttonCancelLayoutProperty->UpdateFlexShrink(1.0);
730     buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
731         CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
732 
733     auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext();
734     buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
735     buttonCancelNode->MarkModifyDone();
736     return buttonCancelNode;
737 }
738 
CreateLunarswitchNode(const RefPtr<FrameNode> & contentColumn,std::function<void (const bool)> && changeEvent,bool isLunar)739 void DatePickerDialogView::CreateLunarswitchNode(
740     const RefPtr<FrameNode>& contentColumn, std::function<void(const bool)>&& changeEvent, bool isLunar)
741 {
742     auto pipeline = PipelineBase::GetCurrentContext();
743     CHECK_NULL_VOID(pipeline);
744     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
745     CHECK_NULL_VOID(pickerTheme);
746     auto contentRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
747         AceType::MakeRefPtr<LinearLayoutPattern>(false));
748     CHECK_NULL_VOID(contentRow);
749     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
750     CHECK_NULL_VOID(layoutProps);
751     MarginProperty margin;
752     margin.bottom = CalcLength(LUNARSWITCH_MARGIN_TO_BUTTON);
753     layoutProps->UpdateMargin(margin);
754     layoutProps->UpdateUserDefinedIdealSize(
755         CalcSize(CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), CalcLength(LUNARSWITCH_HEIGHT)));
756 
757     auto checkbox = FrameNode::CreateFrameNode(
758         V2::CHECK_BOX_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<CheckBoxPattern>());
759     CHECK_NULL_VOID(checkbox);
760     auto eventHub = checkbox->GetEventHub<CheckBoxEventHub>();
761     CHECK_NULL_VOID(eventHub);
762     eventHub->SetOnChange(std::move(changeEvent));
763     auto checkboxPaintProps = checkbox->GetPaintProperty<CheckBoxPaintProperty>();
764     CHECK_NULL_VOID(checkboxPaintProps);
765     checkboxPaintProps->UpdateCheckBoxSelect(isLunar);
766     auto checkboxLayoutProps = checkbox->GetLayoutProperty<LayoutProperty>();
767     CHECK_NULL_VOID(checkboxLayoutProps);
768     MarginProperty marginCheckbox;
769     marginCheckbox.left = CalcLength(PICKER_DIALOG_MARGIN_FORM_EDGE);
770     marginCheckbox.right = CalcLength(LUNARSWITCH_MARGIN_TO_BUTTON);
771     checkboxLayoutProps->UpdateMargin(marginCheckbox);
772     checkboxLayoutProps->UpdateUserDefinedIdealSize(CalcSize(CalcLength(CHECKBOX_SIZE), CalcLength(CHECKBOX_SIZE)));
773     checkbox->MarkModifyDone();
774     checkbox->MountToParent(contentRow);
775 
776     auto textNode = FrameNode::CreateFrameNode(
777         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
778     CHECK_NULL_VOID(textNode);
779     auto textLayoutProperty = textNode->GetLayoutProperty<TextLayoutProperty>();
780     CHECK_NULL_VOID(textLayoutProperty);
781     // the unicode encoding of chinese string of lunarSwitch.
782     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("datepicker.lunarSwitch"));
783     textLayoutProperty->UpdateFontSize(pickerTheme->GetLunarSwitchTextSize());
784     textLayoutProperty->UpdateTextColor(pickerTheme->GetLunarSwitchTextColor());
785     textNode->MarkModifyDone();
786     textNode->MountToParent(contentRow);
787 
788     contentRow->MountToParent(contentColumn);
789 }
790 
SetStartDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)791 void DatePickerDialogView::SetStartDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
792 {
793     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
794     CHECK_NULL_VOID(datePickerPattern);
795     datePickerPattern->SetStartDate(value);
796     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
797     CHECK_NULL_VOID(pickerProperty);
798     pickerProperty->UpdateStartDate(datePickerPattern->GetStartDateLunar());
799 }
800 
SetEndDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)801 void DatePickerDialogView::SetEndDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
802 {
803     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
804     CHECK_NULL_VOID(datePickerPattern);
805     datePickerPattern->SetEndDate(value);
806     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
807     CHECK_NULL_VOID(pickerProperty);
808     pickerProperty->UpdateEndDate(datePickerPattern->GetEndDateLunar());
809 }
810 
SetSelectedDate(const RefPtr<FrameNode> & frameNode,const PickerDate & value)811 void DatePickerDialogView::SetSelectedDate(const RefPtr<FrameNode>& frameNode, const PickerDate& value)
812 {
813     auto datePickerPattern = frameNode->GetPattern<DatePickerPattern>();
814     CHECK_NULL_VOID(datePickerPattern);
815     datePickerPattern->SetSelectDate(value);
816     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
817     CHECK_NULL_VOID(pickerProperty);
818     pickerProperty->UpdateSelectedDate(datePickerPattern->GetSelectDate());
819 }
820 
SetShowLunar(const RefPtr<FrameNode> & frameNode,bool lunar)821 void DatePickerDialogView::SetShowLunar(const RefPtr<FrameNode>& frameNode, bool lunar)
822 {
823     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
824     CHECK_NULL_VOID(pickerProperty);
825     pickerProperty->UpdateLunar(lunar);
826 }
827 
SetDialogChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)828 void DatePickerDialogView::SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
829 {
830     CHECK_NULL_VOID(frameNode);
831     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
832     CHECK_NULL_VOID(eventHub);
833     eventHub->SetDialogChange(std::move(onChange));
834 }
835 
SetDialogDateChange(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)836 void DatePickerDialogView::SetDialogDateChange(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
837 {
838     CHECK_NULL_VOID(frameNode);
839     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
840     CHECK_NULL_VOID(eventHub);
841     eventHub->SetDialogDateChange(std::move(onChange));
842 }
843 
SetDialogAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)844 void DatePickerDialogView::SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
845 {
846     CHECK_NULL_VOID(frameNode);
847     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
848     CHECK_NULL_VOID(eventHub);
849     eventHub->SetDialogAcceptEvent(std::move(onChange));
850 }
851 
SetDialogDateAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogEvent && onChange)852 void DatePickerDialogView::SetDialogDateAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogEvent&& onChange)
853 {
854     CHECK_NULL_VOID(frameNode);
855     auto eventHub = frameNode->GetEventHub<DatePickerEventHub>();
856     CHECK_NULL_VOID(eventHub);
857     eventHub->SetDialogDateAcceptEvent(std::move(onChange));
858 }
859 
SetDialogSwitchEvent(std::function<bool ()> switchEvent)860 void DatePickerDialogView::SetDialogSwitchEvent(std::function<bool()> switchEvent)
861 {
862     auto pipeline = PipelineContext::GetCurrentContext();
863     CHECK_NULL_VOID(pipeline);
864     auto overlayManger = pipeline->GetOverlayManager();
865     CHECK_NULL_VOID(overlayManger);
866     overlayManger->SetBackPressEvent(switchEvent);
867 }
868 
SetDateTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)869 void DatePickerDialogView::SetDateTextProperties(
870     const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
871 {
872     auto pipeline = PipelineContext::GetCurrentContext();
873     CHECK_NULL_VOID(pipeline);
874     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
875     CHECK_NULL_VOID(pickerTheme);
876     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
877     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
878     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
879     auto pickerProperty = frameNode->GetLayoutProperty<DataPickerRowLayoutProperty>();
880     CHECK_NULL_VOID(pickerProperty);
881 
882     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
883         pickerProperty->UpdateDisappearFontSize(properties.disappearTextStyle_.fontSize.value());
884     } else {
885         pickerProperty->UpdateDisappearFontSize(disappearStyle.GetFontSize());
886     }
887     pickerProperty->UpdateDisappearColor(
888         properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
889     pickerProperty->UpdateDisappearWeight(
890         properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
891     pickerProperty->UpdateDisappearFontFamily(
892         properties.disappearTextStyle_.fontFamily.value_or(disappearStyle.GetFontFamilies()));
893     pickerProperty->UpdateDisappearFontStyle(
894         properties.disappearTextStyle_.fontStyle.value_or(disappearStyle.GetFontStyle()));
895 
896     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
897         pickerProperty->UpdateFontSize(properties.normalTextStyle_.fontSize.value());
898     } else {
899         pickerProperty->UpdateFontSize(normalStyle.GetFontSize());
900     }
901     pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
902     pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
903     pickerProperty->UpdateFontFamily(properties.normalTextStyle_.fontFamily.value_or(normalStyle.GetFontFamilies()));
904     pickerProperty->UpdateFontStyle(properties.normalTextStyle_.fontStyle.value_or(normalStyle.GetFontStyle()));
905 
906     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
907         pickerProperty->UpdateSelectedFontSize(properties.selectedTextStyle_.fontSize.value());
908     } else {
909         pickerProperty->UpdateSelectedFontSize(selectedStyle.GetFontSize());
910     }
911     pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
912     pickerProperty->UpdateSelectedWeight(
913         properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
914     pickerProperty->UpdateSelectedFontFamily(
915         properties.selectedTextStyle_.fontFamily.value_or(selectedStyle.GetFontFamilies()));
916     pickerProperty->UpdateSelectedFontStyle(
917         properties.selectedTextStyle_.fontStyle.value_or(selectedStyle.GetFontStyle()));
918 }
919 
SetTimeTextProperties(const RefPtr<FrameNode> & frameNode,const PickerTextProperties & properties)920 void DatePickerDialogView::SetTimeTextProperties(
921     const RefPtr<FrameNode>& frameNode, const PickerTextProperties& properties)
922 {
923     auto pipeline = PipelineContext::GetCurrentContext();
924     CHECK_NULL_VOID(pipeline);
925     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
926     CHECK_NULL_VOID(pickerTheme);
927     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
928     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
929     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
930     auto pickerProperty = frameNode->GetLayoutProperty<TimePickerLayoutProperty>();
931     CHECK_NULL_VOID(pickerProperty);
932 
933     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
934         pickerProperty->UpdateDisappearFontSize(properties.disappearTextStyle_.fontSize.value());
935     } else {
936         pickerProperty->UpdateDisappearFontSize(disappearStyle.GetFontSize());
937     }
938     pickerProperty->UpdateDisappearColor(
939         properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
940     pickerProperty->UpdateDisappearWeight(
941         properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
942 
943     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
944         pickerProperty->UpdateFontSize(properties.normalTextStyle_.fontSize.value());
945     } else {
946         pickerProperty->UpdateFontSize(normalStyle.GetFontSize());
947     }
948     pickerProperty->UpdateColor(properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
949     pickerProperty->UpdateWeight(properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
950 
951     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
952         pickerProperty->UpdateSelectedFontSize(properties.selectedTextStyle_.fontSize.value());
953     } else {
954         pickerProperty->UpdateSelectedFontSize(selectedStyle.GetFontSize());
955     }
956     pickerProperty->UpdateSelectedColor(properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
957     pickerProperty->UpdateSelectedWeight(
958         properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
959 }
960 
SetTitleMouseHoverEvent(const RefPtr<FrameNode> & titleRow)961 void DatePickerDialogView::SetTitleMouseHoverEvent(const RefPtr<FrameNode>& titleRow)
962 {
963     auto titleButtonNode = AceType::DynamicCast<FrameNode>(titleRow->GetFirstChild());
964     CHECK_NULL_VOID(titleButtonNode);
965     auto eventHub = titleButtonNode->GetEventHub<EventHub>();
966     CHECK_NULL_VOID(eventHub);
967     auto inputHub = eventHub->GetOrCreateInputEventHub();
968     auto mouseTask = [titleButtonNode](bool isHover) {
969         HandleMouseEvent(titleButtonNode, isHover);
970     };
971     auto mouseEvent = AceType::MakeRefPtr<InputEvent>(std::move(mouseTask));
972     CHECK_NULL_VOID(mouseEvent);
973     inputHub->AddOnHoverEvent(mouseEvent);
974 }
975 
HandleMouseEvent(const RefPtr<FrameNode> & titleButton,bool isHover)976 void DatePickerDialogView::HandleMouseEvent(const RefPtr<FrameNode>& titleButton, bool isHover)
977 {
978     if (isHover) {
979         auto pipeline = PipelineBase::GetCurrentContext();
980         CHECK_NULL_VOID(pipeline);
981         auto theme = pipeline->GetTheme<PickerTheme>();
982         CHECK_NULL_VOID(theme);
983         PlayHoverAnimation(titleButton, theme->GetHoverColor());
984     } else {
985         PlayHoverAnimation(titleButton, Color::TRANSPARENT);
986     }
987 }
988 
PlayHoverAnimation(const RefPtr<FrameNode> & titleButton,const Color & color)989 void DatePickerDialogView::PlayHoverAnimation(const RefPtr<FrameNode>& titleButton, const Color& color)
990 {
991     AnimationOption option = AnimationOption();
992     option.SetDuration(HOVER_ANIMATION_DURATION);
993     option.SetCurve(Curves::FRICTION);
994     option.SetFillMode(FillMode::FORWARDS);
995     AnimationUtils::Animate(option, [titleButton, color]() {
996         auto buttonTitleNode = AceType::DynamicCast<FrameNode>(titleButton);
997         CHECK_NULL_VOID(buttonTitleNode);
998         auto buttonTitleRenderContext = buttonTitleNode->GetRenderContext();
999         buttonTitleRenderContext->UpdateBackgroundColor(color);
1000         buttonTitleNode->MarkDirtyNode();
1001     });
1002 }
1003 } // namespace OHOS::Ace::NG
1004