1 /* 2 * Copyright (c) 2022-2023 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/property/measure_property.h" 37 #include "core/components_ng/pattern/text_field/text_field_event_hub.h" 38 39 namespace OHOS::Ace { 40 41 struct Font { 42 std::optional<FontWeight> fontWeight; 43 std::optional<Dimension> fontSize; 44 std::optional<FontStyle> fontStyle; 45 std::vector<std::string> fontFamilies; 46 }; 47 48 struct CaretStyle { 49 std::optional<Dimension> caretWidth; 50 }; 51 52 struct PasswordIcon { 53 std::string showResult; 54 std::string hideResult; 55 std::string showBundleName; 56 std::string hideBundleName; 57 std::string showModuleName; 58 std::string hideModuleName; 59 }; 60 61 enum class InputStyle { 62 DEFAULT, 63 INLINE, 64 }; 65 66 enum class CleanNodeStyle { 67 CONSTANT, 68 INVISIBLE, 69 INPUT, 70 }; 71 72 class ACE_EXPORT TextFieldControllerBase : public AceType { 73 DECLARE_ACE_TYPE(TextFieldControllerBase, AceType); 74 75 public: Focus(bool focus)76 virtual void Focus(bool focus) {} 77 ShowError(const std::string & errorText)78 virtual void ShowError(const std::string& errorText) {} Delete()79 virtual void Delete() {} Insert(const std::string & args)80 virtual void Insert(const std::string& args) {} 81 CaretPosition(int32_t caretPosition)82 virtual void CaretPosition(int32_t caretPosition) {} GetCaretIndex()83 virtual int32_t GetCaretIndex() 84 { 85 return {}; 86 } GetCaretPosition()87 virtual NG::OffsetF GetCaretPosition() 88 { 89 return {}; 90 } SetTextSelection(int32_t selectionStart,int32_t selectionEnd)91 virtual void SetTextSelection(int32_t selectionStart, int32_t selectionEnd) {} GetTextContentRect()92 virtual Rect GetTextContentRect() 93 { 94 return {}; 95 } GetTextContentLinesNum()96 virtual int32_t GetTextContentLinesNum() 97 { 98 return {}; 99 } StopEditing()100 virtual void StopEditing() {} 101 SetGetCaretIndex(std::function<int32_t ()> && setGetCaretIndex)102 void SetGetCaretIndex(std::function<int32_t()>&& setGetCaretIndex) 103 { 104 getCaretIndex_ = std::move(setGetCaretIndex); 105 } 106 SetGetCaretPosition(std::function<NG::OffsetF ()> && setGetCaretPosition)107 void SetGetCaretPosition(std::function<NG::OffsetF()>&& setGetCaretPosition) 108 { 109 getCaretPosition_ = std::move(setGetCaretPosition); 110 } 111 SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)112 void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition) 113 { 114 setCaretPosition_ = std::move(setCaretPosition); 115 } 116 SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)117 void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect) 118 { 119 getTextContentRect_ = std::move(getTextContentRect); 120 } 121 SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)122 void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum) 123 { 124 getTextContentLinesNum_ = std::move(getTextContentLinesNum); 125 } 126 SetStopEditing(std::function<void (void)> && stopEditing)127 void SetStopEditing(std::function<void(void)>&& stopEditing) 128 { 129 stopEditing_ = std::move(stopEditing); 130 } 131 EscapeString(const std::string & value,std::string & result)132 static bool EscapeString(const std::string& value, std::string& result) 133 { 134 const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" }, 135 { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" }, 136 { "?", "\?" }, { "0", "\0" } }; 137 size_t i = 0; 138 for (; i < value.size();) { 139 std::string ch = value.substr(i, 1); 140 if (ch == "\\") { 141 if (i + 1 >= value.size()) { 142 return false; 143 } 144 i++; 145 // cannot escape this combo 146 auto nextChar = value.substr(i, 1); 147 auto mapTuple = escapeMap.find(nextChar); 148 if (mapTuple == escapeMap.end()) { 149 LOGE("Find escape \\%{public}s failed", nextChar.c_str()); 150 return false; 151 } 152 ch = mapTuple->second; 153 } 154 result += ch; 155 i++; 156 } 157 return true; 158 } 159 160 protected: 161 std::function<void(const int32_t)> setCaretPosition_; 162 std::function<Rect(void)> getTextContentRect_; 163 std::function<int32_t(void)> getCaretIndex_; 164 std::function<NG::OffsetF(void)> getCaretPosition_; 165 std::function<int32_t(void)> getTextContentLinesNum_; 166 std::function<void(void)> stopEditing_; 167 }; 168 169 class ACE_EXPORT TextFieldModel { 170 public: 171 static TextFieldModel* GetInstance(); 172 virtual ~TextFieldModel() = default; 173 174 virtual RefPtr<TextFieldControllerBase> CreateTextInput( 175 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 176 177 virtual RefPtr<TextFieldControllerBase> CreateTextArea( 178 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 179 180 virtual void RequestKeyboardOnFocus(bool needToRequest) = 0; SetWidthAuto(bool isAuto)181 virtual void SetWidthAuto(bool isAuto) {} 182 virtual void SetType(TextInputType value) = 0; 183 virtual void SetPlaceholderColor(const Color& value) = 0; 184 virtual void SetPlaceholderFont(const Font& value) = 0; 185 virtual void SetEnterKeyType(TextInputAction value) = 0; 186 virtual void SetTextAlign(TextAlign value) = 0; 187 virtual void SetCaretColor(const Color& value) = 0; 188 virtual void SetCaretPosition(const int32_t& value) = 0; 189 virtual void SetSelectedBackgroundColor(const Color& value) = 0; 190 virtual void SetCaretStyle(const CaretStyle& value) = 0; 191 virtual void SetMaxLength(uint32_t value) = 0; 192 virtual void SetMaxLines(uint32_t value) = 0; 193 virtual void SetFontSize(const Dimension& value) = 0; 194 virtual void SetFontWeight(FontWeight value) = 0; 195 virtual void SetTextColor(const Color& value) = 0; 196 virtual void SetFontStyle(FontStyle value) = 0; 197 virtual void SetFontFamily(const std::vector<std::string>& value) = 0; 198 virtual void SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError) = 0; 199 virtual void SetInputStyle(InputStyle value) = 0; 200 virtual void SetShowPasswordIcon(bool value) = 0; 201 virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0; 202 virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0; 203 virtual void SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func) = 0; 204 virtual void SetOnChange(std::function<void(const std::string&)>&& func) = 0; 205 virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0; 206 virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0; 207 virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0; 208 virtual void SetOnCut(std::function<void(const std::string&)>&& func) = 0; 209 virtual void SetOnPaste(std::function<void(const std::string&)>&& func) = 0; 210 virtual void SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func) = 0; 211 virtual void SetCopyOption(CopyOptions copyOption) = 0; 212 virtual void ResetMaxLength() = 0; 213 virtual void SetForegroundColor(const Color& value) = 0; 214 virtual void SetBackgroundColor(const Color& color, bool tmp) = 0; 215 virtual void SetHeight(const Dimension& value) = 0; 216 virtual void SetPadding(NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp) = 0; SetBackBorder()217 virtual void SetBackBorder() {}; 218 virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0; SetOnClick(std::function<void (const ClickInfo &)> && func)219 virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {}; 220 221 virtual void SetMenuOptionItems(std::vector<NG::MenuOptionsParam>&& menuOptionsItems) = 0; SetPasswordIcon(const PasswordIcon & passwordIcon)222 virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {}; SetShowUnit(std::function<void ()> && unitAction)223 virtual void SetShowUnit(std::function<void()>&& unitAction) {}; SetShowError(const std::string & errorText,bool visible)224 virtual void SetShowError(const std::string& errorText, bool visible) {}; SetBarState(DisplayMode value)225 virtual void SetBarState(DisplayMode value) {}; SetMaxViewLines(uint32_t value)226 virtual void SetMaxViewLines(uint32_t value) {}; 227 SetShowUnderline(bool showUnderLine)228 virtual void SetShowUnderline(bool showUnderLine) {}; SetShowCounter(bool value)229 virtual void SetShowCounter(bool value) {}; 230 virtual void SetOnChangeEvent(std::function<void(const std::string&)>&& func) = 0; SetFocusableAndFocusNode()231 virtual void SetFocusableAndFocusNode() {}; 232 virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0; 233 virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc) = 0; SetCounterType(int32_t value)234 virtual void SetCounterType(int32_t value) {}; SetShowCounterBorder(bool value)235 virtual void SetShowCounterBorder(bool value) {}; 236 virtual void SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle) = 0; 237 virtual void SetCancelIconSize(const CalcDimension& iconSize) = 0; 238 virtual void SetCanacelIconSrc(const std::string& iconSrc) = 0; 239 virtual void SetCancelIconColor(const Color& iconColor) = 0; 240 virtual void SetIsShowCancelButton(bool isShowCancelButton) = 0; 241 virtual void SetPasswordRules(const std::string& passwordRules) = 0; 242 virtual void SetEnableAutoFill(bool enableAutoFill) = 0; 243 244 virtual void SetSelectAllValue(bool isSetSelectAllValue) = 0; 245 246 private: 247 static std::unique_ptr<TextFieldModel> instance_; 248 static std::mutex mutex_; 249 }; 250 251 } // namespace OHOS::Ace 252 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H 253