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