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