1 /*
2 * Copyright (c) 2022-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
16 #include "core/components_ng/pattern/text/text_model_ng.h"
17
18 #include "base/geometry/dimension.h"
19 #include "core/components/common/layout/constants.h"
20 #include "core/components/common/properties/alignment.h"
21 #include "core/components/common/properties/text_style.h"
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/base/view_abstract.h"
24 #include "core/components_ng/base/view_stack_processor.h"
25 #include "core/components_ng/pattern/text/span/span_string.h"
26 #include "core/components_ng/pattern/text/span_model_ng.h"
27 #include "core/components_ng/pattern/text/text_event_hub.h"
28 #include "core/components_ng/pattern/text/text_layout_property.h"
29 #include "core/components_ng/pattern/text/text_pattern.h"
30 #include "core/components_ng/pattern/text/text_styles.h"
31 #include "core/components_ng/pattern/text_field/text_field_event_hub.h"
32 #include "core/components_v2/inspector/inspector_constants.h"
33
34 namespace OHOS::Ace::NG {
35
36 constexpr int32_t DEFAULT_ALPHA = 255;
37 constexpr float DEFAULT_OPACITY = 0.2;
38
Create(const std::string & content)39 void TextModelNG::Create(const std::string& content)
40 {
41 auto* stack = ViewStackProcessor::GetInstance();
42 auto nodeId = stack->ClaimNodeId();
43 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::TEXT_ETS_TAG, nodeId);
44 auto frameNode =
45 FrameNode::GetOrCreateFrameNode(V2::TEXT_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<TextPattern>(); });
46 stack->Push(frameNode);
47
48 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, Content, content);
49 // set draggable for framenode
50 if (frameNode->IsFirstBuilding()) {
51 auto pipeline = frameNode->GetContext();
52 CHECK_NULL_VOID(pipeline);
53 auto draggable = pipeline->GetDraggable<TextTheme>();
54 frameNode->SetDraggable(draggable);
55 auto gestureHub = frameNode->GetOrCreateGestureEventHub();
56 CHECK_NULL_VOID(gestureHub);
57 gestureHub->SetTextDraggable(true);
58 }
59
60 auto textPattern = frameNode->GetPattern<TextPattern>();
61 textPattern->SetTextController(AceType::MakeRefPtr<TextController>());
62 textPattern->GetTextController()->SetPattern(WeakPtr(textPattern));
63 textPattern->ClearSelectionMenu();
64 }
65
Create(const RefPtr<SpanStringBase> & spanBase)66 void TextModelNG::Create(const RefPtr<SpanStringBase>& spanBase)
67 {
68 TextModelNG::Create("");
69 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
70 CHECK_NULL_VOID(frameNode);
71 auto textPattern = frameNode->GetPattern<TextPattern>();
72 CHECK_NULL_VOID(textPattern);
73 auto spanString = AceType::DynamicCast<SpanString>(spanBase);
74 if (spanString) {
75 auto spans = spanString->GetSpanItems();
76 textPattern->SetSpanItemChildren(spans);
77 textPattern->SetSpanStringMode(true);
78 }
79 }
80
CreateFrameNode(int32_t nodeId,const std::string & content)81 RefPtr<FrameNode> TextModelNG::CreateFrameNode(int32_t nodeId, const std::string& content)
82 {
83 auto frameNode = FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, nodeId, AceType::MakeRefPtr<TextPattern>());
84
85 CHECK_NULL_RETURN(frameNode, nullptr);
86 auto layout = frameNode->GetLayoutProperty<TextLayoutProperty>();
87 if (layout) {
88 layout->UpdateContent(content);
89 }
90 // set draggable for framenode
91 if (frameNode->IsFirstBuilding()) {
92 auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
93 CHECK_NULL_RETURN(pipeline, nullptr);
94 auto draggable = pipeline->GetDraggable<TextTheme>();
95 frameNode->SetDraggable(draggable);
96 auto gestureHub = frameNode->GetOrCreateGestureEventHub();
97 CHECK_NULL_RETURN(gestureHub, nullptr);
98 gestureHub->SetTextDraggable(true);
99 }
100
101 auto textPattern = frameNode->GetPattern<TextPattern>();
102 textPattern->SetTextController(AceType::MakeRefPtr<TextController>());
103 textPattern->GetTextController()->SetPattern(WeakPtr(textPattern));
104 textPattern->ClearSelectionMenu();
105 return frameNode;
106 }
107
SetFont(const Font & value)108 void TextModelNG::SetFont(const Font& value)
109 {
110 if (value.fontSize.has_value()) {
111 SetFontSize(value.fontSize.value());
112 }
113 if (value.fontWeight.has_value()) {
114 SetFontWeight(value.fontWeight.value());
115 }
116 if (!value.fontFamilies.empty()) {
117 SetFontFamily(value.fontFamilies);
118 }
119 if (value.fontStyle.has_value()) {
120 SetItalicFontStyle(value.fontStyle.value());
121 }
122 SetEnableVariableFontWeight(value.enableVariableFontWeight.value_or(false));
123 }
124
SetFontSize(const Dimension & value)125 void TextModelNG::SetFontSize(const Dimension& value)
126 {
127 if (!value.IsValid()) {
128 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, Dimension());
129 return;
130 }
131 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, value);
132 }
133
SetFontSize(FrameNode * frameNode,const Dimension & value)134 void TextModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
135 {
136 if (!value.IsValid()) {
137 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, Dimension(), frameNode);
138 return;
139 }
140 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, value, frameNode);
141 }
142
SetTextColor(const Color & value)143 void TextModelNG::SetTextColor(const Color& value)
144 {
145 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
146 CHECK_NULL_VOID(frameNode);
147 auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
148 CHECK_NULL_VOID(textLayoutProperty);
149 textLayoutProperty->UpdateTextColorByRender(value);
150 ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value);
151 ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy);
152 ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true);
153 auto textPattern = frameNode->GetPattern<TextPattern>();
154 CHECK_NULL_VOID(textPattern);
155 textPattern->UpdateFontColor(value);
156 }
157
SetTextColor(FrameNode * frameNode,const Color & value)158 void TextModelNG::SetTextColor(FrameNode* frameNode, const Color& value)
159 {
160 CHECK_NULL_VOID(frameNode);
161 auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
162 CHECK_NULL_VOID(textLayoutProperty);
163 textLayoutProperty->UpdateTextColorByRender(value);
164 ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, value, frameNode);
165 ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode);
166 ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode);
167 auto textPattern = frameNode->GetPattern<TextPattern>();
168 CHECK_NULL_VOID(textPattern);
169 textPattern->UpdateFontColor(value);
170 }
171
SetTextShadow(const std::vector<Shadow> & value)172 void TextModelNG::SetTextShadow(const std::vector<Shadow>& value)
173 {
174 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextShadow, value);
175 }
176
SetItalicFontStyle(Ace::FontStyle value)177 void TextModelNG::SetItalicFontStyle(Ace::FontStyle value)
178 {
179 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, ItalicFontStyle, value);
180 }
181
SetItalicFontStyle(FrameNode * frameNode,Ace::FontStyle value)182 void TextModelNG::SetItalicFontStyle(FrameNode* frameNode, Ace::FontStyle value)
183 {
184 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, ItalicFontStyle, value, frameNode);
185 }
186
SetFontWeight(FrameNode * frameNode,Ace::FontWeight value)187 void TextModelNG::SetFontWeight(FrameNode* frameNode, Ace::FontWeight value)
188 {
189 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontWeight, value, frameNode);
190 }
191
SetVariableFontWeight(FrameNode * frameNode,int32_t value)192 void TextModelNG::SetVariableFontWeight(FrameNode* frameNode, int32_t value)
193 {
194 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, VariableFontWeight, value, frameNode);
195 }
196
SetEnableVariableFontWeight(FrameNode * frameNode,bool value)197 void TextModelNG::SetEnableVariableFontWeight(FrameNode* frameNode, bool value)
198 {
199 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, EnableVariableFontWeight, value, frameNode);
200 }
201
SetMinFontScale(const float value)202 void TextModelNG::SetMinFontScale(const float value)
203 {
204 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MinFontScale, value);
205 }
206
SetMaxFontScale(const float value)207 void TextModelNG::SetMaxFontScale(const float value)
208 {
209 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MaxFontScale, value);
210 }
211
SetFontWeight(Ace::FontWeight value)212 void TextModelNG::SetFontWeight(Ace::FontWeight value)
213 {
214 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontWeight, value);
215 }
216
SetVariableFontWeight(int32_t value)217 void TextModelNG::SetVariableFontWeight(int32_t value)
218 {
219 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, VariableFontWeight, value);
220 }
221
SetEnableVariableFontWeight(bool value)222 void TextModelNG::SetEnableVariableFontWeight(bool value)
223 {
224 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, EnableVariableFontWeight, value);
225 }
226
SetFontFamily(const std::vector<std::string> & value)227 void TextModelNG::SetFontFamily(const std::vector<std::string>& value)
228 {
229 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontFamily, value);
230 }
231
SetWordBreak(Ace::WordBreak value)232 void TextModelNG::SetWordBreak(Ace::WordBreak value)
233 {
234 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, WordBreak, value);
235 }
236
SetLineBreakStrategy(Ace::LineBreakStrategy value)237 void TextModelNG::SetLineBreakStrategy(Ace::LineBreakStrategy value)
238 {
239 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineBreakStrategy, value);
240 }
241
SetTextSelectableMode(Ace::TextSelectableMode value)242 void TextModelNG::SetTextSelectableMode(Ace::TextSelectableMode value)
243 {
244 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextSelectableMode, value);
245 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
246 CHECK_NULL_VOID(frameNode);
247 auto textPattern = frameNode->GetPattern<TextPattern>();
248 CHECK_NULL_VOID(textPattern);
249 textPattern->SetTextSelectableMode(value);
250 }
251
SetEllipsisMode(EllipsisMode value)252 void TextModelNG::SetEllipsisMode(EllipsisMode value)
253 {
254 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, EllipsisMode, value);
255 }
256
SetTextAlign(Ace::TextAlign value)257 void TextModelNG::SetTextAlign(Ace::TextAlign value)
258 {
259 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextAlign, value);
260 }
261
SetTextAlign(FrameNode * frameNode,Ace::TextAlign value)262 void TextModelNG::SetTextAlign(FrameNode* frameNode, Ace::TextAlign value)
263 {
264 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextAlign, value, frameNode);
265 }
266
SetTextOverflow(Ace::TextOverflow value)267 void TextModelNG::SetTextOverflow(Ace::TextOverflow value)
268 {
269 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextOverflow, value);
270 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
271 CHECK_NULL_VOID(frameNode);
272 auto textPattern = frameNode->GetPattern<TextPattern>();
273 CHECK_NULL_VOID(textPattern);
274 textPattern->OnTextOverflowChanged();
275 }
276
SetTextOverflow(FrameNode * frameNode,Ace::TextOverflow value)277 void TextModelNG::SetTextOverflow(FrameNode* frameNode, Ace::TextOverflow value)
278 {
279 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextOverflow, value, frameNode);
280 CHECK_NULL_VOID(frameNode);
281 auto textPattern = frameNode->GetPattern<TextPattern>();
282 CHECK_NULL_VOID(textPattern);
283 textPattern->OnTextOverflowChanged();
284 }
285
SetMaxLines(uint32_t value)286 void TextModelNG::SetMaxLines(uint32_t value)
287 {
288 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MaxLines, value);
289 }
290
SetTextIndent(const Dimension & value)291 void TextModelNG::SetTextIndent(const Dimension& value)
292 {
293 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextIndent, value);
294 }
295
SetLineHeight(const Dimension & value)296 void TextModelNG::SetLineHeight(const Dimension& value)
297 {
298 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineHeight, value);
299 }
300
SetLineHeight(FrameNode * frameNode,const Dimension & value)301 void TextModelNG::SetLineHeight(FrameNode* frameNode, const Dimension& value)
302 {
303 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineHeight, value, frameNode);
304 }
305
SetLineSpacing(const Dimension & value)306 void TextModelNG::SetLineSpacing(const Dimension& value)
307 {
308 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineSpacing, value);
309 }
310
SetLineSpacing(FrameNode * frameNode,const Dimension & value)311 void TextModelNG::SetLineSpacing(FrameNode* frameNode, const Dimension& value)
312 {
313 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineSpacing, value, frameNode);
314 }
315
SetTextDecoration(Ace::TextDecoration value)316 void TextModelNG::SetTextDecoration(Ace::TextDecoration value)
317 {
318 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecoration, value);
319 }
320
SetTextDecoration(FrameNode * frameNode,TextDecoration value)321 void TextModelNG::SetTextDecoration(FrameNode* frameNode, TextDecoration value)
322 {
323 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecoration, value, frameNode);
324 }
325
SetTextDecorationColor(const Color & value)326 void TextModelNG::SetTextDecorationColor(const Color& value)
327 {
328 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationColor, value);
329 }
330
SetTextDecorationColor(FrameNode * frameNode,const Color & value)331 void TextModelNG::SetTextDecorationColor(FrameNode* frameNode, const Color& value)
332 {
333 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationColor, value, frameNode);
334 }
335
SetTextDecorationStyle(Ace::TextDecorationStyle value)336 void TextModelNG::SetTextDecorationStyle(Ace::TextDecorationStyle value)
337 {
338 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationStyle, value);
339 }
340
SetTextDecorationStyle(FrameNode * frameNode,TextDecorationStyle value)341 void TextModelNG::SetTextDecorationStyle(FrameNode* frameNode, TextDecorationStyle value)
342 {
343 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationStyle, value, frameNode);
344 }
345
SetBaselineOffset(const Dimension & value)346 void TextModelNG::SetBaselineOffset(const Dimension& value)
347 {
348 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, BaselineOffset, value);
349 }
350
SetTextCase(Ace::TextCase value)351 void TextModelNG::SetTextCase(Ace::TextCase value)
352 {
353 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextCase, value);
354 }
355
SetLetterSpacing(const Dimension & value)356 void TextModelNG::SetLetterSpacing(const Dimension& value)
357 {
358 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LetterSpacing, value);
359 }
360
SetAdaptMinFontSize(const Dimension & value)361 void TextModelNG::SetAdaptMinFontSize(const Dimension& value)
362 {
363 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMinFontSize, value);
364 }
365
SetAdaptMaxFontSize(const Dimension & value)366 void TextModelNG::SetAdaptMaxFontSize(const Dimension& value)
367 {
368 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMaxFontSize, value);
369 }
370
SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)371 void TextModelNG::SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)
372 {
373 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, HeightAdaptivePolicy, value);
374 }
375
SetTextDetectEnable(bool value)376 void TextModelNG::SetTextDetectEnable(bool value)
377 {
378 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
379 CHECK_NULL_VOID(frameNode);
380 auto textPattern = frameNode->GetPattern<TextPattern>();
381 CHECK_NULL_VOID(textPattern);
382 textPattern->SetTextDetectEnable(value);
383 }
384
SetTextDetectConfig(const TextDetectConfig & textDetectConfig)385 void TextModelNG::SetTextDetectConfig(const TextDetectConfig& textDetectConfig)
386 {
387 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
388 CHECK_NULL_VOID(frameNode);
389 auto textPattern = frameNode->GetPattern<TextPattern>();
390 CHECK_NULL_VOID(textPattern);
391 textPattern->SetTextDetectConfig(textDetectConfig);
392 }
393
SetOnClick(std::function<void (BaseEventInfo * info)> && click)394 void TextModelNG::SetOnClick(std::function<void(BaseEventInfo* info)>&& click)
395 {
396 auto clickFunc = [func = std::move(click)](GestureEvent& info) { func(&info); };
397 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
398 CHECK_NULL_VOID(frameNode);
399 auto textPattern = frameNode->GetPattern<TextPattern>();
400 CHECK_NULL_VOID(textPattern);
401 textPattern->SetOnClickEvent(std::move(clickFunc));
402 }
403
ClearOnClick()404 void TextModelNG::ClearOnClick()
405 {
406 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
407 CHECK_NULL_VOID(frameNode);
408 auto textPattern = frameNode->GetPattern<TextPattern>();
409 CHECK_NULL_VOID(textPattern);
410 textPattern->SetOnClickEvent(nullptr);
411 }
412
SetRemoteMessage(std::function<void ()> && event)413 void TextModelNG::SetRemoteMessage(std::function<void()>&& event) {}
414
SetCopyOption(CopyOptions copyOption)415 void TextModelNG::SetCopyOption(CopyOptions copyOption)
416 {
417 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, CopyOption, copyOption);
418 }
419
SetOnCopy(std::function<void (const std::string &)> && func)420 void TextModelNG::SetOnCopy(std::function<void(const std::string&)>&& func)
421 {
422 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextEventHub>();
423 CHECK_NULL_VOID(eventHub);
424 eventHub->SetOnCopy(std::move(func));
425 }
426
SetTextSelection(int32_t startIndex,int32_t endIndex)427 void TextModelNG::SetTextSelection(int32_t startIndex, int32_t endIndex)
428 {
429 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
430 CHECK_NULL_VOID(frameNode);
431 auto textPattern = frameNode->GetPattern<TextPattern>();
432 CHECK_NULL_VOID(textPattern);
433 textPattern->SetTextSelection(startIndex, endIndex);
434 }
435
SetOnDragStart(NG::OnDragStartFunc && onDragStart)436 void TextModelNG::SetOnDragStart(NG::OnDragStartFunc&& onDragStart)
437 {
438 auto dragStart = [dragStartFunc = std::move(onDragStart)](
439 const RefPtr<OHOS::Ace::DragEvent>& event, const std::string& extraParams) -> DragDropInfo {
440 auto dragInfo = dragStartFunc(event, extraParams);
441 DragDropInfo info;
442 info.extraInfo = dragInfo.extraInfo;
443 info.pixelMap = dragInfo.pixelMap;
444 info.customNode = AceType::DynamicCast<UINode>(dragInfo.node);
445 return info;
446 };
447 ViewAbstract::SetOnDragStart(std::move(dragStart));
448 }
449
SetOnDragEnter(NG::OnDragDropFunc && onDragEnter)450 void TextModelNG::SetOnDragEnter(NG::OnDragDropFunc&& onDragEnter)
451 {
452 ViewAbstract::SetOnDragEnter(std::move(onDragEnter));
453 }
454
SetOnDragMove(NG::OnDragDropFunc && onDragMove)455 void TextModelNG::SetOnDragMove(NG::OnDragDropFunc&& onDragMove)
456 {
457 ViewAbstract::SetOnDragMove(std::move(onDragMove));
458 }
459
SetOnDragLeave(NG::OnDragDropFunc && onDragLeave)460 void TextModelNG::SetOnDragLeave(NG::OnDragDropFunc&& onDragLeave)
461 {
462 ViewAbstract::SetOnDragLeave(std::move(onDragLeave));
463 }
464
SetOnDrop(NG::OnDragDropFunc && onDrop)465 void TextModelNG::SetOnDrop(NG::OnDragDropFunc&& onDrop)
466 {
467 ViewAbstract::SetOnDrop(std::move(onDrop));
468 }
469
InitText(FrameNode * frameNode,std::string & value)470 void TextModelNG::InitText(FrameNode* frameNode, std::string& value)
471 {
472 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, Content, value, frameNode);
473 }
474
InitSpanStringController(FrameNode * frameNode,const RefPtr<SpanStringBase> & spanBase)475 void TextModelNG::InitSpanStringController(FrameNode* frameNode, const RefPtr<SpanStringBase>& spanBase)
476 {
477 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>(frameNode);
478 CHECK_NULL_VOID(textPattern);
479 auto spanString = AceType::DynamicCast<SpanString>(spanBase);
480 if (spanString) {
481 auto spans = spanString->GetSpanItems();
482 textPattern->SetSpanItemChildren(spans);
483 textPattern->SetSpanStringMode(true);
484 }
485 }
486
InitTextController(FrameNode * frameNode)487 RefPtr<TextControllerBase> TextModelNG::InitTextController(FrameNode* frameNode)
488 {
489 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>(frameNode);
490 CHECK_NULL_RETURN(textPattern, nullptr);
491 return textPattern->GetTextController();
492 }
493
SetTextCase(FrameNode * frameNode,Ace::TextCase value)494 void TextModelNG::SetTextCase(FrameNode* frameNode, Ace::TextCase value)
495 {
496 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextCase, value, frameNode);
497 }
498
SetMaxLines(FrameNode * frameNode,uint32_t value)499 void TextModelNG::SetMaxLines(FrameNode* frameNode, uint32_t value)
500 {
501 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MaxLines, value, frameNode);
502 }
503
SetAdaptMinFontSize(FrameNode * frameNode,const Dimension & value)504 void TextModelNG::SetAdaptMinFontSize(FrameNode* frameNode, const Dimension& value)
505 {
506 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMinFontSize, value, frameNode);
507 }
508
SetAdaptMaxFontSize(FrameNode * frameNode,const Dimension & value)509 void TextModelNG::SetAdaptMaxFontSize(FrameNode* frameNode, const Dimension& value)
510 {
511 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMaxFontSize, value, frameNode);
512 }
513
SetMinFontScale(FrameNode * frameNode,const float value)514 void TextModelNG::SetMinFontScale(FrameNode* frameNode, const float value)
515 {
516 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MinFontScale, value, frameNode);
517 }
518
SetMaxFontScale(FrameNode * frameNode,const float value)519 void TextModelNG::SetMaxFontScale(FrameNode* frameNode, const float value)
520 {
521 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MaxFontScale, value, frameNode);
522 }
523
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)524 void TextModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
525 {
526 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontFamily, value, frameNode);
527 }
528
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)529 void TextModelNG::SetCopyOption(FrameNode* frameNode, CopyOptions copyOption)
530 {
531 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, CopyOption, copyOption, frameNode);
532 }
533
SetTextShadow(FrameNode * frameNode,const std::vector<Shadow> & value)534 void TextModelNG::SetTextShadow(FrameNode* frameNode, const std::vector<Shadow>& value)
535 {
536 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextShadow, value, frameNode);
537 }
538
SetHeightAdaptivePolicy(FrameNode * frameNode,TextHeightAdaptivePolicy value)539 void TextModelNG::SetHeightAdaptivePolicy(FrameNode* frameNode, TextHeightAdaptivePolicy value)
540 {
541 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, HeightAdaptivePolicy, value, frameNode);
542 }
543
SetTextIndent(FrameNode * frameNode,const Dimension & value)544 void TextModelNG::SetTextIndent(FrameNode* frameNode, const Dimension& value)
545 {
546 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextIndent, value, frameNode);
547 }
548
SetBaselineOffset(FrameNode * frameNode,const Dimension & value)549 void TextModelNG::SetBaselineOffset(FrameNode* frameNode, const Dimension& value)
550 {
551 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, BaselineOffset, value, frameNode);
552 }
553
SetFont(FrameNode * frameNode,const Font & value)554 void TextModelNG::SetFont(FrameNode* frameNode, const Font& value)
555 {
556 if (value.fontSize.has_value()) {
557 SetFontSize(frameNode, value.fontSize.value());
558 }
559 if (value.fontWeight.has_value()) {
560 SetFontWeight(frameNode, value.fontWeight.value());
561 }
562 if (!value.fontFamilies.empty()) {
563 SetFontFamily(frameNode, value.fontFamilies);
564 }
565 if (value.fontStyle.has_value()) {
566 SetItalicFontStyle(frameNode, value.fontStyle.value());
567 }
568 SetEnableVariableFontWeight(frameNode, value.enableVariableFontWeight.value_or(false));
569 }
570
SetLetterSpacing(FrameNode * frameNode,const Dimension & value)571 void TextModelNG::SetLetterSpacing(FrameNode* frameNode, const Dimension& value)
572 {
573 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LetterSpacing, value, frameNode);
574 }
575
SetWordBreak(FrameNode * frameNode,Ace::WordBreak value)576 void TextModelNG::SetWordBreak(FrameNode* frameNode, Ace::WordBreak value)
577 {
578 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, WordBreak, value, frameNode);
579 }
580
SetLineBreakStrategy(FrameNode * frameNode,Ace::LineBreakStrategy value)581 void TextModelNG::SetLineBreakStrategy(FrameNode* frameNode, Ace::LineBreakStrategy value)
582 {
583 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineBreakStrategy, value, frameNode);
584 }
585
SetTextSelectableMode(FrameNode * frameNode,Ace::TextSelectableMode value)586 void TextModelNG::SetTextSelectableMode(FrameNode* frameNode, Ace::TextSelectableMode value)
587 {
588 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextSelectableMode, value, frameNode);
589 auto textPattern = frameNode->GetPattern<TextPattern>();
590 CHECK_NULL_VOID(textPattern);
591 textPattern->SetTextSelectableMode(value);
592 }
593
SetEllipsisMode(FrameNode * frameNode,Ace::EllipsisMode value)594 void TextModelNG::SetEllipsisMode(FrameNode* frameNode, Ace::EllipsisMode value)
595 {
596 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, EllipsisMode, value, frameNode);
597 }
598
SetTextDetectEnable(FrameNode * frameNode,bool value)599 void TextModelNG::SetTextDetectEnable(FrameNode* frameNode, bool value)
600 {
601 auto textPattern = frameNode->GetPattern<TextPattern>();
602 CHECK_NULL_VOID(textPattern);
603 textPattern->SetTextDetectEnable(value);
604 }
605
BindSelectionMenu(TextSpanType & spanType,TextResponseType & responseType,std::function<void ()> & buildFunc,SelectMenuParam & menuParam)606 void TextModelNG::BindSelectionMenu(TextSpanType& spanType, TextResponseType& responseType,
607 std::function<void()>& buildFunc, SelectMenuParam& menuParam)
608 {
609 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
610 CHECK_NULL_VOID(frameNode);
611 auto pattern = frameNode->GetPattern<TextPattern>();
612 if (pattern) {
613 pattern->BindSelectionMenu(spanType, responseType, buildFunc, menuParam.onAppear, menuParam.onDisappear);
614 }
615 }
616
SetOnTextSelectionChange(std::function<void (int32_t,int32_t)> && func)617 void TextModelNG::SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func)
618 {
619 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextEventHub>();
620 CHECK_NULL_VOID(eventHub);
621 eventHub->SetOnSelectionChange(std::move(func));
622 }
623
GetTextController()624 RefPtr<TextControllerBase> TextModelNG::GetTextController()
625 {
626 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
627 CHECK_NULL_RETURN(pattern, nullptr);
628 return pattern->GetTextController();
629 }
630
SetClipEdge(bool clip)631 void TextModelNG::SetClipEdge(bool clip)
632 {
633 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
634 CHECK_NULL_VOID(frameNode);
635 frameNode->GetRenderContext()->SetClipToFrame(clip);
636 frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
637 }
638
SetFontFeature(const FONT_FEATURES_LIST & value)639 void TextModelNG::SetFontFeature(const FONT_FEATURES_LIST& value)
640 {
641 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontFeature, value);
642 }
643
SetFontFeature(FrameNode * frameNode,const FONT_FEATURES_LIST & value)644 void TextModelNG::SetFontFeature(FrameNode* frameNode, const FONT_FEATURES_LIST& value)
645 {
646 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontFeature, value, frameNode);
647 }
648
GetContent(FrameNode * frameNode)649 std::string TextModelNG::GetContent(FrameNode* frameNode)
650 {
651 CHECK_NULL_RETURN(frameNode, "");
652 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
653 CHECK_NULL_RETURN(layoutProperty, "");
654 return layoutProperty->GetContent().value_or("");
655 }
656
GetLineHeight(FrameNode * frameNode)657 float TextModelNG::GetLineHeight(FrameNode* frameNode)
658 {
659 CHECK_NULL_RETURN(frameNode, 0.0f);
660 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
661 CHECK_NULL_RETURN(layoutProperty, 0.0f);
662 Dimension defaultLineHeight(0);
663 auto value = layoutProperty->GetLineHeight().value_or(defaultLineHeight);
664 return static_cast<float>(value.Value());
665 }
666
GetLineSpacing(FrameNode * frameNode)667 float TextModelNG::GetLineSpacing(FrameNode* frameNode)
668 {
669 CHECK_NULL_RETURN(frameNode, 0.0f);
670 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
671 CHECK_NULL_RETURN(layoutProperty, 0.0f);
672 Dimension defaultLineSpacing(0);
673 auto value = layoutProperty->GetLineSpacing().value_or(defaultLineSpacing);
674 return static_cast<float>(value.Value());
675 }
676
GetDecoration(FrameNode * frameNode)677 TextDecoration TextModelNG::GetDecoration(FrameNode* frameNode)
678 {
679 CHECK_NULL_RETURN(frameNode, TextDecoration::NONE);
680 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
681 CHECK_NULL_RETURN(layoutProperty, TextDecoration::NONE);
682 return layoutProperty->GetTextDecoration().value_or(TextDecoration::NONE);
683 }
684
GetTextDecorationColor(FrameNode * frameNode)685 Color TextModelNG::GetTextDecorationColor(FrameNode* frameNode)
686 {
687 CHECK_NULL_RETURN(frameNode, Color::BLACK);
688 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
689 CHECK_NULL_RETURN(layoutProperty, Color::BLACK);
690 return layoutProperty->GetTextDecorationColor().value_or(Color::BLACK);
691 }
692
GetTextDecorationStyle(FrameNode * frameNode)693 TextDecorationStyle TextModelNG::GetTextDecorationStyle(FrameNode* frameNode)
694 {
695 CHECK_NULL_RETURN(frameNode, TextDecorationStyle::SOLID);
696 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
697 CHECK_NULL_RETURN(layoutProperty, TextDecorationStyle::SOLID);
698 return layoutProperty->GetTextDecorationStyle().value_or(TextDecorationStyle::SOLID);
699 }
700
GetTextCase(FrameNode * frameNode)701 TextCase TextModelNG::GetTextCase(FrameNode* frameNode)
702 {
703 CHECK_NULL_RETURN(frameNode, TextCase::NORMAL);
704 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
705 CHECK_NULL_RETURN(layoutProperty, TextCase::NORMAL);
706 return layoutProperty->GetTextCase().value_or(TextCase::NORMAL);
707 }
708
GetLetterSpacing(FrameNode * frameNode)709 Dimension TextModelNG::GetLetterSpacing(FrameNode* frameNode)
710 {
711 Dimension defaultSpacing(0);
712 CHECK_NULL_RETURN(frameNode, defaultSpacing);
713 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
714 CHECK_NULL_RETURN(layoutProperty, defaultSpacing);
715 return layoutProperty->GetLetterSpacing().value_or(defaultSpacing);
716 }
717
GetMaxLines(FrameNode * frameNode)718 uint32_t TextModelNG::GetMaxLines(FrameNode* frameNode)
719 {
720 uint32_t defaultMaxLines = Infinity<uint32_t>();
721 CHECK_NULL_RETURN(frameNode, defaultMaxLines);
722 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
723 CHECK_NULL_RETURN(layoutProperty, defaultMaxLines);
724 auto& textLineStyle = layoutProperty->GetTextLineStyle();
725 CHECK_NULL_RETURN(textLineStyle, defaultMaxLines);
726 return textLineStyle->GetMaxLines().value_or(defaultMaxLines);
727 }
728
GetTextAlign(FrameNode * frameNode)729 TextAlign TextModelNG::GetTextAlign(FrameNode* frameNode)
730 {
731 CHECK_NULL_RETURN(frameNode, OHOS::Ace::TextAlign::START);
732 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
733 CHECK_NULL_RETURN(layoutProperty, OHOS::Ace::TextAlign::START);
734 auto& textLineStyle = layoutProperty->GetTextLineStyle();
735 CHECK_NULL_RETURN(textLineStyle, OHOS::Ace::TextAlign::START);
736 return textLineStyle->GetTextAlign().value_or(TextAlign::START);
737 }
738
GetTextOverflow(FrameNode * frameNode)739 TextOverflow TextModelNG::GetTextOverflow(FrameNode* frameNode)
740 {
741 CHECK_NULL_RETURN(frameNode, TextOverflow::CLIP);
742 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
743 CHECK_NULL_RETURN(layoutProperty, TextOverflow::CLIP);
744 auto& textLineStyle = layoutProperty->GetTextLineStyle();
745 CHECK_NULL_RETURN(textLineStyle, TextOverflow::CLIP);
746 return textLineStyle->GetTextOverflow().value_or(TextOverflow::CLIP);
747 }
748
GetTextIndent(FrameNode * frameNode)749 Dimension TextModelNG::GetTextIndent(FrameNode* frameNode)
750 {
751 Dimension defaultTextIndent(0);
752 CHECK_NULL_RETURN(frameNode, defaultTextIndent);
753 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
754 CHECK_NULL_RETURN(layoutProperty, defaultTextIndent);
755 auto& textLineStyle = layoutProperty->GetTextLineStyle();
756 CHECK_NULL_RETURN(textLineStyle, defaultTextIndent);
757 return textLineStyle->GetTextIndent().value_or(defaultTextIndent);
758 }
759
GetFontFamily(FrameNode * frameNode)760 std::vector<std::string> TextModelNG::GetFontFamily(FrameNode* frameNode)
761 {
762 std::vector<std::string> value;
763 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontFamily, value, frameNode, value);
764 return value;
765 }
766
GetCopyOption(FrameNode * frameNode)767 CopyOptions TextModelNG::GetCopyOption(FrameNode* frameNode)
768 {
769 CopyOptions value = CopyOptions::None;
770 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, CopyOption, value, frameNode, value);
771 return value;
772 }
773
GetHeightAdaptivePolicy(FrameNode * frameNode)774 TextHeightAdaptivePolicy TextModelNG::GetHeightAdaptivePolicy(FrameNode* frameNode)
775 {
776 TextHeightAdaptivePolicy value = TextHeightAdaptivePolicy::MAX_LINES_FIRST;
777 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, HeightAdaptivePolicy, value, frameNode, value);
778 return value;
779 }
780
GetAdaptMinFontSize(FrameNode * frameNode)781 Dimension TextModelNG::GetAdaptMinFontSize(FrameNode* frameNode)
782 {
783 Dimension value;
784 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
785 TextLayoutProperty, AdaptMinFontSize, value, frameNode, Dimension());
786 return value;
787 }
788
GetAdaptMaxFontSize(FrameNode * frameNode)789 Dimension TextModelNG::GetAdaptMaxFontSize(FrameNode* frameNode)
790 {
791 Dimension value;
792 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
793 TextLayoutProperty, AdaptMaxFontSize, value, frameNode, Dimension());
794 return value;
795 }
796
GetFont(FrameNode * frameNode)797 Font TextModelNG::GetFont(FrameNode* frameNode)
798 {
799 Font value;
800 value.fontSize = GetFontSize(frameNode);
801 value.fontWeight = GetFontWeight(frameNode);
802 value.fontFamilies = GetFontFamily(frameNode);
803 value.fontStyle = GetItalicFontStyle(frameNode);
804 return value;
805 }
806
GetFontSize(FrameNode * frameNode)807 Dimension TextModelNG::GetFontSize(FrameNode* frameNode)
808 {
809 Dimension value;
810 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontSize, value, frameNode, Dimension());
811 return value;
812 }
813
GetFontWeight(FrameNode * frameNode)814 Ace::FontWeight TextModelNG::GetFontWeight(FrameNode* frameNode)
815 {
816 Ace::FontWeight value = Ace::FontWeight::NORMAL;
817 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontWeight, value, frameNode, value);
818 return value;
819 }
820
GetItalicFontStyle(FrameNode * frameNode)821 Ace::FontStyle TextModelNG::GetItalicFontStyle(FrameNode* frameNode)
822 {
823 Ace::FontStyle value = Ace::FontStyle::NORMAL;
824 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, ItalicFontStyle, value, frameNode, value);
825 return value;
826 }
827
GetDefaultColor()828 Color TextModelNG::GetDefaultColor()
829 {
830 auto context = PipelineContext::GetCurrentContextSafely();
831 CHECK_NULL_RETURN(context, Color::BLACK);
832 auto theme = context->GetTheme<TextTheme>();
833 CHECK_NULL_RETURN(theme, Color::BLACK);
834 return theme->GetTextStyle().GetTextColor();
835 }
836
GetFontColor(FrameNode * frameNode)837 Color TextModelNG::GetFontColor(FrameNode* frameNode)
838 {
839 auto defaultColor = GetDefaultColor();
840 CHECK_NULL_RETURN(frameNode, defaultColor);
841 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
842 CHECK_NULL_RETURN(layoutProperty, defaultColor);
843 return layoutProperty->GetTextColor().value_or(defaultColor);
844 }
845
GetTextBaselineOffset(FrameNode * frameNode)846 Dimension TextModelNG::GetTextBaselineOffset(FrameNode* frameNode)
847 {
848 Dimension defaultOffset(0);
849 CHECK_NULL_RETURN(frameNode, defaultOffset);
850 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
851 CHECK_NULL_RETURN(layoutProperty, defaultOffset);
852 return layoutProperty->GetBaselineOffset().value_or(defaultOffset);
853 }
854
GetTextShadow(FrameNode * frameNode)855 std::vector<Shadow> TextModelNG::GetTextShadow(FrameNode* frameNode)
856 {
857 std::vector<Shadow> defaultShadow;
858 CHECK_NULL_RETURN(frameNode, defaultShadow);
859 auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
860 CHECK_NULL_RETURN(layoutProperty, defaultShadow);
861 return layoutProperty->GetTextShadow().value_or(defaultShadow);
862 }
863
GetWordBreak(FrameNode * frameNode)864 Ace::WordBreak TextModelNG::GetWordBreak(FrameNode* frameNode)
865 {
866 Ace::WordBreak value = Ace::WordBreak::BREAK_WORD;
867 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, WordBreak, value, frameNode, value);
868 return value;
869 }
870
GetEllipsisMode(FrameNode * frameNode)871 EllipsisMode TextModelNG::GetEllipsisMode(FrameNode* frameNode)
872 {
873 EllipsisMode value = EllipsisMode::TAIL;
874 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, EllipsisMode, value, frameNode, value);
875 return value;
876 }
877
GetTextDetectEnable(FrameNode * frameNode)878 bool TextModelNG::GetTextDetectEnable(FrameNode* frameNode)
879 {
880 auto textPattern = frameNode->GetPattern<TextPattern>();
881 CHECK_NULL_RETURN(textPattern, false);
882 return textPattern->GetTextDetectEnable();
883 }
884
SetTextDetectConfig(FrameNode * frameNode,const std::string & value)885 void TextModelNG::SetTextDetectConfig(FrameNode* frameNode, const std::string& value)
886 {
887 CHECK_NULL_VOID(frameNode);
888 auto textPattern = frameNode->GetPattern<TextPattern>();
889 CHECK_NULL_VOID(textPattern);
890 textPattern->SetTextDetectTypes(value);
891 }
892
SetOnClick(FrameNode * frameNode,GestureEventFunc && click)893 void TextModelNG::SetOnClick(FrameNode* frameNode, GestureEventFunc&& click)
894 {
895 CHECK_NULL_VOID(frameNode);
896 auto textPattern = frameNode->GetPattern<TextPattern>();
897 CHECK_NULL_VOID(textPattern);
898 textPattern->SetOnClickEvent(std::move(click));
899 }
900
ClearOnClick(FrameNode * frameNode)901 void TextModelNG::ClearOnClick(FrameNode* frameNode)
902 {
903 CHECK_NULL_VOID(frameNode);
904 auto textPattern = frameNode->GetPattern<TextPattern>();
905 CHECK_NULL_VOID(textPattern);
906 textPattern->SetOnClickEvent(nullptr);
907 }
908
SetOnDetectResultUpdate(FrameNode * frameNode,std::function<void (const std::string &)> && onResult)909 void TextModelNG::SetOnDetectResultUpdate(FrameNode* frameNode, std::function<void(const std::string&)>&& onResult)
910 {
911 CHECK_NULL_VOID(frameNode);
912 auto textPattern = frameNode->GetPattern<TextPattern>();
913 CHECK_NULL_VOID(textPattern);
914 textPattern->SetOnResult(std::move(onResult));
915 }
916
GetTextDetectConfig(FrameNode * frameNode)917 std::string TextModelNG::GetTextDetectConfig(FrameNode* frameNode)
918 {
919 CHECK_NULL_RETURN(frameNode, "");
920 auto textPattern = frameNode->GetPattern<TextPattern>();
921 CHECK_NULL_RETURN(textPattern, "");
922 return textPattern->GetTextDetectTypes();
923 }
924
GetFontFeature(FrameNode * frameNode)925 FONT_FEATURES_LIST TextModelNG::GetFontFeature(FrameNode* frameNode)
926 {
927 FONT_FEATURES_LIST value;
928 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontFeature, value, frameNode, value);
929 return value;
930 }
931
GetTextSelectableMode(FrameNode * frameNode)932 TextSelectableMode TextModelNG::GetTextSelectableMode(FrameNode* frameNode)
933 {
934 TextSelectableMode value = TextSelectableMode::SELECTABLE_UNFOCUSABLE;
935 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, TextSelectableMode, value, frameNode, value);
936 return value;
937 }
938
SetSelectedBackgroundColor(FrameNode * frameNode,const Color & value)939 void TextModelNG::SetSelectedBackgroundColor(FrameNode* frameNode, const Color& value)
940 {
941 Color color = value;
942 if (color.GetAlpha() == DEFAULT_ALPHA) {
943 // Default setting of 20% opacity
944 color = color.ChangeOpacity(DEFAULT_OPACITY);
945 }
946 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, SelectedBackgroundColor, color, frameNode);
947 }
948
GetSelectedBackgroundColor(FrameNode * frameNode)949 Color TextModelNG::GetSelectedBackgroundColor(FrameNode* frameNode)
950 {
951 auto context = PipelineContext::GetCurrentContextSafely();
952 CHECK_NULL_RETURN(context, Color::BLACK);
953 auto theme = context->GetTheme<TextTheme>();
954 CHECK_NULL_RETURN(theme, Color::BLACK);
955 Color value = theme->GetSelectedColor();
956 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, SelectedBackgroundColor, value, frameNode,
957 value);
958 return value;
959 }
960
ResetSelectedBackgroundColor(FrameNode * frameNode)961 void TextModelNG::ResetSelectedBackgroundColor(FrameNode* frameNode)
962 {
963 CHECK_NULL_VOID(frameNode);
964 auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
965 if (textLayoutProperty) {
966 textLayoutProperty->ResetSelectedBackgroundColor();
967 }
968 }
969
GetLineBreakStrategy(FrameNode * frameNode)970 LineBreakStrategy TextModelNG::GetLineBreakStrategy(FrameNode* frameNode)
971 {
972 LineBreakStrategy value = LineBreakStrategy::GREEDY;
973 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, LineBreakStrategy, value, frameNode, value);
974 return value;
975 }
976
SetTextContentWithStyledString(FrameNode * frameNode,ArkUI_StyledString * value)977 void TextModelNG::SetTextContentWithStyledString(FrameNode* frameNode, ArkUI_StyledString* value)
978 {
979 CHECK_NULL_VOID(frameNode);
980 auto textPattern = frameNode->GetPattern<TextPattern>();
981 CHECK_NULL_VOID(textPattern);
982 std::list<RefPtr<SpanItem>> spanItems;
983 if (!value) {
984 textPattern->SetExternalParagraph(nullptr);
985 textPattern->SetExternalSpanItem(spanItems);
986 textPattern->SetExternalParagraphStyle(std::nullopt);
987 } else {
988 textPattern->SetExternalParagraph(value->paragraph);
989 #ifdef USE_GRAPHIC_TEXT_GINE
990 auto position = 0;
991 for (const auto& item : value->items) {
992 auto spanItem = SpanModelNG::CreateSpanItem(item);
993 if (spanItem) {
994 auto wSpanContent = StringUtils::ToWstring(spanItem->content);
995 auto intervalStart = position;
996 position += static_cast<int32_t>(wSpanContent.length());
997 auto intervalEnd = position;
998 spanItem->interval = { intervalStart, intervalEnd };
999 spanItem->position = position;
1000 spanItems.emplace_back(spanItem);
1001 }
1002 }
1003 textPattern->SetExternalSpanItem(spanItems);
1004 textPattern->SetExternalParagraphStyle(SpanModelNG::CreateParagraphStyle(value));
1005 #endif
1006 }
1007 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1008 }
1009
SetTextSelection(FrameNode * frameNode,int32_t startIndex,int32_t endIndex)1010 void TextModelNG::SetTextSelection(FrameNode* frameNode, int32_t startIndex, int32_t endIndex)
1011 {
1012 CHECK_NULL_VOID(frameNode);
1013 auto textPattern = frameNode->GetPattern<TextPattern>();
1014 CHECK_NULL_VOID(textPattern);
1015 textPattern->SetTextSelection(startIndex, endIndex);
1016 }
1017
SetTextDetectConfig(FrameNode * frameNode,const TextDetectConfig & textDetectConfig)1018 void TextModelNG::SetTextDetectConfig(FrameNode* frameNode, const TextDetectConfig& textDetectConfig)
1019 {
1020 CHECK_NULL_VOID(frameNode);
1021 auto textPattern = frameNode->GetPattern<TextPattern>();
1022 CHECK_NULL_VOID(textPattern);
1023 textPattern->SetTextDetectConfig(textDetectConfig);
1024 }
1025
SetOnCopy(FrameNode * frameNode,std::function<void (const std::string &)> && func)1026 void TextModelNG::SetOnCopy(FrameNode* frameNode, std::function<void(const std::string&)>&& func)
1027 {
1028 CHECK_NULL_VOID(frameNode);
1029 auto eventHub = frameNode->GetEventHub<TextEventHub>();
1030 CHECK_NULL_VOID(eventHub);
1031 eventHub->SetOnCopy(std::move(func));
1032 }
1033
SetOnTextSelectionChange(FrameNode * frameNode,std::function<void (int32_t,int32_t)> && func)1034 void TextModelNG::SetOnTextSelectionChange(FrameNode* frameNode, std::function<void(int32_t, int32_t)>&& func)
1035 {
1036 CHECK_NULL_VOID(frameNode);
1037 auto eventHub = frameNode->GetEventHub<TextEventHub>();
1038 CHECK_NULL_VOID(eventHub);
1039 eventHub->SetOnSelectionChange(std::move(func));
1040 }
1041
SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)1042 void TextModelNG::SetSelectionMenuOptions(
1043 const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick)
1044 {
1045 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1046 CHECK_NULL_VOID(textPattern);
1047 textPattern->OnSelectionMenuOptionsUpdate(std::move(onCreateMenuCallback), std::move(onMenuItemClick));
1048 }
1049
SetSelectionMenuOptions(FrameNode * frameNode,const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)1050 void TextModelNG::SetSelectionMenuOptions(FrameNode* frameNode, const NG::OnCreateMenuCallback&& onCreateMenuCallback,
1051 const NG::OnMenuItemClickCallback&& onMenuItemClick)
1052 {
1053 CHECK_NULL_VOID(frameNode);
1054 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1055 CHECK_NULL_VOID(textPattern);
1056 textPattern->OnSelectionMenuOptionsUpdate(std::move(onCreateMenuCallback), std::move(onMenuItemClick));
1057 }
1058
SetResponseRegion(bool isUserSetResponseRegion)1059 void TextModelNG::SetResponseRegion(bool isUserSetResponseRegion)
1060 {
1061 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1062 CHECK_NULL_VOID(textPattern);
1063 textPattern->SetIsUserSetResponseRegion(isUserSetResponseRegion);
1064 }
1065
SetResponseRegion(FrameNode * frameNode,std::vector<DimensionRect> regions)1066 void TextModelNG::SetResponseRegion(FrameNode* frameNode, std::vector<DimensionRect> regions)
1067 {
1068 CHECK_NULL_VOID(frameNode);
1069 auto textPattern = frameNode->GetPattern<TextPattern>();
1070 CHECK_NULL_VOID(textPattern);
1071 auto gesture = frameNode->GetOrCreateGestureEventHub();
1072 CHECK_NULL_VOID(gesture);
1073 gesture->SetResponseRegion(regions);
1074 textPattern->SetIsUserSetResponseRegion(true);
1075 }
1076
ClearResponseRegion(FrameNode * frameNode)1077 void TextModelNG::ClearResponseRegion(FrameNode* frameNode)
1078 {
1079 CHECK_NULL_VOID(frameNode);
1080 auto textPattern = frameNode->GetPattern<TextPattern>();
1081 CHECK_NULL_VOID(textPattern);
1082 auto gesture = frameNode->GetOrCreateGestureEventHub();
1083 CHECK_NULL_VOID(gesture);
1084 std::vector<DimensionRect> region;
1085 CalcDimension xDimen = CalcDimension(0.0, DimensionUnit::VP);
1086 CalcDimension yDimen = CalcDimension(0.0, DimensionUnit::VP);
1087 CalcDimension widthDimen = CalcDimension(1, DimensionUnit::PERCENT);
1088 CalcDimension heightDimen = CalcDimension(1, DimensionUnit::PERCENT);
1089 DimensionOffset offsetDimen(xDimen, yDimen);
1090 DimensionRect dimenRect(widthDimen, heightDimen, offsetDimen);
1091 region.emplace_back(dimenRect);
1092 gesture->SetResponseRegion(region);
1093 textPattern->SetIsUserSetResponseRegion(false);
1094 }
1095
SetHalfLeading(bool halfLeading)1096 void TextModelNG::SetHalfLeading(bool halfLeading)
1097 {
1098 ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, HalfLeading, halfLeading);
1099 }
1100
SetHalfLeading(FrameNode * frameNode,bool halfLeading)1101 void TextModelNG::SetHalfLeading(FrameNode* frameNode, bool halfLeading)
1102 {
1103 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, HalfLeading, halfLeading, frameNode);
1104 }
1105
GetHalfLeading(FrameNode * frameNode)1106 bool TextModelNG::GetHalfLeading(FrameNode* frameNode)
1107 {
1108 bool value = false;
1109 ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, HalfLeading, value, frameNode, value);
1110 return value;
1111 }
1112
SetEnableHapticFeedback(bool state)1113 void TextModelNG::SetEnableHapticFeedback(bool state)
1114 {
1115 auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1116 CHECK_NULL_VOID(textPattern);
1117 textPattern->SetEnableHapticFeedback(state);
1118 }
1119 } // namespace OHOS::Ace::NG