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 const int32_t SIZE_OF_TWO = 2;
25 const std::string FORMAT_FONT = "%s|%s|%s";
26 const std::string DEFAULT_STR = "-1";
27 const char* SELECT_NODEPTR_OF_UINODE = "nodePtr_";
28 
29 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)30 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
31 {
32     return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
33            (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP &&
34            valueDim.Unit() != DimensionUnit::LPX && valueDim.Unit() != DimensionUnit::FP);
35 }
36 
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)37 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
38     const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
39 {
40     values[0] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
41     values[1] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
42     values[2] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
43 }
44 
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)45 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
46     const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
47 {
48     units[0] = static_cast<int32_t>(dividerStrokeWidth.Unit());
49     units[1] = static_cast<int32_t>(dividerStartMargin.Unit());
50     units[2] = static_cast<int32_t>(dividerEndMargin.Unit());
51 }
52 } // namespace
53 
JsSelectChangeCallback(panda::JsiRuntimeCallInfo * runtimeCallInfo)54 panda::Local<panda::JSValueRef> JsSelectChangeCallback(panda::JsiRuntimeCallInfo* runtimeCallInfo)
55 {
56     auto vm = runtimeCallInfo->GetVM();
57     auto firstArg = runtimeCallInfo->GetCallArgRef(0);
58     auto secondArg = runtimeCallInfo->GetCallArgRef(1);
59     if (!firstArg->IsNumber()) {
60         return panda::JSValueRef::Undefined(vm);
61     }
62     auto index = firstArg->ToNumber(vm)->Value();
63     auto value = secondArg->ToString(vm)->ToString(vm);
64     auto ref = runtimeCallInfo->GetThisRef();
65     auto obj = ref->ToObject(vm);
66     FrameNode* frameNode = nullptr;
67     if (obj->GetNativePointerFieldCount(vm) < 1) {
68         if (!ref->IsProxy(vm)) {
69             return panda::JSValueRef::Undefined(vm);
70         }
71         auto frameNodeIdValue = obj->Get(vm, "frameNodeId_");
72         CHECK_EQUAL_RETURN(
73             frameNodeIdValue.IsEmpty() || frameNodeIdValue->IsNull(), true, panda::JSValueRef::Undefined(vm));
74         auto frameNodeId = frameNodeIdValue->Int32Value(vm);
75         frameNode = ElementRegister::GetInstance()->GetFrameNodePtrById(frameNodeId);
76     } else {
77         frameNode = static_cast<FrameNode*>(obj->GetNativePointerField(vm, 0));
78     }
79     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
80     SelectModelNG::SetChangeValue(frameNode, index, value);
81     return panda::JSValueRef::Undefined(vm);
82 }
83 
SetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)84 ArkUINativeModuleValue SelectBridge::SelectBridge::SetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
85 {
86     EcmaVM* vm = runtimeCallInfo->GetVM();
87     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
88     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
89     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
90     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
91     auto pipeline = PipelineBase::GetCurrentContext();
92     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
93     auto selectTheme = pipeline->GetTheme<SelectTheme>();
94     CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
95 
96     CalcDimension space;
97     if (!ArkTSUtils::ParseJsDimensionVp(vm, secondArg, space)) {
98         space = selectTheme->GetContentSpinnerPadding();
99     }
100     if (LessNotEqual(space.Value(), 0.0) || space.Unit() == DimensionUnit::PERCENT) {
101         space = selectTheme->GetContentSpinnerPadding();
102     }
103 
104     GetArkUINodeModifiers()->getSelectModifier()->setSpace(
105         nativeNode, space.Value(), static_cast<int32_t>(space.Unit()));
106     return panda::JSValueRef::Undefined(vm);
107 }
108 
SetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)109 ArkUINativeModuleValue SelectBridge::SetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
110 {
111     EcmaVM* vm = runtimeCallInfo->GetVM();
112     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
113     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
114     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
115     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
116     std::string value;
117     ArkTSUtils::ParseJsString(vm, secondArg, value);
118     GetArkUINodeModifiers()->getSelectModifier()->setValue(nativeNode, value.c_str());
119     return panda::JSValueRef::Undefined(vm);
120 }
121 
SetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue SelectBridge::SetSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124     EcmaVM* vm = runtimeCallInfo->GetVM();
125     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
127     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
128     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
129     int32_t value = 0;
130     if (ArkTSUtils::ParseJsIntegerWithResource(vm, secondArg, value)) {
131         GetArkUINodeModifiers()->getSelectModifier()->setSelected(nativeNode, value);
132     } else {
133         GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
134     }
135     return panda::JSValueRef::Undefined(vm);
136 }
137 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)138 ArkUINativeModuleValue SelectBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
139 {
140     EcmaVM* vm = runtimeCallInfo->GetVM();
141     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
142     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
143     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
144     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
145 
146     Color fontColor;
147     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, fontColor)) {
148         return ResetFontColor(runtimeCallInfo);
149     }
150     GetArkUINodeModifiers()->getSelectModifier()->setSelectFontColor(nativeNode, fontColor.GetValue());
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
SetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue SelectBridge::SetSelectedOptionBgColor(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> colorArg = runtimeCallInfo->GetCallArgRef(1);
160     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
161 
162     Color selectedOptionBgColor;
163     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, selectedOptionBgColor)) {
164         return ResetSelectedOptionBgColor(runtimeCallInfo);
165     }
166 
167     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionBgColor(
168         nativeNode, selectedOptionBgColor.GetValue());
169     return panda::JSValueRef::Undefined(vm);
170 }
171 
SetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)172 ArkUINativeModuleValue SelectBridge::SetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
173 {
174     EcmaVM* vm = runtimeCallInfo->GetVM();
175     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
176     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
177     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
178     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
179 
180     Color optionBgColor;
181     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionBgColor)) {
182         return ResetOptionBgColor(runtimeCallInfo);
183     }
184     GetArkUINodeModifiers()->getSelectModifier()->setOptionBgColor(nativeNode, optionBgColor.GetValue());
185     return panda::JSValueRef::Undefined(vm);
186 }
187 
SetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue SelectBridge::SetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190     EcmaVM* vm = runtimeCallInfo->GetVM();
191     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
192     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
193     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
194     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
195 
196     Color optionFontColor;
197     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
198         return ResetOptionFontColor(runtimeCallInfo);
199     }
200     GetArkUINodeModifiers()->getSelectModifier()->setOptionFontColor(nativeNode, optionFontColor.GetValue());
201     return panda::JSValueRef::Undefined(vm);
202 }
203 
SetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)204 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
205 {
206     EcmaVM* vm = runtimeCallInfo->GetVM();
207     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
208     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
209     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
210     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
211     Color optionFontColor;
212     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, optionFontColor)) {
213         return ResetSelectedOptionFontColor(runtimeCallInfo);
214     }
215     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFontColor(nativeNode, optionFontColor.GetValue());
216     return panda::JSValueRef::Undefined(vm);
217 }
218 
SetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue SelectBridge::SelectBridge::SetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
220 {
221     EcmaVM* vm = runtimeCallInfo->GetVM();
222     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
223     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
224     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
225     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
226     int32_t arrowPosition = secondArg->Int32Value(vm);
227     GetArkUINodeModifiers()->getSelectModifier()->setArrowPosition(nativeNode, arrowPosition);
228     return panda::JSValueRef::Undefined(vm);
229 }
230 
SetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)231 ArkUINativeModuleValue SelectBridge::SetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
232 {
233     EcmaVM* vm = runtimeCallInfo->GetVM();
234     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
235     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
236     Local<JSValueRef> alignTypeArg = runtimeCallInfo->GetCallArgRef(1); // 1: index of alignType
237     Local<JSValueRef> offsetDx = runtimeCallInfo->GetCallArgRef(2);     // 2: index of offset Dx
238     Local<JSValueRef> offsetDy = runtimeCallInfo->GetCallArgRef(3);     // 3: index of offset Dy
239     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
240 
241     int32_t alignType = 0;
242     if (alignTypeArg->IsNumber()) {
243         alignType = alignTypeArg->Int32Value(vm);
244     }
245 
246     CalcDimension menuAlignOffsetDx = Dimension(0.0);
247     CalcDimension menuAlignOffsetDy = Dimension(0.0);
248     if (offsetDx->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDx, menuAlignOffsetDx)) {
249         menuAlignOffsetDx = Dimension(0.0);
250     }
251 
252     if (offsetDy->IsNull() || !ArkTSUtils::ParseJsDimensionVp(vm, offsetDy, menuAlignOffsetDy)) {
253         menuAlignOffsetDy = Dimension(0.0);
254     }
255 
256     uint32_t size = SIZE_OF_TWO;
257     float values[size];
258     int32_t units[size];
259     values[0] = menuAlignOffsetDx.Value();
260     units[0] = static_cast<int32_t>(menuAlignOffsetDx.Unit());
261     values[1] = menuAlignOffsetDy.Value();
262     units[1] = static_cast<int32_t>(menuAlignOffsetDy.Unit());
263     GetArkUINodeModifiers()->getSelectModifier()->setMenuAlign(nativeNode, alignType, values, units, SIZE_OF_TWO);
264     return panda::JSValueRef::Undefined(vm);
265 }
266 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)267 ArkUINativeModuleValue SelectBridge::SetFont(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> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
273     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
274     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
275     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
276     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
277 
278     std::string fontSizeStr = DEFAULT_STR;
279     CalcDimension fontSize;
280     if (!fontSizeArg->IsNull() && !fontSizeArg->IsUndefined() &&
281         ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
282         fontSizeStr = fontSize.ToString();
283     }
284 
285     std::string fontWeight = DEFAULT_STR;
286     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
287         if (fontWeightArg->IsNumber()) {
288             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
289         } else {
290             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
291                 fontWeight = DEFAULT_STR;
292             }
293         }
294     }
295     std::string fontFamily;
296     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
297         fontFamily = DEFAULT_STR;
298     }
299     int32_t styleVal = 0;
300     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
301         styleVal = styleArg->Int32Value(vm);
302     }
303 
304     std::string fontInfo =
305         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
306 
307     GetArkUINodeModifiers()->getSelectModifier()->setFont(nativeNode, fontInfo.c_str(), styleVal);
308     return panda::JSValueRef::Undefined(vm);
309 }
310 
SetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)311 ArkUINativeModuleValue SelectBridge::SetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
312 {
313     EcmaVM* vm = runtimeCallInfo->GetVM();
314     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
315     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
316     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
317     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
318     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
319     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
320     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
321     auto pipeline = PipelineBase::GetCurrentContext();
322     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
323     auto selectTheme = pipeline->GetTheme<SelectTheme>();
324 
325     CalcDimension fontSize;
326     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
327         !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
328         fontSize = selectTheme->GetMenuFontSize();
329     }
330 
331     std::string fontWeight = DEFAULT_STR;
332     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
333         if (fontWeightArg->IsNumber()) {
334             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
335         } else {
336             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
337                 fontWeight = DEFAULT_STR;
338             }
339         }
340     }
341     std::string fontFamily;
342     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
343         fontFamily = DEFAULT_STR;
344     }
345     int32_t styleVal = 0;
346     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
347         styleVal = styleArg->Int32Value(vm);
348     }
349     std::string fontSizeStr = fontSize.ToString();
350     std::string fontInfo =
351         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
352 
353     GetArkUINodeModifiers()->getSelectModifier()->setOptionFont(nativeNode, fontInfo.c_str(), styleVal);
354     return panda::JSValueRef::Undefined(vm);
355 }
356 
SetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)357 ArkUINativeModuleValue SelectBridge::SetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
358 {
359     EcmaVM* vm = runtimeCallInfo->GetVM();
360     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
361     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
362     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(1);   // 1: index of font size value
363     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of font weight value
364     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(3); // 3: index of font family value
365     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(4);      // 4: index of font style value
366     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
367 
368     auto pipeline = PipelineBase::GetCurrentContext();
369     CHECK_NULL_RETURN(pipeline, panda::NativePointerRef::New(vm, nullptr));
370     auto selectTheme = pipeline->GetTheme<SelectTheme>();
371 
372     CalcDimension fontSize;
373     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined() ||
374         !ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize)) {
375         fontSize = selectTheme->GetFontSize();
376     }
377 
378     std::string fontWeight = DEFAULT_STR;
379     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
380         if (fontWeightArg->IsNumber()) {
381             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
382         } else {
383             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, fontWeight) || fontWeight.empty()) {
384                 fontWeight = DEFAULT_STR;
385             }
386         }
387     }
388     std::string fontFamily;
389     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
390         fontFamily = DEFAULT_STR;
391     }
392     int32_t styleVal = 0;
393     if (!styleArg->IsNull() && !styleArg->IsUndefined() && styleArg->IsNumber()) {
394         styleVal = styleArg->Int32Value(vm);
395     }
396     std::string fontSizeStr = fontSize.ToString();
397     std::string fontInfo =
398         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), fontWeight.c_str(), fontFamily.c_str());
399 
400     GetArkUINodeModifiers()->getSelectModifier()->setSelectedOptionFont(nativeNode, fontInfo.c_str(), styleVal);
401     return panda::JSValueRef::Undefined(vm);
402 }
403 
ResetSpace(ArkUIRuntimeCallInfo * runtimeCallInfo)404 ArkUINativeModuleValue SelectBridge::ResetSpace(ArkUIRuntimeCallInfo* runtimeCallInfo)
405 {
406     EcmaVM* vm = runtimeCallInfo->GetVM();
407     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
408     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
409     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
410     GetArkUINodeModifiers()->getSelectModifier()->resetSpace(nativeNode);
411     return panda::JSValueRef::Undefined(vm);
412 }
413 
ResetValue(ArkUIRuntimeCallInfo * runtimeCallInfo)414 ArkUINativeModuleValue SelectBridge::ResetValue(ArkUIRuntimeCallInfo* runtimeCallInfo)
415 {
416     EcmaVM* vm = runtimeCallInfo->GetVM();
417     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
418     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
419     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
420     GetArkUINodeModifiers()->getSelectModifier()->resetValue(nativeNode);
421     return panda::JSValueRef::Undefined(vm);
422 }
423 
ResetSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue SelectBridge::ResetSelected(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     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
430     GetArkUINodeModifiers()->getSelectModifier()->resetSelected(nativeNode);
431     return panda::JSValueRef::Undefined(vm);
432 }
433 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)434 ArkUINativeModuleValue SelectBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
435 {
436     EcmaVM* vm = runtimeCallInfo->GetVM();
437     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
438     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
439     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
440     GetArkUINodeModifiers()->getSelectModifier()->resetSelectFontColor(nativeNode);
441     return panda::JSValueRef::Undefined(vm);
442 }
443 
ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
448     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
449     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionBgColor(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
ResetOptionBgColor(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue SelectBridge::ResetOptionBgColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
459     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
460     GetArkUINodeModifiers()->getSelectModifier()->resetOptionBgColor(nativeNode);
461     return panda::JSValueRef::Undefined(vm);
462 }
463 
ResetOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue SelectBridge::ResetOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466     EcmaVM* vm = runtimeCallInfo->GetVM();
467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
469     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
470     GetArkUINodeModifiers()->getSelectModifier()->resetOptionFontColor(nativeNode);
471     return panda::JSValueRef::Undefined(vm);
472 }
473 
ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)474 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
475 {
476     EcmaVM* vm = runtimeCallInfo->GetVM();
477     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
478     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
479     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
480     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFontColor(nativeNode);
481     return panda::JSValueRef::Undefined(vm);
482 }
483 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)484 ArkUINativeModuleValue SelectBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
485 {
486     EcmaVM* vm = runtimeCallInfo->GetVM();
487     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
488     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
489     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
490     GetArkUINodeModifiers()->getSelectModifier()->resetFont(nativeNode);
491     return panda::JSValueRef::Undefined(vm);
492 }
493 
ResetOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)494 ArkUINativeModuleValue SelectBridge::ResetOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
495 {
496     EcmaVM* vm = runtimeCallInfo->GetVM();
497     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
498     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
499     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
500     GetArkUINodeModifiers()->getSelectModifier()->resetOptionFont(nativeNode);
501     return panda::JSValueRef::Undefined(vm);
502 }
503 
ResetSelectedOptionFont(ArkUIRuntimeCallInfo * runtimeCallInfo)504 ArkUINativeModuleValue SelectBridge::ResetSelectedOptionFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
505 {
506     EcmaVM* vm = runtimeCallInfo->GetVM();
507     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
508     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
509     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
510     GetArkUINodeModifiers()->getSelectModifier()->resetSelectedOptionFont(nativeNode);
511     return panda::JSValueRef::Undefined(vm);
512 }
513 
ResetMenuAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue SelectBridge::ResetMenuAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516     EcmaVM* vm = runtimeCallInfo->GetVM();
517     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
519     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
520     GetArkUINodeModifiers()->getSelectModifier()->resetMenuAlign(nativeNode);
521     return panda::JSValueRef::Undefined(vm);
522 }
523 
ResetArrowPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue SelectBridge::ResetArrowPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526     EcmaVM* vm = runtimeCallInfo->GetVM();
527     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
528     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
529     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
530     GetArkUINodeModifiers()->getSelectModifier()->resetArrowPosition(nativeNode);
531     return panda::JSValueRef::Undefined(vm);
532 }
533 
SetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)534 ArkUINativeModuleValue SelectBridge::SetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
535 {
536     EcmaVM* vm = runtimeCallInfo->GetVM();
537     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
538     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
539     Local<JSValueRef> optionWidthArg = runtimeCallInfo->GetCallArgRef(1);
540     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
541     CalcDimension width;
542     if (optionWidthArg->IsString(vm)) {
543         std::string modeFlag = optionWidthArg->ToString(vm)->ToString(vm);
544         if (modeFlag.compare("fit_content") == 0) {
545             GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, false);
546             return panda::JSValueRef::Undefined(vm);
547         } else if (modeFlag.compare("fit_trigger") == 0) {
548             GetArkUINodeModifiers()->getSelectModifier()->setOptionWidthFitTrigger(nativeNode, true);
549             return panda::JSValueRef::Undefined(vm);
550         } else if (ArkTSUtils::IsPercentStr(modeFlag)) {
551             return panda::JSValueRef::Undefined(vm);
552         } else {
553             ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
554             if (width.IsNegative()) {
555                 width.Reset();
556             }
557         }
558     } else {
559         ArkTSUtils::ParseJsDimensionVpNG(vm, optionWidthArg, width, false);
560         if (width.IsNegative()) {
561             width.Reset();
562         }
563     }
564 
565     GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionWidth(
566         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()));
567     return panda::JSValueRef::Undefined(vm);
568 }
569 
ResetOptionWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue SelectBridge::ResetOptionWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572     EcmaVM* vm = runtimeCallInfo->GetVM();
573     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
575     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
576     GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionWidth(nativeNode);
577     return panda::JSValueRef::Undefined(vm);
578 }
579 
SetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue SelectBridge::SetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582     EcmaVM* vm = runtimeCallInfo->GetVM();
583     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
585     Local<JSValueRef> optionHeightArg = runtimeCallInfo->GetCallArgRef(1);
586     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
587     CalcDimension height;
588     if (optionHeightArg->IsString(vm)) {
589         std::string modeFlag = optionHeightArg->ToString(vm)->ToString(vm);
590         if (ArkTSUtils::IsPercentStr(modeFlag)) {
591             return panda::JSValueRef::Undefined(vm);
592         }
593     }
594 
595     ArkTSUtils::ParseJsDimensionVpNG(vm, optionHeightArg, height, false);
596     if (height.IsNegative()) {
597         return panda::JSValueRef::Undefined(vm);
598     }
599     if (NEAR_ZERO(height.Value())) {
600         return panda::JSValueRef::Undefined(vm);
601     }
602 
603     GetArkUINodeModifiers()->getSelectModifier()->setSelectOptionHeight(
604         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
605     return panda::JSValueRef::Undefined(vm);
606 }
607 
ResetOptionHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)608 ArkUINativeModuleValue SelectBridge::ResetOptionHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
609 {
610     EcmaVM* vm = runtimeCallInfo->GetVM();
611     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
612     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
613     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
614     GetArkUINodeModifiers()->getSelectModifier()->resetSelectOptionHeight(nativeNode);
615     return panda::JSValueRef::Undefined(vm);
616 }
617 
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)618 ArkUINativeModuleValue SelectBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
619 {
620     EcmaVM* vm = runtimeCallInfo->GetVM();
621     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
622     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
623     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);
624     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
625     CalcDimension width;
626     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
627         GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
628         return panda::JSValueRef::Undefined(vm);
629     }
630     if (LessNotEqual(width.Value(), 0.0)) {
631         width.SetValue(0.0);
632     }
633     std::string widthCalc = width.CalcValue();
634     GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
635         nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
636     return panda::JSValueRef::Undefined(vm);
637 }
638 
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)639 ArkUINativeModuleValue SelectBridge::ResetWidth(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()->resetSelectWidth(nativeNode);
646     return panda::JSValueRef::Undefined(vm);
647 }
648 
SetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)649 ArkUINativeModuleValue SelectBridge::SetHeight(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> heightArg = runtimeCallInfo->GetCallArgRef(1);
655     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
656     CalcDimension height;
657     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
658         GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
659         return panda::JSValueRef::Undefined(vm);
660     }
661     if (LessNotEqual(height.Value(), 0.0)) {
662         height.SetValue(0.0);
663     }
664     std::string heightCalc = height.CalcValue();
665     GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
666         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
667     return panda::JSValueRef::Undefined(vm);
668 }
669 
ResetHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)670 ArkUINativeModuleValue SelectBridge::ResetHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
671 {
672     EcmaVM* vm = runtimeCallInfo->GetVM();
673     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
674     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
675     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
676     GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
677     return panda::JSValueRef::Undefined(vm);
678 }
679 
SetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue SelectBridge::SetSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
681 {
682     EcmaVM* vm = runtimeCallInfo->GetVM();
683     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
685     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(1);  // 1: index of width value
686     Local<JSValueRef> heightArg = runtimeCallInfo->GetCallArgRef(2); // 2: index of heigth value
687     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
688     CalcDimension width;
689     CalcDimension height;
690     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, widthArg, width)) {
691         GetArkUINodeModifiers()->getSelectModifier()->resetSelectWidth(nativeNode);
692     } else {
693         std::string widthCalc = width.CalcValue();
694         if (LessNotEqual(width.Value(), 0.0)) {
695             width.SetValue(0.0);
696         }
697         GetArkUINodeModifiers()->getSelectModifier()->setSelectWidth(
698             nativeNode, width.Value(), static_cast<int32_t>(width.Unit()), widthCalc.c_str());
699     }
700     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, heightArg, height)) {
701         GetArkUINodeModifiers()->getSelectModifier()->resetSelectHeight(nativeNode);
702     } else {
703         std::string heightCalc = height.CalcValue();
704         if (LessNotEqual(height.Value(), 0.0)) {
705             height.SetValue(0.0);
706         }
707         GetArkUINodeModifiers()->getSelectModifier()->setSelectHeight(
708             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightCalc.c_str());
709     }
710     return panda::JSValueRef::Undefined(vm);
711 }
712 
SetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue SelectBridge::SetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715     EcmaVM* vm = runtimeCallInfo->GetVM();
716     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
718     Local<JSValueRef> controlSizeArg = runtimeCallInfo->GetCallArgRef(1);  // 1: index of width value
719     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
720     auto controlSize = controlSizeArg->Int32Value(vm);
721     if (!ArkTSUtils::ParseJsInteger(vm, controlSizeArg, controlSize)) {
722         GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
723     } else {
724         GetArkUINodeModifiers()->getSelectModifier()->setControlSize(nativeNode, controlSize);
725     }
726     return panda::JSValueRef::Undefined(vm);
727 }
728 
ResetControlSize(ArkUIRuntimeCallInfo * runtimeCallInfo)729 ArkUINativeModuleValue SelectBridge::ResetControlSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
730 {
731     EcmaVM* vm = runtimeCallInfo->GetVM();
732     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
733     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
734     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
735     GetArkUINodeModifiers()->getSelectModifier()->resetControlSize(nativeNode);
736     return panda::JSValueRef::Undefined(vm);
737 }
738 
ResetSize(ArkUIRuntimeCallInfo * runtimeCallInfo)739 ArkUINativeModuleValue SelectBridge::ResetSize(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()->resetSelectSize(nativeNode);
746     return panda::JSValueRef::Undefined(vm);
747 }
748 
ConstructSelect(EcmaVM * vm,FrameNode * frameNode,MenuItemConfiguration & config)749 Local<panda::ObjectRef> SelectBridge::ConstructSelect(EcmaVM* vm, FrameNode* frameNode, MenuItemConfiguration& config)
750 {
751     RefPtr<Framework::JSSymbolGlyphModifier> selectSymbol =
752         AceType::DynamicCast<Framework::JSSymbolGlyphModifier>(config.symbolModifier_);
753     const char* keysOfSelect[] = { "value", "icon", "symbolIcon", "selected", "index", "triggerSelect",
754         "frameNodeId_"};
755     Local<JSValueRef> valuesOfSelect[] = { panda::StringRef::NewFromUtf8(vm, config.value_.c_str()),
756         panda::StringRef::NewFromUtf8(vm, config.icon_.c_str()),
757         selectSymbol->symbol_->GetLocalHandle(),
758         panda::BooleanRef::New(vm, config.selected_),
759         panda::NumberRef::New(vm, config.index_),
760         panda::FunctionRef::New(vm, JsSelectChangeCallback),
761         panda::NumberRef::New(vm, frameNode->GetId())};
762     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSelect), keysOfSelect, valuesOfSelect);
763 }
764 
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue SelectBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767     EcmaVM* vm = runtimeCallInfo->GetVM();
768     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
770     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
771     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
772     if (!secondArg->IsObject(vm)) {
773         SelectModelNG::ResetBuilderFunc(frameNode);
774         return panda::JSValueRef::Undefined(vm);
775     }
776     panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
777     SelectModelNG::SetBuilderFunc(frameNode,
778         [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
779             MenuItemConfiguration config) -> RefPtr<FrameNode> {
780             ContainerScope scope(containerId);
781             auto context = ArkTSUtils::GetContext(vm);
782             CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
783             auto select = ConstructSelect(vm, frameNode, config);
784             select->SetNativePointerFieldCount(vm, 1);
785             select->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
786             panda::Local<panda::JSValueRef> params[] = { context, select };
787             LocalScope pandaScope(vm);
788             panda::TryCatch trycatch(vm);
789             auto jsObject = obj.ToLocal();
790             auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
791             CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
792             panda::Local<panda::FunctionRef> func = makeFunc;
793             auto result = func->Call(vm, jsObject, params, 2);
794             JSNApi::ExecutePendingJob(vm);
795             CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
796             auto resultObj = result->ToObject(vm);
797             panda::Local<panda::JSValueRef> nodeptr =
798                 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, SELECT_NODEPTR_OF_UINODE));
799             CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
800             auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
801             CHECK_NULL_RETURN(frameNode, nullptr);
802             return AceType::Claim(frameNode);
803         });
804     return panda::JSValueRef::Undefined(vm);
805 }
806 
SetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)807 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
808 {
809     EcmaVM* vm = runtimeCallInfo->GetVM();
810     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
811     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
812     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
813     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
814     Color color;
815     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
816         return ResetMenuBackgroundColor(runtimeCallInfo);
817     }
818     GetArkUINodeModifiers()->getSelectModifier()->setMenuBgColor(nativeNode, color.GetValue());
819     return panda::JSValueRef::Undefined(vm);
820 }
821 
ResetMenuBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)822 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
823 {
824     EcmaVM* vm = runtimeCallInfo->GetVM();
825     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
826     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
827     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
828     GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgColor(nativeNode);
829     return panda::JSValueRef::Undefined(vm);
830 }
831 
SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue SelectBridge::SetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834     EcmaVM* vm = runtimeCallInfo->GetVM();
835     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
837     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(1);
838     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
839     if (styleArg->IsUndefined() || !styleArg->IsNumber()) {
840         return ResetMenuBackgroundBlurStyle(runtimeCallInfo);
841     }
842     int32_t styleVal = styleArg->Int32Value(vm);
843     GetArkUINodeModifiers()->getSelectModifier()->setMenuBgBlurStyle(nativeNode, styleVal);
844     return panda::JSValueRef::Undefined(vm);
845 }
846 
ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)847 ArkUINativeModuleValue SelectBridge::ResetMenuBackgroundBlurStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
848 {
849     EcmaVM* vm = runtimeCallInfo->GetVM();
850     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
851     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
852     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
853     GetArkUINodeModifiers()->getSelectModifier()->resetMenuBgBlurStyle(nativeNode);
854     return panda::JSValueRef::Undefined(vm);
855 }
856 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)857 ArkUINativeModuleValue SelectBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
858 {
859     EcmaVM* vm = runtimeCallInfo->GetVM();
860     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
861     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
862     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
863     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
864     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(2);
865     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(3);
866     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(4);
867     CalcDimension dividerStrokeWidth;
868     CalcDimension dividerStartMargin;
869     CalcDimension dividerEndMargin;
870     Color colorObj;
871     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
872     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
873     auto context = frameNode->GetContext();
874     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
875     auto themeManager = context->GetThemeManager();
876     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
877     auto selectTheme = themeManager->GetTheme<SelectTheme>();
878     CHECK_NULL_RETURN(selectTheme, panda::NativePointerRef::New(vm, nullptr));
879     if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
880         if (selectTheme) {
881             dividerStrokeWidth = selectTheme->GetDefaultDividerWidth();
882         } else {
883             dividerStrokeWidth = 0.0_vp;
884         }
885     }
886     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
887         if (selectTheme) {
888             colorObj = selectTheme->GetLineColor();
889         } else {
890             colorObj = Color::TRANSPARENT;
891         }
892     }
893     if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
894         dividerStartMargin = -1.0_vp;
895     }
896     if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
897         dividerEndMargin = -1.0_vp;
898     }
899     uint32_t size = ARG_GROUP_LENGTH;
900     ArkUI_Float32 values[size];
901     int32_t units[size];
902     PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
903     PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
904     GetArkUINodeModifiers()->getSelectModifier()->setSelectDivider(
905         nativeNode, colorObj.GetValue(), values, units, size);
906     return panda::JSValueRef::Undefined(vm);
907 }
908 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)909 ArkUINativeModuleValue SelectBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
910 {
911     EcmaVM* vm = runtimeCallInfo->GetVM();
912     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
913     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
914     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
915     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(1);
916     if (dividerStrokeWidthArgs->IsNull()) {
917         GetArkUINodeModifiers()->getSelectModifier()->resetSelectDividerNull(nativeNode);
918     } else {
919         GetArkUINodeModifiers()->getSelectModifier()->resetSelectDivider(nativeNode);
920     }
921     return panda::JSValueRef::Undefined(vm);
922 }
923 } // namespace OHOS::Ace::NG