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