• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "core/interfaces/native/node/rich_editor_modifier.h"
16 
17 #include "core/pipeline/base/element_register.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components_ng/pattern/rich_editor/rich_editor_model_ng.h"
22 #include "core/components_ng/pattern/rich_editor/rich_editor_theme.h"
23 
24 namespace OHOS::Ace::NG {
25 constexpr bool DEFAULT_ENABLE_TEXT_DETECTOR = false;
26 
SetRichEditorDetectEnable(ArkUINodeHandle node,ArkUI_Uint32 value)27 void SetRichEditorDetectEnable(ArkUINodeHandle node, ArkUI_Uint32 value)
28 {
29     auto* frameNode = reinterpret_cast<FrameNode*>(node);
30     CHECK_NULL_VOID(frameNode);
31     RichEditorModelNG::SetTextDetectEnable(frameNode, static_cast<bool>(value));
32 }
33 
ResetRichEditorDetectEnable(ArkUINodeHandle node)34 void ResetRichEditorDetectEnable(ArkUINodeHandle node)
35 {
36     auto* frameNode = reinterpret_cast<FrameNode*>(node);
37     CHECK_NULL_VOID(frameNode);
38     RichEditorModelNG::SetTextDetectEnable(frameNode, DEFAULT_ENABLE_TEXT_DETECTOR);
39 }
40 
SetRichEditorDataDetectorConfigWithEvent(ArkUINodeHandle node,const struct ArkUITextDetectConfigStruct * arkUITextDetectConfig)41 void SetRichEditorDataDetectorConfigWithEvent(
42     ArkUINodeHandle node, const struct ArkUITextDetectConfigStruct* arkUITextDetectConfig)
43 {
44     auto* frameNode = reinterpret_cast<FrameNode*>(node);
45     CHECK_NULL_VOID(frameNode);
46     TextDetectConfig textDetectConfig;
47     textDetectConfig.types = arkUITextDetectConfig->types;
48     if (arkUITextDetectConfig->onResult) {
49         textDetectConfig.onResult =
50             std::move(*(reinterpret_cast<std::function<void(const std::string&)>*>(arkUITextDetectConfig->onResult)));
51     }
52     textDetectConfig.entityColor = Color(arkUITextDetectConfig->entityColor);
53     textDetectConfig.entityDecorationType = TextDecoration(arkUITextDetectConfig->entityDecorationType);
54     textDetectConfig.entityDecorationColor = Color(arkUITextDetectConfig->entityDecorationColor);
55     textDetectConfig.entityDecorationStyle = TextDecorationStyle(arkUITextDetectConfig->entityDecorationStyle);
56     RichEditorModelNG::SetTextDetectConfig(frameNode, textDetectConfig);
57 }
58 
ResetRichEditorDataDetectorConfigWithEvent(ArkUINodeHandle node)59 void ResetRichEditorDataDetectorConfigWithEvent(ArkUINodeHandle node)
60 {
61     auto* frameNode = reinterpret_cast<FrameNode*>(node);
62     CHECK_NULL_VOID(frameNode);
63     TextDetectConfig textDetectConfig;
64     RichEditorModelNG::SetTextDetectConfig(frameNode, textDetectConfig);
65 }
66 
SetRichEditorOnIMEInputComplete(ArkUINodeHandle node,void * callback)67 void SetRichEditorOnIMEInputComplete(ArkUINodeHandle node, void* callback)
68 {
69     auto* frameNode = reinterpret_cast<FrameNode*>(node);
70     CHECK_NULL_VOID(frameNode);
71     if (callback) {
72         auto onIMEInputComplete = reinterpret_cast<std::function<void(RichEditorAbstractSpanResult)>*>(callback);
73         RichEditorModelNG::SetOnIMEInputComplete(frameNode, std::move(*onIMEInputComplete));
74     } else {
75         RichEditorModelNG::SetOnIMEInputComplete(frameNode, nullptr);
76     }
77 }
78 
ResetRichEditorOnIMEInputComplete(ArkUINodeHandle node)79 void ResetRichEditorOnIMEInputComplete(ArkUINodeHandle node)
80 {
81     auto* frameNode = reinterpret_cast<FrameNode*>(node);
82     CHECK_NULL_VOID(frameNode);
83     RichEditorModelNG::SetOnIMEInputComplete(frameNode, nullptr);
84 }
85 
SetRichEditorCopyOptions(ArkUINodeHandle node,ArkUI_Int32 copyOptionsValue)86 void SetRichEditorCopyOptions(ArkUINodeHandle node, ArkUI_Int32 copyOptionsValue)
87 {
88     auto* frameNode = reinterpret_cast<FrameNode*>(node);
89     CopyOptions copyOptions = static_cast<CopyOptions>(copyOptionsValue);
90     CHECK_NULL_VOID(frameNode);
91     RichEditorModelNG::SetCopyOption(frameNode, copyOptions);
92 }
93 
ResetRichEditorCopyOptions(ArkUINodeHandle node)94 void ResetRichEditorCopyOptions(ArkUINodeHandle node)
95 {
96     auto* frameNode = reinterpret_cast<FrameNode*>(node);
97     CHECK_NULL_VOID(frameNode);
98     CopyOptions defaultCopyOptions = CopyOptions::Distributed;
99     RichEditorModelNG::SetCopyOption(frameNode, defaultCopyOptions);
100 }
101 
SetRichEditorOnSelectionChange(ArkUINodeHandle node,void * callback)102 void SetRichEditorOnSelectionChange(ArkUINodeHandle node, void* callback)
103 {
104     auto* frameNode = reinterpret_cast<FrameNode*>(node);
105     CHECK_NULL_VOID(frameNode);
106     if (callback) {
107         auto onSelectionChange = reinterpret_cast<std::function<void(const BaseEventInfo*)>*>(callback);
108         RichEditorModelNG::SetOnSelectionChange(frameNode, std::move(*onSelectionChange));
109     } else {
110         RichEditorModelNG::SetOnSelectionChange(frameNode, nullptr);
111     }
112 }
113 
ResetRichEditorOnSelectionChange(ArkUINodeHandle node)114 void ResetRichEditorOnSelectionChange(ArkUINodeHandle node)
115 {
116     auto* frameNode = reinterpret_cast<FrameNode*>(node);
117     CHECK_NULL_VOID(frameNode);
118     RichEditorModelNG::SetOnSelectionChange(frameNode, nullptr);
119 }
120 
SetRichEditorCaretColor(ArkUINodeHandle node,ArkUI_Uint32 color)121 void SetRichEditorCaretColor(ArkUINodeHandle node, ArkUI_Uint32 color)
122 {
123     auto* frameNode = reinterpret_cast<FrameNode*>(node);
124     CHECK_NULL_VOID(frameNode);
125     RichEditorModelNG::SetCaretColor(frameNode, Color(color));
126 }
127 
ResetRichEditorCaretColor(ArkUINodeHandle node)128 void ResetRichEditorCaretColor(ArkUINodeHandle node)
129 {
130     auto pipeline = PipelineContext::GetCurrentContext();
131     CHECK_NULL_VOID(pipeline);
132     auto richEditorTheme = pipeline->GetTheme<RichEditorTheme>();
133     CHECK_NULL_VOID(richEditorTheme);
134     auto caretColor = richEditorTheme->GetCaretColor();
135     auto* frameNode = reinterpret_cast<FrameNode*>(node);
136     CHECK_NULL_VOID(frameNode);
137     RichEditorModelNG::SetCaretColor(frameNode, caretColor);
138 }
139 
SetRichEditorOnSelect(ArkUINodeHandle node,void * callback)140 void SetRichEditorOnSelect(ArkUINodeHandle node, void* callback)
141 {
142     auto* frameNode = reinterpret_cast<FrameNode*>(node);
143     CHECK_NULL_VOID(frameNode);
144     if (callback) {
145         auto onSelect = reinterpret_cast<std::function<void(const BaseEventInfo*)>*>(callback);
146         RichEditorModelNG::SetOnSelect(frameNode, std::move(*onSelect));
147     } else {
148         RichEditorModelNG::SetOnSelect(frameNode, nullptr);
149     }
150 }
151 
ResetRichEditorOnSelect(ArkUINodeHandle node)152 void ResetRichEditorOnSelect(ArkUINodeHandle node)
153 {
154     auto* frameNode = reinterpret_cast<FrameNode*>(node);
155     CHECK_NULL_VOID(frameNode);
156     RichEditorModelNG::SetOnSelect(frameNode, nullptr);
157 }
158 
SetRichEditorOnSubmit(ArkUINodeHandle node,void * callback)159 void SetRichEditorOnSubmit(ArkUINodeHandle node, void* callback)
160 {
161     auto* frameNode = reinterpret_cast<FrameNode*>(node);
162     CHECK_NULL_VOID(frameNode);
163     if (callback) {
164         auto onSubmit = reinterpret_cast<std::function<void(int32_t, NG::TextFieldCommonEvent&)>*>(callback);
165         RichEditorModelNG::SetOnSubmit(frameNode, std::move(*onSubmit));
166     } else {
167         RichEditorModelNG::SetOnSubmit(frameNode, nullptr);
168     }
169 }
170 
ResetRichEditorOnSubmit(ArkUINodeHandle node)171 void ResetRichEditorOnSubmit(ArkUINodeHandle node)
172 {
173     auto* frameNode = reinterpret_cast<FrameNode*>(node);
174     CHECK_NULL_VOID(frameNode);
175     RichEditorModelNG::SetOnSubmit(frameNode, nullptr);
176 }
177 
SetRichEditorAboutToIMEInput(ArkUINodeHandle node,void * callback)178 void SetRichEditorAboutToIMEInput(ArkUINodeHandle node, void* callback)
179 {
180     auto* frameNode = reinterpret_cast<FrameNode*>(node);
181     CHECK_NULL_VOID(frameNode);
182     if (callback) {
183         auto aboutToIMEInput = reinterpret_cast<std::function<bool(const RichEditorInsertValue&)>*>(callback);
184         RichEditorModelNG::SetAboutToIMEInput(frameNode, std::move(*aboutToIMEInput));
185     } else {
186         RichEditorModelNG::SetAboutToIMEInput(frameNode, nullptr);
187     }
188 }
189 
ResetRichEditorAboutToIMEInput(ArkUINodeHandle node)190 void ResetRichEditorAboutToIMEInput(ArkUINodeHandle node)
191 {
192     auto* frameNode = reinterpret_cast<FrameNode*>(node);
193     CHECK_NULL_VOID(frameNode);
194     RichEditorModelNG::SetAboutToIMEInput(frameNode, nullptr);
195 }
196 
SetRichEditorOnReady(ArkUINodeHandle node,void * callback)197 void SetRichEditorOnReady(ArkUINodeHandle node, void* callback)
198 {
199     auto* frameNode = reinterpret_cast<FrameNode*>(node);
200     CHECK_NULL_VOID(frameNode);
201     if (callback) {
202         auto onReady = reinterpret_cast<std::function<void(void)>*>(callback);
203         RichEditorModelNG::SetOnReady(frameNode, std::move(*onReady));
204     } else {
205         RichEditorModelNG::SetOnReady(frameNode, nullptr);
206     }
207 }
208 
ResetRichEditorOnReady(ArkUINodeHandle node)209 void ResetRichEditorOnReady(ArkUINodeHandle node)
210 {
211     auto* frameNode = reinterpret_cast<FrameNode*>(node);
212     CHECK_NULL_VOID(frameNode);
213     RichEditorModelNG::SetOnReady(frameNode, nullptr);
214 }
215 
SetRichEditorOnDeleteComplete(ArkUINodeHandle node,void * callback)216 void SetRichEditorOnDeleteComplete(ArkUINodeHandle node, void* callback)
217 {
218     auto* frameNode = reinterpret_cast<FrameNode*>(node);
219     CHECK_NULL_VOID(frameNode);
220     if (callback) {
221         auto onDeleteComplete = reinterpret_cast<std::function<void(void)>*>(callback);
222         RichEditorModelNG::SetOnDeleteComplete(frameNode, std::move(*onDeleteComplete));
223     } else {
224         RichEditorModelNG::SetOnDeleteComplete(frameNode, nullptr);
225     }
226 }
227 
ResetRichEditorOnDeleteComplete(ArkUINodeHandle node)228 void ResetRichEditorOnDeleteComplete(ArkUINodeHandle node)
229 {
230     auto* frameNode = reinterpret_cast<FrameNode*>(node);
231     CHECK_NULL_VOID(frameNode);
232     RichEditorModelNG::SetOnDeleteComplete(frameNode, nullptr);
233 }
234 
SetRichEditorOnEditingChange(ArkUINodeHandle node,void * callback)235 void SetRichEditorOnEditingChange(ArkUINodeHandle node, void* callback)
236 {
237     auto* frameNode = reinterpret_cast<FrameNode*>(node);
238     CHECK_NULL_VOID(frameNode);
239     if (callback) {
240         auto onEditingChange = reinterpret_cast<std::function<void(bool)>*>(callback);
241         RichEditorModelNG::SetOnEditingChange(frameNode, std::move(*onEditingChange));
242     } else {
243         RichEditorModelNG::SetOnEditingChange(frameNode, nullptr);
244     }
245 }
246 
ResetRichEditorOnEditingChange(ArkUINodeHandle node)247 void ResetRichEditorOnEditingChange(ArkUINodeHandle node)
248 {
249     auto* frameNode = reinterpret_cast<FrameNode*>(node);
250     CHECK_NULL_VOID(frameNode);
251     RichEditorModelNG::SetOnEditingChange(frameNode, nullptr);
252 }
253 
SetRichEditorSelectedBackgroundColor(ArkUINodeHandle node,ArkUI_Uint32 color)254 void SetRichEditorSelectedBackgroundColor(ArkUINodeHandle node, ArkUI_Uint32 color)
255 {
256     auto* frameNode = reinterpret_cast<FrameNode*>(node);
257     CHECK_NULL_VOID(frameNode);
258     RichEditorModelNG::SetSelectedBackgroundColor(frameNode, Color(color));
259 }
260 
ResetRichEditorSelectedBackgroundColor(ArkUINodeHandle node)261 void ResetRichEditorSelectedBackgroundColor(ArkUINodeHandle node)
262 {
263     auto pipeline = PipelineContext::GetCurrentContext();
264     CHECK_NULL_VOID(pipeline);
265     auto richEditorTheme = pipeline->GetTheme<RichEditorTheme>();
266     CHECK_NULL_VOID(richEditorTheme);
267     auto selectedBackgroundColor = richEditorTheme->GetSelectedBackgroundColor();
268     auto* frameNode = reinterpret_cast<FrameNode*>(node);
269     CHECK_NULL_VOID(frameNode);
270     RichEditorModelNG::SetSelectedBackgroundColor(frameNode, selectedBackgroundColor);
271 }
272 
SetRichEditorOnPaste(ArkUINodeHandle node,void * callback)273 void SetRichEditorOnPaste(ArkUINodeHandle node, void* callback)
274 {
275     auto* frameNode = reinterpret_cast<FrameNode*>(node);
276     CHECK_NULL_VOID(frameNode);
277     if (callback) {
278         auto onPaste = reinterpret_cast<std::function<void(NG::TextCommonEvent&)>*>(callback);
279         RichEditorModelNG::SetOnPaste(frameNode, std::move(*onPaste));
280     } else {
281         RichEditorModelNG::SetOnPaste(frameNode, nullptr);
282     }
283 }
284 
ResetRichEditorOnPaste(ArkUINodeHandle node)285 void ResetRichEditorOnPaste(ArkUINodeHandle node)
286 {
287     auto* frameNode = reinterpret_cast<FrameNode*>(node);
288     CHECK_NULL_VOID(frameNode);
289     RichEditorModelNG::SetOnPaste(frameNode, nullptr);
290 }
291 
SetRichEditorOnCut(ArkUINodeHandle node,void * callback)292 void SetRichEditorOnCut(ArkUINodeHandle node, void* callback)
293 {
294     auto* frameNode = reinterpret_cast<FrameNode*>(node);
295     CHECK_NULL_VOID(frameNode);
296     if (callback) {
297         auto onCut = reinterpret_cast<std::function<void(NG::TextCommonEvent&)>*>(callback);
298         RichEditorModelNG::SetOnCut(frameNode, std::move(*onCut));
299     } else {
300         RichEditorModelNG::SetOnCut(frameNode, nullptr);
301     }
302 }
303 
ResetRichEditorOnCut(ArkUINodeHandle node)304 void ResetRichEditorOnCut(ArkUINodeHandle node)
305 {
306     auto* frameNode = reinterpret_cast<FrameNode*>(node);
307     CHECK_NULL_VOID(frameNode);
308     RichEditorModelNG::SetOnCut(frameNode, nullptr);
309 }
310 
SetRichEditorOnCopy(ArkUINodeHandle node,void * callback)311 void SetRichEditorOnCopy(ArkUINodeHandle node, void* callback)
312 {
313     auto* frameNode = reinterpret_cast<FrameNode*>(node);
314     CHECK_NULL_VOID(frameNode);
315     if (callback) {
316         auto onCopy = reinterpret_cast<std::function<void(NG::TextCommonEvent&)>*>(callback);
317         RichEditorModelNG::SetOnCopy(frameNode, std::move(*onCopy));
318     } else {
319         RichEditorModelNG::SetOnCopy(frameNode, nullptr);
320     }
321 }
322 
ResetRichEditorOnCopy(ArkUINodeHandle node)323 void ResetRichEditorOnCopy(ArkUINodeHandle node)
324 {
325     auto* frameNode = reinterpret_cast<FrameNode*>(node);
326     CHECK_NULL_VOID(frameNode);
327     RichEditorModelNG::SetOnCopy(frameNode, nullptr);
328 }
329 
SetRichEditorEnterKeyType(ArkUINodeHandle node,ArkUI_Uint32 enterKeyType)330 void SetRichEditorEnterKeyType(ArkUINodeHandle node, ArkUI_Uint32 enterKeyType)
331 {
332     auto* frameNode = reinterpret_cast<FrameNode*>(node);
333     CHECK_NULL_VOID(frameNode);
334     RichEditorModelNG::SetEnterKeyType(frameNode, TextInputAction(enterKeyType));
335 }
336 
ResetRichEditorEnterKeyType(ArkUINodeHandle node)337 void ResetRichEditorEnterKeyType(ArkUINodeHandle node)
338 {
339     auto* frameNode = reinterpret_cast<FrameNode*>(node);
340     CHECK_NULL_VOID(frameNode);
341     auto defaultEnterKeyType = TextInputAction::NEW_LINE;
342     RichEditorModelNG::SetEnterKeyType(frameNode, defaultEnterKeyType);
343 }
344 
SetRichEditorKeyboardAppearance(ArkUINodeHandle node,ArkUI_Uint32 keyboardAppearance)345 void SetRichEditorKeyboardAppearance(ArkUINodeHandle node, ArkUI_Uint32 keyboardAppearance)
346 {
347     auto* frameNode = reinterpret_cast<FrameNode*>(node);
348     CHECK_NULL_VOID(frameNode);
349     auto value = static_cast<KeyboardAppearance>(keyboardAppearance);
350     if (value < KeyboardAppearance::NONE_IMMERSIVE || value > KeyboardAppearance::DARK_IMMERSIVE) {
351         RichEditorModelNG::SetKeyboardAppearance(frameNode, KeyboardAppearance::NONE_IMMERSIVE);
352         return;
353     }
354     RichEditorModelNG::SetKeyboardAppearance(frameNode, value);
355 }
356 
ResetRichEditorKeyboardAppearance(ArkUINodeHandle node)357 void ResetRichEditorKeyboardAppearance(ArkUINodeHandle node)
358 {
359     auto* frameNode = reinterpret_cast<FrameNode*>(node);
360     CHECK_NULL_VOID(frameNode);
361     auto value = KeyboardAppearance::NONE_IMMERSIVE;
362     RichEditorModelNG::SetKeyboardAppearance(frameNode, value);
363 }
364 
365 namespace NodeModifier {
GetRichEditorModifier()366 const ArkUIRichEditorModifier* GetRichEditorModifier()
367 {
368     static const ArkUIRichEditorModifier modifier = { SetRichEditorDetectEnable, ResetRichEditorDetectEnable,
369         SetRichEditorDataDetectorConfigWithEvent, ResetRichEditorDataDetectorConfigWithEvent,
370         SetRichEditorOnIMEInputComplete, ResetRichEditorOnIMEInputComplete,
371         SetRichEditorCopyOptions, ResetRichEditorCopyOptions, SetRichEditorOnSelectionChange,
372         ResetRichEditorOnSelectionChange, SetRichEditorCaretColor, ResetRichEditorCaretColor,
373         SetRichEditorOnSelect, ResetRichEditorOnSelect,
374         SetRichEditorOnSubmit, ResetRichEditorOnSubmit, SetRichEditorAboutToIMEInput, ResetRichEditorAboutToIMEInput,
375         SetRichEditorOnReady, ResetRichEditorOnReady, SetRichEditorOnDeleteComplete, ResetRichEditorOnDeleteComplete,
376         SetRichEditorOnEditingChange, ResetRichEditorOnEditingChange,
377         SetRichEditorSelectedBackgroundColor, ResetRichEditorSelectedBackgroundColor, SetRichEditorOnPaste,
378         ResetRichEditorOnPaste, SetRichEditorOnCut, ResetRichEditorOnCut, SetRichEditorOnCopy, ResetRichEditorOnCopy,
379         SetRichEditorEnterKeyType, ResetRichEditorEnterKeyType,
380         SetRichEditorKeyboardAppearance, ResetRichEditorKeyboardAppearance };
381     return &modifier;
382 }
383 
GetCJUIRichEditorModifier()384 const CJUIRichEditorModifier* GetCJUIRichEditorModifier()
385 {
386     static const CJUIRichEditorModifier modifier = { SetRichEditorDetectEnable, ResetRichEditorDetectEnable,
387         SetRichEditorCopyOptions, ResetRichEditorCopyOptions, SetRichEditorCaretColor, ResetRichEditorCaretColor,
388         SetRichEditorOnReady, ResetRichEditorOnReady, SetRichEditorOnDeleteComplete, ResetRichEditorOnDeleteComplete,
389         SetRichEditorOnEditingChange, ResetRichEditorOnEditingChange,
390         SetRichEditorSelectedBackgroundColor, ResetRichEditorSelectedBackgroundColor, SetRichEditorEnterKeyType,
391         ResetRichEditorEnterKeyType };
392     return &modifier;
393 }
394 }
395 }