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