1 /*
2  * Copyright (c) 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 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_textfield_ffi.h"
17 
18 #include "cj_lambda.h"
19 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h"
20 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
21 #include "bridge/common/utils/utils.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/components_ng/base/view_abstract_model_ng.h"
24 #include "core/components_ng/pattern/text_field/text_field_model.h"
25 #include "core/components_ng/pattern/text_field/text_field_model_ng.h"
26 
27 using namespace OHOS::Ace;
28 using namespace OHOS::FFI;
29 using namespace OHOS::Ace::Framework;
30 
31 namespace {
32 const std::vector<BorderStyle> BORDER_STYLES = { BorderStyle::SOLID, BorderStyle::DASHED, BorderStyle::DOTTED };
33 const std::vector<FontStyle> FONT_STYLES = { FontStyle::NORMAL, FontStyle::ITALIC };
34 const std::vector<TextInputAction> TEXT_INPUT_ACTIONS = {
35     TextInputAction::UNSPECIFIED, TextInputAction::NONE, TextInputAction::GO,  TextInputAction::SEARCH,
36     TextInputAction::SEND, TextInputAction::NEXT, TextInputAction::DONE, TextInputAction::PREVIOUS,
37     TextInputAction::NEW_LINE
38 };
39 const std::vector<TextInputType> TEXT_INPUT_TYPES = { TextInputType::TEXT, TextInputType::NUMBER,
40     TextInputType::EMAIL_ADDRESS, TextInputType::VISIBLE_PASSWORD };
41 const std::vector<TextAlign> TEXT_ALIGNS = { TextAlign::START, TextAlign::CENTER, TextAlign::END };
42 
FormatCharFunction(void (* callback)(const char * value))43 const std::function<void(std::string)> FormatCharFunction(void (*callback)(const char* value))
44 {
45     const std::function<void(std::string)> result = [lambda = CJLambda::Create(callback)](
46                                                         const std::string& value) -> void { lambda(value.c_str()); };
47     return result;
48 }
49 
50 } // namespace
51 
52 extern "C" {
FfiOHOSAceFrameworkTextFieldSetHeight(double height,uint32_t unit)53 void FfiOHOSAceFrameworkTextFieldSetHeight(double height, uint32_t unit)
54 {
55     FfiOHOSAceFrameworkViewAbstractSetHeight(height, unit);
56 }
57 
FfiOHOSAceFrameworkTextFieldSetSize(double width,uint32_t widthUnit,double height,uint32_t heightUnit)58 void FfiOHOSAceFrameworkTextFieldSetSize(double width, uint32_t widthUnit, double height, uint32_t heightUnit)
59 {
60     FfiOHOSAceFrameworkViewAbstractSetSize(width, widthUnit, height, heightUnit);
61 }
62 
FfiOHOSAceFrameworkTextFieldSetBorder(CJBorder params)63 void FfiOHOSAceFrameworkTextFieldSetBorder(CJBorder params)
64 {
65     if (!Utils::CheckParamsValid(params.style, BORDER_STYLES.size())) {
66         LOGE("invalid value for border style");
67         return;
68     }
69 
70     FfiOHOSAceFrameworkViewAbstractSetBorder(params);
71     TextFieldModel::GetInstance()->SetBackBorder();
72 }
73 
FfiOHOSAceFrameworkTextFieldSetBorderWidth(double value,uint32_t unit)74 void FfiOHOSAceFrameworkTextFieldSetBorderWidth(double value, uint32_t unit)
75 {
76     FfiOHOSAceFrameworkViewAbstractSetBorderWidth(value, unit);
77     TextFieldModel::GetInstance()->SetBackBorder();
78 }
79 
FfiOHOSAceFrameworkTextFieldSetBorderColor(uint32_t color)80 void FfiOHOSAceFrameworkTextFieldSetBorderColor(uint32_t color)
81 {
82     FfiOHOSAceFrameworkViewAbstractSetBorderColor(color);
83     TextFieldModel::GetInstance()->SetBackBorder();
84 }
85 
FfiOHOSAceFrameworkTextFieldSetBorderWidthWithCJEdge(CJEdge params)86 void FfiOHOSAceFrameworkTextFieldSetBorderWidthWithCJEdge(CJEdge params)
87 {
88     FfiOHOSAceFrameworkViewAbstractSetBorderWidthWithCJEdge(params);
89     TextFieldModel::GetInstance()->SetBackBorder();
90 }
91 
FfiOHOSAceFrameworkTextFieldSetBorderStyle(int32_t style)92 void FfiOHOSAceFrameworkTextFieldSetBorderStyle(int32_t style)
93 {
94     if (!Utils::CheckParamsValid(style, BORDER_STYLES.size())) {
95         LOGE("invalid value for border style");
96         return;
97     }
98 
99     FfiOHOSAceFrameworkViewAbstractSetBorderStyle(style);
100     TextFieldModel::GetInstance()->SetBackBorder();
101 }
102 
FfiOHOSAceFrameworkTextFieldSetBorderRadius(double value,uint32_t unit)103 void FfiOHOSAceFrameworkTextFieldSetBorderRadius(double value, uint32_t unit)
104 {
105     FfiOHOSAceFrameworkViewAbstractSetBorderRadius(value, unit);
106     TextFieldModel::GetInstance()->SetBackBorder();
107 }
108 
FfiOHOSAceFrameworkTextFieldSetAllBorderRadius(CJBorderRadius value)109 void FfiOHOSAceFrameworkTextFieldSetAllBorderRadius(CJBorderRadius value)
110 {
111     FfiOHOSAceFrameworkViewAbstractSetAllBorderRadius(value);
112     TextFieldModel::GetInstance()->SetBackBorder();
113 }
114 
FfiOHOSAceFrameworkTextFieldSetBackgroundColor(uint32_t value)115 void FfiOHOSAceFrameworkTextFieldSetBackgroundColor(uint32_t value)
116 {
117     TextFieldModel::GetInstance()->SetBackgroundColor(Color(value), false);
118 }
119 
FfiOHOSAceFrameworkTextFieldSetPadding(double value,int32_t unit)120 void FfiOHOSAceFrameworkTextFieldSetPadding(double value, int32_t unit)
121 {
122     struct CJEdge textEdge;
123     textEdge.top = value;
124     textEdge.topUnit = unit;
125     textEdge.right = value;
126     textEdge.rightUnit = unit;
127     textEdge.bottom = value;
128     textEdge.bottomUnit = unit;
129     textEdge.left = value;
130     textEdge.leftUnit = unit;
131     FfiOHOSAceFrameworkTextFieldSetPaddings(textEdge);
132 }
133 
FfiOHOSAceFrameworkTextFieldSetPaddings(CJEdge params)134 void FfiOHOSAceFrameworkTextFieldSetPaddings(CJEdge params)
135 {
136     NG::PaddingProperty paddings;
137     paddings.top = NG::CalcLength(Dimension(params.top, static_cast<DimensionUnit>(params.topUnit)));
138     paddings.right = NG::CalcLength(Dimension(params.right, static_cast<DimensionUnit>(params.rightUnit)));
139     paddings.bottom = NG::CalcLength(Dimension(params.bottom, static_cast<DimensionUnit>(params.bottomUnit)));
140     paddings.left = NG::CalcLength(Dimension(params.left, static_cast<DimensionUnit>(params.leftUnit)));
141     TextFieldModel::GetInstance()->SetPadding(paddings, Edge(), false);
142 }
143 
FfiOHOSAceFrameworkTextFieldSetMargin(double value,int32_t unit)144 void FfiOHOSAceFrameworkTextFieldSetMargin(double value, int32_t unit)
145 {
146     FfiOHOSAceFrameworkViewAbstractSetMargin(value, unit);
147     TextFieldModel::GetInstance()->SetMargin();
148 }
149 
FfiOHOSAceFrameworkTextFieldSetMargins(CJEdge params)150 void FfiOHOSAceFrameworkTextFieldSetMargins(CJEdge params)
151 {
152     FfiOHOSAceFrameworkViewAbstractSetMargins(params);
153     TextFieldModel::GetInstance()->SetMargin();
154 }
155 
FfiOHOSAceFrameworkTextFieldSetPlaceholderColor(uint32_t value)156 void FfiOHOSAceFrameworkTextFieldSetPlaceholderColor(uint32_t value)
157 {
158     TextFieldModel::GetInstance()->SetPlaceholderColor(Color(value));
159 }
160 
FfiOHOSAceFrameworkTextFieldSetPlaceholderFont(double size,int32_t unit,const char * weight,const char * family,int32_t style)161 void FfiOHOSAceFrameworkTextFieldSetPlaceholderFont(
162     double size, int32_t unit, const char* weight, const char* family, int32_t style)
163 {
164     if (!Utils::CheckParamsValid(style, FONT_STYLES.size())) {
165         LOGE("invalid value for font style");
166         return;
167     }
168     Dimension sizeDime(size, static_cast<DimensionUnit>(unit));
169     if (sizeDime.IsNegative()) {
170         sizeDime.SetValue(0.0);
171     }
172 
173     OHOS::Ace::Font font;
174 
175     font.fontWeight = ConvertStrToFontWeight(weight);
176     font.fontSize = sizeDime;
177     font.fontStyle = FONT_STYLES[style];
178     font.fontFamilies = ConvertStrToFontFamilies(family);
179 
180     TextFieldModel::GetInstance()->SetPlaceholderFont(font);
181 }
182 
FfiOHOSAceFrameworkTextFieldSetEnterKeyType(int32_t type)183 void FfiOHOSAceFrameworkTextFieldSetEnterKeyType(int32_t type)
184 {
185     if (!Utils::CheckParamsValid(type, TEXT_INPUT_ACTIONS.size())) {
186         LOGE("invalid value for text input action");
187         return;
188     }
189 
190     TextFieldModel::GetInstance()->SetEnterKeyType(TEXT_INPUT_ACTIONS[type]);
191 }
192 
FfiOHOSAceFrameworkTextFieldSetType(int32_t value)193 void FfiOHOSAceFrameworkTextFieldSetType(int32_t value)
194 {
195     if (!Utils::CheckParamsValid(value, TEXT_INPUT_TYPES.size())) {
196         LOGE("invalid value for text input type");
197         return;
198     }
199 
200     TextFieldModel::GetInstance()->SetType(TEXT_INPUT_TYPES[value]);
201 }
202 
FfiOHOSAceFrameworkTextFieldSetTextAlign(int32_t value)203 void FfiOHOSAceFrameworkTextFieldSetTextAlign(int32_t value)
204 {
205     if (!Utils::CheckParamsValid(value, TEXT_ALIGNS.size())) {
206         LOGE("invalid value for textAlign");
207         return;
208     }
209 
210     TextFieldModel::GetInstance()->SetTextAlign(TEXT_ALIGNS[value]);
211 }
212 
FfiOHOSAceFrameworkTextFieldSetCaretColor(uint32_t value)213 void FfiOHOSAceFrameworkTextFieldSetCaretColor(uint32_t value)
214 {
215     TextFieldModel::GetInstance()->SetCaretColor(Color(value));
216 }
217 
FfiOHOSAceFrameworkTextFieldSetMaxLength(uint32_t value)218 void FfiOHOSAceFrameworkTextFieldSetMaxLength(uint32_t value)
219 {
220     TextFieldModel::GetInstance()->SetMaxLength(value);
221 }
222 
FfiOHOSAceFrameworkTextFieldSetFontSize(double value,int32_t unit)223 void FfiOHOSAceFrameworkTextFieldSetFontSize(double value, int32_t unit)
224 {
225     Dimension size(value, static_cast<DimensionUnit>(unit));
226     if (size.IsNegative()) {
227         size.SetValue(0.0);
228     }
229 
230     TextFieldModel::GetInstance()->SetFontSize(size);
231 }
232 
FfiOHOSAceFrameworkTextFieldSetFontColor(uint32_t value)233 void FfiOHOSAceFrameworkTextFieldSetFontColor(uint32_t value)
234 {
235     TextFieldModel::GetInstance()->SetTextColor(Color(value));
236 }
237 
FfiOHOSAceFrameworkTextFieldSetFontWeight(const char * value)238 void FfiOHOSAceFrameworkTextFieldSetFontWeight(const char* value)
239 {
240     TextFieldModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(value));
241 }
242 
FfiOHOSAceFrameworkTextFieldSetFontStyle(int32_t value)243 void FfiOHOSAceFrameworkTextFieldSetFontStyle(int32_t value)
244 {
245     if (!Utils::CheckParamsValid(value, FONT_STYLES.size())) {
246         LOGE("invalid value for font style");
247         return;
248     }
249 
250     TextFieldModel::GetInstance()->SetFontStyle(FONT_STYLES[value]);
251 }
252 
FfiOHOSAceFrameworkTextFieldSetFontFamily(const char * value)253 void FfiOHOSAceFrameworkTextFieldSetFontFamily(const char* value)
254 {
255     TextFieldModel::GetInstance()->SetFontFamily(ConvertStrToFontFamilies(value));
256 }
257 
FfiOHOSAceFrameworkTextFieldSetInputFilter(const char * value,void (* callback)(const char * value))258 void FfiOHOSAceFrameworkTextFieldSetInputFilter(const char* value, void (*callback)(const char* value))
259 {
260     TextFieldModel::GetInstance()->SetInputFilter(value, FormatCharFunction(callback));
261 }
262 
FfiOHOSAceFrameworkTextFieldOnSubmit(void (* callback)(int32_t value))263 void FfiOHOSAceFrameworkTextFieldOnSubmit(void (*callback)(int32_t value))
264 {
265     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
266     auto task = [func = CJLambda::Create(callback), node = targetNode](int32_t key,
267                        NG::TextFieldCommonEvent& event) {
268         PipelineContext::SetCallBackNode(node);
269         func(key);
270     };
271     TextFieldModel::GetInstance()->SetOnSubmit(task);
272 }
273 
FfiOHOSAceFrameworkTextFieldOnChange(void (* callback)(const char * value))274 void FfiOHOSAceFrameworkTextFieldOnChange(void (*callback)(const char* value))
275 {
276     auto onChange = [func = FormatCharFunction(callback)](
277         const std::string& val, PreviewText& previewText) {
278         func(val);
279     };
280     TextFieldModel::GetInstance()->SetOnChange(onChange);
281 }
282 
FfiOHOSAceFrameworkTextFieldOnCopy(void (* callback)(const char * value))283 void FfiOHOSAceFrameworkTextFieldOnCopy(void (*callback)(const char* value))
284 {
285     TextFieldModel::GetInstance()->SetOnCopy(FormatCharFunction(callback));
286 }
287 
FfiOHOSAceFrameworkTextFieldOnCut(void (* callback)(const char * value))288 void FfiOHOSAceFrameworkTextFieldOnCut(void (*callback)(const char* value))
289 {
290     TextFieldModel::GetInstance()->SetOnCut(FormatCharFunction(callback));
291 }
292 
FfiOHOSAceFrameworkTextFieldOnPaste(void (* callback)(const char * value))293 void FfiOHOSAceFrameworkTextFieldOnPaste(void (*callback)(const char* value))
294 {
295     auto onPaste = [func = FormatCharFunction(callback)](
296         const std::string& val, NG::TextCommonEvent& info) {
297         func(val);
298     };
299     TextFieldModel::GetInstance()->SetOnPasteWithEvent(std::move(onPaste));
300 }
301 
FfiOHOSAceFrameworkTextFieldOnEditChanged(void (* callback)(bool value))302 void FfiOHOSAceFrameworkTextFieldOnEditChanged(void (*callback)(bool value))
303 {
304     TextFieldModel::GetInstance()->SetOnEditChanged(CJLambda::Create(callback));
305 }
306 }
307