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_textpicker_bridge.h"
16 
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "core/components/picker/picker_theme.h"
20 
21 namespace OHOS::Ace::NG {
22 namespace {
23 const std::string FORMAT_FONT = "%s|%s|%s";
24 const std::string DEFAULT_ERR_CODE = "-1";
25 const int32_t DEFAULT_NEGATIVE_NUM = -1;
26 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
27 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF007DFF;
28 
29 constexpr int32_t NODE_INDEX = 0;
30 constexpr int32_t STROKE_WIDTH_INDEX = 1;
31 constexpr int32_t COLOR_INDEX = 2;
32 constexpr int32_t START_MARGIN_INDEX = 3;
33 constexpr int32_t END_MARGIN_INDEX = 4;
34 
35 constexpr int32_t ARG_GROUP_LENGTH = 3;
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim)36 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim)
37 {
38     return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, false) || LessNotEqual(valueDim.Value(), 0.0f) ||
39            (valueDim.Unit() != DimensionUnit::PX && valueDim.Unit() != DimensionUnit::VP);
40 }
41 
PopulateValues(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,ArkUI_Float32 values[],uint32_t size)42 void PopulateValues(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
43     const CalcDimension& dividerEndMargin, ArkUI_Float32 values[], uint32_t size)
44 {
45     values[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
46     values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
47     values[COLOR_INDEX] = static_cast<ArkUI_Float32>(dividerEndMargin.Value());
48 }
49 
PopulateUnits(const CalcDimension & dividerStrokeWidth,const CalcDimension & dividerStartMargin,const CalcDimension & dividerEndMargin,int32_t units[],uint32_t size)50 void PopulateUnits(const CalcDimension& dividerStrokeWidth, const CalcDimension& dividerStartMargin,
51     const CalcDimension& dividerEndMargin, int32_t units[], uint32_t size)
52 {
53     units[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
54     units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
55     units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
56 }
57 } // namespace
58 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)59 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
60 {
61     EcmaVM* vm = runtimeCallInfo->GetVM();
62     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
63     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
64     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
65     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
66     CommonBridge::SetBackgroundColor(runtimeCallInfo);
67     Color color;
68     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
69         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
70     } else {
71         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
72     }
73     return panda::JSValueRef::Undefined(vm);
74 }
75 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78     EcmaVM* vm = runtimeCallInfo->GetVM();
79     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
81     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
82     CommonBridge::ResetBackgroundColor(runtimeCallInfo);
83     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
84     return panda::JSValueRef::Undefined(vm);
85 }
86 
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)87 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
88 {
89     EcmaVM* vm = runtimeCallInfo->GetVM();
90     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
91     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
92     Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
93     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
94     bool canLoop = true;
95     if (canLoopArg->IsBoolean()) {
96         canLoop = canLoopArg->ToBoolean(vm)->Value();
97     }
98     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
99     return panda::JSValueRef::Undefined(vm);
100 }
101 
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)102 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
103 {
104     EcmaVM* vm = runtimeCallInfo->GetVM();
105     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
106     Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
107     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
108     std::vector<uint32_t> selectedValues;
109 
110     if (indexArg->IsArray(vm)) {
111         if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
112             selectedValues.clear();
113             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
114             return panda::JSValueRef::Undefined(vm);
115         }
116         if (selectedValues.size() > 0) {
117             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
118                 nativeNode, selectedValues.data(), selectedValues.size());
119         } else {
120             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
121         }
122     } else {
123         uint32_t selectedValue = 0;
124         if (indexArg->IsNumber()) {
125             selectedValue = indexArg->Uint32Value(vm);
126             selectedValues.emplace_back(selectedValue);
127             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
128                 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
129         } else {
130             selectedValues.clear();
131             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
132         }
133     }
134     return panda::JSValueRef::Undefined(vm);
135 }
136 
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139     EcmaVM* vm = runtimeCallInfo->GetVM();
140     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
142     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
143     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
144     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
145     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
146     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
147     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
148     Color textColor;
149     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
150         textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
151     }
152     CalcDimension size;
153     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
154         size = Dimension(DEFAULT_NEGATIVE_NUM);
155     } else {
156         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
157             size = Dimension(DEFAULT_NEGATIVE_NUM);
158         }
159     }
160     std::string weight = DEFAULT_ERR_CODE;
161     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
162         if (fontWeightArg->IsNumber()) {
163             weight = std::to_string(fontWeightArg->Int32Value(vm));
164         } else {
165             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
166                 weight = DEFAULT_ERR_CODE;
167             }
168         }
169     }
170     std::string fontFamily;
171     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
172         fontFamily = DEFAULT_ERR_CODE;
173     }
174     int32_t styleVal = 0;
175     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
176         styleVal = fontStyleArg->Int32Value(vm);
177     }
178     std::string fontSizeStr = size.ToString();
179     std::string fontInfo =
180         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
181     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyle(
182         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
183     return panda::JSValueRef::Undefined(vm);
184 }
185 
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)186 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
187 {
188     EcmaVM* vm = runtimeCallInfo->GetVM();
189     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
190     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
191     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
192     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
193     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
194     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
195     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
196     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
197     Color textColor;
198     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
199         textColor.SetValue(DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR);
200     }
201     CalcDimension size;
202     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
203         size = Dimension(DEFAULT_NEGATIVE_NUM);
204     } else {
205         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
206             size = Dimension(DEFAULT_NEGATIVE_NUM);
207         }
208     }
209     std::string weight = DEFAULT_ERR_CODE;
210     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
211         if (fontWeightArg->IsNumber()) {
212             weight = std::to_string(fontWeightArg->Int32Value(vm));
213         } else {
214             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
215                 weight = DEFAULT_ERR_CODE;
216             }
217         }
218     }
219     std::string fontFamily;
220     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
221         fontFamily = DEFAULT_ERR_CODE;
222     }
223     int32_t styleVal = 0;
224     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
225         styleVal = fontStyleArg->Int32Value(vm);
226     }
227     std::string fontSizeStr = size.ToString();
228     std::string fontInfo =
229         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
230     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyle(
231         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
232     return panda::JSValueRef::Undefined(vm);
233 }
234 
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)235 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
236 {
237     EcmaVM* vm = runtimeCallInfo->GetVM();
238     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
239     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
240     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);      // text color
241     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(2);   // text font size
242     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(3); // text font weight
243     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(4); // text font family
244     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(5);  // text font style
245     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
246     Color textColor;
247     if (colorArg->IsNull() || colorArg->IsUndefined() || !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor)) {
248         textColor.SetValue(DEFAULT_TIME_PICKER_TEXT_COLOR);
249     }
250     CalcDimension size;
251     if (fontSizeArg->IsNull() || fontSizeArg->IsUndefined()) {
252         size = Dimension(DEFAULT_NEGATIVE_NUM);
253     } else {
254         if (!ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
255             size = Dimension(DEFAULT_NEGATIVE_NUM);
256         }
257     }
258     std::string weight = DEFAULT_ERR_CODE;
259     if (!fontWeightArg->IsNull() && !fontWeightArg->IsUndefined()) {
260         if (fontWeightArg->IsNumber()) {
261             weight = std::to_string(fontWeightArg->Int32Value(vm));
262         } else {
263             if (!ArkTSUtils::ParseJsString(vm, fontWeightArg, weight) || weight.empty()) {
264                 weight = DEFAULT_ERR_CODE;
265             }
266         }
267     }
268     std::string fontFamily;
269     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily) || fontFamily.empty()) {
270         fontFamily = DEFAULT_ERR_CODE;
271     }
272     int32_t styleVal = 0;
273     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
274         styleVal = fontStyleArg->Int32Value(vm);
275     }
276     std::string fontSizeStr = size.ToString();
277     std::string fontInfo =
278         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
279     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyle(
280         nativeNode, textColor.GetValue(), fontInfo.c_str(), styleVal);
281     return panda::JSValueRef::Undefined(vm);
282 }
283 
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)284 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
285 {
286     EcmaVM* vm = runtimeCallInfo->GetVM();
287     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
288     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
289     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
290     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
291 
292     CalcDimension height;
293     if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
294         if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
295             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
296             return panda::JSValueRef::Undefined(vm);
297         }
298     }
299 
300     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
301         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
302 
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
307 {
308     EcmaVM* vm = runtimeCallInfo->GetVM();
309     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
311     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
312     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
313     return panda::JSValueRef::Undefined(vm);
314 }
315 
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318     EcmaVM* vm = runtimeCallInfo->GetVM();
319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
321     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
322     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
323     return panda::JSValueRef::Undefined(vm);
324 }
325 
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)326 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(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     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
332     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
333     return panda::JSValueRef::Undefined(vm);
334 }
335 
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)336 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
337 {
338     EcmaVM* vm = runtimeCallInfo->GetVM();
339     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
340     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
341     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
342     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
351     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
353     return panda::JSValueRef::Undefined(vm);
354 }
355 
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)356 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
357 {
358     EcmaVM* vm = runtimeCallInfo->GetVM();
359     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
360     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
361     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
362     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
363     return panda::JSValueRef::Undefined(vm);
364 }
365 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)366 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
367 {
368     EcmaVM* vm = runtimeCallInfo->GetVM();
369     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
370     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
371     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
372     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
373     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
374     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
375     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
376     CalcDimension dividerStrokeWidth;
377     CalcDimension dividerStartMargin;
378     CalcDimension dividerEndMargin;
379     Color colorObj;
380     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
381     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
382     auto context = frameNode->GetContext();
383     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
384     auto themeManager = context->GetThemeManager();
385     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
386     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
387     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
388     if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth)) {
389         if (pickerTheme) {
390             dividerStrokeWidth = pickerTheme->GetDividerThickness();
391         } else {
392             dividerStrokeWidth = 0.0_vp;
393         }
394     }
395     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj)) {
396         if (pickerTheme) {
397             colorObj = pickerTheme->GetDividerColor();
398         } else {
399             colorObj = Color::TRANSPARENT;
400         }
401     }
402     if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin)) {
403         dividerStartMargin = 0.0_vp;
404     }
405     if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin)) {
406         dividerEndMargin = 0.0_vp;
407     }
408     uint32_t size = ARG_GROUP_LENGTH;
409     ArkUI_Float32 values[size];
410     int32_t units[size];
411     PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
412     PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
413     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDivider(
414         nativeNode, colorObj.GetValue(), values, units, size);
415     return panda::JSValueRef::Undefined(vm);
416 }
417 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)418 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
419 {
420     EcmaVM* vm = runtimeCallInfo->GetVM();
421     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
422     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
423     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
424     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
425     return panda::JSValueRef::Undefined(vm);
426 }
427 
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)428 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
429 {
430     EcmaVM* vm = runtimeCallInfo->GetVM();
431     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
432     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
433     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
434     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
435     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
436     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
437     auto context = frameNode->GetContext();
438     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
439     auto themeManager = context->GetThemeManager();
440     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
441     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
442     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
443     CalcDimension height;
444     if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, true)) {
445         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeight(
446             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
447     } else {
448         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
449     }
450     return panda::JSValueRef::Undefined(vm);
451 }
452 
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)453 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
454 {
455     EcmaVM* vm = runtimeCallInfo->GetVM();
456     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
457     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
458     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
459     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
460     return panda::JSValueRef::Undefined(vm);
461 }
462 } // namespace OHOS::Ace::NG
463 
464