• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "core/interfaces/native/node/node_textpicker_modifier.h"
16 
17 #include "base/geometry/dimension.h"
18 #include "base/utils/utils.h"
19 #include "bridge/common/utils/utils.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/common/properties/text_style.h"
22 #include "core/components/picker/picker_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/pattern/picker/picker_type_define.h"
25 #include "core/components_ng/pattern/tabs/tabs_model.h"
26 #include "core/components_ng/pattern/text_picker/textpicker_model_ng.h"
27 #include "core/interfaces/arkoala/arkoala_api.h"
28 #include "core/pipeline/base/element_register.h"
29 
30 namespace OHOS::Ace::NG {
31 namespace {
32 constexpr int32_t SIZE_OF_THREE = 3;
33 constexpr int32_t POS_0 = 0;
34 constexpr int32_t POS_1 = 1;
35 constexpr int32_t POS_2 = 2;
36 constexpr int NUM_3 = 3;
37 constexpr int32_t DEFAULT_GROUP_DIVIDER_VALUES_COUNT = 3;
38 const char DEFAULT_DELIMITER = '|';
39 const int32_t ERROR_INT_CODE = -1;
40 constexpr uint32_t MAX_SIZE = 12;
41 std::string g_strValue;
42 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
43 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
44     TextOverflow::MARQUEE };
45 
SetTextPickerBackgroundColor(ArkUINodeHandle node,ArkUI_Uint32 color)46 void SetTextPickerBackgroundColor(ArkUINodeHandle node, ArkUI_Uint32 color)
47 {
48     auto* frameNode = reinterpret_cast<FrameNode*>(node);
49     CHECK_NULL_VOID(frameNode);
50     TextPickerModelNG::SetBackgroundColor(frameNode, Color(color));
51 }
52 
ResetTextPickerBackgroundColor(ArkUINodeHandle node)53 void ResetTextPickerBackgroundColor(ArkUINodeHandle node)
54 {
55     auto* frameNode = reinterpret_cast<FrameNode*>(node);
56     CHECK_NULL_VOID(frameNode);
57     auto pipeline = frameNode->GetContext();
58     CHECK_NULL_VOID(pipeline);
59     auto theme = pipeline->GetTheme<DialogTheme>();
60     CHECK_NULL_VOID(theme);
61     TextPickerModelNG::SetBackgroundColor(frameNode, theme->GetBackgroundColor());
62 }
63 
GetTextPickerCanLoop(ArkUINodeHandle node)64 ArkUI_Int32 GetTextPickerCanLoop(ArkUINodeHandle node)
65 {
66     auto* frameNode = reinterpret_cast<FrameNode*>(node);
67     CHECK_NULL_RETURN(frameNode, 1);
68     return TextPickerModelNG::GetCanLoop(frameNode);
69 }
70 
SetTextPickerCanLoop(ArkUINodeHandle node,int canLoop)71 void SetTextPickerCanLoop(ArkUINodeHandle node, int canLoop)
72 {
73     auto* frameNode = reinterpret_cast<FrameNode*>(node);
74     CHECK_NULL_VOID(frameNode);
75     TextPickerModelNG::SetCanLoop(frameNode, canLoop);
76 }
77 
ResetTextPickerCanLoop(ArkUINodeHandle node)78 void ResetTextPickerCanLoop(ArkUINodeHandle node)
79 {
80     auto* frameNode = reinterpret_cast<FrameNode*>(node);
81     CHECK_NULL_VOID(frameNode);
82     TextPickerModelNG::SetCanLoop(frameNode, true);
83 }
84 
GetTextPickerSelectedIndex(ArkUINodeHandle node,ArkUI_Uint32 * values,ArkUI_Int32 size)85 void GetTextPickerSelectedIndex(ArkUINodeHandle node, ArkUI_Uint32* values, ArkUI_Int32 size)
86 {
87     auto* frameNode = reinterpret_cast<FrameNode*>(node);
88     CHECK_NULL_VOID(frameNode);
89     if (TextPickerModelNG::IsSingle(frameNode)) {
90         auto selectedValue = static_cast<ArkUI_Uint32>(TextPickerModelNG::getTextPickerSelectedIndex(frameNode));
91         values[0] = selectedValue;
92     } else {
93         auto selectedValue = TextPickerModelNG::getTextPickerSelecteds(frameNode);
94         if (static_cast<ArkUI_Uint32>(size) != selectedValue.size()) {
95             return;
96         }
97         for (int i = 0; i < size; i++) {
98             values[i] = selectedValue[i];
99         }
100     }
101 }
102 
SetTextPickerSelectedIndex(ArkUINodeHandle node,ArkUI_Uint32 * values,ArkUI_Int32 size)103 void SetTextPickerSelectedIndex(ArkUINodeHandle node, ArkUI_Uint32* values, ArkUI_Int32 size)
104 {
105     auto* frameNode = reinterpret_cast<FrameNode*>(node);
106     CHECK_NULL_VOID(frameNode);
107 
108     if (TextPickerModelNG::IsSingle(frameNode)) {
109         NodeModifier::SetSelectedIndexSingle(frameNode, values, size);
110     } else {
111         NodeModifier::SetSelectedIndexMulti(frameNode, values, size);
112     }
113 }
114 
ResetTextPickerSelectedIndex(ArkUINodeHandle node)115 void ResetTextPickerSelectedIndex(ArkUINodeHandle node)
116 {
117     auto* frameNode = reinterpret_cast<FrameNode*>(node);
118     CHECK_NULL_VOID(frameNode);
119     std::vector<uint32_t> selectedValues;
120     selectedValues.emplace_back(0);
121     if (TextPickerModelNG::IsSingle(frameNode)) {
122         NodeModifier::SetSelectedIndexSingle(frameNode, selectedValues.data(), selectedValues.size());
123     } else {
124         NodeModifier::SetSelectedIndexMulti(frameNode, selectedValues.data(), selectedValues.size());
125     }
126 }
127 
SetTextPickerTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)128 void SetTextPickerTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
129 {
130     auto* frameNode = reinterpret_cast<FrameNode*>(node);
131     CHECK_NULL_VOID(frameNode);
132     auto pipeline = frameNode->GetContext();
133     CHECK_NULL_VOID(pipeline);
134     auto themeManager = pipeline->GetThemeManager();
135     CHECK_NULL_VOID(themeManager);
136     auto theme = themeManager->GetTheme<PickerTheme>();
137     CHECK_NULL_VOID(theme);
138 
139     NG::PickerTextStyle textStyle;
140     std::vector<std::string> res;
141     std::string fontValues = std::string(fontInfo);
142     StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
143     if (res.size() != NUM_3) {
144         return;
145     }
146     textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
147     if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
148         textStyle.fontStyle = FONT_STYLES[style];
149     } else {
150         textStyle.fontStyle = FONT_STYLES[0];
151     }
152     textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
153     textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
154     textStyle.textColor = Color(color);
155     TextPickerModelNG::SetNormalTextStyle(frameNode, theme, textStyle);
156 }
157 
ResetTextPickerTextStyle(ArkUINodeHandle node)158 void ResetTextPickerTextStyle(ArkUINodeHandle node)
159 {
160     auto* frameNode = reinterpret_cast<FrameNode*>(node);
161     CHECK_NULL_VOID(frameNode);
162     NG::PickerTextStyle pickerTextStyle;
163     auto context = frameNode->GetContext();
164     CHECK_NULL_VOID(context);
165     auto themeManager = context->GetThemeManager();
166     CHECK_NULL_VOID(themeManager);
167     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
168     TextPickerModelNG::SetNormalTextStyle(frameNode, pickerTheme, pickerTextStyle);
169 }
170 
SetTextPickerSelectedTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)171 void SetTextPickerSelectedTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
172 {
173     auto* frameNode = reinterpret_cast<FrameNode*>(node);
174     CHECK_NULL_VOID(frameNode);
175     auto pipeline = frameNode->GetContext();
176     CHECK_NULL_VOID(pipeline);
177     auto themeManager = pipeline->GetThemeManager();
178     CHECK_NULL_VOID(themeManager);
179     auto theme = themeManager->GetTheme<PickerTheme>();
180     CHECK_NULL_VOID(theme);
181 
182     NG::PickerTextStyle textStyle;
183     std::vector<std::string> res;
184     std::string fontValues = std::string(fontInfo);
185     StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
186     if (res.size() != NUM_3) {
187         return;
188     }
189     textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
190     if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
191         textStyle.fontStyle = FONT_STYLES[style];
192     } else {
193         textStyle.fontStyle = FONT_STYLES[0];
194     }
195     textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
196     textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
197     textStyle.textColor = Color(color);
198     TextPickerModelNG::SetSelectedTextStyle(frameNode, theme, textStyle);
199 }
200 
ResetTextPickerSelectedTextStyle(ArkUINodeHandle node)201 void ResetTextPickerSelectedTextStyle(ArkUINodeHandle node)
202 {
203     auto* frameNode = reinterpret_cast<FrameNode*>(node);
204     CHECK_NULL_VOID(frameNode);
205     NG::PickerTextStyle pickerTextStyle;
206     auto context = frameNode->GetContext();
207     CHECK_NULL_VOID(context);
208     auto themeManager = context->GetThemeManager();
209     CHECK_NULL_VOID(themeManager);
210     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
211     TextPickerModelNG::SetSelectedTextStyle(frameNode, pickerTheme, pickerTextStyle);
212 }
213 
SetTextPickerDisappearTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style)214 void SetTextPickerDisappearTextStyle(
215     ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style)
216 {
217     auto* frameNode = reinterpret_cast<FrameNode*>(node);
218     CHECK_NULL_VOID(frameNode);
219     auto pipeline = frameNode->GetContext();
220     CHECK_NULL_VOID(pipeline);
221     auto themeManager = pipeline->GetThemeManager();
222     CHECK_NULL_VOID(themeManager);
223     auto theme = themeManager->GetTheme<PickerTheme>();
224     CHECK_NULL_VOID(theme);
225 
226     NG::PickerTextStyle textStyle;
227     std::vector<std::string> res;
228     std::string fontValues = std::string(fontInfo);
229     StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
230     if (res.size() != NUM_3) {
231         return;
232     }
233     textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
234     if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
235         textStyle.fontStyle = FONT_STYLES[style];
236     } else {
237         textStyle.fontStyle = FONT_STYLES[0];
238     }
239     textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
240     textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
241     textStyle.textColor = Color(color);
242     TextPickerModelNG::SetDisappearTextStyle(frameNode, theme, textStyle);
243 }
244 
ResetTextPickerDisappearTextStyle(ArkUINodeHandle node)245 void ResetTextPickerDisappearTextStyle(ArkUINodeHandle node)
246 {
247     auto* frameNode = reinterpret_cast<FrameNode*>(node);
248     CHECK_NULL_VOID(frameNode);
249     NG::PickerTextStyle pickerTextStyle;
250     auto context = frameNode->GetContext();
251     CHECK_NULL_VOID(context);
252     auto themeManager = context->GetThemeManager();
253     CHECK_NULL_VOID(themeManager);
254     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
255     TextPickerModelNG::SetDisappearTextStyle(frameNode, pickerTheme, pickerTextStyle);
256 }
257 
GetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node,ArkUI_Int32 dUnit)258 ArkUI_Float32 GetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node, ArkUI_Int32 dUnit)
259 {
260     auto* frameNode = reinterpret_cast<FrameNode*>(node);
261     CHECK_NULL_RETURN(frameNode, -1.0f);
262     return TextPickerModelNG::GetDefaultPickerItemHeight(frameNode).GetNativeValue(static_cast<DimensionUnit>(dUnit));
263 }
264 
SetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node,float dVal,ArkUI_Int32 dUnit)265 void SetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node, float dVal, ArkUI_Int32 dUnit)
266 {
267     auto* frameNode = reinterpret_cast<FrameNode*>(node);
268     CHECK_NULL_VOID(frameNode);
269     TextPickerModelNG::SetDefaultPickerItemHeight(frameNode, Dimension(dVal, static_cast<DimensionUnit>(dUnit)));
270 }
271 
ResetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node)272 void ResetTextPickerDefaultPickerItemHeight(ArkUINodeHandle node)
273 {
274     auto* frameNode = reinterpret_cast<FrameNode*>(node);
275     CHECK_NULL_VOID(frameNode);
276     auto height = Dimension(0.0);
277     TextPickerModelNG::SetDefaultPickerItemHeight(frameNode, height);
278 }
279 
GetTextPickerRangeStr(ArkUINodeHandle node)280 ArkUI_CharPtr GetTextPickerRangeStr(ArkUINodeHandle node)
281 {
282     auto* frameNode = reinterpret_cast<FrameNode*>(node);
283     CHECK_NULL_RETURN(frameNode, "");
284     g_strValue = TextPickerModelNG::getTextPickerRange(frameNode);
285     return g_strValue.c_str();
286 }
287 
GetTextPickerSingleRange(ArkUINodeHandle node)288 ArkUI_Int32 GetTextPickerSingleRange(ArkUINodeHandle node)
289 {
290     auto* frameNode = reinterpret_cast<FrameNode*>(node);
291     CHECK_NULL_RETURN(frameNode, ERROR_INT_CODE);
292     return TextPickerModelNG::GetTextPickerRangeType(frameNode);
293 }
294 
SetTextPickerRangeStr(ArkUINodeHandle node,ArkUI_CharPtr rangeStr,ArkUI_Bool isSingleRange,ArkUI_Int32 rangeType)295 void SetTextPickerRangeStr(
296     ArkUINodeHandle node, ArkUI_CharPtr rangeStr, ArkUI_Bool isSingleRange, ArkUI_Int32 rangeType)
297 {
298     auto* frameNode = reinterpret_cast<FrameNode*>(node);
299     CHECK_NULL_VOID(frameNode);
300     TextPickerModelNG::SetTextPickerSingeRange(static_cast<bool>(isSingleRange));
301     std::vector<std::string> getRangeVector;
302     StringUtils::StringSplitter(std::string(rangeStr), ';', getRangeVector);
303     if (isSingleRange) {
304         std::vector<NG::RangeContent> result;
305         for (const auto& text : getRangeVector) {
306             NG::RangeContent content;
307             content.icon_ = "";
308             content.text_ = text;
309             result.emplace_back(content);
310         }
311         TextPickerModelNG::SetRange(frameNode, result);
312     } else {
313         std::vector<NG::TextCascadePickerOptions> multiResult;
314         for (const auto& text : getRangeVector) {
315             NG::TextCascadePickerOptions option;
316             StringUtils::StringSplitter(std::string(text), ',', option.rangeResult);
317             multiResult.emplace_back(option);
318         }
319         TextPickerModelNG::SetColumns(frameNode, multiResult);
320     }
321     TextPickerModelNG::SetTextPickerRangeType(frameNode, rangeType);
322 }
323 
GetTextPickerValue(ArkUINodeHandle node)324 ArkUI_CharPtr GetTextPickerValue(ArkUINodeHandle node)
325 {
326     auto* frameNode = reinterpret_cast<FrameNode*>(node);
327     CHECK_NULL_RETURN(frameNode, "");
328     if (TextPickerModelNG::IsSingle(frameNode)) {
329         g_strValue = TextPickerModelNG::getTextPickerValue(frameNode);
330     } else {
331         g_strValue = TextPickerModelNG::getTextPickerValues(frameNode);
332     }
333     return g_strValue.c_str();
334 }
335 
SetTextPickerValue(ArkUINodeHandle node,ArkUI_CharPtr valueStr)336 void SetTextPickerValue(ArkUINodeHandle node, ArkUI_CharPtr valueStr)
337 {
338     auto* frameNode = reinterpret_cast<FrameNode*>(node);
339     CHECK_NULL_VOID(frameNode);
340     std::vector<std::string> getValueVector;
341     StringUtils::StringSplitter(std::string(valueStr), ';', getValueVector);
342     if (TextPickerModelNG::GetTextPickerSingeRange()) {
343         TextPickerModelNG::SetValue(frameNode, valueStr);
344     } else {
345         TextPickerModelNG::SetValues(frameNode, getValueVector);
346     }
347 }
348 
GetTextPickerSelectedTextStyle(ArkUINodeHandle node)349 ArkUI_CharPtr GetTextPickerSelectedTextStyle(ArkUINodeHandle node)
350 {
351     auto* frameNode = reinterpret_cast<FrameNode*>(node);
352     CHECK_NULL_RETURN(frameNode, "");
353     PickerTextStyle pickerTextStyle = TextPickerModelNG::getSelectedTextStyle(frameNode);
354     std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
355     std::string families;
356     if (fontFamilies.size() == 0) {
357         fontFamilies.emplace_back("HarmonyOS Sans");
358     }
359     //set index start
360     int index = 0;
361     for (auto& family : fontFamilies) {
362         families += family;
363         if (index != static_cast<int>(fontFamilies.size()) - 1) {
364             families += ",";
365         }
366         index++;
367     }
368     g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
369     g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
370     g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
371     g_strValue = g_strValue + families + ";";
372     g_strValue =
373         g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
374     return g_strValue.c_str();
375 }
376 
GetTextPickerTextStyle(ArkUINodeHandle node)377 ArkUI_CharPtr GetTextPickerTextStyle(ArkUINodeHandle node)
378 {
379     auto* frameNode = reinterpret_cast<FrameNode*>(node);
380     CHECK_NULL_RETURN(frameNode, "");
381     PickerTextStyle pickerTextStyle = TextPickerModelNG::getNormalTextStyle(frameNode);
382     std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
383     std::string families;
384     if (fontFamilies.size() == 0) {
385         fontFamilies.emplace_back("HarmonyOS Sans");
386     }
387     //set index start
388     int index = 0;
389     for (auto& family : fontFamilies) {
390         families += family;
391         if (index != static_cast<int>(fontFamilies.size()) - 1) {
392             families += ",";
393         }
394         index++;
395     }
396     g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
397     g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
398     g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
399     g_strValue = g_strValue + families + ";";
400     g_strValue =
401         g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
402     return g_strValue.c_str();
403 }
404 
GetTextPickerDisappearTextStyle(ArkUINodeHandle node)405 ArkUI_CharPtr GetTextPickerDisappearTextStyle(ArkUINodeHandle node)
406 {
407     auto* frameNode = reinterpret_cast<FrameNode*>(node);
408     CHECK_NULL_RETURN(frameNode, "");
409     PickerTextStyle pickerTextStyle = TextPickerModelNG::getDisappearTextStyle(frameNode);
410     std::vector<std::string> fontFamilies = pickerTextStyle.fontFamily.value_or(std::vector<std::string>());
411     std::string families;
412     if (fontFamilies.size() == 0) {
413         fontFamilies.emplace_back("HarmonyOS Sans");
414     }
415     //set index start
416     int index = 0;
417     for (auto& family : fontFamilies) {
418         families += family;
419         if (index != static_cast<int>(fontFamilies.size()) - 1) {
420             families += ",";
421         }
422         index++;
423     }
424     g_strValue = pickerTextStyle.textColor->ColorToString() + ";";
425     g_strValue = g_strValue + std::to_string(static_cast<int>(pickerTextStyle.fontSize->ConvertToFp())) + ";";
426     g_strValue = g_strValue + StringUtils::ToString(pickerTextStyle.fontWeight.value_or(FontWeight::W100)) + ";";
427     g_strValue = g_strValue + families + ";";
428     g_strValue =
429         g_strValue + StringUtils::ToStringNDK(pickerTextStyle.fontStyle.value_or(OHOS::Ace::FontStyle::NORMAL));
430     return g_strValue.c_str();
431 }
432 
SetTextPickerDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)433 void SetTextPickerDivider(
434     ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
435 {
436     auto* frameNode = reinterpret_cast<FrameNode*>(node);
437     CHECK_NULL_VOID(frameNode);
438 
439     if (length != DEFAULT_GROUP_DIVIDER_VALUES_COUNT) {
440         return;
441     }
442 
443     NG::ItemDivider divider;
444     divider.color = Color(color);
445     divider.strokeWidth = Dimension(values[POS_0], static_cast<OHOS::Ace::DimensionUnit>(units[POS_0]));
446     divider.startMargin = Dimension(values[POS_1], static_cast<OHOS::Ace::DimensionUnit>(units[POS_1]));
447     divider.endMargin = Dimension(values[POS_2], static_cast<OHOS::Ace::DimensionUnit>(units[POS_2]));
448 
449     TextPickerModelNG::SetDivider(frameNode, divider);
450 }
451 
ResetTextPickerDivider(ArkUINodeHandle node)452 void ResetTextPickerDivider(ArkUINodeHandle node)
453 {
454     auto* frameNode = reinterpret_cast<FrameNode*>(node);
455     CHECK_NULL_VOID(frameNode);
456     NG::ItemDivider divider;
457     TextPickerModelNG::SetDivider(frameNode, divider);
458 }
459 
SetTextPickerGradientHeight(ArkUINodeHandle node,ArkUI_Float32 dVal,ArkUI_Int32 dUnit)460 void SetTextPickerGradientHeight(ArkUINodeHandle node, ArkUI_Float32 dVal, ArkUI_Int32 dUnit)
461 {
462     auto* frameNode = reinterpret_cast<FrameNode*>(node);
463     CHECK_NULL_VOID(frameNode);
464     TextPickerModelNG::SetGradientHeight(frameNode, Dimension(dVal, static_cast<DimensionUnit>(dUnit)));
465 }
466 
ResetTextPickerGradientHeight(ArkUINodeHandle node)467 void ResetTextPickerGradientHeight(ArkUINodeHandle node)
468 {
469     auto* frameNode = reinterpret_cast<FrameNode*>(node);
470     CHECK_NULL_VOID(frameNode);
471 
472     auto pipeline = frameNode->GetContext();
473     CHECK_NULL_VOID(pipeline);
474     auto themeManager = pipeline->GetThemeManager();
475     CHECK_NULL_VOID(themeManager);
476     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
477     CHECK_NULL_VOID(pickerTheme);
478 
479     CalcDimension height;
480     if (pickerTheme) {
481         height = pickerTheme->GetGradientHeight();
482     } else {
483         height = 0.0_vp;
484     }
485 
486     TextPickerModelNG::SetGradientHeight(frameNode, height);
487 }
488 
SetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node,int disableTextStyleAnimation)489 void SetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node, int disableTextStyleAnimation)
490 {
491     auto* frameNode = reinterpret_cast<FrameNode*>(node);
492     CHECK_NULL_VOID(frameNode);
493     TextPickerModelNG::SetDisableTextStyleAnimation(frameNode, disableTextStyleAnimation);
494 }
495 
ResetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node)496 void ResetTextPickerDisableTextStyleAnimation(ArkUINodeHandle node)
497 {
498     auto* frameNode = reinterpret_cast<FrameNode*>(node);
499     CHECK_NULL_VOID(frameNode);
500     TextPickerModelNG::SetDisableTextStyleAnimation(frameNode, false);
501 }
502 
SetTextPickerDefaultTextStyle(ArkUINodeHandle node,ArkUI_Uint32 color,ArkUI_CharPtr fontInfo,ArkUI_Int32 style,ArkUI_CharPtr minFontSize,ArkUI_CharPtr maxFontSize,ArkUI_Int32 overflow)503 void SetTextPickerDefaultTextStyle(ArkUINodeHandle node, ArkUI_Uint32 color, ArkUI_CharPtr fontInfo, ArkUI_Int32 style,
504     ArkUI_CharPtr minFontSize, ArkUI_CharPtr maxFontSize, ArkUI_Int32 overflow)
505 {
506     auto* frameNode = reinterpret_cast<FrameNode*>(node);
507     CHECK_NULL_VOID(frameNode);
508     auto pipeline = frameNode->GetContext();
509     CHECK_NULL_VOID(pipeline);
510     auto themeManager = pipeline->GetThemeManager();
511     CHECK_NULL_VOID(themeManager);
512     auto theme = themeManager->GetTheme<TextTheme>();
513     CHECK_NULL_VOID(theme);
514 
515     NG::PickerTextStyle textStyle;
516     std::vector<std::string> res;
517     std::string fontValues = std::string(fontInfo);
518     StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
519     if (res.size() != NUM_3) {
520         return;
521     }
522     textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
523     if (style >= 0 && style < static_cast<int32_t>(FONT_STYLES.size())) {
524         textStyle.fontStyle = FONT_STYLES[style];
525     } else {
526         textStyle.fontStyle = FONT_STYLES[0];
527     }
528     textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
529     textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1]);
530     textStyle.textColor = Color(color);
531     textStyle.minFontSize = StringUtils::StringToCalcDimension(minFontSize, false, DimensionUnit::FP);
532     textStyle.maxFontSize = StringUtils::StringToCalcDimension(maxFontSize, false, DimensionUnit::FP);
533     if (overflow >= 0 && overflow < static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
534         textStyle.textOverflow = TEXT_OVERFLOWS[overflow];
535     } else {
536         textStyle.textOverflow = TEXT_OVERFLOWS[0];
537     }
538 
539     TextPickerModelNG::SetDefaultTextStyle(frameNode, theme, textStyle);
540 }
541 
ResetTextPickerDefaultTextStyle(ArkUINodeHandle node)542 void ResetTextPickerDefaultTextStyle(ArkUINodeHandle node)
543 {
544     auto* frameNode = reinterpret_cast<FrameNode*>(node);
545     CHECK_NULL_VOID(frameNode);
546     auto pipeline = frameNode->GetContext();
547     CHECK_NULL_VOID(pipeline);
548     auto themeManager = pipeline->GetThemeManager();
549     CHECK_NULL_VOID(themeManager);
550     auto theme = themeManager->GetTheme<TextTheme>();
551     CHECK_NULL_VOID(theme);
552     NG::PickerTextStyle pickerTextStyle;
553     TextPickerModelNG::SetDefaultTextStyle(frameNode, theme, pickerTextStyle);
554 }
555 
GetTextPickerSelectedSize(ArkUINodeHandle node)556 ArkUI_Int32 GetTextPickerSelectedSize(ArkUINodeHandle node)
557 {
558     auto* frameNode = reinterpret_cast<FrameNode*>(node);
559     CHECK_NULL_RETURN(frameNode, 0);
560     if (TextPickerModelNG::IsSingle(frameNode)) {
561         return 1;
562     }
563     return TextPickerModelNG::GetSelectedSize(frameNode);
564 }
565 
566 } // namespace
567 
568 namespace NodeModifier {
GetTextPickerModifier()569 const ArkUITextPickerModifier* GetTextPickerModifier()
570 {
571     static const ArkUITextPickerModifier modifier = { SetTextPickerBackgroundColor, SetTextPickerCanLoop,
572         GetTextPickerSelectedIndex, SetTextPickerSelectedIndex, GetTextPickerTextStyle, SetTextPickerTextStyle,
573         GetTextPickerSelectedTextStyle, SetTextPickerSelectedTextStyle, GetTextPickerDisappearTextStyle,
574         SetTextPickerDisappearTextStyle, SetTextPickerDefaultPickerItemHeight, ResetTextPickerCanLoop,
575         ResetTextPickerSelectedIndex, ResetTextPickerTextStyle, ResetTextPickerSelectedTextStyle,
576         ResetTextPickerDisappearTextStyle, ResetTextPickerDefaultPickerItemHeight, ResetTextPickerBackgroundColor,
577         GetTextPickerRangeStr, GetTextPickerSingleRange, SetTextPickerRangeStr, GetTextPickerValue, SetTextPickerValue,
578         SetTextPickerDivider, ResetTextPickerDivider, SetTextPickerGradientHeight, ResetTextPickerGradientHeight,
579         GetTextPickerSelectedSize, GetTextPickerCanLoop, GetTextPickerDefaultPickerItemHeight,
580         SetTextPickerDisableTextStyleAnimation, ResetTextPickerDisableTextStyleAnimation, SetTextPickerDefaultTextStyle,
581         ResetTextPickerDefaultTextStyle };
582 
583     return &modifier;
584 }
585 
GetCJUITextPickerModifier()586 const CJUITextPickerModifier* GetCJUITextPickerModifier()
587 {
588     static const CJUITextPickerModifier modifier = { SetTextPickerBackgroundColor, SetTextPickerCanLoop,
589         GetTextPickerSelectedIndex, SetTextPickerSelectedIndex, GetTextPickerTextStyle, SetTextPickerTextStyle,
590         GetTextPickerSelectedTextStyle, SetTextPickerSelectedTextStyle, GetTextPickerDisappearTextStyle,
591         SetTextPickerDisappearTextStyle, SetTextPickerDefaultPickerItemHeight, ResetTextPickerCanLoop,
592         ResetTextPickerSelectedIndex, ResetTextPickerTextStyle, ResetTextPickerSelectedTextStyle,
593         ResetTextPickerDisappearTextStyle, ResetTextPickerDefaultPickerItemHeight, ResetTextPickerBackgroundColor,
594         GetTextPickerRangeStr, GetTextPickerSingleRange, SetTextPickerRangeStr, GetTextPickerValue, SetTextPickerValue,
595         SetTextPickerDivider, ResetTextPickerDivider, SetTextPickerGradientHeight, ResetTextPickerGradientHeight,
596         GetTextPickerSelectedSize, GetTextPickerCanLoop, GetTextPickerDefaultPickerItemHeight };
597 
598     return &modifier;
599 }
600 
GetPickerTextStyle(uint32_t color,ArkUI_CharPtr fontInfo,int32_t styleVal,NG::PickerTextStyle & textStyle)601 void GetPickerTextStyle(uint32_t color, ArkUI_CharPtr fontInfo, int32_t styleVal, NG::PickerTextStyle& textStyle)
602 {
603     textStyle.textColor = Color(color);
604 
605     std::vector<std::string> res;
606     std::string fontValues = std::string(fontInfo);
607     StringUtils::StringSplitter(fontValues, DEFAULT_DELIMITER, res);
608 
609     if (res.size() != SIZE_OF_THREE) {
610         return;
611     }
612 
613     if (res[POS_0] != "-1") {
614         textStyle.fontSize = StringUtils::StringToCalcDimension(res[POS_0], false, DimensionUnit::FP);
615     } else {
616         textStyle.fontSize = Dimension(-1);
617     }
618 
619     if (res[POS_1] != "-1") {
620         textStyle.fontWeight = StringUtils::StringToFontWeight(res[POS_1], FontWeight::NORMAL);
621     }
622 
623     if (res[POS_2] != "-1") {
624         textStyle.fontFamily = Framework::ConvertStrToFontFamilies(res[POS_2]);
625     }
626     textStyle.fontStyle = static_cast<Ace::FontStyle>(styleVal);
627 }
628 
SetSelectedIndexSingle(FrameNode * frameNode,uint32_t * selectedValues,const int32_t size)629 void SetSelectedIndexSingle(FrameNode* frameNode, uint32_t* selectedValues, const int32_t size)
630 {
631     std::vector<NG::RangeContent> rangeResult;
632     TextPickerModelNG::GetSingleRange(frameNode, rangeResult);
633     if (selectedValues[0] >= rangeResult.size()) {
634         TextPickerModelNG::SetSelected(frameNode, 0);
635     } else {
636         TextPickerModelNG::SetSelected(frameNode, selectedValues[0]);
637     }
638 }
639 
SetSelectedIndexMultiInternal(FrameNode * frameNode,uint32_t count,std::vector<NG::TextCascadePickerOptions> & options,std::vector<uint32_t> & selectedValues)640 void SetSelectedIndexMultiInternal(FrameNode* frameNode, uint32_t count,
641     std::vector<NG::TextCascadePickerOptions>& options, std::vector<uint32_t>& selectedValues)
642 {
643     if (!TextPickerModelNG::IsCascade(frameNode)) {
644         NodeModifier::SetSelectedInternal(count, options, selectedValues);
645     } else {
646         TextPickerModelNG::SetHasSelectAttr(frameNode, true);
647         NodeModifier::ProcessCascadeSelected(options, 0, selectedValues);
648         uint32_t maxCount = TextPickerModelNG::GetMaxCount(frameNode);
649         if (selectedValues.size() < maxCount) {
650             auto differ = maxCount - selectedValues.size();
651             for (uint32_t i = 0; i < differ; i++) {
652                 selectedValues.emplace_back(0);
653             }
654         }
655     }
656 }
657 
SetSelectedIndexSingleInternal(const std::vector<NG::TextCascadePickerOptions> & options,uint32_t count,uint32_t & selectedValue,std::vector<uint32_t> & selectedValues)658 void SetSelectedIndexSingleInternal(const std::vector<NG::TextCascadePickerOptions>& options, uint32_t count,
659     uint32_t& selectedValue, std::vector<uint32_t>& selectedValues)
660 {
661     if (options.size() > 0) {
662         if (selectedValue >= options[0].rangeResult.size()) {
663             selectedValue = 0;
664         }
665         selectedValues.emplace_back(selectedValue);
666         for (uint32_t i = 1; i < count; i++) {
667             selectedValues.emplace_back(0);
668         }
669     } else {
670         for (uint32_t i = 0; i < count; i++) {
671             selectedValues.emplace_back(0);
672         }
673     }
674 }
675 
SetSelectedInternal(uint32_t count,std::vector<NG::TextCascadePickerOptions> & options,std::vector<uint32_t> & selectedValues)676 void SetSelectedInternal(
677     uint32_t count, std::vector<NG::TextCascadePickerOptions>& options, std::vector<uint32_t>& selectedValues)
678 {
679     for (uint32_t i = 0; i < count; i++) {
680         uint32_t val = selectedValues.size() > 0 ? selectedValues.size() - 1 : 0;
681         if (i > val) {
682             selectedValues.emplace_back(0);
683         } else {
684             if (selectedValues[i] >= options[i].rangeResult.size()) {
685                 selectedValues[i] = 0;
686             }
687         }
688     }
689 }
690 
SetSelectedIndexMulti(FrameNode * frameNode,uint32_t * inputs,const int32_t size)691 void SetSelectedIndexMulti(FrameNode* frameNode, uint32_t* inputs, const int32_t size)
692 {
693     std::vector<NG::TextCascadePickerOptions> options;
694     TextPickerModelNG::GetMultiOptions(frameNode, options);
695 
696     auto count = TextPickerModelNG::IsCascade(frameNode) ? TextPickerModelNG::GetMaxCount(frameNode) : options.size();
697     std::vector<uint32_t> selectedValues;
698 
699     if (size >= 0) {
700         selectedValues.assign(inputs, inputs + size);
701         SetSelectedIndexMultiInternal(frameNode, count, options, selectedValues);
702     } else {
703         TextPickerModelNG::SetHasSelectAttr(frameNode, true);
704         SetSelectedIndexSingleInternal(options, count, inputs[0], selectedValues);
705     }
706     TextPickerModelNG::SetSelecteds(frameNode, selectedValues);
707 }
708 
ProcessCascadeSelected(const std::vector<NG::TextCascadePickerOptions> & options,uint32_t index,std::vector<uint32_t> & selectedValues)709 void ProcessCascadeSelected(
710     const std::vector<NG::TextCascadePickerOptions>& options, uint32_t index, std::vector<uint32_t>& selectedValues)
711 {
712     const size_t size = options.size();
713     if (size == 0) {
714         return;
715     }
716     std::vector<std::string> rangeResultValue;
717     for (size_t i = 0; i < size; i++) {
718         rangeResultValue.emplace_back(options[i].rangeResult[0]);
719     }
720     uint32_t val = selectedValues.size() > 0 ? selectedValues.size() - 1 : 0;
721     if (index > val) {
722         selectedValues.emplace_back(0);
723     }
724     if (selectedValues[index] >= rangeResultValue.size()) {
725         selectedValues[index] = 0;
726     }
727     if ((selectedValues[index] <= size - 1) && (options[selectedValues[index]].children.size() > 0)) {
728         ProcessCascadeSelected(options[selectedValues[index]].children, index + 1, selectedValues);
729     }
730 }
731 
SetTextPickerOnChange(ArkUINodeHandle node,void * extraParam)732 void SetTextPickerOnChange(ArkUINodeHandle node, void* extraParam)
733 {
734     auto* frameNode = reinterpret_cast<FrameNode*>(node);
735     CHECK_NULL_VOID(frameNode);
736     auto onChangeEvent = [node, extraParam](
737                              const std::vector<std::string>& value, const std::vector<double>& indexVector) {
738         ArkUINodeEvent event;
739         event.kind = COMPONENT_ASYNC_EVENT;
740         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
741         event.componentAsyncEvent.subKind = ON_TEXT_PICKER_CHANGE;
742         for (size_t i = 0; i < indexVector.size() && i < MAX_SIZE; i++) {
743             event.componentAsyncEvent.data[i].i32 = static_cast<int32_t>(indexVector[i]);
744         }
745         SendArkUIAsyncEvent(&event);
746     };
747     TextPickerModelNG::SetOnCascadeChange(frameNode, std::move(onChangeEvent));
748 }
749 
SetTextPickerOnScrollStop(ArkUINodeHandle node,void * extraParam)750 void SetTextPickerOnScrollStop(ArkUINodeHandle node, void* extraParam)
751 {
752     auto* frameNode = reinterpret_cast<FrameNode*>(node);
753     CHECK_NULL_VOID(frameNode);
754     auto onScrollStopEvent = [node, extraParam](
755                              const std::vector<std::string>& value, const std::vector<double>& indexVector) {
756         ArkUINodeEvent event;
757         event.kind = COMPONENT_ASYNC_EVENT;
758         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
759         event.componentAsyncEvent.subKind = ON_TEXT_PICKER_SCROLL_STOP;
760         for (size_t i = 0; i < indexVector.size() && i < MAX_SIZE; i++) {
761             event.componentAsyncEvent.data[i].i32 = static_cast<int32_t>(indexVector[i]);
762         }
763         SendArkUIAsyncEvent(&event);
764     };
765     TextPickerModelNG::SetOnScrollStop(frameNode, std::move(onScrollStopEvent));
766 }
767 } // namespace NodeModifier
768 } // namespace OHOS::Ace::NG
769