• 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::string text,int32_t offset)191     virtual int32_t AddText(std::string 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 {}; }
194 
SetGetCaretIndex(std::function<int32_t ()> && setGetCaretIndex)195     void SetGetCaretIndex(std::function<int32_t()>&& setGetCaretIndex)
196     {
197         getCaretIndex_ = std::move(setGetCaretIndex);
198     }
199 
SetGetCaretPosition(std::function<NG::OffsetF ()> && setGetCaretPosition)200     void SetGetCaretPosition(std::function<NG::OffsetF()>&& setGetCaretPosition)
201     {
202         getCaretPosition_ = std::move(setGetCaretPosition);
203     }
204 
SetCaretPosition(std::function<void (const int32_t)> && setCaretPosition)205     void SetCaretPosition(std::function<void(const int32_t)>&& setCaretPosition)
206     {
207         setCaretPosition_ = std::move(setCaretPosition);
208     }
209 
SetGetTextContentRect(std::function<Rect ()> && getTextContentRect)210     void SetGetTextContentRect(std::function<Rect()>&& getTextContentRect)
211     {
212         getTextContentRect_ = std::move(getTextContentRect);
213     }
214 
SetGetTextContentLinesNum(std::function<int32_t ()> && getTextContentLinesNum)215     void SetGetTextContentLinesNum(std::function<int32_t()>&& getTextContentLinesNum)
216     {
217         getTextContentLinesNum_ = std::move(getTextContentLinesNum);
218     }
219 
SetStopEditing(std::function<void (void)> && stopEditing)220     void SetStopEditing(std::function<void(void)>&& stopEditing)
221     {
222         stopEditing_ = std::move(stopEditing);
223     }
224 
EscapeString(const std::string & value,std::string & result)225     static bool EscapeString(const std::string& value, std::string& result)
226     {
227         const std::unordered_map<std::string, std::string> escapeMap = { { "a", "\a" }, { "b", "\b" }, { "f", "\f" },
228             { "n", "\n" }, { "r", "\r" }, { "t", "\t" }, { "v", "\v" }, { "'", "\'" }, { "\"", "\"" }, { "\\", "\\" },
229             { "?", "\?" }, { "0", "\0" } };
230         size_t i = 0;
231         for (; i < value.size();) {
232             std::string ch = value.substr(i, 1);
233             if (ch == "\\") {
234                 if (i + 1 >= value.size()) {
235                     return false;
236                 }
237                 i++;
238                 // cannot escape this combo
239                 auto nextChar = value.substr(i, 1);
240                 auto mapTuple = escapeMap.find(nextChar);
241                 if (mapTuple == escapeMap.end()) {
242                     LOGE("Find escape \\%{public}s failed", nextChar.c_str());
243                     return false;
244                 }
245                 ch = mapTuple->second;
246             }
247             result += ch;
248             i++;
249         }
250         return true;
251     }
252 
253 protected:
254     std::function<void(const int32_t)> setCaretPosition_;
255     std::function<Rect(void)> getTextContentRect_;
256     std::function<int32_t(void)> getCaretIndex_;
257     std::function<NG::OffsetF(void)> getCaretPosition_;
258     std::function<int32_t(void)> getTextContentLinesNum_;
259     std::function<void(void)> stopEditing_;
260 };
261 
262 class ACE_FORCE_EXPORT TextFieldModel {
263 public:
264     static TextFieldModel* GetInstance();
265     virtual ~TextFieldModel() = default;
266 
267     virtual RefPtr<TextFieldControllerBase> CreateTextInput(
268         const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0;
269 
270     virtual RefPtr<TextFieldControllerBase> CreateTextArea(
271         const std::optional<std::string>& placeholder, const std::optional<std::string>& value) = 0;
272 
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 SetPlaceholderFont(const Font& value) = 0;
279     virtual void SetEnterKeyType(TextInputAction value) = 0;
280     virtual void SetTextAlign(TextAlign value) = 0;
281     virtual void SetLineBreakStrategy(LineBreakStrategy lineBreakStrategy) = 0;
282     virtual void SetCaretColor(const Color& value) = 0;
283     virtual void SetCaretPosition(const int32_t& value) = 0;
284     virtual void SetSelectedBackgroundColor(const Color& value) = 0;
285     virtual void SetCaretStyle(const CaretStyle& value) = 0;
286     virtual void SetMaxLength(uint32_t value) = 0;
287     virtual void SetMaxLines(uint32_t value) = 0;
288     virtual void SetFontSize(const Dimension& value) = 0;
289     virtual void SetFontWeight(FontWeight value) = 0;
290     virtual void SetTextColor(const Color& value) = 0;
SetWordBreak(Ace::WordBreak value)291     virtual void SetWordBreak(Ace::WordBreak value) {};
292     virtual void SetFontStyle(FontStyle value) = 0;
293     virtual void SetFontFamily(const std::vector<std::string>& value) = 0;
294     virtual void SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError) = 0;
295     virtual void SetInputStyle(InputStyle value) = 0;
296     virtual void SetShowPasswordIcon(bool value) = 0;
297     virtual void SetOnEditChanged(std::function<void(bool)>&& func) = 0;
298     virtual void SetOnSubmit(std::function<void(int32_t)>&& func) = 0;
299     virtual void SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func) = 0;
300     virtual void SetOnChange(std::function<void(const ChangeValueInfo&)>&& func) = 0;
301     virtual void SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func) = 0;
302     virtual void SetOnSecurityStateChange(std::function<void(bool)>&& func) = 0;
303     virtual void SetOnContentScroll(std::function<void(float, float)>&& func) = 0;
304     virtual void SetOnCopy(std::function<void(const std::string&)>&& func) = 0;
305     virtual void SetOnCut(std::function<void(const std::string&)>&& func) = 0;
306     virtual void SetOnPaste(std::function<void(const std::string&)>&& func) = 0;
307     virtual void SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func) = 0;
308     virtual void SetCopyOption(CopyOptions copyOption) = 0;
309     virtual void ResetMaxLength() = 0;
310     virtual void SetForegroundColor(const Color& value) = 0;
311     virtual void SetBackgroundColor(const Color& color, bool tmp) = 0;
312     virtual void SetHeight(const Dimension& value) = 0;
313     virtual void SetPadding(const NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp) = 0;
SetMargin()314     virtual void SetMargin() {};
SetBackBorder()315     virtual void SetBackBorder() {};
316     virtual void SetHoverEffect(HoverEffectType hoverEffect) = 0;
317     virtual void SetShowPasswordText(bool value) = 0;
SetOnClick(std::function<void (const ClickInfo &)> && func)318     virtual void SetOnClick(std::function<void(const ClickInfo&)>&& func) {};
SetPasswordIcon(const PasswordIcon & passwordIcon)319     virtual void SetPasswordIcon(const PasswordIcon& passwordIcon) {};
SetShowUnit(std::function<void ()> && unitAction)320     virtual void SetShowUnit(std::function<void()>&& unitAction) {};
SetShowError(const std::string & errorText,bool visible)321     virtual void SetShowError(const std::string& errorText, bool visible) {};
SetBarState(DisplayMode value)322     virtual void SetBarState(DisplayMode value) {};
SetMaxViewLines(uint32_t value)323     virtual void SetMaxViewLines(uint32_t value) {};
SetNormalMaxViewLines(uint32_t value)324     virtual void SetNormalMaxViewLines(uint32_t value) {};
325 
SetShowUnderline(bool showUnderLine)326     virtual void SetShowUnderline(bool showUnderLine) {};
SetNormalUnderlineColor(const Color & normalColor)327     virtual void SetNormalUnderlineColor(const Color& normalColor) {};
SetUserUnderlineColor(UserUnderlineColor userColor)328     virtual void SetUserUnderlineColor(UserUnderlineColor userColor) {};
SetShowCounter(bool value)329     virtual void SetShowCounter(bool value) {};
330     virtual void SetOnWillChangeEvent(std::function<bool(const ChangeValueInfo&)>&& func) = 0;
331     virtual void SetOnChangeEvent(std::function<void(const std::string&)>&& func) = 0;
SetFocusableAndFocusNode()332     virtual void SetFocusableAndFocusNode() {};
333     virtual void SetSelectionMenuHidden(bool contextMenuHidden) = 0;
334     virtual void SetCustomKeyboard(const std::function<void()>&& buildFunc, bool supportAvoidance = false) = 0;
335     virtual void SetPasswordRules(const std::string& passwordRules) = 0;
336     virtual void SetEnableAutoFill(bool enableAutoFill) = 0;
SetCounterType(int32_t value)337     virtual void SetCounterType(int32_t value) {};
SetShowCounterBorder(bool value)338     virtual void SetShowCounterBorder(bool value) {};
339     virtual void SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle) = 0;
340     virtual void SetCancelIconSize(const CalcDimension& iconSize) = 0;
341     virtual void SetCanacelIconSrc(
342         const std::string& iconSrc, const std::string& bundleName, const std::string& moduleName) = 0;
343     virtual void SetCancelIconColor(const Color& iconColor) = 0;
344     virtual void SetIsShowCancelButton(bool isShowCancelButton) = 0;
345 
346     virtual void SetSelectAllValue(bool isSetSelectAllValue) = 0;
347     virtual void SetFontFeature(const std::list<std::pair<std::string, int32_t>>& value) = 0;
SetLetterSpacing(const Dimension & value)348     virtual void SetLetterSpacing(const Dimension& value) {};
SetLineHeight(const Dimension & value)349     virtual void SetLineHeight(const Dimension& value) {};
SetLineSpacing(const Dimension & value)350     virtual void SetLineSpacing(const Dimension& value) {};
SetAdaptMinFontSize(const Dimension & value)351     virtual void SetAdaptMinFontSize(const Dimension& value) {};
SetAdaptMaxFontSize(const Dimension & value)352     virtual void SetAdaptMaxFontSize(const Dimension& value) {};
SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value)353     virtual void SetHeightAdaptivePolicy(TextHeightAdaptivePolicy value) {};
SetTextDecoration(Ace::TextDecoration value)354     virtual void SetTextDecoration(Ace::TextDecoration value) {};
SetTextDecorationColor(const Color & value)355     virtual void SetTextDecorationColor(const Color& value) {};
SetTextDecorationStyle(Ace::TextDecorationStyle value)356     virtual void SetTextDecorationStyle(Ace::TextDecorationStyle value) {};
357 
SetTextOverflow(Ace::TextOverflow value)358     virtual void SetTextOverflow(Ace::TextOverflow value) {};
SetTextIndent(const Dimension & value)359     virtual void SetTextIndent(const Dimension& value) {};
360     virtual void SetOnWillInsertValueEvent(std::function<bool(const InsertValueInfo&)>&& func) = 0;
361     virtual void SetOnDidInsertValueEvent(std::function<void(const InsertValueInfo&)>&& func) = 0;
362     virtual void SetOnWillDeleteEvent(std::function<bool(const DeleteValueInfo&)>&& func) = 0;
363     virtual void SetOnDidDeleteEvent(std::function<void(const DeleteValueInfo&)>&& func) = 0;
SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)364     virtual void SetSelectionMenuOptions(
365         const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick) {};
366     virtual void SetEnablePreviewText(bool enablePreviewText) = 0;
367     virtual void SetEnableHapticFeedback(bool state) = 0;
SetStopBackPress(bool isStopBackPress)368     virtual void SetStopBackPress(bool isStopBackPress) {};
369     virtual void SetKeyboardAppearance(KeyboardAppearance value) = 0;
370 
371 private:
372     static std::unique_ptr<TextFieldModel> instance_;
373     static std::mutex mutex_;
374 };
375 
376 } // namespace OHOS::Ace
377 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_TEXT_FIELD_TEXT_FIELD_MODEL_H
378