1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "core/interfaces/native/node/select_modifier.h"
16 
17 #include "core/components/common/layout/constants.h"
18 #include "core/components/select/select_theme.h"
19 #include "core/components/text/text_theme.h"
20 #include "core/components_ng/base/frame_node.h"
21 #include "core/components_ng/base/view_abstract_model_ng.h"
22 #include "core/components_ng/pattern/select/select_model_ng.h"
23 #include "core/pipeline/base/element_register.h"
24 #include "core/components_ng/pattern/select/select_model.h"
25 #include "frameworks/bridge/common/utils/utils.h"
26 
27 namespace OHOS::Ace::NG {
28 constexpr int32_t DEFAULT_GROUP_DIVIDER_VALUES_COUNT = 3;
29 const char DELIMITER = '|';
30 const char* ERR_CODE = "-1";
31 const int32_t SIZE_OF_FONT_INFO = 3;
32 const int32_t SIZE_OF_TWO = 2;
33 const int32_t DEFAULT_SELECT = 0;
34 
SetSpace(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)35 void SetSpace(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
36 {
37     auto* frameNode = reinterpret_cast<FrameNode*>(node);
38     CHECK_NULL_VOID(frameNode);
39     Dimension space = Dimension(value, static_cast<DimensionUnit>(unit));
40     SelectModelNG::SetSpace(frameNode, space);
41 }
42 
SetValue(ArkUINodeHandle node,ArkUI_CharPtr value)43 void SetValue(ArkUINodeHandle node, ArkUI_CharPtr value)
44 {
45     auto* frameNode = reinterpret_cast<FrameNode*>(node);
46     CHECK_NULL_VOID(frameNode);
47     SelectModelNG::SetValue(frameNode, value);
48 }
49 
SetSelected(ArkUINodeHandle node,ArkUI_Int32 idx)50 void SetSelected(ArkUINodeHandle node, ArkUI_Int32 idx)
51 {
52     auto* frameNode = reinterpret_cast<FrameNode*>(node);
53     CHECK_NULL_VOID(frameNode);
54     if (idx < -1) {
55         idx = -1;
56     }
57     SelectModelNG::SetSelected(frameNode, idx);
58 }
59 
SetSelectFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)60 void SetSelectFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
61 {
62     auto* frameNode = reinterpret_cast<FrameNode*>(node);
63     CHECK_NULL_VOID(frameNode);
64     SelectModelNG::SetFontColor(frameNode, Color(color));
65 }
66 
SetSelectedOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)67 void SetSelectedOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
68 {
69     auto* frameNode = reinterpret_cast<FrameNode*>(node);
70     CHECK_NULL_VOID(frameNode);
71     SelectModelNG::SetSelectedOptionBgColor(frameNode, Color(color));
72 }
73 
SetOptionBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)74 void SetOptionBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
75 {
76     auto* frameNode = reinterpret_cast<FrameNode*>(node);
77     CHECK_NULL_VOID(frameNode);
78     SelectModelNG::SetOptionBgColor(frameNode, Color(color));
79 }
80 
SetOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)81 void SetOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
82 {
83     auto* frameNode = reinterpret_cast<FrameNode*>(node);
84     CHECK_NULL_VOID(frameNode);
85     SelectModelNG::SetOptionFontColor(frameNode, Color(color));
86 }
87 
SetSelectedOptionFontColor(ArkUINodeHandle node,ArkUI_Uint32 color)88 void SetSelectedOptionFontColor(ArkUINodeHandle node, ArkUI_Uint32 color)
89 {
90     auto* frameNode = reinterpret_cast<FrameNode*>(node);
91     CHECK_NULL_VOID(frameNode);
92     SelectModelNG::SetSelectedOptionFontColor(frameNode, Color(color));
93 }
94 
SetArrowPosition(ArkUINodeHandle node,ArkUI_Int32 arrowPosition)95 void SetArrowPosition(ArkUINodeHandle node, ArkUI_Int32 arrowPosition)
96 {
97     auto* frameNode = reinterpret_cast<FrameNode*>(node);
98     CHECK_NULL_VOID(frameNode);
99     if (static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::START &&
100         static_cast<OHOS::Ace::ArrowPosition>(arrowPosition) != OHOS::Ace::ArrowPosition::END) {
101         arrowPosition = 0;
102     }
103     SelectModelNG::SetArrowPosition(frameNode, static_cast<ArrowPosition>(arrowPosition));
104 }
105 
SetMenuAlign(ArkUINodeHandle node,ArkUI_Int32 alignType,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 size)106 void SetMenuAlign(
107     ArkUINodeHandle node, ArkUI_Int32 alignType, const ArkUI_Float32* values,
108     const ArkUI_Int32* units, ArkUI_Int32 size)
109 {
110     auto* frameNode = reinterpret_cast<FrameNode*>(node);
111     CHECK_NULL_VOID(frameNode);
112     MenuAlign menuAlignObj;
113     menuAlignObj.alignType = static_cast<MenuAlignType>(alignType);
114     if (values != nullptr && units != nullptr && size == SIZE_OF_TWO) {
115         Dimension dx = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
116         Dimension dy = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
117 
118         menuAlignObj.offset = DimensionOffset(dx, dy);
119     }
120     SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
121 }
122 
SetFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)123 void SetFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
124 {
125     auto* frameNode = reinterpret_cast<FrameNode*>(node);
126     CHECK_NULL_VOID(frameNode);
127 
128     std::vector<std::string> res;
129     std::string fontValues = std::string(fontInfo);
130     StringUtils::StringSplitter(fontValues, DELIMITER, res);
131     if (res.size() != SIZE_OF_FONT_INFO) {
132         return;
133     }
134 
135     auto selectTheme = GetTheme<SelectTheme>();
136     CHECK_NULL_VOID(selectTheme);
137     auto textTheme = GetTheme<TextTheme>();
138     CHECK_NULL_VOID(textTheme);
139 
140     CalcDimension fontSize = selectTheme->GetFontSize();
141     if (res[0] != ERR_CODE) { // 0: index of font size data
142         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
143     }
144     SelectModelNG::SetFontSize(frameNode, fontSize);
145 
146     FontWeight weight = FontWeight::MEDIUM;
147     if (res[1] != ERR_CODE) { // 1: index of font weight data
148         weight = StringUtils::StringToFontWeight(res[1], FontWeight::MEDIUM);
149     }
150     SelectModelNG::SetFontWeight(frameNode, weight);
151 
152     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
153     if (res[2] != ERR_CODE) { // 2: index of font family data
154         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
155     }
156     SelectModelNG::SetFontFamily(frameNode, fontFamilies);
157 
158     auto style = static_cast<Ace::FontStyle>(styleVal);
159     SelectModelNG::SetItalicFontStyle(frameNode, style);
160 }
161 
SetOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)162 void SetOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
163 {
164     auto* frameNode = reinterpret_cast<FrameNode*>(node);
165     CHECK_NULL_VOID(frameNode);
166     std::vector<std::string> res;
167     std::string fontValues = std::string(fontInfo);
168     StringUtils::StringSplitter(fontValues, DELIMITER, res);
169     if (res.size() != SIZE_OF_FONT_INFO) {
170         return;
171     }
172 
173     auto selectTheme = GetTheme<SelectTheme>();
174     CHECK_NULL_VOID(selectTheme);
175     auto textTheme = GetTheme<TextTheme>();
176     CHECK_NULL_VOID(textTheme);
177 
178     CalcDimension fontSize = selectTheme->GetMenuFontSize();
179     if (res[0] != ERR_CODE) { // 0: index of font size data
180         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
181     }
182     SelectModelNG::SetOptionFontSize(frameNode, fontSize);
183 
184     FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
185     if (res[1] != ERR_CODE) { // 1: index of font weight data
186         weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
187     }
188     SelectModelNG::SetOptionFontWeight(frameNode, weight);
189 
190     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
191     if (res[2] != ERR_CODE) { // 2: index of font family data
192         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
193     }
194     SelectModelNG::SetOptionFontFamily(frameNode, fontFamilies);
195 
196     auto style = static_cast<Ace::FontStyle>(styleVal);
197     SelectModelNG::SetOptionItalicFontStyle(frameNode, style);
198 }
199 
SetSelectedOptionFont(ArkUINodeHandle node,ArkUI_CharPtr fontInfo,ArkUI_Int32 styleVal)200 void SetSelectedOptionFont(ArkUINodeHandle node, ArkUI_CharPtr fontInfo, ArkUI_Int32 styleVal)
201 {
202     auto* frameNode = reinterpret_cast<FrameNode*>(node);
203     CHECK_NULL_VOID(frameNode);
204     std::vector<std::string> res;
205     std::string fontValues = std::string(fontInfo);
206     StringUtils::StringSplitter(fontValues, DELIMITER, res);
207     if (res.size() != SIZE_OF_FONT_INFO) {
208         return;
209     }
210 
211     auto selectTheme = GetTheme<SelectTheme>();
212     CHECK_NULL_VOID(selectTheme);
213     auto textTheme = GetTheme<TextTheme>();
214     CHECK_NULL_VOID(textTheme);
215 
216     CalcDimension fontSize = selectTheme->GetFontSize();
217     if (res[0] != ERR_CODE) { // 0: index of font size data
218         fontSize = StringUtils::StringToCalcDimension(res[0], false, DimensionUnit::FP);
219     }
220     SelectModelNG::SetSelectedOptionFontSize(frameNode, fontSize);
221 
222     FontWeight weight = textTheme->GetTextStyle().GetFontWeight();
223     if (res[1] != ERR_CODE) { // 1: index of font weight data
224         weight = StringUtils::StringToFontWeight(res[1], FontWeight::REGULAR);
225     }
226     SelectModelNG::SetSelectedOptionFontWeight(frameNode, weight);
227 
228     std::vector<std::string> fontFamilies = textTheme->GetTextStyle().GetFontFamilies();
229     if (res[2] != ERR_CODE) { // 2: index of font family data
230         fontFamilies = Framework::ConvertStrToFontFamilies(res[2]);
231     }
232     SelectModelNG::SetSelectedOptionFontFamily(frameNode, fontFamilies);
233 
234     auto style = static_cast<Ace::FontStyle>(styleVal);
235     SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, style);
236 }
237 
ResetSpace(ArkUINodeHandle node)238 void ResetSpace(ArkUINodeHandle node)
239 {
240     auto* frameNode = reinterpret_cast<FrameNode*>(node);
241     CHECK_NULL_VOID(frameNode);
242     auto selectTheme = GetTheme<SelectTheme>();
243     CHECK_NULL_VOID(selectTheme);
244     Dimension space = selectTheme->GetContentSpinnerPadding();
245     SelectModelNG::SetSpace(frameNode, space);
246 }
247 
ResetValue(ArkUINodeHandle node)248 void ResetValue(ArkUINodeHandle node)
249 {
250     auto* frameNode = reinterpret_cast<FrameNode*>(node);
251     CHECK_NULL_VOID(frameNode);
252     SelectModelNG::SetValue(frameNode, "");
253 }
254 
ResetSelected(ArkUINodeHandle node)255 void ResetSelected(ArkUINodeHandle node)
256 {
257     auto* frameNode = reinterpret_cast<FrameNode*>(node);
258     CHECK_NULL_VOID(frameNode);
259     SelectModelNG::SetSelected(frameNode, DEFAULT_SELECT);
260 }
261 
ResetSelectFontColor(ArkUINodeHandle node)262 void ResetSelectFontColor(ArkUINodeHandle node)
263 {
264     auto* frameNode = reinterpret_cast<FrameNode*>(node);
265     CHECK_NULL_VOID(frameNode);
266     auto selectTheme = GetTheme<SelectTheme>();
267     CHECK_NULL_VOID(selectTheme);
268     SelectModelNG::SetFontColor(frameNode, selectTheme->GetFontColor());
269 }
270 
ResetSelectedOptionBgColor(ArkUINodeHandle node)271 void ResetSelectedOptionBgColor(ArkUINodeHandle node)
272 {
273     auto* frameNode = reinterpret_cast<FrameNode*>(node);
274     CHECK_NULL_VOID(frameNode);
275     auto selectTheme = GetTheme<SelectTheme>();
276     CHECK_NULL_VOID(selectTheme);
277     SelectModelNG::SetSelectedOptionBgColor(frameNode, selectTheme->GetSelectedColor());
278 }
279 
ResetOptionBgColor(ArkUINodeHandle node)280 void ResetOptionBgColor(ArkUINodeHandle node)
281 {
282     auto* frameNode = reinterpret_cast<FrameNode*>(node);
283     CHECK_NULL_VOID(frameNode);
284     auto selectTheme = GetTheme<SelectTheme>();
285     CHECK_NULL_VOID(selectTheme);
286     SelectModelNG::SetOptionBgColor(frameNode, selectTheme->GetBackgroundColor());
287 }
288 
ResetOptionFontColor(ArkUINodeHandle node)289 void ResetOptionFontColor(ArkUINodeHandle node)
290 {
291     auto* frameNode = reinterpret_cast<FrameNode*>(node);
292     CHECK_NULL_VOID(frameNode);
293     auto selectTheme = GetTheme<SelectTheme>();
294     CHECK_NULL_VOID(selectTheme);
295     SelectModelNG::SetOptionFontColor(frameNode, selectTheme->GetMenuFontColor());
296 }
297 
ResetSelectedOptionFontColor(ArkUINodeHandle node)298 void ResetSelectedOptionFontColor(ArkUINodeHandle node)
299 {
300     auto* frameNode = reinterpret_cast<FrameNode*>(node);
301     CHECK_NULL_VOID(frameNode);
302     auto selectTheme = GetTheme<SelectTheme>();
303     CHECK_NULL_VOID(selectTheme);
304     SelectModelNG::SetSelectedOptionFontColor(frameNode, selectTheme->GetSelectedColorText());
305 }
306 
ResetArrowPosition(ArkUINodeHandle node)307 void ResetArrowPosition(ArkUINodeHandle node)
308 {
309     auto* frameNode = reinterpret_cast<FrameNode*>(node);
310     CHECK_NULL_VOID(frameNode);
311     SelectModelNG::SetArrowPosition(frameNode, ArrowPosition::END);
312 }
313 
ResetMenuAlign(ArkUINodeHandle node)314 void ResetMenuAlign(ArkUINodeHandle node)
315 {
316     auto* frameNode = reinterpret_cast<FrameNode*>(node);
317     CHECK_NULL_VOID(frameNode);
318     MenuAlign menuAlignObj;
319     SelectModelNG::SetMenuAlign(frameNode, menuAlignObj);
320 }
321 
ResetFont(ArkUINodeHandle node)322 void ResetFont(ArkUINodeHandle node)
323 {
324     auto* frameNode = reinterpret_cast<FrameNode*>(node);
325     CHECK_NULL_VOID(frameNode);
326 
327     auto selectTheme = GetTheme<SelectTheme>();
328     CHECK_NULL_VOID(selectTheme);
329     auto textTheme = GetTheme<TextTheme>();
330     CHECK_NULL_VOID(textTheme);
331 
332     auto controlSize = SelectModelNG::GetControlSize(frameNode);
333     SelectModelNG::SetFontSize(frameNode, selectTheme->GetFontSize(controlSize));
334     SelectModelNG::SetFontWeight(frameNode, FontWeight::MEDIUM);
335     SelectModelNG::SetFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
336     SelectModelNG::SetItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
337 }
338 
ResetOptionFont(ArkUINodeHandle node)339 void ResetOptionFont(ArkUINodeHandle node)
340 {
341     auto* frameNode = reinterpret_cast<FrameNode*>(node);
342     CHECK_NULL_VOID(frameNode);
343 
344     auto selectTheme = GetTheme<SelectTheme>();
345     CHECK_NULL_VOID(selectTheme);
346     auto textTheme = GetTheme<TextTheme>();
347     CHECK_NULL_VOID(textTheme);
348 
349     SelectModelNG::SetOptionFontSize(frameNode, selectTheme->GetMenuFontSize());
350     SelectModelNG::SetOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
351     SelectModelNG::SetOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
352     SelectModelNG::SetOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
353 }
354 
ResetSelectedOptionFont(ArkUINodeHandle node)355 void ResetSelectedOptionFont(ArkUINodeHandle node)
356 {
357     auto* frameNode = reinterpret_cast<FrameNode*>(node);
358     CHECK_NULL_VOID(frameNode);
359 
360     auto selectTheme = GetTheme<SelectTheme>();
361     CHECK_NULL_VOID(selectTheme);
362     auto textTheme = GetTheme<TextTheme>();
363     CHECK_NULL_VOID(textTheme);
364 
365     SelectModelNG::SetSelectedOptionFontSize(frameNode, selectTheme->GetFontSize());
366     SelectModelNG::SetSelectedOptionFontWeight(frameNode, textTheme->GetTextStyle().GetFontWeight());
367     SelectModelNG::SetSelectedOptionFontFamily(frameNode, textTheme->GetTextStyle().GetFontFamilies());
368     SelectModelNG::SetSelectedOptionItalicFontStyle(frameNode, textTheme->GetTextStyle().GetFontStyle());
369 }
370 
SetSelectOptionWidthFitTrigger(ArkUINodeHandle node,ArkUI_Bool trigger)371 void SetSelectOptionWidthFitTrigger(ArkUINodeHandle node, ArkUI_Bool trigger)
372 {
373     auto* frameNode = reinterpret_cast<FrameNode*>(node);
374     CHECK_NULL_VOID(frameNode);
375     SelectModelNG::SetOptionWidthFitTrigger(frameNode, trigger);
376 }
377 
SetSelectOptionWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)378 void SetSelectOptionWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
379 {
380     auto* frameNode = reinterpret_cast<FrameNode*>(node);
381     CHECK_NULL_VOID(frameNode);
382     Dimension optionWidth = Dimension(value, static_cast<DimensionUnit>(unit));
383     SelectModelNG::SetHasOptionWidth(frameNode, true);
384     SelectModelNG::SetOptionWidth(frameNode, optionWidth);
385 }
386 
ResetSelectOptionWidth(ArkUINodeHandle node)387 void ResetSelectOptionWidth(ArkUINodeHandle node)
388 {
389     auto* frameNode = reinterpret_cast<FrameNode*>(node);
390     CHECK_NULL_VOID(frameNode);
391     Dimension optionWidth;
392     SelectModelNG::SetHasOptionWidth(frameNode, false);
393     SelectModelNG::SetOptionWidth(frameNode, optionWidth);
394 }
395 
SetSelectOptionHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)396 void SetSelectOptionHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
397 {
398     auto* frameNode = reinterpret_cast<FrameNode*>(node);
399     CHECK_NULL_VOID(frameNode);
400     Dimension optionHeight = Dimension(value, static_cast<DimensionUnit>(unit));
401     SelectModelNG::SetOptionHeight(frameNode, optionHeight);
402 }
403 
ResetSelectOptionHeight(ArkUINodeHandle node)404 void ResetSelectOptionHeight(ArkUINodeHandle node) {}
405 
SetSelectWidth(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)406 void SetSelectWidth(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
407 {
408     auto *frameNode = reinterpret_cast<FrameNode *>(node);
409     CHECK_NULL_VOID(frameNode);
410     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
411     if (unitEnum == DimensionUnit::CALC) {
412         ViewAbstract::SetWidth(
413             frameNode, CalcLength(CalcLength(std::string(calcValue))));
414     } else {
415         ViewAbstract::SetWidth(frameNode, CalcLength(value, unitEnum));
416     }
417 }
418 
ResetSelectWidth(ArkUINodeHandle node)419 void ResetSelectWidth(ArkUINodeHandle node)
420 {
421     auto *frameNode = reinterpret_cast<FrameNode *>(node);
422     CHECK_NULL_VOID(frameNode);
423     ViewAbstract::ClearWidthOrHeight(frameNode, true);
424 }
425 
SetSelectHeight(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit,ArkUI_CharPtr calcValue)426 void SetSelectHeight(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit, ArkUI_CharPtr calcValue)
427 {
428     auto *frameNode = reinterpret_cast<FrameNode *>(node);
429     CHECK_NULL_VOID(frameNode);
430     auto unitEnum = static_cast<OHOS::Ace::DimensionUnit>(unit);
431     if (unitEnum == DimensionUnit::CALC) {
432         ViewAbstract::SetHeight(
433             frameNode, CalcLength(CalcLength(std::string(calcValue))));
434     } else {
435         ViewAbstract::SetHeight(frameNode, CalcLength(value, unitEnum));
436     }
437 }
438 
ResetSelectHeight(ArkUINodeHandle node)439 void ResetSelectHeight(ArkUINodeHandle node)
440 {
441     auto *frameNode = reinterpret_cast<FrameNode *>(node);
442     CHECK_NULL_VOID(frameNode);
443     ViewAbstract::ClearWidthOrHeight(frameNode, false);
444 }
445 
SetSelectSize(ArkUINodeHandle node,const ArkUI_Float32 * number,const ArkUI_Int32 * unit,ArkUI_CharPtr * calc)446 void SetSelectSize(ArkUINodeHandle node, const ArkUI_Float32* number, const ArkUI_Int32* unit, ArkUI_CharPtr* calc)
447 {
448     CHECK_NULL_VOID(number);
449     CHECK_NULL_VOID(unit);
450     int32_t widthIndex = 0;
451     int32_t heightIndex = 1;
452     auto* frameNode = reinterpret_cast<FrameNode*>(node);
453     CHECK_NULL_VOID(frameNode);
454     if (*(unit + widthIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + widthIndex) != nullptr) {
455         ViewAbstract::SetWidth(frameNode, CalcLength(std::string(*(calc + widthIndex))));
456     } else {
457         ViewAbstract::SetWidth(
458             frameNode, CalcLength(*(number + widthIndex), static_cast<DimensionUnit>(*(unit + widthIndex))));
459     }
460     if (*(unit + heightIndex) == static_cast<int8_t>(DimensionUnit::CALC) && *(calc + heightIndex) != nullptr) {
461         ViewAbstract::SetHeight(frameNode, CalcLength(std::string(*(calc + heightIndex))));
462     } else {
463         ViewAbstract::SetHeight(
464             frameNode, CalcLength(*(number + heightIndex), static_cast<DimensionUnit>(*(unit + heightIndex))));
465     }
466 }
467 
ResetSelectSize(ArkUINodeHandle node)468 void ResetSelectSize(ArkUINodeHandle node)
469 {
470     auto* frameNode = reinterpret_cast<FrameNode*>(node);
471     CHECK_NULL_VOID(frameNode);
472     ViewAbstract::ClearWidthOrHeight(frameNode, true);
473     ViewAbstract::ClearWidthOrHeight(frameNode, false);
474 }
475 
SetControlSize(ArkUINodeHandle node,ArkUI_Int32 value)476 void SetControlSize(ArkUINodeHandle node, ArkUI_Int32 value)
477 {
478     auto* frameNode = reinterpret_cast<FrameNode*>(node);
479     CHECK_NULL_VOID(frameNode);
480     auto controlSize = static_cast<ControlSize>(value);
481     SelectModelNG::SetControlSize(frameNode, controlSize);
482 }
483 
ResetControlSize(ArkUINodeHandle node)484 void ResetControlSize(ArkUINodeHandle node) {}
485 
SetMenuBgColor(ArkUINodeHandle node,ArkUI_Uint32 color)486 void SetMenuBgColor(ArkUINodeHandle node, ArkUI_Uint32 color)
487 {
488     auto* frameNode = reinterpret_cast<FrameNode*>(node);
489     CHECK_NULL_VOID(frameNode);
490     SelectModelNG::SetMenuBackgroundColor(frameNode, Color(color));
491 }
492 
ResetMenuBgColor(ArkUINodeHandle node)493 void ResetMenuBgColor(ArkUINodeHandle node)
494 {
495     auto* frameNode = reinterpret_cast<FrameNode*>(node);
496     CHECK_NULL_VOID(frameNode);
497     auto selectTheme = GetTheme<SelectTheme>();
498     CHECK_NULL_VOID(selectTheme);
499     SelectModelNG::SetMenuBackgroundColor(frameNode, selectTheme->GetBackgroundColor());
500 }
501 
SetMenuBgBlurStyle(ArkUINodeHandle node,ArkUI_Int32 style)502 void SetMenuBgBlurStyle(ArkUINodeHandle node, ArkUI_Int32 style)
503 {
504     auto* frameNode = reinterpret_cast<FrameNode*>(node);
505     CHECK_NULL_VOID(frameNode);
506     BlurStyleOption styleOption;
507     styleOption.blurStyle = static_cast<OHOS::Ace::BlurStyle>(style);
508     SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
509 }
510 
ResetMenuBgBlurStyle(ArkUINodeHandle node)511 void ResetMenuBgBlurStyle(ArkUINodeHandle node)
512 {
513     auto* frameNode = reinterpret_cast<FrameNode*>(node);
514     CHECK_NULL_VOID(frameNode);
515     BlurStyleOption styleOption;
516     SelectModelNG::SetMenuBackgroundBlurStyle(frameNode, styleOption);
517 }
518 
SetSelectValue(ArkUINodeHandle node,ArkUI_CharPtr * values,ArkUI_CharPtr * icons,ArkUI_Uint32 length)519 void SetSelectValue(ArkUINodeHandle node, ArkUI_CharPtr* values, ArkUI_CharPtr* icons, ArkUI_Uint32 length)
520 {
521     auto* frameNode = reinterpret_cast<FrameNode*>(node);
522     CHECK_NULL_VOID(frameNode);
523     CHECK_NULL_VOID(values);
524     CHECK_NULL_VOID(icons);
525     std::vector<SelectParam> params(length);
526     for (uint32_t i = 0; i < length; i++) {
527         if (!values[i]) {
528             return;
529         }
530         params[i] = { values[i], icons[i] };
531     }
532     SelectModelNG::InitSelect(frameNode, params);
533 }
534 
ResetSelectValue(ArkUINodeHandle node)535 void ResetSelectValue(ArkUINodeHandle node)
536 {
537     auto* frameNode = reinterpret_cast<FrameNode*>(node);
538     CHECK_NULL_VOID(frameNode);
539     std::vector<SelectParam> params;
540     SelectModelNG::InitSelect(frameNode, params);
541 }
542 
SetSelectDivider(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)543 void SetSelectDivider(ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values,
544     const ArkUI_Int32* units, ArkUI_Int32 length)
545 {
546     auto* frameNode = reinterpret_cast<FrameNode*>(node);
547     CHECK_NULL_VOID(frameNode);
548 
549     if (length != DEFAULT_GROUP_DIVIDER_VALUES_COUNT) {
550         return;
551     }
552 
553     NG::SelectDivider divider;
554     divider.color = Color(color);
555     divider.strokeWidth = Dimension(values[0], static_cast<OHOS::Ace::DimensionUnit>(units[0]));
556     divider.startMargin = Dimension(values[1], static_cast<OHOS::Ace::DimensionUnit>(units[1]));
557     divider.endMargin = Dimension(values[2], static_cast<OHOS::Ace::DimensionUnit>(units[2]));
558 
559     SelectModelNG::SetDivider(frameNode, divider);
560 }
561 
ResetSelectDivider(ArkUINodeHandle node)562 void ResetSelectDivider(ArkUINodeHandle node)
563 {
564     auto* frameNode = reinterpret_cast<FrameNode*>(node);
565     CHECK_NULL_VOID(frameNode);
566     auto context = frameNode->GetContext();
567     CHECK_NULL_VOID(context);
568     auto themeManager = context->GetThemeManager();
569     CHECK_NULL_VOID(themeManager);
570     auto selectTheme = themeManager->GetTheme<SelectTheme>();
571     Dimension defaultStrokeWidth = 0.0_vp;
572     Dimension defaultMargin = -1.0_vp;
573     Color defaultColor = Color::TRANSPARENT;
574     NG::SelectDivider divider;
575     if (selectTheme) {
576         defaultStrokeWidth = selectTheme->GetDefaultDividerWidth();
577         defaultColor = selectTheme->GetLineColor();
578         divider.strokeWidth = defaultStrokeWidth;
579         divider.color = defaultColor;
580         divider.startMargin = defaultMargin;
581         divider.endMargin = defaultMargin;
582     }
583     SelectModelNG::SetDivider(frameNode, divider);
584 }
585 
ResetSelectDividerNull(ArkUINodeHandle node)586 void ResetSelectDividerNull(ArkUINodeHandle node)
587 {
588     auto* frameNode = reinterpret_cast<FrameNode*>(node);
589     CHECK_NULL_VOID(frameNode);
590     auto context = frameNode->GetContext();
591     CHECK_NULL_VOID(context);
592     auto themeManager = context->GetThemeManager();
593     CHECK_NULL_VOID(themeManager);
594     auto selectTheme = themeManager->GetTheme<SelectTheme>();
595     Dimension defaultStrokeWidth = 0.0_vp;
596     Dimension defaultMargin = -1.0_vp;
597     Color defaultColor = Color::TRANSPARENT;
598     NG::SelectDivider divider;
599     if (selectTheme) {
600         defaultColor = selectTheme->GetLineColor();
601         divider.strokeWidth = defaultStrokeWidth;
602         divider.color = defaultColor;
603         divider.startMargin = defaultMargin;
604         divider.endMargin = defaultMargin;
605     }
606     SelectModelNG::SetDivider(frameNode, divider);
607 }
608 
609 namespace NodeModifier {
GetSelectModifier()610 const ArkUISelectModifier* GetSelectModifier()
611 {
612     static const ArkUISelectModifier modifier = { SetSpace, SetValue, SetSelected, SetSelectFontColor,
613         SetSelectedOptionBgColor, SetOptionBgColor, SetOptionFontColor, SetSelectedOptionFontColor, SetArrowPosition,
614         SetMenuAlign, SetFont, SetOptionFont, SetSelectedOptionFont, ResetSpace, ResetValue, ResetSelected,
615         ResetSelectFontColor, ResetSelectedOptionBgColor, ResetOptionBgColor, ResetOptionFontColor,
616         ResetSelectedOptionFontColor, ResetArrowPosition, ResetMenuAlign, ResetFont, ResetOptionFont,
617         ResetSelectedOptionFont, SetSelectWidth, ResetSelectWidth, SetSelectHeight, ResetSelectHeight, SetSelectSize,
618         ResetSelectSize, SetSelectOptionWidthFitTrigger, SetSelectOptionWidth, ResetSelectOptionWidth,
619         SetSelectOptionHeight, ResetSelectOptionHeight, SetControlSize, ResetControlSize, SetMenuBgColor,
620         ResetMenuBgColor, SetMenuBgBlurStyle, ResetMenuBgBlurStyle, SetSelectValue, ResetSelectValue, SetSelectDivider,
621         ResetSelectDivider, ResetSelectDividerNull };
622 
623     return &modifier;
624 }
625 
GetCJUISelectModifier()626 const CJUISelectModifier* GetCJUISelectModifier()
627 {
628     static const CJUISelectModifier modifier = { SetSpace, SetValue, SetSelected, SetSelectFontColor,
629         SetSelectedOptionBgColor, SetOptionBgColor, SetOptionFontColor, SetSelectedOptionFontColor, SetArrowPosition,
630         SetMenuAlign, SetFont, SetOptionFont, SetSelectedOptionFont, ResetSpace, ResetValue, ResetSelected,
631         ResetSelectFontColor, ResetSelectedOptionBgColor, ResetOptionBgColor, ResetOptionFontColor,
632         ResetSelectedOptionFontColor, ResetArrowPosition, ResetMenuAlign, ResetFont, ResetOptionFont,
633         ResetSelectedOptionFont, SetSelectWidth, ResetSelectWidth, SetSelectHeight, ResetSelectHeight, SetSelectSize,
634         ResetSelectSize, SetSelectOptionWidthFitTrigger, SetSelectOptionWidth, ResetSelectOptionWidth,
635         SetSelectOptionHeight, ResetSelectOptionHeight, SetControlSize, ResetControlSize, SetMenuBgColor,
636         ResetMenuBgColor, SetMenuBgBlurStyle, ResetMenuBgBlurStyle, SetSelectValue, ResetSelectValue, SetSelectDivider,
637         ResetSelectDivider, ResetSelectDividerNull };
638 
639     return &modifier;
640 }
641 
SetOnSelectSelect(ArkUINodeHandle node,void * extraParam)642 void SetOnSelectSelect(ArkUINodeHandle node, void* extraParam)
643 {
644     auto* frameNode = reinterpret_cast<FrameNode*>(node);
645     CHECK_NULL_VOID(frameNode);
646     auto onEvent = [node, extraParam](int32_t index, const std::string& value) {
647         ArkUINodeEvent event;
648         event.kind = TEXT_ARRAY;
649         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
650         auto indexStr = std::to_string(index);
651         const char* arrayValue[] = {value.c_str(), indexStr.c_str()};
652         event.textArrayEvent.subKind = ON_SELECT_SELECT;
653         event.textArrayEvent.nativeStringArrayPtr = reinterpret_cast<intptr_t>(arrayValue);
654         SendArkUIAsyncEvent(&event);
655     };
656     SelectModelNG::SetOnSelect(frameNode, std::move(onEvent));
657 }
658 }
659 } // namespace OHOS::Ace::NG