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