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