• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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