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