• 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_rich_editor_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
17 #include "bridge/declarative_frontend/jsview/js_richeditor.h"
18 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
19 #include "bridge/declarative_frontend/jsview/js_utils.h"
20 #include "core/common/ace_application_info.h"
21 #include "core/components/common/layout/constants.h"
22 #include "core/components/common/properties/text_style_parser.h"
23 #include "core/components_ng/pattern/rich_editor/selection_info.h"
24 #include "core/components_ng/pattern/rich_editor/rich_editor_theme.h"
25 namespace OHOS::Ace::NG {
26 namespace {
27 constexpr int NUM_0 = 0;
28 constexpr int NUM_1 = 1;
29 constexpr int NUM_2 = 2;
30 constexpr int NUM_3 = 3;
31 constexpr int NUM_4 = 4;
32 constexpr int NUM_5 = 5;
33 constexpr int NUM_6 = 6;
34 const std::vector<std::string> TEXT_DETECT_TYPES = { "phoneNum", "url", "email", "location", "datetime" };
35 }
36 
SetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)37 ArkUINativeModuleValue RichEditorBridge::SetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
38 {
39     EcmaVM* vm = runtimeCallInfo->GetVM();
40     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
41     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
42     Local<JSValueRef> enableDataDetectorArg = runtimeCallInfo->GetCallArgRef(NUM_1);
43     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
44     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
45     auto nodeModifiers = GetArkUINodeModifiers();
46     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
47     if (enableDataDetectorArg->IsNull() || enableDataDetectorArg->IsUndefined() ||
48         !enableDataDetectorArg->IsBoolean()) {
49         nodeModifiers->getRichEditorModifier()->resetRichEditorEnableDataDetector(nativeNode);
50         return panda::JSValueRef::Undefined(vm);
51     }
52     uint32_t enableDataDetector = enableDataDetectorArg->Uint32Value(vm);
53     nodeModifiers->getRichEditorModifier()->setRichEditorEnableDataDetector(nativeNode, enableDataDetector);
54     return panda::JSValueRef::Undefined(vm);
55 }
56 
ResetEnableDataDetector(ArkUIRuntimeCallInfo * runtimeCallInfo)57 ArkUINativeModuleValue RichEditorBridge::ResetEnableDataDetector(ArkUIRuntimeCallInfo* runtimeCallInfo)
58 {
59     EcmaVM* vm = runtimeCallInfo->GetVM();
60     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
61     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
62     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
63     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
64     auto nodeModifiers = GetArkUINodeModifiers();
65     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
66     nodeModifiers->getRichEditorModifier()->resetRichEditorEnableDataDetector(nativeNode);
67     return panda::JSValueRef::Undefined(vm);
68 }
69 
CreateParagraphStyle(EcmaVM * vm,const TextStyleResult & textStyleResult)70 Local<panda::ObjectRef> CreateParagraphStyle(EcmaVM *vm, const TextStyleResult& textStyleResult)
71 {
72     auto leadingMarginArray = panda::ArrayRef::New(vm);
73     panda::ArrayRef::SetValueAt(vm, leadingMarginArray, NUM_0,
74         panda::StringRef::NewFromUtf8(vm, textStyleResult.leadingMarginSize[NUM_0].c_str()));
75     panda::ArrayRef::SetValueAt(vm, leadingMarginArray, NUM_1,
76         panda::StringRef::NewFromUtf8(vm, textStyleResult.leadingMarginSize[NUM_1].c_str()));
77     const char* keys[] = { "textAlign", "leadingMargin" };
78     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, textStyleResult.textAlign), leadingMarginArray };
79     auto returnObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
80     if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
81         returnObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "wordBreak"),
82             panda::NumberRef::New(vm, textStyleResult.wordBreak));
83         returnObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "lineBreakStrategy"),
84             panda::NumberRef::New(vm, textStyleResult.lineBreakStrategy));
85     }
86     return returnObject;
87 }
88 
SetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue RichEditorBridge::SetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91     EcmaVM* vm = runtimeCallInfo->GetVM();
92     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
93     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
94     Local<JSValueRef> typesArg = runtimeCallInfo->GetCallArgRef(NUM_1);
95     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
96     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
97     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
98     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
99     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
100     auto nodeModifiers = GetArkUINodeModifiers();
101     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
102     if (!typesArg->IsArray(vm)) {
103         nodeModifiers->getRichEditorModifier()->
104             resetRichEditorDataDetectorConfigWithEvent(nativeNode);
105         return panda::JSValueRef::Undefined(vm);
106     }
107 
108     struct ArkUITextDetectConfigStruct arkUITextDetectConfig;
109     std::string types;
110     auto array = panda::Local<panda::ArrayRef>(typesArg);
111     for (size_t i = 0; i < array->Length(vm); i++) {
112         auto value = panda::ArrayRef::GetValueAt(vm, array, i);
113         auto index = value->Int32Value(vm);
114         if (index < 0 || index >= static_cast<int32_t>(TEXT_DETECT_TYPES.size())) {
115             return panda::JSValueRef::Undefined(vm);
116         }
117         if (i != 0) {
118             types.append(",");
119         }
120         types.append(TEXT_DETECT_TYPES[index]);
121     }
122     arkUITextDetectConfig.types = types.c_str();
123     std::function<void(const std::string&)> callback;
124     if (callbackArg->IsFunction(vm)) {
125         panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
126         callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const std::string& info) {
127             panda::LocalScope pandaScope(vm);
128             panda::TryCatch trycatch(vm);
129             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
130             panda::Local<panda::JSValueRef> params[NUM_1] = {
131                 panda::StringRef::NewFromUtf8(vm, info.c_str()) };
132             func->Call(vm, func.ToLocal(), params, NUM_1);
133         };
134         arkUITextDetectConfig.onResult = reinterpret_cast<void*>(&callback);
135     }
136     ParseAIEntityColor(runtimeCallInfo, arkUITextDetectConfig);
137     nodeModifiers->getRichEditorModifier()->
138         setRichEditorDataDetectorConfigWithEvent(nativeNode, &arkUITextDetectConfig);
139     return panda::JSValueRef::Undefined(vm);
140 }
141 
ParseAIEntityColor(ArkUIRuntimeCallInfo * runtimeCallInfo,struct ArkUITextDetectConfigStruct & arkUITextDetectConfig)142 void RichEditorBridge::ParseAIEntityColor(
143     ArkUIRuntimeCallInfo* runtimeCallInfo, struct ArkUITextDetectConfigStruct& arkUITextDetectConfig)
144 {
145     EcmaVM* vm = runtimeCallInfo->GetVM();
146     CHECK_NULL_VOID(vm);
147     TextDetectConfig textDetectConfig;
148     Local<JSValueRef> entityColorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
149     ArkTSUtils::ParseJsColorAlpha(vm, entityColorArg, textDetectConfig.entityColor);
150     arkUITextDetectConfig.entityColor = textDetectConfig.entityColor.GetValue();
151 
152     Local<JSValueRef> entityDecorationTypeArg = runtimeCallInfo->GetCallArgRef(NUM_4);
153     Local<JSValueRef> entityDecorationColorArg = runtimeCallInfo->GetCallArgRef(NUM_5);
154     Local<JSValueRef> entityDecorationStyleArg = runtimeCallInfo->GetCallArgRef(NUM_6);
155     arkUITextDetectConfig.entityDecorationType = static_cast<int32_t>(textDetectConfig.entityDecorationType);
156     arkUITextDetectConfig.entityDecorationColor = arkUITextDetectConfig.entityColor;
157     arkUITextDetectConfig.entityDecorationStyle = static_cast<int32_t>(textDetectConfig.entityDecorationStyle);
158 
159     if (entityDecorationTypeArg->IsInt()) {
160         arkUITextDetectConfig.entityDecorationType = entityDecorationTypeArg->Int32Value(vm);
161     }
162     if (ArkTSUtils::ParseJsColorAlpha(vm, entityDecorationColorArg, textDetectConfig.entityDecorationColor)) {
163         arkUITextDetectConfig.entityDecorationColor = textDetectConfig.entityDecorationColor.GetValue();
164     }
165     if (entityDecorationStyleArg->IsInt()) {
166         arkUITextDetectConfig.entityDecorationStyle = entityDecorationStyleArg->Int32Value(vm);
167     }
168 }
169 
ResetDataDetectorConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)170 ArkUINativeModuleValue RichEditorBridge::ResetDataDetectorConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
171 {
172     EcmaVM* vm = runtimeCallInfo->GetVM();
173     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
174     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
175     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
176     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
177     auto nodeModifiers = GetArkUINodeModifiers();
178     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
179     nodeModifiers->getRichEditorModifier()->
180         resetRichEditorDataDetectorConfigWithEvent(nativeNode);
181     return panda::JSValueRef::Undefined(vm);
182 }
183 
CreateAbstractSpanResult(EcmaVM * vm,RichEditorAbstractSpanResult & event)184 Local<panda::ObjectRef> CreateAbstractSpanResult(EcmaVM *vm, RichEditorAbstractSpanResult& event)
185 {
186     const char* spanPositionObjKeys[] = { "spanRange", "spanIndex" };
187     auto spanRange = panda::ArrayRef::New(vm);
188     panda::ArrayRef::SetValueAt(vm, spanRange, NUM_0, panda::NumberRef::New(vm, event.GetSpanRangeStart()));
189     panda::ArrayRef::SetValueAt(vm, spanRange, NUM_1, panda::NumberRef::New(vm, event.GetSpanRangeEnd()));
190     Local<JSValueRef> spanPositionObjValues[] = { spanRange, panda::NumberRef::New(vm, event.GetSpanIndex()) };
191     auto spanPositionObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(spanPositionObjKeys),
192         spanPositionObjKeys, spanPositionObjValues);
193     const char* decorationObjKeys[] = { "type", "color" };
194     Local<JSValueRef> decorationObjValues[] = {
195         panda::NumberRef::New(vm, static_cast<int32_t>(event.GetTextDecoration())),
196         panda::StringRef::NewFromUtf8(vm, event.GetColor().c_str())
197     };
198     auto decorationObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(decorationObjKeys),
199         decorationObjKeys, decorationObjValues);
200 
201     const char* textStyleObjKeys[] = { "fontColor", "fontFeature", "fontSize", "lineHeight",
202         "letterSpacing", "fontStyle", "fontWeight", "fontFamily", "decoration"};
203     Local<JSValueRef> textStyleObjValues[] = {
204         panda::StringRef::NewFromUtf8(vm, event.GetFontColor().c_str()),
205         panda::StringRef::NewFromUtf8(vm, UnParseFontFeatureSetting(event.GetFontFeatures()).c_str()),
206         panda::NumberRef::New(vm, event.GetFontSize()),
207         panda::NumberRef::New(vm, event.GetTextStyle().lineHeight),
208         panda::NumberRef::New(vm, event.GetTextStyle().letterSpacing),
209         panda::NumberRef::New(vm, static_cast<int32_t>(event.GetFontStyle())),
210         panda::NumberRef::New(vm, event.GetFontWeight()),
211         panda::StringRef::NewFromUtf8(vm, event.GetFontFamily().c_str()), decorationObj
212     };
213     auto textStyleObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(textStyleObjKeys),
214         textStyleObjKeys, textStyleObjValues);
215     auto offsetInSpan = panda::ArrayRef::New(vm);
216     panda::ArrayRef::SetValueAt(vm, offsetInSpan, NUM_0, panda::NumberRef::New(vm, event.OffsetInSpan()));
217     panda::ArrayRef::SetValueAt(vm, offsetInSpan, NUM_1,
218         panda::NumberRef::New(vm, event.OffsetInSpan() + event.GetEraseLength()));
219 
220     const char* onIMEInputCompleteObjKeys[] = { "spanPosition", "value", "previewText", "textStyle",
221         "offsetInSpan", "paragraphStyle" };
222     Local<JSValueRef> onIMEInputCompleteObjValues[] = {
223         spanPositionObj, panda::StringRef::NewFromUtf16(vm, event.GetValue().c_str()),
224         panda::StringRef::NewFromUtf16(vm, event.GetPreviewText().c_str()),
225         textStyleObj, offsetInSpan,
226         CreateParagraphStyle(vm, event.GetTextStyle())
227     };
228     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(onIMEInputCompleteObjKeys),
229         onIMEInputCompleteObjKeys, onIMEInputCompleteObjValues);
230 }
231 
SetOnIMEInputComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)232 ArkUINativeModuleValue RichEditorBridge::SetOnIMEInputComplete(ArkUIRuntimeCallInfo* runtimeCallInfo)
233 {
234     EcmaVM* vm = runtimeCallInfo->GetVM();
235     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
236     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
237     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
238     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
239     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
240     auto nodeModifiers = GetArkUINodeModifiers();
241     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
242     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
243         nodeModifiers->getRichEditorModifier()->resetRichEditorOnIMEInputComplete(nativeNode);
244         return panda::JSValueRef::Undefined(vm);
245     }
246     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
247     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
248     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
249     std::function<void(RichEditorAbstractSpanResult&)> callback = [vm, frameNode,
250         func = panda::CopyableGlobal(vm, func)](RichEditorAbstractSpanResult& event) {
251         panda::LocalScope pandaScope(vm);
252         panda::TryCatch trycatch(vm);
253         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
254         auto onIMEInputCompleteObj = CreateAbstractSpanResult(vm, event);
255         onIMEInputCompleteObj->SetNativePointerFieldCount(vm, NUM_1);
256         onIMEInputCompleteObj->SetNativePointerField(vm, NUM_0, static_cast<void*>(&event));
257         panda::Local<panda::JSValueRef> params[NUM_1] = { onIMEInputCompleteObj };
258         func->Call(vm, func.ToLocal(), params, NUM_1);
259     };
260     nodeModifiers->getRichEditorModifier()->setRichEditorOnIMEInputComplete(
261         nativeNode, reinterpret_cast<void*>(&callback));
262     return panda::JSValueRef::Undefined(vm);
263 }
264 
ResetOnIMEInputComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue RichEditorBridge::ResetOnIMEInputComplete(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267     EcmaVM* vm = runtimeCallInfo->GetVM();
268     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
269     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
270     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
271     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
272     auto nodeModifiers = GetArkUINodeModifiers();
273     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
274     nodeModifiers->getRichEditorModifier()->resetRichEditorOnIMEInputComplete(nativeNode);
275     return panda::JSValueRef::Undefined(vm);
276 }
277 
CreateTextShadowObjectArray(EcmaVM * vm,const TextStyleResult & textStyle)278 Local<panda::ArrayRef> CreateTextShadowObjectArray(EcmaVM* vm, const TextStyleResult& textStyle)
279 {
280     auto textShadowArray = panda::ArrayRef::New(vm, textStyle.textShadows.size());
281     int32_t index = 0;
282     for (const auto& it : textStyle.textShadows) {
283         const char* keys[] = { "radius", "color", "offsetX", "offsetY" };
284         Local<JSValueRef> values[] = {  panda::NumberRef::New(vm, static_cast<double>(it.GetBlurRadius())),
285             panda::StringRef::NewFromUtf8(vm, it.GetColor().ToString().c_str()),
286             panda::NumberRef::New(vm, static_cast<double>(it.GetOffset().GetX())),
287             panda::NumberRef::New(vm, static_cast<double>(it.GetOffset().GetY())) };
288         auto textShadowObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
289         panda::ArrayRef::SetValueAt(vm, textShadowArray, index, textShadowObj);
290         index++;
291     }
292     return textShadowArray;
293 }
294 
CreateTextStyleObj(EcmaVM * vm,Local<panda::ObjectRef> & textStyleObj,const NG::RichEditorAbstractSpanResult & spanResult)295 void CreateTextStyleObj(
296     EcmaVM* vm, Local<panda::ObjectRef>& textStyleObj, const NG::RichEditorAbstractSpanResult& spanResult)
297 {
298     const char* decorationObjKeys[] = { "type", "color", "style" };
299     auto textDecoration = static_cast<int32_t>(spanResult.GetTextDecoration());
300     auto textDecorationStyle = static_cast<int32_t>(spanResult.GetTextDecorationStyle());
301     Local<JSValueRef> decorationObjValues[] = { panda::NumberRef::New(vm, textDecoration),
302         panda::StringRef::NewFromUtf8(vm, spanResult.GetColor().c_str()),
303         panda::NumberRef::New(vm, textDecorationStyle) };
304     auto decorationObj = panda::ObjectRef::NewWithNamedProperties(
305         vm, ArraySize(decorationObjKeys), decorationObjKeys, decorationObjValues);
306 
307     auto textShadowObjectArray = CreateTextShadowObjectArray(vm, spanResult.GetTextStyle());
308 
309     const char* textStyleObjKeys[] = { "fontColor", "fontFeature", "fontSize", "lineHeight", "letterSpacing",
310         "fontStyle", "fontWeight", "fontFamily", "decoration", "textShadow" };
311     Local<JSValueRef> textStyleObjValues[] = { panda::StringRef::NewFromUtf8(vm, spanResult.GetFontColor().c_str()),
312         panda::StringRef::NewFromUtf8(vm, UnParseFontFeatureSetting(spanResult.GetFontFeatures()).c_str()),
313         panda::NumberRef::New(vm, static_cast<double>(spanResult.GetFontSize())),
314         panda::NumberRef::New(vm, static_cast<double>(spanResult.GetTextStyle().lineHeight)),
315         panda::NumberRef::New(vm, static_cast<double>(spanResult.GetTextStyle().letterSpacing)),
316         panda::NumberRef::New(vm, static_cast<int32_t>(static_cast<int32_t>(spanResult.GetFontStyle()))),
317         panda::NumberRef::New(vm, static_cast<int32_t>(spanResult.GetFontWeight())),
318         panda::StringRef::NewFromUtf8(vm, spanResult.GetFontFamily().c_str()), decorationObj, textShadowObjectArray };
319     textStyleObj =
320         panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(textStyleObjKeys), textStyleObjKeys, textStyleObjValues);
321 }
322 
SetTextChangeSpanResult(EcmaVM * vm,panda::Local<panda::ObjectRef> & resultObj,const NG::RichEditorAbstractSpanResult & spanResult)323 void SetTextChangeSpanResult(
324     EcmaVM* vm, panda::Local<panda::ObjectRef>& resultObj, const NG::RichEditorAbstractSpanResult& spanResult)
325 {
326     auto textStyleObj = panda::ObjectRef::New(vm);
327     CreateTextStyleObj(vm, textStyleObj, spanResult);
328     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "value"),
329         panda::StringRef::NewFromUtf16(vm, spanResult.GetValue().c_str()));
330     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "previewText"),
331         panda::StringRef::NewFromUtf16(vm, spanResult.GetPreviewText().c_str()));
332     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "textStyle"),
333         textStyleObj);
334     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "paragraphStyle"),
335         CreateParagraphStyle(vm, spanResult.GetTextStyle()));
336 }
337 
CreateTextStyleResult(EcmaVM * vm,const TextStyleResult & textStyleResult)338 Local<panda::ObjectRef> CreateTextStyleResult(EcmaVM *vm, const TextStyleResult& textStyleResult)
339 {
340     const char* decorationObjKeys[] = { "type", "color" };
341     Local<JSValueRef> decorationObjValues[] = {
342         panda::NumberRef::New(vm, static_cast<int32_t>(textStyleResult.decorationType)),
343         panda::StringRef::NewFromUtf8(vm, textStyleResult.decorationColor.c_str())
344     };
345     auto decorationObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(decorationObjKeys),
346         decorationObjKeys, decorationObjValues);
347 
348     auto leadingMarginArray = panda::ArrayRef::New(vm);
349     panda::ArrayRef::SetValueAt(vm, leadingMarginArray, NUM_0,
350         panda::StringRef::NewFromUtf8(vm, textStyleResult.leadingMarginSize[NUM_0].c_str()));
351     panda::ArrayRef::SetValueAt(vm, leadingMarginArray, NUM_1,
352         panda::StringRef::NewFromUtf8(vm, textStyleResult.leadingMarginSize[NUM_1].c_str()));
353 
354     const char* textStyleObjKeys[] = { "fontColor", "fontFeature", "fontSize", "fontStyle",
355         "lineHeight", "letterSpacing", "fontWeight", "fontFamily", "decoration", "textAlign", "leadingMarginSize" };
356     Local<JSValueRef> textStyleObjValues[] = {
357         panda::StringRef::NewFromUtf8(vm, textStyleResult.fontColor.c_str()),
358         panda::StringRef::NewFromUtf8(vm, UnParseFontFeatureSetting(textStyleResult.fontFeature).c_str()),
359         panda::NumberRef::New(vm, textStyleResult.fontSize),
360         panda::NumberRef::New(vm, textStyleResult.fontStyle),
361         panda::NumberRef::New(vm, textStyleResult.lineHeight),
362         panda::NumberRef::New(vm, textStyleResult.letterSpacing),
363         panda::NumberRef::New(vm, textStyleResult.fontWeight),
364         panda::StringRef::NewFromUtf8(vm, textStyleResult.fontFamily.c_str()), decorationObj,
365         panda::NumberRef::New(vm, textStyleResult.textAlign), leadingMarginArray
366     };
367     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(textStyleObjKeys),
368         textStyleObjKeys, textStyleObjValues);
369 }
370 
CreateSymbolSpanStyleResult(EcmaVM * vm,const SymbolSpanStyle & symbolSpanStyle)371 Local<panda::ObjectRef> CreateSymbolSpanStyleResult(EcmaVM *vm, const SymbolSpanStyle& symbolSpanStyle)
372 {
373     const char* symbolSpanStyleObjKeys[] = { "fontColor", "fontFeature", "fontSize", "lineHeight",
374         "letterSpacing", "fontWeight", "renderingStrategy", "effectStrategy" };
375     Local<JSValueRef> symbolSpanStyleObjValues[] = {
376         panda::StringRef::NewFromUtf8(vm, symbolSpanStyle.symbolColor.c_str()),
377         panda::StringRef::NewFromUtf8(vm, UnParseFontFeatureSetting(symbolSpanStyle.fontFeature).c_str()),
378         panda::NumberRef::New(vm, symbolSpanStyle.fontSize),
379         panda::NumberRef::New(vm, symbolSpanStyle.lineHeight),
380         panda::NumberRef::New(vm, symbolSpanStyle.letterSpacing),
381         panda::NumberRef::New(vm, symbolSpanStyle.fontWeight),
382         panda::NumberRef::New(vm, symbolSpanStyle.renderingStrategy),
383         panda::NumberRef::New(vm, symbolSpanStyle.effectStrategy)
384     };
385     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(symbolSpanStyleObjKeys),
386         symbolSpanStyleObjKeys, symbolSpanStyleObjValues);
387 }
388 
CreateResourceObjectParam(EcmaVM * vm,const std::vector<ResourceObjectParams> & params)389 Local<panda::ArrayRef> CreateResourceObjectParam(EcmaVM *vm, const std::vector<ResourceObjectParams>& params)
390 {
391     auto size = static_cast<int32_t>(params.size());
392     auto valueResourceObj = panda::ArrayRef::New(vm, size);
393     for (int32_t i = 0; i < size; i++) {
394         const char* valueResourceItemKeys[] = { "type", "value" };
395         auto type = panda::StringRef::NewFromUtf8(vm, "ResourceObjectParamType::NONE");
396         if (params[i].type == ResourceObjectParamType::FLOAT) {
397             type = panda::StringRef::NewFromUtf8(vm, "ResourceObjectParamType::FLOAT");
398         } else if (params[i].type == ResourceObjectParamType::STRING) {
399             type = panda::StringRef::NewFromUtf8(vm, "ResourceObjectParamType::STRING");
400         } else if (params[i].type == ResourceObjectParamType::INT) {
401             type = panda::StringRef::NewFromUtf8(vm, "ResourceObjectParamType::INT");
402         } else {
403             type = panda::StringRef::NewFromUtf8(vm, "ResourceObjectParamType::NONE");
404         }
405         Local<JSValueRef> valueResourceItemValues[] = { type,
406             panda::StringRef::NewFromUtf8(vm, params[i].value->c_str())
407         };
408         auto valueResourceItem = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(valueResourceItemKeys),
409             valueResourceItemKeys, valueResourceItemValues);
410         panda::ArrayRef::SetValueAt(vm, valueResourceObj, i, valueResourceItem);
411     }
412     return valueResourceObj;
413 }
414 
CreateValueResource(EcmaVM * vm,const RefPtr<ResourceObject> & valueResource)415 Local<panda::ObjectRef> CreateValueResource(EcmaVM *vm, const RefPtr<ResourceObject>& valueResource)
416 {
417     const char* valueResourceKeys[] = { "bundleName", "moduleName", "id", "params", "type" };
418     Local<JSValueRef> valueResourceValues[] = {
419         panda::StringRef::NewFromUtf8(vm, valueResource->GetBundleName().c_str()),
420         panda::StringRef::NewFromUtf8(vm, valueResource->GetModuleName().c_str()),
421         panda::NumberRef::New(vm, valueResource->GetId()),
422         CreateResourceObjectParam(vm, valueResource->GetParams()),
423         panda::NumberRef::New(vm, valueResource->GetType())
424     };
425     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(valueResourceKeys),
426         valueResourceKeys, valueResourceValues);
427 }
428 
CreateImageStyleResult(EcmaVM * vm,const ImageStyleResult & imageStyleResult)429 Local<panda::ObjectRef> CreateImageStyleResult(EcmaVM *vm, const ImageStyleResult& imageStyleResult)
430 {
431     const char* layoutStyleObjKeys[] = { "borderRadius", "margin" };
432     Local<JSValueRef> layoutStyleObjValues[] = {
433         panda::StringRef::NewFromUtf8(vm, imageStyleResult.borderRadius.c_str()),
434         panda::StringRef::NewFromUtf8(vm, imageStyleResult.margin.c_str())
435     };
436     auto layoutStyleObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(layoutStyleObjKeys),
437         layoutStyleObjKeys, layoutStyleObjValues);
438 
439     auto sizeArray = panda::ArrayRef::New(vm);
440     panda::ArrayRef::SetValueAt(vm, sizeArray, NUM_0, panda::NumberRef::New(vm, imageStyleResult.size[NUM_0]));
441     panda::ArrayRef::SetValueAt(vm, sizeArray, NUM_1, panda::NumberRef::New(vm, imageStyleResult.size[NUM_1]));
442 
443     const char* imageSpanStyleObjKeys[] = { "size", "verticalAlign", "objectFit", "layoutStyle" };
444     Local<JSValueRef> imageSpanStyleObjValues[] = {
445         sizeArray, panda::NumberRef::New(vm, imageStyleResult.verticalAlign),
446         panda::NumberRef::New(vm, imageStyleResult.objectFit), layoutStyleObj
447     };
448     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(imageSpanStyleObjKeys),
449         imageSpanStyleObjKeys, imageSpanStyleObjValues);
450 }
451 
CreateSpanResultObject(EcmaVM * vm,const ResultObject & resultObject)452 Local<panda::ObjectRef> CreateSpanResultObject(EcmaVM *vm, const ResultObject& resultObject)
453 {
454     auto offsetArray = panda::ArrayRef::New(vm);
455     panda::ArrayRef::SetValueAt(vm, offsetArray, NUM_0, panda::NumberRef::New(vm, resultObject.offsetInSpan[NUM_0]));
456     panda::ArrayRef::SetValueAt(vm, offsetArray, NUM_1, panda::NumberRef::New(vm, resultObject.offsetInSpan[NUM_1]));
457     auto spanRangeArray = panda::ArrayRef::New(vm);
458     panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_0,
459         panda::NumberRef::New(vm, resultObject.spanPosition.spanRange[NUM_0]));
460     panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_1,
461         panda::NumberRef::New(vm, resultObject.spanPosition.spanRange[NUM_1]));
462     const char* spanPositionObjKeys[] = { "spanIndex", "spanRange" };
463     Local<JSValueRef> spanPositionObjValues[] = {
464         panda::NumberRef::New(vm, resultObject.spanPosition.spanIndex), spanRangeArray
465     };
466     auto spanPositionObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(spanPositionObjKeys),
467         spanPositionObjKeys, spanPositionObjValues);
468 
469     auto resultObj = panda::ObjectRef::New(vm);
470     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "offsetInSpan"), offsetArray);
471     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "spanPosition"), spanPositionObj);
472     if (resultObject.type == SelectSpanType::TYPESPAN) {
473         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "value"),
474             panda::StringRef::NewFromUtf16(vm, resultObject.valueString.c_str()));
475         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "textStyle"),
476             CreateTextStyleResult(vm, resultObject.textStyle));
477         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "paragraphStyle"),
478             CreateParagraphStyle(vm, resultObject.textStyle));
479     } else if (resultObject.type == SelectSpanType::TYPESYMBOLSPAN) {
480         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "value"),
481             panda::StringRef::NewFromUtf16(vm, resultObject.valueString.c_str()));
482         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "symbolSpanStyle"),
483             CreateSymbolSpanStyleResult(vm, resultObject.symbolSpanStyle));
484         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valueResource"),
485             CreateValueResource(vm, resultObject.valueResource));
486     } else if (resultObject.type == SelectSpanType::TYPEIMAGE) {
487         if (resultObject.valuePixelMap) {
488 #if defined (PIXEL_MAP_SUPPORTED)
489             auto jsPixmap = Framework::ConvertPixmap(resultObject.valuePixelMap);
490             if (!jsPixmap->IsUndefined()) {
491                 resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valuePixelMap"),
492                     panda::StringRef::NewFromUtf8(vm, jsPixmap->ToString().c_str()));
493             }
494 #endif
495         } else {
496             resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valueResourceStr"),
497                 panda::StringRef::NewFromUtf16(vm, resultObject.valueString.c_str()));
498         }
499         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "imageStyle"),
500             CreateImageStyleResult(vm, resultObject.imageStyle));
501     }
502 
503     return resultObj;
504 }
505 
CreatSelectEvent(EcmaVM * vm,const BaseEventInfo * info,panda::Local<panda::JSValueRef> params[])506 void CreatSelectEvent(EcmaVM *vm, const BaseEventInfo* info, panda::Local<panda::JSValueRef> params[])
507 {
508     const auto* selectInfo = TypeInfoHelper::DynamicCast<SelectionInfo>(info);
509     if (!selectInfo) {
510         TAG_LOGW(AceLogTag::ACE_RICH_TEXT, "richEditor SetOnSelect callback execute failed.");
511         return;
512     }
513     const char* keys[] = { "selection", "spans" };
514     auto selectionArray = panda::ArrayRef::New(vm, NUM_2);
515     auto selectionObjValue = selectInfo->GetSelection();
516     panda::ArrayRef::SetValueAt(vm, selectionArray, NUM_0,
517         panda::NumberRef::New(vm, selectionObjValue.selection[NUM_0]));
518     panda::ArrayRef::SetValueAt(vm, selectionArray, NUM_1,
519         panda::NumberRef::New(vm, selectionObjValue.selection[NUM_1]));
520 
521     auto spanObjectArray = panda::ArrayRef::New(vm);
522     auto idx = 0;
523     for (const ResultObject& spanObject : selectionObjValue.resultObjects) {
524         panda::ArrayRef::SetValueAt(vm, spanObjectArray, idx++, CreateSpanResultObject(vm, spanObject));
525     }
526     Local<JSValueRef> values[] = { selectionArray, spanObjectArray };
527     auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
528     params[NUM_1] = { eventObject };
529 }
530 
SetSymbolChangeSpanResult(EcmaVM * vm,panda::Local<panda::ObjectRef> & resultObj,const NG::RichEditorAbstractSpanResult & spanResult)531 void SetSymbolChangeSpanResult(
532     EcmaVM* vm, panda::Local<panda::ObjectRef>& resultObj, const NG::RichEditorAbstractSpanResult& spanResult)
533 {
534     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "symbolSpanStyle"),
535         CreateSymbolSpanStyleResult(vm, spanResult.GetSymbolSpanStyle()));
536     resultObj->Set(
537         vm, panda::StringRef::NewFromUtf8(vm, "valueResource"), CreateValueResource(vm, spanResult.GetValueResource()));
538     resultObj->Set(
539         vm, panda::StringRef::NewFromUtf8(vm, "paragraphStyle"), CreateParagraphStyle(vm, spanResult.GetTextStyle()));
540 }
541 
SetImageChangeSpanResult(EcmaVM * vm,panda::Local<panda::ObjectRef> & resultObj,const NG::RichEditorAbstractSpanResult & spanResult)542 void SetImageChangeSpanResult(
543     EcmaVM* vm, panda::Local<panda::ObjectRef>& resultObj, const NG::RichEditorAbstractSpanResult& spanResult)
544 {
545     auto valuePixelMap = spanResult.GetValuePixelMap();
546     auto returnWidth = spanResult.GetSizeWidth();
547     auto returnHeight = spanResult.GetSizeHeight();
548     if (valuePixelMap) {
549 #ifdef PIXEL_MAP_SUPPORTED
550         if (NearZero(returnWidth) || NearZero(returnHeight)) {
551             returnWidth = valuePixelMap->GetWidth();
552             returnHeight = valuePixelMap->GetHeight();
553         }
554         auto jsPixmap = Framework::ConvertPixmap(valuePixelMap);
555         if (!jsPixmap->IsUndefined()) {
556             resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valuePixelMap"),
557                 panda::StringRef::NewFromUtf8(vm, jsPixmap->ToString().c_str()));
558         }
559 #endif
560     } else {
561         resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valueResourceStr"),
562             panda::StringRef::NewFromUtf8(vm, spanResult.GetValueResourceStr().c_str()));
563     }
564     ImageStyleResult imageStyleResult;
565     imageStyleResult.size[0] = static_cast<double>(returnWidth);
566     imageStyleResult.size[1] = static_cast<double>(returnHeight);
567     imageStyleResult.verticalAlign = static_cast<int32_t>(spanResult.GetVerticalAlign());
568     imageStyleResult.objectFit = static_cast<int32_t>(spanResult.GetObjectFit());
569     imageStyleResult.borderRadius = spanResult.GetBorderRadius();
570     imageStyleResult.margin = spanResult.GetMargin();
571     resultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "imageStyle"), CreateImageStyleResult(vm, imageStyleResult));
572 }
573 
SetChangeTextSpans(EcmaVM * vm,const std::vector<NG::RichEditorAbstractSpanResult> & spanList,panda::Local<panda::ArrayRef> & jsArray)574 void SetChangeTextSpans(
575     EcmaVM* vm, const std::vector<NG::RichEditorAbstractSpanResult>& spanList, panda::Local<panda::ArrayRef>& jsArray)
576 {
577     int32_t index = 0;
578     for (const auto& it : spanList) {
579         auto spanPositionObj = panda::ObjectRef::New(vm);
580         auto spanResultObj = panda::ObjectRef::New(vm);
581         auto spanRangeArray = panda::ArrayRef::New(vm, NUM_2);
582         auto offsetInSpanArray = panda::ArrayRef::New(vm, NUM_2);
583         panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_0, panda::NumberRef::New(vm, it.GetSpanRangeStart()));
584         panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_1, panda::NumberRef::New(vm, it.GetSpanRangeEnd()));
585         spanPositionObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "spanRange"), spanRangeArray);
586         spanPositionObj->Set(
587             vm, panda::StringRef::NewFromUtf8(vm, "spanIndex"), panda::NumberRef::New(vm, it.GetSpanIndex()));
588         spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "spanPosition"), spanPositionObj);
589         panda::ArrayRef::SetValueAt(vm, offsetInSpanArray, NUM_0, panda::NumberRef::New(vm, it.OffsetInSpan()));
590         panda::ArrayRef::SetValueAt(
591             vm, offsetInSpanArray, NUM_1, panda::NumberRef::New(vm, it.OffsetInSpan() + it.GetEraseLength()));
592         spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "offsetInSpan"), offsetInSpanArray);
593         switch (it.GetType()) {
594             case NG::SpanResultType::TEXT:
595                 SetTextChangeSpanResult(vm, spanResultObj, it);
596                 break;
597             case NG::SpanResultType::IMAGE:
598                 SetImageChangeSpanResult(vm, spanResultObj, it);
599                 break;
600             case NG::SpanResultType::SYMBOL:
601                 SetSymbolChangeSpanResult(vm, spanResultObj, it);
602                 break;
603             default:
604                 break;
605         }
606         panda::ArrayRef::SetValueAt(vm, jsArray, index++, spanResultObj);
607     }
608 }
609 
CreateOnWillChange(EcmaVM * vm,const NG::RichEditorChangeValue & changeValue)610 panda::Local<panda::ObjectRef> CreateOnWillChange(EcmaVM* vm, const NG::RichEditorChangeValue& changeValue)
611 {
612     auto onWillChangeObj = panda::ObjectRef::New(vm);
613     auto rangeBeforeObj = panda::ObjectRef::New(vm);
614     const auto& rangeBefore = changeValue.GetRangeBefore();
615     rangeBeforeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "start"), panda::NumberRef::New(vm, rangeBefore.start));
616     rangeBeforeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "end"), panda::NumberRef::New(vm, rangeBefore.end));
617     onWillChangeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "rangeBefore"), rangeBeforeObj);
618     auto replacedSpansArray = panda::ArrayRef::New(vm);
619     SetChangeTextSpans(vm, changeValue.GetRichEditorReplacedSpans(), replacedSpansArray);
620     onWillChangeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "replacedSpans"), replacedSpansArray);
621     auto replacedImageSpansArray = panda::ArrayRef::New(vm);
622     SetChangeTextSpans(vm, changeValue.GetRichEditorReplacedImageSpans(), replacedImageSpansArray);
623     onWillChangeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "replacedImageSpans"), replacedImageSpansArray);
624     auto replacedSymbolSpansArray = panda::ArrayRef::New(vm);
625     SetChangeTextSpans(vm, changeValue.GetRichEditorReplacedSymbolSpans(), replacedSymbolSpansArray);
626     onWillChangeObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "replacedSymbolSpans"), replacedSymbolSpansArray);
627 
628     return onWillChangeObj;
629 }
630 
SetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)631 ArkUINativeModuleValue RichEditorBridge::SetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
632 {
633     EcmaVM* vm = runtimeCallInfo->GetVM();
634     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
635     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
636     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
637     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
638     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
639     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
640     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
641     auto nodeModifiers = GetArkUINodeModifiers();
642     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
643     if (!callbackArg->IsFunction(vm)) {
644         nodeModifiers->getRichEditorModifier()->resetRichEditorOnWillChange(nativeNode);
645         return panda::JSValueRef::Undefined(vm);
646     }
647     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
648     std::function<bool(const RichEditorChangeValue&)> callback =
649         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const RichEditorChangeValue& changeValue) {
650             panda::LocalScope pandaScope(vm);
651             panda::TryCatch trycatch(vm);
652             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
653             auto eventObject = CreateOnWillChange(vm, changeValue);
654             panda::Local<panda::JSValueRef> params[NUM_1] = { eventObject };
655             auto ret = func->Call(vm, func.ToLocal(), params, NUM_1);
656             if (ret->IsBoolean()) {
657                 return ret->ToBoolean(vm)->Value();
658             }
659             return true;
660         };
661     nodeModifiers->getRichEditorModifier()->setRichEditorOnWillChange(
662         nativeNode, reinterpret_cast<void*>(&callback));
663     return panda::JSValueRef::Undefined(vm);
664 }
665 
ResetOnWillChange(ArkUIRuntimeCallInfo * runtimeCallInfo)666 ArkUINativeModuleValue RichEditorBridge::ResetOnWillChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
667 {
668     EcmaVM* vm = runtimeCallInfo->GetVM();
669     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
670     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
671     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
672     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
673     auto nodeModifiers = GetArkUINodeModifiers();
674     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
675     nodeModifiers->getRichEditorModifier()->resetRichEditorOnWillChange(nativeNode);
676     return panda::JSValueRef::Undefined(vm);
677 }
678 
SetOnDidChange(ArkUIRuntimeCallInfo * runtimeCallInfo)679 ArkUINativeModuleValue RichEditorBridge::SetOnDidChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
680 {
681     EcmaVM* vm = runtimeCallInfo->GetVM();
682     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
683     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
684     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
685     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
686     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
687     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
688     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
689     auto nodeModifiers = GetArkUINodeModifiers();
690     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
691     if (!callbackArg->IsFunction(vm)) {
692         nodeModifiers->getRichEditorModifier()->resetRichEditorOnDidChange(nativeNode);
693         return panda::JSValueRef::Undefined(vm);
694     }
695     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
696     std::function<void(const RichEditorChangeValue&)> callback =
697         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const RichEditorChangeValue& changeValue) {
698             panda::LocalScope pandaScope(vm);
699             panda::TryCatch trycatch(vm);
700             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
701 
702             const auto& rangeBeforeValue = changeValue.GetRangeBefore();
703             const char* keysOfRangeBefore[] = { "start", "end" };
704             Local<JSValueRef> valuesOfRangeBefore[] = { panda::NumberRef::New(vm, rangeBeforeValue.start),
705                 panda::NumberRef::New(vm, rangeBeforeValue.end) };
706             auto rangeBeforeObj = panda::ObjectRef::NewWithNamedProperties(
707                 vm, ArraySize(keysOfRangeBefore), keysOfRangeBefore, valuesOfRangeBefore);
708 
709             const auto& rangeAfterValue = changeValue.GetRangeAfter();
710             const char* keysOfRangeAfter[] = { "start", "end" };
711             Local<JSValueRef> valuesOfRangeAfter[] = { panda::NumberRef::New(vm, rangeAfterValue.start),
712                 panda::NumberRef::New(vm, rangeAfterValue.end) };
713             auto rangeAftereObj = panda::ObjectRef::NewWithNamedProperties(
714                 vm, ArraySize(keysOfRangeAfter), keysOfRangeAfter, valuesOfRangeAfter);
715 
716             panda::Local<panda::JSValueRef> params[NUM_2] = { rangeBeforeObj, rangeAftereObj };
717             auto ret = func->Call(vm, func.ToLocal(), params, NUM_2);
718             if (ret->IsBoolean()) {
719                 return ret->ToBoolean(vm)->Value();
720             }
721             return true;
722         };
723     nodeModifiers->getRichEditorModifier()->setRichEditorOnDidChange(
724         nativeNode, reinterpret_cast<void*>(&callback));
725     return panda::JSValueRef::Undefined(vm);
726 }
727 
ResetOnDidChange(ArkUIRuntimeCallInfo * runtimeCallInfo)728 ArkUINativeModuleValue RichEditorBridge::ResetOnDidChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
729 {
730     EcmaVM* vm = runtimeCallInfo->GetVM();
731     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
732     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
733     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
734     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
735     auto nodeModifiers = GetArkUINodeModifiers();
736     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
737     nodeModifiers->getRichEditorModifier()->resetRichEditorOnDidChange(nativeNode);
738     return panda::JSValueRef::Undefined(vm);
739 }
740 
CreateImageStyleObj(EcmaVM * vm,Local<panda::ObjectRef> & imageStyleObj,Local<panda::ObjectRef> & spanResultObj,const NG::RichEditorAbstractSpanResult & spanResult)741 void CreateImageStyleObj(EcmaVM* vm, Local<panda::ObjectRef>& imageStyleObj, Local<panda::ObjectRef>& spanResultObj,
742     const NG::RichEditorAbstractSpanResult& spanResult)
743 {
744     auto imageSizeArray = panda::ArrayRef::New(vm, NUM_2);
745     panda::ArrayRef::SetValueAt(vm, imageSizeArray, NUM_0, panda::NumberRef::New(vm, spanResult.GetSizeWidth()));
746     panda::ArrayRef::SetValueAt(vm, imageSizeArray, NUM_1, panda::NumberRef::New(vm, spanResult.GetSizeHeight()));
747 
748     imageStyleObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "size"), imageSizeArray);
749     imageStyleObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "verticalAlign"),
750         panda::NumberRef::New(vm, static_cast<int32_t>(spanResult.GetVerticalAlign())));
751     imageStyleObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "objectFit"),
752         panda::NumberRef::New(vm, static_cast<int32_t>(spanResult.GetObjectFit())));
753     if (spanResult.GetValuePixelMap()) {
754 #ifdef PIXEL_MAP_SUPPORTED
755         auto jsPixmap = Framework::ConvertPixmap(spanResult.GetValuePixelMap());
756         if (!jsPixmap->IsUndefined()) {
757             spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valuePixelMap"),
758                 panda::StringRef::NewFromUtf8(vm, jsPixmap->ToString().c_str()));
759         }
760 #endif
761     } else {
762         spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valueResourceStr"),
763             panda::StringRef::NewFromUtf8(vm, spanResult.GetValueResourceStr().c_str()));
764     }
765 }
766 
SetDeleteSpan(EcmaVM * vm,panda::Local<panda::ObjectRef> & spanResultObj,const NG::RichEditorAbstractSpanResult & spanResult)767 void SetDeleteSpan(
768     EcmaVM* vm, panda::Local<panda::ObjectRef>& spanResultObj, const NG::RichEditorAbstractSpanResult& spanResult)
769 {
770     CHECK_NULL_VOID(vm);
771     switch (spanResult.GetType()) {
772         case NG::SpanResultType::TEXT: {
773             SetTextChangeSpanResult(vm, spanResultObj, spanResult);
774             break;
775         }
776         case NG::SpanResultType::IMAGE: {
777             auto imageStyleObj = panda::ObjectRef::New(vm);
778             CreateImageStyleObj(vm, imageStyleObj, spanResultObj, spanResult);
779             const char* keys[] = { "borderRadius", "margin" };
780             Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, spanResult.GetBorderRadius().c_str()),
781                 panda::StringRef::NewFromUtf8(vm, spanResult.GetMargin().c_str()) };
782             auto layoutStyleObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
783             imageStyleObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "layoutStyle"), layoutStyleObj);
784             spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "imageStyle"), imageStyleObj);
785             break;
786         }
787         case NG::SpanResultType::SYMBOL: {
788             spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "value"),
789                 panda::StringRef::NewFromUtf8(vm, spanResult.GetValueString().c_str()));
790             spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "symbolSpanStyle"),
791                 CreateSymbolSpanStyleResult(vm, spanResult.GetSymbolSpanStyle()));
792             spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "valueResource"),
793                 CreateValueResource(vm, spanResult.GetValueResource()));
794             break;
795         }
796         default:
797             break;
798     }
799 }
800 
CreateDeleteSpans(EcmaVM * vm,const NG::RichEditorDeleteValue & deleteValue)801 panda::Local<panda::ObjectRef> CreateDeleteSpans(EcmaVM* vm, const NG::RichEditorDeleteValue& deleteValue)
802 {
803     int32_t index = 0;
804     auto list = deleteValue.GetRichEditorDeleteSpans();
805     auto richEditorDeleteSpans = panda::ArrayRef::New(vm, list.size());
806     for (const auto& it : list) {
807         auto spanPositionObj = panda::ObjectRef::New(vm);
808         auto spanResultObj = panda::ObjectRef::New(vm);
809         auto spanRangeArray = panda::ArrayRef::New(vm, NUM_2);
810         auto offsetInSpanArray = panda::ArrayRef::New(vm, NUM_2);
811         panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_0, panda::NumberRef::New(vm, it.GetSpanRangeStart()));
812         panda::ArrayRef::SetValueAt(vm, spanRangeArray, NUM_1, panda::NumberRef::New(vm, it.GetSpanRangeEnd()));
813         spanPositionObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "spanRange"), spanRangeArray);
814         spanPositionObj->Set(
815             vm, panda::StringRef::NewFromUtf8(vm, "spanIndex"), panda::NumberRef::New(vm, it.GetSpanIndex()));
816         spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "spanPosition"), spanPositionObj);
817         panda::ArrayRef::SetValueAt(vm, offsetInSpanArray, NUM_0, panda::NumberRef::New(vm, it.OffsetInSpan()));
818         panda::ArrayRef::SetValueAt(
819             vm, offsetInSpanArray, NUM_1, panda::NumberRef::New(vm, it.OffsetInSpan() + it.GetEraseLength()));
820         spanResultObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "offsetInSpan"), offsetInSpanArray);
821         SetDeleteSpan(vm, spanResultObj, it);
822         panda::ArrayRef::SetValueAt(vm, richEditorDeleteSpans, index++, spanResultObj);
823     }
824     return richEditorDeleteSpans;
825 }
826 
SetAboutToDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)827 ArkUINativeModuleValue RichEditorBridge::SetAboutToDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
828 {
829     EcmaVM* vm = runtimeCallInfo->GetVM();
830     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
831     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
832     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
833     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
834     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
835     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
836     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
837     auto nodeModifiers = GetArkUINodeModifiers();
838     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
839     if (!callbackArg->IsFunction(vm)) {
840         nodeModifiers->getRichEditorModifier()->resetRichEditorAboutToDelete(nativeNode);
841         return panda::JSValueRef::Undefined(vm);
842     }
843     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
844     std::function<bool(const RichEditorDeleteValue&)> callback =
845         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const RichEditorDeleteValue& deleteValue) {
846             panda::LocalScope pandaScope(vm);
847             panda::TryCatch trycatch(vm);
848             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
849             auto deleteSpansObj = CreateDeleteSpans(vm, deleteValue);
850             const char* keys[] = { "offset", "direction", "length", "richEditorDeleteSpans" };
851             Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.GetOffset()),
852                 panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.GetRichEditorDeleteDirection())),
853                 panda::NumberRef::New(vm, deleteValue.GetLength()), deleteSpansObj };
854             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
855             panda::Local<panda::JSValueRef> params[NUM_1] = { eventObject };
856             auto ret = func->Call(vm, func.ToLocal(), params, NUM_1);
857             if (ret->IsBoolean()) {
858                 return ret->ToBoolean(vm)->Value();
859             }
860             return true;
861         };
862     nodeModifiers->getRichEditorModifier()->setRichEditorAboutToDelete(
863         nativeNode, reinterpret_cast<void*>(&callback));
864     return panda::JSValueRef::Undefined(vm);
865 }
866 
ResetAboutToDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)867 ArkUINativeModuleValue RichEditorBridge::ResetAboutToDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
868 {
869     EcmaVM* vm = runtimeCallInfo->GetVM();
870     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
871     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
872     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
873     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
874     auto nodeModifiers = GetArkUINodeModifiers();
875     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
876     nodeModifiers->getRichEditorModifier()->resetRichEditorAboutToDelete(nativeNode);
877     return panda::JSValueRef::Undefined(vm);
878 }
879 
ParseFont(EcmaVM * vm,const panda::Local<panda::ObjectRef> & fontObject,Font & font)880 void ParseFont(EcmaVM* vm, const panda::Local<panda::ObjectRef>& fontObject, Font& font)
881 {
882     if (fontObject->IsUndefined()) {
883         return;
884     }
885     Local<JSValueRef> fontSize = fontObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "size"));
886     CalcDimension size;
887     if (!fontSize->IsNull() && ArkTSUtils::ParseJsDimensionFpNG(vm, fontSize, size) && !size.IsNegative() &&
888         size.Unit() != DimensionUnit::PERCENT) {
889         font.fontSize = size;
890     } else if (size.IsNegative() || size.Unit() == DimensionUnit::PERCENT) {
891         auto pipeline = PipelineBase::GetCurrentContext();
892         CHECK_NULL_VOID(pipeline);
893         auto theme = pipeline->GetTheme<TextTheme>();
894         CHECK_NULL_VOID(theme);
895         size = theme->GetTextStyle().GetFontSize();
896         font.fontSize = size;
897     }
898     Local<JSValueRef> fontStyle = fontObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "style"));
899     if (fontStyle->IsNumber()) {
900         font.fontStyle = static_cast<Ace::FontStyle>(fontStyle->Uint32Value(vm));
901     }
902     Local<JSValueRef> fontWeight = fontObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "weight"));
903     if (!fontWeight->IsNull()) {
904         std::string weight;
905         if (fontWeight->IsNumber()) {
906             weight = std::to_string(fontWeight->Int32Value(vm));
907         } else {
908             ArkTSUtils::ParseJsString(vm, fontWeight, weight);
909         }
910         font.fontWeight = OHOS::Ace::Framework::ConvertStrToFontWeight(weight);
911     }
912     Local<JSValueRef> fontFamily = fontObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "family"));
913     if (!fontFamily->IsNull()) {
914         std::vector<std::string> fontFamilies;
915         if (ArkTSUtils::ParseJsFontFamilies(vm, fontFamily, fontFamilies)) {
916             font.fontFamilies = fontFamilies;
917         }
918     }
919 }
920 
PushDimensionVector(const std::optional<Dimension> & valueDim,std::vector<double> & dimensions)921 void PushDimensionVector(const std::optional<Dimension>& valueDim, std::vector<double>& dimensions)
922 {
923     dimensions.push_back(static_cast<double>(valueDim.has_value()));
924     if (valueDim.has_value()) {
925         dimensions.push_back(valueDim.value().Value());
926         dimensions.push_back(static_cast<double>(valueDim.value().Unit()));
927     } else {
928         dimensions.push_back(NUM_0);
929         dimensions.push_back(NUM_0);
930     }
931 }
932 
ParseColorResourceId(const EcmaVM * vm,const Local<JSValueRef> & colorVal)933 std::optional<uint32_t> ParseColorResourceId(const EcmaVM* vm, const Local<JSValueRef>& colorVal)
934 {
935     if (!colorVal->IsObject(vm)) {
936         return std::nullopt;
937     }
938     auto colorObj = colorVal->ToObject(vm);
939     ArkTSUtils::CompleteResourceObject(vm, colorObj);
940     Local<JSValueRef> resIdArg = colorObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "id"));
941     if (!resIdArg->IsNumber()) {
942         return std::nullopt;
943     }
944     uint32_t typeValue = 0;
945     auto typeArg = colorObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "type"));
946     if (typeArg->IsNumber()) {
947         typeValue = typeArg->Uint32Value(vm);
948     }
949     if (typeValue != static_cast<uint32_t>(OHOS::Ace::NG::ResourceType::COLOR)) {
950         return std::nullopt;
951     }
952     return resIdArg->ToNumber(vm)->Value();
953 }
954 
ParsePlaceholderStyle(EcmaVM * vm,const Local<JSValueRef> & styleArg,PlaceholderOptions & options,std::optional<Color> & fontColorOpt,std::optional<uint32_t> & colorResourceIdOpt)955 void ParsePlaceholderStyle(EcmaVM* vm, const Local<JSValueRef>& styleArg, PlaceholderOptions& options,
956     std::optional<Color>& fontColorOpt, std::optional<uint32_t>& colorResourceIdOpt)
957 {
958     Font font;
959     if (styleArg->IsObject(vm)) {
960         auto styleObj = styleArg->ToObject(vm);
961         auto fontArg = styleObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "font"));
962         if (fontArg->IsObject(vm)) {
963             auto fontObj = fontArg->ToObject(vm);
964             ParseFont(vm, fontObj, font);
965         }
966         auto fontColorArg = styleObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "fontColor"));
967         Color fontColorParsed;
968         if (!fontColorArg->IsNull() && ArkTSUtils::ParseJsColor(vm, fontColorArg, fontColorParsed)) {
969             fontColorOpt = fontColorParsed;
970             colorResourceIdOpt = ParseColorResourceId(vm, fontColorArg);
971         }
972     }
973     auto pipeline = PipelineBase::GetCurrentContext();
974     CHECK_NULL_VOID(pipeline);
975     auto textTheme = pipeline->GetTheme<TextTheme>();
976     TextStyle textStyle = textTheme ? textTheme->GetTextStyle() : TextStyle();
977     options.fontSize = font.fontSize.value_or(textStyle.GetFontSize());
978     options.fontFamilies = !font.fontFamilies.empty() ? font.fontFamilies : textStyle.GetFontFamilies();
979     options.fontWeight = font.fontWeight.value_or(textStyle.GetFontWeight());
980     options.fontStyle = font.fontStyle.value_or(textStyle.GetFontStyle());
981     if (!fontColorOpt.has_value()) {
982         Color fontColor;
983         auto richEditorTheme = pipeline->GetTheme<OHOS::Ace::NG::RichEditorTheme>();
984         options.fontColor = richEditorTheme ? richEditorTheme->GetPlaceholderColor() : fontColor;
985     }
986 }
987 
SetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)988 ArkUINativeModuleValue RichEditorBridge::SetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
989 {
990     EcmaVM* vm = runtimeCallInfo->GetVM();
991     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
992     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
993     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
994     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_2);
995     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
996     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
997     PlaceholderOptions options;
998     std::optional<Color> fontColor = std::nullopt;
999     std::optional<uint32_t> colorResourceId = std::nullopt;
1000     std::string placeholderValue;
1001     ArkTSUtils::ParseJsString(vm, valueArg, placeholderValue);
1002     ParsePlaceholderStyle(vm, styleArg, options, fontColor, colorResourceId);
1003     colorResourceId = -1;
1004     std::vector<ArkUI_CharPtr> stringParameters;
1005     stringParameters.push_back(placeholderValue.c_str());
1006     if (!options.fontFamilies.empty()) {
1007         for (size_t index = 0; index < options.fontFamilies.size(); index++) {
1008             stringParameters.push_back(options.fontFamilies[index].c_str());
1009         }
1010     }
1011     std::vector<double> valuesVector;
1012     valuesVector.push_back(static_cast<double>(options.fontWeight.has_value()));
1013     valuesVector.push_back(options.fontWeight.has_value() ? static_cast<double>(options.fontWeight.value()) : 0.0);
1014     valuesVector.push_back(static_cast<double>(options.fontStyle.has_value()));
1015     valuesVector.push_back(options.fontStyle.has_value() ? static_cast<double>(options.fontStyle.value()) : 0.0);
1016     valuesVector.push_back(static_cast<double>(fontColor.has_value() || options.fontColor.has_value()));
1017     auto optionColor = static_cast<double>(options.fontColor.has_value() ? options.fontColor.value().GetValue() : 0.0);
1018     valuesVector.push_back(fontColor.has_value() ? static_cast<double>(fontColor.value().GetValue()) : optionColor);
1019     valuesVector.push_back(static_cast<double>(colorResourceId.has_value()));
1020     valuesVector.push_back(colorResourceId.has_value() ? static_cast<double>(colorResourceId.value()) : 0.0);
1021     PushDimensionVector(options.fontSize, valuesVector);
1022     auto nodeModifiers = GetArkUINodeModifiers();
1023     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1024     nodeModifiers->getRichEditorModifier()->setRichEditorPlaceholder(
1025         nativeNode, stringParameters.data(), stringParameters.size(), valuesVector.data(), valuesVector.size());
1026     return panda::JSValueRef::Undefined(vm);
1027 }
1028 
ResetPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)1029 ArkUINativeModuleValue RichEditorBridge::ResetPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
1030 {
1031     EcmaVM* vm = runtimeCallInfo->GetVM();
1032     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1033     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1034     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1035     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1036     auto nodeModifiers = GetArkUINodeModifiers();
1037     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1038     nodeModifiers->getRichEditorModifier()->resetRichEditorPlaceholder(nativeNode);
1039     return panda::JSValueRef::Undefined(vm);
1040 }
1041 
SetCopyOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1042 ArkUINativeModuleValue RichEditorBridge::SetCopyOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1043 {
1044     EcmaVM* vm = runtimeCallInfo->GetVM();
1045     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1046     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1047     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1048     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     uint32_t CopyOptionsValue = static_cast<uint32_t>(CopyOptions::Distributed);
1051     auto nodeModifiers = GetArkUINodeModifiers();
1052     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1053     if (secondArg->IsNumber()) {
1054         CopyOptionsValue = secondArg->Uint32Value(vm);
1055         nodeModifiers->getRichEditorModifier()->setRichEditorCopyOptions(nativeNode, CopyOptionsValue);
1056     } else {
1057         nodeModifiers->getRichEditorModifier()->resetRichEditorCopyOptions(nativeNode);
1058     }
1059     return panda::JSValueRef::Undefined(vm);
1060 }
1061 
ResetCopyOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1062 ArkUINativeModuleValue RichEditorBridge::ResetCopyOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1063 {
1064     EcmaVM* vm = runtimeCallInfo->GetVM();
1065     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1066     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1067     auto nodeModifiers = GetArkUINodeModifiers();
1068     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1069     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1070     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1071     nodeModifiers->getRichEditorModifier()->resetRichEditorCopyOptions(nativeNode);
1072     return panda::JSValueRef::Undefined(vm);
1073 }
1074 
SetOnSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1075 ArkUINativeModuleValue RichEditorBridge::SetOnSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1076 {
1077     EcmaVM *vm = runtimeCallInfo->GetVM();
1078     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1079     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1080     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1081     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1082     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1083     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1084     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1085     auto nodeModifiers = GetArkUINodeModifiers();
1086     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1087     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1088         nodeModifiers->getRichEditorModifier()->resetRichEditorOnSelectionChange(nativeNode);
1089         return panda::JSValueRef::Undefined(vm);
1090     }
1091     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1092     std::function<void(const BaseEventInfo* info)> callback =
1093         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1094         panda::LocalScope pandaScope(vm);
1095         panda::TryCatch trycatch(vm);
1096         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1097         const auto* changeInfo = TypeInfoHelper::DynamicCast<SelectionRangeInfo>(info);
1098         if (!changeInfo) {
1099             TAG_LOGW(AceLogTag::ACE_RICH_TEXT, "richEditor SetOnSelectionChange callback execute failed.");
1100             return;
1101         }
1102         const char* keys[] = { "start", "end" };
1103         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, changeInfo->start_),
1104             panda::NumberRef::New(vm, changeInfo->end_) };
1105         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1106         panda::Local<panda::JSValueRef> params[NUM_1] = { eventObject };
1107         func->Call(vm, func.ToLocal(), params, NUM_1);
1108     };
1109     nodeModifiers->getRichEditorModifier()->setRichEditorOnSelectionChange(
1110         nativeNode, reinterpret_cast<void*>(&callback));
1111     return panda::JSValueRef::Undefined(vm);
1112 }
1113 
ResetOnSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1114 ArkUINativeModuleValue RichEditorBridge::ResetOnSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1115 {
1116     EcmaVM* vm = runtimeCallInfo->GetVM();
1117     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1118     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1119     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1120     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1121     auto nodeModifiers = GetArkUINodeModifiers();
1122     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1123     nodeModifiers->getRichEditorModifier()->resetRichEditorOnSelectionChange(nativeNode);
1124     return panda::JSValueRef::Undefined(vm);
1125 }
1126 
SetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1127 ArkUINativeModuleValue RichEditorBridge::SetCaretColor(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     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1134     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1135     auto nodeModifiers = GetArkUINodeModifiers();
1136     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1137     Color color;
1138     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1139         nodeModifiers->getRichEditorModifier()->resetRichEditorCaretColor(nativeNode);
1140     } else {
1141         nodeModifiers->getRichEditorModifier()->setRichEditorCaretColor(nativeNode, color.GetValue());
1142     }
1143     return panda::JSValueRef::Undefined(vm);
1144 }
1145 
ResetCaretColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1146 ArkUINativeModuleValue RichEditorBridge::ResetCaretColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1147 {
1148     EcmaVM* vm = runtimeCallInfo->GetVM();
1149     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1150     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1151     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1152     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1153     auto nodeModifiers = GetArkUINodeModifiers();
1154     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1155     nodeModifiers->getRichEditorModifier()->resetRichEditorCaretColor(nativeNode);
1156     return panda::JSValueRef::Undefined(vm);
1157 }
1158 
SetOnSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)1159 ArkUINativeModuleValue RichEditorBridge::SetOnSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1160 {
1161     EcmaVM *vm = runtimeCallInfo->GetVM();
1162     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1163     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1164     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1165     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1166     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1167     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1168     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1169     auto nodeModifiers = GetArkUINodeModifiers();
1170     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1171     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1172         nodeModifiers->getRichEditorModifier()->resetRichEditorOnSelect(nativeNode);
1173         return panda::JSValueRef::Undefined(vm);
1174     }
1175     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1176     std::function<void(const BaseEventInfo* info)> callback =
1177         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const BaseEventInfo* info) {
1178         panda::LocalScope pandaScope(vm);
1179         panda::TryCatch trycatch(vm);
1180         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1181         panda::Local<panda::JSValueRef> params[NUM_1];
1182         CreatSelectEvent(vm, info, params);
1183         func->Call(vm, func.ToLocal(), params, NUM_1);
1184     };
1185     nodeModifiers->getRichEditorModifier()->setRichEditorOnSelect(
1186         nativeNode, reinterpret_cast<void*>(&callback));
1187     return panda::JSValueRef::Undefined(vm);
1188 }
1189 
ResetOnSelect(ArkUIRuntimeCallInfo * runtimeCallInfo)1190 ArkUINativeModuleValue RichEditorBridge::ResetOnSelect(ArkUIRuntimeCallInfo* runtimeCallInfo)
1191 {
1192     EcmaVM* vm = runtimeCallInfo->GetVM();
1193     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1194     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1195     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1196     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1197     auto nodeModifiers = GetArkUINodeModifiers();
1198     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1199     nodeModifiers->getRichEditorModifier()->resetRichEditorOnSelect(nativeNode);
1200     return panda::JSValueRef::Undefined(vm);
1201 }
1202 
SetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1203 ArkUINativeModuleValue RichEditorBridge::SetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1204 {
1205     EcmaVM *vm = runtimeCallInfo->GetVM();
1206     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1207     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1208     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1209     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1210     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1211     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1212     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1213     auto nodeModifiers = GetArkUINodeModifiers();
1214     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1215     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1216         nodeModifiers->getRichEditorModifier()->resetRichEditorOnSubmit(nativeNode);
1217         return panda::JSValueRef::Undefined(vm);
1218     }
1219     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1220     std::function<void(int32_t, NG::TextFieldCommonEvent&)> callback = [vm, frameNode,
1221         func = panda::CopyableGlobal(vm, func)](int32_t key, NG::TextFieldCommonEvent& event) {
1222         panda::LocalScope pandaScope(vm);
1223         panda::TryCatch trycatch(vm);
1224         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1225         const char* keys[] = { "text", "keepEditableState" };
1226         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf16(vm, event.GetText().c_str()),
1227             panda::FunctionRef::New(vm, Framework::JSRichEditor::JsKeepEditableState) };
1228         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1229         eventObject->SetNativePointerFieldCount(vm, NUM_1);
1230         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
1231         panda::Local<panda::JSValueRef> params[NUM_2] = {
1232             panda::IntegerRef::New(vm, key), eventObject };
1233         func->Call(vm, func.ToLocal(), params, NUM_2);
1234     };
1235     nodeModifiers->getRichEditorModifier()->setRichEditorOnSubmit(
1236         nativeNode, reinterpret_cast<void*>(&callback));
1237     return panda::JSValueRef::Undefined(vm);
1238 }
1239 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1240 ArkUINativeModuleValue RichEditorBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1241 {
1242     EcmaVM* vm = runtimeCallInfo->GetVM();
1243     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1244     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1245     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1246     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1247     auto nodeModifiers = GetArkUINodeModifiers();
1248     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1249     nodeModifiers->getRichEditorModifier()->resetRichEditorOnSubmit(nativeNode);
1250     return panda::JSValueRef::Undefined(vm);
1251 }
1252 
SetAboutToIMEInput(ArkUIRuntimeCallInfo * runtimeCallInfo)1253 ArkUINativeModuleValue RichEditorBridge::SetAboutToIMEInput(ArkUIRuntimeCallInfo* runtimeCallInfo)
1254 {
1255     EcmaVM *vm = runtimeCallInfo->GetVM();
1256     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1257     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1258     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1259     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1260     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1261     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1262     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1263     auto nodeModifiers = GetArkUINodeModifiers();
1264     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1265     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1266         nodeModifiers->getRichEditorModifier()->resetRichEditorAboutToIMEInput(nativeNode);
1267         return panda::JSValueRef::Undefined(vm);
1268     }
1269     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1270     std::function<bool(const RichEditorInsertValue&)> callback =
1271         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](const RichEditorInsertValue& insertValue) {
1272         panda::LocalScope pandaScope(vm);
1273         panda::TryCatch trycatch(vm);
1274         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1275         const char* keys[] = { "insertOffset", "insertValue", "previewText" };
1276         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.GetInsertOffset()),
1277             panda::StringRef::NewFromUtf16(vm, insertValue.GetInsertValue().c_str()),
1278             panda::StringRef::NewFromUtf16(vm, insertValue.GetPreviewText().c_str()) };
1279         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1280         panda::Local<panda::JSValueRef> params[NUM_1] = { eventObject };
1281         auto ret = func->Call(vm, func.ToLocal(), params, NUM_1);
1282         if (ret->IsBoolean()) {
1283             return ret->ToBoolean(vm)->Value();
1284         }
1285         return true;
1286     };
1287     nodeModifiers->getRichEditorModifier()->setRichEditorAboutToIMEInput(
1288         nativeNode, reinterpret_cast<void*>(&callback));
1289     return panda::JSValueRef::Undefined(vm);
1290 }
1291 
ResetAboutToIMEInput(ArkUIRuntimeCallInfo * runtimeCallInfo)1292 ArkUINativeModuleValue RichEditorBridge::ResetAboutToIMEInput(ArkUIRuntimeCallInfo* runtimeCallInfo)
1293 {
1294     EcmaVM* vm = runtimeCallInfo->GetVM();
1295     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1296     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1297     auto nodeModifiers = GetArkUINodeModifiers();
1298     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1299     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1300     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1301     nodeModifiers->getRichEditorModifier()->resetRichEditorAboutToIMEInput(nativeNode);
1302     return panda::JSValueRef::Undefined(vm);
1303 }
1304 
SetOnReady(ArkUIRuntimeCallInfo * runtimeCallInfo)1305 ArkUINativeModuleValue RichEditorBridge::SetOnReady(ArkUIRuntimeCallInfo* runtimeCallInfo)
1306 {
1307     EcmaVM* vm = runtimeCallInfo->GetVM();
1308     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1309     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1310     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1311     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1312     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1313     auto nodeModifiers = GetArkUINodeModifiers();
1314     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1315     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1316         nodeModifiers->getRichEditorModifier()->resetOnReady(nativeNode);
1317         return panda::JSValueRef::Undefined(vm);
1318     }
1319     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1320     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1321     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1322     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1323         panda::LocalScope pandaScope(vm);
1324         panda::TryCatch trycatch(vm);
1325         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1326         func->Call(vm, func.ToLocal(), nullptr, NUM_0);
1327     };
1328     nodeModifiers->getRichEditorModifier()->setOnReady(nativeNode, reinterpret_cast<void*>(&callback));
1329     return panda::JSValueRef::Undefined(vm);
1330 }
1331 
ResetOnReady(ArkUIRuntimeCallInfo * runtimeCallInfo)1332 ArkUINativeModuleValue RichEditorBridge::ResetOnReady(ArkUIRuntimeCallInfo* runtimeCallInfo)
1333 {
1334     EcmaVM* vm = runtimeCallInfo->GetVM();
1335     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1336     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1337     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1338     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1339     auto nodeModifiers = GetArkUINodeModifiers();
1340     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1341     nodeModifiers->getRichEditorModifier()->resetOnReady(nativeNode);
1342     return panda::JSValueRef::Undefined(vm);
1343 }
1344 
SetOnDeleteComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)1345 ArkUINativeModuleValue RichEditorBridge::SetOnDeleteComplete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1346 {
1347     EcmaVM* vm = runtimeCallInfo->GetVM();
1348     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1349     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1350     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1351     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1352     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1353     auto nodeModifiers = GetArkUINodeModifiers();
1354     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1355     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1356         nodeModifiers->getRichEditorModifier()->resetOnDeleteComplete(nativeNode);
1357         return panda::JSValueRef::Undefined(vm);
1358     }
1359     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1360     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1361     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1362     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1363         panda::LocalScope pandaScope(vm);
1364         panda::TryCatch trycatch(vm);
1365         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1366         func->Call(vm, func.ToLocal(), nullptr, NUM_0);
1367     };
1368     nodeModifiers->getRichEditorModifier()->setOnDeleteComplete(
1369         nativeNode, reinterpret_cast<void*>(&callback));
1370     return panda::JSValueRef::Undefined(vm);
1371 }
1372 
ResetOnDeleteComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)1373 ArkUINativeModuleValue RichEditorBridge::ResetOnDeleteComplete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1374 {
1375     EcmaVM* vm = runtimeCallInfo->GetVM();
1376     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1377     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1378     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1379     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1380     auto nodeModifiers = GetArkUINodeModifiers();
1381     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1382     nodeModifiers->getRichEditorModifier()->resetOnDeleteComplete(nativeNode);
1383     return panda::JSValueRef::Undefined(vm);
1384 }
1385 
SetOnEditingChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1386 ArkUINativeModuleValue RichEditorBridge::SetOnEditingChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1387 {
1388     EcmaVM* vm = runtimeCallInfo->GetVM();
1389     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1390     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1391     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1392     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1393     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1394     auto nodeModifiers = GetArkUINodeModifiers();
1395     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1396     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1397         nodeModifiers->getRichEditorModifier()->resetOnEditingChange(nativeNode);
1398         return panda::JSValueRef::Undefined(vm);
1399     }
1400     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1401     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1402     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1403     std::function<void(bool)> callback = [vm, frameNode,
1404         func = panda::CopyableGlobal(vm, func)](bool isInEditStatus) {
1405         panda::LocalScope pandaScope(vm);
1406         panda::TryCatch trycatch(vm);
1407         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1408         panda::Local<panda::JSValueRef> params[NUM_1] = {
1409             panda::BooleanRef::New(vm, isInEditStatus) };
1410         func->Call(vm, func.ToLocal(), params, NUM_1);
1411     };
1412     nodeModifiers->getRichEditorModifier()->setOnEditingChange(
1413         nativeNode, reinterpret_cast<void*>(&callback));
1414     return panda::JSValueRef::Undefined(vm);
1415 }
1416 
ResetOnEditingChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1417 ArkUINativeModuleValue RichEditorBridge::ResetOnEditingChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1418 {
1419     EcmaVM* vm = runtimeCallInfo->GetVM();
1420     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1421     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1422     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1424     auto nodeModifiers = GetArkUINodeModifiers();
1425     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1426     nodeModifiers->getRichEditorModifier()->resetOnEditingChange(nativeNode);
1427     return panda::JSValueRef::Undefined(vm);
1428 }
1429 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1430 ArkUINativeModuleValue RichEditorBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1431 {
1432     EcmaVM* vm = runtimeCallInfo->GetVM();
1433     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1434     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1435     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1436     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1437     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1438     Color color;
1439     auto nodeModifiers = GetArkUINodeModifiers();
1440     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1441     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
1442         nodeModifiers->getRichEditorModifier()->resetRichEditorSelectedBackgroundColor(nativeNode);
1443     } else {
1444         nodeModifiers->getRichEditorModifier()->setRichEditorSelectedBackgroundColor(
1445             nativeNode, color.GetValue());
1446     }
1447     return panda::JSValueRef::Undefined(vm);
1448 }
1449 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)1450 ArkUINativeModuleValue RichEditorBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
1451 {
1452     EcmaVM* vm = runtimeCallInfo->GetVM();
1453     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1454     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1455     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1456     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1457     auto nodeModifiers = GetArkUINodeModifiers();
1458     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1459     nodeModifiers->getRichEditorModifier()->resetRichEditorSelectedBackgroundColor(nativeNode);
1460     return panda::JSValueRef::Undefined(vm);
1461 }
1462 
CreateCommonEvent(EcmaVM * vm,TextCommonEvent & event,panda::Local<panda::JSValueRef> params[])1463 void CreateCommonEvent(EcmaVM *vm, TextCommonEvent& event, panda::Local<panda::JSValueRef> params[])
1464 {
1465     auto eventObject = panda::ObjectRef::New(vm);
1466     eventObject->SetNativePointerFieldCount(vm, NUM_1);
1467     eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
1468         panda::FunctionRef::New(vm, Framework::JsPreventDefault));
1469     eventObject->SetNativePointerField(vm, NUM_0, static_cast<void*>(&event));
1470     params[NUM_1] = { eventObject };
1471 }
1472 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1473 ArkUINativeModuleValue RichEditorBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1474 {
1475     EcmaVM *vm = runtimeCallInfo->GetVM();
1476     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1477     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1478     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1479     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1480     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1481     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1482     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1483     auto nodeModifiers = GetArkUINodeModifiers();
1484     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1485     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1486         nodeModifiers->getRichEditorModifier()->resetRichEditorOnPaste(nativeNode);
1487         return panda::JSValueRef::Undefined(vm);
1488     }
1489     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1490     std::function<void(TextCommonEvent&)> callback = [vm, frameNode,
1491         func = panda::CopyableGlobal(vm, func)](TextCommonEvent& event) {
1492         panda::LocalScope pandaScope(vm);
1493         panda::TryCatch trycatch(vm);
1494         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1495         panda::Local<panda::JSValueRef> params[NUM_1];
1496         CreateCommonEvent(vm, event, params);
1497         func->Call(vm, func.ToLocal(), params, NUM_1);
1498     };
1499     nodeModifiers->getRichEditorModifier()->setRichEditorOnPaste(
1500         nativeNode, reinterpret_cast<void*>(&callback));
1501     return panda::JSValueRef::Undefined(vm);
1502 }
1503 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1504 ArkUINativeModuleValue RichEditorBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1505 {
1506     EcmaVM* vm = runtimeCallInfo->GetVM();
1507     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1508     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1509     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1510     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1511     auto nodeModifiers = GetArkUINodeModifiers();
1512     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1513     nodeModifiers->getRichEditorModifier()->resetRichEditorOnPaste(nativeNode);
1514     return panda::JSValueRef::Undefined(vm);
1515 }
1516 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1517 ArkUINativeModuleValue RichEditorBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1518 {
1519     EcmaVM *vm = runtimeCallInfo->GetVM();
1520     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1521     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1522     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1523     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1524     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1525     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1526     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1527     auto nodeModifiers = GetArkUINodeModifiers();
1528     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1529     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1530         nodeModifiers->getRichEditorModifier()->resetRichEditorOnCut(nativeNode);
1531         return panda::JSValueRef::Undefined(vm);
1532     }
1533     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1534     std::function<void(TextCommonEvent&)> callback = [vm, frameNode,
1535         func = panda::CopyableGlobal(vm, func)](TextCommonEvent& event) {
1536         panda::LocalScope pandaScope(vm);
1537         panda::TryCatch trycatch(vm);
1538         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1539         panda::Local<panda::JSValueRef> params[NUM_1];
1540         CreateCommonEvent(vm, event, params);
1541         func->Call(vm, func.ToLocal(), params, NUM_1);
1542     };
1543     nodeModifiers->getRichEditorModifier()->setRichEditorOnCut(
1544         nativeNode, reinterpret_cast<void*>(&callback));
1545     return panda::JSValueRef::Undefined(vm);
1546 }
1547 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1548 ArkUINativeModuleValue RichEditorBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1549 {
1550     EcmaVM* vm = runtimeCallInfo->GetVM();
1551     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1552     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1553     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1554     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1555     auto nodeModifiers = GetArkUINodeModifiers();
1556     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1557     nodeModifiers->getRichEditorModifier()->resetRichEditorOnCut(nativeNode);
1558     return panda::JSValueRef::Undefined(vm);
1559 }
1560 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1561 ArkUINativeModuleValue RichEditorBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1562 {
1563     EcmaVM *vm = runtimeCallInfo->GetVM();
1564     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1565     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1566     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1567     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1568     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1569     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1570     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1571     auto nodeModifiers = GetArkUINodeModifiers();
1572     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1573     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1574         nodeModifiers->getRichEditorModifier()->resetRichEditorOnCopy(nativeNode);
1575         return panda::JSValueRef::Undefined(vm);
1576     }
1577     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1578     std::function<void(TextCommonEvent&)> callback = [vm, frameNode,
1579         func = panda::CopyableGlobal(vm, func)](TextCommonEvent& event) {
1580         panda::LocalScope pandaScope(vm);
1581         panda::TryCatch trycatch(vm);
1582         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1583         panda::Local<panda::JSValueRef> params[NUM_1];
1584         CreateCommonEvent(vm, event, params);
1585         func->Call(vm, func.ToLocal(), params, NUM_1);
1586     };
1587     nodeModifiers->getRichEditorModifier()->setRichEditorOnCopy(
1588         nativeNode, reinterpret_cast<void*>(&callback));
1589     return panda::JSValueRef::Undefined(vm);
1590 }
1591 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1592 ArkUINativeModuleValue RichEditorBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1593 {
1594     EcmaVM* vm = runtimeCallInfo->GetVM();
1595     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1596     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1597     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1598     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1599     auto nodeModifiers = GetArkUINodeModifiers();
1600     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1601     nodeModifiers->getRichEditorModifier()->resetRichEditorOnCopy(nativeNode);
1602     return panda::JSValueRef::Undefined(vm);
1603 }
1604 
SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)1605 ArkUINativeModuleValue RichEditorBridge::SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo* runtimeCallInfo)
1606 {
1607     EcmaVM* vm = runtimeCallInfo->GetVM();
1608     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1609     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1610     Local<JSValueRef> enableArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1611     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1612     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1613     auto nodeModifiers = GetArkUINodeModifiers();
1614     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1615     if (enableArg->IsUndefined() || enableArg->IsNull() || !enableArg->IsBoolean()) {
1616         nodeModifiers->getRichEditorModifier()->resetRichEditorEnableKeyboardOnFocus(nativeNode);
1617         return panda::JSValueRef::Undefined(vm);
1618     }
1619     bool enable = false;
1620     enable = enableArg->ToBoolean(vm)->BooleaValue(vm);
1621     nodeModifiers->getRichEditorModifier()->setRichEditorEnableKeyboardOnFocus(nativeNode, enable);
1622     return panda::JSValueRef::Undefined(vm);
1623 }
1624 
ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)1625 ArkUINativeModuleValue RichEditorBridge::ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo* runtimeCallInfo)
1626 {
1627     EcmaVM* vm = runtimeCallInfo->GetVM();
1628     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1629     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1630     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1631     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1632     auto nodeModifiers = GetArkUINodeModifiers();
1633     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1634     nodeModifiers->getRichEditorModifier()->resetRichEditorEnableKeyboardOnFocus(nativeNode);
1635     return panda::JSValueRef::Undefined(vm);
1636 }
1637 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1638 ArkUINativeModuleValue RichEditorBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1639 {
1640     EcmaVM* vm = runtimeCallInfo->GetVM();
1641     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1642     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1643     Local<JSValueRef> enableArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1644     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1645     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1646     auto nodeModifiers = GetArkUINodeModifiers();
1647     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1648     if (enableArg->IsUndefined() || enableArg->IsNull() || !enableArg->IsBoolean()) {
1649         nodeModifiers->getRichEditorModifier()->resetRichEditorEnablePreviewText(nativeNode);
1650         return panda::JSValueRef::Undefined(vm);
1651     }
1652     bool enable = false;
1653     enable = enableArg->ToBoolean(vm)->BooleaValue(vm);
1654     nodeModifiers->getRichEditorModifier()->setRichEditorEnablePreviewText(nativeNode, enable);
1655     return panda::JSValueRef::Undefined(vm);
1656 }
1657 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1658 ArkUINativeModuleValue RichEditorBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1659 {
1660     EcmaVM* vm = runtimeCallInfo->GetVM();
1661     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1662     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1663     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1664     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1665     auto nodeModifiers = GetArkUINodeModifiers();
1666     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1667     nodeModifiers->getRichEditorModifier()->resetRichEditorEnablePreviewText(nativeNode);
1668     return panda::JSValueRef::Undefined(vm);
1669 }
1670 
1671 
SetEditMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1672 ArkUINativeModuleValue RichEditorBridge::SetEditMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1673 {
1674     EcmaVM* vm = runtimeCallInfo->GetVM();
1675     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1676     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1677     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1678     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1679     NG::OnCreateMenuCallback onCreateMenuCallback;
1680     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1681     auto nodeModifiers = GetArkUINodeModifiers();
1682     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1683     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
1684         nodeModifiers->getRichEditorModifier()->resetRichEditorEditMenuOptions(nativeNode);
1685         return panda::JSValueRef::Undefined(vm);
1686     }
1687     nodeModifiers->getRichEditorModifier()->setRichEditorEditMenuOptions(
1688         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
1689     return panda::JSValueRef::Undefined(vm);
1690 }
1691 
ResetEditMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1692 ArkUINativeModuleValue RichEditorBridge::ResetEditMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1693 {
1694     EcmaVM* vm = runtimeCallInfo->GetVM();
1695     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1696     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1697     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1698     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1699     auto nodeModifiers = GetArkUINodeModifiers();
1700     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1701     nodeModifiers->getRichEditorModifier()->resetRichEditorEditMenuOptions(nativeNode);
1702     return panda::JSValueRef::Undefined(vm);
1703 }
1704 
SetEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)1705 ArkUINativeModuleValue RichEditorBridge::SetEnterKeyType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1706 {
1707     EcmaVM* vm = runtimeCallInfo->GetVM();
1708     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1709     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1710     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1711     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1712     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1713     uint32_t enterKeyType = static_cast<uint32_t>(TextInputAction::NEW_LINE);
1714     auto nodeModifiers = GetArkUINodeModifiers();
1715     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1716     if (secondArg->IsNumber()) {
1717         enterKeyType = secondArg->Uint32Value(vm);
1718         nodeModifiers->getRichEditorModifier()->setRichEditorEnterKeyType(nativeNode, enterKeyType);
1719     } else {
1720         nodeModifiers->getRichEditorModifier()->resetRichEditorEnterKeyType(nativeNode);
1721     }
1722     return panda::JSValueRef::Undefined(vm);
1723 }
1724 
ResetEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)1725 ArkUINativeModuleValue RichEditorBridge::ResetEnterKeyType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1726 {
1727     EcmaVM* vm = runtimeCallInfo->GetVM();
1728     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1730     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1732     auto nodeModifiers = GetArkUINodeModifiers();
1733     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1734     nodeModifiers->getRichEditorModifier()->resetRichEditorEnterKeyType(nativeNode);
1735     return panda::JSValueRef::Undefined(vm);
1736 }
1737 
SetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)1738 ArkUINativeModuleValue RichEditorBridge::SetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
1739 {
1740     EcmaVM *vm = runtimeCallInfo->GetVM();
1741     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1742     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1743     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1744     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1745     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1746     auto nodeModifiers = GetArkUINodeModifiers();
1747     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1748     if (secondArg->IsNumber()) {
1749         uint32_t barStateValue = secondArg->Uint32Value(vm);
1750         nodeModifiers->getRichEditorModifier()->setRichEditorBarState(nativeNode, barStateValue);
1751     } else {
1752         nodeModifiers->getRichEditorModifier()->resetRichEditorBarState(nativeNode);
1753     }
1754     return panda::JSValueRef::Undefined(vm);
1755 }
1756 
ResetBarState(ArkUIRuntimeCallInfo * runtimeCallInfo)1757 ArkUINativeModuleValue RichEditorBridge::ResetBarState(ArkUIRuntimeCallInfo *runtimeCallInfo)
1758 {
1759     EcmaVM *vm = runtimeCallInfo->GetVM();
1760     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1761     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1762     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1763     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1764     auto nodeModifiers = GetArkUINodeModifiers();
1765     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1766     nodeModifiers->getRichEditorModifier()->resetRichEditorBarState(nativeNode);
1767     return panda::JSValueRef::Undefined(vm);
1768 }
1769 
SetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)1770 ArkUINativeModuleValue RichEditorBridge::SetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
1771 {
1772     EcmaVM *vm = runtimeCallInfo->GetVM();
1773     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1774     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1775     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1776     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1777     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1778     auto nodeModifiers = GetArkUINodeModifiers();
1779     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1780     if (!secondArg->IsNumber()) {
1781         nodeModifiers->getRichEditorModifier()->resetRichEditorMaxLength(nativeNode);
1782     } else {
1783         int32_t maxLength = secondArg->Int32Value(vm);
1784         if (std::isinf(static_cast<float>(secondArg->ToNumber(vm)->Value()))) {
1785             maxLength = INT32_MAX;
1786         }
1787         if (maxLength >= 0) {
1788             nodeModifiers->getRichEditorModifier()->setRichEditorMaxLength(nativeNode, maxLength);
1789         } else {
1790             nodeModifiers->getRichEditorModifier()->resetRichEditorMaxLength(nativeNode);
1791         }
1792     }
1793     return panda::JSValueRef::Undefined(vm);
1794 }
1795 
ResetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)1796 ArkUINativeModuleValue RichEditorBridge::ResetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
1797 {
1798     EcmaVM *vm = runtimeCallInfo->GetVM();
1799     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1800     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1801     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1802     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1803     auto nodeModifiers = GetArkUINodeModifiers();
1804     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1805     nodeModifiers->getRichEditorModifier()->resetRichEditorMaxLength(nativeNode);
1806     return panda::JSValueRef::Undefined(vm);
1807 }
1808 
SetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)1809 ArkUINativeModuleValue RichEditorBridge::SetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
1810 {
1811     EcmaVM *vm = runtimeCallInfo->GetVM();
1812     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1813     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1814     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1815     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1816     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1817     auto nodeModifiers = GetArkUINodeModifiers();
1818     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1819     if (secondArg->IsNumber() && secondArg->Int32Value(vm) > 0) {
1820         nodeModifiers->getRichEditorModifier()->setRichEditorMaxLines(nativeNode, secondArg->Uint32Value(vm));
1821     } else {
1822         nodeModifiers->getRichEditorModifier()->resetRichEditorMaxLines(nativeNode);
1823     }
1824     return panda::JSValueRef::Undefined(vm);
1825 }
1826 
ResetMaxLines(ArkUIRuntimeCallInfo * runtimeCallInfo)1827 ArkUINativeModuleValue RichEditorBridge::ResetMaxLines(ArkUIRuntimeCallInfo *runtimeCallInfo)
1828 {
1829     EcmaVM *vm = runtimeCallInfo->GetVM();
1830     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1831     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1832     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1833     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1834     auto nodeModifiers = GetArkUINodeModifiers();
1835     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1836     nodeModifiers->getRichEditorModifier()->resetRichEditorMaxLines(nativeNode);
1837     return panda::JSValueRef::Undefined(vm);
1838 }
1839 
SetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)1840 ArkUINativeModuleValue RichEditorBridge::SetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
1841 {
1842     EcmaVM* vm = runtimeCallInfo->GetVM();
1843     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1844     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1845     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1846     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1847     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1848     auto nodeModifiers = GetArkUINodeModifiers();
1849     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1850     if (secondArg->IsBoolean()) {
1851         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1852         nodeModifiers->getRichEditorModifier()->setRichEditorStopBackPress(nativeNode, value);
1853     } else {
1854         nodeModifiers->getRichEditorModifier()->resetRichEditorStopBackPress(nativeNode);
1855     }
1856     return panda::JSValueRef::Undefined(vm);
1857 }
1858 
ResetStopBackPress(ArkUIRuntimeCallInfo * runtimeCallInfo)1859 ArkUINativeModuleValue RichEditorBridge::ResetStopBackPress(ArkUIRuntimeCallInfo* runtimeCallInfo)
1860 {
1861     EcmaVM* vm = runtimeCallInfo->GetVM();
1862     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1863     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1864     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1865     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1866     auto nodeModifiers = GetArkUINodeModifiers();
1867     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1868     nodeModifiers->getRichEditorModifier()->resetRichEditorStopBackPress(nativeNode);
1869     return panda::JSValueRef::Undefined(vm);
1870 }
1871 
SetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1872 ArkUINativeModuleValue RichEditorBridge::SetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1873 {
1874     EcmaVM* vm = runtimeCallInfo->GetVM();
1875     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1876     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1877     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1878     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1879     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1880     auto nodeModifiers = GetArkUINodeModifiers();
1881     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1882     if (secondArg->IsNumber()) {
1883         uint32_t keyboardAppearance = secondArg->Uint32Value(vm);
1884         nodeModifiers->getRichEditorModifier()->
1885             setRichEditorKeyboardAppearance(nativeNode, keyboardAppearance);
1886     }
1887     return panda::JSValueRef::Undefined(vm);
1888 }
1889 
ResetKeyboardAppearance(ArkUIRuntimeCallInfo * runtimeCallInfo)1890 ArkUINativeModuleValue RichEditorBridge::ResetKeyboardAppearance(ArkUIRuntimeCallInfo* runtimeCallInfo)
1891 {
1892     EcmaVM* vm = runtimeCallInfo->GetVM();
1893     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1894     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1895     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1896     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1897     auto nodeModifiers = GetArkUINodeModifiers();
1898     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1899     nodeModifiers->getRichEditorModifier()->resetRichEditorKeyboardAppearance(nativeNode);
1900     return panda::JSValueRef::Undefined(vm);
1901 }
1902 }