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