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