• 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/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