• 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_bridge.h"
16 
17 #include "base/utils/string_utils.h"
18 #include "base/utils/utils.h"
19 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
20 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
21 #include "bridge/declarative_frontend/style_string/js_span_string.h"
22 #include "core/components/common/properties/shadow.h"
23 #include "core/components_ng/pattern/text/text_model_ng.h"
24 #include "frameworks/base/geometry/calc_dimension.h"
25 #include "frameworks/base/geometry/dimension.h"
26 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
27 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_value_conversions.h"
28 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
29 #include "frameworks/bridge/declarative_frontend/jsview/js_shape_abstract.h"
30 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
31 #include "frameworks/bridge/declarative_frontend/jsview/js_text.h"
32 
33 namespace OHOS::Ace::NG {
34 namespace {
35 constexpr int PARAM_ARR_LENGTH_1 = 1;
36 constexpr int PARAM_ARR_LENGTH_2 = 2;
37 constexpr int SIZE_OF_TEXT_CASES = 2;
38 constexpr double DEFAULT_SPAN_FONT_SIZE = 16;
39 constexpr DimensionUnit DEFAULT_SPAN_FONT_UNIT = DimensionUnit::FP;
40 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
41 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
42 const Color DEFAULT_DECORATION_COLOR = Color::BLACK;
43 const std::string DEFAULT_FONT_WEIGHT = "400";
44 constexpr int DEFAULT_VARIABLE_FONT_WEIGHT = 400;
45 constexpr int NUM_0 = 0;
46 constexpr int NUM_1 = 1;
47 constexpr int NUM_2 = 2;
48 constexpr int NUM_3 = 3;
49 constexpr int NUM_4 = 4;
50 constexpr int NUM_5 = 5;
51 constexpr int NUM_6 = 6;
52 constexpr int NUM_7 = 7;
53 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::NONE, TextOverflow::CLIP, TextOverflow::ELLIPSIS,
54     TextOverflow::MARQUEE };
55 const std::vector<std::string> TEXT_DETECT_TYPES = { "phoneNum", "url", "email", "location", "datetime" };
56 } // namespace
57 
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)58 ArkUINativeModuleValue TextBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
59 {
60     EcmaVM* vm = runtimeCallInfo->GetVM();
61     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
62     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
63     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_1);
64     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_2);
65     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
66 
67     ArkUIFontWeightWithOptionsStruct weightInfo;
68     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
69     std::string weight = DEFAULT_FONT_WEIGHT;
70     if (!weightArg->IsNull()) {
71         if (weightArg->IsNumber()) {
72             weight = std::to_string(weightArg->Int32Value(vm));
73             variableFontWeight = weightArg->Int32Value(vm);
74         } else if (weightArg->IsString(vm)) {
75             weight = weightArg->ToString(vm)->ToString(vm);
76             variableFontWeight = StringUtils::StringToInt(weight);
77         }
78     }
79     weightInfo.weight = weight.c_str();
80     weightInfo.variableFontWeight = variableFontWeight;
81 
82     if (optionsArg->IsBoolean()) {
83         weightInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
84     }
85     GetArkUINodeModifiers()->getTextModifier()->setFontWeightWithOption(nativeNode, &weightInfo);
86     return panda::JSValueRef::Undefined(vm);
87 }
88 
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue TextBridge::ResetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91     EcmaVM* vm = runtimeCallInfo->GetVM();
92     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
94     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
95     GetArkUINodeModifiers()->getTextModifier()->resetFontWeight(nativeNode);
96     return panda::JSValueRef::Undefined(vm);
97 }
98 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)99 ArkUINativeModuleValue TextBridge::SetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
100 {
101     EcmaVM* vm = runtimeCallInfo->GetVM();
102     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
103     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
104     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
105     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
106     if (secondArg->IsNumber()) {
107         uint32_t fontStyle = secondArg->Uint32Value(vm);
108         if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
109             fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
110             fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
111         }
112         GetArkUINodeModifiers()->getTextModifier()->setFontStyle(nativeNode, fontStyle);
113     } else {
114         GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
115     }
116     return panda::JSValueRef::Undefined(vm);
117 }
118 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)119 ArkUINativeModuleValue TextBridge::ResetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
120 {
121     EcmaVM* vm = runtimeCallInfo->GetVM();
122     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
123     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
124     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
125     GetArkUINodeModifiers()->getTextModifier()->resetFontStyle(nativeNode);
126     return panda::JSValueRef::Undefined(vm);
127 }
128 
SetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)129 ArkUINativeModuleValue TextBridge::SetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
130 {
131     EcmaVM* vm = runtimeCallInfo->GetVM();
132     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
133     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
134     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
135     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136     if (secondArg->IsNumber()) {
137         GetArkUINodeModifiers()->getTextModifier()->setTextAlign(nativeNode, secondArg->ToNumber(vm)->Value());
138     } else {
139         GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
140     }
141     return panda::JSValueRef::Undefined(vm);
142 }
143 
ResetTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)144 ArkUINativeModuleValue TextBridge::ResetTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
145 {
146     EcmaVM* vm = runtimeCallInfo->GetVM();
147     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
148     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
149     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
150     GetArkUINodeModifiers()->getTextModifier()->resetTextAlign(nativeNode);
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue TextBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
159     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
160     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
161     Color color;
162     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
163         GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
164     } else {
165         GetArkUINodeModifiers()->getTextModifier()->setFontColor(nativeNode, color.GetValue());
166     }
167     return panda::JSValueRef::Undefined(vm);
168 }
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)169 ArkUINativeModuleValue TextBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
170 {
171     EcmaVM* vm = runtimeCallInfo->GetVM();
172     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
173     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
174     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
175     GetArkUINodeModifiers()->getTextModifier()->resetFontColor(nativeNode);
176     return panda::JSValueRef::Undefined(vm);
177 }
178 
SetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)179 ArkUINativeModuleValue TextBridge::SetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
180 {
181     EcmaVM *vm = runtimeCallInfo->GetVM();
182     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
183     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
184     auto colorArg = runtimeCallInfo->GetCallArgRef(1);
185     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
186 
187     ForegroundColorStrategy strategy;
188     if (ArkTSUtils::ParseJsColorStrategy(vm, colorArg, strategy)) {
189         auto strategyInt = static_cast<uint32_t>(ForegroundColorStrategy::INVERT);
190         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(nativeNode, false, strategyInt);
191         return panda::JSValueRef::Undefined(vm);
192     }
193     Color foregroundColor;
194     if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, foregroundColor)) {
195         GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
196     } else {
197         GetArkUINodeModifiers()->getTextModifier()->setTextForegroundColor(
198             nativeNode, true, foregroundColor.GetValue());
199     }
200     return panda::JSValueRef::Undefined(vm);
201 }
202 
ResetForegroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)203 ArkUINativeModuleValue TextBridge::ResetForegroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
204 {
205     EcmaVM* vm = runtimeCallInfo->GetVM();
206     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
207     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
208     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
209     GetArkUINodeModifiers()->getTextModifier()->resetTextForegroundColor(nativeNode);
210     return panda::JSValueRef::Undefined(vm);
211 }
212 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue TextBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215     EcmaVM* vm = runtimeCallInfo->GetVM();
216     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
218     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
219     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
220     CalcDimension fontSize;
221     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
222         GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
223     } else {
224         GetArkUINodeModifiers()->getTextModifier()->setFontSize(
225             nativeNode, fontSize.Value(), static_cast<int>(fontSize.Unit()));
226     }
227     return panda::JSValueRef::Undefined(vm);
228 }
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)229 ArkUINativeModuleValue TextBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
230 {
231     EcmaVM* vm = runtimeCallInfo->GetVM();
232     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
233     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
234     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
235     GetArkUINodeModifiers()->getTextModifier()->resetFontSize(nativeNode);
236     return panda::JSValueRef::Undefined(vm);
237 }
238 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)239 ArkUINativeModuleValue TextBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
240 {
241     EcmaVM* vm = runtimeCallInfo->GetVM();
242     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
243     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
244     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
245     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
246     CalcDimension lineHeight(0.0, DEFAULT_SPAN_FONT_UNIT);
247     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, lineHeight)) {
248         lineHeight.Reset();
249     }
250     if (lineHeight.IsNegative()) {
251         lineHeight.Reset();
252     }
253     GetArkUINodeModifiers()->getTextModifier()->setTextLineHeight(
254         nativeNode, lineHeight.Value(), static_cast<int8_t>(lineHeight.Unit()));
255     return panda::JSValueRef::Undefined(vm);
256 }
257 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue TextBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260     EcmaVM* vm = runtimeCallInfo->GetVM();
261     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
262     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
263     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
264     GetArkUINodeModifiers()->getTextModifier()->resetTextLineHeight(nativeNode);
265     return panda::JSValueRef::Undefined(vm);
266 }
267 
SetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)268 ArkUINativeModuleValue TextBridge::SetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
269 {
270     EcmaVM* vm = runtimeCallInfo->GetVM();
271     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
272     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
273     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
274     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
275     int32_t value;
276     if (secondArg->IsUndefined()) {
277         value = 0;
278     } else if (secondArg->IsNumber()) {
279         value = secondArg->Int32Value(vm);
280     } else {
281         return panda::JSValueRef::Undefined(vm);
282     }
283     if (value < 0 || value >= static_cast<int32_t>(TEXT_OVERFLOWS.size())) {
284         return panda::JSValueRef::Undefined(vm);
285     }
286     GetArkUINodeModifiers()->getTextModifier()->setTextOverflow(nativeNode, value);
287     return panda::JSValueRef::Undefined(vm);
288 }
289 
ResetTextOverflow(ArkUIRuntimeCallInfo * runtimeCallInfo)290 ArkUINativeModuleValue TextBridge::ResetTextOverflow(ArkUIRuntimeCallInfo* runtimeCallInfo)
291 {
292     EcmaVM* vm = runtimeCallInfo->GetVM();
293     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
295     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
296     GetArkUINodeModifiers()->getTextModifier()->resetTextOverflow(nativeNode);
297     return panda::JSValueRef::Undefined(vm);
298 }
299 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)300 ArkUINativeModuleValue TextBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
301 {
302     EcmaVM* vm = runtimeCallInfo->GetVM();
303     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
304     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
305     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
306     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
307     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
308     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
309     int32_t textDecoration = static_cast<int32_t>(TextDecoration::NONE);
310     Color color = DEFAULT_DECORATION_COLOR;
311     int32_t style = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
312     if (secondArg->IsInt()) {
313         textDecoration = secondArg->Int32Value(vm);
314     }
315     if (!ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color)) {
316         color = DEFAULT_DECORATION_COLOR;
317     }
318     if (fourthArg->IsInt()) {
319         style = fourthArg->Int32Value(vm);
320     }
321     GetArkUINodeModifiers()->getTextModifier()->setTextDecoration(nativeNode, textDecoration, color.GetValue(), style);
322     return panda::JSValueRef::Undefined(vm);
323 }
324 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)325 ArkUINativeModuleValue TextBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
326 {
327     EcmaVM* vm = runtimeCallInfo->GetVM();
328     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
329     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
330     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
331     GetArkUINodeModifiers()->getTextModifier()->resetTextDecoration(nativeNode);
332     return panda::JSValueRef::Undefined(vm);
333 }
334 
SetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)335 ArkUINativeModuleValue TextBridge::SetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
336 {
337     EcmaVM* vm = runtimeCallInfo->GetVM();
338     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
340     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
341     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
342     if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
343         secondArg->Int32Value(vm) <= SIZE_OF_TEXT_CASES) {
344         GetArkUINodeModifiers()->getTextModifier()->setTextCase(nativeNode, secondArg->Int32Value(vm));
345     } else {
346         GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
347     }
348     return panda::JSValueRef::Undefined(vm);
349 }
350 
ResetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)351 ArkUINativeModuleValue TextBridge::ResetTextCase(ArkUIRuntimeCallInfo* runtimeCallInfo)
352 {
353     EcmaVM* vm = runtimeCallInfo->GetVM();
354     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
356     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
357     GetArkUINodeModifiers()->getTextModifier()->resetTextCase(nativeNode);
358     return panda::JSValueRef::Undefined(vm);
359 }
360 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)361 ArkUINativeModuleValue TextBridge::SetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
362 {
363     EcmaVM* vm = runtimeCallInfo->GetVM();
364     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
365     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
366     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
367     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
368     if (secondArg->IsNumber()) {
369         uint32_t maxLine = secondArg->Uint32Value(vm);
370         GetArkUINodeModifiers()->getTextModifier()->setTextMaxLines(nativeNode, maxLine);
371     } else {
372         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
373     }
374     return panda::JSValueRef::Undefined(vm);
375 }
376 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)377 ArkUINativeModuleValue TextBridge::ResetMaxLines(ArkUIRuntimeCallInfo* runtimeCallInfo)
378 {
379     EcmaVM* vm = runtimeCallInfo->GetVM();
380     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
381     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
382     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
383     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxLines(nativeNode);
384     return panda::JSValueRef::Undefined(vm);
385 }
386 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)387 ArkUINativeModuleValue TextBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
388 {
389     EcmaVM* vm = runtimeCallInfo->GetVM();
390     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
391     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
392     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
393     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
394 
395     CalcDimension fontSize;
396     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
397         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontSize(
398             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()));
399     } else {
400         GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
401     }
402     return panda::JSValueRef::Undefined(vm);
403 }
404 
ReSetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)405 ArkUINativeModuleValue TextBridge::ReSetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
406 {
407     EcmaVM* vm = runtimeCallInfo->GetVM();
408     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
409     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
410     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
411     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontSize(nativeNode);
412     return panda::JSValueRef::Undefined(vm);
413 }
414 
SetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)415 ArkUINativeModuleValue TextBridge::SetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
416 {
417     EcmaVM* vm = runtimeCallInfo->GetVM();
418     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
419     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
420     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
421     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
422     uint32_t draggable = false;
423     if (secondArg->IsBoolean()) {
424         draggable = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
425     }
426     GetArkUINodeModifiers()->getTextModifier()->setTextDraggable(nativeNode, draggable);
427     return panda::JSValueRef::Undefined(vm);
428 }
429 
ResetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)430 ArkUINativeModuleValue TextBridge::ResetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
431 {
432     EcmaVM* vm = runtimeCallInfo->GetVM();
433     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
434     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
435     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
436     GetArkUINodeModifiers()->getTextModifier()->resetTextDraggable(nativeNode);
437     return panda::JSValueRef::Undefined(vm);
438 }
439 
SetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)440 ArkUINativeModuleValue TextBridge::SetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
441 {
442     EcmaVM* vm = runtimeCallInfo->GetVM();
443     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
444     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
445     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
446     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
447     uint32_t sensitive = false;
448     if (secondArg->IsBoolean()) {
449         sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
450     }
451     GetArkUINodeModifiers()->getTextModifier()->setTextPrivacySensitive(nativeNode, sensitive);
452     return panda::JSValueRef::Undefined(vm);
453 }
454 
ResetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)455 ArkUINativeModuleValue TextBridge::ResetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
456 {
457     EcmaVM* vm = runtimeCallInfo->GetVM();
458     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
459     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
460     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
461     GetArkUINodeModifiers()->getTextModifier()->resetTextPrivacySensitive(nativeNode);
462     return panda::JSValueRef::Undefined(vm);
463 }
464 
SetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)465 ArkUINativeModuleValue TextBridge::SetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
466 {
467     EcmaVM* vm = runtimeCallInfo->GetVM();
468     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
469     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
470     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
471     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
472     CalcDimension fontSize;
473     if (ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, false)) {
474         GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontSize(
475             nativeNode, fontSize.Value(), static_cast<int8_t>(fontSize.Unit()));
476     } else {
477         GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
478     }
479 
480     return panda::JSValueRef::Undefined(vm);
481 }
482 
ResetMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)483 ArkUINativeModuleValue TextBridge::ResetMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
484 {
485     EcmaVM* vm = runtimeCallInfo->GetVM();
486     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
487     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
488     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
489     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontSize(nativeNode);
490     return panda::JSValueRef::Undefined(vm);
491 }
492 
SetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)493 ArkUINativeModuleValue TextBridge::SetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
494 {
495     EcmaVM* vm = runtimeCallInfo->GetVM();
496     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
497     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
498     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
499     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
500     double minFontScale;
501     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, minFontScale)) {
502         return panda::JSValueRef::Undefined(vm);
503     }
504     if (LessOrEqual(minFontScale, 0.0f)) {
505         GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(nativeNode, static_cast<float>(minFontScale));
506         minFontScale = 0.0f;
507     } else if (GreatOrEqual(minFontScale, 1.0f)) {
508         minFontScale = 1.0f;
509     }
510     GetArkUINodeModifiers()->getTextModifier()->setTextMinFontScale(nativeNode, static_cast<float>(minFontScale));
511     return panda::JSValueRef::Undefined(vm);
512 }
513 
ResetMinFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)514 ArkUINativeModuleValue TextBridge::ResetMinFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
515 {
516     EcmaVM* vm = runtimeCallInfo->GetVM();
517     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
518     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
519     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
520     GetArkUINodeModifiers()->getTextModifier()->resetTextMinFontScale(nativeNode);
521     return panda::JSValueRef::Undefined(vm);
522 }
523 
SetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue TextBridge::SetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526     EcmaVM* vm = runtimeCallInfo->GetVM();
527     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
528     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
529     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
530     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
531     double maxFontScale;
532     if (!ArkTSUtils::ParseJsDouble(vm, secondArg, maxFontScale)) {
533         return panda::JSValueRef::Undefined(vm);
534     }
535     if (LessOrEqual(maxFontScale, 1.0f)) {
536         maxFontScale = 1.0f;
537     }
538     GetArkUINodeModifiers()->getTextModifier()->setTextMaxFontScale(nativeNode, static_cast<float>(maxFontScale));
539     return panda::JSValueRef::Undefined(vm);
540 }
541 
ResetMaxFontScale(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue TextBridge::ResetMaxFontScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544     EcmaVM* vm = runtimeCallInfo->GetVM();
545     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
547     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
548     GetArkUINodeModifiers()->getTextModifier()->resetTextMaxFontScale(nativeNode);
549     return panda::JSValueRef::Undefined(vm);
550 }
551 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)552 ArkUINativeModuleValue TextBridge::SetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
553 {
554     EcmaVM* vm = runtimeCallInfo->GetVM();
555     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
556     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
557     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
558     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
559 
560     std::vector<std::string> fontFamilies;
561     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies)) {
562         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
563         return panda::JSValueRef::Undefined(vm);
564     }
565     auto families = std::make_unique<char* []>(fontFamilies.size());
566     for (uint32_t i = 0; i < fontFamilies.size(); i++) {
567         families[i] = const_cast<char*>(fontFamilies.at(i).c_str());
568     }
569     GetArkUINodeModifiers()->getTextModifier()->setTextFontFamily(
570         nativeNode, const_cast<const char**>(families.get()), fontFamilies.size());
571     return panda::JSValueRef::Undefined(vm);
572 }
573 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)574 ArkUINativeModuleValue TextBridge::ResetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
575 {
576     EcmaVM* vm = runtimeCallInfo->GetVM();
577     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
578     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
579     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
580 
581     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFamily(nativeNode);
582     return panda::JSValueRef::Undefined(vm);
583 }
584 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)585 ArkUINativeModuleValue TextBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
586 {
587     EcmaVM* vm = runtimeCallInfo->GetVM();
588     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
589     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
590     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
591     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
592     int32_t copyOption = static_cast<int32_t>(CopyOptions::None);
593     if (secondArg->IsInt()) {
594         copyOption = secondArg->Int32Value(vm);
595     }
596     GetArkUINodeModifiers()->getTextModifier()->setTextCopyOption(nativeNode, copyOption);
597     return panda::JSValueRef::Undefined(vm);
598 }
599 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)600 ArkUINativeModuleValue TextBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
601 {
602     EcmaVM* vm = runtimeCallInfo->GetVM();
603     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
604     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
605     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
606     GetArkUINodeModifiers()->getTextModifier()->resetTextCopyOption(nativeNode);
607     return panda::JSValueRef::Undefined(vm);
608 }
609 
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)610 ArkUINativeModuleValue TextBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
611 {
612     EcmaVM* vm = runtimeCallInfo->GetVM();
613     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
614     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
615     Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(NUM_1);
616     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
617     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
618     Local<JSValueRef> offsetXArg = runtimeCallInfo->GetCallArgRef(NUM_4);
619     Local<JSValueRef> offsetYArg = runtimeCallInfo->GetCallArgRef(NUM_5);
620     Local<JSValueRef> fillArg = runtimeCallInfo->GetCallArgRef(NUM_6);
621     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
622     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
623     uint32_t length;
624     if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
625         return panda::JSValueRef::Undefined(vm);
626     }
627     length = lengthArg->Uint32Value(vm);
628     auto radiusArray = std::make_unique<double[]>(length);
629     auto typeArray = std::make_unique<uint32_t[]>(length);
630     auto colorArray = std::make_unique<uint32_t[]>(length);
631     auto offsetXArray = std::make_unique<double[]>(length);
632     auto offsetYArray = std::make_unique<double[]>(length);
633     auto fillArray = std::make_unique<uint32_t[]>(length);
634     bool radiusParseResult = ArkTSUtils::ParseArray<double>(
635         vm, radiusArg, radiusArray.get(), length, ArkTSUtils::parseShadowRadius);
636     bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(
637         vm, typeArg, typeArray.get(), length, ArkTSUtils::parseShadowType);
638     bool colorParseResult = ArkTSUtils::ParseArray<uint32_t>(
639         vm, colorArg, colorArray.get(), length, ArkTSUtils::parseShadowColor);
640     bool offsetXParseResult = ArkTSUtils::ParseArray<double>(
641         vm, offsetXArg, offsetXArray.get(), length, ArkTSUtils::parseShadowOffset);
642     bool offsetYParseResult = ArkTSUtils::ParseArray<double>(
643         vm, offsetYArg, offsetYArray.get(), length, ArkTSUtils::parseShadowOffset);
644     bool fillParseResult = ArkTSUtils::ParseArray<uint32_t>(
645         vm, fillArg, fillArray.get(), length, ArkTSUtils::parseShadowFill);
646     if (!radiusParseResult || !colorParseResult || !offsetXParseResult ||
647         !offsetYParseResult || !fillParseResult || !typeParseResult) {
648         return panda::JSValueRef::Undefined(vm);
649     }
650     auto textShadowArray = std::make_unique<ArkUITextShadowStruct[]>(length);
651     CHECK_NULL_RETURN(textShadowArray.get(), panda::JSValueRef::Undefined(vm));
652     for (uint32_t i = 0; i < length; i++) {
653         textShadowArray[i].radius = radiusArray[i];
654         textShadowArray[i].type = typeArray[i];
655         textShadowArray[i].color = colorArray[i];
656         textShadowArray[i].offsetX = offsetXArray[i];
657         textShadowArray[i].offsetY = offsetYArray[i];
658         textShadowArray[i].fill = fillArray[i];
659     }
660     GetArkUINodeModifiers()->getTextModifier()->setTextShadow(nativeNode, textShadowArray.get(), length);
661     return panda::JSValueRef::Undefined(vm);
662 }
663 
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)664 ArkUINativeModuleValue TextBridge::ResetTextShadow(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()->getTextModifier()->resetTextShadow(nativeNode);
671     return panda::JSValueRef::Undefined(vm);
672 }
673 
SetContent(ArkUIRuntimeCallInfo * runtimeCallInfo)674 ArkUINativeModuleValue TextBridge::SetContent(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     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
682 
683     Framework::JSRef<Framework::JSVal> args = info[1];
684     if (args->IsObject() && Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>()) {
685         auto* spanString = Framework::JSRef<Framework::JSObject>::Cast(args)->Unwrap<Framework::JSSpanString>();
686         auto spanStringController = spanString->GetController();
687         if (spanStringController) {
688             TextModelNG::InitSpanStringController(reinterpret_cast<FrameNode*>(nativeNode), spanStringController);
689         }
690         return panda::JSValueRef::Undefined(vm);
691     }
692     std::string content;
693     if (ArkTSUtils::ParseJsString(vm, secondArg, content)) {
694         GetArkUINodeModifiers()->getTextModifier()->setContent(nativeNode, content.c_str());
695     }
696     return panda::JSValueRef::Undefined(vm);
697 }
698 
SetTextController(ArkUIRuntimeCallInfo * runtimeCallInfo)699 ArkUINativeModuleValue TextBridge::SetTextController(ArkUIRuntimeCallInfo* runtimeCallInfo)
700 {
701     EcmaVM* vm = runtimeCallInfo->GetVM();
702     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
703     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
704     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
705     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
706     Framework::JSRef<Framework::JSVal> args = info[1];
707     if (args->IsObject()) {
708         auto paramObject = Framework::JSRef<Framework::JSObject>::Cast(args);
709         auto controllerObj = paramObject->GetProperty("controller");
710         Framework::JSTextController* jsController = nullptr;
711         if (controllerObj->IsObject()) {
712             jsController =
713                 Framework::JSRef<Framework::JSObject>::Cast(controllerObj)->Unwrap<Framework::JSTextController>();
714         }
715         RefPtr<TextControllerBase> controller =
716             TextModelNG::InitTextController(reinterpret_cast<FrameNode*>(nativeNode));
717         if (jsController) {
718             jsController->SetController(controller);
719         }
720     }
721     return panda::JSValueRef::Undefined(vm);
722 }
723 
SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)724 ArkUINativeModuleValue TextBridge::SetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
725 {
726     EcmaVM* vm = runtimeCallInfo->GetVM();
727     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
728     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
729     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
730     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
731     if (secondArg->IsNumber()
732         && secondArg->Int32Value(vm) >= static_cast<int32_t>(TextHeightAdaptivePolicy::MAX_LINES_FIRST)
733         && secondArg->Int32Value(vm) <= static_cast<int32_t>(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST)) {
734         auto value = secondArg->Int32Value(vm);
735         GetArkUINodeModifiers()->getTextModifier()->setTextHeightAdaptivePolicy(nativeNode, value);
736     } else {
737         GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
738     }
739     return panda::JSValueRef::Undefined(vm);
740 }
741 
ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo * runtimeCallInfo)742 ArkUINativeModuleValue TextBridge::ResetHeightAdaptivePolicy(ArkUIRuntimeCallInfo* runtimeCallInfo)
743 {
744     EcmaVM* vm = runtimeCallInfo->GetVM();
745     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
746     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
747     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
748     GetArkUINodeModifiers()->getTextModifier()->resetTextHeightAdaptivePolicy(nativeNode);
749     return panda::JSValueRef::Undefined(vm);
750 }
751 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)752 ArkUINativeModuleValue TextBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
753 {
754     EcmaVM* vm = runtimeCallInfo->GetVM();
755     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
756     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
757     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
758     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
759     CalcDimension indent;
760     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, indent) || indent.IsNegative()) {
761         indent.Reset();
762     }
763 
764     GetArkUINodeModifiers()->getTextModifier()->setTextIndent(
765         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()));
766     return panda::JSValueRef::Undefined(vm);
767 }
768 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)769 ArkUINativeModuleValue TextBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
770 {
771     EcmaVM* vm = runtimeCallInfo->GetVM();
772     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
773     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
774     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
775     GetArkUINodeModifiers()->getTextModifier()->resetTextIndent(nativeNode);
776     return panda::JSValueRef::Undefined(vm);
777 }
778 
SetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)779 ArkUINativeModuleValue TextBridge::SetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
780 {
781     EcmaVM* vm = runtimeCallInfo->GetVM();
782     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
783     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
784     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
785     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
786     CalcDimension baselineOffset;
787     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, baselineOffset, DimensionUnit::FP, false)) {
788         baselineOffset.Reset();
789     }
790 
791     GetArkUINodeModifiers()->getTextModifier()->setTextBaselineOffset(
792         nativeNode, baselineOffset.Value(), static_cast<int8_t>(baselineOffset.Unit()));
793     return panda::JSValueRef::Undefined(vm);
794 }
795 
ResetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)796 ArkUINativeModuleValue TextBridge::ResetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
797 {
798     EcmaVM* vm = runtimeCallInfo->GetVM();
799     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
800     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
801     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
802     GetArkUINodeModifiers()->getTextModifier()->resetTextBaselineOffset(nativeNode);
803     return panda::JSValueRef::Undefined(vm);
804 }
805 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)806 ArkUINativeModuleValue TextBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
807 {
808     EcmaVM* vm = runtimeCallInfo->GetVM();
809     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
810     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
811     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
812     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
813     CalcDimension letterSpacing;
814     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, letterSpacing, DimensionUnit::FP, false)) {
815         letterSpacing.Reset();
816     }
817 
818     GetArkUINodeModifiers()->getTextModifier()->setTextLetterSpacing(
819         nativeNode, letterSpacing.Value(), static_cast<int8_t>(letterSpacing.Unit()));
820     return panda::JSValueRef::Undefined(vm);
821 }
822 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)823 ArkUINativeModuleValue TextBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
824 {
825     EcmaVM* vm = runtimeCallInfo->GetVM();
826     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
827     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
828     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
829     GetArkUINodeModifiers()->getTextModifier()->resetTextLetterSpacing(nativeNode);
830     return panda::JSValueRef::Undefined(vm);
831 }
832 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)833 ArkUINativeModuleValue TextBridge::SetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
834 {
835     EcmaVM* vm = runtimeCallInfo->GetVM();
836     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
837     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
838     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
839     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
840     Local<JSValueRef> familyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
841     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
842     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(NUM_5);
843 
844     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
845     ArkUIFontWithOptionsStruct fontInfo;
846     CalcDimension fontSize;
847     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, sizeArg, fontSize, false) || sizeArg->IsNull()) {
848         fontSize.SetValue(DEFAULT_SPAN_FONT_SIZE);
849         fontSize.SetUnit(DEFAULT_SPAN_FONT_UNIT);
850     }
851     if (sizeArg->IsUndefined() || fontSize.IsNegative() || fontSize.Unit() == DimensionUnit::PERCENT) {
852         auto theme = ArkTSUtils::GetTheme<TextTheme>();
853         CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
854         auto size = theme->GetTextStyle().GetFontSize();
855         fontInfo.fontSizeNumber = size.Value();
856         fontInfo.fontSizeUnit = static_cast<int8_t>(size.Unit());
857     } else {
858         fontInfo.fontSizeNumber = fontSize.Value();
859         fontInfo.fontSizeUnit = static_cast<int8_t>(fontSize.Unit());
860     }
861 
862     int32_t variableFontWeight = DEFAULT_VARIABLE_FONT_WEIGHT;
863     std::string weight = DEFAULT_FONT_WEIGHT;
864     if (!weightArg->IsNull()) {
865         if (weightArg->IsNumber()) {
866             weight = std::to_string(weightArg->Int32Value(vm));
867             variableFontWeight = weightArg->Int32Value(vm);
868         } else if (weightArg->IsString(vm)) {
869             weight = weightArg->ToString(vm)->ToString(vm);
870             variableFontWeight = StringUtils::StringToInt(weight);
871         }
872     }
873     fontInfo.fontWeight = static_cast<uint8_t>(Framework::ConvertStrToFontWeight(weight));
874     fontInfo.variableFontWeight = variableFontWeight;
875 
876     if (optionsArg->IsBoolean()) {
877         fontInfo.enableVariableFontWeight = static_cast<int32_t>(optionsArg->BooleaValue(vm));
878     }
879 
880     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
881     if (styleArg->IsInt()) {
882         style = styleArg->Int32Value(vm);
883     }
884     fontInfo.fontStyle = static_cast<uint8_t>(style);
885 
886     std::vector<std::string> fontFamilies;
887     fontInfo.fontFamilies = nullptr;
888     if (!familyArg->IsNull() && ArkTSUtils::ParseJsFontFamilies(vm, familyArg, fontFamilies)) {
889         fontInfo.familyLength = fontFamilies.size();
890         auto families = std::make_unique<const char* []>(fontInfo.familyLength);
891         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
892             families[i] = fontFamilies[i].c_str();
893         }
894         fontInfo.fontFamilies = families.get();
895         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo);
896     } else {
897         GetArkUINodeModifiers()->getTextModifier()->setTextFont(nativeNode, &fontInfo);
898     }
899     return panda::JSValueRef::Undefined(vm);
900 }
901 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)902 ArkUINativeModuleValue TextBridge::ResetFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
903 {
904     EcmaVM* vm = runtimeCallInfo->GetVM();
905     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
906     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
907     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
908     GetArkUINodeModifiers()->getTextModifier()->resetTextFont(nativeNode);
909     return panda::JSValueRef::Undefined(vm);
910 }
911 
SetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)912 ArkUINativeModuleValue TextBridge::SetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
913 {
914     EcmaVM* vm = runtimeCallInfo->GetVM();
915     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
916     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
917     Local<JSValueRef> workBreakArg = runtimeCallInfo->GetCallArgRef(NUM_1);
918     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
919     if (workBreakArg->IsNull() || workBreakArg->IsUndefined() || !workBreakArg->IsNumber()) {
920         GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
921         return panda::JSValueRef::Undefined(vm);
922     }
923     uint32_t wordBreak = workBreakArg->Uint32Value(vm);
924     GetArkUINodeModifiers()->getTextModifier()->setWordBreak(nativeNode, wordBreak);
925     return panda::JSValueRef::Undefined(vm);
926 }
927 
ResetWordBreak(ArkUIRuntimeCallInfo * runtimeCallInfo)928 ArkUINativeModuleValue TextBridge::ResetWordBreak(ArkUIRuntimeCallInfo* runtimeCallInfo)
929 {
930     EcmaVM* vm = runtimeCallInfo->GetVM();
931     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
932     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
933     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
934     GetArkUINodeModifiers()->getTextModifier()->resetWordBreak(nativeNode);
935     return panda::JSValueRef::Undefined(vm);
936 }
937 
SetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)938 ArkUINativeModuleValue TextBridge::SetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
939 {
940     EcmaVM* vm = runtimeCallInfo->GetVM();
941     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
942     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
943     Local<JSValueRef> lineBreakStrategyArg = runtimeCallInfo->GetCallArgRef(NUM_1);
944     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
945     if (lineBreakStrategyArg->IsNull() || lineBreakStrategyArg->IsUndefined() || !lineBreakStrategyArg->IsNumber()) {
946         GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
947         return panda::JSValueRef::Undefined(vm);
948     }
949     uint32_t lineBreakStrategy = lineBreakStrategyArg->Uint32Value(vm);
950     GetArkUINodeModifiers()->getTextModifier()->setLineBreakStrategy(nativeNode, lineBreakStrategy);
951     return panda::JSValueRef::Undefined(vm);
952 }
953 
ResetLineBreakStrategy(ArkUIRuntimeCallInfo * runtimeCallInfo)954 ArkUINativeModuleValue TextBridge::ResetLineBreakStrategy(ArkUIRuntimeCallInfo* runtimeCallInfo)
955 {
956     EcmaVM* vm = runtimeCallInfo->GetVM();
957     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
958     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
959     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
960     GetArkUINodeModifiers()->getTextModifier()->resetLineBreakStrategy(nativeNode);
961     return panda::JSValueRef::Undefined(vm);
962 }
963 
SetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue TextBridge::SetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966     EcmaVM* vm = runtimeCallInfo->GetVM();
967     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
968     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
969     Local<JSValueRef> ellipsisModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
970     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
971     if (ellipsisModeArg->IsNull() || ellipsisModeArg->IsUndefined() || !ellipsisModeArg->IsNumber()) {
972         GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
973         return panda::JSValueRef::Undefined(vm);
974     }
975     uint32_t ellipsisMode = ellipsisModeArg->Uint32Value(vm);
976     GetArkUINodeModifiers()->getTextModifier()->setEllipsisMode(nativeNode, ellipsisMode);
977     return panda::JSValueRef::Undefined(vm);
978 }
979 
ResetEllipsisMode(ArkUIRuntimeCallInfo * runtimeCallInfo)980 ArkUINativeModuleValue TextBridge::ResetEllipsisMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
981 {
982     EcmaVM* vm = runtimeCallInfo->GetVM();
983     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
984     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
985     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
986     GetArkUINodeModifiers()->getTextModifier()->resetEllipsisMode(nativeNode);
987     return panda::JSValueRef::Undefined(vm);
988 }
989 
SetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)990 ArkUINativeModuleValue TextBridge::SetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
991 {
992     EcmaVM* vm = runtimeCallInfo->GetVM();
993     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
994     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
995     Local<JSValueRef> enableDataDetectorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
996     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
997     if (enableDataDetectorArg->IsNull() || enableDataDetectorArg->IsUndefined() ||
998         !enableDataDetectorArg->IsBoolean()) {
999         GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1000         return panda::JSValueRef::Undefined(vm);
1001     }
1002     uint32_t enableDataDetector = enableDataDetectorArg->Uint32Value(vm);
1003     GetArkUINodeModifiers()->getTextModifier()->setEnableDataDetector(nativeNode, enableDataDetector);
1004     return panda::JSValueRef::Undefined(vm);
1005 }
1006 
ResetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)1007 ArkUINativeModuleValue TextBridge::ResetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
1008 {
1009     EcmaVM* vm = runtimeCallInfo->GetVM();
1010     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1011     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1012     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1013     GetArkUINodeModifiers()->getTextModifier()->resetEnableDataDetector(nativeNode);
1014     return panda::JSValueRef::Undefined(vm);
1015 }
1016 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1017 ArkUINativeModuleValue TextBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1018 {
1019     EcmaVM* vm = runtimeCallInfo->GetVM();
1020     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1021     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1022     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1023     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1024     if (secondArg->IsString(vm)) {
1025         auto value = secondArg->ToString(vm)->ToString(vm);
1026         GetArkUINodeModifiers()->getTextModifier()->setTextFontFeature(nativeNode, value.c_str());
1027     } else {
1028         GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1029     }
1030     return panda::JSValueRef::Undefined(vm);
1031 }
1032 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)1033 ArkUINativeModuleValue TextBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
1034 {
1035     EcmaVM* vm = runtimeCallInfo->GetVM();
1036     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1037     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1038     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1039     GetArkUINodeModifiers()->getTextModifier()->resetTextFontFeature(nativeNode);
1040     return panda::JSValueRef::Undefined(vm);
1041 }
1042 
SetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1043 ArkUINativeModuleValue TextBridge::SetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1044 {
1045     EcmaVM* vm = runtimeCallInfo->GetVM();
1046     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1047     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1048     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     CalcDimension value;
1051     if (!ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, value)) {
1052         GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1053     } else {
1054         if (value.IsNegative()) {
1055             value.Reset();
1056         }
1057         GetArkUINodeModifiers()->getTextModifier()->setTextLineSpacing(
1058             nativeNode, value.Value(), static_cast<int>(value.Unit()));
1059     }
1060     return panda::JSValueRef::Undefined(vm);
1061 }
1062 
ResetLineSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)1063 ArkUINativeModuleValue TextBridge::ResetLineSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
1064 {
1065     EcmaVM* vm = runtimeCallInfo->GetVM();
1066     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1067     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1068     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1069     GetArkUINodeModifiers()->getTextModifier()->resetTextLineSpacing(nativeNode);
1070     return panda::JSValueRef::Undefined(vm);
1071 }
1072 
SetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1073 ArkUINativeModuleValue TextBridge::SetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1074 {
1075     EcmaVM* vm = runtimeCallInfo->GetVM();
1076     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1077     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1078     Local<JSValueRef> startArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1079     Local<JSValueRef> endArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1080     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1081     if (!startArg->IsNumber() || !endArg->IsNumber()) {
1082         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1083         return panda::JSValueRef::Undefined(vm);
1084     }
1085     int32_t startIndex = startArg->Int32Value(vm);
1086     int32_t endIndex = endArg->Int32Value(vm);
1087     if (startIndex >= endIndex) {
1088         GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1089         return panda::JSValueRef::Undefined(vm);
1090     }
1091     GetArkUINodeModifiers()->getTextModifier()->setTextSelection(nativeNode, startIndex, endIndex);
1092     return panda::JSValueRef::Undefined(vm);
1093 }
1094 
ResetSelection(ArkUIRuntimeCallInfo * runtimeCallInfo)1095 ArkUINativeModuleValue TextBridge::ResetSelection(ArkUIRuntimeCallInfo* runtimeCallInfo)
1096 {
1097     EcmaVM* vm = runtimeCallInfo->GetVM();
1098     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1099     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1100     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1101     GetArkUINodeModifiers()->getTextModifier()->resetTextSelection(nativeNode);
1102     return panda::JSValueRef::Undefined(vm);
1103 }
1104 
SetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1105 ArkUINativeModuleValue TextBridge::SetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1106 {
1107     EcmaVM* vm = runtimeCallInfo->GetVM();
1108     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1109     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1110     Local<JSValueRef> textSelectableModeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1111     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1112     if (textSelectableModeArg->IsNull() || textSelectableModeArg->IsUndefined() || !textSelectableModeArg->IsNumber()) {
1113         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1114         return panda::JSValueRef::Undefined(vm);
1115     }
1116     uint32_t textSelectableMode = textSelectableModeArg->Uint32Value(vm);
1117     GetArkUINodeModifiers()->getTextModifier()->setTextSelectableMode(nativeNode, textSelectableMode);
1118     return panda::JSValueRef::Undefined(vm);
1119 }
1120 
ResetTextSelectableMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1121 ArkUINativeModuleValue TextBridge::ResetTextSelectableMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1122 {
1123     EcmaVM* vm = runtimeCallInfo->GetVM();
1124     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1125     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1127     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectableMode(nativeNode);
1128     return panda::JSValueRef::Undefined(vm);
1129 }
1130 
SetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1131 ArkUINativeModuleValue TextBridge::SetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1132 {
1133     EcmaVM* vm = runtimeCallInfo->GetVM();
1134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1136     Local<JSValueRef> typesArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1137     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1138     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1139     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1140     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1141     if (!typesArg->IsArray(vm)) {
1142         GetArkUINodeModifiers()->getTextModifier()->
1143             resetTextDataDetectorConfigWithEvent(nativeNode);
1144         return panda::JSValueRef::Undefined(vm);
1145     }
1146 
1147     struct ArkUITextDetectConfigStruct arkUITextDetectConfig;
1148     std::string types;
1149     auto array = panda::Local<panda::ArrayRef>(typesArg);
1150     for (size_t i = 0; i < array->Length(vm); i++) {
1151         auto value = panda::ArrayRef::GetValueAt(vm, array, i);
1152         auto index = value->Int32Value(vm);
1153         if (index < 0 || index >= static_cast<int32_t>(TEXT_DETECT_TYPES.size())) {
1154             return panda::NativePointerRef::New(vm, nullptr);
1155         }
1156         if (i != 0) {
1157             types.append(",");
1158         }
1159         types.append(TEXT_DETECT_TYPES[index]);
1160     }
1161     arkUITextDetectConfig.types = types.c_str();
1162     std::function<void(const std::string&)> callback;
1163     if (callbackArg->IsFunction(vm)) {
1164         panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1165         callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const std::string& info) {
1166             panda::LocalScope pandaScope(vm);
1167             panda::TryCatch trycatch(vm);
1168             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1169             panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1170                 panda::StringRef::NewFromUtf8(vm, info.c_str()) };
1171             func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1172         };
1173         arkUITextDetectConfig.onResult = reinterpret_cast<void*>(&callback);
1174     }
1175     ParseAIEntityColor(runtimeCallInfo, arkUITextDetectConfig);
1176     GetArkUINodeModifiers()->getTextModifier()->
1177         setTextDataDetectorConfigWithEvent(nativeNode, &arkUITextDetectConfig);
1178     return panda::JSValueRef::Undefined(vm);
1179 }
1180 
ParseAIEntityColor(ArkUIRuntimeCallInfo * runtimeCallInfo,struct ArkUITextDetectConfigStruct & arkUITextDetectConfig)1181 void TextBridge::ParseAIEntityColor(
1182     ArkUIRuntimeCallInfo* runtimeCallInfo, struct ArkUITextDetectConfigStruct& arkUITextDetectConfig)
1183 {
1184     EcmaVM* vm = runtimeCallInfo->GetVM();
1185     CHECK_NULL_VOID(vm);
1186     TextDetectConfig textDetectConfig;
1187     Local<JSValueRef> entityColorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1188     ArkTSUtils::ParseJsColorAlpha(vm, entityColorArg, textDetectConfig.entityColor);
1189     arkUITextDetectConfig.entityColor = textDetectConfig.entityColor.GetValue();
1190 
1191     Local<JSValueRef> entityDecorationTypeArg = runtimeCallInfo->GetCallArgRef(NUM_4);
1192     Local<JSValueRef> entityDecorationColorArg = runtimeCallInfo->GetCallArgRef(NUM_5);
1193     Local<JSValueRef> entityDecorationStyleArg = runtimeCallInfo->GetCallArgRef(NUM_6);
1194     arkUITextDetectConfig.entityDecorationType = static_cast<int32_t>(textDetectConfig.entityDecorationType);
1195     arkUITextDetectConfig.entityDecorationColor = arkUITextDetectConfig.entityColor;
1196     arkUITextDetectConfig.entityDecorationStyle = static_cast<int32_t>(textDetectConfig.entityDecorationStyle);
1197 
1198     if (entityDecorationTypeArg->IsInt()) {
1199         arkUITextDetectConfig.entityDecorationType = entityDecorationTypeArg->Int32Value(vm);
1200     }
1201     if (ArkTSUtils::ParseJsColorAlpha(vm, entityDecorationColorArg, textDetectConfig.entityDecorationColor)) {
1202         arkUITextDetectConfig.entityDecorationColor = textDetectConfig.entityDecorationColor.GetValue();
1203     }
1204     if (entityDecorationStyleArg->IsInt()) {
1205         arkUITextDetectConfig.entityDecorationStyle = entityDecorationStyleArg->Int32Value(vm);
1206     }
1207 }
1208 
ResetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)1209 ArkUINativeModuleValue TextBridge::ResetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
1210 {
1211     EcmaVM* vm = runtimeCallInfo->GetVM();
1212     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1213     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1214     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1215     GetArkUINodeModifiers()->getTextModifier()->
1216         resetTextDataDetectorConfigWithEvent(nativeNode);
1217     return panda::JSValueRef::Undefined(vm);
1218 }
1219 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1220 ArkUINativeModuleValue TextBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1221 {
1222     EcmaVM *vm = runtimeCallInfo->GetVM();
1223     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1224     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1225     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1226     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1227     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1228     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1229     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1230         GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1231         return panda::JSValueRef::Undefined(vm);
1232     }
1233     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1234     std::function<void(const std::string&)> callback = [vm, frameNode,
1235         func = panda::CopyableGlobal(vm, func)](const std::string& copyStr) {
1236         panda::LocalScope pandaScope(vm);
1237         panda::TryCatch trycatch(vm);
1238         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1239         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1240             panda::StringRef::NewFromUtf8(vm, copyStr.c_str()) };
1241         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1242     };
1243     GetArkUINodeModifiers()->getTextModifier()->setTextOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1244     return panda::JSValueRef::Undefined(vm);
1245 }
1246 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1247 ArkUINativeModuleValue TextBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1248 {
1249     EcmaVM* vm = runtimeCallInfo->GetVM();
1250     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1251     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1252     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1253     GetArkUINodeModifiers()->getTextModifier()->resetTextOnCopy(nativeNode);
1254     return panda::JSValueRef::Undefined(vm);
1255 }
1256 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1257 ArkUINativeModuleValue TextBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1258 {
1259     EcmaVM *vm = runtimeCallInfo->GetVM();
1260     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1261     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1262     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1263     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1264     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1265     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1266     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1267         GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1268         return panda::JSValueRef::Undefined(vm);
1269     }
1270     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1271     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1272         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int32_t selectionEnd) {
1273         panda::LocalScope pandaScope(vm);
1274         panda::TryCatch trycatch(vm);
1275         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1276         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1277         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1278         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1279         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1280     };
1281     GetArkUINodeModifiers()->getTextModifier()->setTextOnTextSelectionChange(
1282         nativeNode, reinterpret_cast<void*>(&callback));
1283     return panda::JSValueRef::Undefined(vm);
1284 }
1285 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1286 ArkUINativeModuleValue TextBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1287 {
1288     EcmaVM* vm = runtimeCallInfo->GetVM();
1289     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1290     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1291     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1292     GetArkUINodeModifiers()->getTextModifier()->resetTextOnTextSelectionChange(nativeNode);
1293     return panda::JSValueRef::Undefined(vm);
1294 }
1295 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1296 ArkUINativeModuleValue TextBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1297 {
1298     EcmaVM* vm = runtimeCallInfo->GetVM();
1299     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1301     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1302     NG::OnCreateMenuCallback onCreateMenuCallback;
1303     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1304     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
1305         GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1306         return panda::JSValueRef::Undefined(vm);
1307     }
1308     GetArkUINodeModifiers()->getTextModifier()->setTextSelectionMenuOptions(
1309         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
1310     return panda::JSValueRef::Undefined(vm);
1311 }
1312 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1313 ArkUINativeModuleValue TextBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1314 {
1315     EcmaVM* vm = runtimeCallInfo->GetVM();
1316     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1317     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1318     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1319     GetArkUINodeModifiers()->getTextModifier()->resetTextSelectionMenuOptions(nativeNode);
1320     return panda::JSValueRef::Undefined(vm);
1321 }
1322 
SetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1323 ArkUINativeModuleValue TextBridge::SetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1324 {
1325     EcmaVM* vm = runtimeCallInfo->GetVM();
1326     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1327     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1328     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1329     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1330     bool halfLeading = false;
1331     if (secondArg->IsBoolean()) {
1332         halfLeading = secondArg->ToBoolean(vm)->Value();
1333     }
1334     GetArkUINodeModifiers()->getTextModifier()->setTextHalfLeading(nativeNode, halfLeading);
1335     return panda::JSValueRef::Undefined(vm);
1336 }
1337 
ResetHalfLeading(ArkUIRuntimeCallInfo * runtimeCallInfo)1338 ArkUINativeModuleValue TextBridge::ResetHalfLeading(ArkUIRuntimeCallInfo* runtimeCallInfo)
1339 {
1340     EcmaVM* vm = runtimeCallInfo->GetVM();
1341     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1342     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1344     GetArkUINodeModifiers()->getTextModifier()->resetTextHalfLeading(nativeNode);
1345     return panda::JSValueRef::Undefined(vm);
1346 }
1347 
SetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1348 ArkUINativeModuleValue TextBridge::SetOnClick(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     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1354     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1355     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1356     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1357     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1358         GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1359         return panda::JSValueRef::Undefined(vm);
1360     }
1361     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1362     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1363         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int32_t selectionEnd) {
1364         panda::LocalScope pandaScope(vm);
1365         panda::TryCatch trycatch(vm);
1366         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1367         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1368         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1369         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1370         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1371     };
1372     GetArkUINodeModifiers()->getTextModifier()->setTextOnClick(
1373         nativeNode, reinterpret_cast<void*>(&callback));
1374     return panda::JSValueRef::Undefined(vm);
1375 }
1376 
ResetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)1377 ArkUINativeModuleValue TextBridge::ResetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
1378 {
1379     EcmaVM* vm = runtimeCallInfo->GetVM();
1380     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1381     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1382     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1383     GetArkUINodeModifiers()->getTextModifier()->resetTextOnClick(nativeNode);
1384     return panda::JSValueRef::Undefined(vm);
1385 }
1386 
SetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1387 ArkUINativeModuleValue TextBridge::SetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1388 {
1389     EcmaVM* vm = runtimeCallInfo->GetVM();
1390     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1391     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1392     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1393     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1394     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1395     int32_t length = thirdArg->Int32Value(vm);
1396     ArkUI_Float32 regionArray[length];
1397     int32_t regionUnits[length];
1398     if (!ArkTSUtils::ParseResponseRegion(vm, secondArg, regionArray, regionUnits, length)) {
1399         GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1400         return panda::JSValueRef::Undefined(vm);
1401     }
1402     GetArkUINodeModifiers()->getTextModifier()->setTextResponseRegion(nativeNode, regionArray, regionUnits, length);
1403     return panda::JSValueRef::Undefined(vm);
1404 }
1405 
ResetResponseRegion(ArkUIRuntimeCallInfo * runtimeCallInfo)1406 ArkUINativeModuleValue TextBridge::ResetResponseRegion(ArkUIRuntimeCallInfo* runtimeCallInfo)
1407 {
1408     EcmaVM* vm = runtimeCallInfo->GetVM();
1409     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1410     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1411     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1412     GetArkUINodeModifiers()->getTextModifier()->resetTextResponseRegion(nativeNode);
1413     return panda::JSValueRef::Undefined(vm);
1414 }
1415 } // namespace OHOS::Ace::NG
1416