• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_select_bridge.h"
16 
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "bridge/declarative_frontend/jsview/js_symbol_modifier.h"
21 #include "core/components_ng/base/frame_node.h"
22 #include "interfaces/inner_api/ui_session/ui_session_manager.h"
23 
24 namespace OHOS::Ace::NG {
25 namespace {
26 constexpr int NUM_0 = 0;
27 constexpr int NUM_1 = 1;
28 constexpr int NUM_2 = 2;
29 constexpr int NUM_3 = 3;
30 constexpr int NUM_4 = 4;
31 constexpr int NUM_5 = 5;
32 constexpr int32_t OFFSET_OF_COLOR = 5;
33 const int32_t SIZE_OF_TWO = 2;
34 const std::string FORMAT_FONT = "%s|%s|%s";
35 const std::string DEFAULT_STR = "-1";
36 const char* SELECT_NODEPTR_OF_UINODE = "nodePtr_";
37 const Dimension invalidDimension = Dimension(0.0, DimensionUnit::INVALID);
38 
BuildSelectDividerStyleOptions(EcmaVM * vm,Local<JSValueRef> strokeWidthArg,Local<JSValueRef> startMarginArg,Local<JSValueRef> endMarginArg)39 ArkUIMenuDividerOptions BuildSelectDividerStyleOptions(
40     EcmaVM* vm, Local<JSValueRef> strokeWidthArg, Local<JSValueRef> startMarginArg, Local<JSValueRef> endMarginArg)
41 {
42     ArkUIDimensionType strokeWidthOption;
43     ArkUIDimensionType startMarginOption;
44     ArkUIDimensionType endMarginOption;
45 
46     CalcDimension strokeWidth;
47     if (!ArkTSUtils::ParseJsLengthMetrics(vm, strokeWidthArg, strokeWidth)) {
48         strokeWidth = invalidDimension;
49     }
50     strokeWidthOption.value = strokeWidth.Value();
51     strokeWidthOption.units = static_cast<int32_t>(strokeWidth.Unit());
52 
53     CalcDimension startMargin;
54     if (!ArkTSUtils::ParseJsLengthMetrics(vm, startMarginArg, startMargin)) {
55         startMargin = invalidDimension;
56     }
57     startMarginOption.value = startMargin.Value();
58     startMarginOption.units = static_cast<int32_t>(startMargin.Unit());
59 
60     CalcDimension endMargin;
61     if (!ArkTSUtils::ParseJsLengthMetrics(vm, endMarginArg, endMargin)) {
62         endMargin = invalidDimension;
63     }
64     endMarginOption.value = endMargin.Value();
65     endMarginOption.units = static_cast<int32_t>(endMargin.Unit());
66 
67     ArkUIMenuDividerOptions dividerOptions;
68     dividerOptions.strokeWidth = strokeWidthOption;
69     dividerOptions.startMargin = startMarginOption;
70     dividerOptions.endMargin = endMarginOption;
71     return dividerOptions;
72 }
73 
74 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)75 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
76 {
77     return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
78            (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
79            valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
80 }
81 
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)82 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
83     const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
84 {
85     values[0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
86     values[1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
87     values[2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
88 }
89 
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)90 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
91     const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
92 {
93     units[0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
94     units[1] = static_cast<int32_t>(dividerStartMargin.Unit());
95     units[2] = static_cast<int32_t>(dividerEndMargin.Unit());
96 }
97 } // namespace
98 
JsSelectChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)99 panda::Local<panda::JSValueRef> JsSelectChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
100 {
101     auto vm = runtimeCallInfo->GetVM();
102     auto firstArg = runtimeCallInfo->GetCallArgRef(0);
103     auto secondArg = runtimeCallInfo->GetCallArgRef(1);
104     if (!firstArg->IsNumber()) {
105         return panda::JSValueRef::Undefined(vm);
106     }
107     auto index = firstArg->ToNumber(vm)->Value();
108     auto value = secondArg->ToString(vm)->ToString(vm);
109     auto ref = runtimeCallInfo->GetThisRef();
110     auto obj = ref->ToObject(vm);
111     FrameNode* frameNode = nullptr;
112     if (obj->GetNativePointerFieldCount(vm) < 1) {
113         if (!ref->IsProxy(vm)) {
114             return panda::JSValueRef::Undefined(vm);
115         }
116         auto frameNodeIdValue = obj->Get(vm, "frameNodeId_");
117         CHECK_EQUAL_RETURN(
118             frameNodeIdValue.IsEmpty() || frameNodeIdValue->IsNull(), true, panda::JSValueRef::Undefined(vm));
119         auto frameNodeId = frameNodeIdValue->Int32Value(vm);
120         frameNode = ElementRegister::GetInstance()->GetFrameNodePtrById(frameNodeId);
121     } else {
122         frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
123     }
124     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
125     SelectModelNG::SetChangeValue(frameNode, index, value);
126     return panda::JSValueRef::Undefined(vm);
127 }
128 
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)129 ArkUINativeModuleValue SelectBridge::SelectBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
130 {
131     EcmaVM* vm = runtimeCallInfo->GetVM();
132     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
133     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
134     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
135     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
136     auto pipeline = PipelineBase::GetCurrentContext();
137     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
138     auto selectTheme = pipeline->GetTheme<SelectTheme>();
139     CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
140 
141     CalcDimension space;
142     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, space)) {
143         space = selectTheme->GetContentSpinnerPadding();
144     }
145     if (LessNotEqual(space.Value(), 0.0) || space.Unit() == DimensionUnit::PERCENT) {
146         space = selectTheme->GetContentSpinnerPadding();
147     }
148 
149     GetArkUINodeModifiers()->getSelectModifier()->setSpace(
150         nativeNode, space.Value(), static_cast<int32_t>(space.Unit()));
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
SetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue SelectBridge::SetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
159     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
160     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
161     std::string value;
162     RefPtr<ResourceObject> valueResObj;
163     ArkTSUtils::ParseJsString(vm, secondArg, value, valueResObj);
164     auto valueRawPtr = AceType::RawPtr(valueResObj);
165     GetArkUINodeModifiers()->getSelectModifier()->setValuePtr(nativeNode, value.c_str(), valueRawPtr);
166     return panda::JSValueRef::Undefined(vm);
167 }
168 
SetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)169 ArkUINativeModuleValue SelectBridge::SetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
170 {
171     EcmaVM* vm = runtimeCallInfo->GetVM();
172     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
173     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
174     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
175     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
176     int32_t value = 0;
177     RefPtr<ResourceObject> valueResObj;
178     if (ArkTSUtils::ParseJsIntegerWithResource(vm, secondArg, value, valueResObj)) {
179         auto valueRawPtr = AceType::RawPtr(valueResObj);
180         GetArkUINodeModifiers()->getSelectModifier()->setSelectedPtr(nativeNode, value, valueRawPtr);
181     } else {
182         GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
183     }
184     return panda::JSValueRef::Undefined(vm);
185 }
186 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)187 ArkUINativeModuleValue SelectBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
188 {
189     EcmaVM* vm = runtimeCallInfo->GetVM();
190     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
191     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
192     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
193     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
194 
195     Color fontColor;
196     RefPtr<ResourceObject> fontColorResObj;
197     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
198     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, fontColor, fontColorResObj, nodeInfo)) {
199         return ResetFontColor(runtimeCallInfo);
200     }
201     auto fontColorRawPtr = AceType::RawPtr(fontColorResObj);
202     GetArkUINodeModifiers()->getSelectModifier()->setSelectFontColorPtr(
203         nativeNode, fontColor.GetValue(), fontColorRawPtr);
204     return panda::JSValueRef::Undefined(vm);
205 }
206 
SetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)207 ArkUINativeModuleValue SelectBridge::SetSelectedOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
208 {
209     EcmaVM* vm = runtimeCallInfo->GetVM();
210     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
211     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
212     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
213     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
214 
215     Color selectedOptionBgColor;
216     RefPtr<ResourceObject> optionBgColorResObj;
217     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
218     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedOptionBgColor, optionBgColorResObj, nodeInfo)) {
219         return ResetSelectedOptionBgColor(runtimeCallInfo);
220     }
221     auto optionBgColorRawPtr = AceType::RawPtr(optionBgColorResObj);
222     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionBgColorPtr(
223         nativeNode, selectedOptionBgColor.GetValue(), optionBgColorRawPtr);
224     return panda::JSValueRef::Undefined(vm);
225 }
226 
SetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)227 ArkUINativeModuleValue SelectBridge::SetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
228 {
229     EcmaVM* vm = runtimeCallInfo->GetVM();
230     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
231     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
232     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
233     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
234 
235     Color optionBgColor;
236     RefPtr<ResourceObject> optionBgColorResObj;
237     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
238     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionBgColor, optionBgColorResObj, nodeInfo)) {
239         return ResetOptionBgColor(runtimeCallInfo);
240     }
241     auto optionBgColorRawPtr = AceType::RawPtr(optionBgColorResObj);
242     GetArkUINodeModifiers()->getSelectModifier()->setOptionBgColorPtr(
243         nativeNode, optionBgColor.GetValue(), optionBgColorRawPtr);
244     return panda::JSValueRef::Undefined(vm);
245 }
246 
SetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)247 ArkUINativeModuleValue SelectBridge::SetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
248 {
249     EcmaVM* vm = runtimeCallInfo->GetVM();
250     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
251     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
252     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
253     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
254 
255     Color optionFontColor;
256     RefPtr<ResourceObject> optionFontColorResObj;
257     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
258     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor, optionFontColorResObj, nodeInfo)) {
259         return ResetOptionFontColor(runtimeCallInfo);
260     }
261     auto optionFontColorRawPtr = AceType::RawPtr(optionFontColorResObj);
262     GetArkUINodeModifiers()->getSelectModifier()->setOptionFontColorPtr(
263         nativeNode, optionFontColor.GetValue(), optionFontColorRawPtr);
264     return panda::JSValueRef::Undefined(vm);
265 }
266 
SetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)267 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
268 {
269     EcmaVM* vm = runtimeCallInfo->GetVM();
270     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
271     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
272     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
273     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
274     Color optionFontColor;
275     RefPtr<ResourceObject> selectOptionFontColorResObj;
276     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
277     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor, selectOptionFontColorResObj, nodeInfo)) {
278         return ResetSelectedOptionFontColor(runtimeCallInfo);
279     }
280     auto selectOptionFontColorRawPtr = AceType::RawPtr(selectOptionFontColorResObj);
281     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFontColorPtr(
282         nativeNode, optionFontColor.GetValue(), selectOptionFontColorRawPtr);
283     return panda::JSValueRef::Undefined(vm);
284 }
285 
SetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue SelectBridge::SelectBridge::SetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288     EcmaVM* vm = runtimeCallInfo->GetVM();
289     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
290     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
291     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
292     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
293     int32_t arrowPosition = secondArg->Int32Value(vm);
294     GetArkUINodeModifiers()->getSelectModifier()->setArrowPosition(nativeNode, arrowPosition);
295     return panda::JSValueRef::Undefined(vm);
296 }
297 
SetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)298 ArkUINativeModuleValue SelectBridge::SetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
299 {
300     EcmaVM* vm = runtimeCallInfo->GetVM();
301     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
302     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
303     Local<JSValueRef> alignTypeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of alignType
304     Local<JSValueRef> offsetDx = runtimeCallInfo->GetCallArgRef(2);     // 2: index of offset Dx
305     Local<JSValueRef> offsetDy = runtimeCallInfo->GetCallArgRef(3);     // 3: index of offset Dy
306     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
307 
308     int32_t alignType = 0;
309     if (alignTypeArg->IsNumber()) {
310         alignType = alignTypeArg->Int32Value(vm);
311     }
312 
313     CalcDimension menuAlignOffsetDx = Dimension(0.0);
314     CalcDimension menuAlignOffsetDy = Dimension(0.0);
315     if (offsetDx->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDx, menuAlignOffsetDx)) {
316         menuAlignOffsetDx = Dimension(0.0);
317     }
318 
319     if (offsetDy->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDy, menuAlignOffsetDy)) {
320         menuAlignOffsetDy = Dimension(0.0);
321     }
322 
323     uint32_t size = SIZE_OF_TWO;
324     float values[size];
325     int32_t units[size];
326     values[0] = menuAlignOffsetDx.Value();
327     units[0] = static_cast<int32_t>(menuAlignOffsetDx.Unit());
328     values[1] = menuAlignOffsetDy.Value();
329     units[1] = static_cast<int32_t>(menuAlignOffsetDy.Unit());
330     GetArkUINodeModifiers()->getSelectModifier()->setMenuAlign(nativeNode, alignType, values, units, SIZE_OF_TWO);
331     return panda::JSValueRef::Undefined(vm);
332 }
333 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)334 ArkUINativeModuleValue SelectBridge::SetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
335 {
336     EcmaVM* vm = runtimeCallInfo->GetVM();
337     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
338     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
339     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
340     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
341     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
342     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
343     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
344 
345     std::string fontSizeStr = DEFAULT_STR;
346     CalcDimension fontSize;
347     if (!fontSizeArg->IsNull() && !fontSizeArg->IsUndefined() &&
348         ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
349         fontSizeStr = fontSize.ToString();
350     }
351 
352     std::string fontWeight = DEFAULT_STR;
353     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
354         if (fontWeightArg->IsNumber()) {
355             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
356         } else {
357             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
358                 fontWeight = DEFAULT_STR;
359             }
360         }
361     }
362     std::string fontFamily;
363     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
364         fontFamily = DEFAULT_STR;
365     }
366     int32_t styleVal = 0;
367     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
368         styleVal = styleArg->Int32Value(vm);
369     }
370 
371     std::string fontInfo =
372         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
373 
374     GetArkUINodeModifiers()->getSelectModifier()->setFont(nativeNode, fontInfo.c_str(), styleVal);
375     return panda::JSValueRef::Undefined(vm);
376 }
377 
SetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)378 ArkUINativeModuleValue SelectBridge::SetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
379 {
380     EcmaVM* vm = runtimeCallInfo->GetVM();
381     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
382     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
383     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
384     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
385     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
386     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
387     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
388     auto pipeline = PipelineBase::GetCurrentContext();
389     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
390     auto selectTheme = pipeline->GetTheme<SelectTheme>();
391 
392     CalcDimension fontSize;
393     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
394         !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
395         fontSize = selectTheme->GetMenuFontSize();
396     }
397 
398     std::string fontWeight = DEFAULT_STR;
399     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
400         if (fontWeightArg->IsNumber()) {
401             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
402         } else {
403             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
404                 fontWeight = DEFAULT_STR;
405             }
406         }
407     }
408     std::string fontFamily;
409     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
410         fontFamily = DEFAULT_STR;
411     }
412     int32_t styleVal = 0;
413     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
414         styleVal = styleArg->Int32Value(vm);
415     }
416     std::string fontSizeStr = fontSize.ToString();
417     std::string fontInfo =
418         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
419 
420     GetArkUINodeModifiers()->getSelectModifier()->setOptionFont(nativeNode, fontInfo.c_str(), styleVal);
421     return panda::JSValueRef::Undefined(vm);
422 }
423 
SetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
425 {
426     EcmaVM* vm = runtimeCallInfo->GetVM();
427     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
428     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
429     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
430     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
431     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
432     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
433     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
434 
435     auto pipeline = PipelineBase::GetCurrentContext();
436     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
437     auto selectTheme = pipeline->GetTheme<SelectTheme>();
438 
439     CalcDimension fontSize;
440     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
441         !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
442         fontSize = selectTheme->GetFontSize();
443     }
444 
445     std::string fontWeight = DEFAULT_STR;
446     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
447         if (fontWeightArg->IsNumber()) {
448             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
449         } else {
450             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
451                 fontWeight = DEFAULT_STR;
452             }
453         }
454     }
455     std::string fontFamily;
456     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
457         fontFamily = DEFAULT_STR;
458     }
459     int32_t styleVal = 0;
460     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
461         styleVal = styleArg->Int32Value(vm);
462     }
463     std::string fontSizeStr = fontSize.ToString();
464     std::string fontInfo =
465         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
466 
467     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFont(nativeNode, fontInfo.c_str(), styleVal);
468     return panda::JSValueRef::Undefined(vm);
469 }
470 
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue SelectBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473     EcmaVM* vm = runtimeCallInfo->GetVM();
474     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
475     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
476     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
477     GetArkUINodeModifiers()->getSelectModifier()->resetSpace(nativeNode);
478     return panda::JSValueRef::Undefined(vm);
479 }
480 
ResetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)481 ArkUINativeModuleValue SelectBridge::ResetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
482 {
483     EcmaVM* vm = runtimeCallInfo->GetVM();
484     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
485     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
486     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
487     GetArkUINodeModifiers()->getSelectModifier()->resetValue(nativeNode);
488     return panda::JSValueRef::Undefined(vm);
489 }
490 
ResetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)491 ArkUINativeModuleValue SelectBridge::ResetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
492 {
493     EcmaVM* vm = runtimeCallInfo->GetVM();
494     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
495     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
496     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
497     GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
498     return panda::JSValueRef::Undefined(vm);
499 }
500 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)501 ArkUINativeModuleValue SelectBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
502 {
503     EcmaVM* vm = runtimeCallInfo->GetVM();
504     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
505     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
506     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
507     GetArkUINodeModifiers()->getSelectModifier()->resetSelectFontColor(nativeNode);
508     return panda::JSValueRef::Undefined(vm);
509 }
510 
ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)511 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
512 {
513     EcmaVM* vm = runtimeCallInfo->GetVM();
514     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
515     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
516     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
517     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionBgColor(nativeNode);
518     return panda::JSValueRef::Undefined(vm);
519 }
520 
ResetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)521 ArkUINativeModuleValue SelectBridge::ResetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
522 {
523     EcmaVM* vm = runtimeCallInfo->GetVM();
524     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
525     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
526     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
527     GetArkUINodeModifiers()->getSelectModifier()->resetOptionBgColor(nativeNode);
528     return panda::JSValueRef::Undefined(vm);
529 }
530 
ResetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)531 ArkUINativeModuleValue SelectBridge::ResetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
532 {
533     EcmaVM* vm = runtimeCallInfo->GetVM();
534     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
535     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
536     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
537     GetArkUINodeModifiers()->getSelectModifier()->resetOptionFontColor(nativeNode);
538     return panda::JSValueRef::Undefined(vm);
539 }
540 
ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543     EcmaVM* vm = runtimeCallInfo->GetVM();
544     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
545     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
546     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
547     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFontColor(nativeNode);
548     return panda::JSValueRef::Undefined(vm);
549 }
550 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue SelectBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
552 {
553     EcmaVM* vm = runtimeCallInfo->GetVM();
554     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
555     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
556     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
557     GetArkUINodeModifiers()->getSelectModifier()->resetFont(nativeNode);
558     return panda::JSValueRef::Undefined(vm);
559 }
560 
ResetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)561 ArkUINativeModuleValue SelectBridge::ResetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
562 {
563     EcmaVM* vm = runtimeCallInfo->GetVM();
564     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
565     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
566     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
567     GetArkUINodeModifiers()->getSelectModifier()->resetOptionFont(nativeNode);
568     return panda::JSValueRef::Undefined(vm);
569 }
570 
ResetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)571 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
572 {
573     EcmaVM* vm = runtimeCallInfo->GetVM();
574     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
575     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
576     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
577     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFont(nativeNode);
578     return panda::JSValueRef::Undefined(vm);
579 }
580 
ResetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)581 ArkUINativeModuleValue SelectBridge::ResetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
582 {
583     EcmaVM* vm = runtimeCallInfo->GetVM();
584     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
585     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
586     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587     GetArkUINodeModifiers()->getSelectModifier()->resetMenuAlign(nativeNode);
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
ResetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue SelectBridge::ResetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593     EcmaVM* vm = runtimeCallInfo->GetVM();
594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
595     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
596     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
597     GetArkUINodeModifiers()->getSelectModifier()->resetArrowPosition(nativeNode);
598     return panda::JSValueRef::Undefined(vm);
599 }
600 
SetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)601 ArkUINativeModuleValue SelectBridge::SetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
602 {
603     EcmaVM* vm = runtimeCallInfo->GetVM();
604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
605     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
606     Local<JSValueRef> optionWidthArg = runtimeCallInfo->GetCallArgRef(1);
607     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
608     CalcDimension width;
609     if (optionWidthArg->IsString(vm)) {
610         std::string modeFlag = optionWidthArg->ToString(vm)->ToString(vm);
611         if (modeFlag.compare("fit_content") == 0) {
612             GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, false);
613             return panda::JSValueRef::Undefined(vm);
614         } else if (modeFlag.compare("fit_trigger") == 0) {
615             GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, true);
616             return panda::JSValueRef::Undefined(vm);
617         } else if (ArkTSUtils::IsPercentStr(modeFlag)) {
618             return panda::JSValueRef::Undefined(vm);
619         } else {
620             ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
621             if (width.IsNegative()) {
622                 width.Reset();
623             }
624         }
625     } else {
626         ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
627         if (width.IsNegative()) {
628             width.Reset();
629         }
630     }
631 
632     GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionWidth(
633         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()));
634     return panda::JSValueRef::Undefined(vm);
635 }
636 
ResetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)637 ArkUINativeModuleValue SelectBridge::ResetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
638 {
639     EcmaVM* vm = runtimeCallInfo->GetVM();
640     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
641     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
642     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
643     GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionWidth(nativeNode);
644     return panda::JSValueRef::Undefined(vm);
645 }
646 
SetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)647 ArkUINativeModuleValue SelectBridge::SetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
648 {
649     EcmaVM* vm = runtimeCallInfo->GetVM();
650     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
651     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
652     Local<JSValueRef> optionHeightArg = runtimeCallInfo->GetCallArgRef(1);
653     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
654     CalcDimension height;
655     if (optionHeightArg->IsString(vm)) {
656         std::string modeFlag = optionHeightArg->ToString(vm)->ToString(vm);
657         if (ArkTSUtils::IsPercentStr(modeFlag)) {
658             return panda::JSValueRef::Undefined(vm);
659         }
660     }
661 
662     ArkTSUtils::ParseJsDimensionVpNG(vm, optionHeightArg, height, false);
663     if (height.IsNegative()) {
664         return panda::JSValueRef::Undefined(vm);
665     }
666     if (NEAR_ZERO(height.Value())) {
667         return panda::JSValueRef::Undefined(vm);
668     }
669 
670     GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionHeight(
671         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
672     return panda::JSValueRef::Undefined(vm);
673 }
674 
ResetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)675 ArkUINativeModuleValue SelectBridge::ResetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
676 {
677     EcmaVM* vm = runtimeCallInfo->GetVM();
678     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
679     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
680     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
681     GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionHeight(nativeNode);
682     return panda::JSValueRef::Undefined(vm);
683 }
684 
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)685 ArkUINativeModuleValue SelectBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
686 {
687     EcmaVM* vm = runtimeCallInfo->GetVM();
688     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
689     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
690     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
691     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
692     CalcDimension width;
693     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
694         GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
695         return panda::JSValueRef::Undefined(vm);
696     }
697     if (LessNotEqual(width.Value(), 0.0)) {
698         width.SetValue(0.0);
699     }
700     std::string widthCalc = width.CalcValue();
701     GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
702         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
703     return panda::JSValueRef::Undefined(vm);
704 }
705 
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)706 ArkUINativeModuleValue SelectBridge::ResetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
707 {
708     EcmaVM* vm = runtimeCallInfo->GetVM();
709     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
710     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
711     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
712     GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
713     return panda::JSValueRef::Undefined(vm);
714 }
715 
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)716 ArkUINativeModuleValue SelectBridge::SetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
717 {
718     EcmaVM* vm = runtimeCallInfo->GetVM();
719     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
720     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
721     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(1);
722     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
723     CalcDimension height;
724     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
725         GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
726         return panda::JSValueRef::Undefined(vm);
727     }
728     if (LessNotEqual(height.Value(), 0.0)) {
729         height.SetValue(0.0);
730     }
731     std::string heightCalc = height.CalcValue();
732     GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
733         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
734     return panda::JSValueRef::Undefined(vm);
735 }
736 
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)737 ArkUINativeModuleValue SelectBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
738 {
739     EcmaVM* vm = runtimeCallInfo->GetVM();
740     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
741     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
742     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
743     GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
744     return panda::JSValueRef::Undefined(vm);
745 }
746 
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)747 ArkUINativeModuleValue SelectBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
748 {
749     EcmaVM* vm = runtimeCallInfo->GetVM();
750     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
751     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
752     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);  // 1: index of width value
753     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of heigth value
754     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
755     CalcDimension width;
756     CalcDimension height;
757     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
758         GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
759     } else {
760         std::string widthCalc = width.CalcValue();
761         if (LessNotEqual(width.Value(), 0.0)) {
762             width.SetValue(0.0);
763         }
764         GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
765             nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
766     }
767     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
768         GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
769     } else {
770         std::string heightCalc = height.CalcValue();
771         if (LessNotEqual(height.Value(), 0.0)) {
772             height.SetValue(0.0);
773         }
774         GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
775             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
776     }
777     return panda::JSValueRef::Undefined(vm);
778 }
779 
SetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)780 ArkUINativeModuleValue SelectBridge::SetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
781 {
782     EcmaVM* vm = runtimeCallInfo->GetVM();
783     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
784     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
785     Local<JSValueRef> controlSizeArg = runtimeCallInfo->GetCallArgRef(1);  // 1: index of width value
786     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
787     auto controlSize = controlSizeArg->Int32Value(vm);
788     if (!ArkTSUtils::ParseJsInteger(vm, controlSizeArg, controlSize)) {
789         GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
790     } else {
791         GetArkUINodeModifiers()->getSelectModifier()->setControlSize(nativeNode, controlSize);
792     }
793     return panda::JSValueRef::Undefined(vm);
794 }
795 
ResetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)796 ArkUINativeModuleValue SelectBridge::ResetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
797 {
798     EcmaVM* vm = runtimeCallInfo->GetVM();
799     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
800     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
801     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
802     GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
803     return panda::JSValueRef::Undefined(vm);
804 }
805 
ResetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)806 ArkUINativeModuleValue SelectBridge::ResetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
807 {
808     EcmaVM* vm = runtimeCallInfo->GetVM();
809     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
810     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
811     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
812     GetArkUINodeModifiers()->getSelectModifier()->resetSelectSize(nativeNode);
813     return panda::JSValueRef::Undefined(vm);
814 }
815 
ConstructSelect(EcmaVM * vm,FrameNode * frameNode,MenuItemConfiguration & config)816 Local<panda::ObjectRef> SelectBridge::ConstructSelect(EcmaVM* vm, FrameNode* frameNode, MenuItemConfiguration& config)
817 {
818     RefPtr<Framework::JSSymbolGlyphModifier> selectSymbol =
819         AceType::DynamicCast<Framework::JSSymbolGlyphModifier>(config.symbolModifier_);
820     const char* keysOfSelect[] = { "value", "icon", "symbolIcon", "selected", "index", "triggerSelect",
821         "frameNodeId_"};
822     Local<JSValueRef> valuesOfSelect[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
823         panda::StringRef::NewFromUtf8(vm, config.icon_.c_str()),
824         selectSymbol->symbol_->GetLocalHandle(),
825         panda::BooleanRef::New(vm, config.selected_),
826         panda::NumberRef::New(vm, config.index_),
827         panda::FunctionRef::New(vm, JsSelectChangeCallback),
828         panda::NumberRef::New(vm, frameNode->GetId())};
829     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSelect), keysOfSelect, valuesOfSelect);
830 }
831 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue SelectBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834     EcmaVM* vm = runtimeCallInfo->GetVM();
835     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
837     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
838     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
839     if (!secondArg->IsObject(vm)) {
840         SelectModelNG::ResetBuilderFunc(frameNode);
841         return panda::JSValueRef::Undefined(vm);
842     }
843     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
844     SelectModelNG::SetBuilderFunc(frameNode,
845         [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
846             MenuItemConfiguration config) -> RefPtr<FrameNode> {
847             ContainerScope scope(containerId);
848             auto context = ArkTSUtils::GetContext(vm);
849             CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
850             auto select = ConstructSelect(vm, frameNode, config);
851             select->SetNativePointerFieldCount(vm, 1);
852             select->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
853             panda::Local<panda::JSValueRef> params[] = { context, select };
854             LocalScope pandaScope(vm);
855             panda::TryCatch trycatch(vm);
856             auto jsObject = obj.ToLocal();
857             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
858             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
859             panda::Local<panda::FunctionRef> func = makeFunc;
860             auto result = func->Call(vm, jsObject, params, 2);
861             JSNApi::ExecutePendingJob(vm);
862             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
863             auto resultObj = result->ToObject(vm);
864             panda::Local<panda::JSValueRef> nodeptr =
865                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SELECT_NODEPTR_OF_UINODE));
866             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
867             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
868             CHECK_NULL_RETURN(frameNode, nullptr);
869             return AceType::Claim(frameNode);
870         });
871     return panda::JSValueRef::Undefined(vm);
872 }
873 
SetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)874 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
875 {
876     EcmaVM* vm = runtimeCallInfo->GetVM();
877     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
878     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
879     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
880     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
881     Color color;
882     RefPtr<ResourceObject> menuBackgroundColorResObj;
883     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
884     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color, menuBackgroundColorResObj, nodeInfo)) {
885         return ResetMenuBackgroundColor(runtimeCallInfo);
886     }
887     auto menuBackgroundColorRawPtr = AceType::RawPtr(menuBackgroundColorResObj);
888     GetArkUINodeModifiers()->getSelectModifier()->setMenuBgColorPtr(
889         nativeNode, color.GetValue(), menuBackgroundColorRawPtr);
890     return panda::JSValueRef::Undefined(vm);
891 }
892 
ResetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)893 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
894 {
895     EcmaVM* vm = runtimeCallInfo->GetVM();
896     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
897     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
898     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
899     GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgColor(nativeNode);
900     return panda::JSValueRef::Undefined(vm);
901 }
902 
SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)903 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
904 {
905     EcmaVM* vm = runtimeCallInfo->GetVM();
906     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
907     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
908     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
909     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
910     if (styleArg->IsUndefined() || !styleArg->IsNumber()) {
911         return ResetMenuBackgroundBlurStyle(runtimeCallInfo);
912     }
913     int32_t styleVal = styleArg->Int32Value(vm);
914     GetArkUINodeModifiers()->getSelectModifier()->setMenuBgBlurStyle(nativeNode, styleVal);
915     return panda::JSValueRef::Undefined(vm);
916 }
917 
ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)918 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
919 {
920     EcmaVM* vm = runtimeCallInfo->GetVM();
921     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
922     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
923     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
924     GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgBlurStyle(nativeNode);
925     return panda::JSValueRef::Undefined(vm);
926 }
927 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)928 ArkUINativeModuleValue SelectBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
929 {
930     EcmaVM* vm = runtimeCallInfo->GetVM();
931     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
932     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
933     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
934     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
935     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(2);
936     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(3);
937     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(4);
938     CalcDimension dividerStrokeWidth;
939     CalcDimension dividerStartMargin;
940     CalcDimension dividerEndMargin;
941     Color colorObj;
942     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
943     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
944     auto context = frameNode->GetContext();
945     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
946     auto themeManager = context->GetThemeManager();
947     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
948     auto selectTheme = themeManager->GetTheme<SelectTheme>();
949     CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
950     if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
951         if (selectTheme) {
952             dividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
953         } else {
954             dividerStrokeWidth = 0.0_vp;
955         }
956     }
957     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
958         if (selectTheme) {
959             colorObj = selectTheme->GetLineColor();
960         } else {
961             colorObj = Color::TRANSPARENT;
962         }
963     }
964     if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
965         dividerStartMargin = -1.0_vp;
966     }
967     if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
968         dividerEndMargin = -1.0_vp;
969     }
970     uint32_t size = ARG_GROUP_LENGTH;
971     ArkUI_Float32 values[size];
972     int32_t units[size];
973     PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
974     PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
975     GetArkUINodeModifiers()->getSelectModifier()->setSelectDivider(
976         nativeNode, colorObj.GetValue(), values, units, size);
977     return panda::JSValueRef::Undefined(vm);
978 }
979 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)980 ArkUINativeModuleValue SelectBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
981 {
982     EcmaVM* vm = runtimeCallInfo->GetVM();
983     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
984     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
985     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
986     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
987     if (dividerStrokeWidthArgs->IsNull()) {
988         GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerNull(nativeNode);
989     } else {
990         GetArkUINodeModifiers()->getSelectModifier()->resetSelectDivider(nativeNode);
991     }
992     return panda::JSValueRef::Undefined(vm);
993 }
994 
SetDividerStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)995 ArkUINativeModuleValue SelectBridge::SetDividerStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
996 {
997     EcmaVM* vm = runtimeCallInfo->GetVM();
998     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
999     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1000     Local<JSValueRef> strokeWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1001     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1002     Local<JSValueRef> startMarginArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1003     Local<JSValueRef> endMarginArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1004     Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1005     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1006     if (strokeWidthArg->IsUndefined() && colorArg->IsUndefined() && startMarginArg->IsUndefined()
1007         && endMarginArg->IsUndefined() && modeArg->IsUndefined()) {
1008         GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerStyle(nativeNode);
1009         return panda::JSValueRef::Undefined(vm);
1010     }
1011     auto dividerOptions = BuildSelectDividerStyleOptions(vm, strokeWidthArg, startMarginArg, endMarginArg);
1012     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1013     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1014     auto context = frameNode->GetContext();
1015     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
1016     auto themeManager = context->GetThemeManager();
1017     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
1018     auto selectTheme = themeManager->GetTheme<SelectTheme>();
1019     CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
1020     if (dividerOptions.strokeWidth.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1021         auto themeDividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
1022         dividerOptions.strokeWidth.value = themeDividerStrokeWidth.Value();
1023         dividerOptions.strokeWidth.units = static_cast<int32_t>(themeDividerStrokeWidth.Unit());
1024     }
1025     if (dividerOptions.startMargin.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1026         dividerOptions.startMargin.value = -1.0;
1027         dividerOptions.startMargin.units = static_cast<int32_t>(DimensionUnit::VP);
1028     }
1029     if (dividerOptions.endMargin.units == static_cast<int32_t>(DimensionUnit::INVALID)) {
1030         dividerOptions.endMargin.value = -1.0;
1031         dividerOptions.endMargin.units = static_cast<int32_t>(DimensionUnit::VP);
1032     }
1033     Color color;
1034     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
1035         color = selectTheme->GetLineColor();
1036     }
1037     dividerOptions.color = color.GetValue();
1038     int32_t mode = 0;
1039     if (modeArg->IsNumber()) {
1040         mode = modeArg->Int32Value(vm);
1041     }
1042     dividerOptions.mode = mode;
1043     GetArkUINodeModifiers()->getSelectModifier()->setSelectDividerStyle(nativeNode, &dividerOptions);
1044     return panda::JSValueRef::Undefined(vm);
1045 }
1046 
ResetDividerStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1047 ArkUINativeModuleValue SelectBridge::ResetDividerStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1048 {
1049     EcmaVM* vm = runtimeCallInfo->GetVM();
1050     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1051     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1052     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1053     GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerStyle(nativeNode);
1054     return panda::JSValueRef::Undefined(vm);
1055 }
1056 
ParseValues(const EcmaVM * vm,const Local<JSValueRef> & jsValue)1057 static std::string ParseValues(const EcmaVM* vm, const Local<JSValueRef>& jsValue)
1058 {
1059     std::string result;
1060     ArkTSUtils::ParseJsString(vm, jsValue, result);
1061     return result;
1062 }
1063 
SetOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1064 ArkUINativeModuleValue SelectBridge::SetOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1065 {
1066     EcmaVM* vm = runtimeCallInfo->GetVM();
1067     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1068     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1069     Local<JSValueRef> valuesArg = runtimeCallInfo->GetCallArgRef(1);
1070     Local<JSValueRef> iconsArg = runtimeCallInfo->GetCallArgRef(2);
1071     Local<JSValueRef> symbolIconArg = runtimeCallInfo->GetCallArgRef(3);
1072     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(4);
1073     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1074     auto length = lengthArg->Uint32Value(vm);
1075     auto valueArray = std::make_unique<std::string[]>(length);
1076     auto iconArray = std::make_unique<std::string[]>(length);
1077     auto selectParamArray = std::make_unique<SelectParam[]>(length);
1078 
1079     bool valueParseResult = ArkTSUtils::ParseArray<std::string>(vm, valuesArg, valueArray.get(), length, ParseValues);
1080     bool iconParseResult = ArkTSUtils::ParseArray<std::string>(
1081         vm, iconsArg, iconArray.get(), length, [](const EcmaVM* vm, const Local<JSValueRef>& jsValue) {
1082             std::string result;
1083             ArkTSUtils::ParseJsMedia(vm, jsValue, result);
1084             return result;
1085         });
1086     bool symbolIconParseResult = ArkTSUtils::ParseArray<SelectParam>(
1087         vm, symbolIconArg, selectParamArray.get(), length, [runtimeCallInfo](const EcmaVM* vm,
1088             const Local<JSValueRef>& jsValue) {
1089             auto selectSymbol = AceType::MakeRefPtr<Framework::JSSymbolGlyphModifier>();
1090             auto jsRefValue = Framework::JSRef<Framework::JsiValue>(Framework::JsiValue(jsValue));
1091             selectSymbol->symbol_ = jsRefValue;
1092             std::function<void(WeakPtr<NG::FrameNode>)> symbolIcoResult;
1093             RefPtr<SymbolModifier> symbolModifier;
1094             if (jsValue->IsObject(vm)) {
1095                 std::function<void(WeakPtr<NG::FrameNode>)> symbolApply = nullptr;
1096                 Framework::JSViewAbstract::SetSymbolOptionApply(runtimeCallInfo, symbolApply, jsRefValue);
1097                 symbolIcoResult = symbolApply;
1098             }
1099             return SelectParam{.symbolIcon=symbolIcoResult, .symbolModifier= selectSymbol};
1100         });
1101     std::vector<SelectParam> params(length);
1102     if (valueParseResult && iconParseResult && symbolIconParseResult) {
1103         for (uint32_t i = 0; i < length; i++) {
1104             params[i].text = valueArray[i];
1105             params[i].symbolModifier = selectParamArray[i].symbolModifier;
1106             params[i].symbolIcon = selectParamArray[i].symbolIcon;
1107             if (!(selectParamArray[i].symbolIcon)) {
1108                 params[i].icon = iconArray[i];
1109             }
1110         }
1111     }
1112     SelectModelNG::InitSelect(reinterpret_cast<FrameNode*>(nativeNode), params);
1113     return panda::JSValueRef::Undefined(vm);
1114 }
1115 
SetSelectDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)1116 ArkUINativeModuleValue SelectBridge::SetSelectDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1117 {
1118     EcmaVM* vm = runtimeCallInfo->GetVM();
1119     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1120     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1121     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1122     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1123     std::string dir;
1124     int32_t direction = NUM_3;
1125     if (secondArg->IsString(vm)) {
1126         dir = secondArg->ToString(vm)->ToString(vm);
1127         if (dir == "Ltr") {
1128             direction = NUM_0;
1129         } else if (dir == "Rtl") {
1130             direction = NUM_1;
1131         } else if (dir == "Auto") {
1132             direction = NUM_3;
1133         }
1134     }
1135     GetArkUINodeModifiers()->getSelectModifier()->setSelectDirection(nativeNode, direction);
1136     return panda::JSValueRef::Undefined(vm);
1137 }
1138 
ResetSelectDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)1139 ArkUINativeModuleValue SelectBridge::ResetSelectDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1140 {
1141     EcmaVM* vm = runtimeCallInfo->GetVM();
1142     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1143     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1144     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1145     GetArkUINodeModifiers()->getSelectModifier()->resetSelectDirection(nativeNode);
1146     return panda::JSValueRef::Undefined(vm);
1147 }
1148 
PushOuterBorderColorVector(const std::optional<Color> & valueColor,std::vector<uint32_t> & options)1149 void PushOuterBorderColorVector(const std::optional<Color>& valueColor, std::vector<uint32_t> &options)
1150 {
1151     options.push_back(static_cast<uint32_t>(valueColor.has_value()));
1152     if (valueColor.has_value()) {
1153         options.push_back(static_cast<uint32_t>(valueColor.value().GetValue()));
1154     } else {
1155         options.push_back(0x19FFFFFF);
1156     }
1157 }
1158 
ParseOuterBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<uint32_t> & values,int32_t argsIndex)1159 void ParseOuterBorderColor(
1160     ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<uint32_t>& values, int32_t argsIndex)
1161 {
1162     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(argsIndex);
1163     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(argsIndex + 1);
1164     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(argsIndex + 2);
1165     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(argsIndex + 3);
1166 
1167     std::optional<Color> leftColor;
1168     std::optional<Color> rightColor;
1169     std::optional<Color> topColor;
1170     std::optional<Color> bottomColor;
1171 
1172     Color left;
1173     if (!leftArg->IsUndefined() && ArkTSUtils::ParseJsColorAlpha(vm, leftArg, left)) {
1174         leftColor = left;
1175     }
1176     Color right;
1177     if (!rightArg->IsUndefined() && ArkTSUtils::ParseJsColorAlpha(vm, rightArg, right)) {
1178         rightColor = right;
1179     }
1180     Color top;
1181     if (!topArg->IsUndefined() && ArkTSUtils::ParseJsColorAlpha(vm, topArg, top)) {
1182         topColor = top;
1183     }
1184     Color bottom;
1185     if (!bottomArg->IsUndefined() && ArkTSUtils::ParseJsColorAlpha(vm, bottomArg, bottom)) {
1186         bottomColor = bottom;
1187     }
1188 
1189     PushOuterBorderColorVector(leftColor, values);
1190     PushOuterBorderColorVector(rightColor, values);
1191     PushOuterBorderColorVector(topColor, values);
1192     PushOuterBorderColorVector(bottomColor, values);
1193 }
1194 
SetMenuOutline(ArkUIRuntimeCallInfo * runtimeCallInfo)1195 ArkUINativeModuleValue SelectBridge::SetMenuOutline(ArkUIRuntimeCallInfo* runtimeCallInfo)
1196 {
1197     EcmaVM* vm = runtimeCallInfo->GetVM();
1198     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1199     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1200     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1201     std::vector<ArkUI_Float32> width;
1202     std::vector<uint32_t> color;
1203     CommonBridge::ParseOuterBorderWidth(runtimeCallInfo, vm, width);
1204     ParseOuterBorderColor(runtimeCallInfo, vm, color, OFFSET_OF_COLOR);
1205     GetArkUINodeModifiers()->getSelectModifier()->setMenuOutline(
1206         nativeNode, width.data(), width.size(), color.data(), color.size());
1207     return panda::JSValueRef::Undefined(vm);
1208 }
1209 
ResetMenuOutline(ArkUIRuntimeCallInfo * runtimeCallInfo)1210 ArkUINativeModuleValue SelectBridge::ResetMenuOutline(ArkUIRuntimeCallInfo* runtimeCallInfo)
1211 {
1212     EcmaVM* vm = runtimeCallInfo->GetVM();
1213     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1214     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1215     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1216     GetArkUINodeModifiers()->getSelectModifier()->resetMenuOutline(nativeNode);
1217     return panda::JSValueRef::Undefined(vm);
1218 }
1219 
SetAvoidance(ArkUIRuntimeCallInfo * runtimeCallInfo)1220 ArkUINativeModuleValue SelectBridge::SetAvoidance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1221 {
1222     EcmaVM* vm = runtimeCallInfo->GetVM();
1223     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1224     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1225     CHECK_NULL_RETURN(!nodeArg.IsNull(), panda::NativePointerRef::New(vm, nullptr));
1226     Local<JSValueRef> modeArg = runtimeCallInfo->GetCallArgRef(1);
1227     CHECK_NULL_RETURN(!modeArg.IsNull(), panda::NativePointerRef::New(vm, nullptr));
1228     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1229     int32_t mode = 0;
1230     if (modeArg->IsNumber()) {
1231         mode = modeArg->Int32Value(vm);
1232     }
1233     GetArkUINodeModifiers()->getSelectModifier()->setAvoidance(nativeNode, mode);
1234     return panda::JSValueRef::Undefined(vm);
1235 }
1236 
ResetAvoidance(ArkUIRuntimeCallInfo * runtimeCallInfo)1237 ArkUINativeModuleValue SelectBridge::ResetAvoidance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1238 {
1239     EcmaVM* vm = runtimeCallInfo->GetVM();
1240     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1241     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1242     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1243     GetArkUINodeModifiers()->getSelectModifier()->resetAvoidance(nativeNode);
1244     return panda::JSValueRef::Undefined(vm);
1245 }
1246 
SetOnSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)1247 ArkUINativeModuleValue SelectBridge::SetOnSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1248 {
1249     EcmaVM *vm = runtimeCallInfo->GetVM();
1250     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1251     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1252     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1253     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1254     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1255     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1256     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1257     using namespace OHOS::Ace::Framework;
1258     if (!info[NUM_1]->IsFunction()) {
1259         return panda::JSValueRef::Undefined(vm);
1260     }
1261     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[NUM_1]));
1262     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
1263     auto onSelect = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
1264                         int32_t index, const std::string& value) {
1265         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
1266         ACE_SCORING_EVENT("Select.onSelect");
1267         TAG_LOGD(AceLogTag::ACE_SELECT_COMPONENT, "fire change event %{public}d %{public}s", index, value.c_str());
1268         PipelineContext::SetCallBackNode(node);
1269         JSRef<JSVal> params[NUM_2];
1270         params[NUM_0] = JSRef<JSVal>::Make(ToJSValue(index));
1271         params[NUM_1] = JSRef<JSVal>::Make(ToJSValue(value));
1272         func->ExecuteJS(NUM_2, params);
1273         UiSessionManager::GetInstance()->ReportComponentChangeEvent("event", "Select.onSelect");
1274     };
1275     SelectModel::GetInstance()->SetOnSelect(std::move(onSelect));
1276     info.ReturnSelf();
1277     return panda::JSValueRef::Undefined(vm);
1278 }
1279 
ResetOnSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)1280 ArkUINativeModuleValue SelectBridge::ResetOnSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1281 {
1282     EcmaVM* vm = runtimeCallInfo->GetVM();
1283     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1284     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1285     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1286     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1287     auto nodeModifiers = GetArkUINodeModifiers();
1288     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1289     nodeModifiers->getSelectModifier()->setOnSelect(nativeNode, nullptr);
1290     return panda::JSValueRef::Undefined(vm);
1291 }
1292 } // namespace OHOS::Ace::NG