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