1 /*
2  * Copyright (c) 2023-2024 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_text_input_bridge.h"
16 
17 #include "base/utils/utils.h"
18 #include "core/components/common/layout/constants.h"
19 #include "core/components/text_field/textfield_theme.h"
20 #include "core/components_ng/pattern/text_field/text_field_model.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include <string>
23 #include "jsnapi_expo.h"
24 #include "bridge/declarative_frontend/jsview/js_text_editable_controller.h"
25 #include "frameworks/bridge/declarative_frontend/jsview/js_textfield.h"
26 namespace OHOS::Ace::NG {
27 constexpr int16_t DEFAULT_ALPHA = 255;
28 constexpr double DEFAULT_OPACITY = 0.2;
29 constexpr double DEFAULT_FONT_SIZE = 16.0;
30 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
31 const std::string DEFAULT_FONT_WEIGHT = "400";
32 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
33 constexpr int CALL_ARG_0 = 0;
34 constexpr int CALL_ARG_1 = 1;
35 constexpr int CALL_ARG_2 = 2;
36 constexpr int CALL_ARG_3 = 3;
37 constexpr int CALL_ARG_4 = 4;
38 constexpr int PARAM_ARR_LENGTH_1 = 1;
39 constexpr int PARAM_ARR_LENGTH_2 = 2;
40 constexpr int32_t ARG_GROUP_LENGTH = 4;
41 constexpr int32_t DEFAULT_MODE = -1;
42 constexpr uint32_t ILLEGAL_VALUE = 0;
43 const int32_t MINI_VALID_VALUE = 1;
44 const int32_t MAX_VALID_VALUE = 100;
45 constexpr uint32_t DEFAULT_OVERFLOW = 4;
46 const std::vector<TextHeightAdaptivePolicy> HEIGHT_ADAPTIVE_POLICY = { TextHeightAdaptivePolicy::MAX_LINES_FIRST,
47     TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST, TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST };
48 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
49     TextOverflow::MARQUEE, TextOverflow::DEFAULT };
50 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)51 ArkUINativeModuleValue TextInputBridge::SetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
52 {
53     EcmaVM *vm = runtimeCallInfo->GetVM();
54     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
55     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
56     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
57     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
58     Color color;
59     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
60         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretColor(nativeNode);
61     } else {
62         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretColor(nativeNode, color.GetValue());
63     }
64     return panda::JSValueRef::Undefined(vm);
65 }
66 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)67 ArkUINativeModuleValue TextInputBridge::ResetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
68 {
69     EcmaVM *vm = runtimeCallInfo->GetVM();
70     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
71     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
72     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
73     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretColor(nativeNode);
74     return panda::JSValueRef::Undefined(vm);
75 }
76 
SetType(ArkUIRuntimeCallInfo * runtimeCallInfo)77 ArkUINativeModuleValue TextInputBridge::SetType(ArkUIRuntimeCallInfo *runtimeCallInfo)
78 {
79     EcmaVM *vm = runtimeCallInfo->GetVM();
80     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
81     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
82     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
83     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
84     if (secondArg->IsNumber()) {
85         int32_t value = secondArg->Int32Value(vm);
86         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputType(nativeNode, value);
87     } else {
88         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputType(nativeNode);
89     }
90 
91     return panda::JSValueRef::Undefined(vm);
92 }
93 
ResetType(ArkUIRuntimeCallInfo * runtimeCallInfo)94 ArkUINativeModuleValue TextInputBridge::ResetType(ArkUIRuntimeCallInfo *runtimeCallInfo)
95 {
96     EcmaVM *vm = runtimeCallInfo->GetVM();
97     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
98     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
99     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
100     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputType(nativeNode);
101     return panda::JSValueRef::Undefined(vm);
102 }
103 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)104 ArkUINativeModuleValue TextInputBridge::SetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
105 {
106     EcmaVM *vm = runtimeCallInfo->GetVM();
107     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
108     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
109     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
110     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
111     if (secondArg->IsNumber()) {
112         uint32_t value = secondArg->Uint32Value(vm);
113         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMaxLines(nativeNode, value);
114     } else {
115         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLines(nativeNode);
116     }
117     return panda::JSValueRef::Undefined(vm);
118 }
119 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)120 ArkUINativeModuleValue TextInputBridge::ResetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
121 {
122     EcmaVM *vm = runtimeCallInfo->GetVM();
123     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
124     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
125     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
126     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLines(nativeNode);
127     return panda::JSValueRef::Undefined(vm);
128 }
129 
SetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)130 ArkUINativeModuleValue TextInputBridge::SetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
131 {
132     EcmaVM *vm = runtimeCallInfo->GetVM();
133     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
134     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
135     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
136     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
137     Color color;
138     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
139         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderColor(nativeNode);
140     } else {
141         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderColor(nativeNode, color.GetValue());
142     }
143     return panda::JSValueRef::Undefined(vm);
144 }
145 
ResetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)146 ArkUINativeModuleValue TextInputBridge::ResetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
147 {
148     EcmaVM *vm = runtimeCallInfo->GetVM();
149     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
150     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
151     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
152     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderColor(nativeNode);
153     return panda::JSValueRef::Undefined(vm);
154 }
155 
SetCaretPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)156 ArkUINativeModuleValue TextInputBridge::SetCaretPosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
157 {
158     EcmaVM *vm = runtimeCallInfo->GetVM();
159     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
160     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
161     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
162     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
163     if (secondArg->IsInt() && secondArg->Int32Value(vm) >= 0) {
164         int32_t caretPosition = secondArg->Int32Value(vm);
165         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretPosition(nativeNode, caretPosition);
166     } else {
167         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretPosition(nativeNode);
168     }
169     return panda::JSValueRef::Undefined(vm);
170 }
171 
ResetCaretPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)172 ArkUINativeModuleValue TextInputBridge::ResetCaretPosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
173 {
174     EcmaVM *vm = runtimeCallInfo->GetVM();
175     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
176     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
177     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
178     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretPosition(nativeNode);
179     return panda::JSValueRef::Undefined(vm);
180 }
181 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)182 ArkUINativeModuleValue TextInputBridge::SetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
183 {
184     EcmaVM *vm = runtimeCallInfo->GetVM();
185     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
186     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
187     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
188     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
189     if (secondArg->IsNumber()) {
190         int32_t option = secondArg->Int32Value(vm);
191         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCopyOption(nativeNode, option);
192     } else {
193         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCopyOption(nativeNode);
194     }
195 
196     return panda::JSValueRef::Undefined(vm);
197 }
198 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)199 ArkUINativeModuleValue TextInputBridge::ResetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
200 {
201     EcmaVM *vm = runtimeCallInfo->GetVM();
202     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
203     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
204     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
205     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCopyOption(nativeNode);
206     return panda::JSValueRef::Undefined(vm);
207 }
208 
SetShowPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)209 ArkUINativeModuleValue TextInputBridge::SetShowPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
210 {
211     EcmaVM *vm = runtimeCallInfo->GetVM();
212     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
213     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
214     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
215     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
216 
217     if (secondArg->IsBoolean()) {
218         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
219         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowPasswordIcon(nativeNode, value);
220     } else {
221         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
222     }
223     return panda::JSValueRef::Undefined(vm);
224 }
225 
ResetShowPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue TextInputBridge::ResetShowPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
227 {
228     EcmaVM *vm = runtimeCallInfo->GetVM();
229     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
230     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
231     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
232     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
233     return panda::JSValueRef::Undefined(vm);
234 }
235 
SetShowPassword(ArkUIRuntimeCallInfo * runtimeCallInfo)236 ArkUINativeModuleValue TextInputBridge::SetShowPassword(ArkUIRuntimeCallInfo *runtimeCallInfo)
237 {
238     EcmaVM *vm = runtimeCallInfo->GetVM();
239     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
240     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
241     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
242     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
243 
244     if (secondArg->IsBoolean()) {
245         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
246         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowPassword(nativeNode, value);
247     } else {
248         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPassword(nativeNode);
249     }
250     return panda::JSValueRef::Undefined(vm);
251 }
252 
ResetShowPassword(ArkUIRuntimeCallInfo * runtimeCallInfo)253 ArkUINativeModuleValue TextInputBridge::ResetShowPassword(ArkUIRuntimeCallInfo *runtimeCallInfo)
254 {
255     EcmaVM *vm = runtimeCallInfo->GetVM();
256     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
257     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
258     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
259     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPassword(nativeNode);
260     return panda::JSValueRef::Undefined(vm);
261 }
262 
SetPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)263 ArkUINativeModuleValue TextInputBridge::SetPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
264 {
265     EcmaVM *vm = runtimeCallInfo->GetVM();
266     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
267     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
268     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
269     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
270     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
271 
272     PasswordIcon passwordIcon;
273     struct ArkUIPasswordIconType value = {"", "", "", "", "", ""};
274     if (!ArkTSUtils::GetJsPasswordIcon(vm, secondArg, thirdArg, passwordIcon)) {
275         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordIcon(nativeNode);
276     } else {
277         value.showResult = passwordIcon.showResult.c_str();
278         value.hideResult = passwordIcon.hideResult.c_str();
279         value.showBundleName = passwordIcon.showBundleName.c_str();
280         value.showModuleName = passwordIcon.showModuleName.c_str();
281         value.hideBundleName = passwordIcon.hideBundleName.c_str();
282         value.hideModuleName = passwordIcon.hideModuleName.c_str();
283         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPasswordIcon(nativeNode, &value);
284     }
285     return panda::JSValueRef::Undefined(vm);
286 }
287 
ResetPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)288 ArkUINativeModuleValue TextInputBridge::ResetPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
289 {
290     EcmaVM *vm = runtimeCallInfo->GetVM();
291     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
292     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
293     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
294     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordIcon(nativeNode);
295     return panda::JSValueRef::Undefined(vm);
296 }
297 
SetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)298 ArkUINativeModuleValue TextInputBridge::SetTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
299 {
300     EcmaVM *vm = runtimeCallInfo->GetVM();
301     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
302     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
303     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
304     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
305 
306     if (secondArg->IsNumber()) {
307         int32_t value = secondArg->Int32Value(vm);
308         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextAlign(nativeNode, value);
309     } else {
310         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextAlign(nativeNode);
311     }
312     return panda::JSValueRef::Undefined(vm);
313 }
314 
ResetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue TextInputBridge::ResetTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
316 {
317     EcmaVM *vm = runtimeCallInfo->GetVM();
318     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
320     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
321     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextAlign(nativeNode);
322     return panda::JSValueRef::Undefined(vm);
323 }
324 
SetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)325 ArkUINativeModuleValue TextInputBridge::SetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
326 {
327     EcmaVM *vm = runtimeCallInfo->GetVM();
328     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
329     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
330     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
331     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
332     if (secondArg->IsString(vm) && secondArg->ToString(vm)->ToString(vm) == "Inline") {
333         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputStyle(nativeNode,
334             static_cast<int32_t>(InputStyle::INLINE));
335     } else {
336         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStyle(nativeNode);
337     }
338     return panda::JSValueRef::Undefined(vm);
339 }
340 
ResetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)341 ArkUINativeModuleValue TextInputBridge::ResetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
342 {
343     EcmaVM *vm = runtimeCallInfo->GetVM();
344     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
345     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
346     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
347     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStyle(nativeNode);
348     return panda::JSValueRef::Undefined(vm);
349 }
350 
SetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)351 ArkUINativeModuleValue TextInputBridge::SetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
352 {
353     EcmaVM *vm = runtimeCallInfo->GetVM();
354     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
356     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
357     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
358 
359     if (secondArg->IsBoolean()) {
360         uint32_t menuHiddenValue = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
361         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectionMenuHidden(nativeNode, menuHiddenValue);
362     } else {
363         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuHidden(nativeNode);
364     }
365 
366     return panda::JSValueRef::Undefined(vm);
367 }
368 
ResetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)369 ArkUINativeModuleValue TextInputBridge::ResetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
370 {
371     EcmaVM *vm = runtimeCallInfo->GetVM();
372     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
373     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
374     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
375     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuHidden(nativeNode);
376     return panda::JSValueRef::Undefined(vm);
377 }
378 
SetTextInputShowUnderline(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue TextInputBridge::SetTextInputShowUnderline(ArkUIRuntimeCallInfo *runtimeCallInfo)
380 {
381     EcmaVM *vm = runtimeCallInfo->GetVM();
382     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
383     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
384     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
385     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
386 
387     if (secondArg->IsBoolean()) {
388         uint32_t showUnderLine = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
389         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowUnderline(nativeNode, showUnderLine);
390     } else {
391         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowUnderline(nativeNode);
392     }
393 
394     return panda::JSValueRef::Undefined(vm);
395 }
396 
ResetTextInputShowUnderline(ArkUIRuntimeCallInfo * runtimeCallInfo)397 ArkUINativeModuleValue TextInputBridge::ResetTextInputShowUnderline(ArkUIRuntimeCallInfo *runtimeCallInfo)
398 {
399     EcmaVM *vm = runtimeCallInfo->GetVM();
400     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
401     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
402     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
403     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowUnderline(nativeNode);
404     return panda::JSValueRef::Undefined(vm);
405 }
406 
SetPasswordRules(ArkUIRuntimeCallInfo * runtimeCallInfo)407 ArkUINativeModuleValue TextInputBridge::SetPasswordRules(ArkUIRuntimeCallInfo* runtimeCallInfo)
408 {
409     EcmaVM* vm = runtimeCallInfo->GetVM();
410     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
411     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
412     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
413     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
414     if (secondArg->IsString(vm)) {
415         auto value = secondArg->ToString(vm)->ToString(vm);
416         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPasswordRules(nativeNode, value.c_str());
417     } else {
418         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordRules(nativeNode);
419     }
420     return panda::JSValueRef::Undefined(vm);
421 }
422 
ResetPasswordRules(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue TextInputBridge::ResetPasswordRules(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425     EcmaVM* vm = runtimeCallInfo->GetVM();
426     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
427     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
428     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
429     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordRules(nativeNode);
430     return panda::JSValueRef::Undefined(vm);
431 }
432 
SetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)433 ArkUINativeModuleValue TextInputBridge::SetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
434 {
435     EcmaVM *vm = runtimeCallInfo->GetVM();
436     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
437     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
438     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
439     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
440 
441     if (secondArg->IsBoolean()) {
442         uint32_t enableAutoFill = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
443         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableAutoFill(nativeNode, enableAutoFill);
444     } else {
445         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFill(nativeNode);
446     }
447 
448     return panda::JSValueRef::Undefined(vm);
449 }
450 
ResetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)451 ArkUINativeModuleValue TextInputBridge::ResetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
452 {
453     EcmaVM *vm = runtimeCallInfo->GetVM();
454     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
455     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
456     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
457     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFill(nativeNode);
458     return panda::JSValueRef::Undefined(vm);
459 }
460 
SetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)461 ArkUINativeModuleValue TextInputBridge::SetCaretStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
462 {
463     EcmaVM *vm = runtimeCallInfo->GetVM();
464     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
465     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
466     Local<JSValueRef> caretWidthArg = runtimeCallInfo->GetCallArgRef(1);
467     Local<JSValueRef> caretColorArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
468     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
469     auto textFieldTheme = ArkTSUtils::GetTheme<TextFieldTheme>();
470     CHECK_NULL_RETURN(textFieldTheme, panda::JSValueRef::Undefined(vm));
471     CalcDimension caretWidth = textFieldTheme->GetCursorWidth();
472     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, caretWidthArg, caretWidth, false) ||
473             LessNotEqual(caretWidth.Value(), 0.0)) {
474         caretWidth = textFieldTheme->GetCursorWidth();
475     }
476     Color color;
477     uint32_t caretColor;
478     if (!caretColorArg->IsUndefined()) {
479         if (ArkTSUtils::ParseJsColorAlpha(vm, caretColorArg, color)) {
480             caretColor = color.GetValue();
481         } else {
482             caretColor = textFieldTheme->GetCursorColor().GetValue();
483         }
484     } else {
485         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaret(
486             nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()));
487         return panda::JSValueRef::Undefined(vm);
488     }
489     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretStyle(
490         nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()), caretColor);
491     return panda::JSValueRef::Undefined(vm);
492 }
493 
ResetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)494 ArkUINativeModuleValue TextInputBridge::ResetCaretStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
495 {
496     EcmaVM *vm = runtimeCallInfo->GetVM();
497     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
498     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
499     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
500     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretStyle(nativeNode);
501     return panda::JSValueRef::Undefined(vm);
502 }
503 
SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)504 ArkUINativeModuleValue TextInputBridge::SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
505 {
506     EcmaVM *vm = runtimeCallInfo->GetVM();
507     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
508     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
509     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
510     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
511 
512     if (secondArg->IsBoolean()) {
513         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
514         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableKeyboardOnFocus(nativeNode, value);
515     } else {
516         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
517     }
518 
519     return panda::JSValueRef::Undefined(vm);
520 }
521 
ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue TextInputBridge::ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
523 {
524     EcmaVM *vm = runtimeCallInfo->GetVM();
525     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
526     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
527     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
528     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableKeyboardOnFocus(nativeNode);
529     return panda::JSValueRef::Undefined(vm);
530 }
531 
SetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)532 ArkUINativeModuleValue TextInputBridge::SetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
533 {
534     EcmaVM *vm = runtimeCallInfo->GetVM();
535     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
536     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
537     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
538     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
539 
540     if (secondArg->IsNumber()) {
541         int32_t value = secondArg->Int32Value(vm);
542         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputBarState(nativeNode, value);
543     } else {
544         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBarState(nativeNode);
545     }
546 
547     return panda::JSValueRef::Undefined(vm);
548 }
549 
ResetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)550 ArkUINativeModuleValue TextInputBridge::ResetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
551 {
552     EcmaVM *vm = runtimeCallInfo->GetVM();
553     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
554     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
555     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
556     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBarState(nativeNode);
557     return panda::JSValueRef::Undefined(vm);
558 }
559 
SetTextInputEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)560 ArkUINativeModuleValue TextInputBridge::SetTextInputEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
561 {
562     EcmaVM *vm = runtimeCallInfo->GetVM();
563     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
564     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
565     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
566     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
567 
568     if (secondArg->IsNumber()) {
569         int32_t value = secondArg->Int32Value(vm);
570         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnterKeyType(nativeNode, value);
571     } else {
572         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnterKeyType(nativeNode);
573     }
574     return panda::JSValueRef::Undefined(vm);
575 }
576 
ResetTextInputEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)577 ArkUINativeModuleValue TextInputBridge::ResetTextInputEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
578 {
579     EcmaVM *vm = runtimeCallInfo->GetVM();
580     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
581     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
582     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
583     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnterKeyType(nativeNode);
584     return panda::JSValueRef::Undefined(vm);
585 }
586 
SetTextInputFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)587 ArkUINativeModuleValue TextInputBridge::SetTextInputFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
588 {
589     EcmaVM *vm = runtimeCallInfo->GetVM();
590     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
591     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
592     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
593     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
594     std::string weight;
595     if (secondArg->IsString(vm)) {
596         weight = secondArg->ToString(vm)->ToString(vm);
597         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontWeightStr(nativeNode, weight.c_str());
598     } else if (secondArg->IsNumber()) {
599         weight = std::to_string(secondArg->Int32Value(vm));
600         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontWeightStr(nativeNode, weight.c_str());
601     } else {
602         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontWeight(nativeNode);
603     }
604 
605     return panda::JSValueRef::Undefined(vm);
606 }
607 
ResetTextInputFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)608 ArkUINativeModuleValue TextInputBridge::ResetTextInputFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
609 {
610     EcmaVM *vm = runtimeCallInfo->GetVM();
611     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
612     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
613     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
614     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontWeight(nativeNode);
615     return panda::JSValueRef::Undefined(vm);
616 }
617 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)618 ArkUINativeModuleValue TextInputBridge::SetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
619 {
620     EcmaVM *vm = runtimeCallInfo->GetVM();
621     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
622     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
623     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
624     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
625 
626     CalcDimension fontSize;
627     ArkUILengthType value{ nullptr, 0.0, static_cast<int8_t>(DimensionUnit::FP) };
628     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, fontSize, DimensionUnit::FP, false)) {
629         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontSize(nativeNode);
630     } else {
631         value.unit = static_cast<int8_t>(fontSize.Unit());
632         if (fontSize.CalcValue() != "") {
633             value.string = fontSize.CalcValue().c_str();
634         } else {
635             value.number = fontSize.Value();
636         }
637         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontSize(nativeNode, &value);
638     }
639     return panda::JSValueRef::Undefined(vm);
640 }
641 
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)642 ArkUINativeModuleValue TextInputBridge::ResetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
643 {
644     EcmaVM *vm = runtimeCallInfo->GetVM();
645     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
646     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
647     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
648     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontSize(nativeNode);
649     return panda::JSValueRef::Undefined(vm);
650 }
651 
SetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue TextInputBridge::SetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
653 {
654     EcmaVM *vm = runtimeCallInfo->GetVM();
655     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
656     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
657     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
658     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
659     if (!secondArg->IsNumber()) {
660         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
661     } else {
662         uint32_t maxLength = secondArg->Uint32Value(vm);
663         if (std::isinf(static_cast<float>(secondArg->ToNumber(vm)->Value()))) {
664             maxLength = INT32_MAX; // Infinity
665         }
666         if (GreatOrEqual(maxLength, 0)) {
667             GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMaxLength(nativeNode, maxLength);
668         } else {
669             GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
670         }
671     }
672     return panda::JSValueRef::Undefined(vm);
673 }
674 
ResetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)675 ArkUINativeModuleValue TextInputBridge::ResetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
676 {
677     EcmaVM *vm = runtimeCallInfo->GetVM();
678     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
679     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
680     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
681     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
682     return panda::JSValueRef::Undefined(vm);
683 }
684 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)685 ArkUINativeModuleValue TextInputBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
686 {
687     EcmaVM *vm = runtimeCallInfo->GetVM();
688     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
689     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
690     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
691     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
692     Color color;
693     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
694         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectedBackgroundColor(nativeNode);
695     } else {
696         if (color.GetAlpha() == DEFAULT_ALPHA) {
697             color = color.ChangeOpacity(DEFAULT_OPACITY);
698         }
699         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectedBackgroundColor(
700             nativeNode, color.GetValue());
701     }
702     return panda::JSValueRef::Undefined(vm);
703 }
704 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)705 ArkUINativeModuleValue TextInputBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
706 {
707     EcmaVM *vm = runtimeCallInfo->GetVM();
708     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
709     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
710     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
711     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectedBackgroundColor(nativeNode);
712     return panda::JSValueRef::Undefined(vm);
713 }
714 
SetShowError(ArkUIRuntimeCallInfo * runtimeCallInfo)715 ArkUINativeModuleValue TextInputBridge::SetShowError(ArkUIRuntimeCallInfo *runtimeCallInfo)
716 {
717     EcmaVM *vm = runtimeCallInfo->GetVM();
718     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
719     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
720     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
721     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
722     bool visible = false;
723     std::string error;
724     if (ArkTSUtils::ParseJsString(vm, secondArg, error)) {
725         visible = true;
726     }
727 
728     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowError(nativeNode, error.c_str(),
729         static_cast<uint32_t>(visible));
730 
731     return panda::JSValueRef::Undefined(vm);
732 }
733 
ResetShowError(ArkUIRuntimeCallInfo * runtimeCallInfo)734 ArkUINativeModuleValue TextInputBridge::ResetShowError(ArkUIRuntimeCallInfo *runtimeCallInfo)
735 {
736     EcmaVM *vm = runtimeCallInfo->GetVM();
737     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
738     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
739     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
740     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowError(nativeNode);
741     return panda::JSValueRef::Undefined(vm);
742 }
743 
SetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)744 ArkUINativeModuleValue TextInputBridge::SetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
745 {
746     EcmaVM *vm = runtimeCallInfo->GetVM();
747     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
748     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
749     Local<JSValueRef> jsSize = runtimeCallInfo->GetCallArgRef(1);
750     Local<JSValueRef> jsWeight = runtimeCallInfo->GetCallArgRef(2);
751     Local<JSValueRef> jsFamily = runtimeCallInfo->GetCallArgRef(3);
752     Local<JSValueRef> jsStyle = runtimeCallInfo->GetCallArgRef(4);
753     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
754     ArkUILengthType length{ nullptr, DEFAULT_FONT_SIZE, static_cast<int8_t>(DimensionUnit::FP) };
755     CalcDimension size(DEFAULT_FONT_SIZE, DimensionUnit::FP);
756     if (!ArkTSUtils::ParseJsDimensionFp(vm, jsSize, size) || size.Unit() == DimensionUnit::PERCENT) {
757         auto theme = ArkTSUtils::GetTheme<TextFieldTheme>();
758         if (theme != nullptr) {
759             size = theme->GetFontSize();
760         }
761     }
762     length.unit = static_cast<int8_t>(size.Unit());
763     if (size.CalcValue() != "") {
764         length.string = size.CalcValue().c_str();
765     } else {
766         length.number = size.Value();
767     }
768 
769     std::string weight = DEFAULT_FONT_WEIGHT;
770     if (!jsWeight->IsNull()) {
771         if (jsWeight->IsString(vm)) {
772             weight = jsWeight->ToString(vm)->ToString(vm);
773         }
774         if (jsWeight->IsNumber()) {
775             weight = std::to_string(jsWeight->Int32Value(vm));
776         }
777     }
778 
779     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
780     if (jsStyle->IsNumber()) {
781         style = jsStyle->ToNumber(vm)->Value();
782     }
783 
784     struct ArkUIPlaceholderFontType placeholderFont;
785     placeholderFont.size = &length;
786     placeholderFont.weight = weight.c_str();
787     placeholderFont.style = style;
788     std::vector<std::string> fontFamilies;
789     bool isSuccess = !ArkTSUtils::ParseJsFontFamilies(vm, jsFamily, fontFamilies);
790     auto families = std::make_unique<char* []>(fontFamilies.size());
791     if (isSuccess) {
792         placeholderFont.fontFamilies = nullptr;
793         placeholderFont.length = 0;
794     } else {
795         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
796             families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
797         }
798         placeholderFont.fontFamilies = const_cast<const char**>(families.get());
799         placeholderFont.length = fontFamilies.size();
800     }
801 
802     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderFont(
803         nativeNode, &placeholderFont);
804     return panda::JSValueRef::Undefined(vm);
805 }
806 
ResetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)807 ArkUINativeModuleValue TextInputBridge::ResetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
808 {
809     EcmaVM *vm = runtimeCallInfo->GetVM();
810     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
811     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
812     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
813     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderFont(nativeNode);
814     return panda::JSValueRef::Undefined(vm);
815 }
816 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)817 ArkUINativeModuleValue TextInputBridge::SetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
818 {
819     EcmaVM *vm = runtimeCallInfo->GetVM();
820     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
821     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
822     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
823     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
824     Color color;
825     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
826         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontColor(nativeNode);
827     } else {
828         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontColor(nativeNode, color.GetValue());
829     }
830     return panda::JSValueRef::Undefined(vm);
831 }
832 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)833 ArkUINativeModuleValue TextInputBridge::ResetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
834 {
835     EcmaVM *vm = runtimeCallInfo->GetVM();
836     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
837     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
838     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
839     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontColor(nativeNode);
840     return panda::JSValueRef::Undefined(vm);
841 }
842 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)843 ArkUINativeModuleValue TextInputBridge::SetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
844 {
845     EcmaVM *vm = runtimeCallInfo->GetVM();
846     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
847     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
848     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
849     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
850     if (secondArg->IsNumber()) {
851         uint32_t fontStyle = secondArg->Uint32Value(vm);
852         if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
853             fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
854             fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
855         }
856         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontStyle(nativeNode, fontStyle);
857     } else {
858         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontStyle(nativeNode);
859     }
860     return panda::JSValueRef::Undefined(vm);
861 }
862 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)863 ArkUINativeModuleValue TextInputBridge::ResetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
864 {
865     EcmaVM *vm = runtimeCallInfo->GetVM();
866     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
867     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
868     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
869     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontStyle(nativeNode);
870     return panda::JSValueRef::Undefined(vm);
871 }
872 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)873 ArkUINativeModuleValue TextInputBridge::SetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
874 {
875     EcmaVM *vm = runtimeCallInfo->GetVM();
876     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
877     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
878     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
879     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
880 
881     std::vector<std::string> fontFamilies;
882     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies)) {
883         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFamily(nativeNode);
884     } else {
885         auto families = std::make_unique<char* []>(fontFamilies.size());
886         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
887             families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
888         }
889         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontFamily(nativeNode,
890             const_cast<const char**>(families.get()), fontFamilies.size());
891     }
892     return panda::JSValueRef::Undefined(vm);
893 }
894 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)895 ArkUINativeModuleValue TextInputBridge::ResetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
896 {
897     EcmaVM *vm = runtimeCallInfo->GetVM();
898     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
899     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
900     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
901     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFamily(nativeNode);
902     return panda::JSValueRef::Undefined(vm);
903 }
904 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)905 ArkUINativeModuleValue TextInputBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
906 {
907     EcmaVM* vm = runtimeCallInfo->GetVM();
908     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
909     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
910     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
911     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
912     if (secondArg->IsString(vm)) {
913         auto value = secondArg->ToString(vm)->ToString(vm);
914         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontFeature(nativeNode, value.c_str());
915     } else {
916         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFeature(nativeNode);
917     }
918     return panda::JSValueRef::Undefined(vm);
919 }
920 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)921 ArkUINativeModuleValue TextInputBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
922 {
923     EcmaVM* vm = runtimeCallInfo->GetVM();
924     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
925     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
926     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
927     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFeature(nativeNode);
928     return panda::JSValueRef::Undefined(vm);
929 }
930 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)931 ArkUINativeModuleValue TextInputBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
932 {
933     EcmaVM* vm = runtimeCallInfo->GetVM();
934     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
935     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
936     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1); // 1: textInputDecoration value
937     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);  // 2: color value
938     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
939     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
940     auto container = Container::Current();
941     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
942     auto pipelineContext = container->GetPipelineContext();
943     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
944     auto themeManager = pipelineContext->GetThemeManager();
945     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
946     auto theme = themeManager->GetTheme<TextFieldTheme>();
947     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
948     Color color = theme->GetTextStyle().GetTextDecorationColor();
949     int32_t textInputDecoration = static_cast<int32_t>(theme->GetTextStyle().GetTextDecoration());
950     if (secondArg->IsInt()) {
951         textInputDecoration = secondArg->Int32Value(vm);
952     }
953     ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, Color::BLACK);
954     int32_t textDecorationStyle = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
955     if (fourthArg->IsInt()) {
956         textDecorationStyle = fourthArg->Int32Value(vm);
957     }
958     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputDecoration(
959         nativeNode, textInputDecoration, color.GetValue(), textDecorationStyle);
960     return panda::JSValueRef::Undefined(vm);
961 }
962 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)963 ArkUINativeModuleValue TextInputBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
964 {
965     EcmaVM* vm = runtimeCallInfo->GetVM();
966     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
967     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
968     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
969     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputDecoration(nativeNode);
970     return panda::JSValueRef::Undefined(vm);
971 }
972 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)973 ArkUINativeModuleValue TextInputBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
974 {
975     EcmaVM* vm = runtimeCallInfo->GetVM();
976     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
977     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
978     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
979     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
980     CalcDimension value;
981     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
982         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLetterSpacing(nativeNode);
983     } else {
984         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLetterSpacing(
985             nativeNode, value.Value(), static_cast<int>(value.Unit()));
986     }
987     return panda::JSValueRef::Undefined(vm);
988 }
989 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)990 ArkUINativeModuleValue TextInputBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
991 {
992     EcmaVM* vm = runtimeCallInfo->GetVM();
993     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
994     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
995     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
996     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLetterSpacing(nativeNode);
997     return panda::JSValueRef::Undefined(vm);
998 }
999 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)1000 ArkUINativeModuleValue TextInputBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
1001 {
1002     EcmaVM* vm = runtimeCallInfo->GetVM();
1003     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1004     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1005     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1006     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1007     CalcDimension value;
1008     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, true)) {
1009         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineHeight(nativeNode);
1010     } else {
1011         if (value.IsNegative()) {
1012             value.Reset();
1013         }
1014         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLineHeight(
1015             nativeNode, value.Value(), static_cast<int>(value.Unit()));
1016     }
1017     return panda::JSValueRef::Undefined(vm);
1018 }
1019 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)1020 ArkUINativeModuleValue TextInputBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
1021 {
1022     EcmaVM* vm = runtimeCallInfo->GetVM();
1023     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1024     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1025     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1026     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineHeight(nativeNode);
1027     return panda::JSValueRef::Undefined(vm);
1028 }
1029 
SetUnderlineColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1030 ArkUINativeModuleValue TextInputBridge::SetUnderlineColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1031 {
1032     EcmaVM *vm = runtimeCallInfo->GetVM();
1033     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1034     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1035     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1036     Local<JSValueRef> underlineColorArg = runtimeCallInfo->GetCallArgRef(1);  // 1: underlineColor value
1037     Local<JSValueRef> normalArg = runtimeCallInfo->GetCallArgRef(2);  // 2: normal value
1038     Local<JSValueRef> typingArg = runtimeCallInfo->GetCallArgRef(3);   // 3: typing value
1039     Local<JSValueRef> errorArg = runtimeCallInfo->GetCallArgRef(4); // 4: error value
1040     Local<JSValueRef> disableArg = runtimeCallInfo->GetCallArgRef(5); // 5: disable value
1041 
1042     Color underlineColor;
1043     if (!underlineColorArg->IsUndefined() && ArkTSUtils::ParseJsColorAlpha(vm, underlineColorArg, underlineColor)) {
1044         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputNormalUnderlineColor(
1045             nativeNode, underlineColor.GetValue());
1046     } else if (!normalArg->IsUndefined() || !typingArg->IsUndefined() ||
1047          !errorArg->IsUndefined() || !disableArg->IsUndefined()) {
1048         UserUnderlineColor userColor = UserUnderlineColor();
1049         Color typingColor;
1050         if (ArkTSUtils::ParseJsColorAlpha(vm, typingArg, typingColor)) {
1051             userColor.typing = typingColor;
1052         }
1053         Color normalColor;
1054         if (ArkTSUtils::ParseJsColorAlpha(vm, normalArg, normalColor)) {
1055             userColor.normal = normalColor;
1056         }
1057         Color errorColor;
1058         if (ArkTSUtils::ParseJsColorAlpha(vm, errorArg, errorColor)) {
1059             userColor.error = errorColor;
1060         }
1061         Color disableColor;
1062         if (ArkTSUtils::ParseJsColorAlpha(vm, disableArg, disableColor)) {
1063             userColor.disable = disableColor;
1064         }
1065         ArkUI_Uint32 values[ARG_GROUP_LENGTH];
1066         values[CALL_ARG_0] = userColor.typing->GetValue();
1067         values[CALL_ARG_1] = userColor.normal->GetValue();
1068         values[CALL_ARG_2] = userColor.error->GetValue();
1069         values[CALL_ARG_3] = userColor.disable->GetValue();
1070         ArkUI_Bool hasValues[ARG_GROUP_LENGTH];
1071         hasValues[CALL_ARG_0] = userColor.typing.has_value();
1072         hasValues[CALL_ARG_1] = userColor.normal.has_value();
1073         hasValues[CALL_ARG_2] = userColor.error.has_value();
1074         hasValues[CALL_ARG_3] = userColor.disable.has_value();
1075         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputUserUnderlineColor(
1076             nativeNode, values, hasValues, ARG_GROUP_LENGTH);
1077     } else {
1078         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputUserUnderlineColor(nativeNode);
1079     }
1080     return panda::JSValueRef::Undefined(vm);
1081 }
1082 
ResetUnderlineColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1083 ArkUINativeModuleValue TextInputBridge::ResetUnderlineColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1084 {
1085     EcmaVM *vm = runtimeCallInfo->GetVM();
1086     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1087     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1088     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1089     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputUserUnderlineColor(nativeNode);
1090     return panda::JSValueRef::Undefined(vm);
1091 }
1092 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1093 ArkUINativeModuleValue TextInputBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1094 {
1095     EcmaVM* vm = runtimeCallInfo->GetVM();
1096     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1097     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1098     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1099     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1100     CalcDimension value;
1101     auto pipelineContext = PipelineBase::GetCurrentContext();
1102     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
1103     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
1104     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
1105     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
1106         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMinFontSize(nativeNode);
1107     } else {
1108         if (value.IsNegative()) {
1109             value = theme->GetTextStyle().GetAdaptMinFontSize();
1110         }
1111         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputAdaptMinFontSize(
1112             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
1113     }
1114     return panda::JSValueRef::Undefined(vm);
1115 }
1116 
ResetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1117 ArkUINativeModuleValue TextInputBridge::ResetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1118 {
1119     EcmaVM* vm = runtimeCallInfo->GetVM();
1120     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1121     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1122     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1123     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMinFontSize(nativeNode);
1124     return panda::JSValueRef::Undefined(vm);
1125 }
1126 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1127 ArkUINativeModuleValue TextInputBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1128 {
1129     EcmaVM* vm = runtimeCallInfo->GetVM();
1130     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1131     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1132     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1133     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1134     CalcDimension value;
1135     auto pipelineContext = PipelineBase::GetCurrentContext();
1136     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
1137     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
1138     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
1139     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
1140         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMaxFontSize(nativeNode);
1141     } else {
1142         if (value.IsNegative()) {
1143             value = theme->GetTextStyle().GetAdaptMaxFontSize();
1144         }
1145         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputAdaptMaxFontSize(
1146             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
1147     }
1148     return panda::JSValueRef::Undefined(vm);
1149 }
1150 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1151 ArkUINativeModuleValue TextInputBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1152 {
1153     EcmaVM* vm = runtimeCallInfo->GetVM();
1154     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1155     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1156     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(1);
1157     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1158     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
1159         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWordBreak(nativeNode);
1160         return panda::JSValueRef::Undefined(vm);
1161     }
1162     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
1163     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputWordBreak(nativeNode, wordBreak);
1164     return panda::JSValueRef::Undefined(vm);
1165 }
1166 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1167 ArkUINativeModuleValue TextInputBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1168 {
1169     EcmaVM* vm = runtimeCallInfo->GetVM();
1170     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1171     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1172     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1173     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWordBreak(nativeNode);
1174     return panda::JSValueRef::Undefined(vm);
1175 }
1176 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1177 ArkUINativeModuleValue TextInputBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1178 {
1179     EcmaVM* vm = runtimeCallInfo->GetVM();
1180     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1181     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1182     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(1);
1183     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1184     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
1185         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineBreakStrategy(nativeNode);
1186         return panda::JSValueRef::Undefined(vm);
1187     }
1188     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
1189     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLineBreakStrategy(nativeNode, lineBreakStrategy);
1190     return panda::JSValueRef::Undefined(vm);
1191 }
1192 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1193 ArkUINativeModuleValue TextInputBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1194 {
1195     EcmaVM* vm = runtimeCallInfo->GetVM();
1196     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1197     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1198     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1199     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineBreakStrategy(nativeNode);
1200     return panda::JSValueRef::Undefined(vm);
1201 }
1202 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1203 ArkUINativeModuleValue TextInputBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1204 {
1205     EcmaVM* vm = runtimeCallInfo->GetVM();
1206     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1207     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1208     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1209     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMaxFontSize(nativeNode);
1210     return panda::JSValueRef::Undefined(vm);
1211 }
1212 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1213 ArkUINativeModuleValue TextInputBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1214 {
1215     EcmaVM* vm = runtimeCallInfo->GetVM();
1216     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1217     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1218     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1219     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1220     int32_t value = valueArg->ToNumber(vm)->Value();
1221     if (value < 0 || value >= static_cast<int32_t>(HEIGHT_ADAPTIVE_POLICY.size())) {
1222         value = 0;
1223     }
1224     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputHeightAdaptivePolicy(nativeNode, value);
1225     return panda::JSValueRef::Undefined(vm);
1226 }
1227 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1228 ArkUINativeModuleValue TextInputBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1229 {
1230     EcmaVM* vm = runtimeCallInfo->GetVM();
1231     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1232     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1233     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1234     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputHeightAdaptivePolicy(nativeNode);
1235     return panda::JSValueRef::Undefined(vm);
1236 }
1237 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1238 ArkUINativeModuleValue TextInputBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1239 {
1240     EcmaVM* vm = runtimeCallInfo->GetVM();
1241     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1242     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1243     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1244     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1245     int32_t value;
1246     if (secondArg->IsUndefined()) {
1247         value = DEFAULT_OVERFLOW;
1248     } else if (secondArg->IsNumber()) {
1249         value = secondArg->Int32Value(vm);
1250     } else {
1251         value = DEFAULT_OVERFLOW;
1252     }
1253     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
1254         value = DEFAULT_OVERFLOW;
1255     }
1256     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextOverflow(nativeNode, value);
1257     return panda::JSValueRef::Undefined(vm);
1258 }
1259 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1260 ArkUINativeModuleValue TextInputBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1261 {
1262     EcmaVM* vm = runtimeCallInfo->GetVM();
1263     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1264     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1266     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextOverflow(nativeNode);
1267     return panda::JSValueRef::Undefined(vm);
1268 }
1269 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1270 ArkUINativeModuleValue TextInputBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1271 {
1272     EcmaVM* vm = runtimeCallInfo->GetVM();
1273     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1275     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1277     CalcDimension indent;
1278     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, indent, DimensionUnit::VP, true)) {
1279         indent.Reset();
1280     }
1281 
1282     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextIndent(
1283         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()));
1284     return panda::JSValueRef::Undefined(vm);
1285 }
1286 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1287 ArkUINativeModuleValue TextInputBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1288 {
1289     EcmaVM* vm = runtimeCallInfo->GetVM();
1290     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1291     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1292     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1293     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextIndent(nativeNode);
1294     return panda::JSValueRef::Undefined(vm);
1295 }
1296 
ConvertStrToCancelButtonStyle(const std::string & value)1297 static CancelButtonStyle ConvertStrToCancelButtonStyle(const std::string& value)
1298 {
1299     if (value == "CONSTANT") {
1300         return CancelButtonStyle::CONSTANT;
1301     } else if (value == "INVISIBLE") {
1302         return CancelButtonStyle::INVISIBLE;
1303     } else {
1304         return CancelButtonStyle::INPUT;
1305     }
1306 }
1307 
SetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)1308 ArkUINativeModuleValue TextInputBridge::SetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
1309 {
1310     EcmaVM* vm = runtimeCallInfo->GetVM();
1311     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1312     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1313     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1314     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1315     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1316     Local<JSValueRef> srcArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
1317 
1318     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1319     auto container = Container::Current();
1320     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
1321     auto pipelineContext = container->GetPipelineContext();
1322     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1323     auto themeManager = pipelineContext->GetThemeManager();
1324     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
1325     auto theme = themeManager->GetTheme<TextFieldTheme>();
1326     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
1327 
1328     int32_t style = static_cast<int32_t>(theme->GetCancelButtonStyle());
1329     if (styleArg->IsString(vm)) {
1330         CancelButtonStyle cancelButtonStyle = ConvertStrToCancelButtonStyle(styleArg->ToString(vm)->ToString(vm));
1331         style = static_cast<int32_t>(cancelButtonStyle);
1332     }
1333 
1334     CalcDimension iconSize;
1335     if (!sizeArg->IsUndefined() && !sizeArg->IsNull() &&
1336         ArkTSUtils::ParseJsDimensionVpNG(vm, sizeArg, iconSize, false)) {
1337         if (LessNotEqual(iconSize.Value(), 0.0) || iconSize.Unit() == DimensionUnit::PERCENT) {
1338             iconSize = theme->GetIconSize();
1339         }
1340     } else {
1341         iconSize = theme->GetIconSize();
1342     }
1343 
1344     Color value;
1345     uint32_t color;
1346     if (!colorArg->IsUndefined() && !colorArg->IsNull() &&
1347         ArkTSUtils::ParseJsColorAlpha(vm, colorArg, value)) {
1348         color = value.GetValue();
1349     } else {
1350         color = theme->GetCancelButtonIconColor().GetValue();
1351     }
1352 
1353     std::string srcStr;
1354     if (srcArg->IsUndefined() || srcArg->IsNull() ||
1355         !ArkTSUtils::ParseJsMedia(vm, srcArg, srcStr)) {
1356         srcStr = "";
1357     }
1358 
1359     struct ArkUISizeType size = {iconSize.Value(), static_cast<int8_t>(iconSize.Unit())};
1360     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCancelButton(nativeNode,
1361         style, &size, color, srcStr.c_str());
1362     return panda::JSValueRef::Undefined(vm);
1363 }
1364 
ResetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)1365 ArkUINativeModuleValue TextInputBridge::ResetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
1366 {
1367     EcmaVM* vm = runtimeCallInfo->GetVM();
1368     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1369     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1370     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1371     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCancelButton(nativeNode);
1372     return panda::JSValueRef::Undefined(vm);
1373 }
1374 
SetSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)1375 ArkUINativeModuleValue TextInputBridge::SetSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1376 {
1377     EcmaVM* vm = runtimeCallInfo->GetVM();
1378     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1379     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1380     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1381 
1382     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1383     if (secondArg->IsBoolean()) {
1384         uint32_t enableSelectAll = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1385         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectAll(nativeNode, enableSelectAll);
1386     } else {
1387         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectAll(nativeNode);
1388     }
1389     return panda::JSValueRef::Undefined(vm);
1390 }
1391 
ResetSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)1392 ArkUINativeModuleValue TextInputBridge::ResetSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1393 {
1394     EcmaVM* vm = runtimeCallInfo->GetVM();
1395     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1396     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1397     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1398     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectAll(nativeNode);
1399     return panda::JSValueRef::Undefined(vm);
1400 }
1401 
SetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1402 ArkUINativeModuleValue TextInputBridge::SetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1403 {
1404     EcmaVM *vm = runtimeCallInfo->GetVM();
1405     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1406     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1407     Local<JSValueRef> showCounterArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1408     Local<JSValueRef> highlightBorderArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1409     Local<JSValueRef> thresholdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1410     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1411     auto showCounter = false;
1412     if (showCounterArg->IsBoolean()) {
1413         showCounter = showCounterArg->BooleaValue(vm);
1414     }
1415     auto highlightBorder = true;
1416     if (highlightBorderArg->IsBoolean()) {
1417         highlightBorder = highlightBorderArg->BooleaValue(vm);
1418     }
1419     int32_t thresholdValue = DEFAULT_MODE;
1420     if (thresholdArg->IsNumber()) {
1421         thresholdValue = thresholdArg->Int32Value(vm);
1422         if (thresholdValue < MINI_VALID_VALUE || thresholdValue > MAX_VALID_VALUE) {
1423             thresholdValue = ILLEGAL_VALUE;
1424             showCounter = false;
1425         }
1426     }
1427     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowCounter(
1428         nativeNode, static_cast<uint32_t>(showCounter), thresholdValue, static_cast<uint32_t>(highlightBorder));
1429     return panda::JSValueRef::Undefined(vm);
1430 }
1431 
ResetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1432 ArkUINativeModuleValue TextInputBridge::ResetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1433 {
1434     EcmaVM* vm = runtimeCallInfo->GetVM();
1435     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1436     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1437     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1438     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowCounter(nativeNode);
1439     return panda::JSValueRef::Undefined(vm);
1440 }
1441 
SetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1442 ArkUINativeModuleValue TextInputBridge::SetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1443 {
1444     EcmaVM *vm = runtimeCallInfo->GetVM();
1445     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1446     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1447     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1448     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1449     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1450     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1451     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1452         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnEditChange(nativeNode);
1453         return panda::JSValueRef::Undefined(vm);
1454     }
1455     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1456     std::function<void(bool)> callback = [vm, frameNode,
1457         func = panda::CopyableGlobal(vm, func)](bool isInEditStatus) {
1458         panda::LocalScope pandaScope(vm);
1459         panda::TryCatch trycatch(vm);
1460         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1461         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1462             panda::BooleanRef::New(vm, isInEditStatus) };
1463         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1464     };
1465     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnEditChange(
1466         nativeNode, reinterpret_cast<void*>(&callback));
1467     return panda::JSValueRef::Undefined(vm);
1468 }
1469 
ResetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1470 ArkUINativeModuleValue TextInputBridge::ResetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1471 {
1472     EcmaVM* vm = runtimeCallInfo->GetVM();
1473     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1474     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1475     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1476     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnEditChange(nativeNode);
1477     return panda::JSValueRef::Undefined(vm);
1478 }
1479 
SetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1480 ArkUINativeModuleValue TextInputBridge::SetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1481 {
1482     EcmaVM *vm = runtimeCallInfo->GetVM();
1483     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1484     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1485     Local<JSValueRef> inputFilterArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1486     Local<JSValueRef> errorCallbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1487     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1488     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1489     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1490     if (inputFilterArg->IsUndefined() || inputFilterArg->IsNull() || !inputFilterArg->IsString(vm)) {
1491         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFilter(nativeNode);
1492         return panda::JSValueRef::Undefined(vm);
1493     }
1494     std::string inputFilter = inputFilterArg->ToString(vm)->ToString(vm);
1495     if (errorCallbackArg->IsUndefined() || errorCallbackArg->IsNull() ||
1496         !errorCallbackArg->IsFunction(vm)) {
1497         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFilter(nativeNode, inputFilter.c_str(), nullptr);
1498     } else {
1499         panda::Local<panda::FunctionRef> func = errorCallbackArg->ToObject(vm);
1500         std::function<void(const std::string&)> callback = [vm, frameNode,
1501             func = panda::CopyableGlobal(vm, func)](const std::string& info) {
1502             panda::LocalScope pandaScope(vm);
1503             panda::TryCatch trycatch(vm);
1504             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1505             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1506                 panda::StringRef::NewFromUtf8(vm, info.c_str()) };
1507             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1508         };
1509         GetArkUINodeModifiers()->getTextInputModifier()->
1510             setTextInputFilter(nativeNode, inputFilter.c_str(), reinterpret_cast<void*>(&callback));
1511     }
1512     return panda::JSValueRef::Undefined(vm);
1513 }
1514 
ResetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1515 ArkUINativeModuleValue TextInputBridge::ResetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1516 {
1517     EcmaVM* vm = runtimeCallInfo->GetVM();
1518     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1519     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1520     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1521     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFilter(nativeNode);
1522     return panda::JSValueRef::Undefined(vm);
1523 }
1524 
SetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1525 ArkUINativeModuleValue TextInputBridge::SetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1526 {
1527     EcmaVM *vm = runtimeCallInfo->GetVM();
1528     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1529     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1530     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1531     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1532     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1533     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1534     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1535         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnSubmitWithEvent(nativeNode);
1536         return panda::JSValueRef::Undefined(vm);
1537     }
1538     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1539     std::function<void(int32_t, NG::TextFieldCommonEvent&)> callback = [vm, frameNode,
1540         func = panda::CopyableGlobal(vm, func)](int32_t key, NG::TextFieldCommonEvent& event) {
1541         panda::LocalScope pandaScope(vm);
1542         panda::TryCatch trycatch(vm);
1543         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1544         const char* keys[] = { "text", "keepEditableState" };
1545         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetText().c_str()),
1546             panda::FunctionRef::New(vm, Framework::JSTextField::JsKeepEditableState) };
1547         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1548         eventObject->SetNativePointerFieldCount(vm, 1);
1549         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
1550         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1551             panda::IntegerRef::New(vm, key), eventObject };
1552         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1553     };
1554     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnSubmitWithEvent(
1555         nativeNode, reinterpret_cast<void*>(&callback));
1556     return panda::JSValueRef::Undefined(vm);
1557 }
1558 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1559 ArkUINativeModuleValue TextInputBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1560 {
1561     EcmaVM* vm = runtimeCallInfo->GetVM();
1562     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1563     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1564     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1565     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnSubmitWithEvent(nativeNode);
1566     return panda::JSValueRef::Undefined(vm);
1567 }
1568 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1569 ArkUINativeModuleValue TextInputBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1570 {
1571     EcmaVM *vm = runtimeCallInfo->GetVM();
1572     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1573     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1574     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1575     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1576     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1577     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1578     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1579         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnChange(nativeNode);
1580         return panda::JSValueRef::Undefined(vm);
1581     }
1582     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1583     std::function<void(const std::string&, PreviewText&)> callback = [vm, frameNode,
1584         func = panda::CopyableGlobal(vm, func)](const std::string& changeValue, PreviewText& previewText) {
1585         panda::LocalScope pandaScope(vm);
1586         panda::TryCatch trycatch(vm);
1587         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1588         const char* keys[] = { "offset", "value" };
1589         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, previewText.offset),
1590             panda::StringRef::NewFromUtf8(vm, previewText.value.c_str()) };
1591         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1592         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1593             panda::StringRef::NewFromUtf8(vm, changeValue.c_str()), eventObject };
1594         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1595     };
1596     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnChange(
1597         nativeNode, reinterpret_cast<void*>(&callback));
1598     return panda::JSValueRef::Undefined(vm);
1599 }
1600 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1601 ArkUINativeModuleValue TextInputBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1602 {
1603     EcmaVM* vm = runtimeCallInfo->GetVM();
1604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1605     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1606     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1607     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnChange(nativeNode);
1608     return panda::JSValueRef::Undefined(vm);
1609 }
1610 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1611 ArkUINativeModuleValue TextInputBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1612 {
1613     EcmaVM *vm = runtimeCallInfo->GetVM();
1614     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1615     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1616     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1617     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1618     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1619     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1620     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1621         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnTextSelectionChange(nativeNode);
1622         return panda::JSValueRef::Undefined(vm);
1623     }
1624     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1625     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1626         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int selectionEnd) {
1627         panda::LocalScope pandaScope(vm);
1628         panda::TryCatch trycatch(vm);
1629         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1630         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1631         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1632         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1633         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1634     };
1635     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnTextSelectionChange(
1636         nativeNode, reinterpret_cast<void*>(&callback));
1637     return panda::JSValueRef::Undefined(vm);
1638 }
1639 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1640 ArkUINativeModuleValue TextInputBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1641 {
1642     EcmaVM* vm = runtimeCallInfo->GetVM();
1643     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1644     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1645     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1646     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnTextSelectionChange(nativeNode);
1647     return panda::JSValueRef::Undefined(vm);
1648 }
1649 
SetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1650 ArkUINativeModuleValue TextInputBridge::SetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1651 {
1652     EcmaVM *vm = runtimeCallInfo->GetVM();
1653     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1654     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1655     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1656     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1657     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1658     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1659     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1660         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnContentScroll(nativeNode);
1661         return panda::JSValueRef::Undefined(vm);
1662     }
1663     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1664     std::function<void(float, float)> callback = [vm, frameNode,
1665         func = panda::CopyableGlobal(vm, func)](float totalOffsetX, float totalOffsetY) {
1666         panda::LocalScope pandaScope(vm);
1667         panda::TryCatch trycatch(vm);
1668         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1669         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1670             panda::NumberRef::New(vm, totalOffsetX), panda::NumberRef::New(vm, totalOffsetY) };
1671         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1672     };
1673     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnContentScroll(
1674         nativeNode, reinterpret_cast<void*>(&callback));
1675     return panda::JSValueRef::Undefined(vm);
1676 }
1677 
ResetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1678 ArkUINativeModuleValue TextInputBridge::ResetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1679 {
1680     EcmaVM* vm = runtimeCallInfo->GetVM();
1681     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1682     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1683     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1684     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnContentScroll(nativeNode);
1685     return panda::JSValueRef::Undefined(vm);
1686 }
1687 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1688 ArkUINativeModuleValue TextInputBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1689 {
1690     EcmaVM *vm = runtimeCallInfo->GetVM();
1691     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1692     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1693     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1694     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1695     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1696     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1697     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1698         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCopy(nativeNode);
1699         return panda::JSValueRef::Undefined(vm);
1700     }
1701     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1702     std::function<void(const std::string&)> callback = [vm, frameNode,
1703         func = panda::CopyableGlobal(vm, func)](const std::string& copyStr) {
1704         panda::LocalScope pandaScope(vm);
1705         panda::TryCatch trycatch(vm);
1706         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1707         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1708             panda::StringRef::NewFromUtf8(vm, copyStr.c_str()) };
1709         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1710     };
1711     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1712     return panda::JSValueRef::Undefined(vm);
1713 }
1714 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1715 ArkUINativeModuleValue TextInputBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1716 {
1717     EcmaVM* vm = runtimeCallInfo->GetVM();
1718     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1719     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1720     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1721     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCopy(nativeNode);
1722     return panda::JSValueRef::Undefined(vm);
1723 }
1724 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1725 ArkUINativeModuleValue TextInputBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1726 {
1727     EcmaVM *vm = runtimeCallInfo->GetVM();
1728     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1730     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1732     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1733     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1734     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1735         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCut(nativeNode);
1736         return panda::JSValueRef::Undefined(vm);
1737     }
1738     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1739     std::function<void(const std::string&)> callback = [vm, frameNode,
1740         func = panda::CopyableGlobal(vm, func)](const std::string& cutStr) {
1741         panda::LocalScope pandaScope(vm);
1742         panda::TryCatch trycatch(vm);
1743         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1744         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1745             panda::StringRef::NewFromUtf8(vm, cutStr.c_str()) };
1746         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1747     };
1748     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnCut(nativeNode, reinterpret_cast<void*>(&callback));
1749     return panda::JSValueRef::Undefined(vm);
1750 }
1751 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1752 ArkUINativeModuleValue TextInputBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1753 {
1754     EcmaVM* vm = runtimeCallInfo->GetVM();
1755     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1756     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1757     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1758     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCut(nativeNode);
1759     return panda::JSValueRef::Undefined(vm);
1760 }
1761 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1762 ArkUINativeModuleValue TextInputBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1763 {
1764     EcmaVM *vm = runtimeCallInfo->GetVM();
1765     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1766     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1767     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1768     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1769     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1770     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1771     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1772         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnPaste(nativeNode);
1773         return panda::JSValueRef::Undefined(vm);
1774     }
1775     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1776     std::function<void(const std::string&, NG::TextCommonEvent&)> callback = [vm, frameNode,
1777         func = panda::CopyableGlobal(vm, func)](const std::string& val, NG::TextCommonEvent& info) {
1778         panda::LocalScope pandaScope(vm);
1779         panda::TryCatch trycatch(vm);
1780         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1781         auto eventObject = panda::ObjectRef::New(vm);
1782         eventObject->SetNativePointerFieldCount(vm, 1);
1783         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
1784             panda::FunctionRef::New(vm, Framework::JsPreventDefault));
1785         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1786         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1787             panda::StringRef::NewFromUtf8(vm, val.c_str()), eventObject };
1788         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1789     };
1790     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnPaste(
1791         nativeNode, reinterpret_cast<void*>(&callback));
1792     return panda::JSValueRef::Undefined(vm);
1793 }
1794 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1795 ArkUINativeModuleValue TextInputBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1796 {
1797     EcmaVM* vm = runtimeCallInfo->GetVM();
1798     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1799     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1800     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1801     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnPaste(nativeNode);
1802     return panda::JSValueRef::Undefined(vm);
1803 }
1804 
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)1805 ArkUINativeModuleValue TextInputBridge::SetPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
1806 {
1807     EcmaVM *vm = runtimeCallInfo->GetVM();
1808     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1809     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1810     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1811     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1812     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1813     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1814     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
1815 
1816     struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
1817     struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
1818     struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
1819     struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP) };
1820 
1821     CalcDimension topDimen(0, DimensionUnit::VP);
1822     CalcDimension rightDimen(0, DimensionUnit::VP);
1823     CalcDimension bottomDimen(0, DimensionUnit::VP);
1824     CalcDimension leftDimen(0, DimensionUnit::VP);
1825 
1826     ArkTSUtils::ParsePadding(vm, secondArg, topDimen, top);
1827     ArkTSUtils::ParsePadding(vm, thirdArg, rightDimen, right);
1828     ArkTSUtils::ParsePadding(vm, forthArg, bottomDimen, bottom);
1829     ArkTSUtils::ParsePadding(vm, fifthArg, leftDimen, left);
1830     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPadding(nativeNode, &top, &right, &bottom, &left);
1831     return panda::JSValueRef::Undefined(vm);
1832 }
1833 
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)1834 ArkUINativeModuleValue TextInputBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
1835 {
1836     EcmaVM *vm = runtimeCallInfo->GetVM();
1837     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1838     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1839     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1840     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPadding(nativeNode);
1841     return panda::JSValueRef::Undefined(vm);
1842 }
1843 
SetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)1844 ArkUINativeModuleValue TextInputBridge::SetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1845 {
1846     EcmaVM *vm = runtimeCallInfo->GetVM();
1847     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1848     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1849     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1850     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1851 
1852     if (secondArg->IsNumber()) {
1853         uint32_t value = secondArg->Uint32Value(vm);
1854         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputContentType(nativeNode, value);
1855     } else {
1856         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputContentType(nativeNode);
1857     }
1858     return panda::JSValueRef::Undefined(vm);
1859 }
1860 
ResetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)1861 ArkUINativeModuleValue TextInputBridge::ResetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1862 {
1863     EcmaVM *vm = runtimeCallInfo->GetVM();
1864     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1865     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1866     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1867     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputContentType(nativeNode);
1868     return panda::JSValueRef::Undefined(vm);
1869 }
1870 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1871 ArkUINativeModuleValue TextInputBridge::SetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1872 {
1873     EcmaVM *vm = runtimeCallInfo->GetVM();
1874     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1875     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1876     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1877     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1878     Color color;
1879     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1880         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBackgroundColor(nativeNode);
1881     } else {
1882         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputBackgroundColor(nativeNode, color.GetValue());
1883     }
1884     return panda::JSValueRef::Undefined(vm);
1885 }
1886 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1887 ArkUINativeModuleValue TextInputBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1888 {
1889     EcmaVM *vm = runtimeCallInfo->GetVM();
1890     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1891     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1892     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1893     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBackgroundColor(nativeNode);
1894     return panda::JSValueRef::Undefined(vm);
1895 }
1896 
SetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)1897 ArkUINativeModuleValue TextInputBridge::SetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
1898 {
1899     EcmaVM *vm = runtimeCallInfo->GetVM();
1900     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1901     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1902     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1903     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1904     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1905     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1906     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
1907     ArkUISizeType top = ArkTSUtils::ParseJsToArkUISize(vm, secondArg);
1908     ArkUISizeType right = ArkTSUtils::ParseJsToArkUISize(vm, thirdArg);
1909     ArkUISizeType bottom = ArkTSUtils::ParseJsToArkUISize(vm, forthArg);
1910     ArkUISizeType left = ArkTSUtils::ParseJsToArkUISize(vm, fifthArg);
1911     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMargin(nativeNode, &top, &right, &bottom, &left);
1912     return panda::JSValueRef::Undefined(vm);
1913 }
1914 
ResetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)1915 ArkUINativeModuleValue TextInputBridge::ResetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
1916 {
1917     EcmaVM *vm = runtimeCallInfo->GetVM();
1918     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1919     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1920     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1921     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMargin(nativeNode);
1922     return panda::JSValueRef::Undefined(vm);
1923 }
1924 
SetText(ArkUIRuntimeCallInfo * runtimeCallInfo)1925 ArkUINativeModuleValue TextInputBridge::SetText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1926 {
1927     EcmaVM* vm = runtimeCallInfo->GetVM();
1928     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1929     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1930     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1931 
1932     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1933     if (secondArg->IsString(vm)) {
1934         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, secondArg->ToString(vm)->
1935         ToString(vm).c_str());
1936     } else {
1937         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, "");
1938     }
1939     return panda::JSValueRef::Undefined(vm);
1940 }
ResetText(ArkUIRuntimeCallInfo * runtimeCallInfo)1941 ArkUINativeModuleValue TextInputBridge::ResetText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1942 {
1943     EcmaVM* vm = runtimeCallInfo->GetVM();
1944     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1945     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1946     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1947     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, "");
1948     return panda::JSValueRef::Undefined(vm);
1949 }
SetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)1950 ArkUINativeModuleValue TextInputBridge::SetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
1951 {
1952     EcmaVM* vm = runtimeCallInfo->GetVM();
1953     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1954     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1955     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1956 
1957     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1958     if (secondArg->IsString(vm)) {
1959         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, secondArg->
1960         ToString(vm)->ToString(vm).c_str());
1961     } else {
1962         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, "");
1963     }
1964     return panda::JSValueRef::Undefined(vm);
1965 }
ResetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)1966 ArkUINativeModuleValue TextInputBridge::ResetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
1967 {
1968     EcmaVM* vm = runtimeCallInfo->GetVM();
1969     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1970     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1971     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1972     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, "");
1973     return panda::JSValueRef::Undefined(vm);
1974 }
SetController(ArkUIRuntimeCallInfo * runtimeCallInfo)1975 ArkUINativeModuleValue TextInputBridge::SetController(ArkUIRuntimeCallInfo* runtimeCallInfo)
1976 {
1977     EcmaVM* vm = runtimeCallInfo->GetVM();
1978     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1979     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1980     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1981 
1982     auto nodePtr = GetArkUINodeModifiers()->getTextInputModifier()->getTextInputController(nativeNode);
1983     auto node = AceType::Claim(reinterpret_cast<TextFieldController*>(nodePtr));
1984 
1985     OHOS::Ace::Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
1986     OHOS::Ace::Framework::JSTextEditableController* jsController =
1987         OHOS::Ace::Framework::JSRef<OHOS::Ace::Framework::JSObject>::Cast(info[1])->Unwrap<OHOS::Ace::Framework::
1988         JSTextEditableController>();
1989     if (jsController) {
1990         jsController->SetController(node);
1991     }
1992     return panda::JSValueRef::Undefined(vm);
1993 }
ResetController(ArkUIRuntimeCallInfo * runtimeCallInfo)1994 ArkUINativeModuleValue TextInputBridge::ResetController(ArkUIRuntimeCallInfo* runtimeCallInfo)
1995 {
1996     EcmaVM* vm = runtimeCallInfo->GetVM();
1997     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1998     return panda::JSValueRef::Undefined(vm);
1999 }
2000 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2001 ArkUINativeModuleValue TextInputBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2002 {
2003     EcmaVM *vm = runtimeCallInfo->GetVM();
2004     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2005     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2006     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2007     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2008 
2009     if (secondArg->IsBoolean()) {
2010         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2011         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnablePreviewText(nativeNode, value);
2012     } else {
2013         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnablePreviewText(nativeNode);
2014     }
2015     return panda::JSValueRef::Undefined(vm);
2016 }
2017 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2018 ArkUINativeModuleValue TextInputBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2019 {
2020     EcmaVM* vm = runtimeCallInfo->GetVM();
2021     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2022     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2023     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2024     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnablePreviewText(nativeNode);
2025     return panda::JSValueRef::Undefined(vm);
2026 }
2027 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2028 ArkUINativeModuleValue TextInputBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2029 {
2030     EcmaVM* vm = runtimeCallInfo->GetVM();
2031     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2032     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2033     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2034     NG::OnCreateMenuCallback onCreateMenuCallback;
2035     NG::OnMenuItemClickCallback onMenuItemClickCallback;
2036     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
2037         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuOptions(nativeNode);
2038         return panda::JSValueRef::Undefined(vm);
2039     }
2040     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectionMenuOptions(
2041         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
2042     return panda::JSValueRef::Undefined(vm);
2043 }
2044 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2045 ArkUINativeModuleValue TextInputBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2046 {
2047     EcmaVM* vm = runtimeCallInfo->GetVM();
2048     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2049     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2050     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2051     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuOptions(nativeNode);
2052     return panda::JSValueRef::Undefined(vm);
2053 }
2054 
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2055 ArkUINativeModuleValue TextInputBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2056 {
2057     EcmaVM* vm = runtimeCallInfo->GetVM();
2058     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2059     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2060     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2061     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2062     auto value = widthArg->ToString(vm)->ToString(vm);
2063     if (value.empty()) {
2064         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWidth(nativeNode);
2065         return panda::JSValueRef::Undefined(vm);
2066     }
2067     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputWidth(
2068         nativeNode, value.c_str());
2069     return panda::JSValueRef::Undefined(vm);
2070 }
2071 
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2072 ArkUINativeModuleValue TextInputBridge::ResetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2073 {
2074     EcmaVM* vm = runtimeCallInfo->GetVM();
2075     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2076     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2077     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2078     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWidth(nativeNode);
2079     return panda::JSValueRef::Undefined(vm);
2080 }
2081 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2082 ArkUINativeModuleValue TextInputBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2083 {
2084     EcmaVM* vm = runtimeCallInfo->GetVM();
2085     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2086     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2087     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2088     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2089 
2090     if (secondArg->IsBoolean()) {
2091         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2092         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableHapticFeedback(nativeNode, value);
2093     } else {
2094         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableHapticFeedback(nativeNode);
2095     }
2096     return panda::JSValueRef::Undefined(vm);
2097 }
2098 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2099 ArkUINativeModuleValue TextInputBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2100 {
2101     EcmaVM* vm = runtimeCallInfo->GetVM();
2102     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2103     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2104     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2105     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableHapticFeedback(nativeNode);
2106     return panda::JSValueRef::Undefined(vm);
2107 }
2108 } // namespace OHOS::Ace::NG
2109