1 /*
2 * Copyright (c) 2022-2023 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 "core/components_ng/pattern/text_field/text_field_model_ng.h"
17
18 #include <cstddef>
19
20 #include "base/memory/ace_type.h"
21 #include "base/memory/referenced.h"
22 #include "base/utils/utils.h"
23 #include "core/common/ime/text_edit_controller.h"
24 #include "core/common/ime/text_input_type.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/text_field/text_field_event_hub.h"
27 #include "core/components_ng/pattern/text_field/text_field_layout_property.h"
28 #include "core/components_ng/pattern/text_field/text_field_paint_property.h"
29 #include "core/components_ng/pattern/text_field/text_field_pattern.h"
30 #include "core/components_v2/inspector/inspector_constants.h"
31
32 namespace OHOS::Ace::NG {
CreateNode(const std::optional<std::string> & placeholder,const std::optional<std::string> & value,bool isTextArea)33 void TextFieldModelNG::CreateNode(
34 const std::optional<std::string>& placeholder, const std::optional<std::string>& value, bool isTextArea)
35 {
36 auto* stack = ViewStackProcessor::GetInstance();
37 auto nodeId = stack->ClaimNodeId();
38 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", isTextArea ? V2::TEXTAREA_ETS_TAG : V2::TEXTINPUT_ETS_TAG, nodeId);
39 auto frameNode = FrameNode::GetOrCreateFrameNode(isTextArea ? V2::TEXTAREA_ETS_TAG : V2::TEXTINPUT_ETS_TAG, nodeId,
40 []() { return AceType::MakeRefPtr<TextFieldPattern>(); });
41 stack->Push(frameNode);
42 auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
43 CHECK_NULL_VOID(textFieldLayoutProperty);
44 auto pattern = frameNode->GetPattern<TextFieldPattern>();
45 pattern->SetModifyDoneStatus(false);
46 auto textValue = pattern->GetTextValue();
47 if (SystemProperties::GetDebugEnabled()) {
48 LOGI("TextFieldModelNG::GetOrCreateNode with text %{public}s, current text %{public}s",
49 value.value_or("NA").c_str(), textValue.c_str());
50 }
51 if (value.has_value() && value.value() != textValue) {
52 pattern->InitValueText(value.value());
53 }
54 textFieldLayoutProperty->UpdatePlaceholder(placeholder.value_or(""));
55 if (!isTextArea) {
56 textFieldLayoutProperty->UpdateMaxLines(1);
57 textFieldLayoutProperty->UpdatePlaceholderMaxLines(1);
58 } else {
59 textFieldLayoutProperty->UpdatePlaceholderMaxLines(Infinity<uint32_t>());
60 }
61 pattern->SetTextFieldController(AceType::MakeRefPtr<TextFieldController>());
62 pattern->GetTextFieldController()->SetPattern(AceType::WeakClaim(AceType::RawPtr(pattern)));
63 pattern->SetTextEditController(AceType::MakeRefPtr<TextEditController>());
64 pattern->InitSurfaceChangedCallback();
65 pattern->InitSurfacePositionChangedCallback();
66 auto pipeline = frameNode->GetContext();
67 CHECK_NULL_VOID(pipeline);
68 auto themeManager = pipeline->GetThemeManager();
69 CHECK_NULL_VOID(themeManager);
70 auto textFieldTheme = themeManager->GetTheme<TextFieldTheme>();
71 CHECK_NULL_VOID(textFieldTheme);
72 auto textfieldPaintProperty = frameNode->GetPaintProperty<TextFieldPaintProperty>();
73 CHECK_NULL_VOID(textfieldPaintProperty);
74 textfieldPaintProperty->UpdatePressBgColor(textFieldTheme->GetPressColor());
75 textfieldPaintProperty->UpdateHoverBgColor(textFieldTheme->GetHoverColor());
76 SetCaretColor(textFieldTheme->GetCursorColor());
77 AddDragFrameNodeToManager();
78 PaddingProperty paddings;
79 ProcessDefaultPadding(paddings);
80 ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, Padding, paddings);
81 if (frameNode->IsFirstBuilding()) {
82 auto draggable = pipeline->GetDraggable<TextFieldTheme>();
83 SetDraggable(draggable);
84 auto gestureHub = frameNode->GetOrCreateGestureEventHub();
85 CHECK_NULL_VOID(gestureHub);
86 gestureHub->SetTextDraggable(true);
87 }
88 }
89
CreateFrameNode(int32_t nodeId,const std::optional<std::string> & placeholder,const std::optional<std::string> & value,bool isTextArea)90 RefPtr<FrameNode> TextFieldModelNG::CreateFrameNode(int32_t nodeId, const std::optional<std::string>& placeholder,
91 const std::optional<std::string>& value, bool isTextArea)
92 {
93 auto frameNode = FrameNode::CreateFrameNode(
94 isTextArea ? V2::TEXTAREA_ETS_TAG : V2::TEXTINPUT_ETS_TAG, nodeId, AceType::MakeRefPtr<TextFieldPattern>());
95 auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
96 CHECK_NULL_RETURN(textFieldLayoutProperty, nullptr);
97 auto pattern = frameNode->GetPattern<TextFieldPattern>();
98 pattern->SetModifyDoneStatus(false);
99 auto textValue = pattern->GetTextValue();
100 if (SystemProperties::GetDebugEnabled()) {
101 LOGI("TextFieldModelNG::GetOrCreateNode with text %{public}s, current text %{public}s",
102 value.value_or("NA").c_str(), textValue.c_str());
103 }
104 if (value.has_value() && value.value() != textValue) {
105 pattern->InitEditingValueText(value.value());
106 }
107 textFieldLayoutProperty->UpdatePlaceholder(placeholder.value_or(""));
108 if (!isTextArea) {
109 textFieldLayoutProperty->UpdateMaxLines(1);
110 textFieldLayoutProperty->UpdatePlaceholderMaxLines(1);
111 } else {
112 textFieldLayoutProperty->UpdatePlaceholderMaxLines(Infinity<uint32_t>());
113 }
114 pattern->SetTextFieldController(AceType::MakeRefPtr<TextFieldController>());
115 pattern->GetTextFieldController()->SetPattern(AceType::WeakClaim(AceType::RawPtr(pattern)));
116 pattern->SetTextEditController(AceType::MakeRefPtr<TextEditController>());
117 pattern->InitSurfaceChangedCallback();
118 pattern->InitSurfacePositionChangedCallback();
119 ProcessDefaultStyleAndBehaviors(frameNode);
120 return frameNode;
121 }
122
SetDraggable(bool draggable)123 void TextFieldModelNG::SetDraggable(bool draggable)
124 {
125 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
126 CHECK_NULL_VOID(frameNode);
127 frameNode->SetDraggable(draggable);
128 }
129
SetShowUnderline(bool showUnderLine)130 void TextFieldModelNG::SetShowUnderline(bool showUnderLine)
131 {
132 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowUnderline, showUnderLine);
133 }
134
ProcessDefaultStyleAndBehaviors(const RefPtr<FrameNode> & frameNode)135 void TextFieldModelNG::ProcessDefaultStyleAndBehaviors(const RefPtr<FrameNode>& frameNode)
136 {
137 auto pipeline = frameNode->GetContext();
138 CHECK_NULL_VOID(pipeline);
139 auto themeManager = pipeline->GetThemeManager();
140 CHECK_NULL_VOID(themeManager);
141 auto textFieldTheme = themeManager->GetTheme<TextFieldTheme>();
142 CHECK_NULL_VOID(textFieldTheme);
143 auto textfieldPaintProperty = frameNode->GetPaintProperty<TextFieldPaintProperty>();
144 CHECK_NULL_VOID(textfieldPaintProperty);
145 textfieldPaintProperty->UpdatePressBgColor(textFieldTheme->GetPressColor());
146 textfieldPaintProperty->UpdateHoverBgColor(textFieldTheme->GetHoverColor());
147 auto renderContext = frameNode->GetRenderContext();
148 renderContext->UpdateBackgroundColor(textFieldTheme->GetBgColor());
149 auto radius = textFieldTheme->GetBorderRadius();
150 textfieldPaintProperty->UpdateCursorColor(textFieldTheme->GetCursorColor());
151 BorderRadiusProperty borderRadius { radius.GetX(), radius.GetY(), radius.GetY(), radius.GetX() };
152 renderContext->UpdateBorderRadius(borderRadius);
153 auto dragDropManager = pipeline->GetDragDropManager();
154 CHECK_NULL_VOID(dragDropManager);
155 dragDropManager->AddTextFieldDragFrameNode(frameNode->GetId(), AceType::WeakClaim(AceType::RawPtr(frameNode)));
156 PaddingProperty paddings;
157 auto themePadding = textFieldTheme->GetPadding();
158 paddings.top = NG::CalcLength(themePadding.Top().ConvertToPx());
159 paddings.bottom = NG::CalcLength(themePadding.Bottom().ConvertToPx());
160 paddings.left = NG::CalcLength(themePadding.Left().ConvertToPx());
161 paddings.right = NG::CalcLength(themePadding.Right().ConvertToPx());
162 auto layoutProperty = frameNode->GetLayoutProperty<LayoutProperty>();
163 layoutProperty->UpdatePadding(paddings);
164 if (frameNode->IsFirstBuilding()) {
165 auto draggable = pipeline->GetDraggable<TextFieldTheme>();
166 frameNode->SetDraggable(draggable);
167 auto gestureHub = frameNode->GetOrCreateGestureEventHub();
168 CHECK_NULL_VOID(gestureHub);
169 gestureHub->SetTextDraggable(true);
170 }
171 }
172
ProcessDefaultPadding(PaddingProperty & paddings)173 void TextFieldModelNG::ProcessDefaultPadding(PaddingProperty& paddings)
174 {
175 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
176 CHECK_NULL_VOID(frameNode);
177 auto pipeline = frameNode->GetContext();
178 CHECK_NULL_VOID(pipeline);
179 auto themeManager = pipeline->GetThemeManager();
180 CHECK_NULL_VOID(themeManager);
181 auto textFieldTheme = themeManager->GetTheme<TextFieldTheme>();
182 CHECK_NULL_VOID(textFieldTheme);
183 auto themePadding = textFieldTheme->GetPadding();
184 paddings.top = NG::CalcLength(themePadding.Top().ConvertToPx());
185 paddings.bottom = NG::CalcLength(themePadding.Top().ConvertToPx());
186 paddings.left = NG::CalcLength(themePadding.Left().ConvertToPx());
187 paddings.right = NG::CalcLength(themePadding.Right().ConvertToPx());
188 }
189
CreateTextInput(const std::optional<std::string> & placeholder,const std::optional<std::string> & value)190 RefPtr<TextFieldControllerBase> TextFieldModelNG::CreateTextInput(
191 const std::optional<std::string>& placeholder, const std::optional<std::string>& value)
192 {
193 CreateNode(placeholder, value, false);
194 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
195 auto pattern = frameNode->GetPattern<TextFieldPattern>();
196 CHECK_NULL_RETURN(pattern, nullptr);
197 auto focusHub = pattern->GetFocusHub();
198 CHECK_NULL_RETURN(focusHub, nullptr);
199 focusHub->SetFocusType(FocusType::NODE);
200 focusHub->SetFocusStyleType(FocusStyleType::CUSTOM_REGION);
201 return pattern->GetTextFieldController();
202 };
203
CreateTextArea(const std::optional<std::string> & placeholder,const std::optional<std::string> & value)204 RefPtr<TextFieldControllerBase> TextFieldModelNG::CreateTextArea(
205 const std::optional<std::string>& placeholder, const std::optional<std::string>& value)
206 {
207 CreateNode(placeholder, value, true);
208 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
209 auto pattern = frameNode->GetPattern<TextFieldPattern>();
210 CHECK_NULL_RETURN(pattern, nullptr);
211 return pattern->GetTextFieldController();
212 }
213
SetWidthAuto(bool isAuto)214 void TextFieldModelNG::SetWidthAuto(bool isAuto)
215 {
216 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
217 CHECK_NULL_VOID(frameNode);
218 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, WidthAuto, isAuto);
219 }
220
RequestKeyboardOnFocus(bool needToRequest)221 void TextFieldModelNG::RequestKeyboardOnFocus(bool needToRequest)
222 {
223 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
224 CHECK_NULL_VOID(frameNode);
225 auto pattern = frameNode->GetPattern<TextFieldPattern>();
226 pattern->SetNeedToRequestKeyboardOnFocus(needToRequest);
227 }
228
SetType(TextInputType value)229 void TextFieldModelNG::SetType(TextInputType value)
230 {
231 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
232 CHECK_NULL_VOID(frameNode);
233 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
234 if (layoutProperty->HasTextInputType() && layoutProperty->GetTextInputTypeValue() != value) {
235 layoutProperty->UpdateTypeChanged(true);
236 }
237 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextInputType, value);
238 }
239
SetPlaceholderColor(const Color & value)240 void TextFieldModelNG::SetPlaceholderColor(const Color& value)
241 {
242 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderTextColor, value);
243 }
244
SetPlaceholderFont(const Font & value)245 void TextFieldModelNG::SetPlaceholderFont(const Font& value)
246 {
247 if (value.fontSize.has_value()) {
248 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderFontSize, value.fontSize.value());
249 }
250 if (value.fontStyle) {
251 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderItalicFontStyle, value.fontStyle.value());
252 }
253 if (value.fontWeight) {
254 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderFontWeight, value.fontWeight.value());
255 }
256 if (!value.fontFamilies.empty()) {
257 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderFontFamily, value.fontFamilies);
258 }
259 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredPlaceholderLineHeightNeedToUpdate, true);
260 }
261
SetEnterKeyType(TextInputAction value)262 void TextFieldModelNG::SetEnterKeyType(TextInputAction value)
263 {
264 auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<TextFieldPattern>();
265 CHECK_NULL_VOID(pattern);
266 if (value == TextInputAction::UNSPECIFIED) {
267 value = pattern->IsTextArea() ? TextInputAction::NEW_LINE : TextInputAction::DONE;
268 }
269 pattern->UpdateTextInputAction(value);
270 }
271
SetCaretColor(const Color & value)272 void TextFieldModelNG::SetCaretColor(const Color& value)
273 {
274 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, CursorColor, value);
275 }
276
SetCaretStyle(const CaretStyle & value)277 void TextFieldModelNG::SetCaretStyle(const CaretStyle& value)
278 {
279 if (value.caretWidth.has_value()) {
280 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, CursorWidth, value.caretWidth.value());
281 }
282 }
283
SetCaretPosition(const int32_t & value)284 void TextFieldModelNG::SetCaretPosition(const int32_t& value)
285 {
286 auto frameNode = ViewStackProcessor ::GetInstance()->GetMainFrameNode();
287 CHECK_NULL_VOID(frameNode);
288 auto pattern = frameNode->GetPattern<TextFieldPattern>();
289 pattern->SetCaretPosition(value);
290 }
291
SetSelectedBackgroundColor(const Color & value)292 void TextFieldModelNG::SetSelectedBackgroundColor(const Color& value)
293 {
294 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, SelectedBackgroundColor, value);
295 }
296
SetTextAlign(TextAlign value)297 void TextFieldModelNG::SetTextAlign(TextAlign value)
298 {
299 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
300 CHECK_NULL_VOID(frameNode);
301 auto pattern = frameNode->GetPattern<TextFieldPattern>();
302 CHECK_NULL_VOID(pattern);
303 TextAlign newValue = value;
304 if (!pattern->IsTextArea() && newValue == TextAlign::JUSTIFY) {
305 newValue = TextAlign::START;
306 }
307 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
308 if (layoutProperty->GetTextAlignValue(TextAlign::START) != newValue) {
309 layoutProperty->UpdateTextAlignChanged(true);
310 }
311 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextAlign, newValue);
312 }
313
SetMaxLength(uint32_t value)314 void TextFieldModelNG::SetMaxLength(uint32_t value)
315 {
316 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxLength, value);
317 }
ResetMaxLength()318 void TextFieldModelNG::ResetMaxLength()
319 {
320 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
321 CHECK_NULL_VOID(frameNode);
322 auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
323 if (textFieldLayoutProperty) {
324 textFieldLayoutProperty->ResetMaxLength();
325 }
326 }
SetMaxLines(uint32_t value)327 void TextFieldModelNG::SetMaxLines(uint32_t value)
328 {
329 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxLines, value);
330 }
SetFontSize(const Dimension & value)331 void TextFieldModelNG::SetFontSize(const Dimension& value)
332 {
333 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontSize, value);
334 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true);
335 }
SetFontWeight(FontWeight value)336 void TextFieldModelNG::SetFontWeight(FontWeight value)
337 {
338 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontWeight, value);
339 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true);
340 }
SetTextColor(const Color & value)341 void TextFieldModelNG::SetTextColor(const Color& value)
342 {
343 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextColor, value);
344 ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, value);
345 ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy);
346 ACE_UPDATE_RENDER_CONTEXT(ForegroundColorFlag, true);
347 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, TextColorFlagByUser, true);
348 }
SetFontStyle(Ace::FontStyle value)349 void TextFieldModelNG::SetFontStyle(Ace::FontStyle value)
350 {
351 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ItalicFontStyle, value);
352 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true);
353 }
SetFontFamily(const std::vector<std::string> & value)354 void TextFieldModelNG::SetFontFamily(const std::vector<std::string>& value)
355 {
356 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontFamily, value);
357 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true);
358 }
359
SetInputFilter(const std::string & value,const std::function<void (const std::string &)> & onError)360 void TextFieldModelNG::SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError)
361 {
362 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, InputFilter, value);
363 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
364 CHECK_NULL_VOID(eventHub);
365 eventHub->SetOnInputFilterError(onError);
366 }
367
SetInputStyle(InputStyle value)368 void TextFieldModelNG::SetInputStyle(InputStyle value)
369 {
370 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, InputStyle, value);
371 }
372
SetShowPasswordIcon(bool value)373 void TextFieldModelNG::SetShowPasswordIcon(bool value)
374 {
375 auto frameNode = ViewStackProcessor ::GetInstance()->GetMainFrameNode();
376 CHECK_NULL_VOID(frameNode);
377 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
378 CHECK_NULL_VOID(layoutProperty);
379 auto pattern = frameNode->GetPattern<TextFieldPattern>();
380 CHECK_NULL_VOID(pattern);
381 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowPasswordIcon, value);
382 }
383
SetOnEditChanged(std::function<void (bool)> && func)384 void TextFieldModelNG::SetOnEditChanged(std::function<void(bool)>&& func)
385 {
386 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
387 CHECK_NULL_VOID(eventHub);
388 eventHub->SetOnEditChanged(std::move(func));
389 }
390
SetOnSubmit(std::function<void (int32_t,NG::TextFieldCommonEvent &)> && func)391 void TextFieldModelNG::SetOnSubmit(std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func)
392 {
393 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
394 CHECK_NULL_VOID(eventHub);
395 eventHub->SetOnSubmit(std::move(func));
396 }
397
SetOnChange(std::function<void (const std::string &)> && func)398 void TextFieldModelNG::SetOnChange(std::function<void(const std::string&)>&& func)
399 {
400 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
401 CHECK_NULL_VOID(eventHub);
402 eventHub->SetOnChange(std::move(func));
403 }
404
SetOnTextSelectionChange(std::function<void (int32_t,int32_t)> && func)405 void TextFieldModelNG::SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func)
406 {
407 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
408 CHECK_NULL_VOID(eventHub);
409 eventHub->SetOnSelectionChange(std::move(func));
410 }
411
SetOnContentScroll(std::function<void (float,float)> && func)412 void TextFieldModelNG::SetOnContentScroll(std::function<void(float, float)>&& func)
413 {
414 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
415 CHECK_NULL_VOID(eventHub);
416 eventHub->SetOnScrollChangeEvent(std::move(func));
417 }
418
SetOnCopy(std::function<void (const std::string &)> && func)419 void TextFieldModelNG::SetOnCopy(std::function<void(const std::string&)>&& func)
420 {
421 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
422 CHECK_NULL_VOID(eventHub);
423 eventHub->SetOnCopy(std::move(func));
424 }
425
SetOnCut(std::function<void (const std::string &)> && func)426 void TextFieldModelNG::SetOnCut(std::function<void(const std::string&)>&& func)
427 {
428 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
429 CHECK_NULL_VOID(eventHub);
430 eventHub->SetOnCut(std::move(func));
431 }
432
SetOnPaste(std::function<void (const std::string &)> && func)433 void TextFieldModelNG::SetOnPaste(std::function<void(const std::string&)>&& func)
434 {
435 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
436 CHECK_NULL_VOID(eventHub);
437 eventHub->SetOnPaste(std::move(func));
438 }
439
SetOnPasteWithEvent(std::function<void (const std::string &,NG::TextCommonEvent &)> && func)440 void TextFieldModelNG::SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func)
441 {
442 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
443 CHECK_NULL_VOID(eventHub);
444 eventHub->SetOnPasteWithEvent(std::move(func));
445 }
446
SetCopyOption(CopyOptions copyOption)447 void TextFieldModelNG::SetCopyOption(CopyOptions copyOption)
448 {
449 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, CopyOptions, copyOption);
450 }
451
SetMenuOptionItems(std::vector<MenuOptionsParam> && menuOptionsItems)452 void TextFieldModelNG::SetMenuOptionItems(std::vector<MenuOptionsParam>&& menuOptionsItems)
453 {
454 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
455 CHECK_NULL_VOID(frameNode);
456 auto textFieldPattern = frameNode->GetPattern<TextFieldPattern>();
457 textFieldPattern->SetMenuOptionItems(std::move(menuOptionsItems));
458 }
459
AddDragFrameNodeToManager() const460 void TextFieldModelNG::AddDragFrameNodeToManager() const
461 {
462 auto pipeline = PipelineContext::GetCurrentContext();
463 CHECK_NULL_VOID(pipeline);
464 auto dragDropManager = pipeline->GetDragDropManager();
465 CHECK_NULL_VOID(dragDropManager);
466 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
467 CHECK_NULL_VOID(frameNode);
468 dragDropManager->AddTextFieldDragFrameNode(frameNode->GetId(), AceType::WeakClaim(AceType::RawPtr(frameNode)));
469 }
470
SetForegroundColor(const Color & value)471 void TextFieldModelNG::SetForegroundColor(const Color& value)
472 {
473 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextColor, value);
474 }
475
SetPasswordIcon(const PasswordIcon & passwordIcon)476 void TextFieldModelNG::SetPasswordIcon(const PasswordIcon& passwordIcon)
477 {
478 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
479 CHECK_NULL_VOID(frameNode);
480 auto pattern = frameNode->GetPattern<TextFieldPattern>();
481 CHECK_NULL_VOID(pattern);
482 if (passwordIcon.showResult != "") {
483 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowPasswordSourceInfo,
484 ImageSourceInfo(passwordIcon.showResult, passwordIcon.showBundleName, passwordIcon.showModuleName));
485 } else {
486 ImageSourceInfo showSystemSourceInfo;
487 showSystemSourceInfo.SetResourceId(InternalResource::ResourceId::SHOW_PASSWORD_SVG);
488 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowPasswordSourceInfo, showSystemSourceInfo);
489 }
490 if (passwordIcon.hideResult != "") {
491 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, HidePasswordSourceInfo,
492 ImageSourceInfo(passwordIcon.hideResult, passwordIcon.hideBundleName, passwordIcon.hideModuleName));
493 } else {
494 ImageSourceInfo hideSystemSourceInfo;
495 hideSystemSourceInfo.SetResourceId(InternalResource::ResourceId::HIDE_PASSWORD_SVG);
496 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, HidePasswordSourceInfo, hideSystemSourceInfo);
497 }
498 }
499
SetShowUnit(std::function<void ()> && unitFunction)500 void TextFieldModelNG::SetShowUnit(std::function<void()>&& unitFunction)
501 {
502 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
503 CHECK_NULL_VOID(frameNode);
504 auto pattern = frameNode->GetPattern<TextFieldPattern>();
505 CHECK_NULL_VOID(pattern);
506 RefPtr<NG::UINode> unitNode;
507 if (unitFunction) {
508 NG::ScopedViewStackProcessor builderViewStackProcessor;
509 unitFunction();
510 unitNode = NG::ViewStackProcessor::GetInstance()->Finish();
511 }
512 if (unitNode) {
513 pattern->SetUnitNode(unitNode);
514 }
515 }
516
SetShowError(const std::string & errorText,bool visible)517 void TextFieldModelNG::SetShowError(const std::string& errorText, bool visible)
518 {
519 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ErrorText, errorText);
520 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowErrorText, visible);
521 }
522
SetShowCounter(bool value)523 void TextFieldModelNG::SetShowCounter(bool value)
524 {
525 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
526 CHECK_NULL_VOID(frameNode);
527 auto pattern = frameNode->GetPattern<TextFieldPattern>();
528 CHECK_NULL_VOID(pattern);
529 pattern->SetCounterState(false);
530 if (value) {
531 pattern->AddCounterNode();
532 } else {
533 pattern->CleanCounterNode();
534 }
535 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowCounter, value);
536 }
537
SetCounterType(int32_t value)538 void TextFieldModelNG::SetCounterType(int32_t value)
539 {
540 auto frameNode = ViewStackProcessor ::GetInstance()->GetMainFrameNode();
541 CHECK_NULL_VOID(frameNode);
542 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
543 CHECK_NULL_VOID(layoutProperty);
544 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SetCounter, value);
545 }
546
SetShowCounterBorder(bool value)547 void TextFieldModelNG::SetShowCounterBorder(bool value)
548 {
549 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
550 CHECK_NULL_VOID(frameNode);
551 auto pattern = frameNode->GetPattern<TextFieldPattern>();
552 CHECK_NULL_VOID(pattern);
553 pattern->SetCounterState(false);
554 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowHighlightBorder, value);
555 }
556
SetBarState(OHOS::Ace::DisplayMode value)557 void TextFieldModelNG::SetBarState(OHOS::Ace::DisplayMode value)
558 {
559 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, DisplayMode, value);
560 }
561
SetMaxViewLines(uint32_t value)562 void TextFieldModelNG::SetMaxViewLines(uint32_t value)
563 {
564 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxViewLines, value);
565 }
566
SetBackgroundColor(const Color & color,bool tmp)567 void TextFieldModelNG::SetBackgroundColor(const Color& color, bool tmp)
568 {
569 Color backgroundColor;
570 if (tmp) {
571 auto pipeline = PipelineBase::GetCurrentContext();
572 CHECK_NULL_VOID(pipeline);
573 auto themeManager = pipeline->GetThemeManager();
574 CHECK_NULL_VOID(themeManager);
575 auto theme = themeManager->GetTheme<TextFieldTheme>();
576 CHECK_NULL_VOID(theme);
577 backgroundColor = theme->GetBgColor();
578 return;
579 }
580
581 NG::ViewAbstract::SetBackgroundColor(color);
582 ACE_UPDATE_PAINT_PROPERTY(TextFieldPaintProperty, BackgroundColor, color);
583 }
584
SetHeight(const Dimension & value)585 void TextFieldModelNG::SetHeight(const Dimension& value) {}
586
SetPadding(NG::PaddingProperty & newPadding,Edge oldPadding,bool tmp)587 void TextFieldModelNG::SetPadding(NG::PaddingProperty& newPadding, Edge oldPadding, bool tmp)
588 {
589 if (tmp) {
590 auto pipeline = PipelineBase::GetCurrentContext();
591 CHECK_NULL_VOID(pipeline);
592 auto theme = pipeline->GetThemeManager()->GetTheme<TextFieldTheme>();
593 CHECK_NULL_VOID(theme);
594 auto textFieldPadding = theme->GetPadding();
595 auto top = textFieldPadding.Top();
596 auto bottom = textFieldPadding.Bottom();
597 auto left = textFieldPadding.Left();
598 auto right = textFieldPadding.Right();
599
600 NG::PaddingProperty paddings;
601 if (top.Value()) {
602 if (top.Unit() == DimensionUnit::CALC) {
603 paddings.top = NG::CalcLength(top.IsNonNegative() ? top.CalcValue() : CalcDimension().CalcValue());
604 } else {
605 paddings.top = NG::CalcLength(top.IsNonNegative() ? top : CalcDimension());
606 }
607 }
608 if (bottom.Value()) {
609 if (bottom.Unit() == DimensionUnit::CALC) {
610 paddings.bottom =
611 NG::CalcLength(bottom.IsNonNegative() ? bottom.CalcValue() : CalcDimension().CalcValue());
612 } else {
613 paddings.bottom = NG::CalcLength(bottom.IsNonNegative() ? bottom : CalcDimension());
614 }
615 }
616 if (left.Value()) {
617 if (left.Unit() == DimensionUnit::CALC) {
618 paddings.left = NG::CalcLength(left.IsNonNegative() ? left.CalcValue() : CalcDimension().CalcValue());
619 } else {
620 paddings.left = NG::CalcLength(left.IsNonNegative() ? left : CalcDimension());
621 }
622 }
623 if (right.Value()) {
624 if (right.Unit() == DimensionUnit::CALC) {
625 paddings.right =
626 NG::CalcLength(right.IsNonNegative() ? right.CalcValue() : CalcDimension().CalcValue());
627 } else {
628 paddings.right = NG::CalcLength(right.IsNonNegative() ? right : CalcDimension());
629 }
630 }
631 ViewAbstract::SetPadding(paddings);
632 return;
633 }
634 NG::ViewAbstract::SetPadding(newPadding);
635 }
636
SetHoverEffect(HoverEffectType hoverEffect)637 void TextFieldModelNG::SetHoverEffect(HoverEffectType hoverEffect)
638 {
639 NG::ViewAbstract::SetHoverEffect(hoverEffect);
640 }
641
SetOnChangeEvent(std::function<void (const std::string &)> && func)642 void TextFieldModelNG::SetOnChangeEvent(std::function<void(const std::string&)>&& func)
643 {
644 auto eventHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeEventHub<TextFieldEventHub>();
645 CHECK_NULL_VOID(eventHub);
646 eventHub->SetOnChangeEvent(std::move(func));
647 }
648
SetSelectionMenuHidden(bool selectionMenuHidden)649 void TextFieldModelNG::SetSelectionMenuHidden(bool selectionMenuHidden)
650 {
651 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SelectionMenuHidden, selectionMenuHidden);
652 }
653
SetCustomKeyboard(const std::function<void ()> && buildFunc)654 void TextFieldModelNG::SetCustomKeyboard(const std::function<void()>&& buildFunc)
655 {
656 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
657 CHECK_NULL_VOID(frameNode);
658 auto pattern = frameNode->GetPattern<TextFieldPattern>();
659 if (pattern) {
660 pattern->SetCustomKeyboard(std::move(buildFunc));
661 }
662 }
663
SetPasswordRules(const std::string & passwordRules)664 void TextFieldModelNG::SetPasswordRules(const std::string& passwordRules)
665 {
666 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PasswordRules, passwordRules);
667 }
668
SetEnableAutoFill(bool enableAutoFill)669 void TextFieldModelNG::SetEnableAutoFill(bool enableAutoFill)
670 {
671 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, EnableAutoFill, enableAutoFill);
672 }
673
SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle)674 void TextFieldModelNG::SetCleanNodeStyle(CleanNodeStyle cleanNodeStyle)
675 {
676 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, CleanNodeStyle, cleanNodeStyle);
677 }
678
SetCancelIconSize(const CalcDimension & iconSize)679 void TextFieldModelNG::SetCancelIconSize(const CalcDimension& iconSize)
680 {
681 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, IconSize, iconSize);
682 }
683
SetCanacelIconSrc(const std::string & iconSrc)684 void TextFieldModelNG::SetCanacelIconSrc(const std::string& iconSrc)
685 {
686 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, IconSrc, iconSrc);
687 }
688
SetCancelIconColor(const Color & iconColor)689 void TextFieldModelNG::SetCancelIconColor(const Color& iconColor)
690 {
691 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, IconColor, iconColor);
692 }
693
SetIsShowCancelButton(bool isShowCancelButton)694 void TextFieldModelNG::SetIsShowCancelButton(bool isShowCancelButton)
695 {
696 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, IsShowCancelButton, isShowCancelButton);
697 }
698
SetSelectAllValue(bool isSelectAllValue)699 void TextFieldModelNG::SetSelectAllValue(bool isSelectAllValue)
700 {
701 ACE_UPDATE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SelectAllValue, isSelectAllValue);
702 }
703
SetInputStyle(FrameNode * frameNode,InputStyle value)704 void TextFieldModelNG::SetInputStyle(FrameNode* frameNode, InputStyle value)
705 {
706 ACE_UPDATE_NODE_PAINT_PROPERTY(TextFieldPaintProperty, InputStyle, value, frameNode);
707 }
708
RequestKeyboardOnFocus(FrameNode * frameNode,bool needToRequest)709 void TextFieldModelNG::RequestKeyboardOnFocus(FrameNode* frameNode, bool needToRequest)
710 {
711 CHECK_NULL_VOID(frameNode);
712 auto pattern = frameNode->GetPattern<TextFieldPattern>();
713 pattern->SetNeedToRequestKeyboardOnFocus(needToRequest);
714 }
715
SetBarState(FrameNode * frameNode,OHOS::Ace::DisplayMode value)716 void TextFieldModelNG::SetBarState(FrameNode* frameNode, OHOS::Ace::DisplayMode value)
717 {
718 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, DisplayMode, value, frameNode);
719 }
720
SetPasswordIcon(FrameNode * frameNode,const PasswordIcon & passwordIcon)721 void TextFieldModelNG::SetPasswordIcon(FrameNode* frameNode, const PasswordIcon& passwordIcon)
722 {
723 CHECK_NULL_VOID(frameNode);
724 auto pattern = frameNode->GetPattern<TextFieldPattern>();
725 CHECK_NULL_VOID(pattern);
726 if (passwordIcon.showResult != "") {
727 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowPasswordSourceInfo,
728 ImageSourceInfo(passwordIcon.showResult,
729 passwordIcon.showBundleName, passwordIcon.showModuleName), frameNode);
730 }
731 if (passwordIcon.hideResult != "") {
732 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, HidePasswordSourceInfo,
733 ImageSourceInfo(passwordIcon.hideResult,
734 passwordIcon.hideBundleName, passwordIcon.hideModuleName), frameNode);
735 }
736 }
737
SetSelectedBackgroundColor(FrameNode * frameNode,const Color & value)738 void TextFieldModelNG::SetSelectedBackgroundColor(FrameNode* frameNode, const Color& value)
739 {
740 ACE_UPDATE_NODE_PAINT_PROPERTY(TextFieldPaintProperty, SelectedBackgroundColor, value, frameNode);
741 }
742
SetMaxViewLines(FrameNode * frameNode,uint32_t value)743 void TextFieldModelNG::SetMaxViewLines(FrameNode* frameNode, uint32_t value)
744 {
745 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxViewLines, value, frameNode);
746 }
747
SetType(FrameNode * frameNode,TextInputType value)748 void TextFieldModelNG::SetType(FrameNode* frameNode, TextInputType value)
749 {
750 CHECK_NULL_VOID(frameNode);
751 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
752 if (layoutProperty->HasTextInputType() && layoutProperty->GetTextInputTypeValue() != value) {
753 layoutProperty->UpdateTypeChanged(true);
754 }
755 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextInputType, value, frameNode);
756 }
757
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)758 void TextFieldModelNG::SetCopyOption(FrameNode* frameNode, CopyOptions copyOption)
759 {
760 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, CopyOptions, copyOption, frameNode);
761 }
762
SetShowPasswordIcon(FrameNode * frameNode,bool value)763 void TextFieldModelNG::SetShowPasswordIcon(FrameNode* frameNode, bool value)
764 {
765 CHECK_NULL_VOID(frameNode);
766 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
767 CHECK_NULL_VOID(layoutProperty);
768 auto pattern = frameNode->GetPattern<TextFieldPattern>();
769 CHECK_NULL_VOID(pattern);
770 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowPasswordIcon, value, frameNode);
771 }
772
SetTextAlign(FrameNode * frameNode,TextAlign value)773 void TextFieldModelNG::SetTextAlign(FrameNode* frameNode, TextAlign value)
774 {
775 CHECK_NULL_VOID(frameNode);
776 auto pattern = frameNode->GetPattern<TextFieldPattern>();
777 CHECK_NULL_VOID(pattern);
778 TextAlign newValue = value;
779 if (!pattern->IsTextArea() && newValue == TextAlign::JUSTIFY) {
780 newValue = TextAlign::START;
781 }
782 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
783 if (layoutProperty->GetTextAlignValue(TextAlign::START) != newValue) {
784 layoutProperty->UpdateTextAlignChanged(true);
785 }
786 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextAlign, newValue, frameNode);
787 }
788
SetTextColor(FrameNode * frameNode,const Color & value)789 void TextFieldModelNG::SetTextColor(FrameNode* frameNode, const Color& value)
790 {
791 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, TextColor, value, frameNode);
792 ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, value, frameNode);
793 ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColorStrategy, frameNode);
794 ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColorFlag, true, frameNode);
795 }
796
SetCaretPosition(FrameNode * frameNode,const int32_t & value)797 void TextFieldModelNG::SetCaretPosition(FrameNode* frameNode, const int32_t& value)
798 {
799 CHECK_NULL_VOID(frameNode);
800 auto pattern = frameNode->GetPattern<TextFieldPattern>();
801 pattern->SetCaretPosition(value);
802 }
803
SetFontStyle(FrameNode * frameNode,Ace::FontStyle value)804 void TextFieldModelNG::SetFontStyle(FrameNode* frameNode, Ace::FontStyle value)
805 {
806 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ItalicFontStyle, value, frameNode);
807 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true, frameNode);
808 }
809
SetMaxLength(FrameNode * frameNode,uint32_t value)810 void TextFieldModelNG::SetMaxLength(FrameNode* frameNode, uint32_t value)
811 {
812 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxLength, value, frameNode);
813 }
814
ResetMaxLength(FrameNode * frameNode)815 void TextFieldModelNG::ResetMaxLength(FrameNode* frameNode)
816 {
817 CHECK_NULL_VOID(frameNode);
818 auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
819 if (textFieldLayoutProperty) {
820 textFieldLayoutProperty->ResetMaxLength();
821 }
822 }
823
SetCaretStyle(FrameNode * frameNode,const CaretStyle & value)824 void TextFieldModelNG::SetCaretStyle(FrameNode* frameNode, const CaretStyle& value)
825 {
826 if (value.caretWidth.has_value()) {
827 ACE_UPDATE_NODE_PAINT_PROPERTY(TextFieldPaintProperty, CursorWidth, value.caretWidth.value(), frameNode);
828 }
829 }
830
SetPlaceholderColor(FrameNode * frameNode,const Color & value)831 void TextFieldModelNG::SetPlaceholderColor(FrameNode* frameNode, const Color& value)
832 {
833 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PlaceholderTextColor, value, frameNode);
834 }
835
SetFontWeight(FrameNode * frameNode,FontWeight value)836 void TextFieldModelNG::SetFontWeight(FrameNode* frameNode, FontWeight value)
837 {
838 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontWeight, value, frameNode);
839 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true, frameNode);
840 }
841
SetShowUnderline(FrameNode * frameNode,bool showUnderLine)842 void TextFieldModelNG::SetShowUnderline(FrameNode* frameNode, bool showUnderLine)
843 {
844 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowUnderline, showUnderLine, frameNode);
845 }
846
SetEnterKeyType(FrameNode * frameNode,TextInputAction value)847 void TextFieldModelNG::SetEnterKeyType(FrameNode* frameNode, TextInputAction value)
848 {
849 auto pattern = AceType::DynamicCast<TextFieldPattern>(frameNode->GetPattern());
850 CHECK_NULL_VOID(pattern);
851 pattern->UpdateTextInputAction(value);
852 }
853
SetFontFamily(FrameNode * frameNode,const std::vector<std::string> & value)854 void TextFieldModelNG::SetFontFamily(FrameNode* frameNode, const std::vector<std::string>& value)
855 {
856 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontFamily, value, frameNode);
857 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true, frameNode);
858 }
859
SetMaxLines(FrameNode * frameNode,uint32_t value)860 void TextFieldModelNG::SetMaxLines(FrameNode* frameNode, uint32_t value)
861 {
862 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, MaxLines, value, frameNode);
863 }
864
SetPlaceholderFont(FrameNode * frameNode,const Font & value)865 void TextFieldModelNG::SetPlaceholderFont(FrameNode* frameNode, const Font& value)
866 {
867 if (value.fontSize.has_value()) {
868 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty,
869 PlaceholderFontSize, value.fontSize.value(), frameNode);
870 }
871 if (value.fontStyle) {
872 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty,
873 PlaceholderItalicFontStyle, value.fontStyle.value(), frameNode);
874 }
875 if (value.fontWeight) {
876 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty,
877 PlaceholderFontWeight, value.fontWeight.value(), frameNode);
878 }
879 if (!value.fontFamilies.empty()) {
880 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty,
881 PlaceholderFontFamily, value.fontFamilies, frameNode);
882 }
883 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty,
884 PreferredPlaceholderLineHeightNeedToUpdate, true, frameNode);
885 }
886
SetFontSize(FrameNode * frameNode,const Dimension & value)887 void TextFieldModelNG::SetFontSize(FrameNode* frameNode, const Dimension& value)
888 {
889 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, FontSize, value, frameNode);
890 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, PreferredTextLineHeightNeedToUpdate, true, frameNode);
891 }
892
SetCaretColor(FrameNode * frameNode,const Color & value)893 void TextFieldModelNG::SetCaretColor(FrameNode* frameNode, const Color& value)
894 {
895 ACE_UPDATE_NODE_PAINT_PROPERTY(TextFieldPaintProperty, CursorColor, value, frameNode);
896 }
897
SetSelectionMenuHidden(FrameNode * frameNode,bool selectionMenuHidden)898 void TextFieldModelNG::SetSelectionMenuHidden(FrameNode* frameNode, bool selectionMenuHidden)
899 {
900 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SelectionMenuHidden, selectionMenuHidden, frameNode);
901 }
902
SetShowCounter(FrameNode * frameNode,bool value)903 void TextFieldModelNG::SetShowCounter(FrameNode* frameNode, bool value)
904 {
905 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowCounter, value, frameNode);
906 auto pattern = frameNode->GetPattern<TextFieldPattern>();
907 CHECK_NULL_VOID(pattern);
908 if (value) {
909 pattern->AddCounterNode();
910 } else {
911 pattern->CleanCounterNode();
912 }
913 }
914
SetShowError(FrameNode * frameNode,const std::string & errorText,bool visible)915 void TextFieldModelNG::SetShowError(FrameNode* frameNode, const std::string& errorText, bool visible)
916 {
917 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ErrorText, errorText, frameNode);
918 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowErrorText, visible, frameNode);
919 }
920
SetCounterType(FrameNode * frameNode,int32_t value)921 void TextFieldModelNG::SetCounterType(FrameNode* frameNode, int32_t value)
922 {
923 CHECK_NULL_VOID(frameNode);
924 auto layoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
925 CHECK_NULL_VOID(layoutProperty);
926 ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SetCounter, value, frameNode);
927 }
928
SetOnChange(FrameNode * frameNode,std::function<void (const std::string &)> && func)929 void TextFieldModelNG::SetOnChange(FrameNode* frameNode, std::function<void(const std::string&)>&& func)
930 {
931 CHECK_NULL_VOID(frameNode);
932 auto eventHub = frameNode->GetEventHub<TextFieldEventHub>();
933 CHECK_NULL_VOID(eventHub);
934 eventHub->SetOnChange(std::move(func));
935 }
936
SetTextFieldText(FrameNode * frameNode,const std::string & value)937 void TextFieldModelNG::SetTextFieldText(FrameNode* frameNode, const std::string& value)
938 {
939 CHECK_NULL_VOID(frameNode);
940 auto pattern = frameNode->GetPattern<TextFieldPattern>();
941 auto textValue = pattern->GetTextValue();
942 if (value != textValue) {
943 pattern->InitEditingValueText(value);
944 }
945 }
946
SetTextFieldPlaceHolder(FrameNode * frameNode,const std::string & placeholder)947 void TextFieldModelNG::SetTextFieldPlaceHolder(FrameNode* frameNode, const std::string& placeholder)
948 {
949 CHECK_NULL_VOID(frameNode);
950 auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
951 textFieldLayoutProperty->UpdatePlaceholder(placeholder);
952 }
953
StopTextFieldEditing(FrameNode * frameNode)954 void TextFieldModelNG::StopTextFieldEditing(FrameNode* frameNode)
955 {
956 CHECK_NULL_VOID(frameNode);
957 auto pattern = frameNode->GetPattern<TextFieldPattern>();
958 if (pattern) {
959 pattern->StopEditing();
960 }
961 }
962
SetOnSubmit(FrameNode * frameNode,std::function<void (int32_t,NG::TextFieldCommonEvent &)> && func)963 void TextFieldModelNG::SetOnSubmit(FrameNode* frameNode, std::function<void(int32_t, NG::TextFieldCommonEvent&)>&& func)
964 {
965 CHECK_NULL_VOID(frameNode);
966 auto eventHub = frameNode->GetEventHub<TextFieldEventHub>();
967 CHECK_NULL_VOID(eventHub);
968 eventHub->SetOnSubmit(std::move(func));
969 }
970 } // namespace OHOS::Ace::NG
971