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/text/text_menu_extension.h"
36 #include "core/components_ng/pattern/text_field/text_content_type.h"
37 #include "core/components_ng/pattern/text_field/text_field_event_hub.h"
38 #include "core/components_ng/property/measure_property.h"
39 
40 namespace OHOS::Ace {
41 
42 struct Font {
43     std::optional<FontWeight> fontWeight;
44     std::optional<Dimension> fontSize;
45     std::optional<FontStyle> fontStyle;
46     std::vector<std::string> fontFamilies;
47     std::optional<Color> fontColor;
48     std::optional<std::vector<std::string>> fontFamiliesNG;
49     std::optional<bool> enableVariableFontWeight;
50 
IsEqualFont51     bool IsEqual(const Font& other) const
52     {
53         bool flag = fontWeight == other.fontWeight && fontSize == other.fontSize && fontStyle == other.fontStyle &&
54                     fontColor == other.fontColor && enableVariableFontWeight == other.enableVariableFontWeight;
55         if (!flag) {
56             return false;
57         }
58         if (fontFamiliesNG.has_value() && other.fontFamiliesNG) {
59             auto curFontFamilies = fontFamiliesNG.value();
60             auto otherFontFamilies = other.fontFamiliesNG.value();
61             if (curFontFamilies.size() != otherFontFamilies.size()) {
62                 return false;
63             }
64             for (size_t i = 0; i < curFontFamilies.size(); ++i) {
65                 if (curFontFamilies[i] != otherFontFamilies[i]) {
66                     return false;
67                 }
68             }
69         }
70         return flag;
71     }
72 
GetFontColorFont73     std::string GetFontColor() const
74     {
75         return fontColor.has_value() ? fontColor.value().ColorToString() : "";
76     }
77 
GetFontFamilyFont78     std::string GetFontFamily() const
79     {
80         if (!fontFamiliesNG.has_value() || fontFamiliesNG.value().empty()) {
81             return "";
82         }
83         std::stringstream ss;
84         auto fontFamily = fontFamiliesNG.value();
85         ss << fontFamily[0];
86 
87         for (uint32_t index = 1; index < fontFamily.size(); ++index) {
88             ss << "," << fontFamily[index];
89         }
90         return ss.str();
91     }
92 
GetFontWeightFont93     std::optional<FontWeight> GetFontWeight() const
94     {
95         return fontWeight;
96     }
97 
GetFontSizeFont98     std::optional<Dimension> GetFontSize() const
99     {
100         return fontSize;
101     }
102 
GetFontStyleFont103     std::optional<FontStyle> GetFontStyle() const
104     {
105         return fontStyle;
106     }
107 };
108 
109 struct CaretStyle {
110     std::optional<Dimension> caretWidth;
111 };
112 
113 struct PasswordIcon {
114     std::string showResult;
115     std::string hideResult;
116     std::string showBundleName;
117     std::string hideBundleName;
118     std::string showModuleName;
119     std::string hideModuleName;
120 };
121 
122 struct UserUnderlineColor {
123     std::optional<Color> typing = std::nullopt;
124     std::optional<Color> normal = std::nullopt;
125     std::optional<Color> error = std::nullopt;
126     std::optional<Color> disable = std::nullopt;
127 };
128 
129 enum class InputStyle {
130     DEFAULT,
131     INLINE,
132 };
133 
134 enum class CleanNodeStyle {
135     CONSTANT,
136     INVISIBLE,
137     INPUT,
138 };
139 
140 enum class MenuPolicy { DEFAULT = 0, HIDE, SHOW };
141 
142 enum class CancelButtonStyle {
143     CONSTANT,
144     INVISIBLE,
145     INPUT,
146 };
147 
148 struct SelectionOptions {
149     MenuPolicy menuPolicy = MenuPolicy::DEFAULT;
150 };
151 
152 enum class PreviewTextStyle {
153     NORMAL,
154     UNDERLINE,
155 };
156 
157 class ACE_EXPORT TextFieldControllerBase : public AceType {
158     DECLARE_ACE_TYPE(TextFieldControllerBase, AceType);
159 
160 public:
Focus(bool focus)161     virtual void Focus(bool focus) {}
162 
ShowError(const std::string & errorText)163     virtual void ShowError(const std::string& errorText) {}
Delete()164     virtual void Delete() {}
Insert(const std::string & args)165     virtual void Insert(const std::string& args) {}
166 
SetPasswordState(bool flag)167     virtual void SetPasswordState(bool flag) {}
168 
CaretPosition(int32_t caretPosition)169     virtual void CaretPosition(int32_t caretPosition) {}
GetCaretIndex()170     virtual int32_t GetCaretIndex()
171     {
172         return {};
173     }
GetCaretPosition()174     virtual NG::OffsetF GetCaretPosition()
175     {
176         return {};
177     }
178     virtual void SetTextSelection(int32_t selectionStart, int32_t selectionEnd,
179         const std::optional<SelectionOptions>& options = std::nullopt) {}
GetTextContentRect()180     virtual Rect GetTextContentRect()
181     {
182         return {};
183     }
GetTextContentLinesNum()184     virtual int32_t GetTextContentLinesNum()
185     {
186         return {};
187     }
StopEditing()188     virtual void StopEditing() {}
189 
SetGetCaretIndex(std::function<int32_t ()> && setGetCaretIndex)190     void SetGetCaretIndex(std::function<int32_t()>&& setGetCaretIndex)
191     {
192         getCaretIndex_ = std::move(setGetCaretIndex);
193     }
194 
SetGetCaretPosition(std::function<NG::OffsetF ()> && setGetCaretPosition)195     void SetGetCaretPosition(std::function<NG::OffsetF()>&& setGetCaretPosition)
196     {
197         getCaretPosition_ = std::move(setGetCaretPosition);
198     }
199 
SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)200     void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition)
201     {
202         setCaretPosition_ = std::move(setCaretPosition);
203     }
204 
SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)205     void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect)
206     {
207         getTextContentRect_ = std::move(getTextContentRect);
208     }
209 
SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)210     void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum)
211     {
212         getTextContentLinesNum_ = std::move(getTextContentLinesNum);
213     }
214 
SetStopEditing(std::function<void (void)> && stopEditing)215     void SetStopEditing(std::function<void(void)>&& stopEditing)
216     {
217         stopEditing_ = std::move(stopEditing);
218     }
219 
EscapeString(const std::string & value,std::string & result)220     static bool EscapeString(const std::string& value, std::string& result)
221     {
222         const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" },
223             { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" },
224             { "?", "\?" }, { "0", "\0" } };
225         size_t i = 0;
226         for (; i < value.size();) {
227             std::string ch = value.substr(i, 1);
228             if (ch == "\\") {
229                 if (i + 1 >= value.size()) {
230                     return false;
231                 }
232                 i++;
233                 // cannot escape this combo
234                 auto nextChar = value.substr(i, 1);
235                 auto mapTuple = escapeMap.find(nextChar);
236                 if (mapTuple == escapeMap.end()) {
237                     LOGE("Find escape \\%{public}s failed", nextChar.c_str());
238                     return false;
239                 }
240                 ch = mapTuple->second;
241             }
242             result += ch;
243             i++;
244         }
245         return true;
246     }
247 
248 protected:
249     std::function<void(const int32_t)> setCaretPosition_;
250     std::function<Rect(void)> getTextContentRect_;
251     std::function<int32_t(void)> getCaretIndex_;
252     std::function<NG::OffsetF(void)> getCaretPosition_;
253     std::function<int32_t(void)> getTextContentLinesNum_;
254     std::function<void(void)> stopEditing_;
255 };
256 
257 class ACE_FORCE_EXPORT TextFieldModel {
258 public:
259     static TextFieldModel* GetInstance();
260     virtual ~TextFieldModel() = default;
261 
262     virtual RefPtr<TextFieldControllerBase> CreateTextInput(
263         const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0;
264 
265     virtual RefPtr<TextFieldControllerBase> CreateTextArea(
266         const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0;
267 
268     virtual void RequestKeyboardOnFocus(bool needToRequest) = 0;
SetWidthAuto(bool isAuto)269     virtual void SetWidthAuto(bool isAuto) {}
270     virtual void SetType(TextInputType value) = 0;
271     virtual void SetContentType(const NG::TextContentType& value) = 0;
272     virtual void SetPlaceholderColor(const Color& value) = 0;
273     virtual void SetPlaceholderFont(const Font& value) = 0;
274     virtual void SetEnterKeyType(TextInputAction value) = 0;
275     virtual void SetTextAlign(TextAlign value) = 0;
276     virtual void SetLineBreakStrategy(LineBreakStrategy lineBreakStrategy) = 0;
277     virtual void SetCaretColor(const Color& value) = 0;
278     virtual void SetCaretPosition(const int32_t& value) = 0;
279     virtual void SetSelectedBackgroundColor(const Color& value) = 0;
280     virtual void SetCaretStyle(const CaretStyle& value) = 0;
281     virtual void SetMaxLength(uint32_t value) = 0;
282     virtual void SetMaxLines(uint32_t value) = 0;
283     virtual void SetFontSize(const Dimension& value) = 0;
284     virtual void SetFontWeight(FontWeight value) = 0;
285     virtual void SetTextColor(const Color& value) = 0;
SetWordBreak(Ace::WordBreak value)286     virtual void SetWordBreak(Ace::WordBreak value) {};
287     virtual void SetFontStyle(FontStyle value) = 0;
288     virtual void SetFontFamily(const std::vector<std::string>& value) = 0;
289     virtual void SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError) = 0;
290     virtual void SetInputStyle(InputStyle value) = 0;
291     virtual void SetShowPasswordIcon(bool value) = 0;
292     virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0;
293     virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0;
294     virtual void SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func) = 0;
295     virtual void SetOnChange(std::function<void(const std::string&, PreviewText&)>&& func) = 0;
296     virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0;
297     virtual void SetOnSecurityStateChange(std::function<void(bool)>&& func) = 0;
298     virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0;
299     virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0;
300     virtual void SetOnCut(std::function<void(const std::string&)>&& func) = 0;
301     virtual void SetOnPaste(std::function<void(const std::string&)>&& func) = 0;
302     virtual void SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func) = 0;
303     virtual void SetCopyOption(CopyOptions copyOption) = 0;
304     virtual void ResetMaxLength() = 0;
305     virtual void SetForegroundColor(const Color& value) = 0;
306     virtual void SetBackgroundColor(const Color& color, bool tmp) = 0;
307     virtual void SetHeight(const Dimension& value) = 0;
308     virtual void SetPadding(const NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp) = 0;
SetMargin()309     virtual void SetMargin() {};
SetBackBorder()310     virtual void SetBackBorder() {};
311     virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0;
312     virtual void SetShowPasswordText(bool value) = 0;
SetOnClick(std::function<void (const ClickInfo &)> && func)313     virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {};
SetPasswordIcon(const PasswordIcon & passwordIcon)314     virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {};
SetShowUnit(std::function<void ()> && unitAction)315     virtual void SetShowUnit(std::function<void()>&& unitAction) {};
SetShowError(const std::string & errorText,bool visible)316     virtual void SetShowError(const std::string& errorText, bool visible) {};
SetBarState(DisplayMode value)317     virtual void SetBarState(DisplayMode value) {};
SetMaxViewLines(uint32_t value)318     virtual void SetMaxViewLines(uint32_t value) {};
SetNormalMaxViewLines(uint32_t value)319     virtual void SetNormalMaxViewLines(uint32_t value) {};
320 
SetShowUnderline(bool showUnderLine)321     virtual void SetShowUnderline(bool showUnderLine) {};
SetNormalUnderlineColor(const Color & normalColor)322     virtual void SetNormalUnderlineColor(const Color& normalColor) {};
SetUserUnderlineColor(UserUnderlineColor userColor)323     virtual void SetUserUnderlineColor(UserUnderlineColor userColor) {};
SetShowCounter(bool value)324     virtual void SetShowCounter(bool value) {};
325     virtual void SetOnChangeEvent(std::function<void(const std::string&)>&& func) = 0;
SetFocusableAndFocusNode()326     virtual void SetFocusableAndFocusNode() {};
327     virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0;
328     virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc, bool supportAvoidance = false) = 0;
329     virtual void SetPasswordRules(const std::string& passwordRules) = 0;
330     virtual void SetEnableAutoFill(bool enableAutoFill) = 0;
SetCounterType(int32_t value)331     virtual void SetCounterType(int32_t value) {};
SetShowCounterBorder(bool value)332     virtual void SetShowCounterBorder(bool value) {};
333     virtual void SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle) = 0;
334     virtual void SetCancelIconSize(const CalcDimension& iconSize) = 0;
335     virtual void SetCanacelIconSrc(
336         const std::string& iconSrc, const std::string& bundleName, const std::string& moduleName) = 0;
337     virtual void SetCancelIconColor(const Color& iconColor) = 0;
338     virtual void SetIsShowCancelButton(bool isShowCancelButton) = 0;
339 
340     virtual void SetSelectAllValue(bool isSetSelectAllValue) = 0;
341     virtual void SetFontFeature(const std::list<std::pair<std::string, int32_t>>& value) = 0;
SetLetterSpacing(const Dimension & value)342     virtual void SetLetterSpacing(const Dimension& value) {};
SetLineHeight(const Dimension & value)343     virtual void SetLineHeight(const Dimension& value) {};
SetLineSpacing(const Dimension & value)344     virtual void SetLineSpacing(const Dimension& value) {};
SetAdaptMinFontSize(const Dimension & value)345     virtual void SetAdaptMinFontSize(const Dimension& value) {};
SetAdaptMaxFontSize(const Dimension & value)346     virtual void SetAdaptMaxFontSize(const Dimension& value) {};
SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)347     virtual void SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value) {};
SetTextDecoration(Ace::TextDecoration value)348     virtual void SetTextDecoration(Ace::TextDecoration value) {};
SetTextDecorationColor(const Color & value)349     virtual void SetTextDecorationColor(const Color& value) {};
SetTextDecorationStyle(Ace::TextDecorationStyle value)350     virtual void SetTextDecorationStyle(Ace::TextDecorationStyle value) {};
351 
SetTextOverflow(Ace::TextOverflow value)352     virtual void SetTextOverflow(Ace::TextOverflow value) {};
SetTextIndent(const Dimension & value)353     virtual void SetTextIndent(const Dimension& value) {};
354     virtual void SetOnWillInsertValueEvent(std::function<bool(const InsertValueInfo&)>&& func) = 0;
355     virtual void SetOnDidInsertValueEvent(std::function<void(const InsertValueInfo&)>&& func) = 0;
356     virtual void SetOnWillDeleteEvent(std::function<bool(const DeleteValueInfo&)>&& func) = 0;
357     virtual void SetOnDidDeleteEvent(std::function<void(const DeleteValueInfo&)>&& func) = 0;
SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)358     virtual void SetSelectionMenuOptions(
359         const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick) {};
360     virtual void SetEnablePreviewText(bool enablePreviewText) = 0;
361     virtual void SetEnableHapticFeedback(bool state) = 0;
362 
363 private:
364     static std::unique_ptr<TextFieldModel> instance_;
365     static std::mutex mutex_;
366 };
367 
368 } // namespace OHOS::Ace
369 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H
370