• 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         layout->UpdateContent(content);
93     }
94     // set draggable for framenode
95     if (isFirstBuild) {
96         auto pipeline = frameNode->GetContext();
97         CHECK_NULL_RETURN(pipeline, nullptr);
98         auto draggable = pipeline->GetDraggable<TextTheme>();
99         frameNode->SetDraggable(draggable);
100         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
101         CHECK_NULL_RETURN(gestureHub, nullptr);
102         gestureHub->SetTextDraggable(true);
103     }
104 
105     auto textPattern = frameNode->GetPattern<TextPattern>();
106     textPattern->SetTextController(AceType::MakeRefPtr<TextController>());
107     textPattern->GetTextController()->SetPattern(WeakPtr(textPattern));
108     textPattern->ClearSelectionMenu();
109     return frameNode;
110 }
111 
SetFont(const Font & value)112 void TextModelNG::SetFont(const Font& value)
113 {
114     if (value.fontSize.has_value()) {
115         SetFontSize(value.fontSize.value());
116     }
117     if (value.fontWeight.has_value()) {
118         SetFontWeight(value.fontWeight.value());
119     }
120     if (!value.fontFamilies.empty()) {
121         SetFontFamily(value.fontFamilies);
122     }
123     if (value.fontStyle.has_value()) {
124         SetItalicFontStyle(value.fontStyle.value());
125     }
126     SetEnableVariableFontWeight(value.enableVariableFontWeight.value_or(false));
127 }
128 
SetFontSize(const Dimension & value)129 void TextModelNG::SetFontSize(const Dimension& value)
130 {
131     if (!value.IsValid()) {
132         ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, Dimension());
133         return;
134     }
135     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, value);
136 }
137 
SetFontSize(FrameNode * frameNode,const Dimension & value)138 void TextModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
139 {
140     if (!value.IsValid()) {
141         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, Dimension(), frameNode);
142         return;
143     }
144     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontSize, value, frameNode);
145 }
146 
SetTextColor(const Color & value)147 void TextModelNG::SetTextColor(const Color& value)
148 {
149     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150     CHECK_NULL_VOID(frameNode);
151     auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
152     CHECK_NULL_VOID(textLayoutProperty);
153     textLayoutProperty->UpdateTextColorByRender(value);
154     ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value);
155     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy);
156     ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true);
157     auto textPattern = frameNode->GetPattern<TextPattern>();
158     CHECK_NULL_VOID(textPattern);
159     textPattern->UpdateFontColor(value);
160     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextColorFlagByUser, true);
161 }
162 
ResetTextColor()163 void TextModelNG::ResetTextColor()
164 {
165     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(TextLayoutProperty, TextColor, PROPERTY_UPDATE_RENDER);
166     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextColorFlagByUser, false);
167     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColor);
168     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy);
169     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorFlag);
170     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
171     CHECK_NULL_VOID(frameNode);
172     auto textPattern = frameNode->GetPattern<TextPattern>();
173     CHECK_NULL_VOID(textPattern);
174     textPattern->ResetCustomFontColor();
175 }
176 
SetTextColor(FrameNode * frameNode,const Color & value)177 void TextModelNG::SetTextColor(FrameNode* frameNode, const Color& value)
178 {
179     CHECK_NULL_VOID(frameNode);
180     auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
181     CHECK_NULL_VOID(textLayoutProperty);
182     textLayoutProperty->UpdateTextColorByRender(value);
183     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, value, frameNode);
184     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode);
185     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode);
186     auto textPattern = frameNode->GetPattern<TextPattern>();
187     CHECK_NULL_VOID(textPattern);
188     textPattern->UpdateFontColor(value);
189     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextColorFlagByUser, true, frameNode);
190 }
191 
ResetTextColor(FrameNode * frameNode)192 void TextModelNG::ResetTextColor(FrameNode* frameNode)
193 {
194     CHECK_NULL_VOID(frameNode);
195     ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(TextLayoutProperty, TextColor, PROPERTY_UPDATE_RENDER, frameNode);
196     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextColorFlagByUser, false, frameNode);
197     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColor, frameNode);
198     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode);
199     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorFlag, frameNode);
200     auto textPattern = frameNode->GetPattern<TextPattern>();
201     CHECK_NULL_VOID(textPattern);
202     textPattern->ResetCustomFontColor();
203 }
204 
SetTextShadow(const std::vector<Shadow> & value)205 void TextModelNG::SetTextShadow(const std::vector<Shadow>& value)
206 {
207     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextShadow, value);
208     CHECK_NULL_VOID(SystemProperties::ConfigChangePerform());
209     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
210     CHECK_NULL_VOID(frameNode);
211     auto pattern = frameNode->GetPattern();
212     CHECK_NULL_VOID(pattern);
213     RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
214     auto&& updateFunc = [value, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
215         auto frameNode = weak.Upgrade();
216         if (!frameNode) {
217             return;
218         }
219         for (auto& shadow : value) {
220             Shadow& shadowValue = const_cast<Shadow&>(shadow);
221             shadowValue.ReloadResources();
222         }
223         ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextShadow, value, frameNode);
224     };
225     pattern->AddResObj("textShadow", resObj, std::move(updateFunc));
226 }
227 
SetItalicFontStyle(Ace::FontStyle value)228 void TextModelNG::SetItalicFontStyle(Ace::FontStyle value)
229 {
230     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, ItalicFontStyle, value);
231 }
232 
SetItalicFontStyle(FrameNode * frameNode,Ace::FontStyle value)233 void TextModelNG::SetItalicFontStyle(FrameNode* frameNode, Ace::FontStyle value)
234 {
235     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, ItalicFontStyle, value, frameNode);
236 }
237 
SetFontWeight(FrameNode * frameNode,Ace::FontWeight value)238 void TextModelNG::SetFontWeight(FrameNode* frameNode, Ace::FontWeight value)
239 {
240     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontWeight, value, frameNode);
241 }
242 
SetVariableFontWeight(FrameNode * frameNode,int32_t value)243 void TextModelNG::SetVariableFontWeight(FrameNode* frameNode, int32_t value)
244 {
245     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, VariableFontWeight, value, frameNode);
246 }
247 
SetEnableVariableFontWeight(FrameNode * frameNode,bool value)248 void TextModelNG::SetEnableVariableFontWeight(FrameNode* frameNode, bool value)
249 {
250     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, EnableVariableFontWeight, value, frameNode);
251 }
252 
SetMinFontScale(const float value)253 void TextModelNG::SetMinFontScale(const float value)
254 {
255     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MinFontScale, value);
256 }
257 
SetMaxFontScale(const float value)258 void TextModelNG::SetMaxFontScale(const float value)
259 {
260     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MaxFontScale, value);
261 }
262 
SetFontWeight(Ace::FontWeight value)263 void TextModelNG::SetFontWeight(Ace::FontWeight value)
264 {
265     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontWeight, value);
266 }
267 
SetVariableFontWeight(int32_t value)268 void TextModelNG::SetVariableFontWeight(int32_t value)
269 {
270     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, VariableFontWeight, value);
271 }
272 
SetEnableVariableFontWeight(bool value)273 void TextModelNG::SetEnableVariableFontWeight(bool value)
274 {
275     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, EnableVariableFontWeight, value);
276 }
277 
SetFontFamily(const std::vector<std::string> & value)278 void TextModelNG::SetFontFamily(const std::vector<std::string>& value)
279 {
280     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontFamily, value);
281 }
282 
SetWordBreak(Ace::WordBreak value)283 void TextModelNG::SetWordBreak(Ace::WordBreak value)
284 {
285     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, WordBreak, value);
286 }
287 
SetLineBreakStrategy(Ace::LineBreakStrategy value)288 void TextModelNG::SetLineBreakStrategy(Ace::LineBreakStrategy value)
289 {
290     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineBreakStrategy, value);
291 }
292 
SetTextSelectableMode(Ace::TextSelectableMode value)293 void TextModelNG::SetTextSelectableMode(Ace::TextSelectableMode value)
294 {
295     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextSelectableMode, value);
296     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
297     CHECK_NULL_VOID(frameNode);
298     auto textPattern = frameNode->GetPattern<TextPattern>();
299     CHECK_NULL_VOID(textPattern);
300     textPattern->SetTextSelectableMode(value);
301 }
302 
SetEllipsisMode(EllipsisMode value)303 void TextModelNG::SetEllipsisMode(EllipsisMode value)
304 {
305     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, EllipsisMode, value);
306 }
307 
SetTextAlign(Ace::TextAlign value)308 void TextModelNG::SetTextAlign(Ace::TextAlign value)
309 {
310     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextAlign, value);
311 }
312 
SetTextAlign(FrameNode * frameNode,Ace::TextAlign value)313 void TextModelNG::SetTextAlign(FrameNode* frameNode, Ace::TextAlign value)
314 {
315     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextAlign, value, frameNode);
316 }
317 
SetTextOverflow(Ace::TextOverflow value)318 void TextModelNG::SetTextOverflow(Ace::TextOverflow value)
319 {
320     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextOverflow, value);
321 }
322 
SetTextOverflow(FrameNode * frameNode,Ace::TextOverflow value)323 void TextModelNG::SetTextOverflow(FrameNode* frameNode, Ace::TextOverflow value)
324 {
325     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextOverflow, value, frameNode);
326 }
327 
SetMaxLines(uint32_t value)328 void TextModelNG::SetMaxLines(uint32_t value)
329 {
330     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, MaxLines, value);
331 }
332 
SetTextIndent(const Dimension & value)333 void TextModelNG::SetTextIndent(const Dimension& value)
334 {
335     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextIndent, value);
336 }
337 
SetLineHeight(const Dimension & value)338 void TextModelNG::SetLineHeight(const Dimension& value)
339 {
340     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineHeight, value);
341 }
342 
SetLineHeight(FrameNode * frameNode,const Dimension & value)343 void TextModelNG::SetLineHeight(FrameNode* frameNode, const Dimension& value)
344 {
345     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineHeight, value, frameNode);
346 }
347 
SetLineSpacing(const Dimension & value)348 void TextModelNG::SetLineSpacing(const Dimension& value)
349 {
350     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineSpacing, value);
351 }
352 
SetLineSpacing(FrameNode * frameNode,const Dimension & value,bool isOnlyBetweenLines)353 void TextModelNG::SetLineSpacing(FrameNode* frameNode, const Dimension& value, bool isOnlyBetweenLines)
354 {
355     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineSpacing, value, frameNode);
356     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, IsOnlyBetweenLines, isOnlyBetweenLines, frameNode);
357 }
358 
SetIsOnlyBetweenLines(bool isOnlyBetweenLines)359 void TextModelNG::SetIsOnlyBetweenLines(bool isOnlyBetweenLines)
360 {
361     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, IsOnlyBetweenLines, isOnlyBetweenLines);
362 }
363 
SetTextDecoration(Ace::TextDecoration value)364 void TextModelNG::SetTextDecoration(Ace::TextDecoration value)
365 {
366     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecoration, {value});
367 }
368 
SetTextDecoration(FrameNode * frameNode,TextDecoration value)369 void TextModelNG::SetTextDecoration(FrameNode* frameNode, TextDecoration value)
370 {
371     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecoration, {value}, frameNode);
372 }
373 
SetTextDecorationColor(const Color & value)374 void TextModelNG::SetTextDecorationColor(const Color& value)
375 {
376     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationColor, value);
377 }
378 
SetTextDecorationColor(FrameNode * frameNode,const Color & value)379 void TextModelNG::SetTextDecorationColor(FrameNode* frameNode, const Color& value)
380 {
381     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationColor, value, frameNode);
382 }
383 
SetTextDecorationStyle(Ace::TextDecorationStyle value)384 void TextModelNG::SetTextDecorationStyle(Ace::TextDecorationStyle value)
385 {
386     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationStyle, value);
387 }
388 
SetTextDecorationStyle(FrameNode * frameNode,TextDecorationStyle value)389 void TextModelNG::SetTextDecorationStyle(FrameNode* frameNode, TextDecorationStyle value)
390 {
391     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextDecorationStyle, value, frameNode);
392 }
393 
SetLineThicknessScale(float value)394 void TextModelNG::SetLineThicknessScale(float value)
395 {
396     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LineThicknessScale, value);
397 }
398 
SetLineThicknessScale(FrameNode * frameNode,float value)399 void TextModelNG::SetLineThicknessScale(FrameNode* frameNode, float value)
400 {
401     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineThicknessScale, value, frameNode);
402 }
403 
SetBaselineOffset(const Dimension & value)404 void TextModelNG::SetBaselineOffset(const Dimension& value)
405 {
406     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, BaselineOffset, value);
407 }
408 
SetTextCase(Ace::TextCase value)409 void TextModelNG::SetTextCase(Ace::TextCase value)
410 {
411     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextCase, value);
412 }
413 
SetLetterSpacing(const Dimension & value)414 void TextModelNG::SetLetterSpacing(const Dimension& value)
415 {
416     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, LetterSpacing, value);
417 }
418 
SetAdaptMinFontSize(const Dimension & value)419 void TextModelNG::SetAdaptMinFontSize(const Dimension& value)
420 {
421     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMinFontSize, value);
422 }
423 
SetAdaptMaxFontSize(const Dimension & value)424 void TextModelNG::SetAdaptMaxFontSize(const Dimension& value)
425 {
426     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMaxFontSize, value);
427 }
428 
SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)429 void TextModelNG::SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)
430 {
431     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, HeightAdaptivePolicy, value);
432 }
433 
SetContentTransition(TextEffectStrategy value,TextFlipDirection direction,bool enableBlur)434 void TextModelNG::SetContentTransition(TextEffectStrategy value, TextFlipDirection direction, bool enableBlur)
435 {
436     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextEffectStrategy, value);
437     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipDirection, direction);
438     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipEnableBlur, enableBlur);
439 }
440 
ResetContentTransition()441 void TextModelNG::ResetContentTransition()
442 {
443     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(TextLayoutProperty, TextEffectStrategy, PROPERTY_UPDATE_MEASURE_SELF);
444     ACE_RESET_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipDirection);
445     ACE_RESET_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipEnableBlur);
446 }
447 
SetTextDetectEnable(bool value)448 void TextModelNG::SetTextDetectEnable(bool value)
449 {
450     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
451     CHECK_NULL_VOID(frameNode);
452     auto textPattern = frameNode->GetPattern<TextPattern>();
453     CHECK_NULL_VOID(textPattern);
454     textPattern->SetTextDetectEnable(value);
455 }
456 
SetTextDetectConfig(const TextDetectConfig & textDetectConfig)457 void TextModelNG::SetTextDetectConfig(const TextDetectConfig& textDetectConfig)
458 {
459     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
460     CHECK_NULL_VOID(frameNode);
461     auto textPattern = frameNode->GetPattern<TextPattern>();
462     CHECK_NULL_VOID(textPattern);
463     textPattern->SetTextDetectConfig(textDetectConfig);
464     CHECK_NULL_VOID(SystemProperties::ConfigChangePerform());
465     RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
466     auto&& updateFunc = [textDetectConfig, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
467         auto frameNode = weak.Upgrade();
468         if (!frameNode) {
469             return;
470         }
471         auto textPattern = frameNode->GetPattern<TextPattern>();
472         CHECK_NULL_VOID(textPattern);
473         TextDetectConfig& textDetectConfigValue = const_cast<TextDetectConfig&>(textDetectConfig);
474         textDetectConfigValue.ReloadResources();
475         textPattern->SetTextDetectConfig(textDetectConfig);
476     };
477     textPattern->AddResObj("dataDetectorConfig", resObj, std::move(updateFunc));
478 }
479 
SetOnClick(std::function<void (BaseEventInfo * info)> && click,double distanceThreshold)480 void TextModelNG::SetOnClick(std::function<void(BaseEventInfo* info)>&& click, double distanceThreshold)
481 {
482     auto clickFunc = [func = std::move(click)](GestureEvent& info) { func(&info); };
483     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
484     CHECK_NULL_VOID(frameNode);
485     auto textPattern = frameNode->GetPattern<TextPattern>();
486     CHECK_NULL_VOID(textPattern);
487     textPattern->SetOnClickEvent(std::move(clickFunc), distanceThreshold);
488     auto* uiNode = reinterpret_cast<UINode*>(frameNode);
489     CHECK_NULL_VOID(uiNode);
490     uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true);
491 }
492 
ClearOnClick()493 void TextModelNG::ClearOnClick()
494 {
495     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
496     CHECK_NULL_VOID(frameNode);
497     auto textPattern = frameNode->GetPattern<TextPattern>();
498     CHECK_NULL_VOID(textPattern);
499     textPattern->SetOnClickEvent(nullptr);
500 }
501 
SetRemoteMessage(std::function<void ()> && event)502 void TextModelNG::SetRemoteMessage(std::function<void()>&& event) {}
503 
SetCopyOption(CopyOptions copyOption)504 void TextModelNG::SetCopyOption(CopyOptions copyOption)
505 {
506     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, CopyOption, copyOption);
507 }
508 
SetOnCopy(std::function<void (const std::u16string &)> && func)509 void TextModelNG::SetOnCopy(std::function<void(const std::u16string&)>&& func)
510 {
511     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextEventHub>();
512     CHECK_NULL_VOID(eventHub);
513     eventHub->SetOnCopy(std::move(func));
514 }
515 
SetTextSelection(int32_t startIndex,int32_t endIndex)516 void TextModelNG::SetTextSelection(int32_t startIndex, int32_t endIndex)
517 {
518     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
519     CHECK_NULL_VOID(frameNode);
520     auto textPattern = frameNode->GetPattern<TextPattern>();
521     CHECK_NULL_VOID(textPattern);
522     textPattern->SetTextSelection(startIndex, endIndex);
523 }
524 
SetTextCaretColor(const Color & value)525 void TextModelNG::SetTextCaretColor(const Color& value)
526 {
527     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, CursorColor, value);
528 }
529 
SetSelectedBackgroundColor(const Color & value)530 void TextModelNG::SetSelectedBackgroundColor(const Color& value)
531 {
532     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, SelectedBackgroundColor, value);
533 }
534 
SetOnDragStart(NG::OnDragStartFunc && onDragStart)535 void TextModelNG::SetOnDragStart(NG::OnDragStartFunc&& onDragStart)
536 {
537     auto dragStart = [dragStartFunc = std::move(onDragStart)](
538                          const RefPtr<OHOS::Ace::DragEvent>& event, const std::string& extraParams) -> DragDropInfo {
539         auto dragInfo = dragStartFunc(event, extraParams);
540         DragDropInfo info;
541         info.extraInfo = dragInfo.extraInfo;
542         info.pixelMap = dragInfo.pixelMap;
543         info.customNode = AceType::DynamicCast<UINode>(dragInfo.node);
544         return info;
545     };
546     ViewAbstract::SetOnDragStart(std::move(dragStart));
547 }
548 
InitText(FrameNode * frameNode,std::u16string & value)549 void TextModelNG::InitText(FrameNode* frameNode, std::u16string& value)
550 {
551     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, Content, value, frameNode);
552 }
553 
InitSpanStringController(FrameNode * frameNode,const RefPtr<SpanStringBase> & spanBase)554 void TextModelNG::InitSpanStringController(FrameNode* frameNode, const RefPtr<SpanStringBase>& spanBase)
555 {
556     auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>(frameNode);
557     CHECK_NULL_VOID(textPattern);
558     auto spanString = AceType::DynamicCast<SpanString>(spanBase);
559     if (spanString) {
560         auto spans = spanString->GetSpanItems();
561         textPattern->SetSpanItemChildren(spans);
562         textPattern->SetSpanStringMode(true);
563     }
564 }
565 
InitTextController(FrameNode * frameNode)566 RefPtr<TextControllerBase> TextModelNG::InitTextController(FrameNode* frameNode)
567 {
568     auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>(frameNode);
569     CHECK_NULL_RETURN(textPattern, nullptr);
570     return textPattern->GetTextController();
571 }
572 
SetTextCase(FrameNode * frameNode,Ace::TextCase value)573 void TextModelNG::SetTextCase(FrameNode* frameNode, Ace::TextCase value)
574 {
575     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextCase, value, frameNode);
576 }
577 
SetMaxLines(FrameNode * frameNode,uint32_t value)578 void TextModelNG::SetMaxLines(FrameNode* frameNode, uint32_t value)
579 {
580     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MaxLines, value, frameNode);
581 }
582 
SetAdaptMinFontSize(FrameNode * frameNode,const Dimension & value)583 void TextModelNG::SetAdaptMinFontSize(FrameNode* frameNode, const Dimension& value)
584 {
585     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMinFontSize, value, frameNode);
586 }
587 
SetAdaptMaxFontSize(FrameNode * frameNode,const Dimension & value)588 void TextModelNG::SetAdaptMaxFontSize(FrameNode* frameNode, const Dimension& value)
589 {
590     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, AdaptMaxFontSize, value, frameNode);
591 }
592 
SetMinFontScale(FrameNode * frameNode,const float value)593 void TextModelNG::SetMinFontScale(FrameNode* frameNode, const float value)
594 {
595     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MinFontScale, value, frameNode);
596 }
597 
SetMaxFontScale(FrameNode * frameNode,const float value)598 void TextModelNG::SetMaxFontScale(FrameNode* frameNode, const float value)
599 {
600     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, MaxFontScale, value, frameNode);
601 }
602 
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)603 void TextModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
604 {
605     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontFamily, value, frameNode);
606 }
607 
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)608 void TextModelNG::SetCopyOption(FrameNode* frameNode, CopyOptions copyOption)
609 {
610     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, CopyOption, copyOption, frameNode);
611 }
612 
SetTextShadow(FrameNode * frameNode,const std::vector<Shadow> & value)613 void TextModelNG::SetTextShadow(FrameNode* frameNode, const std::vector<Shadow>& value)
614 {
615     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextShadow, value, frameNode);
616     CHECK_NULL_VOID(SystemProperties::ConfigChangePerform());
617     auto pattern = frameNode->GetPattern();
618     CHECK_NULL_VOID(pattern);
619     auto index = 0;
620     for (auto& shadow : value) {
621         RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
622         auto key = "shadow_" + std::to_string(index);
623         auto&& updateFunc = [shadow, weak = AceType::WeakClaim(frameNode), index]
624             (const RefPtr<ResourceObject>& resObj) {
625             auto frameNode = weak.Upgrade();
626             CHECK_NULL_VOID(frameNode);
627             auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
628             CHECK_NULL_VOID(layoutProperty);
629             Shadow& shadowValue = const_cast<Shadow&>(shadow);
630             shadowValue.ReloadResources();
631             auto origArr = layoutProperty->GetTextShadow();
632             if (origArr.has_value() && GreatNotEqual(origArr.value().size(), index)) {
633                 auto origArrVal = origArr.value();
634                 origArrVal[index] = shadowValue;
635                 layoutProperty->UpdateTextShadow(origArrVal);
636             }
637         };
638         pattern->AddResObj(key, resObj, std::move(updateFunc));
639         index ++;
640     }
641 }
642 
SetHeightAdaptivePolicy(FrameNode * frameNode,TextHeightAdaptivePolicy value)643 void TextModelNG::SetHeightAdaptivePolicy(FrameNode* frameNode, TextHeightAdaptivePolicy value)
644 {
645     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, HeightAdaptivePolicy, value, frameNode);
646 }
647 
SetTextIndent(FrameNode * frameNode,const Dimension & value)648 void TextModelNG::SetTextIndent(FrameNode* frameNode, const Dimension& value)
649 {
650     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextIndent, value, frameNode);
651 }
652 
SetBaselineOffset(FrameNode * frameNode,const Dimension & value)653 void TextModelNG::SetBaselineOffset(FrameNode* frameNode, const Dimension& value)
654 {
655     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, BaselineOffset, value, frameNode);
656 }
657 
SetFont(FrameNode * frameNode,const Font & value)658 void TextModelNG::SetFont(FrameNode* frameNode, const Font& value)
659 {
660     if (value.fontSize.has_value()) {
661         SetFontSize(frameNode, value.fontSize.value());
662     }
663     if (value.fontWeight.has_value()) {
664         SetFontWeight(frameNode, value.fontWeight.value());
665     }
666     if (!value.fontFamilies.empty()) {
667         SetFontFamily(frameNode, value.fontFamilies);
668     }
669     if (value.fontStyle.has_value()) {
670         SetItalicFontStyle(frameNode, value.fontStyle.value());
671     }
672     SetEnableVariableFontWeight(frameNode, value.enableVariableFontWeight.value_or(false));
673 }
674 
SetLetterSpacing(FrameNode * frameNode,const Dimension & value)675 void TextModelNG::SetLetterSpacing(FrameNode* frameNode, const Dimension& value)
676 {
677     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LetterSpacing, value, frameNode);
678 }
679 
SetWordBreak(FrameNode * frameNode,Ace::WordBreak value)680 void TextModelNG::SetWordBreak(FrameNode* frameNode, Ace::WordBreak value)
681 {
682     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, WordBreak, value, frameNode);
683 }
684 
SetLineBreakStrategy(FrameNode * frameNode,Ace::LineBreakStrategy value)685 void TextModelNG::SetLineBreakStrategy(FrameNode* frameNode, Ace::LineBreakStrategy value)
686 {
687     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, LineBreakStrategy, value, frameNode);
688 }
689 
SetTextSelectableMode(FrameNode * frameNode,Ace::TextSelectableMode value)690 void TextModelNG::SetTextSelectableMode(FrameNode* frameNode, Ace::TextSelectableMode value)
691 {
692     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextSelectableMode, value, frameNode);
693     auto textPattern = frameNode->GetPattern<TextPattern>();
694     CHECK_NULL_VOID(textPattern);
695     textPattern->SetTextSelectableMode(value);
696 }
697 
SetEllipsisMode(FrameNode * frameNode,Ace::EllipsisMode value)698 void TextModelNG::SetEllipsisMode(FrameNode* frameNode, Ace::EllipsisMode value)
699 {
700     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, EllipsisMode, value, frameNode);
701 }
702 
SetTextDetectEnable(FrameNode * frameNode,bool value)703 void TextModelNG::SetTextDetectEnable(FrameNode* frameNode, bool value)
704 {
705     auto textPattern = frameNode->GetPattern<TextPattern>();
706     CHECK_NULL_VOID(textPattern);
707     textPattern->SetTextDetectEnable(value);
708 }
709 
BindSelectionMenu(TextSpanType & spanType,TextResponseType & responseType,std::function<void ()> & buildFunc,SelectMenuParam & menuParam)710 void TextModelNG::BindSelectionMenu(TextSpanType& spanType, TextResponseType& responseType,
711     std::function<void()>& buildFunc, SelectMenuParam& menuParam)
712 {
713     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
714     CHECK_NULL_VOID(frameNode);
715     auto pattern = frameNode->GetPattern<TextPattern>();
716     if (pattern) {
717         pattern->BindSelectionMenu(spanType, responseType, buildFunc, menuParam);
718     }
719 }
720 
SetOnTextSelectionChange(std::function<void (int32_t,int32_t)> && func)721 void TextModelNG::SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func)
722 {
723     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextEventHub>();
724     CHECK_NULL_VOID(eventHub);
725     eventHub->SetOnSelectionChange(std::move(func));
726 }
727 
GetTextController()728 RefPtr<TextControllerBase> TextModelNG::GetTextController()
729 {
730     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
731     CHECK_NULL_RETURN(pattern, nullptr);
732     return pattern->GetTextController();
733 }
734 
SetClipEdge(bool clip)735 void TextModelNG::SetClipEdge(bool clip)
736 {
737     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
738     CHECK_NULL_VOID(frameNode);
739     frameNode->GetRenderContext()->SetClipToFrame(clip);
740     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
741 }
742 
SetFontFeature(const FONT_FEATURES_LIST & value)743 void TextModelNG::SetFontFeature(const FONT_FEATURES_LIST& value)
744 {
745     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, FontFeature, value);
746 }
747 
SetFontFeature(FrameNode * frameNode,const FONT_FEATURES_LIST & value)748 void TextModelNG::SetFontFeature(FrameNode* frameNode, const FONT_FEATURES_LIST& value)
749 {
750     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, FontFeature, value, frameNode);
751 }
752 
SetMarqueeOptions(const TextMarqueeOptions & options)753 void TextModelNG::SetMarqueeOptions(const TextMarqueeOptions& options)
754 {
755     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
756     CHECK_NULL_VOID(frameNode);
757     SetMarqueeOptions(frameNode, options);
758 }
759 
SetMarqueeOptions(FrameNode * frameNode,const TextMarqueeOptions & options)760 void TextModelNG::SetMarqueeOptions(FrameNode* frameNode, const TextMarqueeOptions& options)
761 {
762     CHECK_NULL_VOID(frameNode);
763     if (options.HasTextMarqueeStart()) {
764         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
765             TextLayoutProperty, TextMarqueeStart, options.GetTextMarqueeStartValue(), frameNode);
766     } else {
767         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeStart, frameNode);
768     }
769     if (options.HasTextMarqueeStep()) {
770         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
771             TextLayoutProperty, TextMarqueeStep, options.GetTextMarqueeStepValue(), frameNode);
772     } else {
773         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeStep, frameNode);
774     }
775     if (options.HasTextMarqueeLoop()) {
776         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
777             TextLayoutProperty, TextMarqueeLoop, options.GetTextMarqueeLoopValue(), frameNode);
778     } else {
779         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeLoop, frameNode);
780     }
781     if (options.HasTextMarqueeDirection()) {
782         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
783             TextLayoutProperty, TextMarqueeDirection, options.GetTextMarqueeDirectionValue(), frameNode);
784     } else {
785         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeDirection, frameNode);
786     }
787     if (options.HasTextMarqueeDelay()) {
788         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
789             TextLayoutProperty, TextMarqueeDelay, options.GetTextMarqueeDelayValue(), frameNode);
790     } else {
791         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeDelay, frameNode);
792     }
793     if (options.HasTextMarqueeFadeout()) {
794         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
795             TextLayoutProperty, TextMarqueeFadeout, options.GetTextMarqueeFadeoutValue(), frameNode);
796     } else {
797         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeFadeout, frameNode);
798     }
799     if (options.HasTextMarqueeStartPolicy()) {
800         ACE_UPDATE_NODE_LAYOUT_PROPERTY(
801             TextLayoutProperty, TextMarqueeStartPolicy, options.GetTextMarqueeStartPolicyValue(), frameNode);
802     } else {
803         ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextMarqueeStartPolicy, frameNode);
804     }
805 }
806 
SetOnMarqueeStateChange(std::function<void (int32_t)> && func)807 void TextModelNG::SetOnMarqueeStateChange(std::function<void(int32_t)>&& func)
808 {
809     auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextEventHub>();
810     CHECK_NULL_VOID(eventHub);
811     eventHub->SetOnMarqueeStateChange(std::move(func));
812 }
813 
SetOnMarqueeStateChange(FrameNode * frameNode,std::function<void (int32_t)> && func)814 void TextModelNG::SetOnMarqueeStateChange(FrameNode* frameNode, std::function<void(int32_t)>&& func)
815 {
816     CHECK_NULL_VOID(frameNode);
817     auto eventHub = frameNode->GetEventHub<TextEventHub>();
818     CHECK_NULL_VOID(eventHub);
819     eventHub->SetOnMarqueeStateChange(std::move(func));
820 }
821 
GetMarqueeOptions(FrameNode * frameNode)822 TextMarqueeOptions TextModelNG::GetMarqueeOptions(FrameNode* frameNode)
823 {
824     TextMarqueeOptions options;
825     CHECK_NULL_RETURN(frameNode, options);
826     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
827     CHECK_NULL_RETURN(layoutProperty, options);
828 
829     if (layoutProperty->HasTextMarqueeStart()) {
830         options.UpdateTextMarqueeStart(layoutProperty->GetTextMarqueeStart().value());
831     }
832     if (layoutProperty->HasTextMarqueeStep()) {
833         options.UpdateTextMarqueeStep(layoutProperty->GetTextMarqueeStep().value());
834     }
835     if (layoutProperty->HasTextMarqueeLoop()) {
836         options.UpdateTextMarqueeLoop(layoutProperty->GetTextMarqueeLoop().value());
837     }
838     if (layoutProperty->HasTextMarqueeDirection()) {
839         options.UpdateTextMarqueeDirection(layoutProperty->GetTextMarqueeDirection().value());
840     }
841     if (layoutProperty->HasTextMarqueeDelay()) {
842         options.UpdateTextMarqueeDelay(layoutProperty->GetTextMarqueeDelay().value());
843     }
844     if (layoutProperty->HasTextMarqueeFadeout()) {
845         options.UpdateTextMarqueeFadeout(layoutProperty->GetTextMarqueeFadeout().value());
846     }
847     if (layoutProperty->HasTextMarqueeStartPolicy()) {
848         options.UpdateTextMarqueeStartPolicy(layoutProperty->GetTextMarqueeStartPolicy().value());
849     }
850 
851     return options;
852 }
853 
GetContent(FrameNode * frameNode)854 std::u16string TextModelNG::GetContent(FrameNode* frameNode)
855 {
856     CHECK_NULL_RETURN(frameNode, u"");
857     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
858     CHECK_NULL_RETURN(layoutProperty, u"");
859     return layoutProperty->GetContent().value_or(u"");
860 }
861 
GetLineHeight(FrameNode * frameNode)862 float TextModelNG::GetLineHeight(FrameNode* frameNode)
863 {
864     CHECK_NULL_RETURN(frameNode, 0.0f);
865     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
866     CHECK_NULL_RETURN(layoutProperty, 0.0f);
867     Dimension defaultLineHeight(0);
868     auto value = layoutProperty->GetLineHeight().value_or(defaultLineHeight);
869     return static_cast<float>(value.Value());
870 }
871 
GetLineSpacing(FrameNode * frameNode)872 float TextModelNG::GetLineSpacing(FrameNode* frameNode)
873 {
874     CHECK_NULL_RETURN(frameNode, 0.0f);
875     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
876     CHECK_NULL_RETURN(layoutProperty, 0.0f);
877     Dimension defaultLineSpacing(0);
878     auto value = layoutProperty->GetLineSpacing().value_or(defaultLineSpacing);
879     return static_cast<float>(value.Value());
880 }
881 
GetDecoration(FrameNode * frameNode)882 TextDecoration TextModelNG::GetDecoration(FrameNode* frameNode)
883 {
884     CHECK_NULL_RETURN(frameNode, TextDecoration::NONE);
885     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
886     CHECK_NULL_RETURN(layoutProperty, TextDecoration::NONE);
887     return layoutProperty->GetTextDecorationFirst();
888 }
889 
GetTextDecorationColor(FrameNode * frameNode)890 Color TextModelNG::GetTextDecorationColor(FrameNode* frameNode)
891 {
892     CHECK_NULL_RETURN(frameNode, Color::BLACK);
893     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
894     CHECK_NULL_RETURN(layoutProperty, Color::BLACK);
895     return layoutProperty->GetTextDecorationColor().value_or(Color::BLACK);
896 }
897 
GetTextDecorationStyle(FrameNode * frameNode)898 TextDecorationStyle TextModelNG::GetTextDecorationStyle(FrameNode* frameNode)
899 {
900     CHECK_NULL_RETURN(frameNode, TextDecorationStyle::SOLID);
901     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
902     CHECK_NULL_RETURN(layoutProperty, TextDecorationStyle::SOLID);
903     return layoutProperty->GetTextDecorationStyle().value_or(TextDecorationStyle::SOLID);
904 }
905 
GetTextCase(FrameNode * frameNode)906 TextCase TextModelNG::GetTextCase(FrameNode* frameNode)
907 {
908     CHECK_NULL_RETURN(frameNode, TextCase::NORMAL);
909     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
910     CHECK_NULL_RETURN(layoutProperty, TextCase::NORMAL);
911     return layoutProperty->GetTextCase().value_or(TextCase::NORMAL);
912 }
913 
GetLetterSpacing(FrameNode * frameNode)914 Dimension TextModelNG::GetLetterSpacing(FrameNode* frameNode)
915 {
916     Dimension defaultSpacing(0);
917     CHECK_NULL_RETURN(frameNode, defaultSpacing);
918     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
919     CHECK_NULL_RETURN(layoutProperty, defaultSpacing);
920     return layoutProperty->GetLetterSpacing().value_or(defaultSpacing);
921 }
922 
GetMaxLines(FrameNode * frameNode)923 uint32_t TextModelNG::GetMaxLines(FrameNode* frameNode)
924 {
925     uint32_t defaultMaxLines = Infinity<uint32_t>();
926     CHECK_NULL_RETURN(frameNode, defaultMaxLines);
927     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
928     CHECK_NULL_RETURN(layoutProperty, defaultMaxLines);
929     auto& textLineStyle = layoutProperty->GetTextLineStyle();
930     CHECK_NULL_RETURN(textLineStyle, defaultMaxLines);
931     return textLineStyle->GetMaxLines().value_or(defaultMaxLines);
932 }
933 
GetTextAlign(FrameNode * frameNode)934 TextAlign TextModelNG::GetTextAlign(FrameNode* frameNode)
935 {
936     CHECK_NULL_RETURN(frameNode, OHOS::Ace::TextAlign::START);
937     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
938     CHECK_NULL_RETURN(layoutProperty, OHOS::Ace::TextAlign::START);
939     auto& textLineStyle = layoutProperty->GetTextLineStyle();
940     CHECK_NULL_RETURN(textLineStyle, OHOS::Ace::TextAlign::START);
941     return textLineStyle->GetTextAlign().value_or(TextAlign::START);
942 }
943 
GetTextOverflow(FrameNode * frameNode)944 TextOverflow TextModelNG::GetTextOverflow(FrameNode* frameNode)
945 {
946     CHECK_NULL_RETURN(frameNode, TextOverflow::CLIP);
947     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
948     CHECK_NULL_RETURN(layoutProperty, TextOverflow::CLIP);
949     auto& textLineStyle = layoutProperty->GetTextLineStyle();
950     CHECK_NULL_RETURN(textLineStyle, TextOverflow::CLIP);
951     return textLineStyle->GetTextOverflow().value_or(TextOverflow::CLIP);
952 }
953 
GetTextIndent(FrameNode * frameNode)954 Dimension TextModelNG::GetTextIndent(FrameNode* frameNode)
955 {
956     Dimension defaultTextIndent(0);
957     CHECK_NULL_RETURN(frameNode, defaultTextIndent);
958     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
959     CHECK_NULL_RETURN(layoutProperty, defaultTextIndent);
960     auto& textLineStyle = layoutProperty->GetTextLineStyle();
961     CHECK_NULL_RETURN(textLineStyle, defaultTextIndent);
962     return textLineStyle->GetTextIndent().value_or(defaultTextIndent);
963 }
964 
GetFontFamily(FrameNode * frameNode)965 std::vector<std::string> TextModelNG::GetFontFamily(FrameNode* frameNode)
966 {
967     std::vector<std::string> value;
968     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontFamily, value, frameNode, value);
969     return value;
970 }
971 
GetCopyOption(FrameNode * frameNode)972 CopyOptions TextModelNG::GetCopyOption(FrameNode* frameNode)
973 {
974     CopyOptions value = CopyOptions::None;
975     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, CopyOption, value, frameNode, value);
976     return value;
977 }
978 
GetHeightAdaptivePolicy(FrameNode * frameNode)979 TextHeightAdaptivePolicy TextModelNG::GetHeightAdaptivePolicy(FrameNode* frameNode)
980 {
981     TextHeightAdaptivePolicy value = TextHeightAdaptivePolicy::MAX_LINES_FIRST;
982     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, HeightAdaptivePolicy, value, frameNode, value);
983     return value;
984 }
985 
GetAdaptMinFontSize(FrameNode * frameNode)986 Dimension TextModelNG::GetAdaptMinFontSize(FrameNode* frameNode)
987 {
988     Dimension value;
989     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
990         TextLayoutProperty, AdaptMinFontSize, value, frameNode, Dimension());
991     return value;
992 }
993 
GetAdaptMaxFontSize(FrameNode * frameNode)994 Dimension TextModelNG::GetAdaptMaxFontSize(FrameNode* frameNode)
995 {
996     Dimension value;
997     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(
998         TextLayoutProperty, AdaptMaxFontSize, value, frameNode, Dimension());
999     return value;
1000 }
1001 
GetFont(FrameNode * frameNode)1002 Font TextModelNG::GetFont(FrameNode* frameNode)
1003 {
1004     Font value;
1005     value.fontSize = GetFontSize(frameNode);
1006     value.fontWeight = GetFontWeight(frameNode);
1007     value.fontFamilies = GetFontFamily(frameNode);
1008     value.fontStyle = GetItalicFontStyle(frameNode);
1009     return value;
1010 }
1011 
GetFontSize(FrameNode * frameNode)1012 Dimension TextModelNG::GetFontSize(FrameNode* frameNode)
1013 {
1014     Dimension value;
1015     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontSize, value, frameNode, Dimension());
1016     return value;
1017 }
1018 
GetFontWeight(FrameNode * frameNode)1019 Ace::FontWeight TextModelNG::GetFontWeight(FrameNode* frameNode)
1020 {
1021     Ace::FontWeight value = Ace::FontWeight::NORMAL;
1022     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontWeight, value, frameNode, value);
1023     return value;
1024 }
1025 
GetItalicFontStyle(FrameNode * frameNode)1026 Ace::FontStyle TextModelNG::GetItalicFontStyle(FrameNode* frameNode)
1027 {
1028     Ace::FontStyle value = Ace::FontStyle::NORMAL;
1029     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, ItalicFontStyle, value, frameNode, value);
1030     return value;
1031 }
1032 
GetDefaultColor(int32_t themeScopeId)1033 Color TextModelNG::GetDefaultColor(int32_t themeScopeId)
1034 {
1035     auto context = PipelineContext::GetCurrentContextSafelyWithCheck();
1036     CHECK_NULL_RETURN(context, Color::BLACK);
1037     auto theme = context->GetTheme<TextTheme>(themeScopeId);
1038     CHECK_NULL_RETURN(theme, Color::BLACK);
1039     return theme->GetTextStyle().GetTextColor();
1040 }
1041 
GetFontColor(FrameNode * frameNode)1042 Color TextModelNG::GetFontColor(FrameNode* frameNode)
1043 {
1044     auto themeScopeId = frameNode ? frameNode->GetThemeScopeId() : 0;
1045     auto defaultColor = GetDefaultColor(themeScopeId);
1046     CHECK_NULL_RETURN(frameNode, defaultColor);
1047     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1048     CHECK_NULL_RETURN(layoutProperty, defaultColor);
1049     return layoutProperty->GetTextColor().value_or(defaultColor);
1050 }
1051 
GetTextBaselineOffset(FrameNode * frameNode)1052 Dimension TextModelNG::GetTextBaselineOffset(FrameNode* frameNode)
1053 {
1054     Dimension defaultOffset(0);
1055     CHECK_NULL_RETURN(frameNode, defaultOffset);
1056     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1057     CHECK_NULL_RETURN(layoutProperty, defaultOffset);
1058     return layoutProperty->GetBaselineOffset().value_or(defaultOffset);
1059 }
1060 
GetTextShadow(FrameNode * frameNode)1061 std::vector<Shadow> TextModelNG::GetTextShadow(FrameNode* frameNode)
1062 {
1063     std::vector<Shadow> defaultShadow;
1064     CHECK_NULL_RETURN(frameNode, defaultShadow);
1065     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1066     CHECK_NULL_RETURN(layoutProperty, defaultShadow);
1067     return layoutProperty->GetTextShadow().value_or(defaultShadow);
1068 }
1069 
GetWordBreak(FrameNode * frameNode)1070 Ace::WordBreak TextModelNG::GetWordBreak(FrameNode* frameNode)
1071 {
1072     Ace::WordBreak value = Ace::WordBreak::BREAK_WORD;
1073     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, WordBreak, value, frameNode, value);
1074     return value;
1075 }
1076 
GetEllipsisMode(FrameNode * frameNode)1077 EllipsisMode TextModelNG::GetEllipsisMode(FrameNode* frameNode)
1078 {
1079     EllipsisMode value = EllipsisMode::TAIL;
1080     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, EllipsisMode, value, frameNode, value);
1081     return value;
1082 }
1083 
GetTextDetectEnable(FrameNode * frameNode)1084 bool TextModelNG::GetTextDetectEnable(FrameNode* frameNode)
1085 {
1086     auto textPattern = frameNode->GetPattern<TextPattern>();
1087     CHECK_NULL_RETURN(textPattern, false);
1088     return textPattern->GetTextDetectEnable();
1089 }
1090 
SetTextDetectConfig(FrameNode * frameNode,const std::string & value)1091 void TextModelNG::SetTextDetectConfig(FrameNode* frameNode, const std::string& value)
1092 {
1093     CHECK_NULL_VOID(frameNode);
1094     auto textPattern = frameNode->GetPattern<TextPattern>();
1095     CHECK_NULL_VOID(textPattern);
1096     textPattern->SetTextDetectTypes(value);
1097 }
1098 
SetOnClick(FrameNode * frameNode,GestureEventFunc && click)1099 void TextModelNG::SetOnClick(FrameNode* frameNode, GestureEventFunc&& click)
1100 {
1101     CHECK_NULL_VOID(frameNode);
1102     auto textPattern = frameNode->GetPattern<TextPattern>();
1103     CHECK_NULL_VOID(textPattern);
1104     textPattern->SetOnClickEvent(std::move(click));
1105     auto* uiNode = reinterpret_cast<UINode*>(frameNode);
1106     CHECK_NULL_VOID(uiNode);
1107     uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true);
1108 }
1109 
ClearOnClick(FrameNode * frameNode)1110 void TextModelNG::ClearOnClick(FrameNode* frameNode)
1111 {
1112     CHECK_NULL_VOID(frameNode);
1113     auto textPattern = frameNode->GetPattern<TextPattern>();
1114     CHECK_NULL_VOID(textPattern);
1115     textPattern->SetOnClickEvent(nullptr);
1116     auto* uiNode = reinterpret_cast<UINode*>(frameNode);
1117     CHECK_NULL_VOID(uiNode);
1118     uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), false);
1119 }
1120 
SetOnDetectResultUpdate(FrameNode * frameNode,std::function<void (const std::string &)> && onResult)1121 void TextModelNG::SetOnDetectResultUpdate(FrameNode* frameNode,  std::function<void(const std::string&)>&& onResult)
1122 {
1123     CHECK_NULL_VOID(frameNode);
1124     auto textPattern = frameNode->GetPattern<TextPattern>();
1125     CHECK_NULL_VOID(textPattern);
1126     textPattern->SetOnResult(std::move(onResult));
1127 }
1128 
GetTextDetectConfig(FrameNode * frameNode)1129 std::string TextModelNG::GetTextDetectConfig(FrameNode* frameNode)
1130 {
1131     CHECK_NULL_RETURN(frameNode, "");
1132     auto textPattern = frameNode->GetPattern<TextPattern>();
1133     CHECK_NULL_RETURN(textPattern, "");
1134     return textPattern->GetTextDetectTypes();
1135 }
1136 
GetFontFeature(FrameNode * frameNode)1137 FONT_FEATURES_LIST TextModelNG::GetFontFeature(FrameNode* frameNode)
1138 {
1139     FONT_FEATURES_LIST value;
1140     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, FontFeature, value, frameNode, value);
1141     return value;
1142 }
1143 
GetTextSelectableMode(FrameNode * frameNode)1144 TextSelectableMode TextModelNG::GetTextSelectableMode(FrameNode* frameNode)
1145 {
1146     TextSelectableMode value = TextSelectableMode::SELECTABLE_UNFOCUSABLE;
1147     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, TextSelectableMode, value, frameNode, value);
1148     return value;
1149 }
1150 
SetCaretColor(FrameNode * frameNode,const Color & value)1151 void TextModelNG::SetCaretColor(FrameNode* frameNode, const Color& value)
1152 {
1153     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, CursorColor, value, frameNode);
1154 }
1155 
GetCaretColor(FrameNode * frameNode)1156 Color TextModelNG::GetCaretColor(FrameNode* frameNode)
1157 {
1158     auto context = PipelineContext::GetCurrentContextSafelyWithCheck();
1159     CHECK_NULL_RETURN(context, Color::BLACK);
1160     auto themeScopeId = frameNode ? frameNode->GetThemeScopeId() : 0;
1161     auto theme = context->GetTheme<TextTheme>(themeScopeId);
1162     CHECK_NULL_RETURN(theme, Color::BLACK);
1163     Color value = theme->GetCaretColor();
1164     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, CursorColor, value, frameNode, value);
1165     return value;
1166 }
1167 
ResetCaretColor(FrameNode * frameNode)1168 void TextModelNG::ResetCaretColor(FrameNode* frameNode)
1169 {
1170     CHECK_NULL_VOID(frameNode);
1171     auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1172     if (textLayoutProperty) {
1173         textLayoutProperty->ResetCursorColor();
1174     }
1175 }
1176 
SetSelectedBackgroundColor(FrameNode * frameNode,const Color & value)1177 void TextModelNG::SetSelectedBackgroundColor(FrameNode* frameNode, const Color& value)
1178 {
1179     Color color = value;
1180     if (color.GetAlpha() == DEFAULT_ALPHA) {
1181         // Default setting of 20% opacity
1182         color = color.ChangeOpacity(DEFAULT_OPACITY);
1183     }
1184     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, SelectedBackgroundColor, color, frameNode);
1185 }
1186 
GetSelectedBackgroundColor(FrameNode * frameNode)1187 Color TextModelNG::GetSelectedBackgroundColor(FrameNode* frameNode)
1188 {
1189     auto context = PipelineContext::GetCurrentContextSafelyWithCheck();
1190     CHECK_NULL_RETURN(context, Color::BLACK);
1191     auto theme = context->GetTheme<TextTheme>();
1192     CHECK_NULL_RETURN(theme, Color::BLACK);
1193     Color value = theme->GetSelectedColor();
1194     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, SelectedBackgroundColor, value, frameNode,
1195         value);
1196     return value;
1197 }
1198 
ResetSelectedBackgroundColor(FrameNode * frameNode)1199 void TextModelNG::ResetSelectedBackgroundColor(FrameNode* frameNode)
1200 {
1201     CHECK_NULL_VOID(frameNode);
1202     auto textLayoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1203     if (textLayoutProperty) {
1204         textLayoutProperty->ResetSelectedBackgroundColor();
1205     }
1206 }
1207 
GetLineBreakStrategy(FrameNode * frameNode)1208 LineBreakStrategy TextModelNG::GetLineBreakStrategy(FrameNode* frameNode)
1209 {
1210     LineBreakStrategy value = LineBreakStrategy::GREEDY;
1211     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, LineBreakStrategy, value, frameNode, value);
1212     return value;
1213 }
1214 
SetTextContentWithStyledString(FrameNode * frameNode,ArkUI_StyledString * value)1215 void TextModelNG::SetTextContentWithStyledString(FrameNode* frameNode, ArkUI_StyledString* value)
1216 {
1217     CHECK_NULL_VOID(frameNode);
1218     auto textPattern = frameNode->GetPattern<TextPattern>();
1219     CHECK_NULL_VOID(textPattern);
1220     std::list<RefPtr<SpanItem>> spanItems;
1221     if (!value) {
1222         textPattern->SetExternalParagraph(nullptr);
1223         textPattern->SetExternalSpanItem(spanItems);
1224         textPattern->SetExternalParagraphStyle(std::nullopt);
1225         auto pManager = textPattern->GetParagraphManager();
1226         if (pManager) {
1227             pManager->Reset();
1228         }
1229     } else {
1230         textPattern->SetExternalParagraph(value->paragraph);
1231     }
1232     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1233 }
1234 
SetTextSelection(FrameNode * frameNode,int32_t startIndex,int32_t endIndex)1235 void TextModelNG::SetTextSelection(FrameNode* frameNode, int32_t startIndex, int32_t endIndex)
1236 {
1237     CHECK_NULL_VOID(frameNode);
1238     auto textPattern = frameNode->GetPattern<TextPattern>();
1239     CHECK_NULL_VOID(textPattern);
1240     textPattern->SetTextSelection(startIndex, endIndex);
1241 }
1242 
SetTextDetectConfig(FrameNode * frameNode,const TextDetectConfig & textDetectConfig)1243 void TextModelNG::SetTextDetectConfig(FrameNode* frameNode, const TextDetectConfig& textDetectConfig)
1244 {
1245     CHECK_NULL_VOID(frameNode);
1246     auto textPattern = frameNode->GetPattern<TextPattern>();
1247     CHECK_NULL_VOID(textPattern);
1248     textPattern->SetTextDetectConfig(textDetectConfig);
1249     CHECK_NULL_VOID(SystemProperties::ConfigChangePerform());
1250     RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
1251     auto key = "textDetectorConfig";
1252     auto&& updateFunc = [textDetectConfig, weak = AceType::WeakClaim(frameNode)]
1253         (const RefPtr<ResourceObject>& resObj) {
1254         auto frameNode = weak.Upgrade();
1255         CHECK_NULL_VOID(frameNode);
1256         auto textPattern = frameNode->GetPattern<TextPattern>();
1257         CHECK_NULL_VOID(textPattern);
1258         TextDetectConfig& textDetectConfigVal = const_cast<TextDetectConfig&>(textDetectConfig);
1259         textDetectConfigVal.ReloadResources();
1260         textPattern->SetTextDetectConfig(textDetectConfig);
1261     };
1262     textPattern->AddResObj(key, resObj, std::move(updateFunc));
1263 }
1264 
SetOnCopy(FrameNode * frameNode,std::function<void (const std::u16string &)> && func)1265 void TextModelNG::SetOnCopy(FrameNode* frameNode, std::function<void(const std::u16string&)>&& func)
1266 {
1267     CHECK_NULL_VOID(frameNode);
1268     auto eventHub = frameNode->GetEventHub<TextEventHub>();
1269     CHECK_NULL_VOID(eventHub);
1270     eventHub->SetOnCopy(std::move(func));
1271 }
1272 
SetOnTextSelectionChange(FrameNode * frameNode,std::function<void (int32_t,int32_t)> && func)1273 void TextModelNG::SetOnTextSelectionChange(FrameNode* frameNode, std::function<void(int32_t, int32_t)>&& func)
1274 {
1275     CHECK_NULL_VOID(frameNode);
1276     auto eventHub = frameNode->GetEventHub<TextEventHub>();
1277     CHECK_NULL_VOID(eventHub);
1278     eventHub->SetOnSelectionChange(std::move(func));
1279 }
1280 
SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick,const NG::OnPrepareMenuCallback && onPrepareMenuCallback)1281 void TextModelNG::SetSelectionMenuOptions(const NG::OnCreateMenuCallback&& onCreateMenuCallback,
1282     const NG::OnMenuItemClickCallback&& onMenuItemClick, const NG::OnPrepareMenuCallback&& onPrepareMenuCallback)
1283 {
1284     auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1285     CHECK_NULL_VOID(textPattern);
1286     textPattern->OnSelectionMenuOptionsUpdate(
1287         std::move(onCreateMenuCallback), std::move(onMenuItemClick), std::move(onPrepareMenuCallback));
1288 }
1289 
OnCreateMenuCallbackUpdate(FrameNode * frameNode,const NG::OnCreateMenuCallback && onCreateMenuCallback)1290 void TextModelNG::OnCreateMenuCallbackUpdate(
1291     FrameNode* frameNode, const NG::OnCreateMenuCallback&& onCreateMenuCallback)
1292 {
1293     CHECK_NULL_VOID(frameNode);
1294     auto textPattern = frameNode->GetPattern<TextPattern>();
1295     CHECK_NULL_VOID(textPattern);
1296     textPattern->OnCreateMenuCallbackUpdate(std::move(onCreateMenuCallback));
1297 }
1298 
OnMenuItemClickCallbackUpdate(FrameNode * frameNode,const NG::OnMenuItemClickCallback && onMenuItemClick)1299 void TextModelNG::OnMenuItemClickCallbackUpdate(
1300     FrameNode* frameNode, const NG::OnMenuItemClickCallback&& onMenuItemClick)
1301 {
1302     CHECK_NULL_VOID(frameNode);
1303     auto textPattern = frameNode->GetPattern<TextPattern>();
1304     CHECK_NULL_VOID(textPattern);
1305     textPattern->OnMenuItemClickCallbackUpdate(std::move(onMenuItemClick));
1306 }
1307 
OnPrepareMenuCallbackUpdate(FrameNode * frameNode,const NG::OnPrepareMenuCallback && onPrepareMenuCallback)1308 void TextModelNG::OnPrepareMenuCallbackUpdate(
1309     FrameNode* frameNode, const NG::OnPrepareMenuCallback&& onPrepareMenuCallback)
1310 {
1311     CHECK_NULL_VOID(frameNode);
1312     auto textPattern = frameNode->GetPattern<TextPattern>();
1313     CHECK_NULL_VOID(textPattern);
1314     textPattern->OnPrepareMenuCallbackUpdate(std::move(onPrepareMenuCallback));
1315 }
1316 
SetResponseRegion(bool isUserSetResponseRegion)1317 void TextModelNG::SetResponseRegion(bool isUserSetResponseRegion)
1318 {
1319     auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1320     CHECK_NULL_VOID(textPattern);
1321     textPattern->SetIsUserSetResponseRegion(isUserSetResponseRegion);
1322 }
1323 
SetResponseRegion(FrameNode * frameNode,std::vector<DimensionRect> regions)1324 void TextModelNG::SetResponseRegion(FrameNode* frameNode, std::vector<DimensionRect> regions)
1325 {
1326     CHECK_NULL_VOID(frameNode);
1327     auto textPattern = frameNode->GetPattern<TextPattern>();
1328     CHECK_NULL_VOID(textPattern);
1329     auto gesture = frameNode->GetOrCreateGestureEventHub();
1330     CHECK_NULL_VOID(gesture);
1331     gesture->SetResponseRegion(regions);
1332     textPattern->SetIsUserSetResponseRegion(true);
1333 }
1334 
ClearResponseRegion(FrameNode * frameNode)1335 void TextModelNG::ClearResponseRegion(FrameNode* frameNode)
1336 {
1337     CHECK_NULL_VOID(frameNode);
1338     auto textPattern = frameNode->GetPattern<TextPattern>();
1339     CHECK_NULL_VOID(textPattern);
1340     auto gesture = frameNode->GetOrCreateGestureEventHub();
1341     CHECK_NULL_VOID(gesture);
1342     std::vector<DimensionRect> region;
1343     CalcDimension xDimen = CalcDimension(0.0, DimensionUnit::VP);
1344     CalcDimension yDimen = CalcDimension(0.0, DimensionUnit::VP);
1345     CalcDimension widthDimen = CalcDimension(1, DimensionUnit::PERCENT);
1346     CalcDimension heightDimen = CalcDimension(1, DimensionUnit::PERCENT);
1347     DimensionOffset offsetDimen(xDimen, yDimen);
1348     DimensionRect dimenRect(widthDimen, heightDimen, offsetDimen);
1349     region.emplace_back(dimenRect);
1350     gesture->SetResponseRegion(region);
1351     textPattern->SetIsUserSetResponseRegion(false);
1352 }
1353 
SetHalfLeading(bool halfLeading)1354 void TextModelNG::SetHalfLeading(bool halfLeading)
1355 {
1356     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, HalfLeading, halfLeading);
1357 }
1358 
SetHalfLeading(FrameNode * frameNode,bool halfLeading)1359 void TextModelNG::SetHalfLeading(FrameNode* frameNode, bool halfLeading)
1360 {
1361     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, HalfLeading, halfLeading, frameNode);
1362 }
1363 
GetHalfLeading(FrameNode * frameNode)1364 bool TextModelNG::GetHalfLeading(FrameNode* frameNode)
1365 {
1366     bool value = false;
1367     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, HalfLeading, value, frameNode, value);
1368     return value;
1369 }
1370 
SetEnableHapticFeedback(bool state)1371 void TextModelNG::SetEnableHapticFeedback(bool state)
1372 {
1373     auto textPattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextPattern>();
1374     CHECK_NULL_VOID(textPattern);
1375     textPattern->SetEnableHapticFeedback(state);
1376 }
1377 
SetEnableHapticFeedback(FrameNode * frameNode,bool state)1378 void TextModelNG::SetEnableHapticFeedback(FrameNode* frameNode, bool state)
1379 {
1380     CHECK_NULL_VOID(frameNode);
1381     auto textPattern = frameNode->GetPattern<TextPattern>();
1382     CHECK_NULL_VOID(textPattern);
1383     textPattern->SetEnableHapticFeedback(state);
1384 }
1385 
GetLineCount(FrameNode * frameNode)1386 size_t TextModelNG::GetLineCount(FrameNode* frameNode)
1387 {
1388     CHECK_NULL_RETURN(frameNode, 0);
1389     auto textPattern = frameNode->GetPattern<TextPattern>();
1390     CHECK_NULL_RETURN(textPattern, 0);
1391     return textPattern->GetLineCount();
1392 }
1393 
SetOptimizeTrailingSpace(bool trim)1394 void TextModelNG::SetOptimizeTrailingSpace(bool trim)
1395 {
1396     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, OptimizeTrailingSpace, trim);
1397 }
1398 
SetOptimizeTrailingSpace(FrameNode * frameNode,bool trim)1399 void TextModelNG::SetOptimizeTrailingSpace(FrameNode* frameNode, bool trim)
1400 {
1401     CHECK_NULL_VOID(frameNode);
1402     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, OptimizeTrailingSpace, trim, frameNode);
1403 }
1404 
GetOptimizeTrailingSpace(FrameNode * frameNode)1405 bool TextModelNG::GetOptimizeTrailingSpace(FrameNode* frameNode)
1406 {
1407     CHECK_NULL_RETURN(frameNode, false);
1408     bool value = false;
1409     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, OptimizeTrailingSpace, value, frameNode, value);
1410     return value;
1411 }
1412 
SetEnableAutoSpacing(bool enabled)1413 void TextModelNG::SetEnableAutoSpacing(bool enabled)
1414 {
1415     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, EnableAutoSpacing, enabled);
1416 }
1417 
SetEnableAutoSpacing(FrameNode * frameNode,bool enabled)1418 void TextModelNG::SetEnableAutoSpacing(FrameNode* frameNode, bool enabled)
1419 {
1420     CHECK_NULL_VOID(frameNode);
1421     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, EnableAutoSpacing, enabled, frameNode);
1422 }
1423 
GetEnableAutoSpacing(FrameNode * frameNode)1424 bool TextModelNG::GetEnableAutoSpacing(FrameNode* frameNode)
1425 {
1426     CHECK_NULL_RETURN(frameNode, false);
1427     bool value = false;
1428     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, EnableAutoSpacing, value, frameNode, value);
1429     return value;
1430 }
1431 
SetGradientShaderStyle(NG::Gradient & gradient)1432 void TextModelNG::SetGradientShaderStyle(NG::Gradient& gradient)
1433 {
1434     ACE_RESET_LAYOUT_PROPERTY(TextLayoutProperty, ColorShaderStyle);
1435     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, GradientShaderStyle, gradient);
1436 }
1437 
SetColorShaderStyle(const Color & value)1438 void TextModelNG::SetColorShaderStyle(const Color& value)
1439 {
1440     ACE_RESET_LAYOUT_PROPERTY(TextLayoutProperty, GradientShaderStyle);
1441     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, ColorShaderStyle, value);
1442 }
1443 
ResetGradientShaderStyle()1444 void TextModelNG::ResetGradientShaderStyle()
1445 {
1446     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(TextLayoutProperty, GradientShaderStyle, PROPERTY_UPDATE_MEASURE_SELF);
1447     ACE_RESET_LAYOUT_PROPERTY_WITH_FLAG(TextLayoutProperty, ColorShaderStyle, PROPERTY_UPDATE_MEASURE_SELF);
1448     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1449     CHECK_NULL_VOID(frameNode);
1450     auto layoutProperty = frameNode->GetLayoutProperty();
1451     CHECK_NULL_VOID(layoutProperty);
1452     layoutProperty->OnPropertyChangeMeasure();
1453 }
1454 
SetGradientStyle(FrameNode * frameNode,NG::Gradient & gradient)1455 void TextModelNG::SetGradientStyle(FrameNode* frameNode, NG::Gradient& gradient)
1456 {
1457     CHECK_NULL_VOID(frameNode);
1458     ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, ColorShaderStyle, frameNode);
1459     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, GradientShaderStyle, gradient, frameNode);
1460 }
1461 
SetColorShaderStyle(FrameNode * frameNode,const Color & value)1462 void TextModelNG::SetColorShaderStyle(FrameNode* frameNode, const Color& value)
1463 {
1464     CHECK_NULL_VOID(frameNode);
1465     ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, GradientShaderStyle, frameNode);
1466     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, ColorShaderStyle, value, frameNode);
1467 }
1468 
GetGradientStyle(FrameNode * frameNode)1469 NG::Gradient TextModelNG::GetGradientStyle(FrameNode* frameNode)
1470 {
1471     NG::Gradient value;
1472     value.CreateGradientWithType(NG::GradientType::LINEAR);
1473     CHECK_NULL_RETURN(frameNode, value);
1474     auto layoutProperty = frameNode->GetLayoutProperty<TextLayoutProperty>();
1475     CHECK_NULL_RETURN(layoutProperty, value);
1476     return layoutProperty->GetGradientShaderStyle().value_or(value);
1477 }
1478 
ResetTextGradient(FrameNode * frameNode)1479 void TextModelNG::ResetTextGradient(FrameNode* frameNode)
1480 {
1481     CHECK_NULL_VOID(frameNode);
1482     ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(
1483         TextLayoutProperty, GradientShaderStyle, PROPERTY_UPDATE_MEASURE_SELF, frameNode);
1484     ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(
1485         TextLayoutProperty, ColorShaderStyle, PROPERTY_UPDATE_MEASURE_SELF, frameNode);
1486     auto layoutProperty = frameNode->GetLayoutProperty();
1487     CHECK_NULL_VOID(layoutProperty);
1488     layoutProperty->OnPropertyChangeMeasure();
1489 }
1490 
SetTextVerticalAlign(TextVerticalAlign verticalAlign)1491 void TextModelNG::SetTextVerticalAlign(TextVerticalAlign verticalAlign)
1492 {
1493     ACE_UPDATE_LAYOUT_PROPERTY(TextLayoutProperty, TextVerticalAlign, verticalAlign);
1494 }
1495 
SetTextVerticalAlign(FrameNode * frameNode,TextVerticalAlign verticalAlign)1496 void TextModelNG::SetTextVerticalAlign(FrameNode* frameNode, TextVerticalAlign verticalAlign)
1497 {
1498     CHECK_NULL_VOID(frameNode);
1499     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextVerticalAlign, verticalAlign, frameNode);
1500 }
1501 
GetTextVerticalAlign(FrameNode * frameNode)1502 TextVerticalAlign TextModelNG::GetTextVerticalAlign(FrameNode* frameNode)
1503 {
1504     TextVerticalAlign value = TextVerticalAlign::BASELINE;
1505     CHECK_NULL_RETURN(frameNode, value);
1506     ACE_GET_NODE_LAYOUT_PROPERTY_WITH_DEFAULT_VALUE(TextLayoutProperty, TextVerticalAlign, value, frameNode, value);
1507     return value;
1508 }
1509 
SetContentTransition(FrameNode * frameNode,TextEffectStrategy value,TextFlipDirection direction,bool enableBlur)1510 void TextModelNG::SetContentTransition(
1511     FrameNode* frameNode, TextEffectStrategy value, TextFlipDirection direction, bool enableBlur)
1512 {
1513     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextEffectStrategy, value, frameNode);
1514     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipDirection, direction, frameNode);
1515     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipEnableBlur, enableBlur, frameNode);
1516 }
1517 
ResetContentTransition(FrameNode * frameNode)1518 void TextModelNG::ResetContentTransition(FrameNode* frameNode)
1519 {
1520     ACE_RESET_NODE_LAYOUT_PROPERTY_WITH_FLAG(
1521         TextLayoutProperty, TextEffectStrategy, PROPERTY_UPDATE_MEASURE_SELF, frameNode);
1522     ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipDirection, frameNode);
1523     ACE_RESET_NODE_LAYOUT_PROPERTY(TextLayoutProperty, TextFlipEnableBlur, frameNode);
1524 }
1525 } // namespace OHOS::Ace::NG