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