• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_native_common_bridge.h"
22 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
23 #include "bridge/declarative_frontend/jsview/js_text_editable_controller.h"
24 #include "frameworks/bridge/declarative_frontend/jsview/js_textfield.h"
25 namespace OHOS::Ace::NG {
26 
27 namespace {
28 constexpr int16_t DEFAULT_ALPHA = 255;
29 constexpr double DEFAULT_OPACITY = 0.2;
30 constexpr double DEFAULT_FONT_SIZE = 16.0;
31 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
32 const std::string DEFAULT_FONT_WEIGHT = "400";
33 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
34 constexpr int CALL_ARG_0 = 0;
35 constexpr int CALL_ARG_1 = 1;
36 constexpr int CALL_ARG_2 = 2;
37 constexpr int CALL_ARG_3 = 3;
38 constexpr int CALL_ARG_4 = 4;
39 constexpr int PARAM_ARR_LENGTH_1 = 1;
40 constexpr int PARAM_ARR_LENGTH_2 = 2;
41 constexpr int PARAM_ARR_LENGTH_3 = 3;
42 constexpr int32_t ARG_GROUP_LENGTH = 4;
43 constexpr int32_t DEFAULT_MODE = -1;
44 constexpr uint32_t ILLEGAL_VALUE = 0;
45 const int32_t MINI_VALID_VALUE = 1;
46 const int32_t MAX_VALID_VALUE = 100;
47 constexpr uint32_t DEFAULT_OVERFLOW = 4;
48 const std::vector<TextHeightAdaptivePolicy> HEIGHT_ADAPTIVE_POLICY = { TextHeightAdaptivePolicy::MAX_LINES_FIRST,
49     TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST, TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST };
50 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
51     TextOverflow::MARQUEE, TextOverflow::DEFAULT };
52 
ParseLocalizedPadding(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen,ArkUISizeType & result)53 bool ParseLocalizedPadding(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen,
54     ArkUISizeType& result)
55 {
56     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, dimen)) {
57         if (LessOrEqual(dimen.Value(), 0.0)) {
58             dimen.SetValue(0.0);
59             dimen.SetUnit(DimensionUnit::VP);
60         }
61         result.unit = static_cast<int8_t>(dimen.Unit());
62         if (dimen.CalcValue() != "") {
63             result.string = dimen.CalcValue().c_str();
64         } else {
65             result.value = dimen.Value();
66         }
67         return true;
68     }
69     return false;
70 }
71 
ParseLocalizedMargin(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen,ArkUISizeType & result)72 bool ParseLocalizedMargin(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result)
73 {
74     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, dimen)) {
75         result.unit = static_cast<int8_t>(dimen.Unit());
76         if (dimen.CalcValue() != "") {
77             result.string = dimen.CalcValue().c_str();
78         } else {
79             result.value = dimen.Value();
80         }
81         return true;
82     }
83     return false;
84 }
85 
prepareUnderlineColorValues(ArkUI_Uint32 * values,ArkUI_Bool * hasValues,const UserUnderlineColor & userColor,uint32_t size)86 void prepareUnderlineColorValues(
87     ArkUI_Uint32* values, ArkUI_Bool* hasValues, const UserUnderlineColor& userColor, uint32_t size)
88 {
89     if (size != ARG_GROUP_LENGTH) {
90         return;
91     }
92     values[CALL_ARG_0] = userColor.typing->GetValue();
93     values[CALL_ARG_1] = userColor.normal->GetValue();
94     values[CALL_ARG_2] = userColor.error->GetValue();
95     values[CALL_ARG_3] = userColor.disable->GetValue();
96 
97     hasValues[CALL_ARG_0] = userColor.typing.has_value();
98     hasValues[CALL_ARG_1] = userColor.normal.has_value();
99     hasValues[CALL_ARG_2] = userColor.error.has_value();
100     hasValues[CALL_ARG_3] = userColor.disable.has_value();
101 }
102 } // namespace
103 
104 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue TextInputBridge::SetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
106 {
107     EcmaVM *vm = runtimeCallInfo->GetVM();
108     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
109     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
110     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
111     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
112     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
113     Color color;
114     RefPtr<ResourceObject> resourceObject;
115     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
116     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
117         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretColor(nativeNode);
118     } else {
119         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretColor(
120             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
121     }
122     return panda::JSValueRef::Undefined(vm);
123 }
124 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)125 ArkUINativeModuleValue TextInputBridge::ResetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
126 {
127     EcmaVM *vm = runtimeCallInfo->GetVM();
128     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
129     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
130     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
131     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
132     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretColor(nativeNode);
133     return panda::JSValueRef::Undefined(vm);
134 }
135 
SetType(ArkUIRuntimeCallInfo * runtimeCallInfo)136 ArkUINativeModuleValue TextInputBridge::SetType(ArkUIRuntimeCallInfo *runtimeCallInfo)
137 {
138     EcmaVM *vm = runtimeCallInfo->GetVM();
139     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
140     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
141     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
142     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
143     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
144     if (secondArg->IsNumber()) {
145         int32_t value = secondArg->Int32Value(vm);
146         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputType(nativeNode, value);
147     } else {
148         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputType(nativeNode);
149     }
150 
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
ResetType(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue TextInputBridge::ResetType(ArkUIRuntimeCallInfo *runtimeCallInfo)
155 {
156     EcmaVM *vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
158     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
159     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
160     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
161     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputType(nativeNode);
162     return panda::JSValueRef::Undefined(vm);
163 }
164 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue TextInputBridge::SetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
166 {
167     EcmaVM *vm = runtimeCallInfo->GetVM();
168     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
169     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
170     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
171     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
172     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
173     if (secondArg->IsNumber()) {
174         uint32_t value = secondArg->Uint32Value(vm);
175         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMaxLines(nativeNode, value);
176     } else {
177         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLines(nativeNode);
178     }
179     return panda::JSValueRef::Undefined(vm);
180 }
181 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)182 ArkUINativeModuleValue TextInputBridge::ResetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
183 {
184     EcmaVM *vm = runtimeCallInfo->GetVM();
185     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
186     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
187     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
188     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
189     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLines(nativeNode);
190     return panda::JSValueRef::Undefined(vm);
191 }
192 
SetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)193 ArkUINativeModuleValue TextInputBridge::SetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
194 {
195     EcmaVM *vm = runtimeCallInfo->GetVM();
196     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
197     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
198     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
199     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
200     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
201     Color color;
202     RefPtr<ResourceObject> resourceObject;
203     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
204     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
205         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderColor(nativeNode);
206     } else {
207         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderColor(
208             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
209     }
210     return panda::JSValueRef::Undefined(vm);
211 }
212 
ResetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue TextInputBridge::ResetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
214 {
215     EcmaVM *vm = runtimeCallInfo->GetVM();
216     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
218     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
219     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
220     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderColor(nativeNode);
221     return panda::JSValueRef::Undefined(vm);
222 }
223 
SetCaretPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)224 ArkUINativeModuleValue TextInputBridge::SetCaretPosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
225 {
226     EcmaVM *vm = runtimeCallInfo->GetVM();
227     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
228     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
229     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
230     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
231     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
232     if (secondArg->IsInt() && secondArg->Int32Value(vm) >= 0) {
233         int32_t caretPosition = secondArg->Int32Value(vm);
234         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretPosition(nativeNode, caretPosition);
235     } else {
236         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretPosition(nativeNode);
237     }
238     return panda::JSValueRef::Undefined(vm);
239 }
240 
ResetCaretPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)241 ArkUINativeModuleValue TextInputBridge::ResetCaretPosition(ArkUIRuntimeCallInfo *runtimeCallInfo)
242 {
243     EcmaVM *vm = runtimeCallInfo->GetVM();
244     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
245     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
246     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
247     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
248     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretPosition(nativeNode);
249     return panda::JSValueRef::Undefined(vm);
250 }
251 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)252 ArkUINativeModuleValue TextInputBridge::SetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
253 {
254     EcmaVM *vm = runtimeCallInfo->GetVM();
255     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
256     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
257     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
258     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
259     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
260     if (secondArg->IsNumber()) {
261         int32_t option = secondArg->Int32Value(vm);
262         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCopyOption(nativeNode, option);
263     } else {
264         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCopyOption(nativeNode);
265     }
266 
267     return panda::JSValueRef::Undefined(vm);
268 }
269 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue TextInputBridge::ResetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
271 {
272     EcmaVM *vm = runtimeCallInfo->GetVM();
273     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
275     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
277     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCopyOption(nativeNode);
278     return panda::JSValueRef::Undefined(vm);
279 }
280 
SetShowPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)281 ArkUINativeModuleValue TextInputBridge::SetShowPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
282 {
283     EcmaVM *vm = runtimeCallInfo->GetVM();
284     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
285     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
286     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
287     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
288     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
289 
290     if (secondArg->IsBoolean()) {
291         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
292         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowPasswordIcon(nativeNode, value);
293     } else {
294         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
295     }
296     return panda::JSValueRef::Undefined(vm);
297 }
298 
ResetShowPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)299 ArkUINativeModuleValue TextInputBridge::ResetShowPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
300 {
301     EcmaVM *vm = runtimeCallInfo->GetVM();
302     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
303     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
304     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
305     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
306     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
307     return panda::JSValueRef::Undefined(vm);
308 }
309 
SetShowPassword(ArkUIRuntimeCallInfo * runtimeCallInfo)310 ArkUINativeModuleValue TextInputBridge::SetShowPassword(ArkUIRuntimeCallInfo *runtimeCallInfo)
311 {
312     EcmaVM *vm = runtimeCallInfo->GetVM();
313     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
314     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
315     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
316     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
317     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
318 
319     if (secondArg->IsBoolean()) {
320         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
321         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowPassword(nativeNode, value);
322     } else {
323         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPassword(nativeNode);
324     }
325     return panda::JSValueRef::Undefined(vm);
326 }
327 
ResetShowPassword(ArkUIRuntimeCallInfo * runtimeCallInfo)328 ArkUINativeModuleValue TextInputBridge::ResetShowPassword(ArkUIRuntimeCallInfo *runtimeCallInfo)
329 {
330     EcmaVM *vm = runtimeCallInfo->GetVM();
331     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
332     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
333     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
334     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
335     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPassword(nativeNode);
336     return panda::JSValueRef::Undefined(vm);
337 }
338 
SetPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)339 ArkUINativeModuleValue TextInputBridge::SetPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
340 {
341     EcmaVM *vm = runtimeCallInfo->GetVM();
342     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
343     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
344     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
345     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
346     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
347     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
348 
349     PasswordIcon passwordIcon;
350     struct ArkUIPasswordIconType value = {"", "", "", "", "", ""};
351     if (!ArkTSUtils::GetJsPasswordIcon(vm, secondArg, thirdArg, passwordIcon)) {
352         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordIcon(nativeNode);
353     } else {
354         value.showResult = passwordIcon.showResult.c_str();
355         value.hideResult = passwordIcon.hideResult.c_str();
356         value.showBundleName = passwordIcon.showBundleName.c_str();
357         value.showModuleName = passwordIcon.showModuleName.c_str();
358         value.hideBundleName = passwordIcon.hideBundleName.c_str();
359         value.hideModuleName = passwordIcon.hideModuleName.c_str();
360         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPasswordIcon(nativeNode, &value);
361     }
362     return panda::JSValueRef::Undefined(vm);
363 }
364 
ResetPasswordIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)365 ArkUINativeModuleValue TextInputBridge::ResetPasswordIcon(ArkUIRuntimeCallInfo *runtimeCallInfo)
366 {
367     EcmaVM *vm = runtimeCallInfo->GetVM();
368     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
369     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
370     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
371     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
372     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordIcon(nativeNode);
373     return panda::JSValueRef::Undefined(vm);
374 }
375 
SetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)376 ArkUINativeModuleValue TextInputBridge::SetTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
377 {
378     EcmaVM *vm = runtimeCallInfo->GetVM();
379     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
380     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
381     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
382     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
383     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
384 
385     if (secondArg->IsNumber()) {
386         int32_t value = secondArg->Int32Value(vm);
387         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextAlign(nativeNode, value);
388     } else {
389         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextAlign(nativeNode);
390     }
391     return panda::JSValueRef::Undefined(vm);
392 }
393 
ResetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)394 ArkUINativeModuleValue TextInputBridge::ResetTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
395 {
396     EcmaVM *vm = runtimeCallInfo->GetVM();
397     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
398     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
399     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
400     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
401     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextAlign(nativeNode);
402     return panda::JSValueRef::Undefined(vm);
403 }
404 
SetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue TextInputBridge::SetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
406 {
407     EcmaVM *vm = runtimeCallInfo->GetVM();
408     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
409     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
410     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
411     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
412     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
413     if (secondArg->IsString(vm) && secondArg->ToString(vm)->ToString(vm) == "Inline") {
414         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputStyle(nativeNode,
415             static_cast<int32_t>(InputStyle::INLINE));
416     } else {
417         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStyle(nativeNode);
418     }
419     return panda::JSValueRef::Undefined(vm);
420 }
421 
ResetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)422 ArkUINativeModuleValue TextInputBridge::ResetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
423 {
424     EcmaVM *vm = runtimeCallInfo->GetVM();
425     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
426     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
427     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
428     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
429     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStyle(nativeNode);
430     return panda::JSValueRef::Undefined(vm);
431 }
432 
SetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)433 ArkUINativeModuleValue TextInputBridge::SetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
434 {
435     EcmaVM *vm = runtimeCallInfo->GetVM();
436     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
437     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
438     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
439     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
440     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
441 
442     if (secondArg->IsBoolean()) {
443         uint32_t menuHiddenValue = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
444         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectionMenuHidden(nativeNode, menuHiddenValue);
445     } else {
446         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuHidden(nativeNode);
447     }
448 
449     return panda::JSValueRef::Undefined(vm);
450 }
451 
ResetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)452 ArkUINativeModuleValue TextInputBridge::ResetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
453 {
454     EcmaVM *vm = runtimeCallInfo->GetVM();
455     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
456     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
457     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
458     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
459     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuHidden(nativeNode);
460     return panda::JSValueRef::Undefined(vm);
461 }
462 
SetTextInputShowUnderline(ArkUIRuntimeCallInfo * runtimeCallInfo)463 ArkUINativeModuleValue TextInputBridge::SetTextInputShowUnderline(ArkUIRuntimeCallInfo *runtimeCallInfo)
464 {
465     EcmaVM *vm = runtimeCallInfo->GetVM();
466     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
467     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
468     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
469     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
470     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
471 
472     if (secondArg->IsBoolean()) {
473         uint32_t showUnderLine = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
474         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowUnderline(nativeNode, showUnderLine);
475     } else {
476         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowUnderline(nativeNode);
477     }
478 
479     return panda::JSValueRef::Undefined(vm);
480 }
481 
ResetTextInputShowUnderline(ArkUIRuntimeCallInfo * runtimeCallInfo)482 ArkUINativeModuleValue TextInputBridge::ResetTextInputShowUnderline(ArkUIRuntimeCallInfo *runtimeCallInfo)
483 {
484     EcmaVM *vm = runtimeCallInfo->GetVM();
485     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
486     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
487     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
488     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
489     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowUnderline(nativeNode);
490     return panda::JSValueRef::Undefined(vm);
491 }
492 
SetPasswordRules(ArkUIRuntimeCallInfo * runtimeCallInfo)493 ArkUINativeModuleValue TextInputBridge::SetPasswordRules(ArkUIRuntimeCallInfo* runtimeCallInfo)
494 {
495     EcmaVM* vm = runtimeCallInfo->GetVM();
496     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
497     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
498     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
499     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
500     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
501     if (secondArg->IsString(vm)) {
502         auto value = secondArg->ToString(vm)->ToString(vm);
503         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPasswordRules(nativeNode, value.c_str());
504     } else {
505         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordRules(nativeNode);
506     }
507     return panda::JSValueRef::Undefined(vm);
508 }
509 
ResetPasswordRules(ArkUIRuntimeCallInfo * runtimeCallInfo)510 ArkUINativeModuleValue TextInputBridge::ResetPasswordRules(ArkUIRuntimeCallInfo* runtimeCallInfo)
511 {
512     EcmaVM* vm = runtimeCallInfo->GetVM();
513     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
514     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
515     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
516     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
517     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPasswordRules(nativeNode);
518     return panda::JSValueRef::Undefined(vm);
519 }
520 
SetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)521 ArkUINativeModuleValue TextInputBridge::SetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
522 {
523     EcmaVM *vm = runtimeCallInfo->GetVM();
524     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
525     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
526     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
527     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
528     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
529 
530     if (secondArg->IsBoolean()) {
531         uint32_t enableAutoFill = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
532         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableAutoFill(nativeNode, enableAutoFill);
533     } else {
534         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFill(nativeNode);
535     }
536 
537     return panda::JSValueRef::Undefined(vm);
538 }
539 
ResetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)540 ArkUINativeModuleValue TextInputBridge::ResetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
541 {
542     EcmaVM *vm = runtimeCallInfo->GetVM();
543     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
544     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
545     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
546     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
547     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFill(nativeNode);
548     return panda::JSValueRef::Undefined(vm);
549 }
550 
SetEnableAutoFillAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)551 ArkUINativeModuleValue TextInputBridge::SetEnableAutoFillAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
552 {
553     EcmaVM* vm = runtimeCallInfo->GetVM();
554     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
555     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
556     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
557     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
558     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
559 
560     if (secondArg->IsBoolean()) {
561         uint32_t enableAutoFillAnimation = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
562         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableAutoFillAnimation(
563             nativeNode, enableAutoFillAnimation);
564     } else {
565         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFillAnimation(nativeNode);
566     }
567 
568     return panda::JSValueRef::Undefined(vm);
569 }
570 
ResetEnableAutoFillAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)571 ArkUINativeModuleValue TextInputBridge::ResetEnableAutoFillAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
572 {
573     EcmaVM* vm = runtimeCallInfo->GetVM();
574     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
575     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
576     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
577     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
578     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableAutoFillAnimation(nativeNode);
579     return panda::JSValueRef::Undefined(vm);
580 }
581 
SetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)582 ArkUINativeModuleValue TextInputBridge::SetCaretStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
583 {
584     EcmaVM *vm = runtimeCallInfo->GetVM();
585     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
586     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
587     Local<JSValueRef> caretWidthArg = runtimeCallInfo->GetCallArgRef(1);
588     Local<JSValueRef> caretColorArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
589     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
590     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
591     auto textFieldTheme = ArkTSUtils::GetTheme<TextFieldTheme>();
592     CHECK_NULL_RETURN(textFieldTheme, panda::JSValueRef::Undefined(vm));
593     CalcDimension caretWidth = textFieldTheme->GetCursorWidth();
594     RefPtr<ResourceObject> widthObject;
595     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, caretWidthArg, caretWidth, widthObject, false) ||
596             LessNotEqual(caretWidth.Value(), 0.0)) {
597         caretWidth = textFieldTheme->GetCursorWidth();
598     }
599     Color color;
600     uint32_t caretColor = textFieldTheme->GetCursorColor().GetValue();
601     RefPtr<ResourceObject> colorObject;
602     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
603     if (!caretColorArg->IsUndefined()) {
604         if (ArkTSUtils::ParseJsColorAlpha(vm, caretColorArg, color, colorObject, nodeInfo)) {
605             caretColor = color.GetValue();
606         }
607     }
608     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCaretStyle(
609         nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()), caretColor,
610         AceType::RawPtr(widthObject), AceType::RawPtr(colorObject));
611     return panda::JSValueRef::Undefined(vm);
612 }
613 
ResetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)614 ArkUINativeModuleValue TextInputBridge::ResetCaretStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
615 {
616     EcmaVM *vm = runtimeCallInfo->GetVM();
617     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
618     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
619     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
620     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
621     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCaretStyle(nativeNode);
622     return panda::JSValueRef::Undefined(vm);
623 }
624 
SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)625 ArkUINativeModuleValue TextInputBridge::SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
626 {
627     EcmaVM *vm = runtimeCallInfo->GetVM();
628     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
629     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
630     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
631     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
632     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
633 
634     if (secondArg->IsBoolean()) {
635         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
636         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableKeyboardOnFocus(nativeNode, value);
637     } else {
638         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowPasswordIcon(nativeNode);
639     }
640 
641     return panda::JSValueRef::Undefined(vm);
642 }
643 
ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)644 ArkUINativeModuleValue TextInputBridge::ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
645 {
646     EcmaVM *vm = runtimeCallInfo->GetVM();
647     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
648     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
649     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
650     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
651     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableKeyboardOnFocus(nativeNode);
652     return panda::JSValueRef::Undefined(vm);
653 }
654 
SetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)655 ArkUINativeModuleValue TextInputBridge::SetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
656 {
657     EcmaVM *vm = runtimeCallInfo->GetVM();
658     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
659     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
660     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
661     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
662     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
663 
664     if (secondArg->IsNumber()) {
665         int32_t value = secondArg->Int32Value(vm);
666         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputBarState(nativeNode, value);
667     } else {
668         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBarState(nativeNode);
669     }
670 
671     return panda::JSValueRef::Undefined(vm);
672 }
673 
ResetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)674 ArkUINativeModuleValue TextInputBridge::ResetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
675 {
676     EcmaVM *vm = runtimeCallInfo->GetVM();
677     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
678     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
679     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
680     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
681     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBarState(nativeNode);
682     return panda::JSValueRef::Undefined(vm);
683 }
684 
SetTextInputEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)685 ArkUINativeModuleValue TextInputBridge::SetTextInputEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
686 {
687     EcmaVM *vm = runtimeCallInfo->GetVM();
688     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
689     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
690     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
691     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
692     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
693 
694     if (secondArg->IsNumber()) {
695         int32_t value = secondArg->Int32Value(vm);
696         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnterKeyType(nativeNode, value);
697     } else {
698         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnterKeyType(nativeNode);
699     }
700     return panda::JSValueRef::Undefined(vm);
701 }
702 
SetTextInputAutoCapitalizationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)703 ArkUINativeModuleValue TextInputBridge::SetTextInputAutoCapitalizationMode(ArkUIRuntimeCallInfo *runtimeCallInfo)
704 {
705     EcmaVM *vm = runtimeCallInfo->GetVM();
706     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
707     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
708 
709     if (firstArg->IsUndefined() || firstArg->IsNull()) {
710         return panda::JSValueRef::Undefined(vm);
711     }
712 
713     if (!(firstArg->IsNativePointer(vm))) {
714         return panda::JSValueRef::Undefined(vm);
715     }
716 
717     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
718     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
719 
720     if (!(secondArg->IsUndefined()) && !(secondArg->IsNull()) && secondArg->IsNumber()) {
721         int32_t value = secondArg->Int32Value(vm);
722         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputAutoCapitalizationMode(nativeNode, value);
723     } else {
724         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAutoCapitalizationMode(nativeNode);
725     }
726     return panda::JSValueRef::Undefined(vm);
727 }
728 
ResetTextInputEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)729 ArkUINativeModuleValue TextInputBridge::ResetTextInputEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
730 {
731     EcmaVM *vm = runtimeCallInfo->GetVM();
732     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
733     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
734     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
735     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
736     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnterKeyType(nativeNode);
737     return panda::JSValueRef::Undefined(vm);
738 }
739 
ResetTextInputAutoCapitalizationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)740 ArkUINativeModuleValue TextInputBridge::ResetTextInputAutoCapitalizationMode(ArkUIRuntimeCallInfo *runtimeCallInfo)
741 {
742     EcmaVM *vm = runtimeCallInfo->GetVM();
743     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
744     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
745 
746     if (firstArg->IsUndefined() || firstArg->IsNull()) {
747         return panda::JSValueRef::Undefined(vm);
748     }
749 
750     if (!(firstArg->IsNativePointer(vm))) {
751         return panda::JSValueRef::Undefined(vm);
752     }
753 
754     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
755     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAutoCapitalizationMode(nativeNode);
756     return panda::JSValueRef::Undefined(vm);
757 }
758 
SetTextInputFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)759 ArkUINativeModuleValue TextInputBridge::SetTextInputFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
760 {
761     EcmaVM *vm = runtimeCallInfo->GetVM();
762     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
763     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
764     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
765     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
766     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
767     std::string weight;
768     RefPtr<ResourceObject> resourceObject;
769     if ((secondArg->IsString(vm) || secondArg->IsObject(vm)) &&
770         ArkTSUtils::ParseJsString(vm, secondArg, weight, resourceObject)) {
771         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontWeightStr(
772             nativeNode, weight.c_str(), AceType::RawPtr(resourceObject));
773     } else if (secondArg->IsNumber()) {
774         weight = std::to_string(secondArg->Int32Value(vm));
775         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontWeightStr(
776             nativeNode, weight.c_str(), nullptr);
777     } else {
778         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontWeight(nativeNode);
779     }
780 
781     return panda::JSValueRef::Undefined(vm);
782 }
783 
ResetTextInputFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)784 ArkUINativeModuleValue TextInputBridge::ResetTextInputFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
785 {
786     EcmaVM *vm = runtimeCallInfo->GetVM();
787     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
788     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
789     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
790     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
791     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontWeight(nativeNode);
792     return panda::JSValueRef::Undefined(vm);
793 }
794 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)795 ArkUINativeModuleValue TextInputBridge::SetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
796 {
797     EcmaVM *vm = runtimeCallInfo->GetVM();
798     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
799     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
800     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
801     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
802     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
803 
804     CalcDimension fontSize;
805     ArkUILengthType value{ nullptr, 0.0, static_cast<int8_t>(DimensionUnit::FP) };
806     RefPtr<ResourceObject> resourceObject;
807     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, fontSize, DimensionUnit::FP, resourceObject, false)) {
808         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontSize(nativeNode);
809     } else {
810         value.unit = static_cast<int8_t>(fontSize.Unit());
811         if (fontSize.CalcValue() != "") {
812             value.string = fontSize.CalcValue().c_str();
813         } else {
814             value.number = fontSize.Value();
815         }
816         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontSize(
817             nativeNode, &value, AceType::RawPtr(resourceObject));
818     }
819     return panda::JSValueRef::Undefined(vm);
820 }
821 
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)822 ArkUINativeModuleValue TextInputBridge::ResetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
823 {
824     EcmaVM *vm = runtimeCallInfo->GetVM();
825     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
826     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
827     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
828     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
829     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontSize(nativeNode);
830     return panda::JSValueRef::Undefined(vm);
831 }
832 
SetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)833 ArkUINativeModuleValue TextInputBridge::SetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
834 {
835     EcmaVM *vm = runtimeCallInfo->GetVM();
836     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
837     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
838     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
839     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
840     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
841     if (!secondArg->IsNumber()) {
842         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
843     } else {
844         uint32_t maxLength = secondArg->Uint32Value(vm);
845         if (std::isinf(static_cast<float>(secondArg->ToNumber(vm)->Value()))) {
846             maxLength = INT32_MAX; // Infinity
847         }
848         if (GreatOrEqual(maxLength, 0)) {
849             GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMaxLength(nativeNode, maxLength);
850         } else {
851             GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
852         }
853     }
854     return panda::JSValueRef::Undefined(vm);
855 }
856 
ResetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)857 ArkUINativeModuleValue TextInputBridge::ResetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
858 {
859     EcmaVM *vm = runtimeCallInfo->GetVM();
860     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
861     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
862     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
863     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
864     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxLength(nativeNode);
865     return panda::JSValueRef::Undefined(vm);
866 }
867 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)868 ArkUINativeModuleValue TextInputBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
869 {
870     EcmaVM *vm = runtimeCallInfo->GetVM();
871     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
872     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
873     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
874     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
875     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
876     Color color;
877     RefPtr<ResourceObject> resourceObject;
878     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
879     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
880         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectedBackgroundColor(nativeNode);
881     } else {
882         if (color.GetAlpha() == DEFAULT_ALPHA) {
883             color = color.ChangeOpacity(DEFAULT_OPACITY);
884         }
885         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectedBackgroundColor(
886             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
887     }
888     return panda::JSValueRef::Undefined(vm);
889 }
890 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)891 ArkUINativeModuleValue TextInputBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
892 {
893     EcmaVM *vm = runtimeCallInfo->GetVM();
894     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
895     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
896     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
897     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
898     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectedBackgroundColor(nativeNode);
899     return panda::JSValueRef::Undefined(vm);
900 }
901 
SetShowError(ArkUIRuntimeCallInfo * runtimeCallInfo)902 ArkUINativeModuleValue TextInputBridge::SetShowError(ArkUIRuntimeCallInfo *runtimeCallInfo)
903 {
904     EcmaVM *vm = runtimeCallInfo->GetVM();
905     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
906     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
907     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
908     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
909     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
910     bool visible = false;
911     std::string error;
912     RefPtr<ResourceObject> resourceObject;
913     if (ArkTSUtils::ParseJsString(vm, secondArg, error, resourceObject)) {
914         visible = true;
915     }
916 
917     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowError(nativeNode, error.c_str(),
918         static_cast<uint32_t>(visible), AceType::RawPtr(resourceObject));
919 
920     return panda::JSValueRef::Undefined(vm);
921 }
922 
ResetShowError(ArkUIRuntimeCallInfo * runtimeCallInfo)923 ArkUINativeModuleValue TextInputBridge::ResetShowError(ArkUIRuntimeCallInfo *runtimeCallInfo)
924 {
925     EcmaVM *vm = runtimeCallInfo->GetVM();
926     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
927     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
928     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
929     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
930     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowError(nativeNode);
931     return panda::JSValueRef::Undefined(vm);
932 }
933 
SetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)934 ArkUINativeModuleValue TextInputBridge::SetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
935 {
936     EcmaVM *vm = runtimeCallInfo->GetVM();
937     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
938     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
939     Local<JSValueRef> jsSize = runtimeCallInfo->GetCallArgRef(1);
940     Local<JSValueRef> jsWeight = runtimeCallInfo->GetCallArgRef(2);
941     Local<JSValueRef> jsFamily = runtimeCallInfo->GetCallArgRef(3);
942     Local<JSValueRef> jsStyle = runtimeCallInfo->GetCallArgRef(4);
943     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
944     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
945     ArkUILengthType length{ nullptr, DEFAULT_FONT_SIZE, static_cast<int8_t>(DimensionUnit::FP) };
946     CalcDimension size(DEFAULT_FONT_SIZE, DimensionUnit::FP);
947     RefPtr<ResourceObject> fontSizeObject;
948     if (!ArkTSUtils::ParseJsDimensionFp(vm, jsSize, size, fontSizeObject) || size.Unit() == DimensionUnit::PERCENT) {
949         auto theme = ArkTSUtils::GetTheme<TextFieldTheme>();
950         if (theme != nullptr) {
951             size = theme->GetFontSize();
952         }
953     }
954     length.unit = static_cast<int8_t>(size.Unit());
955     if (size.CalcValue() != "") {
956         length.string = size.CalcValue().c_str();
957     } else {
958         length.number = size.Value();
959     }
960 
961     std::string weight = DEFAULT_FONT_WEIGHT;
962     if (!jsWeight->IsNull()) {
963         if (jsWeight->IsString(vm)) {
964             weight = jsWeight->ToString(vm)->ToString(vm);
965         }
966         if (jsWeight->IsNumber()) {
967             weight = std::to_string(jsWeight->Int32Value(vm));
968         }
969     }
970 
971     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
972     if (jsStyle->IsNumber()) {
973         style = jsStyle->ToNumber(vm)->Value();
974     }
975 
976     struct ArkUIPlaceholderFontType placeholderFont;
977     placeholderFont.size = &length;
978     placeholderFont.weight = weight.c_str();
979     placeholderFont.style = style;
980     std::vector<std::string> fontFamilies;
981     RefPtr<ResourceObject> fontFamiliesObj;
982     bool isSuccess = !ArkTSUtils::ParseJsFontFamilies(vm, jsFamily, fontFamilies, fontFamiliesObj);
983     auto families = std::make_unique<char* []>(fontFamilies.size());
984     if (isSuccess) {
985         placeholderFont.fontFamilies = nullptr;
986         placeholderFont.length = 0;
987     } else {
988         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
989             families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
990         }
991         placeholderFont.fontFamilies = const_cast<const char**>(families.get());
992         placeholderFont.length = fontFamilies.size();
993     }
994 
995     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderFont(
996         nativeNode, &placeholderFont, AceType::RawPtr(fontSizeObject), AceType::RawPtr(fontFamiliesObj));
997     return panda::JSValueRef::Undefined(vm);
998 }
999 
ResetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1000 ArkUINativeModuleValue TextInputBridge::ResetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
1001 {
1002     EcmaVM *vm = runtimeCallInfo->GetVM();
1003     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1004     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1005     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1006     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1007     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPlaceholderFont(nativeNode);
1008     return panda::JSValueRef::Undefined(vm);
1009 }
1010 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1011 ArkUINativeModuleValue TextInputBridge::SetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1012 {
1013     EcmaVM *vm = runtimeCallInfo->GetVM();
1014     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1015     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1016     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1017     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1018     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1019     Color color;
1020     RefPtr<ResourceObject> resourceObject;
1021     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1022     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
1023         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontColor(nativeNode);
1024     } else {
1025         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontColor(
1026             nativeNode, color.GetValue(), AceType::RawPtr(resourceObject));
1027     }
1028     return panda::JSValueRef::Undefined(vm);
1029 }
1030 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1031 ArkUINativeModuleValue TextInputBridge::ResetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1032 {
1033     EcmaVM *vm = runtimeCallInfo->GetVM();
1034     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1035     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1036     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1037     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1038     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontColor(nativeNode);
1039     return panda::JSValueRef::Undefined(vm);
1040 }
1041 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1042 ArkUINativeModuleValue TextInputBridge::SetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
1043 {
1044     EcmaVM *vm = runtimeCallInfo->GetVM();
1045     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1046     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1047     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1048     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     if (secondArg->IsNumber()) {
1051         uint32_t fontStyle = secondArg->Uint32Value(vm);
1052         if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
1053             fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
1054             fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
1055         }
1056         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontStyle(nativeNode, fontStyle);
1057     } else {
1058         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontStyle(nativeNode);
1059     }
1060     return panda::JSValueRef::Undefined(vm);
1061 }
1062 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1063 ArkUINativeModuleValue TextInputBridge::ResetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
1064 {
1065     EcmaVM *vm = runtimeCallInfo->GetVM();
1066     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1067     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1068     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1069     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1070     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontStyle(nativeNode);
1071     return panda::JSValueRef::Undefined(vm);
1072 }
1073 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)1074 ArkUINativeModuleValue TextInputBridge::SetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
1075 {
1076     EcmaVM *vm = runtimeCallInfo->GetVM();
1077     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1078     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1079     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1080     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1081     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1082 
1083     std::vector<std::string> fontFamilies;
1084     RefPtr<ResourceObject> resourceObject;
1085     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies, resourceObject)) {
1086         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFamily(nativeNode);
1087     } else {
1088         auto families = std::make_unique<char* []>(fontFamilies.size());
1089         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
1090             families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
1091         }
1092         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontFamily(nativeNode,
1093             const_cast<const char**>(families.get()), fontFamilies.size(), AceType::RawPtr(resourceObject));
1094     }
1095     return panda::JSValueRef::Undefined(vm);
1096 }
1097 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)1098 ArkUINativeModuleValue TextInputBridge::ResetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
1099 {
1100     EcmaVM *vm = runtimeCallInfo->GetVM();
1101     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1102     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1103     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1104     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1105     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFamily(nativeNode);
1106     return panda::JSValueRef::Undefined(vm);
1107 }
1108 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1109 ArkUINativeModuleValue TextInputBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1110 {
1111     EcmaVM* vm = runtimeCallInfo->GetVM();
1112     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1113     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1114     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1115     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1116     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1117     if (secondArg->IsString(vm)) {
1118         auto value = secondArg->ToString(vm)->ToString(vm);
1119         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFontFeature(nativeNode, value.c_str());
1120     } else {
1121         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFeature(nativeNode);
1122     }
1123     return panda::JSValueRef::Undefined(vm);
1124 }
1125 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1126 ArkUINativeModuleValue TextInputBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1127 {
1128     EcmaVM* vm = runtimeCallInfo->GetVM();
1129     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1130     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1131     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1132     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1133     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFontFeature(nativeNode);
1134     return panda::JSValueRef::Undefined(vm);
1135 }
1136 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)1137 ArkUINativeModuleValue TextInputBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1138 {
1139     EcmaVM* vm = runtimeCallInfo->GetVM();
1140     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1141     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1142     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1); // 1: textInputDecoration value
1143     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);  // 2: color value
1144     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1145     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1146     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1147     auto container = Container::Current();
1148     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
1149     auto pipelineContext = container->GetPipelineContext();
1150     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1151     auto themeManager = pipelineContext->GetThemeManager();
1152     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
1153     auto theme = themeManager->GetTheme<TextFieldTheme>();
1154     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
1155     Color color = theme->GetTextStyle().GetTextDecorationColor();
1156     int32_t textInputDecoration = static_cast<int32_t>(theme->GetTextDecoration());
1157     if (secondArg->IsInt()) {
1158         textInputDecoration = secondArg->Int32Value(vm);
1159     }
1160     RefPtr<ResourceObject> resourceObject;
1161     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1162     ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, Color::BLACK, resourceObject, nodeInfo);
1163     int32_t textDecorationStyle = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
1164     if (fourthArg->IsInt()) {
1165         textDecorationStyle = fourthArg->Int32Value(vm);
1166     }
1167     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputDecoration(
1168         nativeNode, textInputDecoration, color.GetValue(), textDecorationStyle, AceType::RawPtr(resourceObject));
1169     return panda::JSValueRef::Undefined(vm);
1170 }
1171 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)1172 ArkUINativeModuleValue TextInputBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
1173 {
1174     EcmaVM* vm = runtimeCallInfo->GetVM();
1175     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1176     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1177     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1178     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1179     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputDecoration(nativeNode);
1180     return panda::JSValueRef::Undefined(vm);
1181 }
1182 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1183 ArkUINativeModuleValue TextInputBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1184 {
1185     EcmaVM* vm = runtimeCallInfo->GetVM();
1186     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1187     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1188     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1189     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1190     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1191     CalcDimension value;
1192     RefPtr<ResourceObject> resourceObject;
1193     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, resourceObject, false)) {
1194         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLetterSpacing(nativeNode);
1195     } else {
1196         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLetterSpacing(
1197             nativeNode, value.Value(), static_cast<int>(value.Unit()), AceType::RawPtr(resourceObject));
1198     }
1199     return panda::JSValueRef::Undefined(vm);
1200 }
1201 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1202 ArkUINativeModuleValue TextInputBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1203 {
1204     EcmaVM* vm = runtimeCallInfo->GetVM();
1205     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1206     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1207     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1208     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1209     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLetterSpacing(nativeNode);
1210     return panda::JSValueRef::Undefined(vm);
1211 }
1212 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)1213 ArkUINativeModuleValue TextInputBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
1214 {
1215     EcmaVM* vm = runtimeCallInfo->GetVM();
1216     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1218     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1219     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1220     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1221     CalcDimension value;
1222     RefPtr<ResourceObject> resourceObject;
1223     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, resourceObject, true)) {
1224         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineHeight(nativeNode);
1225     } else {
1226         if (value.IsNegative()) {
1227             value.Reset();
1228         }
1229         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLineHeight(
1230             nativeNode, value.Value(), static_cast<int>(value.Unit()), AceType::RawPtr(resourceObject));
1231     }
1232     return panda::JSValueRef::Undefined(vm);
1233 }
1234 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)1235 ArkUINativeModuleValue TextInputBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
1236 {
1237     EcmaVM* vm = runtimeCallInfo->GetVM();
1238     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1239     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1240     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1241     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1242     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineHeight(nativeNode);
1243     return panda::JSValueRef::Undefined(vm);
1244 }
1245 
SetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1246 ArkUINativeModuleValue TextInputBridge::SetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1247 {
1248     EcmaVM* vm = runtimeCallInfo->GetVM();
1249     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1250     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1251     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1252     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1253     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1254     if (secondArg->IsBoolean()) {
1255         uint32_t halfLeading = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1256         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputHalfLeading(nativeNode, halfLeading);
1257     } else {
1258         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputHalfLeading(nativeNode);
1259     }
1260     return panda::JSValueRef::Undefined(vm);
1261 }
1262 
ResetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1263 ArkUINativeModuleValue TextInputBridge::ResetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1264 {
1265     EcmaVM* vm = runtimeCallInfo->GetVM();
1266     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1267     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1268     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1269     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1270     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputHalfLeading(nativeNode);
1271     return panda::JSValueRef::Undefined(vm);
1272 }
1273 
SetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1274 ArkUINativeModuleValue TextInputBridge::SetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1275 {
1276     EcmaVM* vm = runtimeCallInfo->GetVM();
1277     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1278     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1279     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1280     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1281     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1282     if (secondArg->IsNumber()) {
1283         uint32_t keyboardAppearance = secondArg->Uint32Value(vm);
1284         if (keyboardAppearance >= static_cast<uint32_t>(KeyboardAppearance::NONE_IMMERSIVE) &&
1285             keyboardAppearance <= static_cast<uint32_t>(KeyboardAppearance::DARK_IMMERSIVE)) {
1286             GetArkUINodeModifiers()->getTextInputModifier()->
1287                 setTextInputKeyboardAppearance(nativeNode, keyboardAppearance); // when input is valid
1288             return panda::JSValueRef::Undefined(vm);
1289         }
1290     }
1291     GetArkUINodeModifiers()->getTextInputModifier()->
1292         setTextInputKeyboardAppearance(nativeNode, static_cast<int32_t>(KeyboardAppearance::NONE_IMMERSIVE));
1293     return panda::JSValueRef::Undefined(vm);
1294 }
1295 
ResetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1296 ArkUINativeModuleValue TextInputBridge::ResetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1297 {
1298     EcmaVM* vm = runtimeCallInfo->GetVM();
1299     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1301     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1302     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1303     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputKeyboardAppearance(nativeNode);
1304     return panda::JSValueRef::Undefined(vm);
1305 }
1306 
SetUnderlineColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1307 ArkUINativeModuleValue TextInputBridge::SetUnderlineColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1308 {
1309     EcmaVM *vm = runtimeCallInfo->GetVM();
1310     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1311     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1312     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1313     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1314     Local<JSValueRef> underlineColorArg = runtimeCallInfo->GetCallArgRef(1);  // 1: underlineColor value
1315     Local<JSValueRef> normalArg = runtimeCallInfo->GetCallArgRef(2);  // 2: normal value
1316     Local<JSValueRef> typingArg = runtimeCallInfo->GetCallArgRef(3);   // 3: typing value
1317     Local<JSValueRef> errorArg = runtimeCallInfo->GetCallArgRef(4); // 4: error value
1318     Local<JSValueRef> disableArg = runtimeCallInfo->GetCallArgRef(5); // 5: disable value
1319     Color underlineColor;
1320     RefPtr<ResourceObject> normalObject;
1321     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
1322     if (!underlineColorArg->IsUndefined() &&
1323         ArkTSUtils::ParseJsColorAlpha(vm, underlineColorArg, underlineColor, normalObject, nodeInfo)) {
1324         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputNormalUnderlineColor(
1325             nativeNode, underlineColor.GetValue(), AceType::RawPtr(normalObject));
1326     } else if (!normalArg->IsUndefined() || !typingArg->IsUndefined() ||
1327          !errorArg->IsUndefined() || !disableArg->IsUndefined()) {
1328         UserUnderlineColor userColor = UserUnderlineColor();
1329         Color typingColor;
1330         RefPtr<ResourceObject> typingObject;
1331         if (ArkTSUtils::ParseJsColorAlpha(vm, typingArg, typingColor, typingObject, nodeInfo)) {
1332             userColor.typing = typingColor;
1333         }
1334         Color normalColor;
1335         if (ArkTSUtils::ParseJsColorAlpha(vm, normalArg, normalColor, normalObject, nodeInfo)) {
1336             userColor.normal = normalColor;
1337         }
1338         Color errorColor;
1339         RefPtr<ResourceObject> errorObject;
1340         if (ArkTSUtils::ParseJsColorAlpha(vm, errorArg, errorColor, errorObject, nodeInfo)) {
1341             userColor.error = errorColor;
1342         }
1343         Color disableColor;
1344         RefPtr<ResourceObject> disableObject;
1345         if (ArkTSUtils::ParseJsColorAlpha(vm, disableArg, disableColor, disableObject, nodeInfo)) {
1346             userColor.disable = disableColor;
1347         }
1348         ArkUI_Uint32 values[ARG_GROUP_LENGTH];
1349         ArkUI_Bool hasValues[ARG_GROUP_LENGTH];
1350         prepareUnderlineColorValues(values, hasValues, userColor, ARG_GROUP_LENGTH);
1351         ArkUIUserUnderlineColorRes resObj;
1352         resObj.typingColorObj = AceType::RawPtr(typingObject);
1353         resObj.normalColorObj = AceType::RawPtr(normalObject);
1354         resObj.errorColorObj = AceType::RawPtr(errorObject);
1355         resObj.disableColorObj = AceType::RawPtr(disableObject);
1356         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputUserUnderlineColor(
1357             nativeNode, values, hasValues, ARG_GROUP_LENGTH, &resObj);
1358     } else {
1359         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputUserUnderlineColor(nativeNode);
1360     }
1361     return panda::JSValueRef::Undefined(vm);
1362 }
1363 
ResetUnderlineColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1364 ArkUINativeModuleValue TextInputBridge::ResetUnderlineColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1365 {
1366     EcmaVM *vm = runtimeCallInfo->GetVM();
1367     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1369     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1370     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1371     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputUserUnderlineColor(nativeNode);
1372     return panda::JSValueRef::Undefined(vm);
1373 }
1374 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1375 ArkUINativeModuleValue TextInputBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1376 {
1377     EcmaVM* vm = runtimeCallInfo->GetVM();
1378     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1379     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1380     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1381     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1382     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1383     CalcDimension value;
1384     auto pipelineContext = PipelineBase::GetCurrentContext();
1385     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1386     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
1387     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
1388     RefPtr<ResourceObject> resourceObject;
1389     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, resourceObject, false)) {
1390         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMinFontSize(nativeNode);
1391     } else {
1392         if (value.IsNegative()) {
1393             value = theme->GetTextStyle().GetAdaptMinFontSize();
1394         }
1395         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputAdaptMinFontSize(
1396             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()), AceType::RawPtr(resourceObject));
1397     }
1398     return panda::JSValueRef::Undefined(vm);
1399 }
1400 
ResetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1401 ArkUINativeModuleValue TextInputBridge::ResetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1402 {
1403     EcmaVM* vm = runtimeCallInfo->GetVM();
1404     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1405     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1406     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1407     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1408     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMinFontSize(nativeNode);
1409     return panda::JSValueRef::Undefined(vm);
1410 }
1411 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1412 ArkUINativeModuleValue TextInputBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1413 {
1414     EcmaVM* vm = runtimeCallInfo->GetVM();
1415     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1416     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1417     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1418     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1419     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1420     CalcDimension value;
1421     auto pipelineContext = PipelineBase::GetCurrentContext();
1422     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1423     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
1424     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
1425     RefPtr<ResourceObject> resourceObject;
1426     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, resourceObject, false)) {
1427         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMaxFontSize(nativeNode);
1428     } else {
1429         if (value.IsNegative()) {
1430             value = theme->GetTextStyle().GetAdaptMaxFontSize();
1431         }
1432         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputAdaptMaxFontSize(
1433             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()), AceType::RawPtr(resourceObject));
1434     }
1435     return panda::JSValueRef::Undefined(vm);
1436 }
1437 
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)1438 ArkUINativeModuleValue TextInputBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
1439 {
1440     EcmaVM* vm = runtimeCallInfo->GetVM();
1441     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1442     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1443     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1444     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1445     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1446     double minFontScale;
1447     RefPtr<ResourceObject> resourceObject;
1448     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale, resourceObject)) {
1449         return panda::JSValueRef::Undefined(vm);
1450     }
1451     if (LessOrEqual(minFontScale, 0.0f)) {
1452         minFontScale = 0.0f;
1453     } else if (GreatOrEqual(minFontScale, 1.0f)) {
1454         minFontScale = 1.0f;
1455     }
1456     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMinFontScale(
1457         nativeNode, static_cast<float>(minFontScale), AceType::RawPtr(resourceObject));
1458     return panda::JSValueRef::Undefined(vm);
1459 }
1460 
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)1461 ArkUINativeModuleValue TextInputBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
1462 {
1463     EcmaVM* vm = runtimeCallInfo->GetVM();
1464     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1465     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1466     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1467     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1468     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMinFontScale(nativeNode);
1469     return panda::JSValueRef::Undefined(vm);
1470 }
1471 
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)1472 ArkUINativeModuleValue TextInputBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
1473 {
1474     EcmaVM* vm = runtimeCallInfo->GetVM();
1475     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1476     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1477     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1478     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1479     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1480     double maxFontScale;
1481     RefPtr<ResourceObject> resourceObject;
1482     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale, resourceObject)) {
1483         return panda::JSValueRef::Undefined(vm);
1484     }
1485     if (LessOrEqual(maxFontScale, 1.0f)) {
1486         maxFontScale = 1.0f;
1487     }
1488     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMaxFontScale(
1489         nativeNode, static_cast<float>(maxFontScale), AceType::RawPtr(resourceObject));
1490     return panda::JSValueRef::Undefined(vm);
1491 }
1492 
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)1493 ArkUINativeModuleValue TextInputBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
1494 {
1495     EcmaVM* vm = runtimeCallInfo->GetVM();
1496     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1497     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1498     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1499     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1500     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMaxFontScale(nativeNode);
1501     return panda::JSValueRef::Undefined(vm);
1502 }
1503 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1504 ArkUINativeModuleValue TextInputBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1505 {
1506     EcmaVM* vm = runtimeCallInfo->GetVM();
1507     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1508     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1509     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(1);
1510     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1511     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1512     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
1513         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWordBreak(nativeNode);
1514         return panda::JSValueRef::Undefined(vm);
1515     }
1516     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
1517     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputWordBreak(nativeNode, wordBreak);
1518     return panda::JSValueRef::Undefined(vm);
1519 }
1520 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1521 ArkUINativeModuleValue TextInputBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1522 {
1523     EcmaVM* vm = runtimeCallInfo->GetVM();
1524     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1525     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1526     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1527     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1528     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWordBreak(nativeNode);
1529     return panda::JSValueRef::Undefined(vm);
1530 }
1531 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1532 ArkUINativeModuleValue TextInputBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1533 {
1534     EcmaVM* vm = runtimeCallInfo->GetVM();
1535     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1536     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1537     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(1);
1538     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1539     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1540     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
1541         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineBreakStrategy(nativeNode);
1542         return panda::JSValueRef::Undefined(vm);
1543     }
1544     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
1545     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputLineBreakStrategy(nativeNode, lineBreakStrategy);
1546     return panda::JSValueRef::Undefined(vm);
1547 }
1548 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1549 ArkUINativeModuleValue TextInputBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1550 {
1551     EcmaVM* vm = runtimeCallInfo->GetVM();
1552     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1553     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1554     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1555     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1556     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputLineBreakStrategy(nativeNode);
1557     return panda::JSValueRef::Undefined(vm);
1558 }
1559 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1560 ArkUINativeModuleValue TextInputBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1561 {
1562     EcmaVM* vm = runtimeCallInfo->GetVM();
1563     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1564     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1565     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1566     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1567     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputAdaptMaxFontSize(nativeNode);
1568     return panda::JSValueRef::Undefined(vm);
1569 }
1570 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1571 ArkUINativeModuleValue TextInputBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1572 {
1573     EcmaVM* vm = runtimeCallInfo->GetVM();
1574     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1575     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1576     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1577     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1578     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
1579     int32_t value = valueArg->ToNumber(vm)->Value();
1580     if (value < 0 || value >= static_cast<int32_t>(HEIGHT_ADAPTIVE_POLICY.size())) {
1581         value = 0;
1582     }
1583     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputHeightAdaptivePolicy(nativeNode, value);
1584     return panda::JSValueRef::Undefined(vm);
1585 }
1586 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1587 ArkUINativeModuleValue TextInputBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1588 {
1589     EcmaVM* vm = runtimeCallInfo->GetVM();
1590     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1591     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1592     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1593     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1594     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputHeightAdaptivePolicy(nativeNode);
1595     return panda::JSValueRef::Undefined(vm);
1596 }
1597 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1598 ArkUINativeModuleValue TextInputBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1599 {
1600     EcmaVM* vm = runtimeCallInfo->GetVM();
1601     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1602     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1603     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1604     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1605     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1606     int32_t value;
1607     if (secondArg->IsUndefined()) {
1608         value = DEFAULT_OVERFLOW;
1609     } else if (secondArg->IsNumber()) {
1610         value = secondArg->Int32Value(vm);
1611     } else {
1612         value = DEFAULT_OVERFLOW;
1613     }
1614     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
1615         value = DEFAULT_OVERFLOW;
1616     }
1617     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextOverflow(nativeNode, value);
1618     return panda::JSValueRef::Undefined(vm);
1619 }
1620 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1621 ArkUINativeModuleValue TextInputBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1622 {
1623     EcmaVM* vm = runtimeCallInfo->GetVM();
1624     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1625     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1626     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1627     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1628     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextOverflow(nativeNode);
1629     return panda::JSValueRef::Undefined(vm);
1630 }
1631 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1632 ArkUINativeModuleValue TextInputBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1633 {
1634     EcmaVM* vm = runtimeCallInfo->GetVM();
1635     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1636     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1637     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1638     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1639     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1640     CalcDimension indent;
1641     RefPtr<ResourceObject> resourceObject;
1642     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, indent, DimensionUnit::VP, resourceObject, true)) {
1643         indent.Reset();
1644     }
1645 
1646     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextIndent(
1647         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()), AceType::RawPtr(resourceObject));
1648     return panda::JSValueRef::Undefined(vm);
1649 }
1650 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1651 ArkUINativeModuleValue TextInputBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1652 {
1653     EcmaVM* vm = runtimeCallInfo->GetVM();
1654     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1655     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1656     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1657     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1658     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputTextIndent(nativeNode);
1659     return panda::JSValueRef::Undefined(vm);
1660 }
1661 
ConvertStrToCancelButtonStyle(const std::string & value)1662 static CancelButtonStyle ConvertStrToCancelButtonStyle(const std::string& value)
1663 {
1664     if (value == "CONSTANT") {
1665         return CancelButtonStyle::CONSTANT;
1666     } else if (value == "INVISIBLE") {
1667         return CancelButtonStyle::INVISIBLE;
1668     } else {
1669         return CancelButtonStyle::INPUT;
1670     }
1671 }
1672 
SetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)1673 ArkUINativeModuleValue TextInputBridge::SetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
1674 {
1675     EcmaVM* vm = runtimeCallInfo->GetVM();
1676     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1677     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1678     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1679 
1680     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1681     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1682     auto container = Container::Current();
1683     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
1684     auto pipelineContext = container->GetPipelineContext();
1685     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1686     auto themeManager = pipelineContext->GetThemeManager();
1687     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
1688     auto theme = themeManager->GetTheme<TextFieldTheme>();
1689     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
1690 
1691     int32_t style = static_cast<int32_t>(theme->GetCancelButtonStyle());
1692     if (styleArg->IsString(vm)) {
1693         CancelButtonStyle cancelButtonStyle = ConvertStrToCancelButtonStyle(styleArg->ToString(vm)->ToString(vm));
1694         style = static_cast<int32_t>(cancelButtonStyle);
1695     }
1696 
1697     auto info = Framework::JsiCallbackInfo(runtimeCallInfo);
1698     auto iconJsVal = Framework::JsiRef<Framework::JsiValue>::Cast(info[CALL_ARG_2]);
1699     // set default icon
1700     if (iconJsVal->IsUndefined() || iconJsVal->IsNull() || !iconJsVal->IsObject()) {
1701         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCancelSymbolIcon(nativeNode,
1702             style, nullptr);
1703         return panda::JSValueRef::Undefined(vm);
1704     }
1705 
1706     auto iconParam = Framework::JsiRef<Framework::JsiObject>::Cast(iconJsVal);
1707     bool isSymbolIcon = iconParam->HasProperty("fontColor"); // only SymbolGlyph has fontColor property
1708     if (isSymbolIcon) {
1709         std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
1710         Framework::JSViewAbstract::SetSymbolOptionApply(runtimeCallInfo, iconSymbol, iconParam);
1711         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCancelSymbolIcon(nativeNode,
1712             style, reinterpret_cast<void*>(&iconSymbol));
1713         return panda::JSValueRef::Undefined(vm);
1714     }
1715 
1716     SetCancelButtonImage(runtimeCallInfo, style);
1717     return panda::JSValueRef::Undefined(vm);
1718 }
1719 
SetCancelButtonImage(ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t style)1720 void TextInputBridge::SetCancelButtonImage(ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t style)
1721 {
1722     EcmaVM* vm = runtimeCallInfo->GetVM();
1723     CHECK_NULL_VOID(vm);
1724     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1725     CHECK_NULL_VOID(firstArg->IsNativePointer(vm));
1726     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1727     auto container = Container::Current();
1728     CHECK_NULL_VOID(container);
1729     auto pipelineContext = container->GetPipelineContext();
1730     CHECK_NULL_VOID(pipelineContext);
1731     auto themeManager = pipelineContext->GetThemeManager();
1732     CHECK_NULL_VOID(themeManager);
1733     auto theme = themeManager->GetTheme<TextFieldTheme>();
1734     CHECK_NULL_VOID(theme);
1735 
1736     auto info = Framework::JsiCallbackInfo(runtimeCallInfo);
1737     auto iconJsVal = Framework::JsiRef<Framework::JsiValue>::Cast(info[CALL_ARG_2]);
1738     auto iconParam = Framework::JsiRef<Framework::JsiObject>::Cast(iconJsVal);
1739     auto sizeArg = iconParam->GetProperty("size");
1740     auto colorArg = iconParam->GetProperty("color");
1741     auto srcArg = iconParam->GetProperty("src");
1742 
1743     CalcDimension iconSize;
1744     RefPtr<ResourceObject> sizeObject;
1745     if (!sizeArg->IsUndefined() && !sizeArg->IsNull() &&
1746         Framework::JSViewAbstract::ParseJsDimensionVpNG(sizeArg, iconSize, sizeObject, false)) {
1747         if (LessNotEqual(iconSize.Value(), 0.0) || iconSize.Unit() == DimensionUnit::PERCENT) {
1748             iconSize = theme->GetCancelIconSize();
1749         }
1750     } else {
1751         iconSize = theme->GetCancelIconSize();
1752     }
1753 
1754     Color value;
1755     uint32_t color;
1756     RefPtr<ResourceObject> colorObject;
1757     if (!colorArg->IsUndefined() && !colorArg->IsNull() &&
1758         Framework::JSViewAbstract::ParseJsColor(colorArg, value, colorObject)) {
1759         color = value.GetValue();
1760     } else {
1761         color = theme->GetCancelButtonIconColor().GetValue();
1762     }
1763 
1764     std::string srcStr;
1765     RefPtr<ResourceObject> srcObject;
1766     if (srcArg->IsUndefined() || srcArg->IsNull() ||
1767         !Framework::JSViewAbstract::ParseJsMedia(srcArg, srcStr, srcObject)) {
1768         srcStr = "";
1769     }
1770 
1771     struct ArkUISizeType size = { iconSize.Value(), static_cast<int8_t>(iconSize.Unit()), nullptr };
1772     ArkUIImageIconRes cancelButtonImageObj;
1773     cancelButtonImageObj.sizeObj = AceType::RawPtr(sizeObject);
1774     cancelButtonImageObj.colorObj = AceType::RawPtr(colorObject);
1775     cancelButtonImageObj.srcObj = AceType::RawPtr(srcObject);
1776     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputCancelButton(nativeNode,
1777         style, &size, color, srcStr.c_str(), &cancelButtonImageObj);
1778 }
1779 
ResetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)1780 ArkUINativeModuleValue TextInputBridge::ResetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
1781 {
1782     EcmaVM* vm = runtimeCallInfo->GetVM();
1783     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1784     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1785     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1786     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1787     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputCancelButton(nativeNode);
1788     return panda::JSValueRef::Undefined(vm);
1789 }
1790 
SetSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)1791 ArkUINativeModuleValue TextInputBridge::SetSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1792 {
1793     EcmaVM* vm = runtimeCallInfo->GetVM();
1794     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1795     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1796     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1797 
1798     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1799     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1800     if (secondArg->IsBoolean()) {
1801         uint32_t enableSelectAll = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1802         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectAll(nativeNode, enableSelectAll);
1803     } else {
1804         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectAll(nativeNode);
1805     }
1806     return panda::JSValueRef::Undefined(vm);
1807 }
1808 
ResetSelectAll(ArkUIRuntimeCallInfo * runtimeCallInfo)1809 ArkUINativeModuleValue TextInputBridge::ResetSelectAll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1810 {
1811     EcmaVM* vm = runtimeCallInfo->GetVM();
1812     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1813     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1814     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1815     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1816     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectAll(nativeNode);
1817     return panda::JSValueRef::Undefined(vm);
1818 }
1819 
SetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1820 ArkUINativeModuleValue TextInputBridge::SetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1821 {
1822     EcmaVM *vm = runtimeCallInfo->GetVM();
1823     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1824     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1825     Local<JSValueRef> showCounterArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1826     Local<JSValueRef> highlightBorderArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1827     Local<JSValueRef> thresholdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
1828     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1829     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1830     auto showCounter = false;
1831     if (showCounterArg->IsBoolean()) {
1832         showCounter = showCounterArg->BooleaValue(vm);
1833     }
1834     auto highlightBorder = true;
1835     if (highlightBorderArg->IsBoolean()) {
1836         highlightBorder = highlightBorderArg->BooleaValue(vm);
1837     }
1838     int32_t thresholdValue = DEFAULT_MODE;
1839     if (thresholdArg->IsNumber()) {
1840         thresholdValue = thresholdArg->Int32Value(vm);
1841         if (thresholdValue < MINI_VALID_VALUE || thresholdValue > MAX_VALID_VALUE) {
1842             thresholdValue = ILLEGAL_VALUE;
1843             showCounter = false;
1844         }
1845     }
1846     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputShowCounter(
1847         nativeNode, static_cast<uint32_t>(showCounter), thresholdValue, static_cast<uint32_t>(highlightBorder));
1848     return panda::JSValueRef::Undefined(vm);
1849 }
1850 
ResetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1851 ArkUINativeModuleValue TextInputBridge::ResetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1852 {
1853     EcmaVM* vm = runtimeCallInfo->GetVM();
1854     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1855     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1856     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1857     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1858     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputShowCounter(nativeNode);
1859     return panda::JSValueRef::Undefined(vm);
1860 }
1861 
SetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1862 ArkUINativeModuleValue TextInputBridge::SetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1863 {
1864     EcmaVM *vm = runtimeCallInfo->GetVM();
1865     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1866     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1867     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1868     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1869     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1870     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1871     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1872     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1873         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnEditChange(nativeNode);
1874         return panda::JSValueRef::Undefined(vm);
1875     }
1876     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1877     std::function<void(bool)> callback = [vm, frameNode,
1878         func = panda::CopyableGlobal(vm, func)](bool isInEditStatus) {
1879         panda::LocalScope pandaScope(vm);
1880         panda::TryCatch trycatch(vm);
1881         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1882         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1883             panda::BooleanRef::New(vm, isInEditStatus) };
1884         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1885     };
1886     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnEditChange(
1887         nativeNode, reinterpret_cast<void*>(&callback));
1888     return panda::JSValueRef::Undefined(vm);
1889 }
1890 
ResetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1891 ArkUINativeModuleValue TextInputBridge::ResetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1892 {
1893     EcmaVM* vm = runtimeCallInfo->GetVM();
1894     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1895     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1896     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1897     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1898     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnEditChange(nativeNode);
1899     return panda::JSValueRef::Undefined(vm);
1900 }
1901 
SetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1902 ArkUINativeModuleValue TextInputBridge::SetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1903 {
1904     EcmaVM *vm = runtimeCallInfo->GetVM();
1905     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1906     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1907     Local<JSValueRef> inputFilterArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1908     Local<JSValueRef> errorCallbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1909     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1910     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1911     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1912     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1913     if (inputFilterArg->IsUndefined() || inputFilterArg->IsNull() || !inputFilterArg->IsString(vm)) {
1914         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFilter(nativeNode);
1915         return panda::JSValueRef::Undefined(vm);
1916     }
1917     std::string inputFilter = inputFilterArg->ToString(vm)->ToString(vm);
1918     if (errorCallbackArg->IsUndefined() || errorCallbackArg->IsNull() ||
1919         !errorCallbackArg->IsFunction(vm)) {
1920         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputFilter(nativeNode, inputFilter.c_str(), nullptr);
1921     } else {
1922         panda::Local<panda::FunctionRef> func = errorCallbackArg->ToObject(vm);
1923         std::function<void(const std::u16string&)> callback = [vm, frameNode,
1924             func = panda::CopyableGlobal(vm, func)](const std::u16string& info) {
1925             panda::LocalScope pandaScope(vm);
1926             panda::TryCatch trycatch(vm);
1927             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1928             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1929                 panda::StringRef::NewFromUtf16(vm, info.c_str()) };
1930             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1931         };
1932         GetArkUINodeModifiers()->getTextInputModifier()->
1933             setTextInputFilter(nativeNode, inputFilter.c_str(), reinterpret_cast<void*>(&callback));
1934     }
1935     return panda::JSValueRef::Undefined(vm);
1936 }
1937 
ResetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1938 ArkUINativeModuleValue TextInputBridge::ResetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1939 {
1940     EcmaVM* vm = runtimeCallInfo->GetVM();
1941     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1942     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1943     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1944     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1945     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputFilter(nativeNode);
1946     return panda::JSValueRef::Undefined(vm);
1947 }
1948 
SetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1949 ArkUINativeModuleValue TextInputBridge::SetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1950 {
1951     EcmaVM *vm = runtimeCallInfo->GetVM();
1952     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1953     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1954     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1955     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1956     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1957     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1958     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1959     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1960         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnSubmitWithEvent(nativeNode);
1961         return panda::JSValueRef::Undefined(vm);
1962     }
1963     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1964     std::function<void(int32_t, NG::TextFieldCommonEvent&)> callback = [vm, frameNode,
1965         func = panda::CopyableGlobal(vm, func)](int32_t key, NG::TextFieldCommonEvent& event) {
1966         panda::LocalScope pandaScope(vm);
1967         panda::TryCatch trycatch(vm);
1968         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1969         const char* keys[] = { "text", "keepEditableState" };
1970         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf16(vm, event.GetText().c_str()),
1971             panda::FunctionRef::New(vm, Framework::JSTextField::JsKeepEditableState) };
1972         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1973         eventObject->SetNativePointerFieldCount(vm, 1);
1974         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
1975         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1976             panda::IntegerRef::New(vm, key), eventObject };
1977         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1978     };
1979     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnSubmitWithEvent(
1980         nativeNode, reinterpret_cast<void*>(&callback));
1981     return panda::JSValueRef::Undefined(vm);
1982 }
1983 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1984 ArkUINativeModuleValue TextInputBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1985 {
1986     EcmaVM* vm = runtimeCallInfo->GetVM();
1987     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1988     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1989     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1990     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1991     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnSubmitWithEvent(nativeNode);
1992     return panda::JSValueRef::Undefined(vm);
1993 }
1994 
SetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1995 ArkUINativeModuleValue TextInputBridge::SetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1996 {
1997     EcmaVM *vm = runtimeCallInfo->GetVM();
1998     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1999     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2000     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2001     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2002     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2003     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2004     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2005     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2006         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnWillChange(nativeNode);
2007         return panda::JSValueRef::Undefined(vm);
2008     }
2009     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2010     std::function<bool(const ChangeValueInfo&)> callback = [vm, frameNode,
2011         func = panda::CopyableGlobal(vm, func)](const ChangeValueInfo& changeValueInfo) -> bool {
2012         panda::LocalScope pandaScope(vm);
2013         panda::TryCatch trycatch(vm);
2014         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2015         auto eventObject = CommonBridge::CreateChangeValueInfoObj(vm, changeValueInfo);
2016         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2017         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2018         if (ret->IsBoolean()) {
2019             return ret->ToBoolean(vm)->Value();
2020         }
2021         return true;
2022     };
2023     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnWillChange(nativeNode,
2024         reinterpret_cast<intptr_t>(&callback));
2025     return panda::JSValueRef::Undefined(vm);
2026 }
2027 
ResetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2028 ArkUINativeModuleValue TextInputBridge::ResetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2029 {
2030     EcmaVM* vm = runtimeCallInfo->GetVM();
2031     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2032     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2033     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2034     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2035     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnWillChange(nativeNode);
2036     return panda::JSValueRef::Undefined(vm);
2037 }
2038 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2039 ArkUINativeModuleValue TextInputBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2040 {
2041     EcmaVM *vm = runtimeCallInfo->GetVM();
2042     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2043     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2044     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2045     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2046     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2047     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2048     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2049     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2050         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnChange(nativeNode);
2051         return panda::JSValueRef::Undefined(vm);
2052     }
2053     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2054     std::function<void(const ChangeValueInfo&)> callback = [vm, frameNode,
2055         func = panda::CopyableGlobal(vm, func)](const ChangeValueInfo& changeValueInfo) {
2056         panda::LocalScope pandaScope(vm);
2057         panda::TryCatch trycatch(vm);
2058         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2059         auto eventObject = CommonBridge::CreateChangeValueInfoObj(vm, changeValueInfo);
2060         auto contentObj = eventObject->Get(vm, "content");
2061         auto previewTextObj = eventObject->Get(vm, "previewText");
2062         auto optionsObj = eventObject->Get(vm, "options");
2063         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_3] = { contentObj, previewTextObj, optionsObj };
2064         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_3);
2065     };
2066     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnChange(
2067         nativeNode, reinterpret_cast<void*>(&callback));
2068     return panda::JSValueRef::Undefined(vm);
2069 }
2070 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2071 ArkUINativeModuleValue TextInputBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2072 {
2073     EcmaVM* vm = runtimeCallInfo->GetVM();
2074     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2075     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2076     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2077     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2078     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnChange(nativeNode);
2079     return panda::JSValueRef::Undefined(vm);
2080 }
2081 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2082 ArkUINativeModuleValue TextInputBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2083 {
2084     EcmaVM *vm = runtimeCallInfo->GetVM();
2085     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2086     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2087     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2088     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2089     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2090     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2091     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2092     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2093         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnTextSelectionChange(nativeNode);
2094         return panda::JSValueRef::Undefined(vm);
2095     }
2096     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2097     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
2098         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int selectionEnd) {
2099         panda::LocalScope pandaScope(vm);
2100         panda::TryCatch trycatch(vm);
2101         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2102         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
2103         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
2104         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
2105         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
2106     };
2107     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnTextSelectionChange(
2108         nativeNode, reinterpret_cast<void*>(&callback));
2109     return panda::JSValueRef::Undefined(vm);
2110 }
2111 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2112 ArkUINativeModuleValue TextInputBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2113 {
2114     EcmaVM* vm = runtimeCallInfo->GetVM();
2115     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2116     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2117     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2118     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2119     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnTextSelectionChange(nativeNode);
2120     return panda::JSValueRef::Undefined(vm);
2121 }
2122 
SetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)2123 ArkUINativeModuleValue TextInputBridge::SetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
2124 {
2125     EcmaVM *vm = runtimeCallInfo->GetVM();
2126     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2127     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2128     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2129     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2130     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2131     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2132     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2133     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2134         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnContentScroll(nativeNode);
2135         return panda::JSValueRef::Undefined(vm);
2136     }
2137     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2138     std::function<void(float, float)> callback = [vm, frameNode,
2139         func = panda::CopyableGlobal(vm, func)](float totalOffsetX, float totalOffsetY) {
2140         panda::LocalScope pandaScope(vm);
2141         panda::TryCatch trycatch(vm);
2142         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2143         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
2144             panda::NumberRef::New(vm, totalOffsetX), panda::NumberRef::New(vm, totalOffsetY) };
2145         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
2146     };
2147     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnContentScroll(
2148         nativeNode, reinterpret_cast<void*>(&callback));
2149     return panda::JSValueRef::Undefined(vm);
2150 }
2151 
ResetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)2152 ArkUINativeModuleValue TextInputBridge::ResetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
2153 {
2154     EcmaVM* vm = runtimeCallInfo->GetVM();
2155     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2156     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2157     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2158     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2159     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnContentScroll(nativeNode);
2160     return panda::JSValueRef::Undefined(vm);
2161 }
2162 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)2163 ArkUINativeModuleValue TextInputBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
2164 {
2165     EcmaVM *vm = runtimeCallInfo->GetVM();
2166     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2167     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2168     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2169     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2170     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2171     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2172     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2173     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2174         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCopy(nativeNode);
2175         return panda::JSValueRef::Undefined(vm);
2176     }
2177     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2178     std::function<void(const std::u16string&)> callback = [vm, frameNode,
2179         func = panda::CopyableGlobal(vm, func)](const std::u16string& copyStr) {
2180         panda::LocalScope pandaScope(vm);
2181         panda::TryCatch trycatch(vm);
2182         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2183         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
2184             panda::StringRef::NewFromUtf16(vm, copyStr.c_str()) };
2185         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2186     };
2187     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
2188     return panda::JSValueRef::Undefined(vm);
2189 }
2190 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)2191 ArkUINativeModuleValue TextInputBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
2192 {
2193     EcmaVM* vm = runtimeCallInfo->GetVM();
2194     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2195     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2196     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2197     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2198     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCopy(nativeNode);
2199     return panda::JSValueRef::Undefined(vm);
2200 }
2201 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)2202 ArkUINativeModuleValue TextInputBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
2203 {
2204     EcmaVM *vm = runtimeCallInfo->GetVM();
2205     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2206     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2207     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2208     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2209     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2210     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2211     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2212     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2213         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCut(nativeNode);
2214         return panda::JSValueRef::Undefined(vm);
2215     }
2216     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2217     std::function<void(const std::u16string&)> callback = [vm, frameNode,
2218         func = panda::CopyableGlobal(vm, func)](const std::u16string& cutStr) {
2219         panda::LocalScope pandaScope(vm);
2220         panda::TryCatch trycatch(vm);
2221         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2222         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
2223             panda::StringRef::NewFromUtf16(vm, cutStr.c_str()) };
2224         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2225     };
2226     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnCut(nativeNode, reinterpret_cast<void*>(&callback));
2227     return panda::JSValueRef::Undefined(vm);
2228 }
2229 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)2230 ArkUINativeModuleValue TextInputBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
2231 {
2232     EcmaVM* vm = runtimeCallInfo->GetVM();
2233     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2234     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2235     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2236     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2237     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnCut(nativeNode);
2238     return panda::JSValueRef::Undefined(vm);
2239 }
2240 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)2241 ArkUINativeModuleValue TextInputBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
2242 {
2243     EcmaVM *vm = runtimeCallInfo->GetVM();
2244     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2245     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2246     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2247     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2248     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2249     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2250     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2251     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2252         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnPaste(nativeNode);
2253         return panda::JSValueRef::Undefined(vm);
2254     }
2255     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2256     std::function<void(const std::u16string&, NG::TextCommonEvent&)> callback = [vm, frameNode,
2257         func = panda::CopyableGlobal(vm, func)](const std::u16string& val, NG::TextCommonEvent& info) {
2258         panda::LocalScope pandaScope(vm);
2259         panda::TryCatch trycatch(vm);
2260         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2261         auto eventObject = panda::ObjectRef::New(vm);
2262         eventObject->SetNativePointerFieldCount(vm, 1);
2263         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
2264             panda::FunctionRef::New(vm, Framework::JsPreventDefault));
2265         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&info));
2266         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
2267             panda::StringRef::NewFromUtf16(vm, val.c_str()), eventObject };
2268         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
2269     };
2270     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputOnPaste(
2271         nativeNode, reinterpret_cast<void*>(&callback));
2272     return panda::JSValueRef::Undefined(vm);
2273 }
2274 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)2275 ArkUINativeModuleValue TextInputBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
2276 {
2277     EcmaVM* vm = runtimeCallInfo->GetVM();
2278     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2279     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2280     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2281     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2282     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputOnPaste(nativeNode);
2283     return panda::JSValueRef::Undefined(vm);
2284 }
2285 
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)2286 ArkUINativeModuleValue TextInputBridge::SetPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
2287 {
2288     EcmaVM *vm = runtimeCallInfo->GetVM();
2289     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2290     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2291     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2292     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2293     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2294     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
2295     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
2296     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
2297 
2298     struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
2299     struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
2300     struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
2301     struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
2302 
2303     CalcDimension topDimen(0, DimensionUnit::VP);
2304     CalcDimension rightDimen(0, DimensionUnit::VP);
2305     CalcDimension bottomDimen(0, DimensionUnit::VP);
2306     CalcDimension leftDimen(0, DimensionUnit::VP);
2307     ArkUIPaddingRes paddingRes;
2308     bool isLengthMetrics = false;
2309     if (secondArg->IsObject(vm)) {
2310         isLengthMetrics |= ParseLocalizedPadding(vm, secondArg, topDimen, top);
2311     }
2312     if (thirdArg->IsObject(vm)) {
2313         isLengthMetrics |= ParseLocalizedPadding(vm, thirdArg, rightDimen, right);
2314     }
2315     if (forthArg->IsObject(vm)) {
2316         isLengthMetrics |= ParseLocalizedPadding(vm, forthArg, bottomDimen, bottom);
2317     }
2318     if (fifthArg->IsObject(vm)) {
2319         isLengthMetrics |= ParseLocalizedPadding(vm, fifthArg, leftDimen, left);
2320     }
2321 
2322     if (isLengthMetrics) {
2323         auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
2324         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPadding(nativeNode,
2325             &top,
2326             isRightToLeft ? &left : &right,
2327             &bottom,
2328             isRightToLeft ? &right : &left,
2329             &paddingRes);
2330         return panda::JSValueRef::Undefined(vm);
2331     }
2332 
2333     RefPtr<ResourceObject> topResObject;
2334     RefPtr<ResourceObject> rightResObject;
2335     RefPtr<ResourceObject> bottomResObject;
2336     RefPtr<ResourceObject> leftResObject;
2337     ArkTSUtils::ParsePadding(vm, secondArg, topDimen, top, topResObject);
2338     ArkTSUtils::ParsePadding(vm, thirdArg, rightDimen, right, rightResObject);
2339     ArkTSUtils::ParsePadding(vm, forthArg, bottomDimen, bottom, bottomResObject);
2340     ArkTSUtils::ParsePadding(vm, fifthArg, leftDimen, left, leftResObject);
2341 
2342     paddingRes.topObj = AceType::RawPtr(topResObject);
2343     paddingRes.rightObj = AceType::RawPtr(rightResObject);
2344     paddingRes.bottomObj = AceType::RawPtr(bottomResObject);
2345     paddingRes.leftObj = AceType::RawPtr(leftResObject);
2346     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPadding(
2347         nativeNode, &top, &right, &bottom, &left, &paddingRes);
2348     return panda::JSValueRef::Undefined(vm);
2349 }
2350 
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)2351 ArkUINativeModuleValue TextInputBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
2352 {
2353     EcmaVM *vm = runtimeCallInfo->GetVM();
2354     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2356     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2357     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2358     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputPadding(nativeNode);
2359     return panda::JSValueRef::Undefined(vm);
2360 }
2361 
SetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)2362 ArkUINativeModuleValue TextInputBridge::SetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
2363 {
2364     EcmaVM *vm = runtimeCallInfo->GetVM();
2365     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2366     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2367     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2368     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2370 
2371     if (secondArg->IsNumber()) {
2372         uint32_t value = secondArg->Uint32Value(vm);
2373         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputContentType(nativeNode, value);
2374     } else {
2375         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputContentType(nativeNode);
2376     }
2377     return panda::JSValueRef::Undefined(vm);
2378 }
2379 
ResetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)2380 ArkUINativeModuleValue TextInputBridge::ResetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
2381 {
2382     EcmaVM *vm = runtimeCallInfo->GetVM();
2383     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2384     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2385     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2386     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2387     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputContentType(nativeNode);
2388     return panda::JSValueRef::Undefined(vm);
2389 }
2390 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2391 ArkUINativeModuleValue TextInputBridge::SetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2392 {
2393     EcmaVM *vm = runtimeCallInfo->GetVM();
2394     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2395     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2396     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2397     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2398     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2399     Color color;
2400     RefPtr<ResourceObject> resourceObject;
2401     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
2402     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, resourceObject, nodeInfo)) {
2403         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBackgroundColor(nativeNode);
2404     } else {
2405         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputBackgroundColorWithColorSpace(
2406             nativeNode, color.GetValue(), color.GetColorSpace(), AceType::RawPtr(resourceObject));
2407     }
2408     return panda::JSValueRef::Undefined(vm);
2409 }
2410 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2411 ArkUINativeModuleValue TextInputBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2412 {
2413     EcmaVM *vm = runtimeCallInfo->GetVM();
2414     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2415     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2416     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2417     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2418     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputBackgroundColor(nativeNode);
2419     return panda::JSValueRef::Undefined(vm);
2420 }
2421 
SetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)2422 ArkUINativeModuleValue TextInputBridge::SetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
2423 {
2424     EcmaVM *vm = runtimeCallInfo->GetVM();
2425     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2426     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2427     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2428     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2429     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2430     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
2431     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
2432     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
2433 
2434     ArkUIPaddingRes marginRes;
2435     RefPtr<ResourceObject> topResObject;
2436     RefPtr<ResourceObject> rightResObject;
2437     RefPtr<ResourceObject> bottomResObject;
2438     RefPtr<ResourceObject> leftResObject;
2439     ArkUISizeType top = ArkTSUtils::ParseJsToArkUISize(vm, secondArg, topResObject);
2440     ArkUISizeType right = ArkTSUtils::ParseJsToArkUISize(vm, thirdArg, rightResObject);
2441     ArkUISizeType bottom = ArkTSUtils::ParseJsToArkUISize(vm, forthArg, bottomResObject);
2442     ArkUISizeType left = ArkTSUtils::ParseJsToArkUISize(vm, fifthArg, leftResObject);
2443 
2444     CalcDimension topDimen(0, DimensionUnit::VP);
2445     CalcDimension rightDimen(0, DimensionUnit::VP);
2446     CalcDimension bottomDimen(0, DimensionUnit::VP);
2447     CalcDimension leftDimen(0, DimensionUnit::VP);
2448 
2449     bool isLengthMetrics = false;
2450     if (secondArg->IsObject(vm)) {
2451         isLengthMetrics |= ParseLocalizedMargin(vm, secondArg, topDimen, top);
2452     }
2453     if (thirdArg->IsObject(vm)) {
2454         isLengthMetrics |= ParseLocalizedMargin(vm, thirdArg, rightDimen, right);
2455     }
2456     if (forthArg->IsObject(vm)) {
2457         isLengthMetrics |= ParseLocalizedMargin(vm, forthArg, bottomDimen, bottom);
2458     }
2459     if (fifthArg->IsObject(vm)) {
2460         isLengthMetrics |= ParseLocalizedMargin(vm, fifthArg, leftDimen, left);
2461     }
2462     if (isLengthMetrics) {
2463         auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
2464         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMargin(nativeNode,
2465             &top,
2466             isRightToLeft ? &left : &right,
2467             &bottom,
2468             isRightToLeft ? &right : &left,
2469             &marginRes);
2470         return panda::JSValueRef::Undefined(vm);
2471     }
2472     marginRes.topObj = AceType::RawPtr(topResObject);
2473     marginRes.rightObj = AceType::RawPtr(rightResObject);
2474     marginRes.bottomObj = AceType::RawPtr(bottomResObject);
2475     marginRes.leftObj = AceType::RawPtr(leftResObject);
2476     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputMargin(
2477         nativeNode, &top, &right, &bottom, &left, &marginRes);
2478     return panda::JSValueRef::Undefined(vm);
2479 }
2480 
ResetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)2481 ArkUINativeModuleValue TextInputBridge::ResetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
2482 {
2483     EcmaVM *vm = runtimeCallInfo->GetVM();
2484     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2485     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2486     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2487     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2488     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputMargin(nativeNode);
2489     return panda::JSValueRef::Undefined(vm);
2490 }
2491 
SetText(ArkUIRuntimeCallInfo * runtimeCallInfo)2492 ArkUINativeModuleValue TextInputBridge::SetText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2493 {
2494     EcmaVM* vm = runtimeCallInfo->GetVM();
2495     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2496     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2497     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2498 
2499     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2500     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2501     if (secondArg->IsString(vm)) {
2502         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, secondArg->ToString(vm)->
2503         ToString(vm).c_str());
2504     } else {
2505         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, "");
2506     }
2507     return panda::JSValueRef::Undefined(vm);
2508 }
ResetText(ArkUIRuntimeCallInfo * runtimeCallInfo)2509 ArkUINativeModuleValue TextInputBridge::ResetText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2510 {
2511     EcmaVM* vm = runtimeCallInfo->GetVM();
2512     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2513     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2514     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2515     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2516     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputTextString(nativeNode, "");
2517     return panda::JSValueRef::Undefined(vm);
2518 }
SetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)2519 ArkUINativeModuleValue TextInputBridge::SetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
2520 {
2521     EcmaVM* vm = runtimeCallInfo->GetVM();
2522     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2523     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2524     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2525 
2526     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2527     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2528     if (secondArg->IsString(vm)) {
2529         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, secondArg->
2530         ToString(vm)->ToString(vm).c_str());
2531     } else {
2532         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, "");
2533     }
2534     return panda::JSValueRef::Undefined(vm);
2535 }
ResetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)2536 ArkUINativeModuleValue TextInputBridge::ResetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
2537 {
2538     EcmaVM* vm = runtimeCallInfo->GetVM();
2539     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2540     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2541     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2542     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2543     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputPlaceholderString(nativeNode, "");
2544     return panda::JSValueRef::Undefined(vm);
2545 }
SetController(ArkUIRuntimeCallInfo * runtimeCallInfo)2546 ArkUINativeModuleValue TextInputBridge::SetController(ArkUIRuntimeCallInfo* runtimeCallInfo)
2547 {
2548     EcmaVM* vm = runtimeCallInfo->GetVM();
2549     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2550     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
2551     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2552     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
2553 
2554     auto nodePtr = GetArkUINodeModifiers()->getTextInputModifier()->getTextInputController(nativeNode);
2555     auto node = AceType::Claim(reinterpret_cast<TextFieldController*>(nodePtr));
2556 
2557     OHOS::Ace::Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
2558     OHOS::Ace::Framework::JSTextEditableController* jsController =
2559         OHOS::Ace::Framework::JSRef<OHOS::Ace::Framework::JSObject>::Cast(info[1])->Unwrap<OHOS::Ace::Framework::
2560         JSTextEditableController>();
2561     if (jsController) {
2562         jsController->SetController(node);
2563     }
2564     return panda::JSValueRef::Undefined(vm);
2565 }
ResetController(ArkUIRuntimeCallInfo * runtimeCallInfo)2566 ArkUINativeModuleValue TextInputBridge::ResetController(ArkUIRuntimeCallInfo* runtimeCallInfo)
2567 {
2568     EcmaVM* vm = runtimeCallInfo->GetVM();
2569     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2570     return panda::JSValueRef::Undefined(vm);
2571 }
2572 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2573 ArkUINativeModuleValue TextInputBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2574 {
2575     EcmaVM *vm = runtimeCallInfo->GetVM();
2576     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2577     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2578     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2579     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2580     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2581 
2582     if (secondArg->IsBoolean()) {
2583         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2584         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnablePreviewText(nativeNode, value);
2585     } else {
2586         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnablePreviewText(nativeNode);
2587     }
2588     return panda::JSValueRef::Undefined(vm);
2589 }
2590 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2591 ArkUINativeModuleValue TextInputBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2592 {
2593     EcmaVM* vm = runtimeCallInfo->GetVM();
2594     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2596     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2597     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2598     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnablePreviewText(nativeNode);
2599     return panda::JSValueRef::Undefined(vm);
2600 }
2601 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2602 ArkUINativeModuleValue TextInputBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2603 {
2604     EcmaVM* vm = runtimeCallInfo->GetVM();
2605     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2606     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2607     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2608     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2609     NG::OnCreateMenuCallback onCreateMenuCallback;
2610     NG::OnMenuItemClickCallback onMenuItemClickCallback;
2611     NG::OnPrepareMenuCallback onPrepareMenuCallback;
2612     if (!ArkTSUtils::ParseSelectionMenuOptions(
2613         runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback, onPrepareMenuCallback)) {
2614         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuOptions(nativeNode);
2615         return panda::JSValueRef::Undefined(vm);
2616     }
2617     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputSelectionMenuOptions(nativeNode,
2618         reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback),
2619         reinterpret_cast<void*>(&onPrepareMenuCallback));
2620     return panda::JSValueRef::Undefined(vm);
2621 }
2622 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2623 ArkUINativeModuleValue TextInputBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2624 {
2625     EcmaVM* vm = runtimeCallInfo->GetVM();
2626     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2627     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2628     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2629     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2630     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputSelectionMenuOptions(nativeNode);
2631     return panda::JSValueRef::Undefined(vm);
2632 }
2633 
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2634 ArkUINativeModuleValue TextInputBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2635 {
2636     EcmaVM* vm = runtimeCallInfo->GetVM();
2637     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2638     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2639     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2640     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2641     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2642     if (ParseLayoutPolicy(vm, widthArg, true)) {
2643         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWidth(nativeNode);
2644         return panda::JSValueRef::Undefined(vm);
2645     }
2646     auto value = widthArg->ToString(vm)->ToString(vm);
2647     if (value.empty()) {
2648         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWidth(nativeNode);
2649         return panda::JSValueRef::Undefined(vm);
2650     }
2651     GetArkUINodeModifiers()->getTextInputModifier()->setTextInputWidth(
2652         nativeNode, value.c_str());
2653     return panda::JSValueRef::Undefined(vm);
2654 }
2655 
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2656 ArkUINativeModuleValue TextInputBridge::ResetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2657 {
2658     EcmaVM* vm = runtimeCallInfo->GetVM();
2659     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2660     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2661     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2662     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2663     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputWidth(nativeNode);
2664     return panda::JSValueRef::Undefined(vm);
2665 }
2666 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2667 ArkUINativeModuleValue TextInputBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2668 {
2669     EcmaVM* vm = runtimeCallInfo->GetVM();
2670     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2671     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2672     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2673     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2674     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2675 
2676     if (secondArg->IsBoolean()) {
2677         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2678         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputEnableHapticFeedback(nativeNode, value);
2679     } else {
2680         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableHapticFeedback(nativeNode);
2681     }
2682     return panda::JSValueRef::Undefined(vm);
2683 }
2684 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2685 ArkUINativeModuleValue TextInputBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2686 {
2687     EcmaVM* vm = runtimeCallInfo->GetVM();
2688     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2689     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2690     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2691     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2692     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputEnableHapticFeedback(nativeNode);
2693     return panda::JSValueRef::Undefined(vm);
2694 }
2695 
SetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2696 ArkUINativeModuleValue TextInputBridge::SetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2697 {
2698     EcmaVM* vm = runtimeCallInfo->GetVM();
2699     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2700     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2701     Local<JSValueRef> ellipsisModeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2702     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2703     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2704     if (ellipsisModeArg->IsNull() || ellipsisModeArg->IsUndefined() || !ellipsisModeArg->IsNumber()) {
2705         GetArkUINodeModifiers()->getTextInputModifier()->resetEllipsisMode(nativeNode);
2706         return panda::JSValueRef::Undefined(vm);
2707     }
2708     uint32_t ellipsisMode = ellipsisModeArg->Uint32Value(vm);
2709     GetArkUINodeModifiers()->getTextModifier()->setEllipsisMode(nativeNode, ellipsisMode);
2710     return panda::JSValueRef::Undefined(vm);
2711 }
2712 
ResetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2713 ArkUINativeModuleValue TextInputBridge::ResetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2714 {
2715     EcmaVM* vm = runtimeCallInfo->GetVM();
2716     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2717     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2718     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2719     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2720     GetArkUINodeModifiers()->getTextInputModifier()->resetEllipsisMode(nativeNode);
2721     return panda::JSValueRef::Undefined(vm);
2722 }
2723 
SetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)2724 ArkUINativeModuleValue TextInputBridge::SetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
2725 {
2726     EcmaVM* vm = runtimeCallInfo->GetVM();
2727     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2728     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2729     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2730     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2732 
2733     if (secondArg->IsBoolean()) {
2734         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2735         GetArkUINodeModifiers()->getTextInputModifier()->setStopBackPress(nativeNode, value);
2736     } else {
2737         GetArkUINodeModifiers()->getTextInputModifier()->resetStopBackPress(nativeNode);
2738     }
2739     return panda::JSValueRef::Undefined(vm);
2740 }
2741 
ResetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)2742 ArkUINativeModuleValue TextInputBridge::ResetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
2743 {
2744     EcmaVM* vm = runtimeCallInfo->GetVM();
2745     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2746     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2747     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2748     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2749     GetArkUINodeModifiers()->getTextInputModifier()->resetStopBackPress(nativeNode);
2750     return panda::JSValueRef::Undefined(vm);
2751 }
2752 
SetStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2753 ArkUINativeModuleValue TextInputBridge::SetStrokeWidth(ArkUIRuntimeCallInfo *runtimeCallInfo)
2754 {
2755     EcmaVM* vm = runtimeCallInfo->GetVM();
2756     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2757     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2758     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2759     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2760     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2761 
2762     CalcDimension value;
2763     if (!ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, value)) {
2764         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStrokeWidth(nativeNode);
2765     } else {
2766         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputStrokeWidth(
2767             nativeNode, value.Value(), static_cast<int>(value.Unit()));
2768     }
2769     return panda::JSValueRef::Undefined(vm);
2770 }
2771 
ResetStrokeWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2772 ArkUINativeModuleValue TextInputBridge::ResetStrokeWidth(ArkUIRuntimeCallInfo *runtimeCallInfo)
2773 {
2774     EcmaVM* vm = runtimeCallInfo->GetVM();
2775     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2776     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2777     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2778     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2779     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStrokeWidth(nativeNode);
2780     return panda::JSValueRef::Undefined(vm);
2781 }
2782 
SetStrokeColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2783 ArkUINativeModuleValue TextInputBridge::SetStrokeColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2784 {
2785     EcmaVM *vm = runtimeCallInfo->GetVM();
2786     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2787     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2788     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2789     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2790     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2791     Color color;
2792     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
2793         GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStrokeColor(nativeNode);
2794     } else {
2795         GetArkUINodeModifiers()->getTextInputModifier()->setTextInputStrokeColor(nativeNode, color.GetValue());
2796     }
2797     return panda::JSValueRef::Undefined(vm);
2798 }
2799 
ResetStrokeColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2800 ArkUINativeModuleValue TextInputBridge::ResetStrokeColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2801 {
2802     EcmaVM *vm = runtimeCallInfo->GetVM();
2803     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2804     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2805     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2806     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2807     GetArkUINodeModifiers()->getTextInputModifier()->resetTextInputStrokeColor(nativeNode);
2808     return panda::JSValueRef::Undefined(vm);
2809 }
2810 
SetEnableAutoSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)2811 ArkUINativeModuleValue TextInputBridge::SetEnableAutoSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
2812 {
2813     EcmaVM* vm = runtimeCallInfo->GetVM();
2814     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2815     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2816     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2817     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2818     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2819     uint32_t enableAutoSpacing = false;
2820     if (secondArg->IsBoolean()) {
2821         enableAutoSpacing = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2822     }
2823     GetArkUINodeModifiers()->getTextInputModifier()->setEnableAutoSpacing(nativeNode, enableAutoSpacing);
2824     return panda::JSValueRef::Undefined(vm);
2825 }
2826 
ResetEnableAutoSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)2827 ArkUINativeModuleValue TextInputBridge::ResetEnableAutoSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
2828 {
2829     EcmaVM* vm = runtimeCallInfo->GetVM();
2830     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2831     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2832     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2833     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2834     GetArkUINodeModifiers()->getTextInputModifier()->resetEnableAutoSpacing(nativeNode);
2835     return panda::JSValueRef::Undefined(vm);
2836 }
2837 
SetOnSecurityStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2838 ArkUINativeModuleValue TextInputBridge::SetOnSecurityStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2839 {
2840     EcmaVM* vm = runtimeCallInfo->GetVM();
2841     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2842     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2843     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2844     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2845     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2846     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2847     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
2848     using namespace OHOS::Ace::Framework;
2849     auto jsValue = info[CALL_ARG_1];
2850     CHECK_NULL_RETURN(jsValue->IsFunction(), panda::JSValueRef::Undefined(vm));
2851     JsEventCallback<void(bool)> callback(info.GetExecutionContext(), JSRef<JSFunc>::Cast(jsValue));
2852     TextFieldModel::GetInstance()->SetOnSecurityStateChange(std::move(callback));
2853     return panda::JSValueRef::Undefined(vm);
2854 }
2855 
ResetOnSecurityStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2856 ArkUINativeModuleValue TextInputBridge::ResetOnSecurityStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2857 {
2858     EcmaVM* vm = runtimeCallInfo->GetVM();
2859     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2860     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2861     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2862     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
2863     auto nodeModifiers = GetArkUINodeModifiers();
2864     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
2865     nodeModifiers->getTextInputModifier()->resetTextInputOnSecurityStateChange(nativeNode);
2866     return panda::JSValueRef::Undefined(vm);
2867 }
2868 
ParseLayoutPolicy(EcmaVM * vm,const Local<JSValueRef> value,bool isWidth)2869 bool TextInputBridge::ParseLayoutPolicy(EcmaVM* vm, const Local<JSValueRef> value, bool isWidth)
2870 {
2871     if (value->IsObject(vm)) {
2872         auto obj = value->ToObject(vm);
2873         auto layoutPolicy = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "id_"));
2874         if (layoutPolicy->IsString(vm)) {
2875             auto policy = CommonBridge::ParseLayoutPolicy(layoutPolicy->ToString(vm)->ToString(vm));
2876             ViewAbstractModel::GetInstance()->UpdateLayoutPolicyProperty(policy, isWidth);
2877             return true;
2878         }
2879     }
2880     ViewAbstractModel::GetInstance()->UpdateLayoutPolicyProperty(LayoutCalPolicy::NO_MATCH, isWidth);
2881     return false;
2882 }
2883 } // namespace OHOS::Ace::NG
2884