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