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 "core/components/common/layout/constants.h"
22 #include "core/components/common/properties/color.h"
23 #include "core/components_ng/layout/layout_property.h"
24 #include "core/components_ng/pattern/symbol/symbol_effect_options.h"
25 #include "core/components_ng/pattern/symbol/symbol_source_info.h"
26 #include "core/components_ng/pattern/text/text_styles.h"
27 #include "core/components_ng/property/property.h"
28 #include "core/components_v2/inspector/utils.h"
29 
30 namespace OHOS::Ace::NG {
31 class InspectorFilter;
32 
33 class ACE_EXPORT TextLayoutProperty : public LayoutProperty {
34     DECLARE_ACE_TYPE(TextLayoutProperty, LayoutProperty);
35 
36 public:
37     TextLayoutProperty() = default;
38 
39     ~TextLayoutProperty() override = default;
40 
Clone()41     RefPtr<LayoutProperty> Clone() const override
42     {
43         auto value = MakeRefPtr<TextLayoutProperty>();
44         Clone(value);
45         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
46         value->propSymbolSourceInfo_ = CloneSymbolSourceInfo();
47         return value;
48     }
49 
Reset()50     void Reset() override
51     {
52         LayoutProperty::Reset();
53         ResetFontStyle();
54         ResetTextLineStyle();
55         ResetContent();
56         ResetForegroundColor();
57         ResetSymbolSourceInfo();
58         ResetAdaptFontSizeStep();
59         ResetCursorColor();
60         ResetSelectedBackgroundColor();
61         ResetTextColorFlagByUser();
62     }
63 
64     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
65 
66     void FromJson(const std::unique_ptr<JsonValue>& json) override;
67 
68     ACE_DEFINE_PROPERTY_GROUP(FontStyle, FontStyle);
69     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE);
70     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
71     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextShadow, std::vector<Shadow>, PROPERTY_UPDATE_MEASURE);
72     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
73     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
74     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, VariableFontWeight, int32_t, PROPERTY_UPDATE_MEASURE);
75     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
76     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE);
77     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecoration, TextDecoration, PROPERTY_UPDATE_MEASURE);
78     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationColor, Color, PROPERTY_UPDATE_MEASURE);
79     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationStyle, TextDecorationStyle, PROPERTY_UPDATE_MEASURE);
80     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextCase, TextCase, PROPERTY_UPDATE_MEASURE);
81     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMinFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
82     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMaxFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
83     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, LetterSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
84     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, EnableVariableFontWeight, bool, PROPERTY_UPDATE_MEASURE);
85     ACE_DEFINE_PROPERTY_GROUP(TextLineStyle, TextLineStyle);
86     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineHeight, Dimension, PROPERTY_UPDATE_MEASURE);
87     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
88     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextBaseline, TextBaseline, PROPERTY_UPDATE_MEASURE);
89     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, BaselineOffset, Dimension, PROPERTY_UPDATE_MEASURE);
90     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextAlign, TextAlign, PROPERTY_UPDATE_MEASURE);
91     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextOverflow, TextOverflow, PROPERTY_UPDATE_MEASURE);
92     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, EllipsisMode, EllipsisMode, PROPERTY_UPDATE_MEASURE);
93     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLines, uint32_t, PROPERTY_UPDATE_MEASURE);
94     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, AllowScale, bool, PROPERTY_UPDATE_MEASURE);
95     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
96         TextLineStyle, HeightAdaptivePolicy, TextHeightAdaptivePolicy, PROPERTY_UPDATE_MEASURE);
97     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextIndent, Dimension, PROPERTY_UPDATE_MEASURE);
98     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, WordBreak, WordBreak, PROPERTY_UPDATE_MEASURE);
99     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineBreakStrategy, LineBreakStrategy, PROPERTY_UPDATE_MEASURE);
100     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, HalfLeading, bool, PROPERTY_UPDATE_MEASURE_SELF);
101     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Content, std::string, PROPERTY_UPDATE_MEASURE);
102     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CopyOption, CopyOptions, PROPERTY_UPDATE_MEASURE);
103     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ForegroundColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
104 
105     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(AdaptFontSizeStep, Dimension, PROPERTY_UPDATE_MEASURE_SELF);
106     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CursorColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
107     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectedBackgroundColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
108     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextSelectableMode, TextSelectableMode, PROPERTY_UPDATE_MEASURE_SELF);
109     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsAnimationNeeded, bool, PROPERTY_UPDATE_NORMAL);
110 
111     // placeholder
112     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Placeholder, std::string, PROPERTY_UPDATE_MEASURE);
113     ACE_DEFINE_PROPERTY_GROUP(PlaceholderFontStyle, FontStyle);
114     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
115         PlaceholderFontStyle, FontSize, PlaceholderFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
116     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
117         PlaceholderFontStyle, TextColor, PlaceholderTextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
118     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
119         PlaceholderFontStyle, ItalicFontStyle, PlaceholderItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
120     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
121         PlaceholderFontStyle, FontWeight, PlaceholderFontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
122     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
123         PlaceholderFontStyle, FontFamily, PlaceholderFontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
124 
125     // symbol
126     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SymbolSourceInfo, SymbolSourceInfo, PROPERTY_UPDATE_MEASURE);
127     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolColorList, std::vector<Color>, PROPERTY_UPDATE_MEASURE_SELF);
128     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolRenderingStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF);
129     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, SymbolEffectStrategy, uint32_t, PROPERTY_UPDATE_MEASURE_SELF);
130     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
131         FontStyle, SymbolEffectOptions, SymbolEffectOptions, PROPERTY_UPDATE_MEASURE_SELF);
132     // fontscale
133     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, MinFontScale, float, PROPERTY_UPDATE_MEASURE);
134     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, MaxFontScale, float, PROPERTY_UPDATE_MEASURE);
135 
136     // for XTS inspector
InspectorGetTextFont()137     std::string InspectorGetTextFont() const
138     {
139         TextStyle font;
140         if (GetFontFamily().has_value()) {
141             font.SetFontFamilies(GetFontFamily().value());
142         }
143         if (GetFontSize().has_value()) {
144             font.SetFontSize(GetFontSize().value());
145         }
146         if (GetItalicFontStyle().has_value()) {
147             font.SetFontStyle(GetItalicFontStyle().value());
148         }
149         if (GetFontWeight().has_value()) {
150             font.SetFontWeight(GetFontWeight().value());
151         }
152         return V2::GetTextStyleInJson(font);
153     }
154     std::string GetCopyOptionString() const;
155 
UpdateTextColorByRender(const Color & value)156     void UpdateTextColorByRender(const Color &value)
157     {
158         auto& groupProperty = GetOrCreateFontStyle();
159         if (groupProperty->CheckTextColor(value)) {
160             return;
161         }
162         groupProperty->UpdateTextColor(value);
163         UpdatePropertyChangeFlag(PROPERTY_UPDATE_RENDER);
164     }
165 
166     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextColorFlagByUser, bool, PROPERTY_UPDATE_NORMAL);
167 
168 protected:
Clone(RefPtr<LayoutProperty> property)169     void Clone(RefPtr<LayoutProperty> property) const override
170     {
171         auto value = DynamicCast<TextLayoutProperty>(property);
172         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
173         value->propFontStyle_ = CloneFontStyle();
174         value->propTextLineStyle_ = CloneTextLineStyle();
175         value->propContent_ = CloneContent();
176         value->propForegroundColor_ = CloneForegroundColor();
177         value->propAdaptFontSizeStep_ = CloneAdaptFontSizeStep();
178         value->propCursorColor_ = CloneCursorColor();
179         value->propSelectedBackgroundColor_ = CloneSelectedBackgroundColor();
180     }
181 
182 private:
183     ACE_DISALLOW_COPY_AND_MOVE(TextLayoutProperty);
184 };
185 } // namespace OHOS::Ace::NG
186 
187 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_TEXT_LAYOUT_PROPERTY_H
188