• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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