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