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_MODEL_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H 18 19 #include <functional> 20 #include <mutex> 21 #include <optional> 22 #include <utility> 23 #include <vector> 24 25 #include "base/geometry/dimension.h" 26 #include "base/geometry/ng/offset_t.h" 27 #include "base/memory/referenced.h" 28 #include "base/utils/macros.h" 29 #include "core/common/ime/text_input_action.h" 30 #include "core/common/ime/text_input_type.h" 31 #include "core/components/box/drag_drop_event.h" 32 #include "core/components/common/properties/color.h" 33 #include "core/components/common/properties/text_style.h" 34 #include "core/components_ng/base/view_abstract_model_ng.h" 35 #include "core/components_ng/pattern/rich_editor/selection_info.h" 36 #include "core/components_ng/pattern/text/text_menu_extension.h" 37 #include "core/components_ng/pattern/text_field/text_content_type.h" 38 #include "core/components_ng/pattern/text_field/text_field_event_hub.h" 39 #include "core/components_ng/property/measure_property.h" 40 41 namespace OHOS::Ace { 42 43 struct Font { 44 std::optional<FontWeight> fontWeight; 45 std::optional<Dimension> fontSize; 46 std::optional<FontStyle> fontStyle; 47 std::vector<std::string> fontFamilies; 48 std::optional<Color> fontColor; 49 std::optional<std::vector<std::string>> fontFamiliesNG; 50 std::optional<bool> enableVariableFontWeight; 51 std::optional<Dimension> strokeWidth; 52 std::optional<Color> strokeColor; 53 std::optional<SuperscriptStyle> superscript; 54 IsEqualFont55 bool IsEqual(const Font& other) const 56 { 57 bool flag = fontWeight == other.fontWeight && fontSize == other.fontSize && fontStyle == other.fontStyle && 58 fontColor == other.fontColor && enableVariableFontWeight == other.enableVariableFontWeight && 59 strokeWidth == other.strokeWidth && strokeColor == other.strokeColor && 60 superscript == other.superscript; 61 if (!flag) { 62 return false; 63 } 64 if (fontFamiliesNG.has_value() && other.fontFamiliesNG) { 65 auto curFontFamilies = fontFamiliesNG.value(); 66 auto otherFontFamilies = other.fontFamiliesNG.value(); 67 if (curFontFamilies.size() != otherFontFamilies.size()) { 68 return false; 69 } 70 for (size_t i = 0; i < curFontFamilies.size(); ++i) { 71 if (curFontFamilies[i] != otherFontFamilies[i]) { 72 return false; 73 } 74 } 75 } 76 return flag; 77 } 78 GetFontColorFont79 std::string GetFontColor() const 80 { 81 return fontColor.has_value() ? fontColor.value().ColorToString() : ""; 82 } 83 GetFontFamilyFont84 std::string GetFontFamily() const 85 { 86 if (!fontFamiliesNG.has_value() || fontFamiliesNG.value().empty()) { 87 return ""; 88 } 89 std::stringstream ss; 90 auto fontFamily = fontFamiliesNG.value(); 91 ss << fontFamily[0]; 92 93 for (uint32_t index = 1; index < fontFamily.size(); ++index) { 94 ss << "," << fontFamily[index]; 95 } 96 return ss.str(); 97 } 98 GetStrokeColorFont99 std::optional<Color> GetStrokeColor() const 100 { 101 return strokeColor; 102 } 103 GetStrokeWidthFont104 std::optional<Dimension> GetStrokeWidth() const 105 { 106 return strokeWidth; 107 } 108 GetFontWeightFont109 std::optional<FontWeight> GetFontWeight() const 110 { 111 return fontWeight; 112 } 113 GetFontSizeFont114 std::optional<Dimension> GetFontSize() const 115 { 116 return fontSize; 117 } 118 GetFontStyleFont119 std::optional<FontStyle> GetFontStyle() const 120 { 121 return fontStyle; 122 } 123 GetSuperscriptFont124 std::optional<SuperscriptStyle> GetSuperscript() const 125 { 126 return superscript; 127 } 128 }; 129 130 struct CaretStyle { 131 std::optional<Dimension> caretWidth; 132 }; 133 134 struct PasswordIcon { 135 std::string showResult; 136 std::string hideResult; 137 std::string showBundleName; 138 std::string hideBundleName; 139 std::string showModuleName; 140 std::string hideModuleName; 141 }; 142 143 struct UserUnderlineColor { 144 std::optional<Color> typing = std::nullopt; 145 std::optional<Color> normal = std::nullopt; 146 std::optional<Color> error = std::nullopt; 147 std::optional<Color> disable = std::nullopt; 148 }; 149 150 enum class InputStyle { 151 DEFAULT, 152 INLINE, 153 }; 154 155 enum class CleanNodeStyle { 156 CONSTANT, 157 INVISIBLE, 158 INPUT, 159 }; 160 161 enum class MenuPolicy { DEFAULT = 0, HIDE, SHOW }; 162 enum class HandlePolicy { DEFAULT = 0, HIDE, SHOW }; 163 164 enum class CancelButtonStyle { 165 CONSTANT, 166 INVISIBLE, 167 INPUT, 168 }; 169 170 struct SelectionOptions { 171 MenuPolicy menuPolicy = MenuPolicy::DEFAULT; 172 HandlePolicy handlePolicy = HandlePolicy::DEFAULT; 173 }; 174 175 enum class PreviewTextStyle { 176 NORMAL, 177 UNDERLINE, 178 }; 179 180 class ACE_EXPORT TextFieldControllerBase : public AceType { 181 DECLARE_ACE_TYPE(TextFieldControllerBase, AceType); 182 183 public: Focus(bool focus)184 virtual void Focus(bool focus) {} 185 ShowError(const std::string & errorText)186 virtual void ShowError(const std::string& errorText) {} Delete()187 virtual void Delete() {} Insert(const std::string & args)188 virtual void Insert(const std::string& args) {} 189 SetPasswordState(bool flag)190 virtual void SetPasswordState(bool flag) {} 191 CaretPosition(int32_t caretPosition)192 virtual void CaretPosition(int32_t caretPosition) {} GetCaretIndex()193 virtual int32_t GetCaretIndex() 194 { 195 return {}; 196 } GetCaretPosition()197 virtual NG::OffsetF GetCaretPosition() 198 { 199 return {}; 200 } 201 virtual void SetTextSelection(int32_t selectionStart, int32_t selectionEnd, 202 const std::optional<SelectionOptions>& options = std::nullopt) {} GetTextContentRect()203 virtual Rect GetTextContentRect() 204 { 205 return {}; 206 } GetTextContentLinesNum()207 virtual int32_t GetTextContentLinesNum() 208 { 209 return {}; 210 } StopEditing()211 virtual void StopEditing() {} 212 AddText(std::u16string text,int32_t offset)213 virtual int32_t AddText(std::u16string text, int32_t offset) { return 0; } DeleteText(int32_t start,int32_t end)214 virtual void DeleteText(int32_t start, int32_t end) {} GetSelection()215 virtual SelectionInfo GetSelection() { return {}; } ClearPreviewText()216 virtual void ClearPreviewText() {} GetText()217 virtual std::u16string GetText() { return u""; } 218 SetGetCaretIndex(std::function<int32_t ()> && setGetCaretIndex)219 void SetGetCaretIndex(std::function<int32_t()>&& setGetCaretIndex) 220 { 221 getCaretIndex_ = std::move(setGetCaretIndex); 222 } 223 SetGetCaretPosition(std::function<NG::OffsetF ()> && setGetCaretPosition)224 void SetGetCaretPosition(std::function<NG::OffsetF()>&& setGetCaretPosition) 225 { 226 getCaretPosition_ = std::move(setGetCaretPosition); 227 } 228 SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)229 void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition) 230 { 231 setCaretPosition_ = std::move(setCaretPosition); 232 } 233 SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)234 void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect) 235 { 236 getTextContentRect_ = std::move(getTextContentRect); 237 } 238 SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)239 void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum) 240 { 241 getTextContentLinesNum_ = std::move(getTextContentLinesNum); 242 } 243 SetStopEditing(std::function<void (void)> && stopEditing)244 void SetStopEditing(std::function<void(void)>&& stopEditing) 245 { 246 stopEditing_ = std::move(stopEditing); 247 } 248 EscapeString(const std::string & value,std::string & result)249 static bool EscapeString(const std::string& value, std::string& result) 250 { 251 const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" }, 252 { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" }, 253 { "?", "\?" }, { "0", "\0" } }; 254 size_t i = 0; 255 for (; i < value.size();) { 256 std::string ch = value.substr(i, 1); 257 if (ch == "\\") { 258 if (i + 1 >= value.size()) { 259 return false; 260 } 261 i++; 262 // cannot escape this combo 263 auto nextChar = value.substr(i, 1); 264 auto mapTuple = escapeMap.find(nextChar); 265 if (mapTuple == escapeMap.end()) { 266 TAG_LOGW(AceLogTag::ACE_TEXT_FIELD, "Find escape \\ failed"); 267 return false; 268 } 269 ch = mapTuple->second; 270 } 271 result += ch; 272 i++; 273 } 274 return true; 275 } 276 277 protected: 278 std::function<void(const int32_t)> setCaretPosition_; 279 std::function<Rect(void)> getTextContentRect_; 280 std::function<int32_t(void)> getCaretIndex_; 281 std::function<NG::OffsetF(void)> getCaretPosition_; 282 std::function<int32_t(void)> getTextContentLinesNum_; 283 std::function<void(void)> stopEditing_; 284 }; 285 286 class ACE_FORCE_EXPORT TextFieldModel { 287 public: 288 static TextFieldModel* GetInstance(); 289 virtual ~TextFieldModel() = default; 290 291 virtual RefPtr<TextFieldControllerBase> CreateTextInput( 292 const std::optional<std::u16string>& placeholder, const std::optional<std::u16string>& value) = 0; 293 virtual RefPtr<TextFieldControllerBase> CreateTextArea( 294 const std::optional<std::u16string>& placeholder, const std::optional<std::u16string>& value) = 0; 295 virtual void RequestKeyboardOnFocus(bool needToRequest) = 0; SetWidthAuto(bool isAuto)296 virtual void SetWidthAuto(bool isAuto) {} 297 virtual void SetType(TextInputType value) = 0; 298 virtual void SetContentType(const NG::TextContentType& value) = 0; 299 virtual void SetPlaceholderColor(const Color& value) = 0; 300 virtual void ResetPlaceholderColor() = 0; 301 virtual void SetPlaceholderFont(const Font& value) = 0; 302 virtual void SetEnterKeyType(TextInputAction value) = 0; 303 virtual void SetCapitalizationMode(AutoCapitalizationMode value) = 0; 304 virtual void SetTextAlign(TextAlign value) = 0; 305 virtual void SetLineBreakStrategy(LineBreakStrategy lineBreakStrategy) = 0; 306 virtual void SetCaretColor(const Color& value) = 0; 307 virtual void ResetCaretColor() = 0; 308 virtual void SetCaretPosition(const int32_t& value) = 0; 309 virtual void SetSelectedBackgroundColor(const Color& value) = 0; 310 virtual void SetCaretStyle(const CaretStyle& value) = 0; 311 virtual void SetMaxLength(uint32_t value) = 0; 312 virtual void SetMaxLines(uint32_t value) = 0; 313 virtual void SetFontSize(const Dimension& value) = 0; 314 virtual void SetFontWeight(FontWeight value) = 0; 315 virtual void SetTextColor(const Color& value) = 0; 316 virtual void ResetTextColor() = 0; SetWordBreak(Ace::WordBreak value)317 virtual void SetWordBreak(Ace::WordBreak value) {}; 318 virtual void SetFontStyle(FontStyle value) = 0; 319 virtual void SetFontFamily(const std::vector<std::string>& value) = 0; 320 virtual void SetInputFilter(const std::string& value, 321 const std::function<void(const std::u16string&)>&& func) = 0; 322 virtual void SetMinFontScale(const float value) = 0; 323 virtual void SetMaxFontScale(const float value) = 0; 324 virtual void SetInputStyle(InputStyle value) = 0; 325 virtual void SetShowPasswordIcon(bool value) = 0; 326 virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0; 327 virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0; 328 virtual void SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func) = 0; 329 virtual void SetOnChange(std::function<void(const ChangeValueInfo&)>&& func) = 0; 330 virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0; 331 virtual void SetOnSecurityStateChange(std::function<void(bool)>&& func) = 0; 332 virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0; 333 virtual void SetOnCopy(std::function<void(const std::u16string&)>&& func) = 0; 334 virtual void SetOnCut(std::function<void(const std::u16string&)>&& func) = 0; 335 virtual void SetOnPaste(std::function<void(const std::u16string&)>&& func) = 0; 336 virtual void SetOnPasteWithEvent(std::function<void(const std::u16string&, NG::TextCommonEvent&)>&& func) = 0; 337 virtual void SetCopyOption(CopyOptions copyOption) = 0; 338 virtual void ResetMaxLength() = 0; 339 virtual void SetForegroundColor(const Color& value) = 0; 340 virtual void SetBackgroundColor(const Color& color, bool tmp) = 0; 341 virtual void ResetBackgroundColor() = 0; 342 virtual void SetHeight(const Dimension& value) = 0; 343 virtual void SetPadding( 344 const NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp, bool hasRegist = false) = 0; SetMargin()345 virtual void SetMargin() {}; SetBackBorder()346 virtual void SetBackBorder() {}; SetEllipsisMode(EllipsisMode modal)347 virtual void SetEllipsisMode(EllipsisMode modal) {}; 348 virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0; 349 virtual void SetShowPasswordText(bool value) = 0; SetOnClick(std::function<void (const ClickInfo &)> && func)350 virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {}; SetPasswordIcon(const PasswordIcon & passwordIcon)351 virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {}; SetShowUnit(std::function<void ()> && unitAction)352 virtual void SetShowUnit(std::function<void()>&& unitAction) {}; SetShowError(const std::u16string & errorText,bool visible)353 virtual void SetShowError(const std::u16string& errorText, bool visible) {}; SetBarState(DisplayMode value)354 virtual void SetBarState(DisplayMode value) {}; SetMaxViewLines(uint32_t value)355 virtual void SetMaxViewLines(uint32_t value) {}; SetNormalMaxViewLines(uint32_t value)356 virtual void SetNormalMaxViewLines(uint32_t value) {}; SetMinLines(uint32_t value)357 virtual void SetMinLines(uint32_t value) {}; SetOverflowMode(OverflowMode value)358 virtual void SetOverflowMode(OverflowMode value) {}; 359 SetShowUnderline(bool showUnderLine)360 virtual void SetShowUnderline(bool showUnderLine) {}; SetNormalUnderlineColor(const Color & normalColor)361 virtual void SetNormalUnderlineColor(const Color& normalColor) {}; SetTypingUnderlineColor(const Color & normalColor)362 virtual void SetTypingUnderlineColor(const Color& normalColor) {}; SetErrorUnderlineColor(const Color & normalColor)363 virtual void SetErrorUnderlineColor(const Color& normalColor) {}; SetDisableUnderlineColor(const Color & normalColor)364 virtual void SetDisableUnderlineColor(const Color& normalColor) {}; ResetNormalUnderlineColor()365 virtual void ResetNormalUnderlineColor() {}; ResetTypingUnderlineColor()366 virtual void ResetTypingUnderlineColor() {}; ResetErrorUnderlineColor()367 virtual void ResetErrorUnderlineColor() {}; ResetDisableUnderlineColor()368 virtual void ResetDisableUnderlineColor() {}; SetUserUnderlineColor(UserUnderlineColor userColor)369 virtual void SetUserUnderlineColor(UserUnderlineColor userColor) {}; SetShowCounter(bool value)370 virtual void SetShowCounter(bool value) {}; 371 virtual void SetOnWillChangeEvent(std::function<bool(const ChangeValueInfo&)>&& func) = 0; 372 virtual void SetOnChangeEvent(std::function<void(const std::u16string&)>&& func) = 0; SetFocusableAndFocusNode()373 virtual void SetFocusableAndFocusNode() {}; 374 virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0; 375 virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc, bool supportAvoidance = false) = 0; 376 virtual void SetPasswordRules(const std::string& passwordRules) = 0; 377 virtual void SetEnableAutoFill(bool enableAutoFill) = 0; 378 virtual void SetEnableAutoFillAnimation(bool enableAutoFillAnimation) = 0; SetCounterType(int32_t value)379 virtual void SetCounterType(int32_t value) {}; SetShowCounterBorder(bool value)380 virtual void SetShowCounterBorder(bool value) {}; 381 virtual void SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle) = 0; 382 virtual void SetCancelIconSize(const CalcDimension& iconSize) = 0; 383 virtual void SetCanacelIconSrc( 384 const std::string& iconSrc, const std::string& bundleName, const std::string& moduleName) = 0; 385 virtual void SetCancelIconColor(const Color& iconColor) = 0; 386 virtual void SetCancelButtonSymbol(bool isShowSymbol) = 0; 387 virtual void SetCancelSymbolIcon(const std::function<void(WeakPtr<NG::FrameNode>)>& iconSymbol) = 0; 388 virtual void SetIsShowCancelButton(bool isShowCancelButton) = 0; 389 390 virtual void SetSelectAllValue(bool isSetSelectAllValue) = 0; 391 virtual void SetFontFeature(const std::list<std::pair<std::string, int32_t>>& value) = 0; SetLetterSpacing(const Dimension & value)392 virtual void SetLetterSpacing(const Dimension& value) {}; SetLineHeight(const Dimension & value)393 virtual void SetLineHeight(const Dimension& value) {}; SetHalfLeading(bool value)394 virtual void SetHalfLeading(bool value) {}; SetLineSpacing(const Dimension & value)395 virtual void SetLineSpacing(const Dimension& value) {}; SetIsOnlyBetweenLines(bool isOnlyBetweenLines)396 virtual void SetIsOnlyBetweenLines(bool isOnlyBetweenLines) {}; SetAdaptMinFontSize(const Dimension & value)397 virtual void SetAdaptMinFontSize(const Dimension& value) {}; SetAdaptMaxFontSize(const Dimension & value)398 virtual void SetAdaptMaxFontSize(const Dimension& value) {}; SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)399 virtual void SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value) {}; SetTextDecoration(Ace::TextDecoration value)400 virtual void SetTextDecoration(Ace::TextDecoration value) {}; SetTextDecorationColor(const Color & value)401 virtual void SetTextDecorationColor(const Color& value) {}; SetTextDecorationStyle(Ace::TextDecorationStyle value)402 virtual void SetTextDecorationStyle(Ace::TextDecorationStyle value) {}; SetTextOverflow(Ace::TextOverflow value)403 virtual void SetTextOverflow(Ace::TextOverflow value) {}; SetTextIndent(const Dimension & value)404 virtual void SetTextIndent(const Dimension& value) {}; 405 virtual void SetOnWillInsertValueEvent(std::function<bool(const InsertValueInfo&)>&& func) = 0; 406 virtual void SetOnDidInsertValueEvent(std::function<void(const InsertValueInfo&)>&& func) = 0; 407 virtual void SetOnWillDeleteEvent(std::function<bool(const DeleteValueInfo&)>&& func) = 0; 408 virtual void SetOnDidDeleteEvent(std::function<void(const DeleteValueInfo&)>&& func) = 0; SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick,const NG::OnPrepareMenuCallback && onPrepareMenuCallback)409 virtual void SetSelectionMenuOptions(const NG::OnCreateMenuCallback&& onCreateMenuCallback, 410 const NG::OnMenuItemClickCallback&& onMenuItemClick, 411 const NG::OnPrepareMenuCallback&& onPrepareMenuCallback) {}; 412 virtual void SetEnablePreviewText(bool enablePreviewText) = 0; 413 virtual void SetEnableHapticFeedback(bool state) = 0; SetStopBackPress(bool isStopBackPress)414 virtual void SetStopBackPress(bool isStopBackPress) {}; 415 virtual void SetKeyboardAppearance(KeyboardAppearance value) = 0; SetStrokeWidth(const Dimension & value)416 virtual void SetStrokeWidth(const Dimension& value) {}; SetStrokeColor(const Color & value)417 virtual void SetStrokeColor(const Color& value) {}; ResetStrokeColor()418 virtual void ResetStrokeColor() {}; 419 virtual void SetEnableAutoSpacing(bool enabled) = 0; 420 virtual void SetOnWillAttachIME(std::function<void(const IMEClient&)>&& func) = 0; 421 422 private: 423 static std::unique_ptr<TextFieldModel> instance_; 424 static std::mutex mutex_; 425 }; 426 427 } // namespace OHOS::Ace 428 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H 429