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