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