• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H
18 
19 #include <string>
20 
21 #include "base/utils/utf_helper.h"
22 #include "core/components/common/layout/constants.h"
23 #include "core/components/common/properties/color.h"
24 #include "core/components_ng/layout/layout_property.h"
25 #include "core/components_ng/pattern/symbol/symbol_effect_options.h"
26 #include "core/components_ng/pattern/symbol/symbol_source_info.h"
27 #include "core/components_ng/pattern/text/text_styles.h"
28 #include "core/components_ng/property/property.h"
29 #include "core/components_v2/inspector/utils.h"
30 #include "core/components_ng/pattern/symbol/constants.h"
31 
32 namespace OHOS::Ace::NG {
33 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(group, name, type, changeFlag) \
34     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_GET(group, name, type)                  \
35     void Update##name(const type& value)                                        \
36     {                                                                           \
37         auto& groupProperty = GetOrCreate##group();                             \
38         if (groupProperty->Check##name(value)) {                                \
39             return;                                                             \
40         }                                                                       \
41         groupProperty->Update##name(value);                                     \
42         UpdatePropertyChangeFlag(changeFlag);                                   \
43         propNeedReCreateParagraph_ = true;                                      \
44     }
45 
46 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(name, type, changeFlag) \
47     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(name, type)                  \
48 public:                                                                     \
49     void Update##name(const type& value)                                    \
50     {                                                                       \
51         if (prop##name##_.has_value()) {                                    \
52             if (NearEqual(prop##name##_.value(), value)) {                  \
53                 return;                                                     \
54             }                                                               \
55         }                                                                   \
56         prop##name##_ = value;                                              \
57         UpdatePropertyChangeFlag(changeFlag);                               \
58         propNeedReCreateParagraph_ = true;                                  \
59     }
60 
61 #define ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(group, groupItem, name, type, changeFlag) \
62     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM_GET(group, groupItem, name, type)                  \
63     void Update##name(const type& value)                                                        \
64     {                                                                                           \
65         auto& groupProperty = GetOrCreate##group();                                             \
66         if (groupProperty->Check##groupItem(value)) {                                           \
67             return;                                                                             \
68         }                                                                                       \
69         groupProperty->Update##groupItem(value);                                                \
70         UpdatePropertyChangeFlag(changeFlag);                                                   \
71         propNeedReCreateParagraph_ = true;                                                      \
72     }
73 
74 class InspectorFilter;
75 
76 struct TextMarqueeOptions {
77     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStart, bool);
78     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStep, double);
79     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeLoop, int32_t);
80     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDirection, MarqueeDirection);
81     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeDelay, int32_t);
82     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeFadeout, bool);
83     ACE_DEFINE_PROPERTY_GROUP_ITEM(TextMarqueeStartPolicy, MarqueeStartPolicy);
84 };
85 
86 class ACE_EXPORT TextLayoutProperty : public LayoutProperty {
87     DECLARE_ACE_TYPE(TextLayoutProperty, LayoutProperty);
88 
89 public:
90     TextLayoutProperty() = default;
91 
92     ~TextLayoutProperty() override = default;
93 
Clone()94     RefPtr<LayoutProperty> Clone() const override
95     {
96         auto value = MakeRefPtr<TextLayoutProperty>();
97         Clone(value);
98         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
99         value->propSymbolSourceInfo_ = CloneSymbolSourceInfo();
100         return value;
101     }
102 
Reset()103     void Reset() override
104     {
105         LayoutProperty::Reset();
106         ResetFontStyle();
107         ResetTextLineStyle();
108         ResetContent();
109         ResetSymbolSourceInfo();
110         ResetAdaptFontSizeStep();
111         ResetTextMarqueeOptions();
112         ResetCursorColor();
113         ResetSelectedBackgroundColor();
114         ResetTextColorFlagByUser();
115     }
116 
117     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
118 
119     void ToJsonValueForOption(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
120 
121     void FromJson(const std::unique_ptr<JsonValue>& json) override;
122 
123     ACE_DEFINE_PROPERTY_GROUP(FontStyle, FontStyle);
124     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE);
125     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
126     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextShadow, std::vector<Shadow>, PROPERTY_UPDATE_MEASURE);
127     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
128     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
129     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, VariableFontWeight, int32_t, PROPERTY_UPDATE_MEASURE);
130     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
131     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE);
132     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecoration, TextDecoration, PROPERTY_UPDATE_MEASURE);
133     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationColor, Color, PROPERTY_UPDATE_MEASURE);
134     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
135         FontStyle, TextDecorationStyle, TextDecorationStyle, PROPERTY_UPDATE_MEASURE);
136     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextCase, TextCase, PROPERTY_UPDATE_MEASURE);
137     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMinFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
138     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMaxFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
139     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, LetterSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
140     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, EnableVariableFontWeight, bool, PROPERTY_UPDATE_MEASURE);
141     ACE_DEFINE_PROPERTY_GROUP(TextLineStyle, TextLineStyle);
142     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineHeight, Dimension, PROPERTY_UPDATE_MEASURE);
143     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
144     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextBaseline, TextBaseline, PROPERTY_UPDATE_MEASURE);
145     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, BaselineOffset, Dimension, PROPERTY_UPDATE_MEASURE);
146     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextAlign, TextAlign, PROPERTY_UPDATE_MEASURE);
147     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextOverflow, TextOverflow, PROPERTY_UPDATE_MEASURE);
148     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, EllipsisMode, EllipsisMode, PROPERTY_UPDATE_MEASURE);
149     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLines, uint32_t, PROPERTY_UPDATE_MEASURE);
150     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, AllowScale, bool, PROPERTY_UPDATE_MEASURE);
151     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
152         TextLineStyle, HeightAdaptivePolicy, TextHeightAdaptivePolicy, PROPERTY_UPDATE_MEASURE);
153     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextIndent, Dimension, PROPERTY_UPDATE_MEASURE);
154     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, WordBreak, WordBreak, PROPERTY_UPDATE_MEASURE);
155     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
156         TextLineStyle, LineBreakStrategy, LineBreakStrategy, PROPERTY_UPDATE_MEASURE);
157     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, HalfLeading, bool, PROPERTY_UPDATE_MEASURE_SELF);
158     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, ParagraphSpacing, Dimension, PROPERTY_UPDATE_MEASURE_SELF);
159 
160     ACE_DEFINE_PROPERTY_GROUP(TextMarqueeOptions, TextMarqueeOptions);
161     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStart, bool, PROPERTY_UPDATE_RENDER);
162     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeStep, double, PROPERTY_UPDATE_RENDER);
163     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeLoop, int32_t, PROPERTY_UPDATE_RENDER);
164     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
165         TextMarqueeOptions, TextMarqueeDirection, MarqueeDirection, PROPERTY_UPDATE_RENDER);
166     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeDelay, int32_t, PROPERTY_UPDATE_RENDER);
167     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextMarqueeOptions, TextMarqueeFadeout, bool, PROPERTY_UPDATE_RENDER);
168     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
169         TextMarqueeOptions, TextMarqueeStartPolicy, MarqueeStartPolicy, PROPERTY_UPDATE_RENDER);
170 
171     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(Content, std::u16string, PROPERTY_UPDATE_MEASURE);
172 public:
UpdateContent(const std::string & value)173     void UpdateContent(const std::string& value)
174     {
175         UpdateContent(UtfUtils::Str8DebugToStr16(value));
176     }
177     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CopyOption, CopyOptions, PROPERTY_UPDATE_MEASURE);
178     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(AdaptFontSizeStep, Dimension, PROPERTY_UPDATE_MEASURE_SELF);
179     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CursorColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
180     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedBackgroundColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
181     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextSelectableMode, TextSelectableMode, PROPERTY_UPDATE_MEASURE_SELF);
182     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsAnimationNeeded, bool, PROPERTY_UPDATE_NORMAL);
183     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlDefualtColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
184     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlHoverColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
185     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(UrlPressedColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
186 
187     // placeholder
188     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(Placeholder, std::u16string, PROPERTY_UPDATE_MEASURE);
189     ACE_DEFINE_PROPERTY_GROUP(PlaceholderFontStyle, FontStyle);
190     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(
191         PlaceholderFontStyle, FontSize, PlaceholderFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
192     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(
193         PlaceholderFontStyle, TextColor, PlaceholderTextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
194     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(
195         PlaceholderFontStyle, ItalicFontStyle, PlaceholderItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
196     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(
197         PlaceholderFontStyle, FontWeight, PlaceholderFontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
198     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP_ITEM(
199         PlaceholderFontStyle, FontFamily, PlaceholderFontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
200 
201     // symbol
202     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITHOUT_GROUP(SymbolSourceInfo, SymbolSourceInfo, PROPERTY_UPDATE_MEASURE);
203     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
204         FontStyle, SymbolColorList, std::vector<Color>, PROPERTY_UPDATE_MEASURE_SELF);
205     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
206         FontStyle, SymbolType, SymbolType, PROPERTY_UPDATE_MEASURE_SELF);
207     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
208         FontStyle, SymbolRenderingStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF);
209     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolEffectStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF);
210     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(
211         FontStyle, SymbolEffectOptions, SymbolEffectOptions, PROPERTY_UPDATE_MEASURE_SELF);
212     // fontscale
213     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, MinFontScale, float, PROPERTY_UPDATE_MEASURE);
214     ACE_DEFINE_TEXT_PROPERTY_ITEM_WITH_GROUP(FontStyle, MaxFontScale, float, PROPERTY_UPDATE_MEASURE);
215 
216     // for XTS inspector
InspectorGetTextFont()217     std::string InspectorGetTextFont() const
218     {
219         TextStyle font;
220         if (GetFontFamily().has_value()) {
221             font.SetFontFamilies(GetFontFamily().value());
222         }
223         if (GetFontSize().has_value()) {
224             font.SetFontSize(GetFontSize().value());
225         }
226         if (GetItalicFontStyle().has_value()) {
227             font.SetFontStyle(GetItalicFontStyle().value());
228         }
229         if (GetFontWeight().has_value()) {
230             font.SetFontWeight(GetFontWeight().value());
231         }
232         return V2::GetTextStyleInJson(font);
233     }
234     std::string GetCopyOptionString() const;
235 
UpdateTextColorByRender(const Color & value)236     void UpdateTextColorByRender(const Color &value)
237     {
238         auto& groupProperty = GetOrCreateFontStyle();
239         if (groupProperty->CheckTextColor(value)) {
240             return;
241         }
242         groupProperty->UpdateTextColor(value);
243         UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
244         propNeedReCreateParagraph_ = true;
245     }
246 
OnPropertyChangeMeasure()247     void OnPropertyChangeMeasure() override
248     {
249         propNeedReCreateParagraph_ = true;
250     }
251 
GetIsLoopAnimation()252     bool GetIsLoopAnimation() const
253     {
254         return isLoopAnimation_;
255     }
256 
SetIsLoopAnimation(bool isLoopAnimation)257     void SetIsLoopAnimation(bool isLoopAnimation)
258     {
259         isLoopAnimation_ = isLoopAnimation;
260     }
261 
262     // Used to mark whether a paragraph needs to be recreated for Measure.
263     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP_GET(NeedReCreateParagraph, bool);
264 
265     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorFlagByUser, bool, PROPERTY_UPDATE_NORMAL);
266 
267     std::string GetTextMarqueeOptionsString() const;
268     void UpdateMarqueeOptionsFromJson(const std::unique_ptr<JsonValue>& json);
269 
270 protected:
Clone(RefPtr<LayoutProperty> property)271     void Clone(RefPtr<LayoutProperty> property) const override
272     {
273         auto value = DynamicCast<TextLayoutProperty>(property);
274         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
275         value->propFontStyle_ = CloneFontStyle();
276         value->propTextLineStyle_ = CloneTextLineStyle();
277         value->propContent_ = CloneContent();
278         value->propAdaptFontSizeStep_ = CloneAdaptFontSizeStep();
279         value->propTextMarqueeOptions_ = CloneTextMarqueeOptions();
280         value->propCursorColor_ = CloneCursorColor();
281         value->propSelectedBackgroundColor_ = CloneSelectedBackgroundColor();
282         value->propNeedReCreateParagraph_ = true;
283     }
284 
285 private:
286     ACE_DISALLOW_COPY_AND_MOVE(TextLayoutProperty);
287 
288     bool isLoopAnimation_ = false;
289 };
290 } // namespace OHOS::Ace::NG
291 
292 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H
293