• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "core/components_ng/pattern/text_picker/textpicker_dialog_view.h"
17 
18 #include <securec.h>
19 
20 #include "base/i18n/localization.h"
21 #include "base/utils/utils.h"
22 #include "core/common/recorder/event_recorder.h"
23 #include "core/components_ng/base/view_abstract_model.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/dialog/dialog_view.h"
27 #include "core/components_ng/pattern/divider/divider_pattern.h"
28 #include "core/components_ng/pattern/dialog/dialog_pattern.h"
29 #include "core/components_ng/pattern/image/image_pattern.h"
30 #include "core/components_ng/pattern/stack/stack_pattern.h"
31 #include "core/components_ng/pattern/text/text_pattern.h"
32 #include "core/components_ng/pattern/text_picker/textpicker_column_pattern.h"
33 #include "core/components_ng/pattern/text_picker/textpicker_event_hub.h"
34 #include "core/components_ng/pattern/text_picker/textpicker_pattern.h"
35 #include "core/components_v2/inspector/inspector_constants.h"
36 #include "core/pipeline_ng/pipeline_context.h"
37 
38 namespace OHOS::Ace::NG {
39 namespace {
40 const int32_t BUFFER_NODE_NUMBER = 2;
41 const int32_t SECOND_DIVEDER_NODE_INDEX = 3;
42 const int32_t THIRD_DIVEDER_NODE_INDEX = 5;
43 const int32_t BACKWARD_BUTTON_DIVEDER_INDEX = 2;
44 const int32_t FORWAED_BUTTON_DIVEDER_INDEX = 4;
45 const int32_t CONFIRM_BUTTON_DIVEDER_INDEX = 6;
46 constexpr size_t ACCEPT_BUTTON_INDEX = 0;
47 constexpr size_t CANCEL_BUTTON_INDEX = 1;
48 constexpr size_t BACKWARD_BUTTON_INDEX = 2;
49 constexpr size_t FORWAED_BUTTON_INDEX = 3;
50 } // namespace
51 
52 WeakPtr<FrameNode> TextPickerDialogView::dialogNode_ = nullptr;
53 uint32_t dialogNodePage = 0;
54 uint32_t totalPageNum_ = 0;
55 Dimension TextPickerDialogView::selectedTextStyleFont_ = 40.0_vp;
56 Dimension TextPickerDialogView::normalTextStyleFont_ = 32.0_vp;
57 Dimension TextPickerDialogView::disappearTextStyleFont_ = 28.0_vp;
58 
Show(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent)59 RefPtr<FrameNode> TextPickerDialogView::Show(const DialogProperties& dialogProperties,
60     const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
61     std::map<std::string, NG::DialogTextEvent> dialogEvent,
62     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent)
63 {
64     if (settingData.rangeVector.empty() && settingData.options.empty()) {
65         return nullptr;
66     }
67     GetUserSettingLimit();
68     if (settingData.options.empty()) {
69         return RangeShow(dialogProperties, settingData, buttonInfos, dialogEvent, dialogCancelEvent);
70     } else {
71         return OptionsShow(dialogProperties, settingData, buttonInfos, dialogEvent, dialogCancelEvent);
72     }
73 }
74 
RangeShow(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent)75 RefPtr<FrameNode> TextPickerDialogView::RangeShow(const DialogProperties& dialogProperties,
76     const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
77     std::map<std::string, NG::DialogTextEvent>& dialogEvent,
78     std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent)
79 {
80     auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
81         AceType::MakeRefPtr<LinearLayoutPattern>(true));
82     auto textNodeId = ElementRegister::GetInstance()->MakeUniqueId();
83     auto textPickerNode = FrameNode::GetOrCreateFrameNode(
84         V2::TEXT_PICKER_ETS_TAG, textNodeId, []() { return AceType::MakeRefPtr<TextPickerPattern>(); });
85     ViewStackProcessor::GetInstance()->Push(textPickerNode);
86     auto textPickerPattern = textPickerNode->GetPattern<TextPickerPattern>();
87     CHECK_NULL_RETURN(textPickerPattern, nullptr);
88     textPickerPattern->SetColumnsKind(settingData.columnKind);
89     textPickerPattern->SetIsShowInDialog(true);
90     textPickerPattern->SetPickerTag(false);
91     textPickerPattern->SetTextProperties(settingData.properties);
92     auto context = textPickerNode->GetContext();
93     CHECK_NULL_RETURN(context, nullptr);
94     auto themeManager = context->GetThemeManager();
95     CHECK_NULL_RETURN(themeManager, nullptr);
96     auto dialogTheme = themeManager->GetTheme<DialogTheme>();
97     CHECK_NULL_RETURN(dialogTheme, nullptr);
98     textPickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
99     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
100     CHECK_NULL_RETURN(pickerTheme, nullptr);
101     auto pickerNodeLayout = textPickerNode->GetLayoutProperty<TextPickerLayoutProperty>();
102     CHECK_NULL_RETURN(pickerNodeLayout, nullptr);
103     pickerNodeLayout->UpdateUserDefinedIdealSize(
104         CalcSize(NG::CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), std::nullopt));
105     pickerNodeLayout->UpdateCanLoop(settingData.canLoop);
106     pickerNodeLayout->UpdateDisableTextStyleAnimation(settingData.isDisableTextStyleAnimation);
107     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
108     OptionsCreateNode(textPickerPattern, settingData, textPickerNode, showCount, 1, pickerTheme);
109     SetDefaultPickerItemHeight(settingData.height);
110     SetTextProperties(pickerTheme, settingData.properties);
111     auto changeEvent = dialogEvent["changeId"];
112     SetDialogChange(textPickerNode, std::move(changeEvent));
113     auto scrollStopEvent = dialogEvent["scrollStopId"];
114     SetDialogScrollStop(textPickerNode, std::move(scrollStopEvent));
115     ViewStackProcessor::GetInstance()->Finish();
116     textPickerNode->MountToParent(contentColumn);
117     auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
118     CHECK_NULL_RETURN(dialogNode, nullptr);
119     auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
120     CHECK_NULL_RETURN(dialogPattern, nullptr);
121     dialogPattern->SetIsPickerDialog(true);
122     auto closeDialogEvent = CloseDialogEvent(textPickerPattern, dialogNode);
123     auto closeCallback = [func = std::move(closeDialogEvent)](const GestureEvent& /* info */) {
124         func();
125     };
126 
127     auto contentRow =
128         CreateButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent), closeCallback);
129     textPickerPattern->SetContentRowNode(contentRow);
130     contentRow->SetNeedCallChildrenUpdate(false);
131     contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
132     contentRow->MountToParent(contentColumn);
133     auto focusHub = contentColumn->GetFocusHub();
134     CHECK_NULL_RETURN(focusHub, nullptr);
135     InitOnKeyEvent(focusHub);
136     dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
137     dialogNode_ = dialogNode;
138     return dialogNode;
139 }
140 
CloseDialogEvent(const RefPtr<TextPickerPattern> & textPickerPattern,const RefPtr<FrameNode> & dialogNode)141 std::function<void()> TextPickerDialogView::CloseDialogEvent(const RefPtr<TextPickerPattern>& textPickerPattern,
142     const RefPtr<FrameNode>& dialogNode)
143 {
144     auto event = [weak = WeakPtr<FrameNode>(dialogNode),
145         weakPattern = WeakPtr<TextPickerPattern>(textPickerPattern)]() {
146         auto dialogNode = weak.Upgrade();
147         CHECK_NULL_VOID(dialogNode);
148         auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
149         CHECK_NULL_VOID(dialogPattern);
150         dialogPattern->SetIsPickerDialog(false);
151         auto textPickerPattern = weakPattern.Upgrade();
152         CHECK_NULL_VOID(textPickerPattern);
153         if (textPickerPattern->GetIsShowInDialog()) {
154             auto pipeline = dialogNode->GetContext();
155             CHECK_NULL_VOID(pipeline);
156             auto overlayManager = pipeline->GetOverlayManager();
157             CHECK_NULL_VOID(overlayManager);
158             overlayManager->CloseDialog(dialogNode);
159             textPickerPattern->SetIsShowInDialog(false);
160         }
161     };
162     textPickerPattern->updateFontConfigurationEvent(event);
163     return event;
164 }
165 
OptionsCreateNode(const RefPtr<TextPickerPattern> & textPickerPattern,const TextPickerSettingData & settingData,const RefPtr<FrameNode> & textPickerNode,uint32_t showCount,uint32_t columnCount,RefPtr<PickerTheme> pickerTheme)166 void TextPickerDialogView::OptionsCreateNode(const RefPtr<TextPickerPattern>& textPickerPattern,
167     const TextPickerSettingData& settingData, const RefPtr<FrameNode>& textPickerNode, uint32_t showCount,
168     uint32_t columnCount, RefPtr<PickerTheme> pickerTheme)
169 {
170     totalPageNum_ = columnCount;
171     if (textPickerNode->GetChildren().empty()) {
172         for (size_t i = 0; i < columnCount; i++) {
173             auto columnNode = CreateColumnNode(settingData.columnKind,
174                 showCount, pickerTheme);
175             auto stackNode = CreateStackNode(pickerTheme);
176             auto buttonNode = CreateButtonNode();
177             auto columnBlendNode = CreateColumnNode();
178             buttonNode->MountToParent(stackNode);
179             columnNode->MountToParent(columnBlendNode);
180             columnBlendNode->MountToParent(stackNode);
181             columnNode->MarkModifyDone();
182             columnNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
183             auto layoutProperty = stackNode->GetLayoutProperty<LayoutProperty>();
184             layoutProperty->UpdateAlignment(Alignment::CENTER);
185             layoutProperty->UpdateLayoutWeight(1);
186             stackNode->MountToParent(textPickerNode);
187         }
188     }
189     if (settingData.options.size() > 0) {
190         SetSelectedValues(textPickerPattern, settingData.selectedValues);
191         SetValues(textPickerPattern, settingData.values);
192     } else {
193         SetRange(textPickerPattern, settingData.rangeVector);
194         SetSelected(textPickerPattern, settingData.selected);
195     }
196 }
197 
OptionsShowInternal(const RefPtr<TextPickerPattern> & textPickerPattern,const TextPickerSettingData & settingData,const RefPtr<FrameNode> & textPickerNode,uint32_t showCount,RefPtr<PickerTheme> pickerTheme)198 void TextPickerDialogView::OptionsShowInternal(const RefPtr<TextPickerPattern>& textPickerPattern,
199     const TextPickerSettingData& settingData, const RefPtr<FrameNode>& textPickerNode, uint32_t showCount,
200     RefPtr<PickerTheme> pickerTheme)
201 {
202     textPickerPattern->SetIsCascade(settingData.attr.isCascade);
203     textPickerPattern->SetHasSelectAttr(settingData.attr.isHasSelectAttr);
204     textPickerPattern->SetColumnsKind(settingData.columnKind);
205     if (settingData.attr.isCascade) {
206         std::vector<NG::TextCascadePickerOptions> reOptions;
207         uint32_t columnCount = settingData.options.empty() ? 0 : 1;
208         // Caculate max depth
209         for (size_t i = 0; i < settingData.options.size(); i++) {
210             size_t tmp = textPickerPattern->ProcessCascadeOptionDepth(settingData.options[i]);
211             if (tmp > columnCount) {
212                 columnCount = tmp;
213             }
214         }
215         OptionsCreateNode(textPickerPattern, settingData, textPickerNode, showCount, columnCount, pickerTheme);
216         textPickerPattern->ProcessCascadeOptions(settingData.options, reOptions, 0);
217         if (reOptions.size() < columnCount) {
218             auto differ = columnCount - reOptions.size();
219             for (uint32_t i = 0; i < differ; i++) {
220                 NG::TextCascadePickerOptions differOption;
221                 memset_s(&differOption, sizeof(differOption), 0, sizeof(differOption));
222                 reOptions.emplace_back(differOption);
223             }
224         }
225         textPickerPattern->SetCascadeOptions(settingData.options, reOptions);
226     } else {
227         OptionsCreateNode(
228             textPickerPattern, settingData, textPickerNode, showCount, settingData.options.size(), pickerTheme);
229         textPickerPattern->SetCascadeOptions(settingData.options, settingData.options);
230     }
231 }
232 
OptionsShow(const DialogProperties & dialogProperties,const TextPickerSettingData & settingData,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent)233 RefPtr<FrameNode> TextPickerDialogView::OptionsShow(const DialogProperties& dialogProperties,
234     const TextPickerSettingData& settingData, const std::vector<ButtonInfo>& buttonInfos,
235     std::map<std::string, NG::DialogTextEvent>& dialogEvent,
236     std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent)
237 {
238     auto contentColumn = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
239         AceType::MakeRefPtr<LinearLayoutPattern>(true));
240     auto textNodeId = ElementRegister::GetInstance()->MakeUniqueId();
241     auto textPickerNode = FrameNode::GetOrCreateFrameNode(
242         V2::TEXT_PICKER_ETS_TAG, textNodeId, []() { return AceType::MakeRefPtr<TextPickerPattern>(); });
243     ViewStackProcessor::GetInstance()->Push(textPickerNode);
244     auto textPickerPattern = textPickerNode->GetPattern<TextPickerPattern>();
245     CHECK_NULL_RETURN(textPickerPattern, nullptr);
246     textPickerPattern->SetIsShowInDialog(true);
247     textPickerPattern->SetPickerTag(false);
248     textPickerPattern->SetTextProperties(settingData.properties);
249     auto context = textPickerNode->GetContext();
250     CHECK_NULL_RETURN(context, nullptr);
251     auto themeManager = context->GetThemeManager();
252     CHECK_NULL_RETURN(themeManager, nullptr);
253     auto dialogTheme = themeManager->GetTheme<DialogTheme>();
254     CHECK_NULL_RETURN(dialogTheme, nullptr);
255     textPickerPattern->SetBackgroundColor(dialogTheme->GetBackgroundColor());
256     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
257     CHECK_NULL_RETURN(pickerTheme, nullptr);
258     auto pickerNodeLayout = textPickerNode->GetLayoutProperty<TextPickerLayoutProperty>();
259     CHECK_NULL_RETURN(pickerNodeLayout, nullptr);
260     pickerNodeLayout->UpdateUserDefinedIdealSize(
261         CalcSize(NG::CalcLength(Dimension(1.0, DimensionUnit::PERCENT)), std::nullopt));
262     pickerNodeLayout->UpdateCanLoop(settingData.canLoop);
263     pickerNodeLayout->UpdateDisableTextStyleAnimation(settingData.isDisableTextStyleAnimation);
264     uint32_t showCount = pickerTheme->GetShowOptionCount() + BUFFER_NODE_NUMBER;
265     OptionsShowInternal(textPickerPattern, settingData, textPickerNode, showCount, pickerTheme);
266     SetDefaultPickerItemHeight(settingData.height);
267     SetTextProperties(pickerTheme, settingData.properties);
268     auto changeEvent = dialogEvent["changeId"];
269     SetDialogChange(textPickerNode, std::move(changeEvent));
270     auto scrollStopEvent = dialogEvent["scrollStopId"];
271     SetDialogScrollStop(textPickerNode, std::move(scrollStopEvent));
272 
273     ViewStackProcessor::GetInstance()->Finish();
274     textPickerNode->MountToParent(contentColumn);
275     auto dialogNode = DialogView::CreateDialogNode(dialogProperties, contentColumn);
276     CHECK_NULL_RETURN(dialogNode, nullptr);
277     auto dialogPattern = dialogNode->GetPattern<DialogPattern>();
278     CHECK_NULL_RETURN(dialogPattern, nullptr);
279     dialogPattern->SetIsPickerDialog(true);
280 
281     auto closeDialogEvent = CloseDialogEvent(textPickerPattern, dialogNode);
282     auto closeCallBack = [func = std::move(closeDialogEvent)](const GestureEvent& /* info */) {
283         func();
284     };
285 
286     auto pipeline = PipelineContext::GetCurrentContextSafely();
287     CHECK_NULL_RETURN(pipeline, nullptr);
288     float scale = pipeline->GetFontScale();
289     if (NeedAdaptForAging()) {
290         dialogNode = SeparatedOptionsShow(contentColumn, textPickerNode, buttonInfos, settingData,
291             dialogEvent, dialogCancelEvent, scale, closeCallBack, dialogNode);
292         return dialogNode;
293     }
294 
295     auto contentRow =
296         CreateButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent), closeCallBack);
297     contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
298     contentRow->MountToParent(contentColumn);
299     dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
300     return dialogNode;
301 }
302 
CreateIconItemNode(RefPtr<PickerTheme> pickerTheme)303 RefPtr<FrameNode> TextPickerDialogView::CreateIconItemNode(RefPtr<PickerTheme> pickerTheme)
304 {
305     auto row = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
306         AceType::MakeRefPtr<LinearLayoutPattern>(false));
307     CHECK_NULL_RETURN(row, nullptr);
308     auto layoutProps = row->GetLayoutProperty<LinearLayoutProperty>();
309     CHECK_NULL_RETURN(layoutProps, nullptr);
310     layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
311     layoutProps->UpdateCrossAxisAlign(FlexAlign::CENTER);
312 
313     MarginProperty marginProperty;
314     marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
315     marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
316     layoutProps->UpdateMargin(marginProperty);
317 
318     auto imageNode = FrameNode::CreateFrameNode(
319         V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
320     CHECK_NULL_RETURN(imageNode, nullptr);
321     imageNode->MountToParent(row);
322 
323     return row;
324 }
CreateTextItemNode(RefPtr<PickerTheme> pickerTheme)325 RefPtr<FrameNode> TextPickerDialogView::CreateTextItemNode(RefPtr<PickerTheme> pickerTheme)
326 {
327     auto textNode = FrameNode::CreateFrameNode(
328         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
329     CHECK_NULL_RETURN(textNode, nullptr);
330     auto textLayout = textNode->GetLayoutProperty<TextLayoutProperty>();
331     MarginProperty marginProperty;
332     marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
333     marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
334     textLayout->UpdateMargin(marginProperty);
335     return textNode;
336 }
CreateMixtureItemNode(RefPtr<PickerTheme> pickerTheme)337 RefPtr<FrameNode> TextPickerDialogView::CreateMixtureItemNode(RefPtr<PickerTheme> pickerTheme)
338 {
339     auto row = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
340         AceType::MakeRefPtr<LinearLayoutPattern>(false));
341     CHECK_NULL_RETURN(row, nullptr);
342 
343     auto rowProperty = row->GetLayoutProperty<LinearLayoutProperty>();
344     MarginProperty marginProperty;
345     marginProperty.left = CalcLength(pickerTheme->GetPaddingHorizontal());
346     marginProperty.right = CalcLength(pickerTheme->GetPaddingHorizontal());
347     rowProperty->UpdateMargin(marginProperty);
348 
349     auto imageNode = FrameNode::CreateFrameNode(
350         V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
351     CHECK_NULL_RETURN(imageNode, nullptr);
352     imageNode->MountToParent(row);
353 
354     auto textNode = FrameNode::CreateFrameNode(
355         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
356     CHECK_NULL_RETURN(textNode, nullptr);
357     textNode->MountToParent(row);
358 
359     return row;
360 }
361 
CreateColumnNode(uint32_t columnKind,uint32_t showCount,RefPtr<PickerTheme> pickerTheme)362 RefPtr<FrameNode> TextPickerDialogView::CreateColumnNode(
363     uint32_t columnKind, uint32_t showCount, RefPtr<PickerTheme> pickerTheme)
364 {
365     auto columnNode =
366         FrameNode::GetOrCreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
367             []() { return AceType::MakeRefPtr<TextPickerColumnPattern>(); });
368 
369     if (columnKind == ICON) {
370         for (uint32_t index = 0; index < showCount; index++) {
371             auto row = CreateIconItemNode(pickerTheme);
372             CHECK_NULL_RETURN(row, nullptr);
373             row->MountToParent(columnNode);
374         }
375     } else if (columnKind == TEXT) {
376         for (uint32_t index = 0; index < showCount; index++) {
377             auto textNode = CreateTextItemNode(pickerTheme);
378             CHECK_NULL_RETURN(textNode, nullptr);
379             textNode->MountToParent(columnNode);
380         }
381     } else if (columnKind == MIXTURE) {
382         for (uint32_t index = 0; index < showCount; index++) {
383             auto row = CreateMixtureItemNode(pickerTheme);
384             CHECK_NULL_RETURN(row, nullptr);
385             row->MountToParent(columnNode);
386         }
387     }
388     return columnNode;
389 }
390 
CreateStackNode(RefPtr<PickerTheme> pickerTheme)391 RefPtr<FrameNode> TextPickerDialogView::CreateStackNode(RefPtr<PickerTheme> pickerTheme)
392 {
393     auto stackId = ElementRegister::GetInstance()->MakeUniqueId();
394     auto stackNode = FrameNode::GetOrCreateFrameNode(
395         V2::STACK_ETS_TAG, stackId, []() { return AceType::MakeRefPtr<StackPattern>(); });
396 
397     auto stackLayout = stackNode->GetLayoutProperty<LayoutProperty>();
398     MarginProperty marginProperty;
399     marginProperty.top = CalcLength(pickerTheme->GetContentMarginVertical());
400     marginProperty.bottom = CalcLength(pickerTheme->GetContentMarginVertical());
401     stackLayout->UpdateMargin(marginProperty);
402     return stackNode;
403 }
404 
CreateColumnNode()405 RefPtr<FrameNode> TextPickerDialogView::CreateColumnNode()
406 {
407     auto columnId = ElementRegister::GetInstance()->MakeUniqueId();
408     return FrameNode::GetOrCreateFrameNode(
409         V2::COLUMN_ETS_TAG, columnId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
410 }
411 
CreateButtonNode()412 RefPtr<FrameNode> TextPickerDialogView::CreateButtonNode()
413 {
414     auto buttonId = ElementRegister::GetInstance()->MakeUniqueId();
415     return FrameNode::GetOrCreateFrameNode(
416         V2::BUTTON_ETS_TAG, buttonId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
417 }
418 
CreateDividerNode(const RefPtr<FrameNode> & dateNode)419 RefPtr<FrameNode> TextPickerDialogView::CreateDividerNode(const RefPtr<FrameNode>& dateNode)
420 {
421     auto pipeline = PipelineContext::GetCurrentContext();
422     CHECK_NULL_RETURN(pipeline, nullptr);
423     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
424     auto dividerNode = FrameNode::GetOrCreateFrameNode(V2::DIVIDER_ETS_TAG,
425         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<DividerPattern>(); });
426     CHECK_NULL_RETURN(dividerNode, nullptr);
427 
428     auto dividerPaintProps = dividerNode->GetPaintProperty<DividerRenderProperty>();
429     CHECK_NULL_RETURN(dividerPaintProps, nullptr);
430     dividerPaintProps->UpdateDividerColor(dialogTheme->GetDividerColor());
431 
432     auto dividerLayoutProps = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
433     CHECK_NULL_RETURN(dividerLayoutProps, nullptr);
434     dividerLayoutProps->UpdateVertical(true);
435     dividerLayoutProps->UpdateUserDefinedIdealSize(
436         CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
437     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
438         MarginProperty margin;
439         margin.top = CalcLength(dialogTheme->GetDividerHeight());
440         margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
441         dividerLayoutProps->UpdateMargin(margin);
442         dividerLayoutProps->UpdateUserDefinedIdealSize(
443             CalcSize(CalcLength(dialogTheme->GetDividerWidth()), CalcLength(dialogTheme->GetDividerHeight())));
444     } else {
445         auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
446         auto dividerWrapper = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG,
447             ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<LinearLayoutPattern>(false));
448         CHECK_NULL_RETURN(dividerWrapper, nullptr);
449         auto layoutProps = dividerWrapper->GetLayoutProperty<LinearLayoutProperty>();
450         CHECK_NULL_RETURN(layoutProps, nullptr);
451         MarginProperty margin;
452         margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
453         margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
454         layoutProps->UpdateMargin(margin);
455         layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
456         layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
457         layoutProps->UpdateUserDefinedIdealSize(CalcSize(
458             CalcLength(dialogTheme->GetActionsPadding().Bottom()), CalcLength(buttonTheme->GetHeight())));
459         dividerNode->MountToParent(dividerWrapper);
460         return dividerWrapper;
461     }
462 
463     return dividerNode;
464 }
465 
CreateButtonNode(const RefPtr<FrameNode> & frameNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent,GestureEventFunc callback)466 RefPtr<FrameNode> TextPickerDialogView::CreateButtonNode(const RefPtr<FrameNode>& frameNode,
467     const std::vector<ButtonInfo>& buttonInfos, std::map<std::string, NG::DialogTextEvent> dialogEvent,
468     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent, GestureEventFunc callback)
469 {
470     auto acceptEvent = dialogEvent["acceptId"];
471     auto cancelEvent = dialogCancelEvent["cancelId"];
472     auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
473         AceType::MakeRefPtr<LinearLayoutPattern>(false));
474     CHECK_NULL_RETURN(contentRow, nullptr);
475     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
476     CHECK_NULL_RETURN(layoutProps, nullptr);
477     layoutProps->UpdateMainAxisAlign(FlexAlign::SPACE_AROUND);
478     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
479 
480     auto buttonCancelNode = CreateCancelNode(cancelEvent, frameNode, buttonInfos);
481     auto buttonConfirmNode = CreateConfirmNode(frameNode, frameNode, buttonInfos, acceptEvent);
482 
483     buttonCancelNode->MountToParent(contentRow);
484     buttonConfirmNode->MountToParent(contentRow);
485 
486     auto onClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(callback));
487     for (const auto& child : contentRow->GetChildren()) {
488         auto childNode = AceType::DynamicCast<FrameNode>(child);
489         CHECK_NULL_RETURN(childNode, nullptr);
490         auto gestureHub = childNode->GetOrCreateGestureEventHub();
491         CHECK_NULL_RETURN(gestureHub, nullptr);
492         gestureHub->AddClickEvent(onClick);
493     }
494 
495     return contentRow;
496 }
497 
UpdateButtonConfirmLayoutProperty(const RefPtr<FrameNode> & buttonConfirmNode,RefPtr<PickerTheme> pickerTheme)498 void TextPickerDialogView::UpdateButtonConfirmLayoutProperty(const RefPtr<FrameNode>& buttonConfirmNode,
499     RefPtr<PickerTheme> pickerTheme)
500 {
501     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
502     CHECK_NULL_VOID(buttonConfirmLayoutProperty);
503     buttonConfirmLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.ok"));
504     buttonConfirmLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
505     buttonConfirmLayoutProperty->UpdateType(ButtonType::CAPSULE);
506     buttonConfirmLayoutProperty->UpdateFlexShrink(1.0);
507     auto pipeline = PipelineBase::GetCurrentContext();
508     CHECK_NULL_VOID(pipeline);
509     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
510     CHECK_NULL_VOID(dialogTheme);
511     UpdateConfirmButtonMargin(buttonConfirmNode, dialogTheme);
512     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
513         buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
514             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
515     } else {
516         auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
517         CHECK_NULL_VOID(buttonTheme);
518         buttonConfirmLayoutProperty->UpdateUserDefinedIdealSize(
519             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
520     }
521 }
522 
CreateConfirmNode(const RefPtr<FrameNode> & dateNode,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos,DialogEvent & acceptEvent)523 RefPtr<FrameNode> TextPickerDialogView::CreateConfirmNode(const RefPtr<FrameNode>& dateNode,
524     const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos, DialogEvent& acceptEvent)
525 {
526     auto pipeline = PipelineContext::GetCurrentContext();
527     CHECK_NULL_RETURN(pipeline, nullptr);
528     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
529     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
530     auto buttonConfirmNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
531         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
532     auto textConfirmNode = FrameNode::CreateFrameNode(
533         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
534     CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
535     CHECK_NULL_RETURN(textConfirmNode, nullptr);
536     UpdateConfirmButtonTextLayoutProperty(textConfirmNode, pickerTheme);
537     auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
538     textPattern->SetConfirmNode(buttonConfirmNode);
539     auto buttonConfirmEventHub = buttonConfirmNode->GetEventHub<ButtonEventHub>();
540     CHECK_NULL_RETURN(buttonConfirmEventHub, nullptr);
541     buttonConfirmEventHub->SetStateEffect(true);
542     UpdateButtonConfirmLayoutProperty(buttonConfirmNode, pickerTheme);
543     auto buttonConfirmRenderContext = buttonConfirmNode->GetRenderContext();
544     buttonConfirmRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
545     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<ButtonLayoutProperty>();
546     CHECK_NULL_RETURN(buttonConfirmLayoutProperty, nullptr);
547     UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonConfirmLayoutProperty, buttonConfirmRenderContext);
548     UpdateButtonDefaultFocus(buttonInfos, buttonConfirmNode, true);
549 
550     textConfirmNode->MountToParent(buttonConfirmNode);
551     auto eventConfirmHub = buttonConfirmNode->GetOrCreateGestureEventHub();
552     CHECK_NULL_RETURN(eventConfirmHub, nullptr);
553     CHECK_NULL_RETURN(dateNode, nullptr);
554     SetDialogAcceptEvent(dateNode, std::move(acceptEvent));
555     auto clickCallback = [weak = WeakPtr<FrameNode>(dateNode)](const GestureEvent& /* info */) {
556         auto dateNode = weak.Upgrade();
557         CHECK_NULL_VOID(dateNode);
558         auto pickerPattern = dateNode->GetPattern<TextPickerPattern>();
559         CHECK_NULL_VOID(pickerPattern);
560         auto str = pickerPattern->GetSelectedObject(false);
561         auto textPickerEventHub = pickerPattern->GetEventHub<TextPickerEventHub>();
562         CHECK_NULL_VOID(textPickerEventHub);
563         textPickerEventHub->FireDialogAcceptEvent(str);
564         if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
565             Recorder::EventParamsBuilder builder;
566             builder.SetType(dateNode->GetTag()).SetEventType(Recorder::EventType::DIALOG_ACCEPT).SetText(str);
567             Recorder::EventRecorder::Get().OnEvent(std::move(builder));
568         }
569     };
570     eventConfirmHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(clickCallback));
571     buttonConfirmNode->MarkModifyDone();
572     return buttonConfirmNode;
573 }
574 
UpdateConfirmButtonTextLayoutProperty(const RefPtr<FrameNode> & textConfirmNode,const RefPtr<PickerTheme> & pickerTheme)575 void TextPickerDialogView::UpdateConfirmButtonTextLayoutProperty(
576     const RefPtr<FrameNode>& textConfirmNode, const RefPtr<PickerTheme>& pickerTheme)
577 {
578     auto textLayoutProperty = textConfirmNode->GetLayoutProperty<TextLayoutProperty>();
579     CHECK_NULL_VOID(textLayoutProperty);
580     textLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.ok"));
581     textLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
582     if (!NeedAdaptForAging()) {
583         textLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
584     }
585     textLayoutProperty->UpdateFontSize(
586         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
587     textLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
588 }
589 
UpdateCancelButtonTextLayoutProperty(const RefPtr<FrameNode> & textCancelNode,const RefPtr<PickerTheme> & pickerTheme)590 void TextPickerDialogView::UpdateCancelButtonTextLayoutProperty(
591     const RefPtr<FrameNode>& textCancelNode, const RefPtr<PickerTheme>& pickerTheme)
592 {
593     auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
594     CHECK_NULL_VOID(textCancelLayoutProperty);
595     textCancelLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.cancel"));
596     textCancelLayoutProperty->UpdateTextColor(pickerTheme->GetOptionStyle(true, false).GetTextColor());
597     if (!NeedAdaptForAging()) {
598         textCancelLayoutProperty->UpdateMaxFontScale(pickerTheme->GetNormalFontScale());
599     }
600     textCancelLayoutProperty->UpdateFontSize(
601         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
602     textCancelLayoutProperty->UpdateFontWeight(pickerTheme->GetOptionStyle(true, false).GetFontWeight());
603 }
604 
UpdateForwardButtonTextLayoutProperty(const RefPtr<FrameNode> & textForwardNode,const RefPtr<PickerTheme> & pickerTheme)605 void TextPickerDialogView::UpdateForwardButtonTextLayoutProperty(
606     const RefPtr<FrameNode>& textForwardNode, const RefPtr<PickerTheme>& pickerTheme)
607 {
608     auto textForwardLayoutProperty = textForwardNode->GetLayoutProperty<TextLayoutProperty>();
609     CHECK_NULL_VOID(textForwardLayoutProperty);
610     auto pickerThemeOptionStyle = pickerTheme->GetOptionStyle(true, false);
611     textForwardLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.next"));
612     textForwardLayoutProperty->UpdateTextColor(pickerThemeOptionStyle.GetTextColor());
613     textForwardLayoutProperty->UpdateFontSize(
614         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
615     textForwardLayoutProperty->UpdateFontWeight(pickerThemeOptionStyle.GetFontWeight());
616 }
617 
UpdateBackwardButtonTextLayoutProperty(const RefPtr<FrameNode> & textBackwardNode,const RefPtr<PickerTheme> & pickerTheme)618 void TextPickerDialogView::UpdateBackwardButtonTextLayoutProperty(
619     const RefPtr<FrameNode>& textBackwardNode, const RefPtr<PickerTheme>& pickerTheme)
620 {
621     auto textBackwardLayoutProperty = textBackwardNode->GetLayoutProperty<TextLayoutProperty>();
622     CHECK_NULL_VOID(textBackwardLayoutProperty);
623     auto pickerThemeOptionStyle = pickerTheme->GetOptionStyle(true, false);
624     textBackwardLayoutProperty->UpdateContent(Localization::GetInstance()->GetEntryLetters("common.prev"));
625     textBackwardLayoutProperty->UpdateTextColor(pickerThemeOptionStyle.GetTextColor());
626     textBackwardLayoutProperty->UpdateFontSize(
627         ConvertFontScaleValue(pickerTheme->GetOptionStyle(false, false).GetFontSize()));
628     textBackwardLayoutProperty->UpdateFontWeight(pickerThemeOptionStyle.GetFontWeight());
629 }
630 
UpdateConfirmButtonMargin(const RefPtr<FrameNode> & buttonConfirmNode,const RefPtr<DialogTheme> & dialogTheme)631 void TextPickerDialogView::UpdateConfirmButtonMargin(
632     const RefPtr<FrameNode>& buttonConfirmNode, const RefPtr<DialogTheme>& dialogTheme)
633 {
634     MarginProperty margin;
635     bool isRtl = AceApplicationInfo::GetInstance().IsRightToLeft();
636     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
637         margin.top = CalcLength(dialogTheme->GetDividerHeight());
638         margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
639         if (isRtl) {
640             margin.right = CalcLength(0.0_vp);
641             margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
642         } else {
643             margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
644             margin.left = CalcLength(0.0_vp);
645         }
646 
647     } else {
648         margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
649         margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
650         if (isRtl) {
651             margin.right = CalcLength(0.0_vp);
652             margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
653         } else {
654             margin.right = CalcLength(dialogTheme->GetActionsPadding().Right());
655             margin.left = CalcLength(0.0_vp);
656         }
657     }
658     buttonConfirmNode->GetLayoutProperty()->UpdateMargin(margin);
659 }
660 
UpdateCancelButtonMargin(const RefPtr<FrameNode> & buttonCancelNode,const RefPtr<DialogTheme> & dialogTheme)661 void TextPickerDialogView::UpdateCancelButtonMargin(
662     const RefPtr<FrameNode>& buttonCancelNode, const RefPtr<DialogTheme>& dialogTheme)
663 {
664     MarginProperty margin;
665     bool isRtl = AceApplicationInfo::GetInstance().IsRightToLeft();
666     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
667         margin.top = CalcLength(dialogTheme->GetDividerHeight());
668         margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
669         if (isRtl) {
670             margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
671             margin.left = CalcLength(0.0_vp);
672         } else {
673             margin.right = CalcLength(0.0_vp);
674             margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
675         }
676     } else {
677         margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
678         margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
679         if (isRtl) {
680             margin.right = CalcLength(dialogTheme->GetActionsPadding().Right());
681             margin.left = CalcLength(0.0_vp);
682         } else {
683             margin.right = CalcLength(0.0_vp);
684             margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
685         }
686     }
687     buttonCancelNode->GetLayoutProperty()->UpdateMargin(margin);
688 }
689 
UpdateForwardButtonMargin(const RefPtr<FrameNode> & buttonForwardNode,const RefPtr<DialogTheme> & dialogTheme)690 void TextPickerDialogView::UpdateForwardButtonMargin(
691     const RefPtr<FrameNode>& buttonForwardNode, const RefPtr<DialogTheme>& dialogTheme)
692 {
693     MarginProperty margin;
694     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
695         margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
696         margin.top = CalcLength(dialogTheme->GetDividerHeight());
697         margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
698         margin.left = CalcLength(0.0_vp);
699     } else {
700         margin.right = CalcLength(dialogTheme->GetDividerPadding().Right());
701         margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
702         margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
703         margin.left = CalcLength(0.0_vp);
704     }
705     buttonForwardNode->GetLayoutProperty()->UpdateMargin(margin);
706 }
707 
UpdateBackwardButtonMargin(const RefPtr<FrameNode> & buttonBackwardNode,const RefPtr<DialogTheme> & dialogTheme)708 void TextPickerDialogView::UpdateBackwardButtonMargin(
709     const RefPtr<FrameNode>& buttonBackwardNode, const RefPtr<DialogTheme>& dialogTheme)
710 {
711     MarginProperty margin;
712     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
713         margin.left = CalcLength(dialogTheme->GetDividerPadding().Left());
714         margin.top = CalcLength(dialogTheme->GetDividerHeight());
715         margin.bottom = CalcLength(dialogTheme->GetDividerPadding().Bottom());
716         margin.right = CalcLength(0.0_vp);
717     } else {
718         margin.left = CalcLength(dialogTheme->GetActionsPadding().Left());
719         margin.top = CalcLength(dialogTheme->GetActionsPadding().Top());
720         margin.bottom = CalcLength(dialogTheme->GetActionsPadding().Bottom());
721         margin.right = CalcLength(0.0_vp);
722     }
723     buttonBackwardNode->GetLayoutProperty()->UpdateMargin(margin);
724 }
725 
UpdateButtonStyles(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext)726 void TextPickerDialogView::UpdateButtonStyles(const std::vector<ButtonInfo>& buttonInfos, size_t index,
727     const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext)
728 {
729     if (index >= buttonInfos.size()) {
730         return;
731     }
732     CHECK_NULL_VOID(buttonLayoutProperty);
733     CHECK_NULL_VOID(buttonRenderContext);
734     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
735     CHECK_NULL_VOID(pipeline);
736     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
737     CHECK_NULL_VOID(buttonTheme);
738     if (buttonInfos[index].type.has_value()) {
739         buttonLayoutProperty->UpdateType(buttonInfos[index].type.value());
740     }
741     UpdateButtonStyleAndRole(buttonInfos, index, buttonLayoutProperty, buttonRenderContext, buttonTheme);
742     if (buttonInfos[index].fontSize.has_value()) {
743         buttonLayoutProperty->UpdateFontSize(ConvertFontScaleValue(buttonInfos[index].fontSize.value()));
744     }
745     if (buttonInfos[index].fontColor.has_value()) {
746         buttonLayoutProperty->UpdateFontColor(buttonInfos[index].fontColor.value());
747     }
748     if (buttonInfos[index].fontWeight.has_value()) {
749         buttonLayoutProperty->UpdateFontWeight(buttonInfos[index].fontWeight.value());
750     }
751     if (buttonInfos[index].fontStyle.has_value()) {
752         buttonLayoutProperty->UpdateFontStyle(buttonInfos[index].fontStyle.value());
753     }
754     if (buttonInfos[index].fontFamily.has_value()) {
755         buttonLayoutProperty->UpdateFontFamily(buttonInfos[index].fontFamily.value());
756     }
757     if (buttonInfos[index].borderRadius.has_value()) {
758         buttonLayoutProperty->UpdateBorderRadius(buttonInfos[index].borderRadius.value());
759     }
760     if (buttonInfos[index].backgroundColor.has_value()) {
761         buttonRenderContext->UpdateBackgroundColor(buttonInfos[index].backgroundColor.value());
762     }
763 }
764 
UpdateButtonStyleAndRole(const std::vector<ButtonInfo> & buttonInfos,size_t index,const RefPtr<ButtonLayoutProperty> & buttonLayoutProperty,const RefPtr<RenderContext> & buttonRenderContext,const RefPtr<ButtonTheme> & buttonTheme)765 void TextPickerDialogView::UpdateButtonStyleAndRole(const std::vector<ButtonInfo>& buttonInfos, size_t index,
766     const RefPtr<ButtonLayoutProperty>& buttonLayoutProperty, const RefPtr<RenderContext>& buttonRenderContext,
767     const RefPtr<ButtonTheme>& buttonTheme)
768 {
769     if (index >= buttonInfos.size()) {
770         return;
771     }
772     CHECK_NULL_VOID(buttonLayoutProperty);
773     CHECK_NULL_VOID(buttonRenderContext);
774     CHECK_NULL_VOID(buttonTheme);
775     if (buttonInfos[index].role.has_value()) {
776         buttonLayoutProperty->UpdateButtonRole(buttonInfos[index].role.value());
777         ButtonStyleMode buttonStyleMode;
778         if (buttonInfos[index].buttonStyle.has_value()) {
779             buttonStyleMode = buttonInfos[index].buttonStyle.value();
780         } else {
781             buttonStyleMode = buttonLayoutProperty->GetButtonStyle().value_or(ButtonStyleMode::EMPHASIZE);
782         }
783         auto bgColor = buttonTheme->GetBgColor(buttonStyleMode, buttonInfos[index].role.value());
784         auto textColor = buttonTheme->GetTextColor(buttonStyleMode, buttonInfos[index].role.value());
785         buttonRenderContext->UpdateBackgroundColor(bgColor);
786         buttonLayoutProperty->UpdateFontColor(textColor);
787     }
788     if (buttonInfos[index].buttonStyle.has_value()) {
789         buttonLayoutProperty->UpdateButtonStyle(buttonInfos[index].buttonStyle.value());
790         ButtonRole buttonRole = buttonLayoutProperty->GetButtonRole().value_or(ButtonRole::NORMAL);
791         auto bgColor = buttonTheme->GetBgColor(buttonInfos[index].buttonStyle.value(), buttonRole);
792         auto textColor = buttonTheme->GetTextColor(buttonInfos[index].buttonStyle.value(), buttonRole);
793         buttonRenderContext->UpdateBackgroundColor(bgColor);
794         buttonLayoutProperty->UpdateFontColor(textColor);
795     }
796 }
797 
CreateCancelNode(NG::DialogGestureEvent & cancelEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)798 RefPtr<FrameNode> TextPickerDialogView::CreateCancelNode(NG::DialogGestureEvent& cancelEvent,
799     const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
800 {
801     auto pipeline = PipelineContext::GetCurrentContext();
802     CHECK_NULL_RETURN(pipeline, nullptr);
803     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
804     auto buttonCancelNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
805         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
806     CHECK_NULL_RETURN(buttonCancelNode, nullptr);
807     auto textCancelNode = FrameNode::CreateFrameNode(
808         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
809     CHECK_NULL_RETURN(textCancelNode, nullptr);
810     auto textCancelLayoutProperty = textCancelNode->GetLayoutProperty<TextLayoutProperty>();
811     UpdateCancelButtonTextLayoutProperty(textCancelNode, pickerTheme);
812     auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
813     textPattern->SetCancelNode(buttonCancelNode);
814     textCancelNode->MountToParent(buttonCancelNode);
815     auto eventCancelHub = buttonCancelNode->GetOrCreateGestureEventHub();
816     CHECK_NULL_RETURN(eventCancelHub, nullptr);
817     eventCancelHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(cancelEvent)));
818     auto recordEvent = [](GestureEvent& info) {
819         if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
820             Recorder::EventParamsBuilder builder;
821             builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::DIALOG_CANCEL);
822             Recorder::EventRecorder::Get().OnEvent(std::move(builder));
823         }
824     };
825     auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
826     eventCancelHub->AddClickEvent(recordEventPtr);
827 
828     auto buttonCancelEventHub = buttonCancelNode->GetEventHub<ButtonEventHub>();
829     CHECK_NULL_RETURN(buttonCancelEventHub, nullptr);
830     buttonCancelEventHub->SetStateEffect(true);
831 
832     UpdateButtonCancelLayoutProperty(buttonCancelNode, pipeline);
833 
834     auto buttonCancelRenderContext = buttonCancelNode->GetRenderContext();
835     buttonCancelRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
836     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
837     UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonCancelLayoutProperty, buttonCancelRenderContext);
838     UpdateButtonDefaultFocus(buttonInfos, buttonCancelNode, false);
839 
840     buttonCancelNode->MarkModifyDone();
841     return buttonCancelNode;
842 }
843 
844 
UpdateButtonCancelLayoutProperty(const RefPtr<FrameNode> & buttonCancelNode,const RefPtr<PipelineContext> & pipeline)845 void TextPickerDialogView::UpdateButtonCancelLayoutProperty(
846     const RefPtr<FrameNode>& buttonCancelNode, const RefPtr<PipelineContext>& pipeline)
847 {
848     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
849     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
850     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
851     UpdateCancelButtonMargin(buttonCancelNode, dialogTheme);
852     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<ButtonLayoutProperty>();
853     buttonCancelLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.cancel"));
854     buttonCancelLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
855     buttonCancelLayoutProperty->UpdateType(ButtonType::CAPSULE);
856     buttonCancelLayoutProperty->UpdateFlexShrink(1.0);
857     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
858         buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
859             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
860     } else {
861         buttonCancelLayoutProperty->UpdateUserDefinedIdealSize(
862             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
863     }
864 }
865 
UpdateButtonForwardLayoutProperty(const RefPtr<FrameNode> & buttonForwardNode,const RefPtr<PipelineContext> & pipeline)866 void TextPickerDialogView::UpdateButtonForwardLayoutProperty(
867     const RefPtr<FrameNode>& buttonForwardNode, const RefPtr<PipelineContext>& pipeline)
868 {
869     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
870     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
871     CHECK_NULL_VOID(buttonTheme);
872     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
873     CHECK_NULL_VOID(pickerTheme);
874     UpdateForwardButtonMargin(buttonForwardNode, dialogTheme);
875     auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<ButtonLayoutProperty>();
876     buttonForwardLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.next"));
877     buttonForwardLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
878     buttonForwardLayoutProperty->UpdateType(ButtonType::CAPSULE);
879     buttonForwardLayoutProperty->UpdateFlexShrink(1.0);
880     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
881         buttonForwardLayoutProperty->UpdateUserDefinedIdealSize(
882             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
883     } else {
884         buttonForwardLayoutProperty->UpdateUserDefinedIdealSize(
885             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
886     }
887 }
888 
UpdateButtonBackwardLayoutProperty(const RefPtr<FrameNode> & buttonBackwardNode,const RefPtr<PipelineContext> & pipeline)889 void TextPickerDialogView::UpdateButtonBackwardLayoutProperty(
890     const RefPtr<FrameNode>& buttonBackwardNode, const RefPtr<PipelineContext>& pipeline)
891 {
892     CHECK_NULL_VOID(pipeline);
893     auto dialogTheme = pipeline->GetTheme<DialogTheme>();
894     auto buttonTheme = pipeline->GetTheme<ButtonTheme>();
895     CHECK_NULL_VOID(buttonTheme);
896     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
897     CHECK_NULL_VOID(pickerTheme);
898     UpdateBackwardButtonMargin(buttonBackwardNode, dialogTheme);
899     auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<ButtonLayoutProperty>();
900     buttonBackwardLayoutProperty->UpdateLabel(Localization::GetInstance()->GetEntryLetters("common.prev"));
901     buttonBackwardLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
902     buttonBackwardLayoutProperty->UpdateType(ButtonType::CAPSULE);
903     buttonBackwardLayoutProperty->UpdateFlexShrink(1.0);
904     if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
905         buttonBackwardLayoutProperty->UpdateUserDefinedIdealSize(
906             CalcSize(CalcLength(pickerTheme->GetButtonWidth()), CalcLength(pickerTheme->GetButtonHeight())));
907     } else {
908         buttonBackwardLayoutProperty->UpdateUserDefinedIdealSize(
909             CalcSize(CalcLength(1.0, DimensionUnit::PERCENT), CalcLength(buttonTheme->GetHeight())));
910     }
911 }
912 
SetSelected(const RefPtr<TextPickerPattern> & textPickerPattern,uint32_t value)913 void TextPickerDialogView::SetSelected(const RefPtr<TextPickerPattern>& textPickerPattern, uint32_t value)
914 {
915     textPickerPattern->SetSelected(value);
916     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Selected, value);
917 }
918 
SetSelectedValues(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<uint32_t> & values)919 void TextPickerDialogView::SetSelectedValues(
920     const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<uint32_t>& values)
921 {
922     textPickerPattern->SetSelecteds(values);
923     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Selecteds, values);
924 }
925 
SetValues(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<std::string> & values)926 void TextPickerDialogView::SetValues(
927     const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<std::string>& values)
928 {
929     textPickerPattern->SetValues(values);
930     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, Values, values);
931 }
932 
SetRange(const RefPtr<TextPickerPattern> & textPickerPattern,const std::vector<NG::RangeContent> & value)933 void TextPickerDialogView::SetRange(
934     const RefPtr<TextPickerPattern>& textPickerPattern, const std::vector<NG::RangeContent>& value)
935 {
936     textPickerPattern->SetRange(value);
937 }
938 
SetTextProperties(const RefPtr<PickerTheme> & pickerTheme,const PickerTextProperties & properties)939 void TextPickerDialogView::SetTextProperties(
940     const RefPtr<PickerTheme>& pickerTheme, const PickerTextProperties& properties)
941 {
942     SetDefaultTextStyle(properties.defaultTextStyle_);
943 
944     CHECK_NULL_VOID(pickerTheme);
945     auto selectedStyle = pickerTheme->GetOptionStyle(true, false);
946     auto normalStyle = pickerTheme->GetOptionStyle(false, false);
947 
948     SetTextDisappearProperties(pickerTheme, properties);
949 
950     if (properties.normalTextStyle_.fontSize.has_value() && properties.normalTextStyle_.fontSize->IsValid()) {
951         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontSize,
952             ConvertFontScaleValue(properties.normalTextStyle_.fontSize.value(), normalTextStyleFont_, true));
953     } else {
954         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontSize,
955             ConvertFontScaleValue(normalStyle.GetFontSize()));
956     }
957     ACE_UPDATE_LAYOUT_PROPERTY(
958         TextPickerLayoutProperty, Color, properties.normalTextStyle_.textColor.value_or(normalStyle.GetTextColor()));
959     ACE_UPDATE_LAYOUT_PROPERTY(
960         TextPickerLayoutProperty, Weight, properties.normalTextStyle_.fontWeight.value_or(normalStyle.GetFontWeight()));
961     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontFamily,
962         properties.normalTextStyle_.fontFamily.value_or(normalStyle.GetFontFamilies()));
963     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, FontStyle,
964         properties.normalTextStyle_.fontStyle.value_or(normalStyle.GetFontStyle()));
965 
966     if (properties.selectedTextStyle_.fontSize.has_value() && properties.selectedTextStyle_.fontSize->IsValid()) {
967         ACE_UPDATE_LAYOUT_PROPERTY(
968             TextPickerLayoutProperty, SelectedFontSize,
969             ConvertFontScaleValue(properties.selectedTextStyle_.fontSize.value(), selectedTextStyleFont_, true));
970     } else {
971         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontSize,
972             ConvertFontScaleValue(selectedStyle.GetFontSize()));
973     }
974     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedColor,
975         properties.selectedTextStyle_.textColor.value_or(selectedStyle.GetTextColor()));
976     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedWeight,
977         properties.selectedTextStyle_.fontWeight.value_or(selectedStyle.GetFontWeight()));
978     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontFamily,
979         properties.selectedTextStyle_.fontFamily.value_or(selectedStyle.GetFontFamilies()));
980     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, SelectedFontStyle,
981         properties.selectedTextStyle_.fontStyle.value_or(selectedStyle.GetFontStyle()));
982 }
983 
SetTextDisappearProperties(const RefPtr<PickerTheme> & pickerTheme,const PickerTextProperties & properties)984 void TextPickerDialogView::SetTextDisappearProperties(
985     const RefPtr<PickerTheme>& pickerTheme, const PickerTextProperties& properties)
986 
987 {
988     CHECK_NULL_VOID(pickerTheme);
989     auto disappearStyle = pickerTheme->GetDisappearOptionStyle();
990     if (properties.disappearTextStyle_.fontSize.has_value() && properties.disappearTextStyle_.fontSize->IsValid()) {
991         ACE_UPDATE_LAYOUT_PROPERTY(
992             TextPickerLayoutProperty, DisappearFontSize,
993             ConvertFontScaleValue(properties.disappearTextStyle_.fontSize.value(), disappearTextStyleFont_, true));
994     } else {
995         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontSize,
996             ConvertFontScaleValue(disappearStyle.GetFontSize()));
997     }
998     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearColor,
999         properties.disappearTextStyle_.textColor.value_or(disappearStyle.GetTextColor()));
1000     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearWeight,
1001         properties.disappearTextStyle_.fontWeight.value_or(disappearStyle.GetFontWeight()));
1002     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontFamily,
1003         properties.disappearTextStyle_.fontFamily.value_or(disappearStyle.GetFontFamilies()));
1004     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DisappearFontStyle,
1005         properties.disappearTextStyle_.fontStyle.value_or(disappearStyle.GetFontStyle()));
1006 }
1007 
SetDefaultTextStyle(const NG::PickerTextStyle & value)1008 void TextPickerDialogView::SetDefaultTextStyle(const NG::PickerTextStyle& value)
1009 {
1010     auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck();
1011     CHECK_NULL_VOID(pipelineContext);
1012     auto theme = pipelineContext->GetTheme<TextTheme>();
1013     CHECK_NULL_VOID(theme);
1014     auto textStyle = theme->GetTextStyle();
1015 
1016     if (value.fontSize.has_value() && value.fontSize->IsValid()) {
1017         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultFontSize,
1018             ConvertFontScaleValue(value.fontSize.value()));
1019     } else {
1020         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultFontSize,
1021             ConvertFontScaleValue(textStyle.GetFontSize()));
1022     }
1023     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultColor,
1024         value.textColor.value_or(textStyle.GetTextColor()));
1025     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultWeight,
1026         value.fontWeight.value_or(textStyle.GetFontWeight()));
1027     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultFontFamily,
1028         value.fontFamily.value_or(textStyle.GetFontFamilies()));
1029     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultFontStyle,
1030         value.fontStyle.value_or(textStyle.GetFontStyle()));
1031     if (value.minFontSize.has_value() && value.minFontSize->IsValid()) {
1032         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultMinFontSize,
1033             ConvertFontScaleValue(value.minFontSize.value()));
1034     }
1035     if (value.maxFontSize.has_value() && value.maxFontSize->IsValid()) {
1036         ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultMaxFontSize,
1037             ConvertFontScaleValue(value.maxFontSize.value()));
1038     }
1039     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultTextOverflow,
1040         value.textOverflow.value_or(textStyle.GetTextOverflow()));
1041 }
1042 
SetDialogChange(const RefPtr<FrameNode> & frameNode,DialogTextEvent && onChange)1043 void TextPickerDialogView::SetDialogChange(const RefPtr<FrameNode>& frameNode, DialogTextEvent&& onChange)
1044 {
1045     CHECK_NULL_VOID(frameNode);
1046     auto eventHub = frameNode->GetEventHub<TextPickerEventHub>();
1047     CHECK_NULL_VOID(eventHub);
1048     eventHub->SetDialogChange(std::move(onChange));
1049 }
1050 
SetDialogScrollStop(const RefPtr<FrameNode> & frameNode,DialogTextEvent && onScrollStop)1051 void TextPickerDialogView::SetDialogScrollStop(const RefPtr<FrameNode>& frameNode, DialogTextEvent&& onScrollStop)
1052 {
1053     CHECK_NULL_VOID(frameNode);
1054     auto eventHub = frameNode->GetEventHub<TextPickerEventHub>();
1055     CHECK_NULL_VOID(eventHub);
1056     eventHub->SetDialogScrollStop(std::move(onScrollStop));
1057 }
1058 
SetDefaultPickerItemHeight(const Dimension & value)1059 void TextPickerDialogView::SetDefaultPickerItemHeight(const Dimension& value)
1060 {
1061     ACE_UPDATE_LAYOUT_PROPERTY(TextPickerLayoutProperty, DefaultPickerItemHeight, value);
1062 }
1063 
SetDialogAcceptEvent(const RefPtr<FrameNode> & frameNode,DialogTextEvent && onChange)1064 void TextPickerDialogView::SetDialogAcceptEvent(const RefPtr<FrameNode>& frameNode, DialogTextEvent&& onChange)
1065 {
1066     CHECK_NULL_VOID(frameNode);
1067     auto eventHub = frameNode->GetEventHub<TextPickerEventHub>();
1068     CHECK_NULL_VOID(eventHub);
1069     eventHub->SetDialogAcceptEvent(std::move(onChange));
1070 }
1071 
InitOnKeyEvent(const RefPtr<FocusHub> & focusHub)1072 void TextPickerDialogView::InitOnKeyEvent(const RefPtr<FocusHub>& focusHub)
1073 {
1074     auto onKeyEvent = [](const KeyEvent& event) -> bool { return TextPickerDialogView::OnKeyEvent(event); };
1075     focusHub->SetOnKeyEventInternal(std::move(onKeyEvent));
1076 }
OnKeyEvent(const KeyEvent & event)1077 bool TextPickerDialogView::OnKeyEvent(const KeyEvent& event)
1078 {
1079     if (event.action != KeyAction::DOWN) {
1080         return false;
1081     }
1082 
1083     if (event.code == KeyCode::KEY_ESCAPE) {
1084         auto dialogNode = dialogNode_.Upgrade();
1085         CHECK_NULL_RETURN(dialogNode, false);
1086         auto pipeline = dialogNode->GetContext();
1087         CHECK_NULL_RETURN(pipeline, false);
1088         auto overlayManager = pipeline->GetOverlayManager();
1089         CHECK_NULL_RETURN(overlayManager, false);
1090         overlayManager->CloseDialog(dialogNode);
1091         return true;
1092     }
1093 
1094     return false;
1095 }
1096 
UpdateButtonDefaultFocus(const std::vector<ButtonInfo> & buttonInfos,const RefPtr<FrameNode> & buttonNode,bool isConfirm)1097 void TextPickerDialogView::UpdateButtonDefaultFocus(const std::vector<ButtonInfo>& buttonInfos,
1098     const RefPtr<FrameNode>& buttonNode, bool isConfirm)
1099 {
1100     bool setDefaultFocus = false;
1101     if (buttonInfos.size() > CANCEL_BUTTON_INDEX) {
1102         if (buttonInfos[ACCEPT_BUTTON_INDEX].isPrimary && buttonInfos[CANCEL_BUTTON_INDEX].isPrimary) {
1103             return;
1104         }
1105         auto index = isConfirm ? ACCEPT_BUTTON_INDEX : CANCEL_BUTTON_INDEX;
1106         if (buttonInfos[index].isPrimary) {
1107             setDefaultFocus = true;
1108         }
1109     } else if (buttonInfos.size() == CANCEL_BUTTON_INDEX) {
1110         bool isAcceptButtonPrimary = (buttonInfos[0].isAcceptButton && isConfirm && buttonInfos[0].isPrimary);
1111         bool isCancelButtonPrimary = (!buttonInfos[0].isAcceptButton && !isConfirm && buttonInfos[0].isPrimary);
1112         if (isAcceptButtonPrimary || isCancelButtonPrimary) {
1113             setDefaultFocus = true;
1114         }
1115     }
1116     if (setDefaultFocus && buttonNode) {
1117         auto focusHub = buttonNode->GetOrCreateFocusHub();
1118         if (focusHub) {
1119             focusHub->SetIsDefaultFocus(true);
1120         }
1121     }
1122 }
1123 
CreateForwardNode(NG::DialogGestureEvent & moveForwardEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)1124 RefPtr<FrameNode> TextPickerDialogView::CreateForwardNode(NG::DialogGestureEvent& moveForwardEvent,
1125     const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
1126 {
1127     CHECK_NULL_RETURN(textPickerNode, nullptr);
1128     auto pipeline = PipelineContext::GetCurrentContextSafely();
1129     CHECK_NULL_RETURN(pipeline, nullptr);
1130     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1131     CHECK_NULL_RETURN(pickerTheme, nullptr);
1132     auto buttonForwardNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1133         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1134     CHECK_NULL_RETURN(buttonForwardNode, nullptr);
1135     auto textForwardNode = FrameNode::CreateFrameNode(
1136         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1137     CHECK_NULL_RETURN(textForwardNode, nullptr);
1138     UpdateForwardButtonTextLayoutProperty(textForwardNode, pickerTheme);
1139     auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
1140     textPattern->SetForwardNode(buttonForwardNode);
1141     textForwardNode->MountToParent(buttonForwardNode);
1142     auto eventForwardHub = buttonForwardNode->GetOrCreateGestureEventHub();
1143     CHECK_NULL_RETURN(eventForwardHub, nullptr);
1144     eventForwardHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(moveForwardEvent)));
1145     auto recordEvent = [](GestureEvent& info) {
1146         if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
1147             Recorder::EventParamsBuilder builder;
1148             builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::STEPPER_NEXT);
1149             Recorder::EventRecorder::Get().OnEvent(std::move(builder));
1150         }
1151     };
1152     auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
1153     eventForwardHub->AddClickEvent(recordEventPtr);
1154 
1155     auto buttonForwardEventHub = buttonForwardNode->GetEventHub<ButtonEventHub>();
1156     CHECK_NULL_RETURN(buttonForwardEventHub, nullptr);
1157     buttonForwardEventHub->SetStateEffect(true);
1158 
1159     UpdateButtonForwardLayoutProperty(buttonForwardNode, pipeline);
1160 
1161     const auto& buttonForwardRenderContext = buttonForwardNode->GetRenderContext();
1162     buttonForwardRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1163     auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<ButtonLayoutProperty>();
1164     UpdateButtonStyles(buttonInfos, ACCEPT_BUTTON_INDEX, buttonForwardLayoutProperty, buttonForwardRenderContext);
1165     UpdateButtonDefaultFocus(buttonInfos, buttonForwardNode, false);
1166 
1167     buttonForwardNode->MarkModifyDone();
1168     return buttonForwardNode;
1169 }
1170 
CreateBackwardNode(NG::DialogGestureEvent & moveBackwardEvent,const RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos)1171 RefPtr<FrameNode> TextPickerDialogView::CreateBackwardNode(NG::DialogGestureEvent& moveBackwardEvent,
1172     const RefPtr<FrameNode>& textPickerNode, const std::vector<ButtonInfo>& buttonInfos)
1173 {
1174     CHECK_NULL_RETURN(textPickerNode, nullptr);
1175     auto pipeline = PipelineContext::GetCurrentContextSafely();
1176     CHECK_NULL_RETURN(pipeline, nullptr);
1177     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1178     CHECK_NULL_RETURN(pickerTheme, nullptr);
1179     auto buttonBackwardNode = FrameNode::GetOrCreateFrameNode(V2::BUTTON_ETS_TAG,
1180         ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr<ButtonPattern>(); });
1181     CHECK_NULL_RETURN(buttonBackwardNode, nullptr);
1182     auto textBackwardNode = FrameNode::CreateFrameNode(
1183         V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
1184     CHECK_NULL_RETURN(textBackwardNode, nullptr);
1185     UpdateBackwardButtonTextLayoutProperty(textBackwardNode, pickerTheme);
1186     auto textPattern = textPickerNode->GetPattern<TextPickerPattern>();
1187     textPattern->SetBackwardNode(buttonBackwardNode);
1188     textBackwardNode->MountToParent(buttonBackwardNode);
1189     auto eventBackwardHub = buttonBackwardNode->GetOrCreateGestureEventHub();
1190     CHECK_NULL_RETURN(eventBackwardHub, nullptr);
1191     eventBackwardHub->AddClickEvent(AceType::MakeRefPtr<NG::ClickEvent>(std::move(moveBackwardEvent)));
1192     auto recordEvent = [](GestureEvent& info) {
1193         if (Recorder::EventRecorder::Get().IsComponentRecordEnable()) {
1194             Recorder::EventParamsBuilder builder;
1195             builder.SetType("TextPickerDialog").SetEventType(Recorder::EventType::STEPPER_NEXT);
1196             Recorder::EventRecorder::Get().OnEvent(std::move(builder));
1197         }
1198     };
1199     auto recordEventPtr = AceType::MakeRefPtr<ClickEvent>(std::move(recordEvent));
1200     eventBackwardHub->AddClickEvent(recordEventPtr);
1201 
1202     auto buttonBackwardEventHub = buttonBackwardNode->GetEventHub<ButtonEventHub>();
1203     CHECK_NULL_RETURN(buttonBackwardEventHub, nullptr);
1204     buttonBackwardEventHub->SetStateEffect(true);
1205 
1206     UpdateButtonBackwardLayoutProperty(buttonBackwardNode, pipeline);
1207 
1208     const auto& buttonBackwardRenderContext = buttonBackwardNode->GetRenderContext();
1209     buttonBackwardRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
1210     auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<ButtonLayoutProperty>();
1211     UpdateButtonStyles(buttonInfos, CANCEL_BUTTON_INDEX, buttonBackwardLayoutProperty, buttonBackwardRenderContext);
1212     UpdateButtonDefaultFocus(buttonInfos, buttonBackwardNode, false);
1213 
1214     buttonBackwardNode->MarkModifyDone();
1215     return buttonBackwardNode;
1216 }
1217 
SetFirstDialogButtonActive(RefPtr<UINode> & contentRow)1218 void TextPickerDialogView::SetFirstDialogButtonActive(RefPtr<UINode>& contentRow)
1219 {
1220     CHECK_NULL_VOID(contentRow);
1221     auto buttonCancel = contentRow->GetFirstChild();
1222     auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1223     CHECK_NULL_VOID(buttonCancelNode);
1224     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1225     CHECK_NULL_VOID(buttonCancelLayoutProperty);
1226     buttonCancelLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1227 
1228     auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1229     auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1230     CHECK_NULL_VOID(buttonForwardNode);
1231     auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1232     CHECK_NULL_VOID(buttonForwardLayoutProperty);
1233     buttonForwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1234 
1235     auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1236     auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1237     CHECK_NULL_VOID(buttonBackwardNode);
1238     auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1239     CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1240     buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::GONE);
1241 
1242     auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1243     auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1244     CHECK_NULL_VOID(buttonConfirmNode);
1245     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1246     CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1247     buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::GONE);
1248 }
1249 
SetSecondDialogButtonActive(RefPtr<UINode> & contentRow)1250 void TextPickerDialogView::SetSecondDialogButtonActive(RefPtr<UINode>& contentRow)
1251 {
1252     CHECK_NULL_VOID(contentRow);
1253     auto buttonCancel = contentRow->GetFirstChild();
1254     auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1255     CHECK_NULL_VOID(buttonCancelNode);
1256     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1257     CHECK_NULL_VOID(buttonCancelLayoutProperty);
1258     buttonCancelLayoutProperty->UpdateVisibility(VisibleType::GONE);
1259 
1260     auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1261     auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1262     CHECK_NULL_VOID(buttonForwardNode);
1263     auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1264     CHECK_NULL_VOID(buttonForwardLayoutProperty);
1265     buttonForwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1266 
1267     auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1268     auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1269     CHECK_NULL_VOID(buttonBackwardNode);
1270     auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1271     CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1272     buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1273 
1274     auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1275     auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1276     CHECK_NULL_VOID(buttonConfirmNode);
1277     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1278     CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1279     buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::GONE);
1280 }
1281 
SetThirdDialogButtonActive(RefPtr<UINode> & contentRow)1282 void TextPickerDialogView::SetThirdDialogButtonActive(RefPtr<UINode>& contentRow)
1283 {
1284     CHECK_NULL_VOID(contentRow);
1285     auto buttonCancel = contentRow->GetFirstChild();
1286     auto buttonCancelNode = AceType::DynamicCast<FrameNode>(buttonCancel);
1287     CHECK_NULL_VOID(buttonCancelNode);
1288     auto buttonCancelLayoutProperty = buttonCancelNode->GetLayoutProperty<LayoutProperty>();
1289     CHECK_NULL_VOID(buttonCancelLayoutProperty);
1290     buttonCancelLayoutProperty->UpdateVisibility(VisibleType::GONE);
1291 
1292     auto buttonForward = contentRow->GetChildAtIndex(FORWAED_BUTTON_DIVEDER_INDEX);
1293     auto buttonForwardNode = AceType::DynamicCast<FrameNode>(buttonForward);
1294     CHECK_NULL_VOID(buttonForwardNode);
1295     auto buttonForwardLayoutProperty = buttonForwardNode->GetLayoutProperty<LayoutProperty>();
1296     CHECK_NULL_VOID(buttonForwardLayoutProperty);
1297     buttonForwardLayoutProperty->UpdateVisibility(VisibleType::GONE);
1298 
1299     auto buttonBackward = contentRow->GetChildAtIndex(BACKWARD_BUTTON_DIVEDER_INDEX);
1300     auto buttonBackwardNode = AceType::DynamicCast<FrameNode>(buttonBackward);
1301     CHECK_NULL_VOID(buttonBackwardNode);
1302     auto buttonBackwardLayoutProperty = buttonBackwardNode->GetLayoutProperty<LayoutProperty>();
1303     CHECK_NULL_VOID(buttonBackwardLayoutProperty);
1304     buttonBackwardLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1305 
1306     auto buttonConfirm = contentRow->GetChildAtIndex(CONFIRM_BUTTON_DIVEDER_INDEX);
1307     auto buttonConfirmNode = AceType::DynamicCast<FrameNode>(buttonConfirm);
1308     CHECK_NULL_VOID(buttonConfirmNode);
1309     auto buttonConfirmLayoutProperty = buttonConfirmNode->GetLayoutProperty<LayoutProperty>();
1310     CHECK_NULL_VOID(buttonConfirmLayoutProperty);
1311     buttonConfirmLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1312 }
1313 
SetDialogButtonActive(RefPtr<FrameNode> & contentColumn,const uint32_t & dialogNodePage,const uint32_t & columnCount)1314 void TextPickerDialogView::SetDialogButtonActive(RefPtr<FrameNode>& contentColumn,
1315     const uint32_t& dialogNodePage, const uint32_t& columnCount)
1316 {
1317     CHECK_NULL_VOID(contentColumn);
1318     auto contentRow = contentColumn->GetLastChild();
1319     if (dialogNodePage == 0) {
1320         SetFirstDialogButtonActive(contentRow);
1321         SetDividerNodeActive(contentRow, true, false, false);
1322     } else if (columnCount > 0 && dialogNodePage != (columnCount - 1)) {
1323         SetSecondDialogButtonActive(contentRow);
1324         SetDividerNodeActive(contentRow, false, true, false);
1325     } else {
1326         SetThirdDialogButtonActive(contentRow);
1327         SetDividerNodeActive(contentRow, false, false, true);
1328     }
1329 }
1330 
SetDividerNodeActive(RefPtr<UINode> & contentRow,bool firstDividerActive,bool secondDividerActive,bool thirdDividerActive)1331 void TextPickerDialogView::SetDividerNodeActive(RefPtr<UINode>& contentRow, bool firstDividerActive,
1332     bool secondDividerActive, bool thirdDividerActive)
1333 {
1334     CHECK_NULL_VOID(contentRow);
1335     auto firstDivider = contentRow->GetChildAtIndex(1);
1336     auto firstDividerNode = AceType::DynamicCast<FrameNode>(firstDivider);
1337     CHECK_NULL_VOID(firstDividerNode);
1338     auto secondDivider = contentRow->GetChildAtIndex(SECOND_DIVEDER_NODE_INDEX);
1339     auto secondDividerNode = AceType::DynamicCast<FrameNode>(secondDivider);
1340     CHECK_NULL_VOID(secondDividerNode);
1341     auto thirdDivider = contentRow->GetChildAtIndex(THIRD_DIVEDER_NODE_INDEX);
1342     auto thirdDividerNode = AceType::DynamicCast<FrameNode>(thirdDivider);
1343     CHECK_NULL_VOID(thirdDividerNode);
1344 
1345     SetSingleDividerNodeActive(firstDividerNode, firstDividerActive);
1346     SetSingleDividerNodeActive(secondDividerNode, secondDividerActive);
1347     SetSingleDividerNodeActive(thirdDividerNode, thirdDividerActive);
1348 }
1349 
SetSingleDividerNodeActive(RefPtr<FrameNode> & dividerNode,bool dividerActive)1350 void TextPickerDialogView::SetSingleDividerNodeActive(RefPtr<FrameNode>& dividerNode, bool dividerActive)
1351 {
1352     CHECK_NULL_VOID(dividerNode);
1353     auto dividerLayoutProperty = dividerNode->GetLayoutProperty<LayoutProperty>();
1354     CHECK_NULL_VOID(dividerLayoutProperty);
1355     if (dividerActive) {
1356         dividerLayoutProperty->UpdateVisibility(VisibleType::VISIBLE);
1357     } else {
1358         dividerLayoutProperty->UpdateVisibility(VisibleType::GONE);
1359     }
1360 }
1361 
SetDialogNodePageActive(RefPtr<FrameNode> & contentColumn,RefPtr<FrameNode> & textPickerNode,const uint32_t & dialogNodePage,const uint32_t & columnCount)1362 void TextPickerDialogView::SetDialogNodePageActive(RefPtr<FrameNode>& contentColumn,
1363     RefPtr<FrameNode>& textPickerNode,
1364     const uint32_t& dialogNodePage, const uint32_t& columnCount)
1365 {
1366     CHECK_NULL_VOID(textPickerNode);
1367     for (uint32_t i = 0; i < columnCount; i++) {
1368         auto selectedStackNode = AceType::DynamicCast<FrameNode>(textPickerNode->GetChildAtIndex(i));
1369         CHECK_NULL_VOID(selectedStackNode);
1370         if (i != dialogNodePage) {
1371             auto layoutProperty = selectedStackNode->GetLayoutProperty<LayoutProperty>();
1372             CHECK_NULL_VOID(layoutProperty);
1373             layoutProperty->UpdateLayoutWeight(0);
1374             for (auto& child : selectedStackNode->GetChildren()) {
1375                 auto childNode = AceType::DynamicCast<FrameNode>(child);
1376                 CHECK_NULL_VOID(childNode);
1377                 auto childNodeProperty = childNode->GetLayoutProperty<LayoutProperty>();
1378                 CHECK_NULL_VOID(childNodeProperty);
1379                 childNodeProperty->UpdateVisibility(VisibleType::GONE);
1380             }
1381         } else {
1382             auto layoutProperty = selectedStackNode->GetLayoutProperty<LayoutProperty>();
1383             CHECK_NULL_VOID(layoutProperty);
1384             layoutProperty->UpdateLayoutWeight(1);
1385             for (auto& child : selectedStackNode->GetChildren()) {
1386                 auto childNode = AceType::DynamicCast<FrameNode>(child);
1387                 CHECK_NULL_VOID(childNode);
1388                 auto childNodeProperty = childNode->GetLayoutProperty<LayoutProperty>();
1389                 CHECK_NULL_VOID(childNodeProperty);
1390                 childNodeProperty->UpdateVisibility(VisibleType::VISIBLE);
1391             }
1392         }
1393     }
1394     SetDialogButtonActive(contentColumn, dialogNodePage, columnCount);
1395 }
1396 
CreateAgingButtonNode(RefPtr<FrameNode> & frameNode,const std::vector<ButtonInfo> & buttonInfos,std::map<std::string,NG::DialogTextEvent> dialogEvent,std::map<std::string,NG::DialogGestureEvent> dialogCancelEvent,std::map<std::string,NG::DialogGestureEvent> dialogMoveForwardEvent,std::map<std::string,NG::DialogGestureEvent> dialogMoveBackwardEvent,GestureEventFunc closeCallback,GestureEventFunc nextCallBack,GestureEventFunc previousCallBack)1397 RefPtr<FrameNode> TextPickerDialogView::CreateAgingButtonNode(
1398     RefPtr<FrameNode>& frameNode,
1399     const std::vector<ButtonInfo>& buttonInfos,
1400     std::map<std::string, NG::DialogTextEvent> dialogEvent,
1401     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent,
1402     std::map<std::string, NG::DialogGestureEvent> dialogMoveForwardEvent,
1403     std::map<std::string, NG::DialogGestureEvent> dialogMoveBackwardEvent,
1404     GestureEventFunc closeCallback, GestureEventFunc nextCallBack, GestureEventFunc previousCallBack)
1405 {
1406     auto acceptEvent = dialogEvent["acceptId"];
1407     auto cancelEvent = dialogCancelEvent["cancelId"];
1408     auto moveForwardEvent = dialogMoveForwardEvent["moveForwardId"];
1409     auto moveBackwardEvent = dialogMoveBackwardEvent["moveBackwardId"];
1410 
1411     auto contentRow = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(),
1412         AceType::MakeRefPtr<LinearLayoutPattern>(false));
1413     CHECK_NULL_RETURN(contentRow, nullptr);
1414     auto layoutProps = contentRow->GetLayoutProperty<LinearLayoutProperty>();
1415     CHECK_NULL_RETURN(layoutProps, nullptr);
1416     layoutProps->UpdateMainAxisAlign(FlexAlign::CENTER);
1417     layoutProps->UpdateMeasureType(MeasureType::MATCH_PARENT_MAIN_AXIS);
1418 
1419     auto buttonCancelNode = CreateCancelNode(cancelEvent, frameNode, buttonInfos);
1420     CHECK_NULL_RETURN(buttonCancelNode, nullptr);
1421     auto buttonConfirmNode = CreateConfirmNode(frameNode, frameNode, buttonInfos, acceptEvent);
1422     CHECK_NULL_RETURN(buttonConfirmNode, nullptr);
1423     auto buttonForwardNode = CreateForwardNode(moveForwardEvent, frameNode, buttonInfos);
1424     CHECK_NULL_RETURN(buttonForwardNode, nullptr);
1425     auto buttonBackwardNode = CreateBackwardNode(moveBackwardEvent, frameNode, buttonInfos);
1426     CHECK_NULL_RETURN(buttonBackwardNode, nullptr);
1427 
1428     buttonCancelNode->MountToParent(contentRow);
1429     buttonBackwardNode->MountToParent(contentRow);
1430     buttonForwardNode->MountToParent(contentRow);
1431     buttonConfirmNode->MountToParent(contentRow);
1432 
1433     auto closeClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(closeCallback));
1434     auto nextClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(nextCallBack));
1435     auto previousClick = AceType::MakeRefPtr<NG::ClickEvent>(std::move(previousCallBack));
1436 
1437     for (size_t i = 0; i < contentRow->GetChildren().size(); i++) {
1438         auto child = contentRow->GetChildAtIndex(i);
1439         auto childNode = AceType::DynamicCast<FrameNode>(child);
1440         CHECK_NULL_RETURN(childNode, nullptr);
1441         if (i == 0 || i == FORWAED_BUTTON_INDEX) {
1442             auto gestureHub = childNode->GetOrCreateGestureEventHub();
1443             CHECK_NULL_RETURN(gestureHub, nullptr);
1444             gestureHub->AddClickEvent(closeClick);
1445         } else if (i == BACKWARD_BUTTON_INDEX) {
1446             auto gestureHub = childNode->GetOrCreateGestureEventHub();
1447             CHECK_NULL_RETURN(gestureHub, nullptr);
1448             gestureHub->AddClickEvent(nextClick);
1449         } else if (i == 1) {
1450             auto gestureHub = childNode->GetOrCreateGestureEventHub();
1451             CHECK_NULL_RETURN(gestureHub, nullptr);
1452             gestureHub->AddClickEvent(previousClick);
1453         }
1454     }
1455     return contentRow;
1456 }
1457 
SeparatedOptionsShow(RefPtr<FrameNode> & contentColumn,RefPtr<FrameNode> & textPickerNode,const std::vector<ButtonInfo> & buttonInfos,const TextPickerSettingData & settingData,std::map<std::string,NG::DialogTextEvent> & dialogEvent,std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent,const float & scale,GestureEventFunc closeCallBack,RefPtr<FrameNode> & dialogNode)1458 RefPtr<FrameNode> TextPickerDialogView::SeparatedOptionsShow(
1459     RefPtr<FrameNode>& contentColumn, RefPtr<FrameNode>& textPickerNode,
1460     const std::vector<ButtonInfo>& buttonInfos,
1461     const TextPickerSettingData& settingData,
1462     std::map<std::string, NG::DialogTextEvent>& dialogEvent,
1463     std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent,
1464     const float& scale, GestureEventFunc closeCallBack, RefPtr<FrameNode>& dialogNode)
1465 {
1466     dialogNodePage = 0;
1467     auto moveForwardFunc = [](const GestureEvent& info) { (void)info; };
1468     std::map<std::string, NG::DialogGestureEvent> dialogMoveForwardEvent;
1469     dialogMoveForwardEvent["moveForwardId"] = moveForwardFunc;
1470     auto moveBackwardFunc = [](const GestureEvent& info) { (void)info; };
1471     std::map<std::string, NG::DialogGestureEvent> dialogMoveBackwardFunc;
1472     dialogMoveBackwardFunc["moveBackwardId"] = moveBackwardFunc;
1473 
1474     uint32_t columnCount = totalPageNum_;
1475     auto nextCallBack = [weak = WeakPtr<FrameNode>(dialogNode),
1476         weakText = WeakPtr<FrameNode>(textPickerNode),
1477         columnCount, weakColumn = WeakPtr<FrameNode>(contentColumn)](const GestureEvent& /* info */) {
1478     auto dialogNode = weak.Upgrade();
1479     auto textPickerNode = weakText.Upgrade();
1480     auto contentColumn = weakColumn.Upgrade();
1481     CHECK_NULL_VOID(dialogNode);
1482     if (dialogNodePage < (columnCount - 1)) {
1483         dialogNodePage++;
1484     }
1485     SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1486     };
1487     auto previousCallBack = [weak = WeakPtr<FrameNode>(dialogNode),
1488         weakText = WeakPtr<FrameNode>(textPickerNode),
1489         columnCount, weakColumn = WeakPtr<FrameNode>(contentColumn)](const GestureEvent& /* info */) {
1490         auto dialogNode = weak.Upgrade();
1491         auto textPickerNode = weakText.Upgrade();
1492         auto contentColumn = weakColumn.Upgrade();
1493         CHECK_NULL_VOID(dialogNode);
1494         if (dialogNodePage > 0) {
1495             dialogNodePage--;
1496         }
1497         SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1498     };
1499     auto contentRow =
1500         CreateAgingButtonNode(textPickerNode, buttonInfos, dialogEvent, std::move(dialogCancelEvent),
1501             std::move(dialogMoveForwardEvent), std::move(dialogMoveBackwardFunc),
1502             closeCallBack, nextCallBack, previousCallBack);
1503     CHECK_NULL_RETURN(contentRow, nullptr);
1504     contentRow->AddChild(CreateDividerNode(textPickerNode), 1);
1505     contentRow->AddChild(CreateDividerNode(textPickerNode), SECOND_DIVEDER_NODE_INDEX);
1506     contentRow->AddChild(CreateDividerNode(textPickerNode), THIRD_DIVEDER_NODE_INDEX);
1507     contentRow->MountToParent(contentColumn);
1508     SetDialogNodePageActive(contentColumn, textPickerNode, dialogNodePage, columnCount);
1509     dialogNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
1510     return dialogNode;
1511 }
1512 
NeedAdaptForAging()1513 bool TextPickerDialogView::NeedAdaptForAging()
1514 {
1515     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
1516     CHECK_NULL_RETURN(pipeline, false);
1517     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1518     CHECK_NULL_RETURN(pickerTheme, false);
1519     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
1520     auto follow = pipeline->IsFollowSystem();
1521     if (GreatOrEqual(pipeline->GetFontScale(), pickerTheme->GetMaxOneFontScale()) &&
1522         Dimension(pipeline->GetRootHeight()).ConvertToVp() > pickerTheme->GetDeviceHeightLimit() &&
1523         (follow && (GreatOrEqual(maxAppFontScale, pickerTheme->GetMaxOneFontScale())))) {
1524         return true;
1525     }
1526     return false;
1527 }
1528 
AdjustFontSizeScale(const Dimension & fontSizeValue,double fontScale)1529 const Dimension TextPickerDialogView::AdjustFontSizeScale(const Dimension& fontSizeValue, double fontScale)
1530 {
1531     auto pipeline = PipelineContext::GetCurrentContextSafely();
1532     CHECK_NULL_RETURN(pipeline, fontSizeValue);
1533     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1534     CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
1535 
1536     auto adjustedScale = std::clamp(fontScale, pickerTheme->GetNormalFontScale(),
1537         pickerTheme->GetMaxTwoFontScale());
1538     return fontSizeValue * adjustedScale;
1539 }
1540 
ConvertFontScaleValue(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)1541 const Dimension TextPickerDialogView::ConvertFontScaleValue(
1542     const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
1543 {
1544     auto pipeline = PipelineContext::GetCurrentContextPtrSafelyWithCheck();
1545     CHECK_NULL_RETURN(pipeline, fontSizeValue);
1546     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1547     CHECK_NULL_RETURN(pickerTheme, fontSizeValue);
1548     float fontSizeScale = pipeline->GetFontScale();
1549     Dimension fontSizeValueResult = fontSizeValue;
1550     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
1551     if (pipeline->IsFollowSystem() && (!NearZero(maxAppFontScale))) {
1552         fontSizeScale = std::min(fontSizeScale, maxAppFontScale);
1553     }
1554     if (NeedAdaptForAging()) {
1555         if (fontSizeValue.Unit() == DimensionUnit::VP) {
1556             if (isUserSetFont) {
1557                 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
1558             }
1559             fontSizeValueResult = AdjustFontSizeScale(fontSizeValueResult, fontSizeScale);
1560         } else {
1561             if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxThirdFontScale())) {
1562                 fontSizeScale = pickerTheme->GetMaxTwoFontScale() / pickerTheme->GetMaxThirdFontScale();
1563                 fontSizeValueResult = fontSizeValue * fontSizeScale;
1564             }
1565             if (isUserSetFont) {
1566                 fontSizeValueResult = ConvertFontSizeLimit(fontSizeValueResult, fontSizeLimit, isUserSetFont);
1567             }
1568         }
1569     } else {
1570         if (isUserSetFont) {
1571             fontSizeValueResult = ConvertFontSizeLimit(fontSizeValue, fontSizeLimit, isUserSetFont);
1572         }
1573 
1574         if (GreatOrEqualCustomPrecision(fontSizeScale, pickerTheme->GetMaxOneFontScale()) &&
1575             fontSizeValueResult.Unit() != DimensionUnit::VP) {
1576             if (!NearZero(fontSizeScale)) {
1577                 fontSizeValueResult = fontSizeValueResult / fontSizeScale;
1578             }
1579         }
1580     }
1581     return fontSizeValueResult;
1582 }
1583 
ConvertFontSizeLimit(const Dimension & fontSizeValue,const Dimension & fontSizeLimit,bool isUserSetFont)1584 const Dimension TextPickerDialogView::ConvertFontSizeLimit(
1585     const Dimension& fontSizeValue, const Dimension& fontSizeLimit, bool isUserSetFont)
1586 {
1587     if (isUserSetFont == false) {
1588         return fontSizeValue;
1589     }
1590     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
1591     CHECK_NULL_RETURN(pipeline, fontSizeValue);
1592     auto fontScale = pipeline->GetFontScale();
1593     auto maxAppFontScale = pipeline->GetMaxAppFontScale();
1594     fontScale = std::min(fontScale, maxAppFontScale);
1595     fontScale = std::min(2.0f, fontScale);
1596     Dimension fontSizeValueResult = fontSizeValue;
1597     if (fontSizeValue.Unit() == DimensionUnit::VP) {
1598         if (!NearZero(fontScale) &&
1599             GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx() / fontScale)) {
1600             fontSizeValueResult = fontSizeLimit / fontScale;
1601         } else {
1602             fontSizeValueResult = fontSizeValue;
1603         }
1604     } else {
1605         if (GreatOrEqualCustomPrecision(fontSizeValue.ConvertToPx(), fontSizeLimit.ConvertToPx())) {
1606             fontSizeValueResult = fontSizeLimit;
1607         } else {
1608             fontSizeValueResult = fontSizeValue;
1609         }
1610     }
1611 
1612     return fontSizeValueResult;
1613 }
1614 
GetUserSettingLimit()1615 void TextPickerDialogView::GetUserSettingLimit()
1616 {
1617     auto pipeline = PipelineContext::GetCurrentContextSafely();
1618     CHECK_NULL_VOID(pipeline);
1619     auto pickerTheme = pipeline->GetTheme<PickerTheme>();
1620     CHECK_NULL_VOID(pickerTheme);
1621     selectedTextStyleFont_ = pickerTheme->GetUseSetSelectedTextStyle();
1622     normalTextStyleFont_ = pickerTheme->GetUserSetNormalTextStyle();
1623     disappearTextStyleFont_ = pickerTheme->GetUserSetDisappearTextStyle();
1624 }
1625 
1626 } // namespace OHOS::Ace::NG
1627