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