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/memory/referenced.h" 27 #include "base/utils/macros.h" 28 #include "core/common/ime/text_input_action.h" 29 #include "core/common/ime/text_input_type.h" 30 #include "core/components/box/drag_drop_event.h" 31 #include "core/components/common/properties/color.h" 32 #include "core/components/common/properties/text_style.h" 33 #include "core/components_ng/base/view_abstract_model_ng.h" 34 #include "core/components_ng/pattern/text/text_menu_extension.h" 35 #include "core/components_ng/property/measure_property.h" 36 37 namespace OHOS::Ace { 38 39 struct Font { 40 std::optional<FontWeight> fontWeight; 41 std::optional<Dimension> fontSize; 42 std::optional<FontStyle> fontStyle; 43 std::vector<std::string> fontFamilies; 44 }; 45 46 struct CaretStyle { 47 std::optional<Dimension> caretWidth; 48 }; 49 50 struct PasswordIcon { 51 std::string showResult; 52 std::string hideResult; 53 std::string showBundleName; 54 std::string hideBundleName; 55 std::string showModuleName; 56 std::string hideModuleName; 57 }; 58 59 enum class InputStyle { 60 DEFAULT, 61 INLINE, 62 }; 63 64 class ACE_EXPORT TextFieldControllerBase : public AceType { 65 DECLARE_ACE_TYPE(TextFieldControllerBase, AceType); 66 67 public: Focus(bool focus)68 virtual void Focus(bool focus) {} 69 ShowError(const std::string & errorText)70 virtual void ShowError(const std::string& errorText) {} Delete()71 virtual void Delete() {} Insert(const std::string & args)72 virtual void Insert(const std::string& args) {} 73 CaretPosition(int32_t caretPosition)74 virtual void CaretPosition(int32_t caretPosition) {} SetTextSelection(int32_t selectionStart,int32_t selectionEnd)75 virtual void SetTextSelection(int32_t selectionStart, int32_t selectionEnd) {} GetTextContentRect()76 virtual Rect GetTextContentRect() { return {}; } GetTextContentLinesNum()77 virtual int32_t GetTextContentLinesNum() { return {}; } StopEditing()78 virtual void StopEditing() {} 79 SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)80 void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition) 81 { 82 setCaretPosition_ = std::move(setCaretPosition); 83 } 84 SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)85 void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect) 86 { 87 getTextContentRect_ = std::move(getTextContentRect); 88 } 89 SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)90 void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum) 91 { 92 getTextContentLinesNum_ = std::move(getTextContentLinesNum); 93 } 94 SetStopEditing(std::function<void (void)> && stopEditing)95 void SetStopEditing(std::function<void(void)>&& stopEditing) 96 { 97 stopEditing_ = std::move(stopEditing); 98 } 99 EscapeString(const std::string & value,std::string & result)100 static bool EscapeString(const std::string& value, std::string& result) 101 { 102 const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" }, 103 { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" }, 104 { "?", "\?" }, { "0", "\0" } }; 105 size_t i = 0; 106 for (; i < value.size();) { 107 std::string ch = value.substr(i, 1); 108 if (ch == "\\") { 109 if (i + 1 >= value.size()) { 110 return false; 111 } 112 i++; 113 // cannot escape this combo 114 auto nextChar = value.substr(i, 1); 115 auto mapTuple = escapeMap.find(nextChar); 116 if (mapTuple == escapeMap.end()) { 117 LOGE("Find escape \\%{public}s failed", nextChar.c_str()); 118 return false; 119 } 120 ch = mapTuple->second; 121 } 122 result += ch; 123 i++; 124 } 125 return true; 126 } 127 128 protected: 129 std::function<void(const int32_t)> setCaretPosition_; 130 std::function<Rect(void)> getTextContentRect_; 131 std::function<int32_t(void)> getTextContentLinesNum_; 132 std::function<void(void)> stopEditing_; 133 }; 134 135 class ACE_EXPORT TextFieldModel { 136 public: 137 static TextFieldModel* GetInstance(); 138 virtual ~TextFieldModel() = default; 139 140 virtual RefPtr<TextFieldControllerBase> CreateTextInput( 141 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 142 143 virtual RefPtr<TextFieldControllerBase> CreateTextArea( 144 const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0; 145 146 virtual void RequestKeyboardOnFocus(bool needToRequest) = 0; SetWidthAuto(bool isAuto)147 virtual void SetWidthAuto(bool isAuto) {} 148 virtual void SetType(TextInputType value) = 0; 149 virtual void SetPlaceholderColor(const Color& value) = 0; 150 virtual void SetPlaceholderFont(const Font& value) = 0; 151 virtual void SetEnterKeyType(TextInputAction value) = 0; 152 virtual void SetTextAlign(TextAlign value) = 0; 153 virtual void SetCaretColor(const Color& value) = 0; 154 virtual void SetCaretPosition(const int32_t& value) = 0; 155 virtual void SetSelectedBackgroundColor(const Color& value) = 0; 156 virtual void SetCaretStyle(const CaretStyle& value) = 0; 157 virtual void SetMaxLength(uint32_t value) = 0; 158 virtual void SetMaxLines(uint32_t value) = 0; 159 virtual void SetFontSize(const Dimension& value) = 0; 160 virtual void SetFontWeight(FontWeight value) = 0; 161 virtual void SetTextColor(const Color& value) = 0; 162 virtual void SetFontStyle(FontStyle value) = 0; 163 virtual void SetFontFamily(const std::vector<std::string>& value) = 0; 164 virtual void SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError) = 0; 165 virtual void SetInputStyle(InputStyle value) = 0; 166 virtual void SetShowPasswordIcon(bool value) = 0; 167 virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0; 168 virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0; 169 virtual void SetOnChange(std::function<void(const std::string&)>&& func) = 0; 170 virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0; 171 virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0; 172 virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0; 173 virtual void SetOnCut(std::function<void(const std::string&)>&& func) = 0; 174 virtual void SetOnPaste(std::function<void(const std::string&)>&& func) = 0; 175 virtual void SetCopyOption(CopyOptions copyOption) = 0; 176 virtual void ResetMaxLength() = 0; 177 virtual void SetForegroundColor(const Color& value) = 0; 178 virtual void SetBackgroundColor(const Color& color, bool tmp) = 0; 179 virtual void SetHeight(const Dimension& value) = 0; 180 virtual void SetPadding(NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp) = 0; SetBackBorder()181 virtual void SetBackBorder() {}; 182 virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0; SetOnClick(std::function<void (const ClickInfo &)> && func)183 virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {}; 184 185 virtual void SetMenuOptionItems(std::vector<NG::MenuOptionsParam>&& menuOptionsItems) = 0; SetPasswordIcon(const PasswordIcon & passwordIcon)186 virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {}; SetShowUnit(std::function<void ()> && unitAction)187 virtual void SetShowUnit(std::function<void()>&& unitAction) {}; SetShowError(const std::string & errorText,bool visible)188 virtual void SetShowError(const std::string& errorText, bool visible) {}; SetBarState(DisplayMode value)189 virtual void SetBarState(DisplayMode value) {}; SetMaxViewLines(uint32_t value)190 virtual void SetMaxViewLines(uint32_t value) {}; 191 SetShowUnderline(bool showUnderLine)192 virtual void SetShowUnderline(bool showUnderLine) {}; SetShowCounter(bool value)193 virtual void SetShowCounter(bool value) {}; 194 virtual void SetOnChangeEvent(std::function<void(const std::string&)>&& func) = 0; SetFocusableAndFocusNode()195 virtual void SetFocusableAndFocusNode() {}; 196 virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0; 197 virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc) = 0; 198 199 private: 200 static std::unique_ptr<TextFieldModel> instance_; 201 static std::mutex mutex_; 202 }; 203 204 } // namespace OHOS::Ace 205 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H 206