• 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_ALGORITHM_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_ALGORITHM_H
18 
19 #include <string>
20 #include <utility>
21 
22 #include "base/geometry/ng/offset_t.h"
23 #include "base/memory/referenced.h"
24 #include "core/components/text_field/textfield_theme.h"
25 #include "core/components_ng/layout/layout_wrapper.h"
26 #include "core/components_ng/pattern/text/text_adapt_font_sizer.h"
27 #include "core/components_ng/pattern/text_field/text_field_layout_property.h"
28 
29 namespace OHOS::Ace::NG {
30 
31 struct InlineMeasureItem {
32     float inlineScrollRectOffsetX = 0.0f;
33     float inlineLastOffsetY = 0.0f;
34     float inlineContentRectHeight = 0.0f;
35     float inlineSizeHeight = 0.0f;
36 };
37 struct CreateParagraphData {
38     bool disableTextAlign = false;
39     float fontSize = 0.0f;
40 };
41 class TextFieldPattern;
42 class TextFieldContentModifier;
43 class ACE_EXPORT TextFieldLayoutAlgorithm : public LayoutAlgorithm, public TextAdaptFontSizer {
44     DECLARE_ACE_TYPE(TextFieldLayoutAlgorithm, LayoutAlgorithm, TextAdaptFontSizer);
45 
46 public:
47     TextFieldLayoutAlgorithm() = default;
48 
49     ~TextFieldLayoutAlgorithm() override = default;
50 
OnReset()51     void OnReset() override
52     {
53         paragraph_->Reset();
54     }
55 
56     RefPtr<Paragraph> GetParagraph() const override;
57     void GetSuitableSize(SizeF& maxSize, LayoutWrapper* layoutWrapper) override;
58     bool CreateParagraphAndLayout(TextStyle& textStyle, const std::u16string& content,
59         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, bool needLayout = true) override;
60 
GetTextRect()61     const RectF& GetTextRect() const
62     {
63         return textRect_;
64     }
65 
GetParentGlobalOffset()66     const OffsetF& GetParentGlobalOffset() const
67     {
68         return parentGlobalOffset_;
69     }
70 
GetUnitWidth()71     float GetUnitWidth() const
72     {
73         return unitWidth_;
74     }
75 
GetTextIndent()76     float GetTextIndent() const
77     {
78         return indent_;
79     }
80 
GetInlineMeasureItem()81     InlineMeasureItem GetInlineMeasureItem() const
82     {
83         return inlineMeasureItem_;
84     }
85 
86     static TextDirection GetTextDirection(const std::u16string& content, TextDirection direction = TextDirection::AUTO);
87 
88     static void UpdateTextStyle(const RefPtr<FrameNode>& frameNode,
89         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
90         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser = true);
91     static void UpdatePlaceholderTextStyle(const RefPtr<FrameNode>& frameNode,
92         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
93         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser = true);
94     void CounterLayout(LayoutWrapper* layoutWrapper);
95     void ErrorLayout(LayoutWrapper* layoutWrapper);
96 
97     float CounterNodeMeasure(float contentWidth, LayoutWrapper* layoutWrapper);
98 
99     void UpdateCounterTextMargin(LayoutWrapper* layoutWrapper);
100     void UpdateCounterBorderStyle(uint32_t& textLength, uint32_t& maxLength, LayoutWrapper* layoutWrapper);
101     bool DidExceedMaxLines(const SizeF& maxSize) override;
102     bool IsAdaptExceedLimit(const SizeF& maxSize) override;
103     void UpdateTextAreaMaxLines(TextStyle& textStyle, const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty);
104     bool ShouldUseInfiniteMaxLines(const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty);
105 
106 protected:
107     static void FontRegisterCallback(const RefPtr<FrameNode>& frameNode, const std::vector<std::string>& fontFamilies);
108     void CreateParagraph(const TextStyle& textStyle, std::u16string content, bool needObscureText,
109         int32_t nakedCharPosition, CreateParagraphData paragraphData);
110     void CreateParagraph(const TextStyle& textStyle, const std::vector<std::u16string>& contents,
111         const std::u16string& content, bool needObscureText, CreateParagraphData paragraphData);
112     void CreateInlineParagraph(const TextStyle& textStyle, std::u16string content, bool needObscureText,
113         int32_t nakedCharPosition, CreateParagraphData paragraphData);
114     void CreateAutoFillParagraph(const TextStyle& textStyle, std::u16string content, bool needObscureText,
115         int32_t nakedCharPosition, CreateParagraphData paragraphData);
116     void SetPropertyToModifier(const TextStyle& textStyle, RefPtr<TextFieldContentModifier> modifier);
117 
118     float GetTextFieldDefaultHeight();
119 
120     void ConstructTextStyles(
121         const RefPtr<FrameNode>& frameNode, TextStyle& textStyle, std::u16string& textContent, bool& showPlaceHolder);
122     LayoutConstraintF CalculateContentMaxSizeWithCalculateConstraint(
123         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
124 
125     int32_t ConvertTouchOffsetToCaretPosition(const Offset& localOffset);
126     ParagraphStyle GetParagraphStyle(
127         const TextStyle& textStyle, const std::u16string& content, const float fontSize) const;
128     void GetInlineMeasureItem(
129         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, float& inlineIdealHeight);
130     float ConstraintWithMinWidth(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper,
131         RefPtr<Paragraph>& paragraph, float removeValue = 0.0f);
132     SizeF GetConstraintSize(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
133     std::optional<SizeF> InlineMeasureContent(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
134     SizeF PlaceHolderMeasureContent(
135         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, float imageWidth = 0.0f);
136     SizeF TextInputMeasureContent(
137         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, float imageWidth);
138     SizeF TextAreaMeasureContent(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
139 
140     bool AddAdaptFontSizeAndAnimations(TextStyle& textStyle, const RefPtr<TextFieldLayoutProperty>& layoutProperty,
141         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
142     bool IsNeedAdaptFontSize(const TextStyle& textStyle, const RefPtr<TextFieldLayoutProperty>& layoutProperty,
143         const LayoutConstraintF& contentConstraint);
144     bool AdaptInlineFocusFontSize(TextStyle& textStyle, const std::u16string& content, const Dimension& stepUnit,
145         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper) override;
146     bool AdaptInlineFocusMinFontSize(TextStyle& textStyle, const std::u16string& content, const Dimension& stepUnit,
147         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
148     virtual bool CreateParagraphEx(const TextStyle& textStyle, const std::u16string& content,
149         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper) = 0;
150 
151     LayoutConstraintF CalculateFrameSizeConstraint(
152         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
153 
154     RefPtr<Paragraph> paragraph_;
155     RefPtr<Paragraph> inlineParagraph_;
156     InlineMeasureItem inlineMeasureItem_;
157     LayoutConstraintF textFieldContentConstraint_;
158 
159     RectF textRect_;
160     OffsetF parentGlobalOffset_;
161     std::u16string textContent_;
162     bool showPlaceHolder_ = false;
163     float preferredHeight_ = 0.0f;
164     TextDirection direction_ = TextDirection::AUTO;
165 
166     float unitWidth_ = 0.0f;
167     bool autoWidth_ = false;
168     bool isFontSizeNonPositive_ = false;
169     Dimension textIndent_ = 0.0_px;
170     float indent_ = 0.0f;
171     bool isInlineFocus_ = false;
172     bool isPlaceHolderOverSize_ = false;
173 
174 private:
175     void InlineFocusMeasure(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper,
176         double& safeBoundary, float& contentWidth);
177     static void UpdateTextStyleSetTextColor(const RefPtr<FrameNode>& frameNode,
178         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
179         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser = true);
180     static void UpdateTextStyleMore(const RefPtr<FrameNode>& frameNode,
181         const RefPtr<TextFieldLayoutProperty>& layoutProperty, TextStyle& textStyle, bool isDisabled);
182     static void UpdateTextStyleLineHeight(const RefPtr<FrameNode>& frameNode,
183         const RefPtr<TextFieldLayoutProperty>& layoutProperty, TextStyle& textStyle);
184     static void UpdateTextStyleFontScale(const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty,
185         TextStyle& textStyle, const RefPtr<TextFieldPattern>& pattern);
186     static void UpdatePlaceholderTextStyleSetTextColor(
187         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
188         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser);
189     static void UpdatePlaceholderTextStyleMore(const RefPtr<FrameNode>& frameNode,
190         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
191         TextStyle& placeholderTextStyle, bool isDisabled);
192     void UpdateTextStyleTextOverflowAndWordBreak(TextStyle& textStyle, bool isTextArea,
193         bool isInlineStyle, const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty, bool isTextFadeout);
194     float GetVisualTextWidth() const;
195     void CalcInlineMeasureItem(LayoutWrapper* layoutWrapper);
196     bool IsInlineFocusAdaptExceedLimit(const SizeF& maxSize);
197     bool IsInlineFocusAdaptMinExceedLimit(const SizeF& maxSize, uint32_t maxViewLines);
198     float CalculateContentWidth(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper,
199         float imageWidth);
200     float CalculateContentHeight(const LayoutConstraintF& contentConstraint);
201     LayoutConstraintF BuildInfinityLayoutConstraint(const LayoutConstraintF& contentConstraint);
202     void ApplyIndent(LayoutWrapper* layoutWrapper, double width);
203     LayoutConstraintF BuildInlineFocusLayoutConstraint(const LayoutConstraintF& contentConstraint,
204         LayoutWrapper* layoutWrapper);
205     void CalculateContentMaxSizeWithPolicy(
206         LayoutWrapper* layoutWrapper, LayoutConstraintF& contentConstraint, SizeF& maxIdealSize);
207     double GetMaxIndent(LayoutWrapper* layoutWrapper, double width);
208     bool HasCalcMinWidthVersion11OrLarger(LayoutWrapper* layoutWrapper, const LayoutConstraintF& contentConstraint);
209     ACE_DISALLOW_COPY_AND_MOVE(TextFieldLayoutAlgorithm);
210 };
211 } // namespace OHOS::Ace::NG
212 
213 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_ALGORITHM_H