• 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_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 #include "core/components_ng/pattern/picker/picker_type_define.h"
21 
22 namespace OHOS::Ace::NG {
23 namespace {
24 const std::string FORMAT_FONT = "%s|%s|%s";
25 const std::string DEFAULT_ERR_CODE = "-1";
26 const int32_t DEFAULT_NEGATIVE_NUM = -1;
27 const int32_t DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS = 24;
28 constexpr uint32_t DEFAULT_TIME_PICKER_TEXT_COLOR = 0xFF182431;
29 constexpr uint32_t DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR = 0xFF0A59F7;
30 constexpr uint32_t DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_COLOR = 0x0C182431;
31 
32 constexpr int32_t NODE_INDEX = 0;
33 constexpr int32_t STROKE_WIDTH_INDEX = 1;
34 constexpr int32_t COLOR_INDEX = 2;
35 constexpr int32_t START_MARGIN_INDEX = 3;
36 constexpr int32_t END_MARGIN_INDEX = 4;
37 constexpr int32_t NUM_1 = 1;
38 constexpr int32_t UNIT_VP = 1;
39 
40 constexpr int32_t ARG_GROUP_LENGTH = 3;
41 constexpr int PARAM_ARR_LENGTH_2 = 2;
42 constexpr int NUM_0 = 0;
43 constexpr int NUM_2 = 2;
44 constexpr int VALUE_MAX_SIZE = 4;
45 constexpr int GETVALUE_MAX_SIZE = 5;
46 
47 constexpr int32_t NODE_ARG_INDEX = 0;
48 constexpr int32_t COLOR_ARG_INDEX = 1;
49 constexpr int32_t FONT_SIZE_ARG_INDEX = 2;
50 constexpr int32_t FONT_WEIGHT_ARG_INDEX = 3;
51 constexpr int32_t FONT_FAMILY_ARG_INDEX = 4;
52 constexpr int32_t FONT_STYLE_ARG_INDEX = 5;
53 constexpr int32_t MIN_FONT_SIZE_ARG_INDEX = 6;
54 constexpr int32_t MAX_FONT_SIZE_ARG_INDEX = 7;
55 constexpr int32_t OVER_FLOW_ARG_INDEX = 8;
56 
57 enum GetValueArrayIndex {
58     GETCOLOR,
59     GETTOPLEFT,
60     GETTOPRIGHT,
61     GETBOTTOMLEFT,
62     GETBOTTOMRIGHT,
63 };
64 enum ValueArrayIndex {
65     TOPLEFT,
66     TOPRIGHT,
67     BOTTOMLEFT,
68     BOTTOMRIGHT,
69 };
ParseDividerDimension(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & valueDim,RefPtr<ResourceObject> & resourceObject)70 bool ParseDividerDimension(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& valueDim,
71     RefPtr<ResourceObject>& resourceObject)
72 {
73     return !ArkTSUtils::ParseJsDimensionVpNG(vm, value, valueDim, resourceObject, false) ||
74         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[NODE_INDEX] = static_cast<ArkUI_Float32>(dividerStrokeWidth.Value());
83     values[STROKE_WIDTH_INDEX] = static_cast<ArkUI_Float32>(dividerStartMargin.Value());
84     values[COLOR_INDEX] = 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[NODE_INDEX] = static_cast<int32_t>(dividerStrokeWidth.Unit());
91     units[STROKE_WIDTH_INDEX] = static_cast<int32_t>(dividerStartMargin.Unit());
92     units[COLOR_INDEX] = static_cast<int32_t>(dividerEndMargin.Unit());
93 }
94 
ParseFontSize(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t argIndex,RefPtr<ResourceObject> & fontSizeResObj)95 std::string ParseFontSize(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t argIndex,
96     RefPtr<ResourceObject>& fontSizeResObj)
97 {
98     CalcDimension fontSizeData;
99     Local<JSValueRef> arg = runtimeCallInfo->GetCallArgRef(argIndex);
100     if (arg->IsNull() || arg->IsUndefined()) {
101         fontSizeData = Dimension(DEFAULT_NEGATIVE_NUM);
102     } else {
103         if (!ArkTSUtils::ParseJsDimensionNG(vm, arg, fontSizeData, DimensionUnit::FP, fontSizeResObj, false)) {
104             fontSizeData = Dimension(DEFAULT_NEGATIVE_NUM);
105         }
106     }
107     return fontSizeData.ToString();
108 }
109 
ParseFontWeight(const EcmaVM * vm,const Local<JSValueRef> & value)110 std::string ParseFontWeight(const EcmaVM* vm, const Local<JSValueRef>& value)
111 {
112     std::string weight = DEFAULT_ERR_CODE;
113     if (!value->IsNull() && !value->IsUndefined()) {
114         if (value->IsNumber()) {
115             weight = std::to_string(value->Int32Value(vm));
116         } else {
117             if (!ArkTSUtils::ParseJsString(vm, value, weight) || weight.empty()) {
118                 weight = DEFAULT_ERR_CODE;
119             }
120         }
121     }
122     return weight;
123 }
124 
ParseFontFamily(const EcmaVM * vm,const Local<JSValueRef> & fontFamilyArg,RefPtr<ResourceObject> & fontFamilyResObj)125 std::string ParseFontFamily(const EcmaVM* vm, const Local<JSValueRef>& fontFamilyArg,
126     RefPtr<ResourceObject>& fontFamilyResObj)
127 {
128     std::string fontFamily;
129     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
130         fontFamily.empty()) {
131         fontFamily = DEFAULT_ERR_CODE;
132     }
133     return fontFamily;
134 }
135 
ParseTextColor(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t argIndex,RefPtr<ResourceObject> & textColorResObj,uint32_t defaultTextColor,ArkUINodeHandle nativeNode,int32_t & isSetByUser)136 Color ParseTextColor(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t argIndex,
137     RefPtr<ResourceObject>& textColorResObj, uint32_t defaultTextColor,
138     ArkUINodeHandle nativeNode, int32_t& isSetByUser)
139 {
140     Color textColor;
141     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(argIndex);
142 
143     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
144     if (colorArg->IsNull() || colorArg->IsUndefined() ||
145         !ArkTSUtils::ParseJsColorAlpha(vm, colorArg, textColor, textColorResObj, nodeInfo)) {
146         textColor.SetValue(defaultTextColor);
147         isSetByUser = false;
148     } else {
149         isSetByUser = true;
150     }
151     return textColor;
152 }
153 
ParseSelectedBackgroundStyleRadius(const EcmaVM * vm,ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Bool * isHasValue,ArkUIPickerBackgroundStyleStruct & backgroundStyleStruct,RefPtr<ResourceObject> * radiusResObjs)154 void ParseSelectedBackgroundStyleRadius(const EcmaVM* vm, ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Bool* isHasValue,
155     ArkUIPickerBackgroundStyleStruct& backgroundStyleStruct, RefPtr<ResourceObject>* radiusResObjs)
156 {
157     ArkUI_Float32 value[VALUE_MAX_SIZE] = {
158         DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS, DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS,
159         DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS, DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_BORDER_RADIUS};
160     ArkUI_Int32 unit[VALUE_MAX_SIZE] = {UNIT_VP, UNIT_VP, UNIT_VP, UNIT_VP};
161     auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
162     CalcDimension calcDimension;
163     RefPtr<ResourceObject> tmpResObj;
164     for (int i = 0; i < VALUE_MAX_SIZE; i++) {
165         if (ArkTSUtils::ParseJsLengthMetrics(vm, runtimeCallInfo->GetCallArgRef(i + NUM_2), calcDimension, tmpResObj) &&
166             !calcDimension.IsNegative()) {
167             isHasValue[i + COLOR_ARG_INDEX] = true;
168             value[i] = calcDimension.Value();
169             unit[i] = static_cast<int>(calcDimension.Unit());
170             radiusResObjs[i] = tmpResObj;
171         }
172         if (ArkTSUtils::ParseJsDimensionVp(vm, runtimeCallInfo->GetCallArgRef(i + NUM_2), calcDimension, tmpResObj) &&
173             !calcDimension.IsNegative()) {
174             isHasValue[i + COLOR_ARG_INDEX] = true;
175             value[i] = calcDimension.Value();
176             unit[i] = static_cast<int>(calcDimension.Unit());
177             radiusResObjs[i] = tmpResObj;
178         }
179     }
180     if (isRightToLeft && (value[TOPLEFT] != value[BOTTOMLEFT] || value[TOPRIGHT] != value[BOTTOMRIGHT]) &&
181         (unit[TOPLEFT] != unit[BOTTOMLEFT] || unit[TOPRIGHT] != unit[BOTTOMRIGHT])) {
182         std::swap(value[TOPLEFT], value[BOTTOMLEFT]);
183         std::swap(value[TOPRIGHT], value[BOTTOMRIGHT]);
184         std::swap(unit[TOPLEFT], unit[BOTTOMLEFT]);
185         std::swap(unit[TOPRIGHT], unit[BOTTOMRIGHT]);
186         std::swap(isHasValue[GETTOPLEFT], isHasValue[GETTOPRIGHT]);
187         std::swap(isHasValue[GETBOTTOMLEFT], isHasValue[GETBOTTOMRIGHT]);
188         std::swap(radiusResObjs[TOPLEFT], radiusResObjs[BOTTOMLEFT]);
189         std::swap(radiusResObjs[TOPRIGHT], radiusResObjs[BOTTOMRIGHT]);
190     }
191     backgroundStyleStruct.values = value;
192     backgroundStyleStruct.units = unit;
193     backgroundStyleStruct.length = VALUE_MAX_SIZE;
194 }
195 
196 } // namespace
197 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)198 ArkUINativeModuleValue TextPickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200     EcmaVM* vm = runtimeCallInfo->GetVM();
201     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
202     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
203     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
204     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
205     CommonBridge::SetBackgroundColor(runtimeCallInfo);
206     Color color;
207     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
208         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
209     } else {
210         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerBackgroundColor(nativeNode, color.GetValue());
211     }
212     return panda::JSValueRef::Undefined(vm);
213 }
214 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)215 ArkUINativeModuleValue TextPickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
216 {
217     EcmaVM* vm = runtimeCallInfo->GetVM();
218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
219     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
220     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
221     CommonBridge::ResetBackgroundColor(runtimeCallInfo);
222     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerBackgroundColor(nativeNode);
223     return panda::JSValueRef::Undefined(vm);
224 }
225 
SetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue TextPickerBridge::SetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
227 {
228     EcmaVM* vm = runtimeCallInfo->GetVM();
229     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
230     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
231     Local<JSValueRef> canLoopArg = runtimeCallInfo->GetCallArgRef(1);
232     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
233     bool canLoop = true;
234     if (canLoopArg->IsBoolean()) {
235         canLoop = canLoopArg->ToBoolean(vm)->Value();
236     }
237     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerCanLoop(nativeNode, canLoop);
238     return panda::JSValueRef::Undefined(vm);
239 }
240 
SetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue TextPickerBridge::SetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
242 {
243     EcmaVM* vm = runtimeCallInfo->GetVM();
244     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
245     Local<JSValueRef> indexArg = runtimeCallInfo->GetCallArgRef(1);
246     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
247     std::vector<uint32_t> selectedValues;
248 
249     if (indexArg->IsArray(vm)) {
250         if (!ArkTSUtils::ParseJsIntegerArray(vm, indexArg, selectedValues)) {
251             selectedValues.clear();
252             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
253             return panda::JSValueRef::Undefined(vm);
254         }
255         if (selectedValues.size() > 0) {
256             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
257                 nativeNode, selectedValues.data(), selectedValues.size());
258         } else {
259             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
260         }
261     } else {
262         uint32_t selectedValue = 0;
263         if (indexArg->IsNumber()) {
264             selectedValue = indexArg->Uint32Value(vm);
265             selectedValues.emplace_back(selectedValue);
266             GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedIndex(
267                 nativeNode, selectedValues.data(), DEFAULT_NEGATIVE_NUM); // represent this is a number.
268         } else {
269             selectedValues.clear();
270             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
271         }
272     }
273     return panda::JSValueRef::Undefined(vm);
274 }
275 
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue TextPickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278     EcmaVM* vm = runtimeCallInfo->GetVM();
279     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
281     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
282     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
283     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
284     Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
285     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
286 
287     ArkUIPickerTextStyleStruct textStyleStruct;
288     RefPtr<ResourceObject> textColorResObj;
289     Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
290         DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
291 
292     RefPtr<ResourceObject> fontSizeResObj;
293     std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
294 
295     std::string weight = ParseFontWeight(vm, fontWeightArg);
296 
297     std::string fontFamily;
298     RefPtr<ResourceObject> fontFamilyResObj;
299     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
300         fontFamily.empty()) {
301         fontFamily = DEFAULT_ERR_CODE;
302     }
303 
304     int32_t styleVal = 0;
305     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
306         styleVal = fontStyleArg->Int32Value(vm);
307     }
308 
309     RefPtr<ResourceObject> minFontSizeResObj;
310     std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
311 
312     RefPtr<ResourceObject> maxFontSizeResObj;
313     std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
314 
315     int32_t overflowVal = 0;
316     if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
317         overflowVal = overflowArg->Int32Value(vm);
318     }
319     std::string fontInfo =
320         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
321 
322     textStyleStruct.textColor = textColor.GetValue();
323     textStyleStruct.fontStyle = styleVal;
324     textStyleStruct.textOverflow = overflowVal;
325     textStyleStruct.fontInfo = fontInfo.c_str();
326     textStyleStruct.minFontSize = minSize.c_str();
327     textStyleStruct.maxFontSize = maxSize.c_str();
328     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
329     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
330     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
331     textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
332     textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
333     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerTextStyleWithResObj(nativeNode, &textStyleStruct);
334     return panda::JSValueRef::Undefined(vm);
335 }
336 
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue TextPickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
338 {
339     EcmaVM* vm = runtimeCallInfo->GetVM();
340     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
342     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
343     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
344     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
345     Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
346     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
347 
348     ArkUIPickerTextStyleStruct textStyleStruct;
349     RefPtr<ResourceObject> textColorResObj;
350     Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
351         DEFAULT_TIME_PICKER_SELECTED_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
352 
353     RefPtr<ResourceObject> fontSizeResObj;
354     std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
355 
356     std::string weight = ParseFontWeight(vm, fontWeightArg);
357 
358     std::string fontFamily;
359     RefPtr<ResourceObject> fontFamilyResObj;
360     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
361         fontFamily.empty()) {
362         fontFamily = DEFAULT_ERR_CODE;
363     }
364     int32_t styleVal = 0;
365     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
366         styleVal = fontStyleArg->Int32Value(vm);
367     }
368 
369     RefPtr<ResourceObject> minFontSizeResObj;
370     std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
371 
372     RefPtr<ResourceObject> maxFontSizeResObj;
373     std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
374 
375     int32_t overflowVal = 0;
376     if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
377         overflowVal = overflowArg->Int32Value(vm);
378     }
379     std::string fontInfo =
380         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
381 
382     textStyleStruct.textColor = textColor.GetValue();
383     textStyleStruct.fontStyle = styleVal;
384     textStyleStruct.textOverflow = overflowVal;
385     textStyleStruct.fontInfo = fontInfo.c_str();
386     textStyleStruct.minFontSize = minSize.c_str();
387     textStyleStruct.maxFontSize = maxSize.c_str();
388     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
389     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
390     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
391     textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
392     textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
393     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerSelectedTextStyleWithResObj(nativeNode,
394         &textStyleStruct);
395     return panda::JSValueRef::Undefined(vm);
396 }
397 
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)398 ArkUINativeModuleValue TextPickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
399 {
400     EcmaVM* vm = runtimeCallInfo->GetVM();
401     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
402     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
403     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
404     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
405     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
406     Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
407     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
408 
409     ArkUIPickerTextStyleStruct textStyleStruct;
410     RefPtr<ResourceObject> textColorResObj;
411     Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
412         DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
413 
414     RefPtr<ResourceObject> fontSizeResObj;
415     std::string fontSizeStr = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
416 
417     std::string weight = ParseFontWeight(vm, fontWeightArg);
418 
419     std::string fontFamily;
420     RefPtr<ResourceObject> fontFamilyResObj;
421     if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamily, fontFamilyResObj) ||
422         fontFamily.empty()) {
423         fontFamily = DEFAULT_ERR_CODE;
424     }
425 
426     int32_t styleVal = 0;
427     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined()) {
428         styleVal = fontStyleArg->Int32Value(vm);
429     }
430 
431     RefPtr<ResourceObject> minFontSizeResObj;
432     std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
433 
434     RefPtr<ResourceObject> maxFontSizeResObj;
435     std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
436 
437     int32_t overflowVal = 0;
438     if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
439         overflowVal = overflowArg->Int32Value(vm);
440     }
441     std::string fontInfo =
442         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSizeStr.c_str(), weight.c_str(), fontFamily.c_str());
443 
444     textStyleStruct.textColor = textColor.GetValue();
445     textStyleStruct.fontStyle = styleVal;
446     textStyleStruct.textOverflow = overflowVal;
447     textStyleStruct.fontInfo = fontInfo.c_str();
448     textStyleStruct.minFontSize = minSize.c_str();
449     textStyleStruct.maxFontSize = maxSize.c_str();
450     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
451     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
452     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
453     textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
454     textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
455     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisappearTextStyleWithResObj(nativeNode,
456         &textStyleStruct);
457     return panda::JSValueRef::Undefined(vm);
458 }
459 
SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)460 ArkUINativeModuleValue TextPickerBridge::SetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
461 {
462     EcmaVM* vm = runtimeCallInfo->GetVM();
463     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
464     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
465     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
466     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
467 
468     CalcDimension height;
469     if (itemHeightValue->IsNumber() || itemHeightValue->IsString(vm)) {
470         if (!ArkTSUtils::ParseJsDimensionFp(vm, itemHeightValue, height)) {
471             GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
472             return panda::JSValueRef::Undefined(vm);
473         }
474     }
475 
476     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultPickerItemHeight(
477         nativeNode, height.Value(), static_cast<int32_t>(height.Unit()));
478 
479     return panda::JSValueRef::Undefined(vm);
480 }
481 
ResetCanLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)482 ArkUINativeModuleValue TextPickerBridge::ResetCanLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
483 {
484     EcmaVM* vm = runtimeCallInfo->GetVM();
485     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
486     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
487     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
488     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerCanLoop(nativeNode);
489     return panda::JSValueRef::Undefined(vm);
490 }
491 
ResetSelectedIndex(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue TextPickerBridge::ResetSelectedIndex(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494     EcmaVM* vm = runtimeCallInfo->GetVM();
495     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
496     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
497     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
498     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedIndex(nativeNode);
499     return panda::JSValueRef::Undefined(vm);
500 }
501 
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)502 ArkUINativeModuleValue TextPickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
503 {
504     EcmaVM* vm = runtimeCallInfo->GetVM();
505     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
506     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
507     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
508     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerTextStyle(nativeNode);
509     return panda::JSValueRef::Undefined(vm);
510 }
511 
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)512 ArkUINativeModuleValue TextPickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
513 {
514     EcmaVM* vm = runtimeCallInfo->GetVM();
515     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
516     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
517     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
518     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerSelectedTextStyle(nativeNode);
519     return panda::JSValueRef::Undefined(vm);
520 }
521 
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue TextPickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524     EcmaVM* vm = runtimeCallInfo->GetVM();
525     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
527     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
528     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisappearTextStyle(nativeNode);
529     return panda::JSValueRef::Undefined(vm);
530 }
531 
ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)532 ArkUINativeModuleValue TextPickerBridge::ResetDefaultPickerItemHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
533 {
534     EcmaVM* vm = runtimeCallInfo->GetVM();
535     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
536     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
537     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
538     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultPickerItemHeight(nativeNode);
539     return panda::JSValueRef::Undefined(vm);
540 }
541 
SetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue TextPickerBridge::SetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544     EcmaVM* vm = runtimeCallInfo->GetVM();
545     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
547     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
548     Local<JSValueRef> dividerStrokeWidthArgs = runtimeCallInfo->GetCallArgRef(STROKE_WIDTH_INDEX);
549     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(COLOR_INDEX);
550     Local<JSValueRef> dividerStartMarginArgs = runtimeCallInfo->GetCallArgRef(START_MARGIN_INDEX);
551     Local<JSValueRef> dividerEndMarginArgs = runtimeCallInfo->GetCallArgRef(END_MARGIN_INDEX);
552     CalcDimension dividerStrokeWidth;
553     CalcDimension dividerStartMargin;
554     CalcDimension dividerEndMargin;
555     Color colorObj;
556     RefPtr<ResourceObject> strokeWidthResObj;
557     RefPtr<ResourceObject> colorResObj;
558     RefPtr<ResourceObject> startMarginResObj;
559     RefPtr<ResourceObject> endMarginResObj;
560     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
561     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
562     auto context = frameNode->GetContext();
563     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
564     auto themeManager = context->GetThemeManager();
565     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
566     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
567     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
568     if (ParseDividerDimension(vm, dividerStrokeWidthArgs, dividerStrokeWidth, strokeWidthResObj)) {
569         dividerStrokeWidth = pickerTheme ? pickerTheme->GetDividerThickness() : 0.0_vp;
570     }
571 
572     ArkUI_Bool isDefaultColor = false;
573     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
574     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, colorObj, colorResObj, nodeInfo)) {
575         colorObj = pickerTheme ? pickerTheme->GetDividerColor() : Color::TRANSPARENT;
576         isDefaultColor = true;
577     }
578     if (ParseDividerDimension(vm, dividerStartMarginArgs, dividerStartMargin, startMarginResObj)) {
579         dividerStartMargin = 0.0_vp;
580     }
581     if (ParseDividerDimension(vm, dividerEndMarginArgs, dividerEndMargin, endMarginResObj)) {
582         dividerEndMargin = 0.0_vp;
583     }
584     uint32_t size = ARG_GROUP_LENGTH;
585     ArkUI_Float32 values[size];
586     int32_t units[size];
587     PopulateValues(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, values, size);
588     PopulateUnits(dividerStrokeWidth, dividerStartMargin, dividerEndMargin, units, size);
589 
590     ArkUIPickerDividerResObjStruct dividerResObjStr;
591     dividerResObjStr.colorRawPtr = AceType::RawPtr(colorResObj);
592     dividerResObjStr.strokeWidthRawPtr = AceType::RawPtr(strokeWidthResObj);
593     dividerResObjStr.startMarginRawPtr = AceType::RawPtr(startMarginResObj);
594     dividerResObjStr.endMarginRawPtr = AceType::RawPtr(endMarginResObj);
595     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDividerWithResObj(
596         nativeNode, colorObj.GetValue(), values, units, size, &dividerResObjStr, isDefaultColor);
597     return panda::JSValueRef::Undefined(vm);
598 }
599 
ResetDivider(ArkUIRuntimeCallInfo * runtimeCallInfo)600 ArkUINativeModuleValue TextPickerBridge::ResetDivider(ArkUIRuntimeCallInfo* runtimeCallInfo)
601 {
602     EcmaVM* vm = runtimeCallInfo->GetVM();
603     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
604     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
605     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
606     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
607     if (valueArg->IsNull()) {
608         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDividerNull(nativeNode);
609     } else {
610         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDivider(nativeNode);
611     }
612     return panda::JSValueRef::Undefined(vm);
613 }
614 
SetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)615 ArkUINativeModuleValue TextPickerBridge::SetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
616 {
617     EcmaVM* vm = runtimeCallInfo->GetVM();
618     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
619     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
620     Local<JSValueRef> itemHeightValue = runtimeCallInfo->GetCallArgRef(1);
621     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
622     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
623     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
624     auto context = frameNode->GetContext();
625     CHECK_NULL_RETURN(context, panda::NativePointerRef::New(vm, nullptr));
626     auto themeManager = context->GetThemeManager();
627     CHECK_NULL_RETURN(themeManager, panda::NativePointerRef::New(vm, nullptr));
628     auto pickerTheme = themeManager->GetTheme<PickerTheme>();
629     CHECK_NULL_RETURN(pickerTheme, panda::NativePointerRef::New(vm, nullptr));
630     CalcDimension height;
631     RefPtr<ResourceObject> heightResObj;
632     if (ArkTSUtils::ParseJsDimensionVpNG(vm, itemHeightValue, height, heightResObj, true)) {
633         auto heightRawPtr = AceType::RawPtr(heightResObj);
634         GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerGradientHeightWithResObj(
635             nativeNode, height.Value(), static_cast<int32_t>(height.Unit()), heightRawPtr);
636     } else {
637         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
638     }
639     return panda::JSValueRef::Undefined(vm);
640 }
641 
ResetGradientHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)642 ArkUINativeModuleValue TextPickerBridge::ResetGradientHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
643 {
644     EcmaVM* vm = runtimeCallInfo->GetVM();
645     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
646     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
647     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
648     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerGradientHeight(nativeNode);
649     return panda::JSValueRef::Undefined(vm);
650 }
651 
SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue TextPickerBridge::SetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
653 {
654     EcmaVM* vm = runtimeCallInfo->GetVM();
655     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
656     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
657     Local<JSValueRef> disableTextStyleAnimationArg = runtimeCallInfo->GetCallArgRef(1);
658     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
659     bool disableTextStyleAnimation = false;
660     if (disableTextStyleAnimationArg->IsBoolean()) {
661         disableTextStyleAnimation = disableTextStyleAnimationArg->ToBoolean(vm)->Value();
662     }
663     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDisableTextStyleAnimation(
664         nativeNode, disableTextStyleAnimation);
665     return panda::JSValueRef::Undefined(vm);
666 }
667 
ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)668 ArkUINativeModuleValue TextPickerBridge::ResetDisableTextStyleAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
669 {
670     EcmaVM* vm = runtimeCallInfo->GetVM();
671     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
672     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
673     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
674     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDisableTextStyleAnimation(nativeNode);
675     return panda::JSValueRef::Undefined(vm);
676 }
677 
SetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue TextPickerBridge::SetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680     EcmaVM* vm = runtimeCallInfo->GetVM();
681     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
682     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_ARG_INDEX);
683     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(FONT_WEIGHT_ARG_INDEX);
684     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(FONT_FAMILY_ARG_INDEX);
685     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(FONT_STYLE_ARG_INDEX);
686     Local<JSValueRef> overflowArg = runtimeCallInfo->GetCallArgRef(OVER_FLOW_ARG_INDEX);
687     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
688 
689     ArkUIPickerTextStyleStruct textStyleStruct;
690     RefPtr<ResourceObject> textColorResObj;
691     Color textColor = ParseTextColor(vm, runtimeCallInfo, COLOR_ARG_INDEX, textColorResObj,
692         DEFAULT_TIME_PICKER_TEXT_COLOR, nativeNode, textStyleStruct.textColorSetByUser);
693 
694     RefPtr<ResourceObject> fontSizeResObj;
695     std::string fontSize = ParseFontSize(vm, runtimeCallInfo, FONT_SIZE_ARG_INDEX, fontSizeResObj);
696 
697     std::string weight = ParseFontWeight(vm, fontWeightArg);
698 
699     RefPtr<ResourceObject> fontFamilyResObj;
700     std::string fontFamily = ParseFontFamily(vm, fontFamilyArg, fontFamilyResObj);
701 
702     int32_t styleVal = 0;
703     if (!fontStyleArg->IsNull() && !fontStyleArg->IsUndefined() && fontStyleArg->IsNumber()) {
704         styleVal = fontStyleArg->Int32Value(vm);
705     }
706 
707     RefPtr<ResourceObject> minFontSizeResObj;
708     std::string minSize = ParseFontSize(vm, runtimeCallInfo, MIN_FONT_SIZE_ARG_INDEX, minFontSizeResObj);
709 
710     RefPtr<ResourceObject> maxFontSizeResObj;
711     std::string maxSize = ParseFontSize(vm, runtimeCallInfo, MAX_FONT_SIZE_ARG_INDEX, maxFontSizeResObj);
712 
713     int32_t overflowVal = 0;
714     if (!overflowArg->IsNull() && !overflowArg->IsUndefined() && overflowArg->IsNumber()) {
715         overflowVal = overflowArg->Int32Value(vm);
716     }
717     std::string fontInfo =
718         StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
719 
720     textStyleStruct.textColor = textColor.GetValue();
721     textStyleStruct.fontStyle = styleVal;
722     textStyleStruct.textOverflow = overflowVal;
723     textStyleStruct.fontInfo = fontInfo.c_str();
724     textStyleStruct.minFontSize = minSize.c_str();
725     textStyleStruct.maxFontSize = maxSize.c_str();
726     textStyleStruct.fontSizeRawPtr = AceType::RawPtr(fontSizeResObj);
727     textStyleStruct.fontFamilyRawPtr = AceType::RawPtr(fontFamilyResObj);
728     textStyleStruct.textColorRawPtr = AceType::RawPtr(textColorResObj);
729     textStyleStruct.minFontSizeRawPtr = AceType::RawPtr(minFontSizeResObj);
730     textStyleStruct.maxFontSizeRawPtr = AceType::RawPtr(maxFontSizeResObj);
731     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerDefaultTextStyleWithResObj(
732         nativeNode, &textStyleStruct);
733     return panda::JSValueRef::Undefined(vm);
734 }
735 
ResetDefaultTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)736 ArkUINativeModuleValue TextPickerBridge::ResetDefaultTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
737 {
738     EcmaVM* vm = runtimeCallInfo->GetVM();
739     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
740     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
741     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
742     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerDefaultTextStyle(nativeNode);
743     return panda::JSValueRef::Undefined(vm);
744 }
745 
SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)746 ArkUINativeModuleValue TextPickerBridge::SetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
747 {
748     EcmaVM* vm = runtimeCallInfo->GetVM();
749     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
750     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);   // framenode
751     Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(1); // isEnableHapticFeedback
752     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
753     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
754     auto modifiers = GetArkUINodeModifiers();
755     CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
756     auto textPickerModifier = modifiers->getTextPickerModifier();
757     CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
758     if (enableHapticFeedbackArg->IsBoolean()) {
759         bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
760         textPickerModifier->setTextPickerEnableHapticFeedback(nativeNode, value);
761     } else {
762         textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
763     }
764     return panda::JSValueRef::Undefined(vm);
765 }
766 
ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)767 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
768 {
769     EcmaVM* vm = runtimeCallInfo->GetVM();
770     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
771     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // framenode
772     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
773     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
774     auto modifiers = GetArkUINodeModifiers();
775     CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
776     auto textPickerModifier = modifiers->getTextPickerModifier();
777     CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
778     textPickerModifier->resetTextPickerEnableHapticFeedback(nativeNode);
779     return panda::JSValueRef::Undefined(vm);
780 }
781 
SetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)782 ArkUINativeModuleValue TextPickerBridge::SetTextPickerSelectedBackgroundStyle(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); // frameNode
787     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1); // background color
788     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
789     CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
790     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
791 
792     ArkUI_Bool isHasValue[GETVALUE_MAX_SIZE] = {false, false, false, false, false};
793     ArkUIPickerBackgroundStyleStruct backgroundStyleStruct;
794     backgroundStyleStruct.colorValue = DEFAULT_TEXT_PICKER_SELECTED_BACKGROUND_COLOR;
795     Color color;
796     RefPtr<ResourceObject> colorResObj;
797     if (ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color, colorResObj, nodeInfo)) {
798         isHasValue[GETCOLOR] = true;
799         backgroundStyleStruct.isColorSetByUser = true;
800         backgroundStyleStruct.colorValue = color.GetValue();
801     }
802     backgroundStyleStruct.colorRawPtr = AceType::RawPtr(colorResObj);
803 
804     RefPtr<ResourceObject> radiusResObjs[VALUE_MAX_SIZE] = {nullptr, nullptr, nullptr, nullptr};
805     ParseSelectedBackgroundStyleRadius(vm, runtimeCallInfo, isHasValue, backgroundStyleStruct, radiusResObjs);
806     backgroundStyleStruct.topLeftRawPtr = AceType::RawPtr(radiusResObjs[TOPLEFT]);
807     backgroundStyleStruct.topRightRawPtr = AceType::RawPtr(radiusResObjs[TOPRIGHT]);
808     backgroundStyleStruct.bottomLeftRawPtr = AceType::RawPtr(radiusResObjs[BOTTOMLEFT]);
809     backgroundStyleStruct.bottomRightRawPtr = AceType::RawPtr(radiusResObjs[BOTTOMRIGHT]);
810 
811     auto modifiers = GetArkUINodeModifiers();
812     CHECK_NULL_RETURN(modifiers, panda::NativePointerRef::New(vm, nullptr));
813     auto textPickerModifier = modifiers->getTextPickerModifier();
814     CHECK_NULL_RETURN(textPickerModifier, panda::NativePointerRef::New(vm, nullptr));
815     textPickerModifier->setTextPickerSelectedBackgroundStyleWithResObj(nativeNode, isHasValue, &backgroundStyleStruct);
816     return panda::JSValueRef::Undefined(vm);
817 }
818 
ResetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)819 ArkUINativeModuleValue TextPickerBridge::ResetTextPickerSelectedBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
820 {
821     EcmaVM* vm = runtimeCallInfo->GetVM();
822     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
823     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
824     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
825     auto modifier = GetArkUINodeModifiers();
826     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
827     modifier->getTextPickerModifier()->resetTextPickerSelectedBackgroundStyle(nativeNode);
828     return panda::JSValueRef::Undefined(vm);
829 }
830 
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)831 ArkUINativeModuleValue TextPickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
832 {
833     EcmaVM* vm = runtimeCallInfo->GetVM();
834     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
835     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
836     Local<JSValueRef> crownSensitivityArg = runtimeCallInfo->GetCallArgRef(NUM_1);
837     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
838     int32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
839     if (crownSensitivityArg->IsNumber()) {
840         crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
841     }
842     auto modifier = GetArkUINodeModifiers();
843     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
844     modifier->getTextPickerModifier()->setTextPickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
845     return panda::JSValueRef::Undefined(vm);
846 }
847 
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)848 ArkUINativeModuleValue TextPickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
849 {
850     EcmaVM* vm = runtimeCallInfo->GetVM();
851     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
852     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NODE_INDEX);
853     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
854     auto modifier = GetArkUINodeModifiers();
855     CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
856     modifier->getTextPickerModifier()->resetTextPickerDigitalCrownSensitivity(nativeNode);
857     return panda::JSValueRef::Undefined(vm);
858 }
859 template<typename T>
StringToStringValueWithVM(const EcmaVM * vm,T val)860 panda::Local<panda::JSValueRef> StringToStringValueWithVM(const EcmaVM* vm, T val)
861 {
862     if constexpr (std::is_same_v<T, std::string>) {
863         return panda::StringRef::NewFromUtf8(vm, val.c_str());
864     } else if constexpr (std::is_same_v<T, const char*>) {
865         return panda::StringRef::NewFromUtf8(vm, val);
866     } else if constexpr (std::is_same_v<T, std::u16string>) {
867         return panda::StringRef::NewFromUtf16(vm, val.c_str());
868     }
869     return panda::JSValueRef::Undefined(vm);
870 }
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)871 ArkUINativeModuleValue TextPickerBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
872 {
873     EcmaVM* vm = runtimeCallInfo->GetVM();
874     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
875     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
876     if (argsNumber != NUM_2) {
877         return panda::JSValueRef::Undefined(vm);
878     }
879     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
880     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
881     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
882     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
883     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
884     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
885         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
886         return panda::JSValueRef::Undefined(vm);
887     }
888     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
889     std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
890         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
891             const std::vector<std::string>& value, const std::vector<double>& index) {
892             panda::LocalScope pandaScope(vm);
893             panda::TryCatch trycatch(vm);
894             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
895             if (value.size() == NUM_1 && index.size() == NUM_1) {
896                 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
897                 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
898                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
899                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
900             } else {
901                 int32_t i = NUM_0;
902                 int32_t j = NUM_0;
903                 auto valueArray = panda::ArrayRef::New(vm);
904                 auto indexArray = panda::ArrayRef::New(vm);
905                 for (const double& it : index) {
906                     panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
907                     panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
908                 }
909                 for (const std::string& str : value) {
910                     panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
911                     panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
912                 }
913                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
914                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
915             }
916         };
917     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnChange(
918         nativeNode, reinterpret_cast<void*>(&callback));
919     return panda::JSValueRef::Undefined(vm);
920 }
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)921 ArkUINativeModuleValue TextPickerBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
922 {
923     EcmaVM* vm = runtimeCallInfo->GetVM();
924     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
925     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
926     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
927     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnChange(nativeNode);
928     return panda::JSValueRef::Undefined(vm);
929 }
SetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)930 ArkUINativeModuleValue TextPickerBridge::SetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
931 {
932     EcmaVM* vm = runtimeCallInfo->GetVM();
933     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
934     uint32_t argsNumber = runtimeCallInfo->GetArgsNumber();
935     if (argsNumber != NUM_2) {
936         return panda::JSValueRef::Undefined(vm);
937     }
938     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
939     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
940     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
941     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
942     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
943     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
944         GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
945         return panda::JSValueRef::Undefined(vm);
946     }
947     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
948     std::function<void(const std::vector<std::string>&, const std::vector<double>&)> callback =
949         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
950             const std::vector<std::string>& value, const std::vector<double>& index) {
951             panda::LocalScope pandaScope(vm);
952             panda::TryCatch trycatch(vm);
953             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
954             if (value.size() == NUM_1 && index.size() == NUM_1) {
955                 panda::Local<panda::NumberRef> paramIndex = panda::NumberRef::New(vm, index[NUM_0]);
956                 panda::Local<panda::StringRef> paramVaule = StringToStringValueWithVM(vm, value[NUM_0].c_str());
957                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { paramVaule, paramIndex };
958                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
959             } else {
960                 int32_t i = NUM_0;
961                 int32_t j = NUM_0;
962                 auto valueArray = panda::ArrayRef::New(vm);
963                 auto indexArray = panda::ArrayRef::New(vm);
964                 for (const double& it : index) {
965                     panda::Local<panda::NumberRef> item = panda::NumberRef::New(vm, it);
966                     panda::ArrayRef::SetValueAt(vm, indexArray, i++, item);
967                 }
968                 for (const std::string& str : value) {
969                     panda::Local<panda::StringRef> item = StringToStringValueWithVM(vm, str.c_str());
970                     panda::ArrayRef::SetValueAt(vm, valueArray, j++, item);
971                 }
972                 panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { valueArray, indexArray };
973                 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
974             }
975         };
976     GetArkUINodeModifiers()->getTextPickerModifier()->setTextPickerOnScrollStop(
977         nativeNode, reinterpret_cast<void*>(&callback));
978     return panda::JSValueRef::Undefined(vm);
979 }
ResetOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)980 ArkUINativeModuleValue TextPickerBridge::ResetOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
981 {
982     EcmaVM* vm = runtimeCallInfo->GetVM();
983     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
984     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
985     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
986     GetArkUINodeModifiers()->getTextPickerModifier()->resetTextPickerOnScrollStop(nativeNode);
987     return panda::JSValueRef::Undefined(vm);
988 }
989 } // namespace OHOS::Ace::NG
990