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