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