• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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