1 /*
2  * Copyright (c) 2022-2024 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_FIELD_TEXT_FIELD_LAYOUT_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_PROPERTY_H
18 
19 #include "core/common/ime/text_input_type.h"
20 #include "core/components/common/properties/text_style.h"
21 #include "core/components/text_field/textfield_theme.h"
22 #include "core/components_ng/base/inspector_filter.h"
23 #include "core/components_ng/layout/layout_property.h"
24 #include "core/components_ng/pattern/text/text_styles.h"
25 #include "core/components_ng/pattern/text_field/text_content_type.h"
26 #include "core/components_ng/pattern/text_field/text_field_model.h"
27 #include "core/components_ng/property/property.h"
28 #include "core/image/image_source_info.h"
29 
30 namespace OHOS::Ace::NG {
31 class ACE_EXPORT TextFieldLayoutProperty : public LayoutProperty {
32     DECLARE_ACE_TYPE(TextFieldLayoutProperty, LayoutProperty);
33 
34 public:
35     TextFieldLayoutProperty() = default;
36 
37     ~TextFieldLayoutProperty() override = default;
38 
Clone()39     RefPtr<LayoutProperty> Clone() const override
40     {
41         auto value = MakeRefPtr<TextFieldLayoutProperty>();
42         Clone(value);
43         return value;
44     }
45 
Reset()46     void Reset() override
47     {
48         LayoutProperty::Reset();
49         ResetFontStyle();
50         ResetTextLineStyle();
51         ResetValue();
52         ResetPlaceholderFontStyle();
53         ResetPlaceholderTextLineStyle();
54         ResetShowPasswordText();
55         ResetPlaceholder();
56         ResetTextInputType();
57         ResetInputFilter();
58         ResetShowPasswordIcon();
59         ResetCopyOptions();
60         ResetLastValue();
61         ResetNeedFireOnChange();
62         ResetWidthAuto();
63         ResetErrorText();
64         ResetShowErrorText();
65         ResetShowCounter();
66         ResetShowUnderline();
67         ResetShowPasswordSourceInfo();
68         ResetHidePasswordSourceInfo();
69         ResetTextAlignChanged();
70         ResetDisplayMode();
71         ResetMaxViewLines();
72         ResetNormalMaxViewLines();
73         ResetSelectionMenuHidden();
74         ResetPasswordRules();
75         ResetEnableAutoFill();
76         ResetCleanNodeStyle();
77         ResetIconSize();
78         ResetIconSrc();
79         ResetBundleName();
80         ResetModuleName();
81         ResetIconColor();
82         ResetSelectAllValue();
83         ResetShowHighlightBorder();
84         ResetSetCounter();
85         ResetNumberOfLines();
86     }
87 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)88     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override
89     {
90         LayoutProperty::ToJsonValue(json, filter);
91         /* no fixed attr below, just return */
92         if (filter.IsFastFilter()) {
93             return;
94         }
95         json->PutExtAttr("showPasswordIcon", propShowPasswordIcon_.value_or(true), filter);
96         json->PutExtAttr("showPassword", propShowPasswordText_.value_or(false), filter);
97         json->PutExtAttr("errorText", propErrorText_.value_or("").c_str(), filter);
98         json->PutExtAttr("showErrorText", propShowErrorText_.value_or(false), filter);
99         json->PutExtAttr("showCounter", propShowCounter_.value_or(false), filter);
100         json->PutExtAttr("highlightBorder", propShowHighlightBorder_.value_or(true), filter);
101         json->PutExtAttr("showUnderline", propShowUnderline_.value_or(false), filter);
102         json->PutExtAttr("passwordRules", propPasswordRules_.value_or("").c_str(), filter);
103         json->PutExtAttr("enableAutoFill", propEnableAutoFill_.value_or(true), filter);
104         auto jsonCancelButton = JsonUtil::Create(true);
105         jsonCancelButton->Put("style", static_cast<int32_t>(propCleanNodeStyle_.value_or(CleanNodeStyle::INPUT)));
106         auto jsonIconOptions = JsonUtil::Create(true);
107         jsonIconOptions->Put("size", propIconSize_.value_or(Dimension()).ToString().c_str());
108         jsonIconOptions->Put("src", propIconSrc_.value_or("").c_str());
109         jsonIconOptions->Put("color", propIconColor_.value_or(Color()).ColorToString().c_str());
110         jsonCancelButton->Put("icon", jsonIconOptions->ToString().c_str());
111         json->PutExtAttr("cancelButton", jsonCancelButton->ToString().c_str(), filter);
112         json->PutExtAttr("selectAll", propSelectAllValue_.value_or(false), filter);
113         json->PutExtAttr("letterSpacing", GetLetterSpacing().value_or(Dimension()).ToString().c_str(), filter);
114         json->PutExtAttr("lineHeight", GetLineHeight().value_or(0.0_vp).ToString().c_str(), filter);
115         json->PutExtAttr("lineSpacing", GetLineSpacing().value_or(0.0_vp).ToString().c_str(), filter);
116         auto jsonDecoration = JsonUtil::Create(true);
117         std::string type = V2::ConvertWrapTextDecorationToStirng(
118             GetTextDecoration().value_or(TextDecoration::NONE));
119         jsonDecoration->Put("type", type.c_str());
120         jsonDecoration->Put("color", GetTextDecorationColor().value_or(Color::BLACK).ColorToString().c_str());
121         std::string style = V2::ConvertWrapTextDecorationStyleToString(
122             GetTextDecorationStyle().value_or(TextDecorationStyle::SOLID));
123         jsonDecoration->Put("style", style.c_str());
124         json->PutExtAttr("decoration", jsonDecoration->ToString().c_str(), filter);
125         json->PutExtAttr("minFontSize", GetAdaptMinFontSize().value_or(Dimension()).ToString().c_str(), filter);
126         json->PutExtAttr("maxFontSize", GetAdaptMaxFontSize().value_or(Dimension()).ToString().c_str(), filter);
127         json->PutExtAttr("heightAdaptivePolicy", V2::ConvertWrapTextHeightAdaptivePolicyToString(
128             GetHeightAdaptivePolicy().value_or(TextHeightAdaptivePolicy::MAX_LINES_FIRST)).c_str(), filter);
129         json->Put("wordBreak",
130             V2::ConvertWrapWordBreakToString(GetWordBreak().value_or(WordBreak::BREAK_WORD)).c_str());
131         json->Put("textOverflow",
132             V2::ConvertWrapTextOverflowToString(GetTextOverflow().value_or(TextOverflow::CLIP)).c_str());
133         json->PutExtAttr("textIndent", GetTextIndent().value_or(0.0_vp).ToString().c_str(), filter);
134     }
135 
136     ACE_DEFINE_PROPERTY_GROUP(FontStyle, FontStyle);
137     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontSize, Dimension, PROPERTY_UPDATE_MEASURE);
138     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
139     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, ItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
140     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
141     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
142     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, FontFeature, FONT_FEATURES_LIST, PROPERTY_UPDATE_MEASURE);
143     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, LetterSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
144     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMinFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
145     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, AdaptMaxFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
146     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecoration, TextDecoration, PROPERTY_UPDATE_MEASURE);
147     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationColor, Color, PROPERTY_UPDATE_MEASURE);
148     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(FontStyle, TextDecorationStyle, TextDecorationStyle, PROPERTY_UPDATE_MEASURE);
149 
150     ACE_DEFINE_PROPERTY_GROUP(TextLineStyle, TextLineStyle);
151     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextAlign, TextAlign, PROPERTY_UPDATE_MEASURE_SELF);
152     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineBreakStrategy, LineBreakStrategy, PROPERTY_UPDATE_MEASURE);
153     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLength, uint32_t, PROPERTY_UPDATE_MEASURE);
154     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, MaxLines, uint32_t, PROPERTY_UPDATE_MEASURE);
155     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(
156         TextLineStyle, HeightAdaptivePolicy, TextHeightAdaptivePolicy, PROPERTY_UPDATE_MEASURE);
157     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineHeight, Dimension, PROPERTY_UPDATE_MEASURE);
158     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, LineSpacing, Dimension, PROPERTY_UPDATE_MEASURE);
159     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, WordBreak, WordBreak, PROPERTY_UPDATE_MEASURE);
160     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextOverflow, TextOverflow, PROPERTY_UPDATE_MEASURE);
161     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, TextIndent, Dimension, PROPERTY_UPDATE_MEASURE);
162     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP(TextLineStyle, NumberOfLines, int32_t, PROPERTY_UPDATE_MEASURE);
163     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Value, std::string, PROPERTY_UPDATE_NORMAL);
164     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PreviewText, PreviewText, PROPERTY_UPDATE_NORMAL);
165 
166     ACE_DEFINE_PROPERTY_GROUP(PlaceholderFontStyle, FontStyle);
167     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
168         PlaceholderFontStyle, FontSize, PlaceholderFontSize, Dimension, PROPERTY_UPDATE_MEASURE);
169     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
170         PlaceholderFontStyle, TextColor, PlaceholderTextColor, Color, PROPERTY_UPDATE_MEASURE_SELF);
171     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
172         PlaceholderFontStyle, ItalicFontStyle, PlaceholderItalicFontStyle, Ace::FontStyle, PROPERTY_UPDATE_MEASURE);
173     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
174         PlaceholderFontStyle, FontWeight, PlaceholderFontWeight, FontWeight, PROPERTY_UPDATE_MEASURE);
175     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
176         PlaceholderFontStyle, FontFamily, PlaceholderFontFamily, std::vector<std::string>, PROPERTY_UPDATE_MEASURE);
177 
178     ACE_DEFINE_PROPERTY_GROUP(PlaceholderTextLineStyle, TextLineStyle);
179     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
180         PlaceholderTextLineStyle, LineHeight, PlaceholderLineHeight, Dimension, PROPERTY_UPDATE_MEASURE);
181     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
182         PlaceholderTextLineStyle, TextAlign, PlaceholderTextAlign, TextAlign, PROPERTY_UPDATE_MEASURE);
183     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
184         PlaceholderTextLineStyle, MaxLength, PlaceholderMaxLength, uint32_t, PROPERTY_UPDATE_MEASURE);
185     ACE_DEFINE_PROPERTY_ITEM_WITH_GROUP_ITEM(
186         PlaceholderTextLineStyle, MaxLines, PlaceholderMaxLines, uint32_t, PROPERTY_UPDATE_MEASURE);
187     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(Placeholder, std::string, PROPERTY_UPDATE_MEASURE);
188     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ErrorText, std::string, PROPERTY_UPDATE_MEASURE);
189     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowErrorText, bool, PROPERTY_UPDATE_MEASURE);
190 
191     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextContentType, TextContentType, PROPERTY_UPDATE_MEASURE);
192     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextInputType, TextInputType, PROPERTY_UPDATE_MEASURE);
193     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(InputFilter, std::string, PROPERTY_UPDATE_MEASURE);
194     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowPasswordText, bool, PROPERTY_UPDATE_MEASURE_SELF);
195     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowPasswordIcon, bool, PROPERTY_UPDATE_MEASURE_SELF);
196     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowCounter, bool, PROPERTY_UPDATE_MEASURE);
197     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowUnderline, bool, PROPERTY_UPDATE_MEASURE);
198     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(DisplayMode, DisplayMode, PROPERTY_UPDATE_MEASURE);
199     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(MaxViewLines, uint32_t, PROPERTY_UPDATE_MEASURE);
200     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(NormalMaxViewLines, uint32_t, PROPERTY_UPDATE_MEASURE);
201     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsDisabled, bool, PROPERTY_UPDATE_MEASURE);
202     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextOverflowMaxLines, uint32_t, PROPERTY_UPDATE_MEASURE);
203 
204     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextContentTypeChanged, bool, PROPERTY_UPDATE_MEASURE);
205     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(WidthAuto, bool, PROPERTY_UPDATE_MEASURE);
206     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TypeChanged, bool, PROPERTY_UPDATE_MEASURE);
207     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(TextAlignChanged, bool, PROPERTY_UPDATE_MEASURE);
208     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CopyOptions, CopyOptions, PROPERTY_UPDATE_MEASURE);
209     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PreferredNewLineHeightNeedToUpdate, bool, PROPERTY_UPDATE_MEASURE);
210     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PreferredTextLineHeightNeedToUpdate, bool, PROPERTY_UPDATE_MEASURE);
211     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PreferredPlaceholderLineHeightNeedToUpdate, bool, PROPERTY_UPDATE_MEASURE);
212     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(LastValue, std::string, PROPERTY_UPDATE_MEASURE);
213     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(NeedFireOnChange, bool, PROPERTY_UPDATE_NORMAL);
214 
215     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowPasswordSourceInfo, ImageSourceInfo, PROPERTY_UPDATE_MEASURE);
216     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(HidePasswordSourceInfo, ImageSourceInfo, PROPERTY_UPDATE_MEASURE);
217     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectionMenuHidden, bool, PROPERTY_UPDATE_MEASURE);
218     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(PasswordRules, std::string, PROPERTY_UPDATE_MEASURE);
219     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(EnableAutoFill, bool, PROPERTY_UPDATE_MEASURE);
220 
221     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SelectAllValue, bool, PROPERTY_UPDATE_NORMAL);
222 
223     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(CleanNodeStyle, CleanNodeStyle, PROPERTY_UPDATE_MEASURE);
224     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IconSize, CalcDimension, PROPERTY_UPDATE_MEASURE);
225     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IconSrc, std::string, PROPERTY_UPDATE_MEASURE);
226     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(BundleName, std::string, PROPERTY_UPDATE_MEASURE);
227     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ModuleName, std::string, PROPERTY_UPDATE_MEASURE);
228     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IconColor, Color, PROPERTY_UPDATE_MEASURE);
229     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(IsShowCancelButton, bool, PROPERTY_UPDATE_MEASURE);
230     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(SetCounter, int32_t, PROPERTY_UPDATE_MEASURE);
231     ACE_DEFINE_PROPERTY_ITEM_WITHOUT_GROUP(ShowHighlightBorder, bool, PROPERTY_UPDATE_MEASURE);
232 
233 protected:
Clone(RefPtr<LayoutProperty> property)234     void Clone(RefPtr<LayoutProperty> property) const override
235     {
236         auto value = DynamicCast<TextFieldLayoutProperty>(property);
237         value->LayoutProperty::UpdateLayoutProperty(DynamicCast<LayoutProperty>(this));
238         value->propFontStyle_ = CloneFontStyle();
239         value->propTextLineStyle_ = CloneTextLineStyle();
240         value->propValue_ = CloneValue();
241         value->propPlaceholderFontStyle_ = ClonePlaceholderFontStyle();
242         value->propPlaceholderTextLineStyle_ = ClonePlaceholderTextLineStyle();
243         value->propPlaceholder_ = ClonePlaceholder();
244         value->propTextInputType_ = CloneTextInputType();
245         value->propInputFilter_ = CloneInputFilter();
246         value->propShowPasswordIcon_ = CloneShowPasswordIcon();
247         value->propCopyOptions_ = CloneCopyOptions();
248         value->propLastValue_ = CloneLastValue();
249         value->propNeedFireOnChange_ = CloneNeedFireOnChange();
250         value->propWidthAuto_ = CloneWidthAuto();
251         value->propErrorText_ = CloneErrorText();
252         value->propShowErrorText_ = CloneShowErrorText();
253         value->propShowCounter_ = CloneShowCounter();
254         value->propShowUnderline_ = CloneShowUnderline();
255         value->propShowPasswordSourceInfo_ = CloneShowPasswordSourceInfo();
256         value->propHidePasswordSourceInfo_ = CloneHidePasswordSourceInfo();
257         value->propTextAlignChanged_ = CloneTextAlignChanged();
258         value->propDisplayMode_ = CloneDisplayMode();
259         value->propMaxViewLines_ = CloneMaxViewLines();
260         value->propIsDisabled_ = CloneIsDisabled();
261         value->propSelectionMenuHidden_ = CloneSelectionMenuHidden();
262         value->propPasswordRules_ = ClonePasswordRules();
263         value->propEnableAutoFill_ = CloneEnableAutoFill();
264         value->propShowPasswordText_ = CloneShowPasswordText();
265         value->propCleanNodeStyle_ = CloneCleanNodeStyle();
266         value->propIconSize_ = CloneIconSize();
267         value->propIconSrc_ = CloneIconSrc();
268         value->propIconColor_ = CloneIconColor();
269         value->propSelectAllValue_ = CloneSelectAllValue();
270         value->propSetCounter_ = CloneSetCounter();
271         value->propShowHighlightBorder_ = CloneShowHighlightBorder();
272         value->propBundleName_ = CloneBundleName();
273         value->propModuleName_ = CloneModuleName();
274     }
275 
276     ACE_DISALLOW_COPY_AND_MOVE(TextFieldLayoutProperty);
277 };
278 } // namespace OHOS::Ace::NG
279 
280 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_PROPERTY_H
281