• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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/span_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_stack_processor.h"
24 #include "core/components_ng/pattern/text/span_node.h"
25 #include "core/components_ng/pattern/text/text_pattern.h"
26 #include "core/components_v2/inspector/inspector_constants.h"
27 
28 #define ACE_UPDATE_SPAN_PROPERTY(name, value, flag)                                                              \
29     do {                                                                                                         \
30         auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode()); \
31         CHECK_NULL_VOID(spanNode);                                                                               \
32         spanNode->Update##name(value);                                                                           \
33         spanNode->AddPropertyInfo(flag);                                                                         \
34     } while (false)
35 #define ACE_UPDATE_NODE_SPAN_PROPERTY(name, value, flag, frameNode)                                              \
36     do {                                                                                                         \
37         auto spanNode = AceType::DynamicCast<SpanNode>(frameNode);                                               \
38         CHECK_NULL_VOID(spanNode);                                                                               \
39         spanNode->Update##name(value);                                                                           \
40         spanNode->AddPropertyInfo(flag);                                                                         \
41     } while (false)
42 #define ACE_RESET_NODE_SPAN_PROPERTY(name, flag, frameNode)                                                      \
43     do {                                                                                                         \
44         auto spanNode = AceType::DynamicCast<SpanNode>(frameNode);                                               \
45         CHECK_NULL_VOID(spanNode);                                                                               \
46         if (spanNode->Has##name()) {                                                                             \
47             spanNode->MarkTextDirty();                                                                           \
48         }                                                                                                        \
49         spanNode->Reset##name();                                                                                 \
50         spanNode->ResetPropertyInfo(flag);                                                                       \
51     } while (false)
52 namespace OHOS::Ace::NG {
53 
Create(const std::string & content)54 void SpanModelNG::Create(const std::string& content)
55 {
56     auto* stack = ViewStackProcessor::GetInstance();
57     auto nodeId = stack->ClaimNodeId();
58     auto spanNode = SpanNode::GetOrCreateSpanNode(nodeId);
59     stack->Push(spanNode);
60 
61     ACE_UPDATE_SPAN_PROPERTY(Content, content, PropertyInfo::NONE);
62 }
63 
CreateSpanNode(int32_t nodeId,const std::string & content)64 RefPtr<SpanNode> SpanModelNG::CreateSpanNode(int32_t nodeId, const std::string& content)
65 {
66     auto spanNode = SpanNode::CreateSpanNode(nodeId);
67     CHECK_NULL_RETURN(spanNode, nullptr);
68     spanNode->UpdateContent(content);
69     spanNode->AddPropertyInfo(PropertyInfo::NONE);
70     return spanNode;
71 }
72 
SetFont(const Font & value)73 void SpanModelNG::SetFont(const Font& value)
74 {
75     if (value.fontSize.has_value()) {
76         SetFontSize(value.fontSize.value());
77     }
78     if (value.fontWeight.has_value()) {
79         SetFontWeight(value.fontWeight.value());
80     }
81     if (!value.fontFamilies.empty()) {
82         SetFontFamily(value.fontFamilies);
83     }
84     if (value.fontStyle.has_value()) {
85         SetItalicFontStyle(value.fontStyle.value());
86     }
87 }
88 
SetFontSize(const Dimension & value)89 void SpanModelNG::SetFontSize(const Dimension& value)
90 {
91     ACE_UPDATE_SPAN_PROPERTY(FontSize, value, PropertyInfo::FONTSIZE);
92 }
93 
SetTextColor(const Color & value)94 void SpanModelNG::SetTextColor(const Color& value)
95 {
96     auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
97     CHECK_NULL_VOID(spanNode);
98     spanNode->UpdateSpanTextColor(value);
99     spanNode->AddPropertyInfo(PropertyInfo::FONTCOLOR);
100 }
101 
SetItalicFontStyle(Ace::FontStyle value)102 void SpanModelNG::SetItalicFontStyle(Ace::FontStyle value)
103 {
104     ACE_UPDATE_SPAN_PROPERTY(ItalicFontStyle, value, PropertyInfo::FONTSTYLE);
105 }
106 
SetFontWeight(Ace::FontWeight value)107 void SpanModelNG::SetFontWeight(Ace::FontWeight value)
108 {
109     ACE_UPDATE_SPAN_PROPERTY(FontWeight, value, PropertyInfo::FONTWEIGHT);
110     auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
111     CHECK_NULL_VOID(spanNode);
112     spanNode->UpdateUserFontWeight(true);
113 }
114 
SetFontFamily(const std::vector<std::string> & value)115 void SpanModelNG::SetFontFamily(const std::vector<std::string>& value)
116 {
117     ACE_UPDATE_SPAN_PROPERTY(FontFamily, value, PropertyInfo::FONTFAMILY);
118 }
119 
SetTextDecoration(Ace::TextDecoration value)120 void SpanModelNG::SetTextDecoration(Ace::TextDecoration value)
121 {
122     ACE_UPDATE_SPAN_PROPERTY(TextDecoration, value, PropertyInfo::TEXTDECORATION);
123 }
124 
SetTextDecorationStyle(Ace::TextDecorationStyle value)125 void SpanModelNG::SetTextDecorationStyle(Ace::TextDecorationStyle value)
126 {
127     ACE_UPDATE_SPAN_PROPERTY(TextDecorationStyle, value, PropertyInfo::NONE);
128 }
129 
SetTextDecorationColor(const Color & value)130 void SpanModelNG::SetTextDecorationColor(const Color& value)
131 {
132     ACE_UPDATE_SPAN_PROPERTY(TextDecorationColor, value, PropertyInfo::NONE);
133 }
134 
SetTextCase(Ace::TextCase value)135 void SpanModelNG::SetTextCase(Ace::TextCase value)
136 {
137     ACE_UPDATE_SPAN_PROPERTY(TextCase, value, PropertyInfo::TEXTCASE);
138 }
139 
SetTextShadow(const std::vector<Shadow> & value)140 void SpanModelNG::SetTextShadow(const std::vector<Shadow>& value)
141 {
142     ACE_UPDATE_SPAN_PROPERTY(TextShadow, value, PropertyInfo::TEXTSHADOW);
143 }
144 
SetTextShadow(UINode * uiNode,const std::vector<Shadow> & value)145 void SpanModelNG::SetTextShadow(UINode* uiNode, const std::vector<Shadow>& value)
146 {
147     ACE_UPDATE_NODE_SPAN_PROPERTY(TextShadow, value, PropertyInfo::TEXTSHADOW, uiNode);
148 }
149 
ResetTextShadow(UINode * uiNode)150 void SpanModelNG::ResetTextShadow(UINode *uiNode)
151 {
152     ACE_RESET_NODE_SPAN_PROPERTY(TextShadow, PropertyInfo::TEXTSHADOW, uiNode);
153 }
154 
SetLetterSpacing(const Dimension & value)155 void SpanModelNG::SetLetterSpacing(const Dimension& value)
156 {
157     ACE_UPDATE_SPAN_PROPERTY(LetterSpacing, value, PropertyInfo::LETTERSPACE);
158 }
159 
SetBaselineOffset(const Dimension & value)160 void SpanModelNG::SetBaselineOffset(const Dimension& value)
161 {
162     ACE_UPDATE_SPAN_PROPERTY(BaselineOffset, value, PropertyInfo::BASELINE_OFFSET);
163 }
164 
SetLineHeight(const Dimension & value)165 void SpanModelNG::SetLineHeight(const Dimension& value)
166 {
167     ACE_UPDATE_SPAN_PROPERTY(LineHeight, value, PropertyInfo::LINEHEIGHT);
168 }
169 
SetOnClick(std::function<void (BaseEventInfo * info)> && click)170 void SpanModelNG::SetOnClick(std::function<void(BaseEventInfo* info)>&& click)
171 {
172     auto clickFunc = [func = std::move(click)](GestureEvent& info) { func(&info); };
173     ACE_UPDATE_SPAN_PROPERTY(OnClickEvent, std::move(clickFunc), PropertyInfo::NONE);
174 }
175 
SetOnClick(UINode * uiNode,GestureEventFunc && click)176 void SpanModelNG::SetOnClick(UINode* uiNode, GestureEventFunc&& click)
177 {
178     ACE_UPDATE_NODE_SPAN_PROPERTY(OnClickEvent, std::move(click), PropertyInfo::NONE, uiNode);
179 }
180 
ClearOnClick()181 void SpanModelNG::ClearOnClick()
182 {
183     ACE_UPDATE_SPAN_PROPERTY(OnClickEvent, nullptr, PropertyInfo::NONE);
184 }
185 
ClearOnClick(UINode * uiNode)186 void SpanModelNG::ClearOnClick(UINode* uiNode)
187 {
188     ACE_UPDATE_NODE_SPAN_PROPERTY(OnClickEvent, nullptr, PropertyInfo::NONE, uiNode);
189 }
190 
SetAccessibilityText(const std::string & text)191 void SpanModelNG::SetAccessibilityText(const std::string& text)
192 {
193     auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
194     CHECK_NULL_VOID(spanNode);
195     auto spanItem = spanNode->GetSpanItem();
196     CHECK_NULL_VOID(spanItem);
197     CHECK_NULL_VOID(spanItem->accessibilityProperty);
198     spanItem->accessibilityProperty->SetAccessibilityText(text);
199 }
200 
SetAccessibilityDescription(const std::string & description)201 void SpanModelNG::SetAccessibilityDescription(const std::string& description)
202 {
203     auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
204     CHECK_NULL_VOID(spanNode);
205     auto spanItem = spanNode->GetSpanItem();
206     CHECK_NULL_VOID(spanItem);
207     CHECK_NULL_VOID(spanItem->accessibilityProperty);
208     spanItem->accessibilityProperty->SetAccessibilityDescription(description);
209 }
210 
SetAccessibilityImportance(const std::string & importance)211 void SpanModelNG::SetAccessibilityImportance(const std::string& importance)
212 {
213     auto spanNode = AceType::DynamicCast<SpanNode>(ViewStackProcessor::GetInstance()->GetMainElementNode());
214     CHECK_NULL_VOID(spanNode);
215     auto spanItem = spanNode->GetSpanItem();
216     CHECK_NULL_VOID(spanItem);
217     CHECK_NULL_VOID(spanItem->accessibilityProperty);
218     spanItem->accessibilityProperty->SetAccessibilityLevel(importance);
219 }
220 
InitSpan(UINode * uiNode,const std::string & content)221 void SpanModelNG::InitSpan(UINode* uiNode, const std::string& content)
222 {
223     ACE_UPDATE_NODE_SPAN_PROPERTY(Content, content, PropertyInfo::NONE, uiNode);
224 }
225 
SetFontWeight(UINode * uiNode,FontWeight value)226 void SpanModelNG::SetFontWeight(UINode* uiNode, FontWeight value)
227 {
228     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
229     CHECK_NULL_VOID(spanNode);
230     spanNode->UpdateFontWeight(value);
231     spanNode->AddPropertyInfo(PropertyInfo::FONTWEIGHT);
232     spanNode->UpdateUserFontWeight(true);
233 }
234 
ResetFontWeight(UINode * uiNode)235 void SpanModelNG::ResetFontWeight(UINode *uiNode)
236 {
237     ACE_RESET_NODE_SPAN_PROPERTY(FontWeight, PropertyInfo::FONTWEIGHT, uiNode);
238 }
239 
SetTextCase(UINode * uiNode,TextCase value)240 void SpanModelNG::SetTextCase(UINode* uiNode, TextCase value)
241 {
242     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
243     CHECK_NULL_VOID(spanNode);
244     spanNode->UpdateTextCase(value);
245     spanNode->AddPropertyInfo(PropertyInfo::TEXTCASE);
246 }
247 
ResetTextCase(UINode * uiNode)248 void SpanModelNG::ResetTextCase(UINode *uiNode)
249 {
250     ACE_RESET_NODE_SPAN_PROPERTY(TextCase, PropertyInfo::TEXTCASE, uiNode);
251 }
252 
SetItalicFontStyle(UINode * uiNode,Ace::FontStyle value)253 void SpanModelNG::SetItalicFontStyle(UINode* uiNode, Ace::FontStyle value)
254 {
255     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
256     CHECK_NULL_VOID(spanNode);
257     spanNode->UpdateItalicFontStyle(value);
258     spanNode->AddPropertyInfo(PropertyInfo::FONTSTYLE);
259 }
260 
ResetItalicFontStyle(UINode * uiNode)261 void SpanModelNG::ResetItalicFontStyle(UINode *uiNode)
262 {
263     ACE_RESET_NODE_SPAN_PROPERTY(ItalicFontStyle, PropertyInfo::FONTSTYLE, uiNode);
264 }
265 
SetLineHeight(UINode * uiNode,const Dimension & value)266 void SpanModelNG::SetLineHeight(UINode* uiNode, const Dimension& value)
267 {
268     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
269     CHECK_NULL_VOID(spanNode);
270     spanNode->UpdateLineHeight(value);
271     spanNode->AddPropertyInfo(PropertyInfo::LINEHEIGHT);
272 }
273 
ResetLineHeight(UINode * uiNode)274 void SpanModelNG::ResetLineHeight(UINode* uiNode)
275 {
276     ACE_RESET_NODE_SPAN_PROPERTY(LineHeight, PropertyInfo::LINEHEIGHT, uiNode);
277 }
278 
SetFontSize(UINode * uiNode,const Dimension & value)279 void SpanModelNG::SetFontSize(UINode* uiNode, const Dimension& value)
280 {
281     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
282     CHECK_NULL_VOID(spanNode);
283     spanNode->UpdateFontSize(value);
284     spanNode->AddPropertyInfo(PropertyInfo::FONTSIZE);
285 }
286 
ResetFontSize(UINode * uiNode)287 void SpanModelNG::ResetFontSize(UINode *uiNode)
288 {
289     ACE_RESET_NODE_SPAN_PROPERTY(FontSize, PropertyInfo::FONTSIZE, uiNode);
290 }
291 
SetFontFamily(UINode * uiNode,const std::vector<std::string> & value)292 void SpanModelNG::SetFontFamily(UINode* uiNode, const std::vector<std::string>& value)
293 {
294     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
295     CHECK_NULL_VOID(spanNode);
296     spanNode->UpdateFontFamily(value);
297     spanNode->AddPropertyInfo(PropertyInfo::FONTFAMILY);
298 }
299 
ResetFontFamily(UINode * uiNode)300 void SpanModelNG::ResetFontFamily(UINode *uiNode)
301 {
302     ACE_RESET_NODE_SPAN_PROPERTY(FontFamily, PropertyInfo::FONTFAMILY, uiNode);
303 }
304 
SetTextDecoration(UINode * uiNode,TextDecoration value)305 void SpanModelNG::SetTextDecoration(UINode* uiNode, TextDecoration value)
306 {
307     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
308     CHECK_NULL_VOID(spanNode);
309     spanNode->UpdateTextDecoration(value);
310     spanNode->AddPropertyInfo(PropertyInfo::TEXTDECORATION);
311 }
312 
ResetTextDecoration(UINode * uiNode)313 void SpanModelNG::ResetTextDecoration(UINode *uiNode)
314 {
315     ACE_RESET_NODE_SPAN_PROPERTY(TextDecoration, PropertyInfo::TEXTDECORATION, uiNode);
316 }
317 
SetTextDecorationStyle(UINode * uiNode,TextDecorationStyle value)318 void SpanModelNG::SetTextDecorationStyle(UINode* uiNode, TextDecorationStyle value)
319 {
320     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
321     CHECK_NULL_VOID(spanNode);
322     spanNode->UpdateTextDecorationStyle(value);
323     spanNode->AddPropertyInfo(PropertyInfo::NONE);
324 }
325 
ResetTextDecorationStyle(UINode * uiNode)326 void SpanModelNG::ResetTextDecorationStyle(UINode *uiNode)
327 {
328     ACE_RESET_NODE_SPAN_PROPERTY(TextDecorationStyle, PropertyInfo::NONE, uiNode);
329 }
330 
SetTextDecorationColor(UINode * uiNode,const Color & value)331 void SpanModelNG::SetTextDecorationColor(UINode* uiNode, const Color& value)
332 {
333     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
334     CHECK_NULL_VOID(spanNode);
335     spanNode->UpdateTextDecorationColor(value);
336     spanNode->AddPropertyInfo(PropertyInfo::NONE);
337 }
338 
ResetTextDecorationColor(UINode * uiNode)339 void SpanModelNG::ResetTextDecorationColor(UINode *uiNode)
340 {
341     ACE_RESET_NODE_SPAN_PROPERTY(TextDecorationColor, PropertyInfo::NONE, uiNode);
342 }
343 
SetTextColor(UINode * uiNode,const Color & value)344 void SpanModelNG::SetTextColor(UINode* uiNode, const Color& value)
345 {
346     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
347     CHECK_NULL_VOID(spanNode);
348     spanNode->UpdateSpanTextColor(value);
349     spanNode->AddPropertyInfo(PropertyInfo::FONTCOLOR);
350 }
351 
ResetTextColor(UINode * uiNode)352 void SpanModelNG::ResetTextColor(UINode *uiNode)
353 {
354     ACE_RESET_NODE_SPAN_PROPERTY(TextColor, PropertyInfo::FONTCOLOR, uiNode);
355 }
356 
SetLetterSpacing(UINode * uiNode,const Dimension & value)357 void SpanModelNG::SetLetterSpacing(UINode* uiNode, const Dimension& value)
358 {
359     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
360     CHECK_NULL_VOID(spanNode);
361     spanNode->UpdateLetterSpacing(value);
362     spanNode->AddPropertyInfo(PropertyInfo::LETTERSPACE);
363 }
364 
ResetLetterSpacing(UINode * uiNode)365 void SpanModelNG::ResetLetterSpacing(UINode *uiNode)
366 {
367     ACE_RESET_NODE_SPAN_PROPERTY(LetterSpacing, PropertyInfo::LETTERSPACE, uiNode);
368 }
369 
SetBaselineOffset(UINode * uiNode,const Dimension & value)370 void SpanModelNG::SetBaselineOffset(UINode* uiNode, const Dimension& value)
371 {
372     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
373     CHECK_NULL_VOID(spanNode);
374     spanNode->UpdateBaselineOffset(value);
375     spanNode->AddPropertyInfo(PropertyInfo::BASELINE_OFFSET);
376 }
377 
SetFont(UINode * uiNode,const Font & value)378 void SpanModelNG::SetFont(UINode* uiNode, const Font& value)
379 {
380     if (value.fontSize.has_value()) {
381         SetFontSize(uiNode, value.fontSize.value());
382     }
383     if (value.fontWeight.has_value()) {
384         SetFontWeight(uiNode, value.fontWeight.value());
385     }
386     if (!value.fontFamilies.empty()) {
387         SetFontFamily(uiNode, value.fontFamilies);
388     }
389     if (value.fontStyle.has_value()) {
390         SetItalicFontStyle(uiNode, value.fontStyle.value());
391     }
392 }
393 
ResetFont(UINode * uiNode)394 void SpanModelNG::ResetFont(UINode *uiNode)
395 {
396     ResetFontSize(uiNode);
397     ResetFontWeight(uiNode);
398     ResetFontFamily(uiNode);
399     ResetItalicFontStyle(uiNode);
400 }
401 
CreateContainSpan()402 void SpanModelNG::CreateContainSpan()
403 {
404     auto* stack = ViewStackProcessor::GetInstance();
405     auto nodeId = stack->ClaimNodeId();
406     auto spanNode = ContainerSpanNode::GetOrCreateSpanNode(nodeId);
407     stack->Push(spanNode);
408 }
409 
SetTextBackgroundStyle(const TextBackgroundStyle & style)410 void SpanModelNG::SetTextBackgroundStyle(const TextBackgroundStyle& style)
411 {
412     auto baseSpan = AceType::DynamicCast<BaseSpan>(ViewStackProcessor::GetInstance()->GetMainElementNode());
413     CHECK_NULL_VOID(baseSpan);
414     baseSpan->SetTextBackgroundStyle(style);
415 }
416 
SetTextBackgroundStyle(UINode * uiNode,const TextBackgroundStyle & style)417 void SpanModelNG::SetTextBackgroundStyle(UINode* uiNode, const TextBackgroundStyle& style)
418 {
419     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
420     CHECK_NULL_VOID(spanNode);
421     spanNode->SetTextBackgroundStyle(style);
422 }
423 
SetTextBackgroundStyleByBaseSpan(UINode * uiNode,const TextBackgroundStyle & style)424 void SpanModelNG::SetTextBackgroundStyleByBaseSpan(UINode* uiNode, const TextBackgroundStyle& style)
425 {
426     auto spanNode = AceType::DynamicCast<BaseSpan>(uiNode);
427     CHECK_NULL_VOID(spanNode);
428     spanNode->SetTextBackgroundStyle(style);
429 }
430 
GetContent(UINode * uiNode)431 std::string SpanModelNG::GetContent(UINode* uiNode)
432 {
433     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
434     CHECK_NULL_RETURN(spanNode, "");
435     auto spanItem = spanNode->GetSpanItem();
436     CHECK_NULL_RETURN(spanItem, "");
437     return spanItem->GetSpanContent();
438 }
439 
GetTextDecoration(UINode * uiNode)440 Ace::TextDecoration SpanModelNG::GetTextDecoration(UINode* uiNode)
441 {
442     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
443     CHECK_NULL_RETURN(spanNode, TextDecoration::NONE);
444     return spanNode->GetTextDecoration().value_or(TextDecoration::NONE);
445 }
446 
GetTextDecorationColor(UINode * uiNode)447 Color SpanModelNG::GetTextDecorationColor(UINode* uiNode)
448 {
449     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
450     CHECK_NULL_RETURN(spanNode, Color::BLACK);
451     return spanNode->GetTextDecorationColor().value_or(Color::BLACK);
452 }
453 
GetTextDecorationStyle(UINode * uiNode)454 Ace::TextDecorationStyle SpanModelNG::GetTextDecorationStyle(UINode* uiNode)
455 {
456     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
457     CHECK_NULL_RETURN(spanNode, TextDecorationStyle::SOLID);
458     return spanNode->GetTextDecorationStyle().value_or(TextDecorationStyle::SOLID);
459 }
460 
GetDefaultTextStyle()461 TextStyle SpanModelNG::GetDefaultTextStyle()
462 {
463     TextStyle textStyle;
464     auto pipelineContext = PipelineBase::GetCurrentContextSafely();
465     CHECK_NULL_RETURN(pipelineContext, textStyle);
466     auto textTheme = pipelineContext->GetTheme<TextTheme>();
467     CHECK_NULL_RETURN(textTheme, textStyle);
468     return textTheme->GetTextStyle();
469 }
470 
GetFontColor(UINode * uiNode)471 Color SpanModelNG::GetFontColor(UINode* uiNode)
472 {
473     auto defaultColor = GetDefaultTextStyle().GetTextColor();
474     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
475     CHECK_NULL_RETURN(spanNode, defaultColor);
476     return spanNode->GetTextColor().value_or(defaultColor);
477 }
478 
GetFontSize(UINode * uiNode)479 Dimension SpanModelNG::GetFontSize(UINode* uiNode)
480 {
481     const Dimension& defaultFontSize = GetDefaultTextStyle().GetFontSize();
482     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
483     CHECK_NULL_RETURN(spanNode, defaultFontSize);
484     return spanNode->GetFontSize().value_or(defaultFontSize);
485 }
486 
GetFontStyle(UINode * uiNode)487 Ace::FontStyle SpanModelNG::GetFontStyle(UINode* uiNode)
488 {
489     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
490     CHECK_NULL_RETURN(spanNode, Ace::FontStyle::NORMAL);
491     return spanNode->GetItalicFontStyle().value_or(Ace::FontStyle::NORMAL);
492 }
493 
GetFontWeight(UINode * uiNode)494 FontWeight SpanModelNG::GetFontWeight(UINode* uiNode)
495 {
496     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
497     CHECK_NULL_RETURN(spanNode, FontWeight::NORMAL);
498     return spanNode->GetFontWeight().value_or(FontWeight::NORMAL);
499 }
500 
GetTextLineHeight(UINode * uiNode)501 Dimension SpanModelNG::GetTextLineHeight(UINode* uiNode)
502 {
503     Dimension defaultLineHeight(0);
504     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
505     CHECK_NULL_RETURN(spanNode, Dimension(0));
506     return spanNode->GetLineHeight().value_or(defaultLineHeight);
507 }
508 
GetTextCase(UINode * uiNode)509 Ace::TextCase SpanModelNG::GetTextCase(UINode* uiNode)
510 {
511     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
512     CHECK_NULL_RETURN(spanNode, TextCase::NORMAL);
513     return spanNode->GetTextCase().value_or(TextCase::NORMAL);
514 }
515 
GetLetterSpacing(UINode * uiNode)516 Dimension SpanModelNG::GetLetterSpacing(UINode* uiNode)
517 {
518     Dimension defaultLetterSpacing(0);
519     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
520     CHECK_NULL_RETURN(spanNode, defaultLetterSpacing);
521     return spanNode->GetLetterSpacing().value_or(defaultLetterSpacing);
522 }
523 
GetBaselineOffset(UINode * uiNode)524 Dimension SpanModelNG::GetBaselineOffset(UINode* uiNode)
525 {
526     Dimension defaultBaselineOffset(0);
527     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
528     CHECK_NULL_RETURN(spanNode, defaultBaselineOffset);
529     return spanNode->GetBaselineOffset().value_or(defaultBaselineOffset);
530 }
531 
GetSpanTextBackgroundStyle(UINode * uiNode)532 TextBackgroundStyle SpanModelNG::GetSpanTextBackgroundStyle(UINode* uiNode)
533 {
534     TextBackgroundStyle backgroundStyle;
535     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
536     CHECK_NULL_RETURN(spanNode, backgroundStyle);
537     return spanNode->GetTextBackgroundStyle().value_or(backgroundStyle);
538 }
539 
GetTextShadow(UINode * uiNode)540 std::vector<Shadow> SpanModelNG::GetTextShadow(UINode* uiNode)
541 {
542     std::vector<Shadow> defaultShadow;
543     CHECK_NULL_RETURN(uiNode, defaultShadow);
544     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
545     CHECK_NULL_RETURN(spanNode, defaultShadow);
546     return spanNode->GetTextShadow().value_or(defaultShadow);
547 }
548 
SetAccessibilityText(UINode * uiNode,const std::string & text)549 void SpanModelNG::SetAccessibilityText(UINode* uiNode, const std::string& text)
550 {
551     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
552     CHECK_NULL_VOID(spanNode);
553     auto spanItem = spanNode->GetSpanItem();
554     CHECK_NULL_VOID(spanItem);
555     CHECK_NULL_VOID(spanItem->accessibilityProperty);
556     spanItem->accessibilityProperty->SetAccessibilityText(text);
557 }
558 
SetAccessibilityDescription(UINode * uiNode,const std::string & description)559 void SpanModelNG::SetAccessibilityDescription(UINode* uiNode, const std::string& description)
560 {
561     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
562     CHECK_NULL_VOID(spanNode);
563     auto spanItem = spanNode->GetSpanItem();
564     CHECK_NULL_VOID(spanItem);
565     CHECK_NULL_VOID(spanItem->accessibilityProperty);
566     spanItem->accessibilityProperty->SetAccessibilityDescription(description);
567 }
568 
SetAccessibilityImportance(UINode * uiNode,const std::string & importance)569 void SpanModelNG::SetAccessibilityImportance(UINode* uiNode, const std::string& importance)
570 {
571     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
572     CHECK_NULL_VOID(spanNode);
573     auto spanItem = spanNode->GetSpanItem();
574     CHECK_NULL_VOID(spanItem);
575     CHECK_NULL_VOID(spanItem->accessibilityProperty);
576     spanItem->accessibilityProperty->SetAccessibilityLevel(importance);
577 }
578 
GetSpanFontFamily(UINode * uiNode)579 std::vector<std::string> SpanModelNG::GetSpanFontFamily(UINode* uiNode)
580 {
581     auto spanNode = AceType::DynamicCast<SpanNode>(uiNode);
582     std::vector<std::string> value;
583     CHECK_NULL_RETURN(spanNode, value);
584     return spanNode->GetFontFamily().value_or(value);
585 }
586 } // namespace OHOS::Ace::NG
587