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 }