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