• 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(const 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 
104 
105 protected:
106     static void FontRegisterCallback(const RefPtr<FrameNode>& frameNode, const std::vector<std::string>& fontFamilies);
107     void CreateParagraph(const TextStyle& textStyle, std::u16string content, bool needObscureText,
108         int32_t nakedCharPosition, CreateParagraphData paragraphData);
109     void CreateParagraph(const TextStyle& textStyle, const std::vector<std::u16string>& contents,
110         const std::u16string& content, bool needObscureText, CreateParagraphData paragraphData);
111     void CreateInlineParagraph(const TextStyle& textStyle, std::u16string content, bool needObscureText,
112         int32_t nakedCharPosition, CreateParagraphData paragraphData);
113     void SetPropertyToModifier(const TextStyle& textStyle, RefPtr<TextFieldContentModifier> modifier);
114 
115     float GetTextFieldDefaultHeight();
116 
117     void ConstructTextStyles(
118         const RefPtr<FrameNode>& frameNode, TextStyle& textStyle, std::u16string& textContent, bool& showPlaceHolder);
119     LayoutConstraintF CalculateContentMaxSizeWithCalculateConstraint(
120         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
121 
122     int32_t ConvertTouchOffsetToCaretPosition(const Offset& localOffset);
123     ParagraphStyle GetParagraphStyle(
124         const TextStyle& textStyle, const std::u16string& content, const float fontSize) const;
125     void GetInlineMeasureItem(
126         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, float& inlineIdealHeight);
127     float ConstraintWithMinWidth(
128         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper,
129         RefPtr<Paragraph>& paragraph, float removeValue = 0.0f);
130     SizeF GetConstraintSize(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
131     std::optional<SizeF> InlineMeasureContent(const LayoutConstraintF& contentConstraint,
132         LayoutWrapper* layoutWrapper);
133     SizeF PlaceHolderMeasureContent(
134         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper, float imageWidth = 0.0f);
135     SizeF TextInputMeasureContent(const LayoutConstraintF& contentConstraint,
136         LayoutWrapper* layoutWrapper, float imageWidth);
137     SizeF TextAreaMeasureContent(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
138 
139     bool AddAdaptFontSizeAndAnimations(TextStyle& textStyle, const RefPtr<TextFieldLayoutProperty>& layoutProperty,
140         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
141     bool IsNeedAdaptFontSize(const TextStyle& textStyle, const RefPtr<TextFieldLayoutProperty>& layoutProperty,
142         const LayoutConstraintF& contentConstraint);
143     bool AdaptInlineFocusFontSize(TextStyle& textStyle, const std::u16string& content, const Dimension& stepUnit,
144         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper) override;
145     bool AdaptInlineFocusMinFontSize(TextStyle& textStyle, const std::u16string& content, const Dimension& stepUnit,
146         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
147     virtual bool CreateParagraphEx(const TextStyle& textStyle, const std::u16string& content,
148         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper) = 0;
149 
150     LayoutConstraintF CalculateFrameSizeConstraint(
151         const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper);
152 
153     RefPtr<Paragraph> paragraph_;
154     RefPtr<Paragraph> inlineParagraph_;
155     InlineMeasureItem inlineMeasureItem_;
156     LayoutConstraintF textFieldContentConstraint_;
157 
158     RectF textRect_;
159     OffsetF parentGlobalOffset_;
160     std::u16string textContent_;
161     bool showPlaceHolder_ = false;
162     float preferredHeight_ = 0.0f;
163     TextDirection direction_ = TextDirection::AUTO;
164 
165     float unitWidth_ = 0.0f;
166     bool autoWidth_ = false;
167     bool isFontSizeNonPositive_ = false;
168     Dimension textIndent_ = 0.0_px;
169     float indent_ = 0.0f;
170 private:
171     void InlineFocusMeasure(const LayoutConstraintF& contentConstraint,
172         LayoutWrapper* layoutWrapper, double& safeBoundary, float& contentWidth);
173     static void UpdateTextStyleSetTextColor(const RefPtr<FrameNode>& frameNode,
174         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
175         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser = true);
176     static void UpdateTextStyleMore(const RefPtr<FrameNode>& frameNode,
177         const RefPtr<TextFieldLayoutProperty>& layoutProperty, TextStyle& textStyle, bool isDisabled);
178     static void UpdateTextStyleLineHeight(const RefPtr<FrameNode>& frameNode,
179         const RefPtr<TextFieldLayoutProperty>& layoutPropeerty, TextStyle& textStyle);
180     static void UpdateTextStyleFontScale(const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty,
181         TextStyle& textStyle, const RefPtr<TextFieldPattern>& pattern);
182     static void UpdatePlaceholderTextStyleSetTextColor(
183         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
184         TextStyle& textStyle, bool isDisabled, bool isTextColorByUser);
185     static void UpdatePlaceholderTextStyleMore(const RefPtr<FrameNode>& frameNode,
186         const RefPtr<TextFieldLayoutProperty>& layoutProperty, const RefPtr<TextFieldTheme>& theme,
187         TextStyle& placeholderTextStyle, bool isDisabled);
188     void UpdateTextStyleTextOverflowAndWordBreak(TextStyle& textStyle, bool isTextArea,
189         bool isInlineStyle, const RefPtr<TextFieldLayoutProperty>& textFieldLayoutProperty, bool isTextFadeout);
190     float GetVisualTextWidth() const;
191     void CalcInlineMeasureItem(LayoutWrapper* layoutWrapper);
192     bool IsInlineFocusAdaptExceedLimit(const SizeF& maxSize);
193     bool IsInlineFocusAdaptMinExceedLimit(const SizeF& maxSize, uint32_t maxViewLines);
194     float CalculateContentWidth(const LayoutConstraintF& contentConstraint, LayoutWrapper* layoutWrapper,
195         float imageWidth);
196     float CalculateContentHeight(const LayoutConstraintF& contentConstraint);
197     LayoutConstraintF BuildInfinityLayoutConstraint(const LayoutConstraintF& contentConstraint);
198     void ApplyIndent(LayoutWrapper* layoutWrapper, double width);
199     LayoutConstraintF BuildInlineFocusLayoutConstraint(const LayoutConstraintF& contentConstraint,
200         LayoutWrapper* layoutWrapper);
201     ACE_DISALLOW_COPY_AND_MOVE(TextFieldLayoutAlgorithm);
202 };
203 } // namespace OHOS::Ace::NG
204 
205 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_LAYOUT_ALGORITHM_H