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::string text,int32_t offset)191 virtual int32_t AddText(std::string 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 {}; } 194 SetGetCaretIndex(std::function<int32_t ()> && setGetCaretIndex)195 void SetGetCaretIndex(std::function<int32_t()>&& setGetCaretIndex) 196 { 197 getCaretIndex_ = std::move(setGetCaretIndex); 198 } 199 SetGetCaretPosition(std::function<NG::OffsetF ()> && setGetCaretPosition)200 void SetGetCaretPosition(std::function<NG::OffsetF()>&& setGetCaretPosition) 201 { 202 getCaretPosition_ = std::move(setGetCaretPosition); 203 } 204 SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)205 void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition) 206 { 207 setCaretPosition_ = std::move(setCaretPosition); 208 } 209 SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)210 void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect) 211 { 212 getTextContentRect_ = std::move(getTextContentRect); 213 } 214 SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)215 void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum) 216 { 217 getTextContentLinesNum_ = std::move(getTextContentLinesNum); 218 } 219 SetStopEditing(std::function<void (void)> && stopEditing)220 void SetStopEditing(std::function<void(void)>&& stopEditing) 221 { 222 stopEditing_ = std::move(stopEditing); 223 } 224 EscapeString(const std::string & value,std::string & result)225 static bool EscapeString(const std::string& value, std::string& result) 226 { 227 const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" }, 228 { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" }, 229 { "?", "\?" }, { "0", "\0" } }; 230 size_t i = 0; 231 for (; i < value.size();) { 232 std::string ch = value.substr(i, 1); 233 if (ch == "\\") { 234 if (i + 1 >= value.size()) { 235 return false; 236 } 237 i++; 238 // cannot escape this combo 239 auto nextChar = value.substr(i, 1); 240 auto mapTuple = escapeMap.find(nextChar); 241 if (mapTuple == escapeMap.end()) { 242 LOGE("Find escape \\%{public}s failed", nextChar.c_str()); 243 return false; 244 } 245 ch = mapTuple->second; 246 } 247 result += ch; 248 i++; 249 } 250 return true; 251 } 252 253 protected: 254 std::function<void(const int32_t)> setCaretPosition_; 255 std::function<Rect(void)> getTextContentRect_; 256 std::function<int32_t(void)> getCaretIndex_; 257 std::function<NG::OffsetF(void)> getCaretPosition_; 258 std::function<int32_t(void)> getTextContentLinesNum_; 259 std::function<void(void)> stopEditing_; 260 }; 261 262 class ACE_FORCE_EXPORT TextFieldModel { 263 public: 264 static TextFieldModel* GetInstance(); 265 virtual ~TextFieldModel() = default; 266 267 virtual RefPtr<TextFieldControllerBase> CreateTextInput( 268 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 269 270 virtual RefPtr<TextFieldControllerBase> CreateTextArea( 271 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 272 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 SetPlaceholderFont(const Font& value) = 0; 279 virtual void SetEnterKeyType(TextInputAction value) = 0; 280 virtual void SetTextAlign(TextAlign value) = 0; 281 virtual void SetLineBreakStrategy(LineBreakStrategy lineBreakStrategy) = 0; 282 virtual void SetCaretColor(const Color& value) = 0; 283 virtual void SetCaretPosition(const int32_t& value) = 0; 284 virtual void SetSelectedBackgroundColor(const Color& value) = 0; 285 virtual void SetCaretStyle(const CaretStyle& value) = 0; 286 virtual void SetMaxLength(uint32_t value) = 0; 287 virtual void SetMaxLines(uint32_t value) = 0; 288 virtual void SetFontSize(const Dimension& value) = 0; 289 virtual void SetFontWeight(FontWeight value) = 0; 290 virtual void SetTextColor(const Color& value) = 0; SetWordBreak(Ace::WordBreak value)291 virtual void SetWordBreak(Ace::WordBreak value) {}; 292 virtual void SetFontStyle(FontStyle value) = 0; 293 virtual void SetFontFamily(const std::vector<std::string>& value) = 0; 294 virtual void SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError) = 0; 295 virtual void SetInputStyle(InputStyle value) = 0; 296 virtual void SetShowPasswordIcon(bool value) = 0; 297 virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0; 298 virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0; 299 virtual void SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func) = 0; 300 virtual void SetOnChange(std::function<void(const ChangeValueInfo&)>&& func) = 0; 301 virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0; 302 virtual void SetOnSecurityStateChange(std::function<void(bool)>&& func) = 0; 303 virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0; 304 virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0; 305 virtual void SetOnCut(std::function<void(const std::string&)>&& func) = 0; 306 virtual void SetOnPaste(std::function<void(const std::string&)>&& func) = 0; 307 virtual void SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func) = 0; 308 virtual void SetCopyOption(CopyOptions copyOption) = 0; 309 virtual void ResetMaxLength() = 0; 310 virtual void SetForegroundColor(const Color& value) = 0; 311 virtual void SetBackgroundColor(const Color& color, bool tmp) = 0; 312 virtual void SetHeight(const Dimension& value) = 0; 313 virtual void SetPadding(const NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp) = 0; SetMargin()314 virtual void SetMargin() {}; SetBackBorder()315 virtual void SetBackBorder() {}; 316 virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0; 317 virtual void SetShowPasswordText(bool value) = 0; SetOnClick(std::function<void (const ClickInfo &)> && func)318 virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {}; SetPasswordIcon(const PasswordIcon & passwordIcon)319 virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {}; SetShowUnit(std::function<void ()> && unitAction)320 virtual void SetShowUnit(std::function<void()>&& unitAction) {}; SetShowError(const std::string & errorText,bool visible)321 virtual void SetShowError(const std::string& errorText, bool visible) {}; SetBarState(DisplayMode value)322 virtual void SetBarState(DisplayMode value) {}; SetMaxViewLines(uint32_t value)323 virtual void SetMaxViewLines(uint32_t value) {}; SetNormalMaxViewLines(uint32_t value)324 virtual void SetNormalMaxViewLines(uint32_t value) {}; 325 SetShowUnderline(bool showUnderLine)326 virtual void SetShowUnderline(bool showUnderLine) {}; SetNormalUnderlineColor(const Color & normalColor)327 virtual void SetNormalUnderlineColor(const Color& normalColor) {}; SetUserUnderlineColor(UserUnderlineColor userColor)328 virtual void SetUserUnderlineColor(UserUnderlineColor userColor) {}; SetShowCounter(bool value)329 virtual void SetShowCounter(bool value) {}; 330 virtual void SetOnWillChangeEvent(std::function<bool(const ChangeValueInfo&)>&& func) = 0; 331 virtual void SetOnChangeEvent(std::function<void(const std::string&)>&& func) = 0; SetFocusableAndFocusNode()332 virtual void SetFocusableAndFocusNode() {}; 333 virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0; 334 virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc, bool supportAvoidance = false) = 0; 335 virtual void SetPasswordRules(const std::string& passwordRules) = 0; 336 virtual void SetEnableAutoFill(bool enableAutoFill) = 0; SetCounterType(int32_t value)337 virtual void SetCounterType(int32_t value) {}; SetShowCounterBorder(bool value)338 virtual void SetShowCounterBorder(bool value) {}; 339 virtual void SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle) = 0; 340 virtual void SetCancelIconSize(const CalcDimension& iconSize) = 0; 341 virtual void SetCanacelIconSrc( 342 const std::string& iconSrc, const std::string& bundleName, const std::string& moduleName) = 0; 343 virtual void SetCancelIconColor(const Color& iconColor) = 0; 344 virtual void SetIsShowCancelButton(bool isShowCancelButton) = 0; 345 346 virtual void SetSelectAllValue(bool isSetSelectAllValue) = 0; 347 virtual void SetFontFeature(const std::list<std::pair<std::string, int32_t>>& value) = 0; SetLetterSpacing(const Dimension & value)348 virtual void SetLetterSpacing(const Dimension& value) {}; SetLineHeight(const Dimension & value)349 virtual void SetLineHeight(const Dimension& value) {}; SetLineSpacing(const Dimension & value)350 virtual void SetLineSpacing(const Dimension& value) {}; SetAdaptMinFontSize(const Dimension & value)351 virtual void SetAdaptMinFontSize(const Dimension& value) {}; SetAdaptMaxFontSize(const Dimension & value)352 virtual void SetAdaptMaxFontSize(const Dimension& value) {}; SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)353 virtual void SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value) {}; SetTextDecoration(Ace::TextDecoration value)354 virtual void SetTextDecoration(Ace::TextDecoration value) {}; SetTextDecorationColor(const Color & value)355 virtual void SetTextDecorationColor(const Color& value) {}; SetTextDecorationStyle(Ace::TextDecorationStyle value)356 virtual void SetTextDecorationStyle(Ace::TextDecorationStyle value) {}; 357 SetTextOverflow(Ace::TextOverflow value)358 virtual void SetTextOverflow(Ace::TextOverflow value) {}; SetTextIndent(const Dimension & value)359 virtual void SetTextIndent(const Dimension& value) {}; 360 virtual void SetOnWillInsertValueEvent(std::function<bool(const InsertValueInfo&)>&& func) = 0; 361 virtual void SetOnDidInsertValueEvent(std::function<void(const InsertValueInfo&)>&& func) = 0; 362 virtual void SetOnWillDeleteEvent(std::function<bool(const DeleteValueInfo&)>&& func) = 0; 363 virtual void SetOnDidDeleteEvent(std::function<void(const DeleteValueInfo&)>&& func) = 0; SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)364 virtual void SetSelectionMenuOptions( 365 const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick) {}; 366 virtual void SetEnablePreviewText(bool enablePreviewText) = 0; 367 virtual void SetEnableHapticFeedback(bool state) = 0; SetStopBackPress(bool isStopBackPress)368 virtual void SetStopBackPress(bool isStopBackPress) {}; 369 virtual void SetKeyboardAppearance(KeyboardAppearance value) = 0; 370 371 private: 372 static std::unique_ptr<TextFieldModel> instance_; 373 static std::mutex mutex_; 374 }; 375 376 } // namespace OHOS::Ace 377 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H 378