• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_text_area_bridge.h"
16 
17 #include "bridge/common/utils/utils.h"
18 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
20 #include "bridge/declarative_frontend/jsview/js_text_editable_controller.h"
21 #include "bridge/declarative_frontend/jsview/js_view_abstract.h"
22 #include "core/components/common/layout/constants.h"
23 #include "core/components/common/properties/text_style.h"
24 #include "core/components_ng/pattern/text_field/text_field_model_ng.h"
25 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_textfield.h"
27 
28 namespace OHOS::Ace::NG {
29 namespace {
30 constexpr int NUM_0 = 0;
31 constexpr int NUM_1 = 1;
32 constexpr int NUM_2 = 2;
33 constexpr int NUM_3 = 3;
34 constexpr int NUM_4 = 4;
35 constexpr int NUM_5 = 5;
36 constexpr int NUM_6 = 6;
37 constexpr int NUM_9 = 9;
38 constexpr int NUM_13 = 13;
39 constexpr int NUM_17 = 17;
40 constexpr int NUM_21 = 21;
41 constexpr int NUM_25 = 25;
42 constexpr int NUM_26 = 26;
43 constexpr int NUM_27 = 27;
44 constexpr int NUM_28 = 28;
45 constexpr int SIZE_OF_FOUR = 4;
46 constexpr int PARAM_ARR_LENGTH_1 = 1;
47 constexpr int PARAM_ARR_LENGTH_2 = 2;
48 constexpr int PARAM_ARR_LENGTH_3 = 3;
49 constexpr uint32_t KEY_BOARD_FOCUS_DEFAULT = 1;
50 constexpr uint32_t ILLEGAL_VALUE = 0;
51 constexpr int32_t DEFAULT_MODE = -1;
52 constexpr uint32_t COLOR_ALPHA_VALUE = 0xFF000000;
53 const int32_t MINI_VALID_VALUE = 1;
54 const int32_t MAX_VALID_VALUE = 100;
55 constexpr int16_t DEFAULT_ALPHA = 255;
56 constexpr double DEFAULT_OPACITY = 0.2;
57 constexpr uint32_t DEFAULT_OVERFLOW = 4;
58 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
59     TextOverflow::MARQUEE, TextOverflow::DEFAULT };
60 const std::string DEFAULT_FONT_WEIGHT = "400";
61 const std::vector<OHOS::Ace::TextAlign> TEXT_ALIGNS = { OHOS::Ace::TextAlign::START, OHOS::Ace::TextAlign::CENTER,
62     OHOS::Ace::TextAlign::END, OHOS::Ace::TextAlign::JUSTIFY };
63 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
64 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
65 const std::vector<TextHeightAdaptivePolicy> HEIGHT_ADAPTIVE_POLICY = { TextHeightAdaptivePolicy::MAX_LINES_FIRST,
66     TextHeightAdaptivePolicy::MIN_FONT_SIZE_FIRST, TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST };
67 
ParseLocalizedPadding(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen,ArkUISizeType & result)68 bool ParseLocalizedPadding(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen,
69     ArkUISizeType& result)
70 {
71     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, dimen)) {
72         if (LessOrEqual(dimen.Value(), 0.0)) {
73             dimen.SetValue(0.0);
74             dimen.SetUnit(DimensionUnit::VP);
75         }
76         result.unit = static_cast<int8_t>(dimen.Unit());
77         if (dimen.CalcValue() != "") {
78             result.string = dimen.CalcValue().c_str();
79         } else {
80             result.value = dimen.Value();
81         }
82         return true;
83     }
84     return false;
85 }
86 
ParseLocalizedMargin(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen,ArkUISizeType & result)87 bool ParseLocalizedMargin(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen, ArkUISizeType& result)
88 {
89     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, dimen)) {
90         result.unit = static_cast<int8_t>(dimen.Unit());
91         if (dimen.CalcValue() != "") {
92             result.string = dimen.CalcValue().c_str();
93         } else {
94             result.value = dimen.Value();
95         }
96         return true;
97     }
98     return false;
99 }
100 
SetBorderWidthArrayByDimen(CalcDimension & borderDimension,ArkUI_Float32 values[],int units[],int index)101 void SetBorderWidthArrayByDimen(CalcDimension& borderDimension, ArkUI_Float32 values[], int units[], int index)
102 {
103     values[index] = borderDimension.Value();
104     units[index] = static_cast<int>(borderDimension.Unit());
105 }
106 
ParseMirrorDimen(ArkUI_Float32 values[],int units[],int idx,CalcDimension & calcDimen)107 void ParseMirrorDimen(ArkUI_Float32 values[], int units[], int idx, CalcDimension& calcDimen)
108 {
109     values[idx] = calcDimen.Value();
110     units[idx] = static_cast<int>(calcDimen.Unit());
111 }
112 
ParseLocalizedBorderWidth(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & dimen)113 bool ParseLocalizedBorderWidth(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& dimen)
114 {
115     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, dimen)) {
116         if (LessOrEqual(dimen.Value(), 0.0)) {
117             dimen.SetValue(0.0);
118             dimen.SetUnit(DimensionUnit::VP);
119         }
120         return true;
121     }
122     return false;
123 }
124 
ParseLocalizedBorderRadius(const EcmaVM * vm,const Local<JSValueRef> & value,CalcDimension & result)125 bool ParseLocalizedBorderRadius(const EcmaVM* vm, const Local<JSValueRef>& value, CalcDimension& result)
126 {
127     if (ArkTSUtils::ParseJsLengthMetrics(vm, value, result)) {
128         if (result.IsNegative()) {
129             result.Reset();
130         }
131         return true;
132     }
133     return false;
134 }
135 
PushOuterBorderDimensionVector(const std::optional<CalcDimension> & valueDim,std::vector<ArkUI_Float32> & options)136 void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options)
137 {
138     options.push_back(static_cast<ArkUI_Float32>(valueDim.has_value()));
139     if (valueDim.has_value()) {
140         options.push_back(static_cast<ArkUI_Float32>(valueDim.value().Value()));
141         options.push_back(static_cast<ArkUI_Float32>(valueDim.value().Unit()));
142     } else {
143         options.push_back(0);
144         options.push_back(0);
145     }
146 }
147 
ParseOuterBorderDashParam(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & values,int32_t argsIndex)148 void ParseOuterBorderDashParam(ArkUIRuntimeCallInfo *runtimeCallInfo, EcmaVM *vm, std::vector<ArkUI_Float32> &values,
149     int32_t argsIndex)
150 {
151     Local<JSValueRef> leftArgs = runtimeCallInfo->GetCallArgRef(argsIndex);
152     Local<JSValueRef> rightArgs = runtimeCallInfo->GetCallArgRef(argsIndex + NUM_1);
153     Local<JSValueRef> topArgs = runtimeCallInfo->GetCallArgRef(argsIndex + NUM_2);
154     Local<JSValueRef> bottomArgs = runtimeCallInfo->GetCallArgRef(argsIndex + NUM_3);
155     std::optional<CalcDimension> leftDim;
156     std::optional<CalcDimension> rightDim;
157     std::optional<CalcDimension> topDim;
158     std::optional<CalcDimension> bottomDim;
159 
160     ArkTSUtils::ParseOuterBorderForDashParams(vm, leftArgs, leftDim);
161     ArkTSUtils::ParseOuterBorderForDashParams(vm, rightArgs, rightDim);
162     ArkTSUtils::ParseOuterBorderForDashParams(vm, topArgs, topDim);
163     ArkTSUtils::ParseOuterBorderForDashParams(vm, bottomArgs, bottomDim);
164 
165     PushOuterBorderDimensionVector(leftDim, values);
166     PushOuterBorderDimensionVector(rightDim, values);
167     PushOuterBorderDimensionVector(topDim, values);
168     PushOuterBorderDimensionVector(bottomDim, values);
169 }
170 
SetBorderDash(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,ArkUINodeHandle nativeNode)171 void SetBorderDash(ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM *vm, ArkUINodeHandle nativeNode)
172 {
173     std::vector<ArkUI_Float32> dashOptions;
174     // Border DashGap args start index from 17
175     ParseOuterBorderDashParam(runtimeCallInfo, vm, dashOptions, NUM_17);
176     // Border DashGap args start index from 25
177     Local<JSValueRef> startDashGap = runtimeCallInfo->GetCallArgRef(NUM_25);
178     // Border DashGap args end index from 26
179     Local<JSValueRef> endDashGap = runtimeCallInfo->GetCallArgRef(NUM_26);
180     std::optional<CalcDimension> startDashGapDim;
181     std::optional<CalcDimension> endDashGapDim;
182     ArkTSUtils::ParseOuterBorderForDashParams(vm, startDashGap, startDashGapDim);
183     ArkTSUtils::ParseOuterBorderForDashParams(vm, endDashGap, endDashGapDim);
184     ArkTSUtils::PushOuterBorderDimensionVector(startDashGapDim, dashOptions);
185     ArkTSUtils::PushOuterBorderDimensionVector(endDashGapDim, dashOptions);
186 
187     // Border DashWidth args start index from 21
188     ParseOuterBorderDashParam(runtimeCallInfo, vm, dashOptions, NUM_21);
189     // Border DashWidth args start index from 27
190     Local<JSValueRef> startDashWidth = runtimeCallInfo->GetCallArgRef(NUM_27);
191     // Border DashWidth args end index from 28
192     Local<JSValueRef> endDashWidth = runtimeCallInfo->GetCallArgRef(NUM_28);
193     std::optional<CalcDimension> startDashWidthDim;
194     std::optional<CalcDimension> endDashWidthDim;
195     ArkTSUtils::ParseOuterBorderForDashParams(vm, startDashWidth, startDashWidthDim);
196     ArkTSUtils::ParseOuterBorderForDashParams(vm, endDashWidth, endDashWidthDim);
197     ArkTSUtils::PushOuterBorderDimensionVector(startDashWidthDim, dashOptions);
198     ArkTSUtils::PushOuterBorderDimensionVector(endDashWidthDim, dashOptions);
199 
200     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderDash(nativeNode, dashOptions.data(),
201         dashOptions.size());
202 }
203 } // namespace
204 
SetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue TextAreaBridge::SetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
206 {
207     EcmaVM *vm = runtimeCallInfo->GetVM();
208     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
209     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
210     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
211     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
212     if (secondArg->IsString(vm)) {
213         auto str = secondArg->ToString(vm)->ToString(vm);
214         if (str == "Inline") {
215             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaStyle(nativeNode,
216                 static_cast<int32_t>(InputStyle::INLINE));
217         } else {
218             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaStyle(nativeNode,
219                 static_cast<int32_t>(InputStyle::DEFAULT));
220         }
221     } else {
222         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaStyle(nativeNode);
223     }
224     return panda::JSValueRef::Undefined(vm);
225 }
226 
ResetStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)227 ArkUINativeModuleValue TextAreaBridge::ResetStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
228 {
229     EcmaVM *vm = runtimeCallInfo->GetVM();
230     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
231     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
232     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
233     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaStyle(nativeNode);
234     return panda::JSValueRef::Undefined(vm);
235 }
236 
SetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue TextAreaBridge::SetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
238 {
239     EcmaVM *vm = runtimeCallInfo->GetVM();
240     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
241     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
242     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
243     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
244     uint32_t contextMenuHidden = 0;
245     if (secondArg->IsBoolean()) {
246         contextMenuHidden = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
247     }
248     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaSelectionMenuHidden(nativeNode, contextMenuHidden);
249     return panda::JSValueRef::Undefined(vm);
250 }
251 
ResetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)252 ArkUINativeModuleValue TextAreaBridge::ResetSelectionMenuHidden(ArkUIRuntimeCallInfo *runtimeCallInfo)
253 {
254     EcmaVM *vm = runtimeCallInfo->GetVM();
255     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
256     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
257     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
258     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaSelectionMenuHidden(nativeNode);
259     return panda::JSValueRef::Undefined(vm);
260 }
261 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)262 ArkUINativeModuleValue TextAreaBridge::SetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
263 {
264     EcmaVM *vm = runtimeCallInfo->GetVM();
265     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
266     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
267     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
268     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
269     if (secondArg->IsNumber() && secondArg->Int32Value(vm) > 0) {
270         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMaxLines(nativeNode, secondArg->Uint32Value(vm));
271     } else {
272         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxLines(nativeNode);
273     }
274     return panda::JSValueRef::Undefined(vm);
275 }
276 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)277 ArkUINativeModuleValue TextAreaBridge::ResetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
278 {
279     EcmaVM *vm = runtimeCallInfo->GetVM();
280     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
281     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
282     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
283     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxLines(nativeNode);
284     return panda::JSValueRef::Undefined(vm);
285 }
286 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)287 ArkUINativeModuleValue TextAreaBridge::SetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
288 {
289     EcmaVM *vm = runtimeCallInfo->GetVM();
290     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
291     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
292     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
293     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
294     int32_t copyOptions = static_cast<int32_t>(OHOS::Ace::CopyOptions::None);
295     int32_t copyOptionsDistributed = static_cast<int32_t>(OHOS::Ace::CopyOptions::Distributed);
296     if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= copyOptions &&
297         secondArg->Int32Value(vm) <= copyOptionsDistributed) {
298         copyOptions = secondArg->Int32Value(vm);
299         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaCopyOption(nativeNode, copyOptions);
300     } else {
301         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaCopyOption(nativeNode);
302     }
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue TextAreaBridge::ResetCopyOption(ArkUIRuntimeCallInfo *runtimeCallInfo)
307 {
308     EcmaVM *vm = runtimeCallInfo->GetVM();
309     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
310     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
311     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
312     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaCopyOption(nativeNode);
313     return panda::JSValueRef::Undefined(vm);
314 }
315 
SetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue TextAreaBridge::SetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
317 {
318     EcmaVM *vm = runtimeCallInfo->GetVM();
319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
321     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
322     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
323     Color color;
324     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
325         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaPlaceholderColor(nativeNode);
326     } else {
327         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPlaceholderColor(nativeNode, color.GetValue());
328     }
329     return panda::JSValueRef::Undefined(vm);
330 }
331 
ResetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)332 ArkUINativeModuleValue TextAreaBridge::ResetPlaceholderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
333 {
334     EcmaVM *vm = runtimeCallInfo->GetVM();
335     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
336     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
337     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
338     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaPlaceholderColor(nativeNode);
339     return panda::JSValueRef::Undefined(vm);
340 }
341 
SetTextAreaTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)342 ArkUINativeModuleValue TextAreaBridge::SetTextAreaTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
343 {
344     EcmaVM *vm = runtimeCallInfo->GetVM();
345     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
346     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
347     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
348     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
349     if (secondArg->IsNumber()) {
350         int32_t value = secondArg->Int32Value(vm);
351         if (value >= 0 && value < static_cast<int32_t>(TEXT_ALIGNS.size())) {
352             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaTextAlign(nativeNode, value);
353         } else {
354             return panda::JSValueRef::Undefined(vm);
355         }
356     } else {
357         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaTextAlign(nativeNode);
358     }
359     return panda::JSValueRef::Undefined(vm);
360 }
361 
ResetTextAreaTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)362 ArkUINativeModuleValue TextAreaBridge::ResetTextAreaTextAlign(ArkUIRuntimeCallInfo *runtimeCallInfo)
363 {
364     EcmaVM *vm = runtimeCallInfo->GetVM();
365     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
366     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
367     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
368     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaTextAlign(nativeNode);
369     return panda::JSValueRef::Undefined(vm);
370 }
371 
SetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)372 ArkUINativeModuleValue TextAreaBridge::SetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
373 {
374     EcmaVM *vm = runtimeCallInfo->GetVM();
375     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
376     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
377     Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
378     Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
379     Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
380     Local<JSValueRef> fontStyleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
381     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
382     struct ArkUIResourceLength fontSize = { 0.0, -1, nullptr };
383     CalcDimension size;
384     std::string calcStr;
385     if (ArkTSUtils::ParseJsDimensionNG(vm, fontSizeArg, size, DimensionUnit::FP, false)) {
386         if (size.Unit() == DimensionUnit::CALC) {
387             fontSize.unit = static_cast<int32_t>(DimensionUnit::CALC);
388             calcStr = size.CalcValue();
389             fontSize.string = calcStr.c_str();
390         } else {
391             fontSize.value = size.Value();
392             fontSize.unit = static_cast<int32_t>(size.Unit());
393             fontSize.string = calcStr.c_str();
394         }
395     }
396     std::string fontWeight;
397     if (!fontWeightArg->IsNull()) {
398         if (fontWeightArg->IsNumber()) {
399             fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
400         } else if (fontWeightArg->IsString(vm)) {
401             fontWeight = fontWeightArg->ToString(vm)->ToString(vm);
402         }
403     }
404     std::vector<std::string> fontFamilies;
405     std::string family;
406     if (ArkTSUtils::ParseJsFontFamilies(vm, fontFamilyArg, fontFamilies)) {
407         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
408             family += fontFamilies.at(i);
409             family += ',';
410         }
411         family.pop_back();
412     }
413     int32_t style = -1;
414     if (fontStyleArg->IsNumber()) {
415         style = fontStyleArg->Int32Value(vm);
416         if (style <= 0 || style > static_cast<int32_t>(FONT_STYLES.size())) {
417             style = -1;
418         }
419     }
420     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPlaceholderFont(nativeNode, &fontSize,
421         fontWeight.c_str(), family.c_str(), style);
422     return panda::JSValueRef::Undefined(vm);
423 }
424 
ResetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue TextAreaBridge::ResetPlaceholderFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
426 {
427     EcmaVM *vm = runtimeCallInfo->GetVM();
428     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
429     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
430     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
431     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaPlaceholderFont(nativeNode);
432     return panda::JSValueRef::Undefined(vm);
433 }
434 
SetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)435 ArkUINativeModuleValue TextAreaBridge::SetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
436 {
437     EcmaVM *vm = runtimeCallInfo->GetVM();
438     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
439     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
440     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
441     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
442     if (secondArg->IsNumber()) {
443         uint32_t barStateValue = secondArg->Uint32Value(vm);
444         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBarState(nativeNode, barStateValue);
445     } else {
446         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBarState(nativeNode);
447     }
448     return panda::JSValueRef::Undefined(vm);
449 }
450 
ResetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)451 ArkUINativeModuleValue TextAreaBridge::ResetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
452 {
453     EcmaVM *vm = runtimeCallInfo->GetVM();
454     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
455     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
456     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
457     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBarState(nativeNode);
458     return panda::JSValueRef::Undefined(vm);
459 }
460 
SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)461 ArkUINativeModuleValue TextAreaBridge::SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
462 {
463     EcmaVM *vm = runtimeCallInfo->GetVM();
464     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
465     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
466     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
467     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
468     uint32_t keyboardOnFocusValue = KEY_BOARD_FOCUS_DEFAULT;
469     if (secondArg->IsBoolean()) {
470         keyboardOnFocusValue = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
471     }
472     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaEnableKeyboardOnFocus(nativeNode, keyboardOnFocusValue);
473     return panda::JSValueRef::Undefined(vm);
474 }
475 
ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)476 ArkUINativeModuleValue TextAreaBridge::ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo *runtimeCallInfo)
477 {
478     EcmaVM *vm = runtimeCallInfo->GetVM();
479     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
480     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
481     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
482     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnableKeyboardOnFocus(nativeNode);
483     return panda::JSValueRef::Undefined(vm);
484 }
485 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)486 ArkUINativeModuleValue TextAreaBridge::SetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
487 {
488     EcmaVM *vm = runtimeCallInfo->GetVM();
489     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
490     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
491     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
492     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
493     std::vector<std::string> fontFamilies;
494     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies)) {
495         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontFamily(nativeNode);
496         return panda::JSValueRef::Undefined(vm);
497     }
498     std::string families;
499     for (uint32_t i = 0; i < fontFamilies.size(); i++) {
500         families += fontFamilies.at(i);
501         families += ',';
502     }
503     families.pop_back();
504     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontFamily(nativeNode, families.c_str());
505     return panda::JSValueRef::Undefined(vm);
506 }
507 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)508 ArkUINativeModuleValue TextAreaBridge::ResetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
509 {
510     EcmaVM *vm = runtimeCallInfo->GetVM();
511     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
512     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
513     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
514     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontFamily(nativeNode);
515     return panda::JSValueRef::Undefined(vm);
516 }
517 
SetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)518 ArkUINativeModuleValue TextAreaBridge::SetShowCounter(ArkUIRuntimeCallInfo *runtimeCallInfo)
519 {
520     EcmaVM *vm = runtimeCallInfo->GetVM();
521     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
522     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
523     Local<JSValueRef> showCounterArg = runtimeCallInfo->GetCallArgRef(NUM_1);
524     Local<JSValueRef> highlightBorderArg = runtimeCallInfo->GetCallArgRef(NUM_2);
525     Local<JSValueRef> thresholdArg = runtimeCallInfo->GetCallArgRef(NUM_3);
526     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
527     auto showCounter = false;
528     if (showCounterArg->IsBoolean()) {
529         showCounter = showCounterArg->BooleaValue(vm);
530     }
531     auto highlightBorder = true;
532     if (highlightBorderArg->IsBoolean()) {
533         highlightBorder = highlightBorderArg->BooleaValue(vm);
534     }
535     auto thresholdValue = static_cast<int32_t>(DEFAULT_MODE);
536     if (thresholdArg->IsNumber()) {
537         thresholdValue = thresholdArg->Int32Value(vm);
538         if (thresholdValue < MINI_VALID_VALUE || thresholdValue > MAX_VALID_VALUE) {
539             thresholdValue = static_cast<int32_t>(ILLEGAL_VALUE);
540             showCounter = false;
541         }
542     }
543     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaShowCounterOptions(
544         nativeNode, showCounter, thresholdValue, highlightBorder);
545     return panda::JSValueRef::Undefined(vm);
546 }
547 
ResetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)548 ArkUINativeModuleValue TextAreaBridge::ResetShowCounter(ArkUIRuntimeCallInfo *runtimeCallInfo)
549 {
550     EcmaVM *vm = runtimeCallInfo->GetVM();
551     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
552     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
553     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
554     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaShowCounter(nativeNode);
555     return panda::JSValueRef::Undefined(vm);
556 }
557 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)558 ArkUINativeModuleValue TextAreaBridge::SetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
559 {
560     EcmaVM *vm = runtimeCallInfo->GetVM();
561     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
562     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
563     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
564     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
565     Color color;
566     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
567         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaCaretColor(nativeNode);
568     } else {
569         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaCaretColor(nativeNode, color.GetValue());
570     }
571     return panda::JSValueRef::Undefined(vm);
572 }
573 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)574 ArkUINativeModuleValue TextAreaBridge::ResetCaretColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
575 {
576     EcmaVM *vm = runtimeCallInfo->GetVM();
577     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
578     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
579     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
580     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaCaretColor(nativeNode);
581     return panda::JSValueRef::Undefined(vm);
582 }
583 
SetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)584 ArkUINativeModuleValue TextAreaBridge::SetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
585 {
586     EcmaVM *vm = runtimeCallInfo->GetVM();
587     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
588     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
589     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
590     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
591     if (!secondArg->IsNumber()) {
592         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxLength(nativeNode);
593     } else {
594         int32_t maxLength = secondArg->Int32Value(vm);
595         if (std::isinf(static_cast<float>(secondArg->ToNumber(vm)->Value()))) {
596             maxLength = INT32_MAX; // Infinity
597         }
598         if (maxLength >= 0) {
599             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMaxLength(nativeNode, maxLength);
600         } else {
601             GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxLength(nativeNode);
602         }
603     }
604     return panda::JSValueRef::Undefined(vm);
605 }
606 
ResetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue TextAreaBridge::ResetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
608 {
609     EcmaVM *vm = runtimeCallInfo->GetVM();
610     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
611     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
612     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
613     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxLength(nativeNode);
614     return panda::JSValueRef::Undefined(vm);
615 }
616 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)617 ArkUINativeModuleValue TextAreaBridge::SetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
618 {
619     EcmaVM *vm = runtimeCallInfo->GetVM();
620     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
621     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
622     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
623     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
624     Color color;
625     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
626         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontColor(nativeNode);
627     } else {
628         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontColor(nativeNode, color.GetValue());
629     }
630     return panda::JSValueRef::Undefined(vm);
631 }
632 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)633 ArkUINativeModuleValue TextAreaBridge::ResetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
634 {
635     EcmaVM *vm = runtimeCallInfo->GetVM();
636     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
637     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
638     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
639     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontColor(nativeNode);
640     return panda::JSValueRef::Undefined(vm);
641 }
642 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)643 ArkUINativeModuleValue TextAreaBridge::SetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
644 {
645     EcmaVM *vm = runtimeCallInfo->GetVM();
646     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
647     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
648     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
649     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
650     if (secondArg->IsNumber()) {
651         int32_t fontStyle = secondArg->Int32Value(vm);
652         if (fontStyle >= 0 && fontStyle < static_cast<int32_t>(FONT_STYLES.size())) {
653             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontStyle(nativeNode,
654                 static_cast<uint32_t>(fontStyle));
655         } else {
656             return panda::JSValueRef::Undefined(vm);
657         }
658     } else {
659         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontStyle(nativeNode);
660     }
661     return panda::JSValueRef::Undefined(vm);
662 }
663 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)664 ArkUINativeModuleValue TextAreaBridge::ResetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
665 {
666     EcmaVM *vm = runtimeCallInfo->GetVM();
667     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
668     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
669     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
670     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontStyle(nativeNode);
671     return panda::JSValueRef::Undefined(vm);
672 }
673 
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)674 ArkUINativeModuleValue TextAreaBridge::SetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
675 {
676     EcmaVM *vm = runtimeCallInfo->GetVM();
677     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
678     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
679     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
680     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
681     std::string fontWeight = DEFAULT_FONT_WEIGHT;
682     if (!secondArg->IsNull()) {
683         if (secondArg->IsNumber()) {
684             fontWeight = std::to_string(secondArg->Int32Value(vm));
685         } else if (secondArg->IsString(vm)) {
686             fontWeight = secondArg->ToString(vm)->ToString(vm);
687         }
688     }
689     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontWeightStr(nativeNode, fontWeight.c_str());
690     return panda::JSValueRef::Undefined(vm);
691 }
692 
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)693 ArkUINativeModuleValue TextAreaBridge::ResetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
694 {
695     EcmaVM *vm = runtimeCallInfo->GetVM();
696     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
697     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
698     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
699     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontWeight(nativeNode);
700     return panda::JSValueRef::Undefined(vm);
701 }
702 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)703 ArkUINativeModuleValue TextAreaBridge::SetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
704 {
705     EcmaVM *vm = runtimeCallInfo->GetVM();
706     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
707     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
708     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
709     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(NUM_1);
710     struct ArkUIResourceLength fontSize = { 0.0, 0, nullptr };
711     CalcDimension size;
712     std::string calcStr;
713     if (jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionNG(vm, jsValue, size, DimensionUnit::FP, false)) {
714         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontSize(nativeNode);
715     } else {
716         if (size.Unit() == DimensionUnit::CALC) {
717             fontSize.unit = static_cast<int32_t>(DimensionUnit::CALC);
718             calcStr = size.CalcValue();
719             fontSize.string = calcStr.c_str();
720             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontSize(nativeNode, &fontSize);
721         } else {
722             fontSize.value = size.Value();
723             fontSize.unit = static_cast<int32_t>(size.Unit());
724             fontSize.string = calcStr.c_str();
725             GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontSize(nativeNode, &fontSize);
726         }
727     }
728     return panda::JSValueRef::Undefined(vm);
729 }
730 
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)731 ArkUINativeModuleValue TextAreaBridge::ResetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
732 {
733     EcmaVM *vm = runtimeCallInfo->GetVM();
734     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
735     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
736     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
737     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontSize(nativeNode);
738     return panda::JSValueRef::Undefined(vm);
739 }
740 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)741 ArkUINativeModuleValue TextAreaBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
742 {
743     EcmaVM* vm = runtimeCallInfo->GetVM();
744     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
745     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
746     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
747     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
748     if (secondArg->IsString(vm)) {
749         auto value = secondArg->ToString(vm)->ToString(vm);
750         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaFontFeature(nativeNode, value.c_str());
751     } else {
752         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontFeature(nativeNode);
753     }
754     return panda::JSValueRef::Undefined(vm);
755 }
756 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)757 ArkUINativeModuleValue TextAreaBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
758 {
759     EcmaVM* vm = runtimeCallInfo->GetVM();
760     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
761     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
762     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
763     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaFontFeature(nativeNode);
764     return panda::JSValueRef::Undefined(vm);
765 }
766 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)767 ArkUINativeModuleValue TextAreaBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
768 {
769     EcmaVM* vm = runtimeCallInfo->GetVM();
770     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
771     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
772     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
773     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
774     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
775     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
776     auto container = Container::Current();
777     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
778     auto pipelineContext = container->GetPipelineContext();
779     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
780     auto themeManager = pipelineContext->GetThemeManager();
781     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
782     auto theme = themeManager->GetTheme<TextFieldTheme>();
783     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
784     Color color = theme->GetTextStyle().GetTextDecorationColor();
785     int32_t textAreaDecoration = static_cast<int32_t>(theme->GetTextStyle().GetTextDecoration());
786     if (secondArg->IsInt()) {
787         textAreaDecoration = secondArg->Int32Value(vm);
788     }
789     ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, Color::BLACK);
790     int32_t textDecorationStyle = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
791     if (fourthArg->IsInt()) {
792         textDecorationStyle = fourthArg->Int32Value(vm);
793     }
794     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaDecoration(
795         nativeNode, textAreaDecoration, color.GetValue(), textDecorationStyle);
796     return panda::JSValueRef::Undefined(vm);
797 }
798 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)799 ArkUINativeModuleValue TextAreaBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
800 {
801     EcmaVM* vm = runtimeCallInfo->GetVM();
802     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
803     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
804     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
805     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaDecoration(nativeNode);
806     return panda::JSValueRef::Undefined(vm);
807 }
808 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)809 ArkUINativeModuleValue TextAreaBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
810 {
811     EcmaVM* vm = runtimeCallInfo->GetVM();
812     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
813     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
814     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
815     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
816     CalcDimension value;
817     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
818         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLetterSpacing(nativeNode);
819     } else {
820         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaLetterSpacing(
821             nativeNode, value.Value(), static_cast<int>(value.Unit()));
822     }
823     return panda::JSValueRef::Undefined(vm);
824 }
825 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)826 ArkUINativeModuleValue TextAreaBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
827 {
828     EcmaVM* vm = runtimeCallInfo->GetVM();
829     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
830     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
831     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
832     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
833     CalcDimension value;
834     auto pipelineContext = PipelineBase::GetCurrentContext();
835     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
836     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
837     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
838     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
839         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaAdaptMinFontSize(nativeNode);
840     } else {
841         if (value.IsNegative()) {
842             value = theme->GetTextStyle().GetAdaptMinFontSize();
843         }
844         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaAdaptMinFontSize(
845             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
846     }
847     return panda::JSValueRef::Undefined(vm);
848 }
849 
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)850 ArkUINativeModuleValue TextAreaBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
851 {
852     EcmaVM* vm = runtimeCallInfo->GetVM();
853     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
854     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
855     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
856     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
857     double minFontScale;
858     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale)) {
859         return panda::JSValueRef::Undefined(vm);
860     }
861     if (LessOrEqual(minFontScale, 0.0f)) {
862         minFontScale = 0.0f;
863     } else if (GreatOrEqual(minFontScale, 1.0f)) {
864         minFontScale = 1.0f;
865     }
866     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMinFontScale(
867         nativeNode, static_cast<float>(minFontScale));
868     return panda::JSValueRef::Undefined(vm);
869 }
870 
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)871 ArkUINativeModuleValue TextAreaBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
872 {
873     EcmaVM* vm = runtimeCallInfo->GetVM();
874     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
875     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
876     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
877     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMinFontScale(nativeNode);
878     return panda::JSValueRef::Undefined(vm);
879 }
880 
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)881 ArkUINativeModuleValue TextAreaBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
882 {
883     EcmaVM* vm = runtimeCallInfo->GetVM();
884     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
885     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
886     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
887     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
888     double maxFontScale;
889     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale)) {
890         return panda::JSValueRef::Undefined(vm);
891     }
892     if (LessOrEqual(maxFontScale, 1.0f)) {
893         maxFontScale = 1.0f;
894     }
895     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMaxFontScale(
896         nativeNode, static_cast<float>(maxFontScale));
897     return panda::JSValueRef::Undefined(vm);
898 }
899 
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)900 ArkUINativeModuleValue TextAreaBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
901 {
902     EcmaVM* vm = runtimeCallInfo->GetVM();
903     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
904     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
905     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
906     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMaxFontScale(nativeNode);
907     return panda::JSValueRef::Undefined(vm);
908 }
909 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)910 ArkUINativeModuleValue TextAreaBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
911 {
912     EcmaVM* vm = runtimeCallInfo->GetVM();
913     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
914     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
915     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
916     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLetterSpacing(nativeNode);
917     return panda::JSValueRef::Undefined(vm);
918 }
919 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)920 ArkUINativeModuleValue TextAreaBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
921 {
922     EcmaVM* vm = runtimeCallInfo->GetVM();
923     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
924     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
925     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
926     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
927     CalcDimension value;
928     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, true)) {
929         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineHeight(nativeNode);
930     } else {
931         if (value.IsNegative()) {
932             value.Reset();
933         }
934         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaLineHeight(
935             nativeNode, value.Value(), static_cast<int>(value.Unit()));
936     }
937     return panda::JSValueRef::Undefined(vm);
938 }
939 
ResetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue TextAreaBridge::ResetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942     EcmaVM* vm = runtimeCallInfo->GetVM();
943     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
944     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
945     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
946     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaAdaptMinFontSize(nativeNode);
947     return panda::JSValueRef::Undefined(vm);
948 }
949 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)950 ArkUINativeModuleValue TextAreaBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
951 {
952     EcmaVM* vm = runtimeCallInfo->GetVM();
953     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
954     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
955     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
956     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
957     CalcDimension value;
958     auto pipelineContext = PipelineBase::GetCurrentContext();
959     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
960     auto theme = pipelineContext->GetTheme<TextFieldTheme>();
961     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
962     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
963         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaAdaptMaxFontSize(nativeNode);
964     } else {
965         if (value.IsNegative()) {
966             value = theme->GetTextStyle().GetAdaptMaxFontSize();
967         }
968         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaAdaptMaxFontSize(
969             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
970     }
971     return panda::JSValueRef::Undefined(vm);
972 }
973 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)974 ArkUINativeModuleValue TextAreaBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
975 {
976     EcmaVM* vm = runtimeCallInfo->GetVM();
977     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
978     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
979     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
980     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineHeight(nativeNode);
981     return panda::JSValueRef::Undefined(vm);
982 }
983 
SetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)984 ArkUINativeModuleValue TextAreaBridge::SetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
985 {
986     EcmaVM* vm = runtimeCallInfo->GetVM();
987     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
988     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
989     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
990     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
991     if (secondArg->IsBoolean()) {
992         uint32_t halfLeading = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
993         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaHalfLeading(nativeNode, halfLeading);
994     } else {
995         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaHalfLeading(nativeNode);
996     }
997     return panda::JSValueRef::Undefined(vm);
998 }
999 
ResetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1000 ArkUINativeModuleValue TextAreaBridge::ResetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1001 {
1002     EcmaVM* vm = runtimeCallInfo->GetVM();
1003     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1004     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1005     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1006     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaHalfLeading(nativeNode);
1007     return panda::JSValueRef::Undefined(vm);
1008 }
1009 
SetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1010 ArkUINativeModuleValue TextAreaBridge::SetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1011 {
1012     EcmaVM* vm = runtimeCallInfo->GetVM();
1013     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1014     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1015     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1016     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1017     if (secondArg->IsNumber()) {
1018         uint32_t keyboardAppearance = secondArg->Uint32Value(vm);
1019         if (keyboardAppearance >= static_cast<uint32_t>(KeyboardAppearance::NONE_IMMERSIVE) &&
1020             keyboardAppearance <= static_cast<uint32_t>(KeyboardAppearance::DARK_IMMERSIVE)) {
1021             GetArkUINodeModifiers()->getTextAreaModifier()->
1022                 setTextAreaKeyboardAppearance(nativeNode, keyboardAppearance); // when input is valid
1023             return panda::JSValueRef::Undefined(vm);
1024         }
1025     }
1026     GetArkUINodeModifiers()->getTextAreaModifier()->
1027         setTextAreaKeyboardAppearance(nativeNode, static_cast<int32_t>(KeyboardAppearance::NONE_IMMERSIVE));
1028     return panda::JSValueRef::Undefined(vm);
1029 }
1030 
ResetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1031 ArkUINativeModuleValue TextAreaBridge::ResetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1032 {
1033     EcmaVM* vm = runtimeCallInfo->GetVM();
1034     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1035     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1036     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1037     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaKeyboardAppearance(nativeNode);
1038     return panda::JSValueRef::Undefined(vm);
1039 }
1040 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1041 ArkUINativeModuleValue TextAreaBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1042 {
1043     EcmaVM* vm = runtimeCallInfo->GetVM();
1044     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1045     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1046     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1047     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1048     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
1049         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaWordBreak(nativeNode);
1050         return panda::JSValueRef::Undefined(vm);
1051     }
1052     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
1053     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaWordBreak(nativeNode, wordBreak);
1054     return panda::JSValueRef::Undefined(vm);
1055 }
1056 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)1057 ArkUINativeModuleValue TextAreaBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
1058 {
1059     EcmaVM* vm = runtimeCallInfo->GetVM();
1060     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1061     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1062     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1063     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaWordBreak(nativeNode);
1064     return panda::JSValueRef::Undefined(vm);
1065 }
1066 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1067 ArkUINativeModuleValue TextAreaBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1068 {
1069     EcmaVM* vm = runtimeCallInfo->GetVM();
1070     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1071     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1072     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1073     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1074     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
1075         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineBreakStrategy(nativeNode);
1076         return panda::JSValueRef::Undefined(vm);
1077     }
1078     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
1079     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaLineBreakStrategy(nativeNode, lineBreakStrategy);
1080     return panda::JSValueRef::Undefined(vm);
1081 }
1082 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)1083 ArkUINativeModuleValue TextAreaBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1084 {
1085     EcmaVM* vm = runtimeCallInfo->GetVM();
1086     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1087     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1088     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1089     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineBreakStrategy(nativeNode);
1090     return panda::JSValueRef::Undefined(vm);
1091 }
1092 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1093 ArkUINativeModuleValue TextAreaBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1094 {
1095     EcmaVM* vm = runtimeCallInfo->GetVM();
1096     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1097     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1098     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1099     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaAdaptMaxFontSize(nativeNode);
1100     return panda::JSValueRef::Undefined(vm);
1101 }
1102 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1103 ArkUINativeModuleValue TextAreaBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1104 {
1105     EcmaVM* vm = runtimeCallInfo->GetVM();
1106     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1107     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1108     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1109     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1110     int32_t value = valueArg->ToNumber(vm)->Value();
1111     if (value < 0 || value >= static_cast<int32_t>(HEIGHT_ADAPTIVE_POLICY.size())) {
1112         value = 0;
1113     }
1114     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaHeightAdaptivePolicy(nativeNode, value);
1115     return panda::JSValueRef::Undefined(vm);
1116 }
1117 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)1118 ArkUINativeModuleValue TextAreaBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1119 {
1120     EcmaVM* vm = runtimeCallInfo->GetVM();
1121     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1122     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1123     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1124     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaHeightAdaptivePolicy(nativeNode);
1125     return panda::JSValueRef::Undefined(vm);
1126 }
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1127 ArkUINativeModuleValue TextAreaBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1128 {
1129     EcmaVM* vm = runtimeCallInfo->GetVM();
1130     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1131     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1132     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1133     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1134     Color color;
1135     if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1136         if (color.GetAlpha() == DEFAULT_ALPHA) {
1137             color = color.ChangeOpacity(DEFAULT_OPACITY);
1138         }
1139         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaSelectedBackgroundColor(
1140             nativeNode, color.GetValue());
1141     } else {
1142         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaSelectedBackgroundColor(nativeNode);
1143     }
1144     return panda::JSValueRef::Undefined(vm);
1145 }
1146 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1147 ArkUINativeModuleValue TextAreaBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1148 {
1149     EcmaVM* vm = runtimeCallInfo->GetVM();
1150     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1151     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1152     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1153     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaSelectedBackgroundColor(nativeNode);
1154     return panda::JSValueRef::Undefined(vm);
1155 }
1156 
SetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1157 ArkUINativeModuleValue TextAreaBridge::SetCaretStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1158 {
1159     EcmaVM *vm = runtimeCallInfo->GetVM();
1160     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1161     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1162     Local<JSValueRef> caretWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1163     Local<JSValueRef> caretColorArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1164     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1165 
1166     auto textFieldTheme = ArkTSUtils::GetTheme<TextFieldTheme>();
1167     CHECK_NULL_RETURN(textFieldTheme, panda::JSValueRef::Undefined(vm));
1168     CalcDimension caretWidth = textFieldTheme->GetCursorWidth();
1169     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, caretWidthArg, caretWidth, false) ||
1170             LessNotEqual(caretWidth.Value(), 0.0)) {
1171         caretWidth = textFieldTheme->GetCursorWidth();
1172     }
1173     Color color;
1174     uint32_t caretColor;
1175     if (!caretColorArg->IsUndefined()) {
1176         if (ArkTSUtils::ParseJsColorAlpha(vm, caretColorArg, color)) {
1177             caretColor = color.GetValue();
1178         } else {
1179             caretColor = textFieldTheme->GetCursorColor().GetValue();
1180         }
1181     } else {
1182         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaCaret(
1183             nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()));
1184         return panda::JSValueRef::Undefined(vm);
1185     }
1186     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaCaretStyle(
1187         nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()), caretColor);
1188     return panda::JSValueRef::Undefined(vm);
1189 }
1190 
ResetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1191 ArkUINativeModuleValue TextAreaBridge::ResetCaretStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1192 {
1193     EcmaVM *vm = runtimeCallInfo->GetVM();
1194     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1195     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1196     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1197     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaCaretStyle(nativeNode);
1198     return panda::JSValueRef::Undefined(vm);
1199 }
1200 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1201 ArkUINativeModuleValue TextAreaBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1202 {
1203     EcmaVM* vm = runtimeCallInfo->GetVM();
1204     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1205     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1206     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1207     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1208     int32_t value;
1209     if (secondArg->IsUndefined()) {
1210         value = DEFAULT_OVERFLOW;
1211     } else if (secondArg->IsNumber()) {
1212         value = secondArg->Int32Value(vm);
1213     } else {
1214         value = DEFAULT_OVERFLOW;
1215     }
1216     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
1217         value = DEFAULT_OVERFLOW;
1218     }
1219     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaTextOverflow(nativeNode, value);
1220     return panda::JSValueRef::Undefined(vm);
1221 }
1222 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)1223 ArkUINativeModuleValue TextAreaBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
1224 {
1225     EcmaVM* vm = runtimeCallInfo->GetVM();
1226     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1227     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1228     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1229     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaTextOverflow(nativeNode);
1230     return panda::JSValueRef::Undefined(vm);
1231 }
1232 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1233 ArkUINativeModuleValue TextAreaBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1234 {
1235     EcmaVM* vm = runtimeCallInfo->GetVM();
1236     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1237     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1238     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1239     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1240     CalcDimension indent;
1241     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, indent, DimensionUnit::VP, true)) {
1242         indent.Reset();
1243     }
1244 
1245     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaTextIndent(
1246         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()));
1247     return panda::JSValueRef::Undefined(vm);
1248 }
1249 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)1250 ArkUINativeModuleValue TextAreaBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1251 {
1252     EcmaVM* vm = runtimeCallInfo->GetVM();
1253     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1254     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1255     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1256     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaTextIndent(nativeNode);
1257     return panda::JSValueRef::Undefined(vm);
1258 }
1259 
SetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1260 ArkUINativeModuleValue TextAreaBridge::SetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1261 {
1262     EcmaVM* vm = runtimeCallInfo->GetVM();
1263     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1264     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1265     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1266     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1267     CalcDimension value;
1268     if (!ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, value)) {
1269         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineSpacing(nativeNode);
1270     } else {
1271         if (value.IsNegative()) {
1272             value.Reset();
1273         }
1274         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaLineSpacing(
1275             nativeNode, value.Value(), static_cast<int>(value.Unit()));
1276     }
1277     return panda::JSValueRef::Undefined(vm);
1278 }
1279 
ResetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1280 ArkUINativeModuleValue TextAreaBridge::ResetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1281 {
1282     EcmaVM* vm = runtimeCallInfo->GetVM();
1283     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1284     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1285     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1286     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaLineSpacing(nativeNode);
1287     return panda::JSValueRef::Undefined(vm);
1288 }
1289 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1290 ArkUINativeModuleValue TextAreaBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1291 {
1292     EcmaVM *vm = runtimeCallInfo->GetVM();
1293     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1295     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1296     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1297     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1298     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1299     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1300         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnChange(nativeNode);
1301         return panda::JSValueRef::Undefined(vm);
1302     }
1303     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1304     std::function<void(const ChangeValueInfo&)> callback = [vm, frameNode,
1305         func = panda::CopyableGlobal(vm, func)](const ChangeValueInfo& changeValueInfo) {
1306         panda::LocalScope pandaScope(vm);
1307         panda::TryCatch trycatch(vm);
1308         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1309         auto eventObject = CommonBridge::CreateChangeValueInfoObj(vm, changeValueInfo);
1310         auto contentObj = eventObject->Get(vm, "content");
1311         auto previewTextObj = eventObject->Get(vm, "previewText");
1312         auto optionsObj = eventObject->Get(vm, "options");
1313         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_3] = { contentObj, previewTextObj, optionsObj };
1314         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_3);
1315     };
1316     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnChange(
1317         nativeNode, reinterpret_cast<void*>(&callback));
1318     return panda::JSValueRef::Undefined(vm);
1319 }
1320 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1321 ArkUINativeModuleValue TextAreaBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1322 {
1323     EcmaVM* vm = runtimeCallInfo->GetVM();
1324     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1325     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1326     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1327     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnChange(nativeNode);
1328     return panda::JSValueRef::Undefined(vm);
1329 }
1330 
SetEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)1331 ArkUINativeModuleValue TextAreaBridge::SetEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1332 {
1333     EcmaVM *vm = runtimeCallInfo->GetVM();
1334     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1335     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1336     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1337     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1338 
1339     if (secondArg->IsNumber()) {
1340         int32_t value = secondArg->Int32Value(vm);
1341         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaEnterKeyType(nativeNode, value);
1342     } else {
1343         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnterKeyType(nativeNode);
1344     }
1345     return panda::JSValueRef::Undefined(vm);
1346 }
1347 
ResetEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)1348 ArkUINativeModuleValue TextAreaBridge::ResetEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1349 {
1350     EcmaVM *vm = runtimeCallInfo->GetVM();
1351     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1352     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1353     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1354     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnterKeyType(nativeNode);
1355     return panda::JSValueRef::Undefined(vm);
1356 }
1357 
SetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1358 ArkUINativeModuleValue TextAreaBridge::SetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1359 {
1360     EcmaVM *vm = runtimeCallInfo->GetVM();
1361     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1362     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1363     Local<JSValueRef> inputFilterArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1364     Local<JSValueRef> errorCallbackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1365     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1366     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1367     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1368     if (inputFilterArg->IsUndefined() || inputFilterArg->IsNull() || !inputFilterArg->IsString(vm)) {
1369         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaInputFilter(nativeNode);
1370         return panda::JSValueRef::Undefined(vm);
1371     }
1372     std::string inputFilter = inputFilterArg->ToString(vm)->ToString(vm);
1373     if (errorCallbackArg->IsUndefined() || errorCallbackArg->IsNull() ||
1374         !errorCallbackArg->IsFunction(vm)) {
1375         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaInputFilter(
1376             nativeNode, inputFilter.c_str(), nullptr);
1377     } else {
1378         panda::Local<panda::FunctionRef> func = errorCallbackArg->ToObject(vm);
1379         std::function<void(const std::u16string&)> callback = [vm, frameNode,
1380             func = panda::CopyableGlobal(vm, func)](const std::u16string& info) {
1381             panda::LocalScope pandaScope(vm);
1382             panda::TryCatch trycatch(vm);
1383             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1384             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1385                 panda::StringRef::NewFromUtf16(vm, info.c_str()) };
1386             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1387         };
1388         GetArkUINodeModifiers()->getTextAreaModifier()->
1389             setTextAreaInputFilter(nativeNode, inputFilter.c_str(), reinterpret_cast<void*>(&callback));
1390     }
1391     return panda::JSValueRef::Undefined(vm);
1392 }
1393 
ResetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)1394 ArkUINativeModuleValue TextAreaBridge::ResetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1395 {
1396     EcmaVM* vm = runtimeCallInfo->GetVM();
1397     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1398     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1399     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1400     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaInputFilter(nativeNode);
1401     return panda::JSValueRef::Undefined(vm);
1402 }
1403 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1404 ArkUINativeModuleValue TextAreaBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1405 {
1406     EcmaVM *vm = runtimeCallInfo->GetVM();
1407     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1408     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1409     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1410     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1411     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1412     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1413     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1414         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnTextSelectionChange(nativeNode);
1415         return panda::JSValueRef::Undefined(vm);
1416     }
1417     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1418     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1419         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int selectionEnd) {
1420         panda::LocalScope pandaScope(vm);
1421         panda::TryCatch trycatch(vm);
1422         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1423         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1424         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1425         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1426         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1427     };
1428     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnTextSelectionChange(
1429         nativeNode, reinterpret_cast<void*>(&callback));
1430     return panda::JSValueRef::Undefined(vm);
1431 }
1432 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1433 ArkUINativeModuleValue TextAreaBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1434 {
1435     EcmaVM* vm = runtimeCallInfo->GetVM();
1436     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1437     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1438     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1439     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnTextSelectionChange(nativeNode);
1440     return panda::JSValueRef::Undefined(vm);
1441 }
1442 
SetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1443 ArkUINativeModuleValue TextAreaBridge::SetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1444 {
1445     EcmaVM *vm = runtimeCallInfo->GetVM();
1446     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1447     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1448     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1449     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1450     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1451     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1452     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1453         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnContentScroll(nativeNode);
1454         return panda::JSValueRef::Undefined(vm);
1455     }
1456     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1457     std::function<void(float, float)> callback = [vm, frameNode,
1458         func = panda::CopyableGlobal(vm, func)](float totalOffsetX, float totalOffsetY) {
1459         panda::LocalScope pandaScope(vm);
1460         panda::TryCatch trycatch(vm);
1461         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1462         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1463             panda::NumberRef::New(vm, totalOffsetX), panda::NumberRef::New(vm, totalOffsetY) };
1464         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1465     };
1466     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnContentScroll(
1467         nativeNode, reinterpret_cast<void*>(&callback));
1468     return panda::JSValueRef::Undefined(vm);
1469 }
1470 
ResetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1471 ArkUINativeModuleValue TextAreaBridge::ResetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1472 {
1473     EcmaVM* vm = runtimeCallInfo->GetVM();
1474     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1475     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1476     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1477     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnContentScroll(nativeNode);
1478     return panda::JSValueRef::Undefined(vm);
1479 }
1480 
SetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1481 ArkUINativeModuleValue TextAreaBridge::SetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1482 {
1483     EcmaVM *vm = runtimeCallInfo->GetVM();
1484     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1485     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1486     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1487     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1488     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1489     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1490     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1491         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnEditChange(nativeNode);
1492         return panda::JSValueRef::Undefined(vm);
1493     }
1494     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1495     std::function<void(bool)> callback = [vm, frameNode,
1496         func = panda::CopyableGlobal(vm, func)](bool isInEditStatus) {
1497         panda::LocalScope pandaScope(vm);
1498         panda::TryCatch trycatch(vm);
1499         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1500         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1501             panda::BooleanRef::New(vm, isInEditStatus) };
1502         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1503     };
1504     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnEditChange(
1505         nativeNode, reinterpret_cast<void*>(&callback));
1506     return panda::JSValueRef::Undefined(vm);
1507 }
1508 
ResetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1509 ArkUINativeModuleValue TextAreaBridge::ResetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1510 {
1511     EcmaVM* vm = runtimeCallInfo->GetVM();
1512     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1513     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1514     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1515     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnEditChange(nativeNode);
1516     return panda::JSValueRef::Undefined(vm);
1517 }
1518 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1519 ArkUINativeModuleValue TextAreaBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1520 {
1521     EcmaVM *vm = runtimeCallInfo->GetVM();
1522     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1523     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1524     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1525     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1526     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1527     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1528     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1529         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnCopy(nativeNode);
1530         return panda::JSValueRef::Undefined(vm);
1531     }
1532     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1533     std::function<void(const std::u16string&)> callback = [vm, frameNode,
1534         func = panda::CopyableGlobal(vm, func)](const std::u16string& copyStr) {
1535         panda::LocalScope pandaScope(vm);
1536         panda::TryCatch trycatch(vm);
1537         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1538         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1539             panda::StringRef::NewFromUtf16(vm, copyStr.c_str()) };
1540         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1541     };
1542     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1543     return panda::JSValueRef::Undefined(vm);
1544 }
1545 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1546 ArkUINativeModuleValue TextAreaBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1547 {
1548     EcmaVM* vm = runtimeCallInfo->GetVM();
1549     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1550     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1551     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1552     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnCopy(nativeNode);
1553     return panda::JSValueRef::Undefined(vm);
1554 }
1555 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1556 ArkUINativeModuleValue TextAreaBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1557 {
1558     EcmaVM *vm = runtimeCallInfo->GetVM();
1559     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1560     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1561     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1562     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1563     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1564     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1565     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1566         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnCut(nativeNode);
1567         return panda::JSValueRef::Undefined(vm);
1568     }
1569     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1570     std::function<void(const std::u16string&)> callback = [vm, frameNode,
1571         func = panda::CopyableGlobal(vm, func)](const std::u16string& cutStr) {
1572         panda::LocalScope pandaScope(vm);
1573         panda::TryCatch trycatch(vm);
1574         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1575         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1576             panda::StringRef::NewFromUtf16(vm, cutStr.c_str()) };
1577         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1578     };
1579     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnCut(nativeNode, reinterpret_cast<void*>(&callback));
1580     return panda::JSValueRef::Undefined(vm);
1581 }
1582 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1583 ArkUINativeModuleValue TextAreaBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1584 {
1585     EcmaVM* vm = runtimeCallInfo->GetVM();
1586     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1587     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1588     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1589     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnCut(nativeNode);
1590     return panda::JSValueRef::Undefined(vm);
1591 }
1592 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1593 ArkUINativeModuleValue TextAreaBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1594 {
1595     EcmaVM *vm = runtimeCallInfo->GetVM();
1596     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1597     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1598     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1599     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1600     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1601     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1602     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1603         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnPaste(nativeNode);
1604         return panda::JSValueRef::Undefined(vm);
1605     }
1606     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1607     std::function<void(const std::u16string&, NG::TextCommonEvent&)> callback = [vm, frameNode,
1608         func = panda::CopyableGlobal(vm, func)](const std::u16string& val, NG::TextCommonEvent& info) {
1609         panda::LocalScope pandaScope(vm);
1610         panda::TryCatch trycatch(vm);
1611         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1612         auto eventObject = panda::ObjectRef::New(vm);
1613         eventObject->SetNativePointerFieldCount(vm, 1);
1614         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
1615             panda::FunctionRef::New(vm, Framework::JsPreventDefault));
1616         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1617         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1618             panda::StringRef::NewFromUtf16(vm, val.c_str()), eventObject };
1619         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1620     };
1621     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnPaste(
1622         nativeNode, reinterpret_cast<void*>(&callback));
1623     return panda::JSValueRef::Undefined(vm);
1624 }
1625 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1626 ArkUINativeModuleValue TextAreaBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1627 {
1628     EcmaVM* vm = runtimeCallInfo->GetVM();
1629     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1630     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1631     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1632     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnPaste(nativeNode);
1633     return panda::JSValueRef::Undefined(vm);
1634 }
1635 
SetType(ArkUIRuntimeCallInfo * runtimeCallInfo)1636 ArkUINativeModuleValue TextAreaBridge::SetType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1637 {
1638     EcmaVM *vm = runtimeCallInfo->GetVM();
1639     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1640     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1641     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1642     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1643     if (secondArg->IsNumber()) {
1644         int32_t value = secondArg->Int32Value(vm);
1645         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaType(nativeNode, value);
1646     } else {
1647         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaType(nativeNode);
1648     }
1649     return panda::JSValueRef::Undefined(vm);
1650 }
1651 
ResetType(ArkUIRuntimeCallInfo * runtimeCallInfo)1652 ArkUINativeModuleValue TextAreaBridge::ResetType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1653 {
1654     EcmaVM* vm = runtimeCallInfo->GetVM();
1655     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1656     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1657     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1658     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaType(nativeNode);
1659     return panda::JSValueRef::Undefined(vm);
1660 }
1661 
SetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)1662 ArkUINativeModuleValue TextAreaBridge::SetPadding(ArkUIRuntimeCallInfo *runtimeCallInfo)
1663 {
1664     EcmaVM *vm = runtimeCallInfo->GetVM();
1665     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1666     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1667     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1668     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1669     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1670     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1671     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1672 
1673     struct ArkUISizeType top = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
1674     struct ArkUISizeType right = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
1675     struct ArkUISizeType bottom = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
1676     struct ArkUISizeType left = { 0.0, static_cast<int8_t>(DimensionUnit::VP), nullptr };
1677 
1678     CalcDimension topDimen(0, DimensionUnit::VP);
1679     CalcDimension rightDimen(0, DimensionUnit::VP);
1680     CalcDimension bottomDimen(0, DimensionUnit::VP);
1681     CalcDimension leftDimen(0, DimensionUnit::VP);
1682 
1683     bool isLengthMetrics = false;
1684     if (secondArg->IsObject(vm)) {
1685         isLengthMetrics |= ParseLocalizedPadding(vm, secondArg, topDimen, top);
1686     }
1687     if (thirdArg->IsObject(vm)) {
1688         isLengthMetrics |= ParseLocalizedPadding(vm, thirdArg, rightDimen, right);
1689     }
1690     if (forthArg->IsObject(vm)) {
1691         isLengthMetrics |= ParseLocalizedPadding(vm, forthArg, bottomDimen, bottom);
1692     }
1693     if (fifthArg->IsObject(vm)) {
1694         isLengthMetrics |= ParseLocalizedPadding(vm, fifthArg, leftDimen, left);
1695     }
1696 
1697     if (isLengthMetrics) {
1698         auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
1699         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPadding(nativeNode,
1700             &top,
1701             isRightToLeft ? &left : &right,
1702             &bottom,
1703             isRightToLeft ? &right : &left);
1704         return panda::JSValueRef::Undefined(vm);
1705     }
1706 
1707     ArkTSUtils::ParsePadding(vm, secondArg, topDimen, top);
1708     ArkTSUtils::ParsePadding(vm, thirdArg, rightDimen, right);
1709     ArkTSUtils::ParsePadding(vm, forthArg, bottomDimen, bottom);
1710     ArkTSUtils::ParsePadding(vm, fifthArg, leftDimen, left);
1711     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPadding(nativeNode, &top, &right, &bottom, &left);
1712     return panda::JSValueRef::Undefined(vm);
1713 }
1714 
ResetPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)1715 ArkUINativeModuleValue TextAreaBridge::ResetPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
1716 {
1717     EcmaVM *vm = runtimeCallInfo->GetVM();
1718     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1719     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1720     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1721     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaPadding(nativeNode);
1722     return panda::JSValueRef::Undefined(vm);
1723 }
1724 
SetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1725 ArkUINativeModuleValue TextAreaBridge::SetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1726 {
1727     EcmaVM *vm = runtimeCallInfo->GetVM();
1728     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1730     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1732     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1733     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1734     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1735         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnSubmitWithEvent(nativeNode);
1736         return panda::JSValueRef::Undefined(vm);
1737     }
1738     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1739     std::function<void(int32_t, NG::TextFieldCommonEvent&)> callback = [vm, frameNode,
1740         func = panda::CopyableGlobal(vm, func)](int32_t key, NG::TextFieldCommonEvent& event) {
1741         panda::LocalScope pandaScope(vm);
1742         panda::TryCatch trycatch(vm);
1743         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1744         const char* keys[] = { "text", "keepEditableState" };
1745         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf16(vm, event.GetText().c_str()),
1746             panda::FunctionRef::New(vm, Framework::JSTextField::JsKeepEditableState) };
1747         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1748         eventObject->SetNativePointerFieldCount(vm, 1);
1749         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
1750         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { panda::IntegerRef::New(vm, key), eventObject };
1751         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1752     };
1753     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnSubmitWithEvent(
1754         nativeNode, reinterpret_cast<void*>(&callback));
1755     return panda::JSValueRef::Undefined(vm);
1756 }
1757 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1758 ArkUINativeModuleValue TextAreaBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1759 {
1760     EcmaVM* vm = runtimeCallInfo->GetVM();
1761     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1762     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1763     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1764     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnSubmitWithEvent(nativeNode);
1765     return panda::JSValueRef::Undefined(vm);
1766 }
1767 
SetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)1768 ArkUINativeModuleValue TextAreaBridge::SetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1769 {
1770     EcmaVM *vm = runtimeCallInfo->GetVM();
1771     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1772     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1773     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1774     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1775 
1776     if (secondArg->IsNumber()) {
1777         uint32_t value = static_cast<uint32_t>(secondArg->Int32Value(vm));
1778         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaContentType(nativeNode, value);
1779     } else {
1780         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaContentType(nativeNode);
1781     }
1782     return panda::JSValueRef::Undefined(vm);
1783 }
1784 
ResetContentType(ArkUIRuntimeCallInfo * runtimeCallInfo)1785 ArkUINativeModuleValue TextAreaBridge::ResetContentType(ArkUIRuntimeCallInfo *runtimeCallInfo)
1786 {
1787     EcmaVM *vm = runtimeCallInfo->GetVM();
1788     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1789     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1790     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1791     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaContentType(nativeNode);
1792     return panda::JSValueRef::Undefined(vm);
1793 }
1794 
SetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)1795 ArkUINativeModuleValue TextAreaBridge::SetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
1796 {
1797     EcmaVM *vm = runtimeCallInfo->GetVM();
1798     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1799     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1800     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1801     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1802 
1803     if (secondArg->IsBoolean()) {
1804         uint32_t enableAutoFill = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1805         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaEnableAutoFill(nativeNode, enableAutoFill);
1806     } else {
1807         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnableAutoFill(nativeNode);
1808     }
1809 
1810     return panda::JSValueRef::Undefined(vm);
1811 }
1812 
ResetEnableAutoFill(ArkUIRuntimeCallInfo * runtimeCallInfo)1813 ArkUINativeModuleValue TextAreaBridge::ResetEnableAutoFill(ArkUIRuntimeCallInfo *runtimeCallInfo)
1814 {
1815     EcmaVM *vm = runtimeCallInfo->GetVM();
1816     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1817     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1818     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1819     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnableAutoFill(nativeNode);
1820     return panda::JSValueRef::Undefined(vm);
1821 }
1822 
SetBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)1823 ArkUINativeModuleValue TextAreaBridge::SetBorder(ArkUIRuntimeCallInfo* runtimeCallInfo)
1824 {
1825     EcmaVM *vm = runtimeCallInfo->GetVM();
1826     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1827     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1828     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1829 
1830     std::vector<ArkUI_Float32> options;
1831     // Border Width args start index from 1
1832     ArkTSUtils::ParseOuterBorderWidth(runtimeCallInfo, vm, options);
1833     // Border Radius args start index
1834     ArkTSUtils::ParseOuterBorderRadius(runtimeCallInfo, vm, options, NUM_9);
1835 
1836     std::vector<uint32_t> colorAndStyleOptions;
1837     // Border Color args start index
1838     ArkTSUtils::ParseOuterBorderColor(runtimeCallInfo, vm, colorAndStyleOptions, NUM_5);
1839     // Border Style args start index
1840     ArkTSUtils::ParseOuterBorderStyle(runtimeCallInfo, vm, colorAndStyleOptions, NUM_13);
1841 
1842     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorder(
1843         nativeNode, options.data(), options.size(), colorAndStyleOptions.data(), colorAndStyleOptions.size());
1844 
1845     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWENTY)) {
1846         SetBorderDash(runtimeCallInfo, vm, nativeNode);
1847     }
1848     return panda::JSValueRef::Undefined(vm);
1849 }
1850 
ResetBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)1851 ArkUINativeModuleValue TextAreaBridge::ResetBorder(ArkUIRuntimeCallInfo *runtimeCallInfo)
1852 {
1853     EcmaVM *vm = runtimeCallInfo->GetVM();
1854     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1855     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1856     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1857     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorder(nativeNode);
1858     return panda::JSValueRef::Undefined(vm);
1859 }
1860 
SetBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)1861 ArkUINativeModuleValue TextAreaBridge::SetBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
1862 {
1863     EcmaVM* vm = runtimeCallInfo->GetVM();
1864     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1865     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1866     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1867     Local<JSValueRef> topArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
1868     Local<JSValueRef> rightArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
1869     Local<JSValueRef> bottomArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
1870     Local<JSValueRef> leftArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
1871     if (leftArgs->IsUndefined() && rightArgs->IsUndefined() && topArgs->IsUndefined() && bottomArgs->IsUndefined()) {
1872         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderWidth(nativeNode);
1873         return panda::JSValueRef::Undefined(vm);
1874     }
1875 
1876     CalcDimension top;
1877     CalcDimension right;
1878     CalcDimension bottom;
1879     CalcDimension left;
1880     bool isLengthMetrics = false;
1881 
1882     if (topArgs->IsObject(vm)) {
1883         isLengthMetrics |= ParseLocalizedBorderWidth(vm, topArgs, top);
1884     }
1885     if (rightArgs->IsObject(vm)) {
1886         isLengthMetrics |= ParseLocalizedBorderWidth(vm, rightArgs, right);
1887     }
1888     if (bottomArgs->IsObject(vm)) {
1889         isLengthMetrics |= ParseLocalizedBorderWidth(vm, bottomArgs, bottom);
1890     }
1891     if (leftArgs->IsObject(vm)) {
1892         isLengthMetrics |= ParseLocalizedBorderWidth(vm, leftArgs, left);
1893     }
1894 
1895     uint32_t size = NUM_4;
1896     ArkUI_Float32 values[size];
1897     int units[size];
1898 
1899     if (isLengthMetrics) {
1900         auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
1901         SetBorderWidthArrayByDimen(top, values, units, NUM_0);
1902         SetBorderWidthArrayByDimen(isRightToLeft ? left : right, values, units, NUM_1);
1903         SetBorderWidthArrayByDimen(bottom, values, units, NUM_2);
1904         SetBorderWidthArrayByDimen(isRightToLeft ? right : left, values, units, NUM_3);
1905     } else {
1906         if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TWENTY)) {
1907             ArkTSUtils::SetBorderWidthArray(vm, topArgs, values, units, NUM_0);
1908             ArkTSUtils::SetBorderWidthArray(vm, rightArgs, values, units, NUM_1);
1909             ArkTSUtils::SetBorderWidthArray(vm, bottomArgs, values, units, NUM_2);
1910             ArkTSUtils::SetBorderWidthArray(vm, leftArgs, values, units, NUM_3);
1911         } else {
1912             ArkTSUtils::SetBorderWidthArray(vm, leftArgs, values, units, NUM_0);
1913             ArkTSUtils::SetBorderWidthArray(vm, rightArgs, values, units, NUM_1);
1914             ArkTSUtils::SetBorderWidthArray(vm, topArgs, values, units, NUM_2);
1915             ArkTSUtils::SetBorderWidthArray(vm, bottomArgs, values, units, NUM_3);
1916         }
1917     }
1918 
1919     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderWidth(nativeNode, values, units, size);
1920     return panda::JSValueRef::Undefined(vm);
1921 }
1922 
ResetBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)1923 ArkUINativeModuleValue TextAreaBridge::ResetBorderWidth(ArkUIRuntimeCallInfo *runtimeCallInfo)
1924 {
1925     EcmaVM *vm = runtimeCallInfo->GetVM();
1926     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1927     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1928     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1929     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderWidth(nativeNode);
1930     return panda::JSValueRef::Undefined(vm);
1931 }
1932 
SetBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1933 ArkUINativeModuleValue TextAreaBridge::SetBorderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1934 {
1935     EcmaVM *vm = runtimeCallInfo->GetVM();
1936     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1937     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1938     Local<JSValueRef> topArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1939     Local<JSValueRef> rightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1940     Local<JSValueRef> bottomArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1941     Local<JSValueRef> leftArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1942     Local<JSValueRef> isLocalizedArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1943     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1944     auto isLocalized = (isLocalizedArg->IsBoolean()) ? isLocalizedArg->ToBoolean(vm)->Value() : false;
1945 
1946     Color leftColor;
1947     Color rightColor;
1948     Color topColor;
1949     Color bottomColor;
1950 
1951     if (!ArkTSUtils::ParseJsColorAlpha(vm, topArg, topColor)) {
1952         topColor.SetValue(COLOR_ALPHA_VALUE);
1953     }
1954     if (!ArkTSUtils::ParseJsColorAlpha(vm, rightArg, rightColor)) {
1955         rightColor.SetValue(COLOR_ALPHA_VALUE);
1956     }
1957     if (!ArkTSUtils::ParseJsColorAlpha(vm, bottomArg, bottomColor)) {
1958         bottomColor.SetValue(COLOR_ALPHA_VALUE);
1959     }
1960     if (!ArkTSUtils::ParseJsColorAlpha(vm, leftArg, leftColor)) {
1961         leftColor.SetValue(COLOR_ALPHA_VALUE);
1962     }
1963     auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
1964     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderColor(nativeNode,
1965         topColor.GetValue(),
1966         (isRightToLeft && isLocalized) ? leftColor.GetValue() : rightColor.GetValue(),
1967         bottomColor.GetValue(),
1968         (isRightToLeft && isLocalized) ? rightColor.GetValue() : leftColor.GetValue());
1969     return panda::JSValueRef::Undefined(vm);
1970 }
1971 
ResetBorderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1972 ArkUINativeModuleValue TextAreaBridge::ResetBorderColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
1973 {
1974     EcmaVM *vm = runtimeCallInfo->GetVM();
1975     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1976     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1977     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1978     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderColor(nativeNode);
1979     return panda::JSValueRef::Undefined(vm);
1980 }
1981 
SetBorderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1982 ArkUINativeModuleValue TextAreaBridge::SetBorderStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
1983 {
1984     EcmaVM *vm = runtimeCallInfo->GetVM();
1985     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1986     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1987     auto typeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1988     auto styleArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1989     auto topArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1990     auto rightArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1991     auto bottomArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1992     auto leftArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1993     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1994     if ((!typeArg->IsBoolean()) || (!typeArg->BooleaValue(vm))) {
1995         int32_t styles[] = { static_cast<int32_t>(BorderStyle::SOLID) };
1996         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderStyle(nativeNode, styles,
1997             (sizeof(styles) / sizeof(styles[NUM_0])));
1998         return panda::JSValueRef::Undefined(vm);
1999     }
2000     if (styleArg->IsInt()) {
2001         int32_t styles[] = { styleArg->Int32Value(vm) };
2002         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderStyle(nativeNode, styles,
2003             (sizeof(styles) / sizeof(styles[NUM_0])));
2004         return panda::JSValueRef::Undefined(vm);
2005     }
2006     int32_t styles[] = { -1, -1, -1, -1 };
2007     if (topArg->IsInt()) {
2008         styles[NUM_0] = topArg->Int32Value(vm);
2009     }
2010     if (rightArg->IsInt()) {
2011         styles[NUM_1] = rightArg->Int32Value(vm);
2012     }
2013     if (bottomArg->IsInt()) {
2014         styles[NUM_2] = bottomArg->Int32Value(vm);
2015     }
2016     if (leftArg->IsInt()) {
2017         styles[NUM_3] = leftArg->Int32Value(vm);
2018     }
2019     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderStyle(nativeNode, styles,
2020         (sizeof(styles) / sizeof(styles[NUM_0])));
2021     return panda::JSValueRef::Undefined(vm);
2022 }
2023 
ResetBorderStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)2024 ArkUINativeModuleValue TextAreaBridge::ResetBorderStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
2025 {
2026     EcmaVM *vm = runtimeCallInfo->GetVM();
2027     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2028     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2029     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2030     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderStyle(nativeNode);
2031     return panda::JSValueRef::Undefined(vm);
2032 }
2033 
SetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)2034 ArkUINativeModuleValue TextAreaBridge::SetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
2035 {
2036     EcmaVM *vm = runtimeCallInfo->GetVM();
2037     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2038     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2039     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2040     Local<JSValueRef> topLeftArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
2041     Local<JSValueRef> topRightArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
2042     Local<JSValueRef> bottomLeftArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
2043     Local<JSValueRef> bottomRightArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
2044     if (topLeftArgs->IsUndefined() && topRightArgs->IsUndefined() && bottomLeftArgs->IsUndefined() &&
2045         bottomRightArgs->IsUndefined()) {
2046         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderRadius(nativeNode);
2047         return panda::JSValueRef::Undefined(vm);
2048     }
2049 
2050     CalcDimension topLeft;
2051     CalcDimension topRight;
2052     CalcDimension bottomLeft;
2053     CalcDimension bottomRight;
2054 
2055     bool isLengthMetrics = false;
2056     if (topLeftArgs->IsObject(vm)) {
2057         isLengthMetrics |= ParseLocalizedBorderRadius(vm, topLeftArgs, topLeft);
2058     }
2059     if (topRightArgs->IsObject(vm)) {
2060         isLengthMetrics |= ParseLocalizedBorderRadius(vm, topRightArgs, topRight);
2061     }
2062     if (bottomLeftArgs->IsObject(vm)) {
2063         isLengthMetrics |= ParseLocalizedBorderRadius(vm, bottomLeftArgs, bottomLeft);
2064     }
2065     if (bottomRightArgs->IsObject(vm)) {
2066         isLengthMetrics |= ParseLocalizedBorderRadius(vm, bottomRightArgs, bottomRight);
2067     }
2068     if (!isLengthMetrics) {
2069         ArkTSUtils::ParseAllBorder(vm, topLeftArgs, topLeft);
2070         ArkTSUtils::ParseAllBorder(vm, topRightArgs, topRight);
2071         ArkTSUtils::ParseAllBorder(vm, bottomLeftArgs, bottomLeft);
2072         ArkTSUtils::ParseAllBorder(vm, bottomRightArgs, bottomRight);
2073     }
2074 
2075     uint32_t size = SIZE_OF_FOUR;
2076     ArkUI_Float32 values[size];
2077     int units[size];
2078 
2079     bool isMirror = isLengthMetrics && AceApplicationInfo::GetInstance().IsRightToLeft();
2080     ParseMirrorDimen(values, units, NUM_0, isMirror ? topRight : topLeft);
2081     ParseMirrorDimen(values, units, NUM_1, isMirror ? topLeft : topRight);
2082     ParseMirrorDimen(values, units, NUM_2, isMirror ? bottomRight : bottomLeft);
2083     ParseMirrorDimen(values, units, NUM_3, isMirror ? bottomLeft : bottomRight);
2084     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBorderRadius(nativeNode, values, units, SIZE_OF_FOUR);
2085 
2086     return panda::JSValueRef::Undefined(vm);
2087 }
2088 
ResetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)2089 ArkUINativeModuleValue TextAreaBridge::ResetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
2090 {
2091     EcmaVM *vm = runtimeCallInfo->GetVM();
2092     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2093     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2094     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2095     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBorderRadius(nativeNode);
2096     return panda::JSValueRef::Undefined(vm);
2097 }
2098 
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2099 ArkUINativeModuleValue TextAreaBridge::SetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2100 {
2101     EcmaVM *vm = runtimeCallInfo->GetVM();
2102     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2103     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2104     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2105     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2106     Color color;
2107     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
2108         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBackgroundColor(nativeNode);
2109     } else {
2110         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaBackgroundColor(nativeNode, color.GetValue());
2111     }
2112     return panda::JSValueRef::Undefined(vm);
2113 }
2114 
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)2115 ArkUINativeModuleValue TextAreaBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
2116 {
2117     EcmaVM *vm = runtimeCallInfo->GetVM();
2118     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2119     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2120     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2121     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaBackgroundColor(nativeNode);
2122     return panda::JSValueRef::Undefined(vm);
2123 }
2124 
SetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)2125 ArkUINativeModuleValue TextAreaBridge::SetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
2126 {
2127     EcmaVM *vm = runtimeCallInfo->GetVM();
2128     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2129     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2130     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2131     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
2132     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
2133     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
2134     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
2135 
2136     ArkUISizeType top = ArkTSUtils::ParseJsToArkUISize(vm, secondArg);
2137     ArkUISizeType right = ArkTSUtils::ParseJsToArkUISize(vm, thirdArg);
2138     ArkUISizeType bottom = ArkTSUtils::ParseJsToArkUISize(vm, forthArg);
2139     ArkUISizeType left = ArkTSUtils::ParseJsToArkUISize(vm, fifthArg);
2140 
2141     CalcDimension topDimen(0, DimensionUnit::VP);
2142     CalcDimension rightDimen(0, DimensionUnit::VP);
2143     CalcDimension bottomDimen(0, DimensionUnit::VP);
2144     CalcDimension leftDimen(0, DimensionUnit::VP);
2145 
2146     bool isLengthMetrics = false;
2147     if (secondArg->IsObject(vm)) {
2148         isLengthMetrics |= ParseLocalizedMargin(vm, secondArg, topDimen, top);
2149     }
2150     if (thirdArg->IsObject(vm)) {
2151         isLengthMetrics |= ParseLocalizedMargin(vm, thirdArg, rightDimen, right);
2152     }
2153     if (forthArg->IsObject(vm)) {
2154         isLengthMetrics |= ParseLocalizedMargin(vm, forthArg, bottomDimen, bottom);
2155     }
2156     if (fifthArg->IsObject(vm)) {
2157         isLengthMetrics |= ParseLocalizedMargin(vm, fifthArg, leftDimen, left);
2158     }
2159     if (isLengthMetrics) {
2160         auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
2161         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMargin(nativeNode,
2162             &top,
2163             isRightToLeft ? &left : &right,
2164             &bottom,
2165             isRightToLeft ? &right : &left);
2166         return panda::JSValueRef::Undefined(vm);
2167     }
2168 
2169     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaMargin(nativeNode, &top, &right, &bottom, &left);
2170     return panda::JSValueRef::Undefined(vm);
2171 }
2172 
ResetMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)2173 ArkUINativeModuleValue TextAreaBridge::ResetMargin(ArkUIRuntimeCallInfo *runtimeCallInfo)
2174 {
2175     EcmaVM *vm = runtimeCallInfo->GetVM();
2176     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2177     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2178     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2179     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaMargin(nativeNode);
2180     return panda::JSValueRef::Undefined(vm);
2181 }
2182 
SetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2183 ArkUINativeModuleValue TextAreaBridge::SetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2184 {
2185     EcmaVM *vm = runtimeCallInfo->GetVM();
2186     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2187     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2188     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2189     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2190     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2191     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2192     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2193         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillChange(nativeNode);
2194         return panda::JSValueRef::Undefined(vm);
2195     }
2196     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2197     std::function<bool(const ChangeValueInfo&)> callback = [vm, frameNode,
2198         func = panda::CopyableGlobal(vm, func)](const ChangeValueInfo& changeValueInfo) -> bool {
2199         panda::LocalScope pandaScope(vm);
2200         panda::TryCatch trycatch(vm);
2201         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2202         auto eventObject = CommonBridge::CreateChangeValueInfoObj(vm, changeValueInfo);
2203         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2204         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2205         if (ret->IsBoolean()) {
2206             return ret->ToBoolean(vm)->Value();
2207         }
2208         return true;
2209     };
2210     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnWillChange(nativeNode,
2211         reinterpret_cast<intptr_t>(&callback));
2212     return panda::JSValueRef::Undefined(vm);
2213 }
2214 
ResetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)2215 ArkUINativeModuleValue TextAreaBridge::ResetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
2216 {
2217     EcmaVM* vm = runtimeCallInfo->GetVM();
2218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2219     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2220     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2221     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillChange(nativeNode);
2222     return panda::JSValueRef::Undefined(vm);
2223 }
2224 
SetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)2225 ArkUINativeModuleValue TextAreaBridge::SetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2226 {
2227     EcmaVM *vm = runtimeCallInfo->GetVM();
2228     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2229     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2230     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2231     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2232     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2233     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2234     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2235         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillInsert(nativeNode);
2236         return panda::JSValueRef::Undefined(vm);
2237     }
2238     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2239     std::function<bool(const InsertValueInfo&)> callback = [vm, frameNode,
2240         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) -> bool {
2241         panda::LocalScope pandaScope(vm);
2242         panda::TryCatch trycatch(vm);
2243         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2244         const char* keys[] = { "insertOffset", "insertValue" };
2245         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
2246             panda::StringRef::NewFromUtf16(vm, insertValue.insertValue.c_str()) };
2247         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2248         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2249         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2250         if (ret->IsBoolean()) {
2251             return ret->ToBoolean(vm)->Value();
2252         }
2253         return true;
2254     };
2255     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnWillInsert(nativeNode,
2256         reinterpret_cast<intptr_t>(&callback));
2257     return panda::JSValueRef::Undefined(vm);
2258 }
2259 
ResetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)2260 ArkUINativeModuleValue TextAreaBridge::ResetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2261 {
2262     EcmaVM* vm = runtimeCallInfo->GetVM();
2263     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2264     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2266     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillInsert(nativeNode);
2267     return panda::JSValueRef::Undefined(vm);
2268 }
2269 
SetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)2270 ArkUINativeModuleValue TextAreaBridge::SetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2271 {
2272     EcmaVM *vm = runtimeCallInfo->GetVM();
2273     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2275     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2277     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2278     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2279     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2280         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnDidInsert(nativeNode);
2281         return panda::JSValueRef::Undefined(vm);
2282     }
2283     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2284     std::function<void(const InsertValueInfo&)> callback = [vm, frameNode,
2285         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) {
2286         panda::LocalScope pandaScope(vm);
2287         panda::TryCatch trycatch(vm);
2288         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2289         const char* keys[] = { "insertOffset", "insertValue" };
2290         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
2291             panda::StringRef::NewFromUtf16(vm, insertValue.insertValue.c_str()) };
2292         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2293         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2294         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2295     };
2296     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnDidInsert(
2297         nativeNode, reinterpret_cast<intptr_t>(&callback));
2298     return panda::JSValueRef::Undefined(vm);
2299 }
2300 
ResetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)2301 ArkUINativeModuleValue TextAreaBridge::ResetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2302 {
2303     EcmaVM* vm = runtimeCallInfo->GetVM();
2304     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2305     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2306     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2307     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnDidInsert(nativeNode);
2308     return panda::JSValueRef::Undefined(vm);
2309 }
2310 
SetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)2311 ArkUINativeModuleValue TextAreaBridge::SetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
2312 {
2313     EcmaVM *vm = runtimeCallInfo->GetVM();
2314     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2315     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2316     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2317     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2318     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2319     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2320     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2321         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillDelete(nativeNode);
2322         return panda::JSValueRef::Undefined(vm);
2323     }
2324     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2325     std::function<bool(const DeleteValueInfo&)> callback = [vm, frameNode,
2326         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) -> bool {
2327         panda::LocalScope pandaScope(vm);
2328         panda::TryCatch trycatch(vm);
2329         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2330         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
2331         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
2332             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
2333             panda::StringRef::NewFromUtf16(vm, deleteValue.deleteValue.c_str()) };
2334         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2335         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2336         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2337         if (ret->IsBoolean()) {
2338             return ret->ToBoolean(vm)->Value();
2339         }
2340         return true;
2341     };
2342     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnWillDelete(
2343         nativeNode, reinterpret_cast<intptr_t>(&callback));
2344     return panda::JSValueRef::Undefined(vm);
2345 }
2346 
ResetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)2347 ArkUINativeModuleValue TextAreaBridge::ResetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
2348 {
2349     EcmaVM* vm = runtimeCallInfo->GetVM();
2350     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2351     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2352     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2353     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnWillDelete(nativeNode);
2354     return panda::JSValueRef::Undefined(vm);
2355 }
2356 
SetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)2357 ArkUINativeModuleValue TextAreaBridge::SetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
2358 {
2359     EcmaVM *vm = runtimeCallInfo->GetVM();
2360     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2361     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2362     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2363     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2364     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2365     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2366     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2367         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnDidDelete(nativeNode);
2368         return panda::JSValueRef::Undefined(vm);
2369     }
2370     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2371     std::function<void(const DeleteValueInfo&)> callback = [vm, frameNode,
2372         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) {
2373         panda::LocalScope pandaScope(vm);
2374         panda::TryCatch trycatch(vm);
2375         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
2376         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
2377         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
2378             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
2379             panda::StringRef::NewFromUtf16(vm, deleteValue.deleteValue.c_str()) };
2380         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2381         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
2382         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
2383     };
2384     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaOnDidDelete(
2385         nativeNode, reinterpret_cast<intptr_t>(&callback));
2386     return panda::JSValueRef::Undefined(vm);
2387 }
2388 
ResetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)2389 ArkUINativeModuleValue TextAreaBridge::ResetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
2390 {
2391     EcmaVM* vm = runtimeCallInfo->GetVM();
2392     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2393     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2394     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2395     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaOnDidDelete(nativeNode);
2396     return panda::JSValueRef::Undefined(vm);
2397 }
2398 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2399 ArkUINativeModuleValue TextAreaBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2400 {
2401     EcmaVM *vm = runtimeCallInfo->GetVM();
2402     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2403     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2404     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2405     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2406 
2407     if (secondArg->IsBoolean()) {
2408         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2409         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaEnablePreviewText(nativeNode, value);
2410     } else {
2411         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnablePreviewText(nativeNode);
2412     }
2413     return panda::JSValueRef::Undefined(vm);
2414 }
2415 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)2416 ArkUINativeModuleValue TextAreaBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
2417 {
2418     EcmaVM* vm = runtimeCallInfo->GetVM();
2419     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2420     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2421     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2422     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnablePreviewText(nativeNode);
2423     return panda::JSValueRef::Undefined(vm);
2424 }
2425 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2426 ArkUINativeModuleValue TextAreaBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2427 {
2428     EcmaVM* vm = runtimeCallInfo->GetVM();
2429     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2430     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2431     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2432     NG::OnCreateMenuCallback onCreateMenuCallback;
2433     NG::OnMenuItemClickCallback onMenuItemClickCallback;
2434     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
2435         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaSelectionMenuOptions(nativeNode);
2436         return panda::JSValueRef::Undefined(vm);
2437     }
2438     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaSelectionMenuOptions(
2439         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
2440     return panda::JSValueRef::Undefined(vm);
2441 }
2442 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)2443 ArkUINativeModuleValue TextAreaBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
2444 {
2445     EcmaVM* vm = runtimeCallInfo->GetVM();
2446     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2447     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2448     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2449     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaSelectionMenuOptions(nativeNode);
2450     return panda::JSValueRef::Undefined(vm);
2451 }
2452 
SetTextAreaInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)2453 ArkUINativeModuleValue TextAreaBridge::SetTextAreaInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
2454 {
2455     EcmaVM* vm = runtimeCallInfo->GetVM();
2456     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2457     Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(NUM_0);
2458     Local<JSValueRef> placeholderVal = runtimeCallInfo->GetCallArgRef(NUM_1);
2459     Local<JSValueRef> textVal = runtimeCallInfo->GetCallArgRef(NUM_2);
2460     Local<JSValueRef> controllerVal = runtimeCallInfo->GetCallArgRef(NUM_3);
2461     auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
2462     std::string placeholder;
2463     if (ArkTSUtils::ParseJsString(vm, placeholderVal, placeholder)) {
2464         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPlaceholderString(nativeNode, placeholder.c_str());
2465     } else {
2466         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaPlaceholderString(nativeNode, "");
2467     }
2468     std::string text, value;
2469     auto changeEventVal = Framework::JSRef<Framework::JSVal>::Make();
2470     if (textVal->IsString(vm) && ArkTSUtils::ParseJsString(vm, textVal, text)) {
2471         value = text;
2472     } else {
2473         value = "";
2474     }
2475     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaTextString(nativeNode, value.c_str());
2476     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2477     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2478     if (!controllerVal->IsUndefined() && !controllerVal->IsNull()) {
2479         auto* jsController = Framework::JSRef<Framework::JSObject>(Framework::JSObject(controllerVal->ToObject(vm)))
2480                                  ->Unwrap<Framework::JSTextEditableController>();
2481         if (jsController) {
2482             auto pointer = TextFieldModelNG::GetJSTextEditableController(frameNode);
2483             auto preController = reinterpret_cast<Framework::JSTextEditableController*>(Referenced::RawPtr(pointer));
2484             if (preController) {
2485                 preController->SetController(nullptr);
2486             }
2487             TextFieldModelNG::SetJSTextEditableController(frameNode, Referenced::Claim((Referenced*)jsController));
2488             auto controller = TextFieldModelNG::GetOrCreateController(frameNode);
2489             jsController->SetController(controller);
2490         }
2491     } else {
2492         auto pointer = TextFieldModelNG::GetJSTextEditableController(frameNode);
2493         auto preController = reinterpret_cast<Framework::JSTextEditableController*>(Referenced::RawPtr(pointer));
2494         if (preController) {
2495             preController->SetController(nullptr);
2496         }
2497         TextFieldModelNG::SetJSTextEditableController(frameNode, nullptr);
2498     }
2499     return panda::JSValueRef::Undefined(vm);
2500 }
2501 
SetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2502 ArkUINativeModuleValue TextAreaBridge::SetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2503 {
2504     EcmaVM* vm = runtimeCallInfo->GetVM();
2505     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2506     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2507     Local<JSValueRef> widthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
2508     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2509     auto value = widthArg->ToString(vm)->ToString(vm);
2510     if (value.empty()) {
2511         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaWidth(nativeNode);
2512         return panda::JSValueRef::Undefined(vm);
2513     }
2514     GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaWidth(nativeNode, value.c_str());
2515     return panda::JSValueRef::Undefined(vm);
2516 }
2517 
ResetWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)2518 ArkUINativeModuleValue TextAreaBridge::ResetWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
2519 {
2520     EcmaVM* vm = runtimeCallInfo->GetVM();
2521     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2522     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2523     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2524     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaWidth(nativeNode);
2525     return panda::JSValueRef::Undefined(vm);
2526 }
2527 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2528 ArkUINativeModuleValue TextAreaBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2529 {
2530     EcmaVM* vm = runtimeCallInfo->GetVM();
2531     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2532     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2533     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
2534     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2535 
2536     if (secondArg->IsBoolean()) {
2537         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2538         GetArkUINodeModifiers()->getTextAreaModifier()->setTextAreaEnableHapticFeedback(nativeNode, value);
2539     } else {
2540         GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnableHapticFeedback(nativeNode);
2541     }
2542     return panda::JSValueRef::Undefined(vm);
2543 }
2544 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)2545 ArkUINativeModuleValue TextAreaBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
2546 {
2547     EcmaVM* vm = runtimeCallInfo->GetVM();
2548     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2549     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2550     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2551     GetArkUINodeModifiers()->getTextAreaModifier()->resetTextAreaEnableHapticFeedback(nativeNode);
2552     return panda::JSValueRef::Undefined(vm);
2553 }
2554 
SetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2555 ArkUINativeModuleValue TextAreaBridge::SetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2556 {
2557     EcmaVM* vm = runtimeCallInfo->GetVM();
2558     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2559     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2560     Local<JSValueRef> ellipsisModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
2561     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2562     if (ellipsisModeArg->IsNull() || ellipsisModeArg->IsUndefined() || !ellipsisModeArg->IsNumber()) {
2563         GetArkUINodeModifiers()->getTextAreaModifier()->resetEllipsisMode(nativeNode);
2564         return panda::JSValueRef::Undefined(vm);
2565     }
2566     uint32_t ellipsisMode = ellipsisModeArg->Uint32Value(vm);
2567     GetArkUINodeModifiers()->getTextAreaModifier()->setEllipsisMode(nativeNode, ellipsisMode);
2568     return panda::JSValueRef::Undefined(vm);
2569 }
2570 
ResetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2571 ArkUINativeModuleValue TextAreaBridge::ResetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2572 {
2573     EcmaVM* vm = runtimeCallInfo->GetVM();
2574     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2575     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
2576     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2577     GetArkUINodeModifiers()->getTextAreaModifier()->resetEllipsisMode(nativeNode);
2578     return panda::JSValueRef::Undefined(vm);
2579 }
2580 
SetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)2581 ArkUINativeModuleValue TextAreaBridge::SetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
2582 {
2583     EcmaVM* vm = runtimeCallInfo->GetVM();
2584     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2585     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2586     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
2587     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2588 
2589     if (secondArg->IsBoolean()) {
2590         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
2591         GetArkUINodeModifiers()->getTextAreaModifier()->setStopBackPress(nativeNode, value);
2592     } else {
2593         GetArkUINodeModifiers()->getTextAreaModifier()->resetStopBackPress(nativeNode);
2594     }
2595     return panda::JSValueRef::Undefined(vm);
2596 }
2597 
ResetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)2598 ArkUINativeModuleValue TextAreaBridge::ResetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
2599 {
2600     EcmaVM* vm = runtimeCallInfo->GetVM();
2601     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2602     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2603     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2604     GetArkUINodeModifiers()->getTextAreaModifier()->resetStopBackPress(nativeNode);
2605     return panda::JSValueRef::Undefined(vm);
2606 }
2607 } // namespace OHOS::Ace::NG
2608