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/search/search_model_ng.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/common/udmf/udmf_client.h"
20 #include "core/components/common/properties/color.h"
21 #include "core/components/search/search_theme.h"
22 #include "core/components/theme/icon_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/base/view_abstract.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/button/button_pattern.h"
27 #include "core/components_ng/pattern/image/image_pattern.h"
28 #include "core/components_ng/pattern/search/search_pattern.h"
29 #include "core/components_ng/pattern/search/search_text_field.h"
30 #include "core/components_ng/pattern/text/text_pattern.h"
31 #include "core/components_ng/pattern/text_field/text_field_event_hub.h"
32 #include "core/components_ng/pattern/text_field/text_field_pattern.h"
33 #include "core/components_v2/inspector/inspector_constants.h"
34 #include "core/components_ng/pattern/divider/divider_pattern.h"
35 #include "core/components_ng/pattern/divider/divider_layout_property.h"
36 #include "core/components_ng/pattern/divider/divider_render_property.h"
37 
38 namespace OHOS::Ace::NG {
39 namespace {
40 constexpr int32_t TEXTFIELD_INDEX = 0;
41 constexpr int32_t IMAGE_INDEX = 1;
42 constexpr int32_t CANCEL_IMAGE_INDEX = 2;
43 constexpr int32_t CANCEL_BUTTON_INDEX = 3;
44 constexpr int32_t BUTTON_INDEX = 4;
45 constexpr int32_t DIVIDER_INDEX = 5;
46 constexpr float MAX_FONT_SCALE = 2.0f;
47 const std::string DROP_TYPE_STYLED_STRING = "ApplicationDefinedType";
48 constexpr Dimension ICON_HEIGHT = 16.0_vp;
49 const std::string INSPECTOR_PREFIX = "__SearchField__";
50 const std::vector<std::string> SPECICALIZED_INSPECTOR_INDEXS = { "", "Image__", "CancelImage__", "CancelButton__",
51     "Button__", "Divider__" };
52 
UpdateInnerInspector(FrameNode * frameNode,const std::string & key)53 void UpdateInnerInspector(FrameNode* frameNode, const std::string& key)
54 {
55     auto updateInspectorCallback = [id = key](FrameNode* parentNode, int32_t index) {
56         auto currentNode = AceType::DynamicCast<FrameNode>(parentNode->GetChildAtIndex(index));
57         if (currentNode) {
58             auto test = INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + id;
59             currentNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[index] + id);
60         }
61     };
62     updateInspectorCallback(frameNode, TEXTFIELD_INDEX);
63     updateInspectorCallback(frameNode, IMAGE_INDEX);
64     updateInspectorCallback(frameNode, CANCEL_IMAGE_INDEX);
65     updateInspectorCallback(frameNode, CANCEL_BUTTON_INDEX);
66     updateInspectorCallback(frameNode, BUTTON_INDEX);
67     updateInspectorCallback(frameNode, DIVIDER_INDEX);
68 }
69 } // namespace
70 
Create(const std::optional<std::string> & value,const std::optional<std::string> & placeholder,const std::optional<std::string> & icon)71 RefPtr<TextFieldControllerBase> SearchModelNG::Create(const std::optional<std::string>& value,
72     const std::optional<std::string>& placeholder, const std::optional<std::string>& icon)
73 {
74     auto* stack = ViewStackProcessor::GetInstance();
75     int32_t nodeId = stack->ClaimNodeId();
76     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::SEARCH_ETS_TAG, nodeId);
77     auto searchNode = CreateSearchNode(nodeId, value, placeholder, icon);
78     ViewStackProcessor::GetInstance()->Push(searchNode);
79     auto pattern = searchNode->GetPattern<SearchPattern>();
80 
81     return pattern->GetSearchController();
82 }
83 
CreateSearchNode(int32_t nodeId,const std::optional<std::string> & value,const std::optional<std::string> & placeholder,const std::optional<std::string> & icon)84 RefPtr<SearchNode> SearchModelNG::CreateSearchNode(int32_t nodeId, const std::optional<std::string>& value,
85     const std::optional<std::string>& placeholder, const std::optional<std::string>& icon)
86 {
87     auto frameNode =
88         GetOrCreateSearchNode(V2::SEARCH_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SearchPattern>(); });
89 
90     auto pattern = frameNode->GetPattern<SearchPattern>();
91     pattern->SetSearchNode(frameNode);
92 
93     bool hasTextFieldNode = frameNode->HasTextFieldNode();
94     bool hasButtonNode = frameNode->HasButtonNode();
95     bool hasCancelButtonNode = frameNode->HasCancelButtonNode();
96     bool hasDividerNode = frameNode->HasDividerNode();
97 
98     CreateTextField(frameNode, placeholder, value, hasTextFieldNode);
99 
100     std::string src;
101     if (icon.has_value()) {
102         src = icon.value();
103     }
104     pattern->InitIconColorSize();
105     pattern->CreateSearchIcon(src);
106     pattern->CreateCancelIcon();
107     CreateCancelButton(frameNode, hasCancelButtonNode);
108     CreateButton(frameNode, hasButtonNode);
109     CreateDivider(frameNode, hasDividerNode);
110 
111     // Set search background
112     auto renderContext = frameNode->GetRenderContext();
113     CHECK_NULL_RETURN(renderContext, frameNode);
114     auto context = frameNode->GetContext();
115     CHECK_NULL_RETURN(context, frameNode);
116     auto textFieldTheme = context->GetTheme<TextFieldTheme>();
117     CHECK_NULL_RETURN(textFieldTheme, frameNode);
118     auto radius = textFieldTheme->GetBorderRadius();
119     BorderRadiusProperty borderRadius { radius.GetX(), radius.GetY(), radius.GetY(), radius.GetX() };
120     renderContext->UpdateBorderRadius(borderRadius);
121 
122     auto textFieldFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(TEXTFIELD_INDEX));
123     CHECK_NULL_RETURN(textFieldFrameNode, frameNode);
124     auto textFieldPattern = textFieldFrameNode->GetPattern<TextFieldPattern>();
125     CHECK_NULL_RETURN(textFieldPattern, frameNode);
126     pattern->SetSearchController(textFieldPattern->GetTextFieldController());
127     pattern->UpdateChangeEvent(textFieldPattern->GetTextValue());
128     return frameNode;
129 }
130 
SetDragPreviewOptions(const NG::DragPreviewOption option)131 void SearchModelNG::SetDragPreviewOptions(const NG::DragPreviewOption option)
132 {
133     auto searchTextField = GetSearchTextFieldFrameNode();
134     CHECK_NULL_VOID(searchTextField);
135     searchTextField->SetDragPreviewOptions(option);
136 }
137 
SetCaretWidth(const Dimension & value)138 void SearchModelNG::SetCaretWidth(const Dimension& value)
139 {
140     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
141     CHECK_NULL_VOID(frameNode);
142     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(TEXTFIELD_INDEX));
143     CHECK_NULL_VOID(textFrameNode);
144     auto textPaintProperty = textFrameNode->GetPaintProperty<TextFieldPaintProperty>();
145     CHECK_NULL_VOID(textPaintProperty);
146     textPaintProperty->UpdateCursorWidth(value);
147     textFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
148 }
149 
SetCaretColor(const Color & color)150 void SearchModelNG::SetCaretColor(const Color& color)
151 {
152     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
153     CHECK_NULL_VOID(frameNode);
154     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(TEXTFIELD_INDEX));
155     CHECK_NULL_VOID(textFrameNode);
156     auto textPaintProperty = textFrameNode->GetPaintProperty<TextFieldPaintProperty>();
157     CHECK_NULL_VOID(textPaintProperty);
158     textPaintProperty->UpdateCursorColor(color);
159     textFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
160 }
161 
SetSearchButton(const std::string & text)162 void SearchModelNG::SetSearchButton(const std::string& text)
163 {
164     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
165     CHECK_NULL_VOID(frameNode);
166     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
167     CHECK_NULL_VOID(buttonFrameNode);
168 
169     auto searchButtonRenderContext = buttonFrameNode->GetRenderContext();
170     CHECK_NULL_VOID(searchButtonRenderContext);
171 
172     auto searchButtonEvent = buttonFrameNode->GetEventHub<ButtonEventHub>();
173     CHECK_NULL_VOID(searchButtonEvent);
174 
175     if (!text.empty()) {
176         searchButtonEvent->SetEnabled(true);
177         searchButtonRenderContext->UpdateOpacity(1.0);
178         ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchButton, text);
179     } else {
180         searchButtonEvent->SetEnabled(false);
181         searchButtonRenderContext->UpdateOpacity(0.0);
182     }
183 
184     buttonFrameNode->MarkModifyDone();
185     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
186 }
187 
SetSearchIconSize(const Dimension & value)188 void SearchModelNG::SetSearchIconSize(const Dimension& value)
189 {
190     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
191     CHECK_NULL_VOID(pattern);
192     pattern->SetSearchIconSize(value);
193     ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchIconUDSize, value);
194 }
195 
SetSearchIconColor(const Color & color)196 void SearchModelNG::SetSearchIconColor(const Color& color)
197 {
198     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
199     CHECK_NULL_VOID(pattern);
200     pattern->SetSearchIconColor(color);
201 }
202 
SetSearchSrcPath(const std::string & src,const std::string & bundleName,const std::string & moduleName)203 void SearchModelNG::SetSearchSrcPath(
204     const std::string& src, const std::string& bundleName, const std::string& moduleName)
205 {
206     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
207     CHECK_NULL_VOID(pattern);
208     pattern->SetSearchSrcPath(src, bundleName, moduleName);
209 }
210 
SetSearchDefaultIcon()211 void SearchModelNG::SetSearchDefaultIcon()
212 {
213     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
214     CHECK_NULL_VOID(pattern);
215     pattern->InitSearchIconColorSize();
216     pattern->CreateSearchIcon("");
217 }
218 
SetSearchImageIcon(IconOptions & iconOptions)219 void SearchModelNG::SetSearchImageIcon(IconOptions &iconOptions)
220 {
221     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
222     CHECK_NULL_VOID(pattern);
223     pattern->SetSearchImageIcon(iconOptions);
224     ACE_UPDATE_LAYOUT_PROPERTY(
225         SearchLayoutProperty, SearchIconUDSize, pattern->ConvertImageIconSizeValue(iconOptions.GetSize().value()));
226 }
227 
SetSearchSymbolIcon(std::function<void (WeakPtr<NG::FrameNode>)> iconSymbol)228 void SearchModelNG::SetSearchSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol)
229 {
230     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
231     CHECK_NULL_VOID(frameNode);
232     auto layoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
233     CHECK_NULL_VOID(layoutProperty);
234     layoutProperty->SetSearchIconSymbol(iconSymbol);
235     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
236     CHECK_NULL_VOID(pattern);
237     pattern->SetSearchSymbolIcon();
238 }
239 
SetRightIconSrcPath(const std::string & src)240 void SearchModelNG::SetRightIconSrcPath(const std::string& src)
241 {
242     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
243     CHECK_NULL_VOID(pattern);
244     pattern->SetRightIconSrcPath(src);
245 }
246 
SetCancelButtonStyle(CancelButtonStyle style)247 void SearchModelNG::SetCancelButtonStyle(CancelButtonStyle style)
248 {
249     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
250     CHECK_NULL_VOID(pattern);
251     pattern->SetCancelButtonStyle(style);
252     ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonStyle, style);
253 }
254 
SetCancelIconSize(const Dimension & value)255 void SearchModelNG::SetCancelIconSize(const Dimension& value)
256 {
257     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
258     CHECK_NULL_VOID(pattern);
259     pattern->SetCancelIconSize(value);
260     ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonUDSize, value);
261 }
262 
SetCancelIconColor(const Color & color)263 void SearchModelNG::SetCancelIconColor(const Color& color)
264 {
265     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
266     CHECK_NULL_VOID(pattern);
267     pattern->SetCancelIconColor(color);
268 }
269 
SetCancelDefaultIcon()270 void SearchModelNG::SetCancelDefaultIcon()
271 {
272     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
273     CHECK_NULL_VOID(pattern);
274     pattern->InitCancelIconColorSize();
275     pattern->CreateCancelIcon();
276 }
277 
SetCancelImageIcon(IconOptions & iconOptions)278 void SearchModelNG::SetCancelImageIcon(IconOptions &iconOptions)
279 {
280     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
281     CHECK_NULL_VOID(pattern);
282     pattern->SetCancelImageIcon(iconOptions);
283     ACE_UPDATE_LAYOUT_PROPERTY(
284         SearchLayoutProperty, CancelButtonUDSize, pattern->ConvertImageIconSizeValue(iconOptions.GetSize().value()));
285 }
286 
SetCancelSymbolIcon(std::function<void (WeakPtr<NG::FrameNode>)> iconSymbol)287 void SearchModelNG::SetCancelSymbolIcon(std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol)
288 {
289     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
290     CHECK_NULL_VOID(frameNode);
291     auto layoutProperty = frameNode->GetLayoutProperty<SearchLayoutProperty>();
292     CHECK_NULL_VOID(layoutProperty);
293     layoutProperty->SetCancelIconSymbol(iconSymbol);
294     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>();
295     CHECK_NULL_VOID(pattern);
296     pattern->SetCancelSymbolIcon();
297 }
298 
SetSearchButtonFontSize(const Dimension & value)299 void SearchModelNG::SetSearchButtonFontSize(const Dimension& value)
300 {
301     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
302     CHECK_NULL_VOID(frameNode);
303     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
304     CHECK_NULL_VOID(buttonFrameNode);
305     auto buttonLayoutProperty = buttonFrameNode->GetLayoutProperty<ButtonLayoutProperty>();
306     CHECK_NULL_VOID(buttonLayoutProperty);
307 
308     buttonLayoutProperty->UpdateFontSize(value);
309     buttonFrameNode->MarkModifyDone();
310     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
311 
312     ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchButtonFontSize, value);
313 }
314 
SetSearchButtonFontColor(const Color & color)315 void SearchModelNG::SetSearchButtonFontColor(const Color& color)
316 {
317     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
318     CHECK_NULL_VOID(frameNode);
319     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
320     CHECK_NULL_VOID(buttonFrameNode);
321     auto buttonLayoutProperty = buttonFrameNode->GetLayoutProperty<ButtonLayoutProperty>();
322     CHECK_NULL_VOID(buttonLayoutProperty);
323 
324     buttonLayoutProperty->UpdateFontColor(color);
325     buttonFrameNode->MarkModifyDone();
326     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
327 }
328 
SetPlaceholderColor(const Color & color)329 void SearchModelNG::SetPlaceholderColor(const Color& color)
330 {
331     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
332     CHECK_NULL_VOID(frameNode);
333     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
334     CHECK_NULL_VOID(textFieldChild);
335     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
336     CHECK_NULL_VOID(textFieldLayoutProperty);
337     textFieldLayoutProperty->UpdatePlaceholderTextColor(color);
338     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
339 }
340 
SetPlaceholderFont(const Font & font)341 void SearchModelNG::SetPlaceholderFont(const Font& font)
342 {
343     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
344     CHECK_NULL_VOID(frameNode);
345     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
346     CHECK_NULL_VOID(textFieldChild);
347     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
348     CHECK_NULL_VOID(textFieldLayoutProperty);
349     if (font.fontSize) {
350         textFieldLayoutProperty->UpdatePlaceholderFontSize(font.fontSize.value());
351     }
352     if (font.fontStyle) {
353         textFieldLayoutProperty->UpdatePlaceholderItalicFontStyle(font.fontStyle.value());
354     }
355     if (font.fontWeight) {
356         textFieldLayoutProperty->UpdatePlaceholderFontWeight(font.fontWeight.value());
357     }
358     if (!font.fontFamilies.empty()) {
359         textFieldLayoutProperty->UpdatePlaceholderFontFamily(font.fontFamilies);
360     }
361     textFieldLayoutProperty->UpdatePreferredPlaceholderLineHeightNeedToUpdate(true);
362     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
363 }
364 
SetSelectedBackgroundColor(const Color & value)365 void SearchModelNG::SetSelectedBackgroundColor(const Color& value)
366 {
367     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
368     CHECK_NULL_VOID(frameNode);
369     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
370     CHECK_NULL_VOID(textFieldChild);
371     auto textFieldPaintProperty = textFieldChild->GetPaintProperty<TextFieldPaintProperty>();
372     CHECK_NULL_VOID(textFieldPaintProperty);
373     textFieldPaintProperty->UpdateSelectedBackgroundColor(value);
374     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
375 }
376 
SetTextFont(const Font & font)377 void SearchModelNG::SetTextFont(const Font& font)
378 {
379     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
380     CHECK_NULL_VOID(frameNode);
381     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
382     CHECK_NULL_VOID(textFieldChild);
383     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
384     CHECK_NULL_VOID(textFieldLayoutProperty);
385     if (font.fontSize) {
386         textFieldLayoutProperty->UpdateFontSize(font.fontSize.value());
387     }
388     if (font.fontStyle) {
389         textFieldLayoutProperty->UpdateItalicFontStyle(font.fontStyle.value());
390     }
391     if (font.fontWeight) {
392         textFieldLayoutProperty->UpdateFontWeight(font.fontWeight.value());
393     }
394     if (!font.fontFamilies.empty()) {
395         textFieldLayoutProperty->UpdateFontFamily(font.fontFamilies);
396     }
397     textFieldLayoutProperty->UpdatePreferredTextLineHeightNeedToUpdate(true);
398     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
399 }
400 
SetTextColor(const Color & color)401 void SearchModelNG::SetTextColor(const Color& color)
402 {
403     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
404     CHECK_NULL_VOID(frameNode);
405     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
406     CHECK_NULL_VOID(textFieldChild);
407     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
408     CHECK_NULL_VOID(textFieldLayoutProperty);
409 
410     textFieldLayoutProperty->UpdateTextColor(color);
411     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
412 }
413 
SetInputFilter(FrameNode * frameNode,const std::string & value,const std::function<void (const std::string &)> & onError)414 void SearchModelNG::SetInputFilter(
415     FrameNode* frameNode, const std::string& value, const std::function<void(const std::string&)>& onError)
416 {
417     CHECK_NULL_VOID(frameNode);
418     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
419     CHECK_NULL_VOID(textFieldChild);
420     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
421     CHECK_NULL_VOID(textFieldLayoutProperty);
422     textFieldLayoutProperty->UpdateInputFilter(value);
423     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
424 
425     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
426     CHECK_NULL_VOID(textFieldEventHub);
427     textFieldEventHub->SetOnInputFilterError(onError);
428 }
SetInputFilter(const std::string & value,const std::function<void (const std::string &)> & onError)429 void SearchModelNG::SetInputFilter(const std::string& value, const std::function<void(const std::string&)>& onError)
430 {
431     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
432     CHECK_NULL_VOID(frameNode);
433     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
434     CHECK_NULL_VOID(textFieldChild);
435     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
436     CHECK_NULL_VOID(textFieldLayoutProperty);
437     textFieldLayoutProperty->UpdateInputFilter(value);
438     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
439 
440     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
441     CHECK_NULL_VOID(textFieldEventHub);
442     textFieldEventHub->SetOnInputFilterError(onError);
443 }
444 
SetOnEditChanged(std::function<void (bool)> && func)445 void SearchModelNG::SetOnEditChanged(std::function<void(bool)>&& func)
446 {
447     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
448     CHECK_NULL_VOID(frameNode);
449     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
450     CHECK_NULL_VOID(textFieldChild);
451     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
452     CHECK_NULL_VOID(textFieldEventHub);
453     textFieldEventHub->SetOnEditChanged(std::move(func));
454 }
455 
SetTextIndent(const Dimension & value)456 void SearchModelNG::SetTextIndent(const Dimension& value)
457 {
458     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
459     CHECK_NULL_VOID(frameNode);
460     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
461     CHECK_NULL_VOID(textFieldChild);
462     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
463     CHECK_NULL_VOID(textFieldLayoutProperty);
464     textFieldLayoutProperty->UpdateTextIndent(value);
465     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
466 }
467 
SetTextIndent(FrameNode * frameNode,const Dimension & value)468 void SearchModelNG::SetTextIndent(FrameNode* frameNode, const Dimension& value)
469 {
470     CHECK_NULL_VOID(frameNode);
471     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
472     CHECK_NULL_VOID(textFieldChild);
473     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
474     CHECK_NULL_VOID(textFieldLayoutProperty);
475     textFieldLayoutProperty->UpdateTextIndent(value);
476     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
477 }
478 
SetTextAlign(const TextAlign & textAlign)479 void SearchModelNG::SetTextAlign(const TextAlign& textAlign)
480 {
481     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
482     CHECK_NULL_VOID(frameNode);
483     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
484     CHECK_NULL_VOID(textFieldChild);
485     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
486     CHECK_NULL_VOID(textFieldLayoutProperty);
487     if (textFieldLayoutProperty->GetTextAlignValue(TextAlign::START) != textAlign) {
488         textFieldLayoutProperty->UpdateTextAlignChanged(true);
489     }
490     textFieldLayoutProperty->UpdateTextAlign(textAlign);
491     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
492 }
493 
SetCopyOption(const CopyOptions & copyOptions)494 void SearchModelNG::SetCopyOption(const CopyOptions& copyOptions)
495 {
496     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
497     CHECK_NULL_VOID(frameNode);
498     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
499     CHECK_NULL_VOID(textFieldChild);
500     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
501     CHECK_NULL_VOID(textFieldLayoutProperty);
502     textFieldLayoutProperty->UpdateCopyOptions(copyOptions);
503     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
504 }
505 
SetHeight(const Dimension & height)506 void SearchModelNG::SetHeight(const Dimension& height)
507 {
508     NG::ViewAbstract::SetHeight(NG::CalcLength(height));
509 }
510 
SetOnSubmit(std::function<void (const std::string &,NG::TextFieldCommonEvent &)> && onSubmit)511 void SearchModelNG::SetOnSubmit(std::function<void(const std::string&, NG::TextFieldCommonEvent&)>&& onSubmit)
512 {
513     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
514     CHECK_NULL_VOID(frameNode);
515     auto eventHub = frameNode->GetEventHub<SearchEventHub>();
516     CHECK_NULL_VOID(eventHub);
517     eventHub->SetOnSubmit(std::move(onSubmit));
518 }
519 
SetOnChange(std::function<void (const std::string &,PreviewText &)> && onChange)520 void SearchModelNG::SetOnChange(std::function<void(const std::string&, PreviewText&)>&& onChange)
521 {
522     auto searchTextField = GetSearchTextFieldFrameNode();
523     CHECK_NULL_VOID(searchTextField);
524     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
525     CHECK_NULL_VOID(eventHub);
526     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
527     CHECK_NULL_VOID(frameNode);
528     auto pattern = frameNode->GetPattern<SearchPattern>();
529     CHECK_NULL_VOID(pattern);
530     auto searchChangeFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)),
531         onChange](const std::string& value, PreviewText& previewText) {
532         if (onChange) {
533             onChange(value, previewText);
534         }
535         auto pattern = weak.Upgrade();
536         CHECK_NULL_VOID(pattern);
537         auto searchPattern = AceType::DynamicCast<SearchPattern>(pattern);
538         CHECK_NULL_VOID(searchPattern);
539         searchPattern->UpdateChangeEvent(value + previewText.value);
540     };
541     eventHub->SetOnChange(std::move(searchChangeFunc));
542 }
543 
SetOnTextSelectionChange(std::function<void (int32_t,int32_t)> && func)544 void SearchModelNG::SetOnTextSelectionChange(std::function<void(int32_t, int32_t)>&& func)
545 {
546     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
547     CHECK_NULL_VOID(frameNode);
548     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
549     CHECK_NULL_VOID(textFieldChild);
550     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
551     CHECK_NULL_VOID(textFieldEventHub);
552     textFieldEventHub->SetOnSelectionChange(std::move(func));
553 }
554 
SetOnScroll(std::function<void (float,float)> && func)555 void SearchModelNG::SetOnScroll(std::function<void(float, float)>&& func)
556 {
557     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
558     CHECK_NULL_VOID(frameNode);
559     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
560     CHECK_NULL_VOID(textFieldChild);
561     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
562     CHECK_NULL_VOID(textFieldEventHub);
563     textFieldEventHub->SetOnScrollChangeEvent(std::move(func));
564 }
565 
SetSelectionMenuHidden(bool selectionMenuHidden)566 void SearchModelNG::SetSelectionMenuHidden(bool selectionMenuHidden)
567 {
568     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
569     CHECK_NULL_VOID(frameNode);
570     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
571     CHECK_NULL_VOID(textFieldChild);
572     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
573     CHECK_NULL_VOID(textFieldLayoutProperty);
574     textFieldLayoutProperty->UpdateSelectionMenuHidden(selectionMenuHidden);
575     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
576 }
577 
SetOnCopy(std::function<void (const std::string &)> && func)578 void SearchModelNG::SetOnCopy(std::function<void(const std::string&)>&& func)
579 {
580     auto searchTextField = GetSearchTextFieldFrameNode();
581     CHECK_NULL_VOID(searchTextField);
582     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
583     CHECK_NULL_VOID(eventHub);
584     eventHub->SetOnCopy(std::move(func));
585 }
586 
SetOnCut(std::function<void (const std::string &)> && func)587 void SearchModelNG::SetOnCut(std::function<void(const std::string&)>&& func)
588 {
589     auto searchTextField = GetSearchTextFieldFrameNode();
590     CHECK_NULL_VOID(searchTextField);
591     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
592     CHECK_NULL_VOID(eventHub);
593     auto searchPasteFunc = [weak = AceType::WeakClaim(AceType::RawPtr(searchTextField)), func](
594                                const std::string& value) {
595         if (func) {
596             func(value);
597         }
598         auto node = weak.Upgrade();
599         if (node) {
600             node->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
601         }
602     };
603     eventHub->SetOnCut(std::move(searchPasteFunc));
604 }
605 
SetOnPasteWithEvent(std::function<void (const std::string &,NG::TextCommonEvent &)> && func)606 void SearchModelNG::SetOnPasteWithEvent(std::function<void(const std::string&, NG::TextCommonEvent&)>&& func)
607 {
608     auto searchTextField = GetSearchTextFieldFrameNode();
609     CHECK_NULL_VOID(searchTextField);
610     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
611     CHECK_NULL_VOID(eventHub);
612 
613     auto searchPasteFunc = [weak = AceType::WeakClaim(AceType::RawPtr(searchTextField)), func](
614                                const std::string& value, NG::TextCommonEvent& info) {
615         if (func) {
616             func(value, info);
617         }
618         auto node = weak.Upgrade();
619         if (node) {
620             node->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
621         }
622     };
623     eventHub->SetOnPasteWithEvent(std::move(searchPasteFunc));
624 }
625 
SetOnWillInsertValueEvent(std::function<bool (const InsertValueInfo &)> && func)626 void SearchModelNG::SetOnWillInsertValueEvent(std::function<bool(const InsertValueInfo&)>&& func)
627 {
628     auto searchTextField = GetSearchTextFieldFrameNode();
629     CHECK_NULL_VOID(searchTextField);
630     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
631     CHECK_NULL_VOID(eventHub);
632     eventHub->SetOnWillInsertValueEvent(std::move(func));
633 }
634 
SetOnDidInsertValueEvent(std::function<void (const InsertValueInfo &)> && func)635 void SearchModelNG::SetOnDidInsertValueEvent(std::function<void(const InsertValueInfo&)>&& func)
636 {
637     auto searchTextField = GetSearchTextFieldFrameNode();
638     CHECK_NULL_VOID(searchTextField);
639     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
640     CHECK_NULL_VOID(eventHub);
641     eventHub->SetOnDidInsertValueEvent(std::move(func));
642 }
643 
SetOnWillDeleteEvent(std::function<bool (const DeleteValueInfo &)> && func)644 void SearchModelNG::SetOnWillDeleteEvent(std::function<bool(const DeleteValueInfo&)>&& func)
645 {
646     auto searchTextField = GetSearchTextFieldFrameNode();
647     CHECK_NULL_VOID(searchTextField);
648     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
649     CHECK_NULL_VOID(eventHub);
650     eventHub->SetOnWillDeleteEvent(std::move(func));
651 }
652 
SetOnDidDeleteEvent(std::function<void (const DeleteValueInfo &)> && func)653 void SearchModelNG::SetOnDidDeleteEvent(std::function<void(const DeleteValueInfo&)>&& func)
654 {
655     auto searchTextField = GetSearchTextFieldFrameNode();
656     CHECK_NULL_VOID(searchTextField);
657     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
658     CHECK_NULL_VOID(eventHub);
659     eventHub->SetOnDidDeleteEvent(std::move(func));
660 }
SetSelectionMenuOptions(const NG::OnCreateMenuCallback && onCreateMenuCallback,const NG::OnMenuItemClickCallback && onMenuItemClick)661 void SearchModelNG::SetSelectionMenuOptions(
662     const NG::OnCreateMenuCallback&& onCreateMenuCallback, const NG::OnMenuItemClickCallback&& onMenuItemClick)
663 {
664     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
665     CHECK_NULL_VOID(frameNode);
666     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
667     CHECK_NULL_VOID(textFieldChild);
668     auto textFieldPattern = textFieldChild->GetPattern<TextFieldPattern>();
669     CHECK_NULL_VOID(textFieldPattern);
670     textFieldPattern->OnSelectionMenuOptionsUpdate(std::move(onCreateMenuCallback), std::move(onMenuItemClick));
671 }
672 
SetEnablePreviewText(bool enablePreviewText)673 void SearchModelNG::SetEnablePreviewText(bool enablePreviewText)
674 {
675     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
676     CHECK_NULL_VOID(frameNode);
677     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
678     CHECK_NULL_VOID(textFieldChild);
679     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
680     CHECK_NULL_VOID(pattern);
681     pattern->SetSupportPreviewText(enablePreviewText);
682 }
683 
SetEnableHapticFeedback(bool state)684 void SearchModelNG::SetEnableHapticFeedback(bool state)
685 {
686     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
687     CHECK_NULL_VOID(frameNode);
688     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
689     CHECK_NULL_VOID(textFieldChild);
690     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
691     CHECK_NULL_VOID(pattern);
692     pattern->SetEnableHapticFeedback(state);
693 }
694 
SetOnPaste(std::function<void (const std::string &)> && func)695 void SearchModelNG::SetOnPaste(std::function<void(const std::string&)>&& func)
696 {
697     auto searchTextField = GetSearchTextFieldFrameNode();
698     CHECK_NULL_VOID(searchTextField);
699     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
700     CHECK_NULL_VOID(eventHub);
701     auto searchPasteFunc = [weak = AceType::WeakClaim(AceType::RawPtr(searchTextField)), func](
702                                const std::string& value) {
703         if (func) {
704             func(value);
705         }
706         auto node = weak.Upgrade();
707         if (node) {
708             node->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
709         }
710     };
711     eventHub->SetOnPaste(std::move(searchPasteFunc));
712 }
713 
SetCustomKeyboard(const std::function<void ()> && buildFunc,bool supportAvoidance)714 void SearchModelNG::SetCustomKeyboard(const std::function<void()>&& buildFunc, bool supportAvoidance)
715 {
716     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
717     CHECK_NULL_VOID(frameNode);
718     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
719     CHECK_NULL_VOID(textFieldChild);
720     auto textFieldPattern = textFieldChild->GetPattern<TextFieldPattern>();
721     if (textFieldPattern) {
722         textFieldPattern->SetCustomKeyboard(std::move(buildFunc));
723         textFieldPattern->SetCustomKeyboardOption(supportAvoidance);
724     }
725 }
726 
SetType(TextInputType value)727 void SearchModelNG::SetType(TextInputType value)
728 {
729     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
730     CHECK_NULL_VOID(frameNode);
731     auto textFieldHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
732     CHECK_NULL_VOID(textFieldHost);
733     auto layoutProperty = textFieldHost->GetLayoutProperty<TextFieldLayoutProperty>();
734     CHECK_NULL_VOID(layoutProperty);
735     if (layoutProperty->HasTextInputType() && layoutProperty->GetTextInputTypeValue() != value) {
736         layoutProperty->UpdateTypeChanged(true);
737     }
738     layoutProperty->UpdateTextInputType(value);
739     textFieldHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
740 }
741 
CreateTextField(const RefPtr<SearchNode> & parentNode,const std::optional<std::string> & placeholder,const std::optional<std::string> & value,bool hasTextFieldNode)742 void SearchModelNG::CreateTextField(const RefPtr<SearchNode>& parentNode, const std::optional<std::string>& placeholder,
743     const std::optional<std::string>& value, bool hasTextFieldNode)
744 {
745     auto nodeId = parentNode->GetTextFieldId();
746     auto frameNode = FrameNode::GetOrCreateFrameNode(
747         V2::SEARCH_Field_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<SearchTextFieldPattern>(); });
748     auto pipeline = frameNode->GetContext();
749     CHECK_NULL_VOID(pipeline);
750     auto searchTheme = pipeline->GetTheme<SearchTheme>();
751     CHECK_NULL_VOID(searchTheme);
752     auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
753     auto textFieldPaintProperty = frameNode->GetPaintProperty<TextFieldPaintProperty>();
754     std::set<std::string> allowDropSet({ DROP_TYPE_PLAIN_TEXT, DROP_TYPE_HYPERLINK, DROP_TYPE_STYLED_STRING });
755     frameNode->SetAllowDrop(allowDropSet);
756     auto parentInspector = parentNode->GetInspectorIdValue("");
757     frameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[TEXTFIELD_INDEX] + parentInspector);
758     auto pattern = frameNode->GetPattern<TextFieldPattern>();
759     auto textValue = pattern->GetTextValue();
760     if (textFieldLayoutProperty) {
761         if (value.has_value() && value.value() != textValue) {
762             auto changed = pattern->InitValueText(value.value());
763             pattern->SetTextChangedAtCreation(changed);
764         }
765         textFieldLayoutProperty->UpdatePlaceholder(placeholder.value_or(""));
766         textFieldLayoutProperty->UpdateMaxLines(1);
767         textFieldLayoutProperty->UpdatePlaceholderMaxLines(1);
768         if (!textFieldPaintProperty || !textFieldPaintProperty->HasTextColorFlagByUser()) {
769             textFieldLayoutProperty->UpdateTextColor(searchTheme->GetTextColor());
770         }
771     }
772     pattern->SetTextFieldController(AceType::MakeRefPtr<TextFieldController>());
773     pattern->GetTextFieldController()->SetPattern(AceType::WeakClaim(AceType::RawPtr(pattern)));
774     pattern->SetTextEditController(AceType::MakeRefPtr<TextEditController>());
775     pattern->InitSurfaceChangedCallback();
776     pattern->RegisterWindowSizeCallback();
777     pattern->InitSurfacePositionChangedCallback();
778     if (pipeline->GetHasPreviewTextOption()) {
779         pattern->SetSupportPreviewText(pipeline->GetSupportPreviewText());
780     }
781     TextFieldUpdateContext(frameNode);
782     if (!hasTextFieldNode) {
783         auto pattern = parentNode->GetPattern<SearchPattern>();
784         CHECK_NULL_VOID(pattern);
785         pattern->SetTextFieldNode(frameNode);
786         frameNode->MountToParent(parentNode);
787     }
788     pattern->SetMaxFontSizeScale(MAX_FONT_SCALE);
789 }
790 
TextFieldUpdateContext(const RefPtr<FrameNode> & frameNode)791 void SearchModelNG::TextFieldUpdateContext(const RefPtr<FrameNode>& frameNode)
792 {
793     CHECK_NULL_VOID(frameNode);
794     auto pipeline = frameNode->GetContext();
795     CHECK_NULL_VOID(pipeline);
796     auto textFieldTheme = pipeline->GetTheme<TextFieldTheme>();
797     CHECK_NULL_VOID(textFieldTheme);
798     auto textFieldPaintProperty = frameNode->GetPaintProperty<TextFieldPaintProperty>();
799     CHECK_NULL_VOID(textFieldPaintProperty);
800     auto pattern = frameNode->GetPattern<TextFieldPattern>();
801     CHECK_NULL_VOID(pattern);
802     auto textFieldLayoutProperty = frameNode->GetLayoutProperty<TextFieldLayoutProperty>();
803     CHECK_NULL_VOID(textFieldLayoutProperty);
804 
805     auto renderContext = frameNode->GetRenderContext();
806     textFieldPaintProperty->UpdateCursorColor(textFieldTheme->GetCursorColor());
807     textFieldPaintProperty->UpdateCursorWidth(textFieldTheme->GetCursorWidth());
808     PaddingProperty padding({ CalcLength(0.0), CalcLength(0.0), CalcLength(0.0), CalcLength(0.0) });
809     textFieldLayoutProperty->UpdatePadding(padding);
810     BorderRadiusProperty borderRadius;
811     textFieldPaintProperty->UpdateBorderRadiusFlagByUser(borderRadius);
812     pattern->SetEnableTouchAndHoverEffect(true);
813     renderContext->UpdateBackgroundColor(Color::TRANSPARENT);
814 }
815 
RequestKeyboardOnFocus(bool needToRequest)816 void SearchModelNG::RequestKeyboardOnFocus(bool needToRequest)
817 {
818     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
819     CHECK_NULL_VOID(frameNode);
820     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
821     CHECK_NULL_VOID(textFieldChild);
822     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
823     CHECK_NULL_VOID(pattern);
824     pattern->SetNeedToRequestKeyboardOnFocus(needToRequest);
825 }
826 
CreateButton(const RefPtr<SearchNode> & parentNode,bool hasButtonNode)827 void SearchModelNG::CreateButton(const RefPtr<SearchNode>& parentNode, bool hasButtonNode)
828 {
829     if (hasButtonNode) {
830         return;
831     }
832     auto parentInspector = parentNode->GetInspectorIdValue("");
833     auto nodeId = parentNode->GetButtonId();
834     auto frameNode = FrameNode::GetOrCreateFrameNode(
835         V2::BUTTON_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
836     CHECK_NULL_VOID(frameNode);
837     auto pipeline = frameNode->GetContext();
838     CHECK_NULL_VOID(pipeline);
839     auto searchTheme = pipeline->GetTheme<SearchTheme>();
840     if (frameNode->GetChildren().empty()) {
841         auto textNode = FrameNode::CreateFrameNode(
842             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
843         CHECK_NULL_VOID(textNode);
844         frameNode->AddChild(textNode);
845     }
846 
847     auto buttonRenderContext = frameNode->GetRenderContext();
848     buttonRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
849     buttonRenderContext->UpdateClipEdge(true);
850     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
851     auto textLayoutProperty = textFrameNode->GetLayoutProperty<TextLayoutProperty>();
852     std::string defaultText = "Search";
853     textLayoutProperty->UpdateContent(defaultText);
854     textLayoutProperty->UpdateTextColor(searchTheme->GetSearchButtonTextColor());
855     textLayoutProperty->UpdateFontSize(searchTheme->GetFontSize());
856     textLayoutProperty->UpdateMaxFontScale(MAX_FONT_SCALE);
857     textLayoutProperty->UpdateMaxLines(1);
858 
859     PaddingProperty padding;
860     padding.left = CalcLength(searchTheme->GetSearchButtonTextPadding());
861     padding.right = CalcLength(searchTheme->GetSearchButtonTextPadding());
862     textLayoutProperty->UpdatePadding(padding);
863 
864     auto searchButtonEvent = frameNode->GetEventHub<ButtonEventHub>();
865     CHECK_NULL_VOID(searchButtonEvent);
866     searchButtonEvent->SetEnabled(false);
867     auto pattern = parentNode->GetPattern<SearchPattern>();
868     CHECK_NULL_VOID(pattern);
869     frameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[BUTTON_INDEX] + parentInspector);
870     pattern->SetButtonNode(frameNode);
871     frameNode->MountToParent(parentNode);
872     frameNode->MarkModifyDone();
873 }
874 
CreateDivider(const RefPtr<SearchNode> & parentNode,bool hasDividerNode)875 void SearchModelNG::CreateDivider(const RefPtr<SearchNode>& parentNode, bool hasDividerNode)
876 {
877     if (hasDividerNode) {
878         return;
879     }
880     auto parentInspector = parentNode->GetInspectorIdValue("");
881     auto nodeId = parentNode->GetDividerId();
882     auto dividerNode = FrameNode::GetOrCreateFrameNode(
883         V2::DIVIDER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<DividerPattern>(); });
884     CHECK_NULL_VOID(dividerNode);
885 
886     auto pipeline = dividerNode->GetContext();
887     CHECK_NULL_VOID(pipeline);
888     auto searchTheme = pipeline->GetTheme<SearchTheme>();
889     CHECK_NULL_VOID(searchTheme);
890     auto searchDividerColor = searchTheme->GetSearchDividerColor();
891     auto dividerRenderProperty = dividerNode->GetPaintProperty<DividerRenderProperty>();
892     CHECK_NULL_VOID(dividerRenderProperty);
893     dividerRenderProperty->UpdateDividerColor(searchDividerColor);
894     auto searchDividerWidth = Dimension(searchTheme->GetSearchDividerWidth().ConvertToPx());
895     auto dividerLayoutProperty = dividerNode->GetLayoutProperty<DividerLayoutProperty>();
896     CHECK_NULL_VOID(dividerLayoutProperty);
897     dividerLayoutProperty->UpdateVertical(true);
898     dividerLayoutProperty->UpdateStrokeWidth(searchDividerWidth);
899 
900     dividerNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[DIVIDER_INDEX] + parentInspector);
901     dividerNode->MountToParent(parentNode);
902     dividerNode->MarkModifyDone();
903 }
904 
CreateCancelButton(const RefPtr<SearchNode> & parentNode,bool hasCancelButtonNode)905 void SearchModelNG::CreateCancelButton(const RefPtr<SearchNode>& parentNode, bool hasCancelButtonNode)
906 {
907     if (hasCancelButtonNode) {
908         return;
909     }
910     auto parentInspector = parentNode->GetInspectorIdValue("");
911     auto nodeId = parentNode->GetCancelButtonId();
912     auto frameNode = FrameNode::GetOrCreateFrameNode(
913         V2::BUTTON_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ButtonPattern>(); });
914     CHECK_NULL_VOID(frameNode);
915     auto pipeline = frameNode->GetContext();
916     CHECK_NULL_VOID(pipeline);
917     auto searchTheme = pipeline->GetTheme<SearchTheme>();
918     CHECK_NULL_VOID(searchTheme);
919     if (frameNode->GetChildren().empty()) {
920         auto textNode = FrameNode::CreateFrameNode(
921             V2::TEXT_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<TextPattern>());
922         CHECK_NULL_VOID(textNode);
923         frameNode->AddChild(textNode);
924     }
925     frameNode->UpdateInspectorId(INSPECTOR_PREFIX + SPECICALIZED_INSPECTOR_INDEXS[CANCEL_BUTTON_INDEX] +
926         parentInspector);
927     auto cancelButtonRenderContext = frameNode->GetRenderContext();
928     cancelButtonRenderContext->UpdateBackgroundColor(Color::TRANSPARENT);
929     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
930     auto textLayoutProperty = textFrameNode->GetLayoutProperty<TextLayoutProperty>();
931     textLayoutProperty->UpdateFontSize(searchTheme->GetFontSize());
932     auto cancelButtonLayoutProperty = frameNode->GetLayoutProperty<ButtonLayoutProperty>();
933     cancelButtonLayoutProperty->UpdateType(ButtonType::CIRCLE);
934     auto cancelButtonEvent = frameNode->GetEventHub<ButtonEventHub>();
935     CHECK_NULL_VOID(cancelButtonEvent);
936     cancelButtonEvent->SetEnabled(false);
937     auto pattern = parentNode->GetPattern<SearchPattern>();
938     CHECK_NULL_VOID(pattern);
939     pattern->SetCancelButtonNode(frameNode);
940     frameNode->MountToParent(parentNode);
941     frameNode->MarkModifyDone();
942 }
943 
UpdateInspectorId(const std::string & key)944 void SearchModelNG::UpdateInspectorId(const std::string& key)
945 {
946     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
947     CHECK_NULL_VOID(frameNode);
948     UpdateInnerInspector(frameNode, key);
949 }
950 
GetOrCreateSearchNode(const std::string & tag,int32_t nodeId,const std::function<RefPtr<Pattern> (void)> & patternCreator)951 RefPtr<SearchNode> SearchModelNG::GetOrCreateSearchNode(
952     const std::string& tag, int32_t nodeId, const std::function<RefPtr<Pattern>(void)>& patternCreator)
953 {
954     auto searchNode = ElementRegister::GetInstance()->GetSpecificItemById<SearchNode>(nodeId);
955     if (searchNode) {
956         if (searchNode->GetTag() == tag) {
957             return searchNode;
958         }
959         ElementRegister::GetInstance()->RemoveItemSilently(nodeId);
960         auto parent = searchNode->GetParent();
961         if (parent) {
962             parent->RemoveChild(searchNode);
963         }
964     }
965 
966     auto pattern = patternCreator ? patternCreator() : AceType::MakeRefPtr<Pattern>();
967     searchNode = AceType::MakeRefPtr<SearchNode>(tag, nodeId, pattern, false);
968     searchNode->InitializePatternAndContext();
969     ElementRegister::GetInstance()->AddUINode(searchNode);
970     return searchNode;
971 }
972 
SetOnChangeEvent(std::function<void (const std::string &)> && onChangeEvent)973 void SearchModelNG::SetOnChangeEvent(std::function<void(const std::string&)>&& onChangeEvent)
974 {
975     auto searchTextField = GetSearchTextFieldFrameNode();
976     CHECK_NULL_VOID(searchTextField);
977     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
978     CHECK_NULL_VOID(eventHub);
979     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
980     CHECK_NULL_VOID(frameNode);
981     auto pattern = frameNode->GetPattern<SearchPattern>();
982     CHECK_NULL_VOID(pattern);
983     auto searchChangeFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)), onChangeEvent](
984                                 const std::string& value) {
985         if (onChangeEvent) {
986             onChangeEvent(value);
987         }
988         auto pattern = weak.Upgrade();
989         CHECK_NULL_VOID(pattern);
990         auto searchPattern = AceType::DynamicCast<SearchPattern>(pattern);
991         CHECK_NULL_VOID(searchPattern);
992         searchPattern->UpdateChangeEvent(value);
993     };
994     eventHub->SetOnChangeEvent(std::move(searchChangeFunc));
995 }
996 
GetSearchTextFieldFrameNode() const997 RefPtr<FrameNode> SearchModelNG::GetSearchTextFieldFrameNode() const
998 {
999     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1000     CHECK_NULL_RETURN(frameNode, nullptr);
1001     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1002     CHECK_NULL_RETURN(textFieldChild, nullptr);
1003     return textFieldChild;
1004 }
1005 
SetSearchEnterKeyType(TextInputAction value)1006 void SearchModelNG::SetSearchEnterKeyType(TextInputAction value)
1007 {
1008     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1009     CHECK_NULL_VOID(frameNode);
1010     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1011     CHECK_NULL_VOID(textFieldChild);
1012     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1013     CHECK_NULL_VOID(pattern);
1014     if (value == TextInputAction::UNSPECIFIED) {
1015         value = TextInputAction::SEARCH;
1016     }
1017     pattern->UpdateTextInputAction(value);
1018 }
1019 
SetMaxLength(uint32_t value)1020 void SearchModelNG::SetMaxLength(uint32_t value)
1021 {
1022     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1023     CHECK_NULL_VOID(frameNode);
1024     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1025     CHECK_NULL_VOID(textFieldChild);
1026     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1027     CHECK_NULL_VOID(textFieldLayoutProperty);
1028     textFieldLayoutProperty->UpdateMaxLength(value);
1029     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1030 }
1031 
ResetMaxLength()1032 void SearchModelNG::ResetMaxLength()
1033 {
1034     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1035     CHECK_NULL_VOID(frameNode);
1036     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1037     CHECK_NULL_VOID(textFieldChild);
1038     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1039     CHECK_NULL_VOID(textFieldLayoutProperty);
1040     textFieldLayoutProperty->ResetMaxLength();
1041     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1042 }
1043 
CreateFrameNode(int32_t nodeId)1044 RefPtr<SearchNode> SearchModelNG::CreateFrameNode(int32_t nodeId)
1045 {
1046     auto searchNode = CreateSearchNode(nodeId, "", "", "");
1047 
1048     return searchNode;
1049 }
1050 
SetTextValue(FrameNode * frameNode,const std::optional<std::string> & value)1051 void SearchModelNG::SetTextValue(FrameNode* frameNode, const std::optional<std::string>& value)
1052 {
1053     CHECK_NULL_VOID(frameNode);
1054     auto searchNode = AceType::Claim(AceType::DynamicCast<SearchNode>(frameNode));
1055     if (!searchNode->HasTextFieldNode()) {
1056         return;
1057     }
1058 
1059     auto textField = FrameNode::GetFrameNode(V2::SEARCH_Field_ETS_TAG, searchNode->GetTextFieldId());
1060     CHECK_NULL_VOID(textField);
1061     auto textFieldLayoutProperty = textField->GetLayoutProperty<TextFieldLayoutProperty>();
1062     auto pattern = textField->GetPattern<TextFieldPattern>();
1063     auto textValue = pattern->GetTextValue();
1064     if (textFieldLayoutProperty) {
1065         if (value.has_value() && value.value() != textValue) {
1066             pattern->InitValueText(value.value());
1067         }
1068     }
1069 }
1070 
SetIcon(FrameNode * frameNode,const std::optional<std::string> & icon)1071 void SearchModelNG::SetIcon(FrameNode* frameNode, const std::optional<std::string>& icon)
1072 {
1073     CHECK_NULL_VOID(frameNode);
1074     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1075     CHECK_NULL_VOID(pattern);
1076     pattern->CreateSearchIcon(icon.value_or(""));
1077 }
1078 
SetPlaceholder(FrameNode * frameNode,const std::optional<std::string> & placeholder)1079 void SearchModelNG::SetPlaceholder(FrameNode* frameNode, const std::optional<std::string>& placeholder)
1080 {
1081     CHECK_NULL_VOID(frameNode);
1082     auto searchNode = AceType::Claim(AceType::DynamicCast<SearchNode>(frameNode));
1083     if (!searchNode->HasTextFieldNode()) {
1084         return;
1085     }
1086 
1087     auto textField = FrameNode::GetFrameNode(V2::SEARCH_Field_ETS_TAG, searchNode->GetTextFieldId());
1088     CHECK_NULL_VOID(textField);
1089     auto textFieldLayoutProperty = textField->GetLayoutProperty<TextFieldLayoutProperty>();
1090     if (textFieldLayoutProperty) {
1091         textFieldLayoutProperty->UpdatePlaceholder(placeholder.value_or(""));
1092     }
1093 }
1094 
SetCaretPosition(FrameNode * frameNode,const int32_t & value)1095 void SearchModelNG::SetCaretPosition(FrameNode* frameNode, const int32_t& value)
1096 {
1097     CHECK_NULL_VOID(frameNode);
1098     auto searchNode = AceType::Claim(AceType::DynamicCast<SearchNode>(frameNode));
1099     auto pattern = searchNode->GetPattern<SearchPattern>();
1100     CHECK_NULL_VOID(pattern);
1101     auto controller = pattern->GetSearchController();
1102     CHECK_NULL_VOID(controller);
1103     controller->CaretPosition(value);
1104 }
1105 
RequestKeyboardOnFocus(FrameNode * frameNode,bool needToRequest)1106 void SearchModelNG::RequestKeyboardOnFocus(FrameNode* frameNode, bool needToRequest)
1107 {
1108     CHECK_NULL_VOID(frameNode);
1109     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1110     CHECK_NULL_VOID(textFieldChild);
1111     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1112     CHECK_NULL_VOID(pattern);
1113     pattern->SetNeedToRequestKeyboardOnFocus(needToRequest);
1114 }
1115 
SetPlaceholderFont(FrameNode * frameNode,const Font & font)1116 void SearchModelNG::SetPlaceholderFont(FrameNode* frameNode, const Font& font)
1117 {
1118     CHECK_NULL_VOID(frameNode);
1119     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1120     CHECK_NULL_VOID(textFieldChild);
1121     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1122     CHECK_NULL_VOID(textFieldLayoutProperty);
1123     if (font.fontSize) {
1124         textFieldLayoutProperty->UpdatePlaceholderFontSize(font.fontSize.value());
1125     }
1126     if (font.fontStyle) {
1127         textFieldLayoutProperty->UpdatePlaceholderItalicFontStyle(font.fontStyle.value());
1128     }
1129     if (font.fontWeight) {
1130         textFieldLayoutProperty->UpdatePlaceholderFontWeight(font.fontWeight.value());
1131     }
1132     if (!font.fontFamilies.empty()) {
1133         textFieldLayoutProperty->UpdatePlaceholderFontFamily(font.fontFamilies);
1134     }
1135     textFieldLayoutProperty->UpdatePreferredPlaceholderLineHeightNeedToUpdate(true);
1136     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1137 }
1138 
SetSearchIconSize(FrameNode * frameNode,const Dimension & value)1139 void SearchModelNG::SetSearchIconSize(FrameNode* frameNode, const Dimension& value)
1140 {
1141     CHECK_NULL_VOID(frameNode);
1142     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1143     CHECK_NULL_VOID(pattern);
1144     pattern->SetSearchIconSize(value);
1145     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchIconUDSize, value, frameNode);
1146 }
1147 
SetSearchSrcPath(FrameNode * frameNode,const std::string & src)1148 void SearchModelNG::SetSearchSrcPath(FrameNode* frameNode, const std::string& src)
1149 {
1150     CHECK_NULL_VOID(frameNode);
1151     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1152     CHECK_NULL_VOID(pattern);
1153     pattern->SetSearchSrcPath(src, "", "");
1154 }
1155 
SetSearchIconColor(FrameNode * frameNode,const Color & color)1156 void SearchModelNG::SetSearchIconColor(FrameNode* frameNode, const Color& color)
1157 {
1158     CHECK_NULL_VOID(frameNode);
1159     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1160     CHECK_NULL_VOID(pattern);
1161     pattern->SetSearchIconColor(color);
1162 }
1163 
SetSearchImageIcon(FrameNode * frameNode,IconOptions & iconOptions)1164 void SearchModelNG::SetSearchImageIcon(FrameNode *frameNode, IconOptions &iconOptions)
1165 {
1166     CHECK_NULL_VOID(frameNode);
1167     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1168     CHECK_NULL_VOID(pattern);
1169     pattern->SetSearchImageIcon(iconOptions);
1170     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchIconUDSize,
1171         pattern->ConvertImageIconSizeValue(iconOptions.GetSize().value_or(ICON_HEIGHT)), frameNode);
1172 }
1173 
SetSearchButton(FrameNode * frameNode,const std::string & text)1174 void SearchModelNG::SetSearchButton(FrameNode* frameNode, const std::string& text)
1175 {
1176     CHECK_NULL_VOID(frameNode);
1177     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
1178     CHECK_NULL_VOID(buttonFrameNode);
1179 
1180     auto searchButtonRenderContext = buttonFrameNode->GetRenderContext();
1181     CHECK_NULL_VOID(searchButtonRenderContext);
1182 
1183     auto searchButtonEvent = buttonFrameNode->GetEventHub<ButtonEventHub>();
1184     CHECK_NULL_VOID(searchButtonEvent);
1185 
1186     if (!text.empty()) {
1187         searchButtonEvent->SetEnabled(true);
1188         searchButtonRenderContext->UpdateOpacity(1.0);
1189         ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchButton, text, frameNode);
1190     } else {
1191         searchButtonEvent->SetEnabled(false);
1192         searchButtonRenderContext->UpdateOpacity(0.0);
1193     }
1194 
1195     buttonFrameNode->MarkModifyDone();
1196     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1197 }
1198 
SetSearchButtonFontSize(FrameNode * frameNode,const Dimension & value)1199 void SearchModelNG::SetSearchButtonFontSize(FrameNode* frameNode, const Dimension& value)
1200 {
1201     CHECK_NULL_VOID(frameNode);
1202     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
1203     CHECK_NULL_VOID(buttonFrameNode);
1204     auto buttonLayoutProperty = buttonFrameNode->GetLayoutProperty<ButtonLayoutProperty>();
1205     CHECK_NULL_VOID(buttonLayoutProperty);
1206 
1207     buttonLayoutProperty->UpdateFontSize(value);
1208     buttonFrameNode->MarkModifyDone();
1209     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1210 
1211     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, SearchButtonFontSize, value, frameNode);
1212 }
1213 
SetSearchButtonFontColor(FrameNode * frameNode,const Color & color)1214 void SearchModelNG::SetSearchButtonFontColor(FrameNode* frameNode, const Color& color)
1215 {
1216     CHECK_NULL_VOID(frameNode);
1217     auto buttonFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(BUTTON_INDEX));
1218     CHECK_NULL_VOID(buttonFrameNode);
1219     auto buttonLayoutProperty = buttonFrameNode->GetLayoutProperty<ButtonLayoutProperty>();
1220     CHECK_NULL_VOID(buttonLayoutProperty);
1221 
1222     buttonLayoutProperty->UpdateFontColor(color);
1223     buttonFrameNode->MarkModifyDone();
1224     buttonFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1225 }
1226 
SetTextColor(FrameNode * frameNode,const Color & color)1227 void SearchModelNG::SetTextColor(FrameNode* frameNode, const Color& color)
1228 {
1229     CHECK_NULL_VOID(frameNode);
1230     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1231     CHECK_NULL_VOID(textFieldChild);
1232     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1233     CHECK_NULL_VOID(textFieldLayoutProperty);
1234     ACE_UPDATE_NODE_PAINT_PROPERTY(TextFieldPaintProperty, TextColorFlagByUser, color, textFieldChild);
1235     textFieldLayoutProperty->UpdateTextColor(color);
1236     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1237 }
1238 
SetCopyOption(FrameNode * frameNode,const CopyOptions & copyOptions)1239 void SearchModelNG::SetCopyOption(FrameNode* frameNode, const CopyOptions& copyOptions)
1240 {
1241     CHECK_NULL_VOID(frameNode);
1242     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1243     CHECK_NULL_VOID(textFieldChild);
1244     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1245     CHECK_NULL_VOID(textFieldLayoutProperty);
1246     textFieldLayoutProperty->UpdateCopyOptions(copyOptions);
1247     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1248 }
1249 
SetTextFont(FrameNode * frameNode,const Font & font)1250 void SearchModelNG::SetTextFont(FrameNode* frameNode, const Font& font)
1251 {
1252     CHECK_NULL_VOID(frameNode);
1253     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1254     CHECK_NULL_VOID(textFieldChild);
1255     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1256     CHECK_NULL_VOID(textFieldLayoutProperty);
1257     if (font.fontSize) {
1258         textFieldLayoutProperty->UpdateFontSize(font.fontSize.value());
1259     }
1260     if (font.fontStyle) {
1261         textFieldLayoutProperty->UpdateItalicFontStyle(font.fontStyle.value());
1262     }
1263     if (font.fontWeight) {
1264         textFieldLayoutProperty->UpdateFontWeight(font.fontWeight.value());
1265     }
1266     if (!font.fontFamilies.empty()) {
1267         textFieldLayoutProperty->UpdateFontFamily(font.fontFamilies);
1268     }
1269     textFieldLayoutProperty->UpdatePreferredTextLineHeightNeedToUpdate(true);
1270     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1271 }
1272 
SetPlaceholderColor(FrameNode * frameNode,const Color & color)1273 void SearchModelNG::SetPlaceholderColor(FrameNode* frameNode, const Color& color)
1274 {
1275     CHECK_NULL_VOID(frameNode);
1276     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1277     CHECK_NULL_VOID(textFieldChild);
1278     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1279     CHECK_NULL_VOID(textFieldLayoutProperty);
1280     textFieldLayoutProperty->UpdatePlaceholderTextColor(color);
1281     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1282 }
1283 
SetSelectionMenuHidden(FrameNode * frameNode,bool selectionMenuHidden)1284 void SearchModelNG::SetSelectionMenuHidden(FrameNode* frameNode, bool selectionMenuHidden)
1285 {
1286     CHECK_NULL_VOID(frameNode);
1287     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1288     CHECK_NULL_VOID(textFieldChild);
1289     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1290     CHECK_NULL_VOID(textFieldLayoutProperty);
1291     textFieldLayoutProperty->UpdateSelectionMenuHidden(selectionMenuHidden);
1292     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1293 }
1294 
SetCaretWidth(FrameNode * frameNode,const Dimension & value)1295 void SearchModelNG::SetCaretWidth(FrameNode* frameNode, const Dimension& value)
1296 {
1297     CHECK_NULL_VOID(frameNode);
1298     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(TEXTFIELD_INDEX));
1299     CHECK_NULL_VOID(textFrameNode);
1300     auto textPaintProperty = textFrameNode->GetPaintProperty<TextFieldPaintProperty>();
1301     CHECK_NULL_VOID(textPaintProperty);
1302     textPaintProperty->UpdateCursorWidth(value);
1303     textFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1304 }
1305 
SetCaretColor(FrameNode * frameNode,const Color & color)1306 void SearchModelNG::SetCaretColor(FrameNode* frameNode, const Color& color)
1307 {
1308     CHECK_NULL_VOID(frameNode);
1309     auto textFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildAtIndex(TEXTFIELD_INDEX));
1310     CHECK_NULL_VOID(textFrameNode);
1311     auto textPaintProperty = textFrameNode->GetPaintProperty<TextFieldPaintProperty>();
1312     CHECK_NULL_VOID(textPaintProperty);
1313     textPaintProperty->UpdateCursorColor(color);
1314     textFrameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1315 }
1316 
SetTextAlign(FrameNode * frameNode,const TextAlign & textAlign)1317 void SearchModelNG::SetTextAlign(FrameNode* frameNode, const TextAlign& textAlign)
1318 {
1319     CHECK_NULL_VOID(frameNode);
1320     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1321     CHECK_NULL_VOID(textFieldChild);
1322     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1323     CHECK_NULL_VOID(textFieldLayoutProperty);
1324     if (textFieldLayoutProperty->GetTextAlignValue(TextAlign::START) != textAlign) {
1325         textFieldLayoutProperty->UpdateTextAlignChanged(true);
1326     }
1327     textFieldLayoutProperty->UpdateTextAlign(textAlign);
1328     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1329 }
1330 
SetCancelButtonStyle(FrameNode * frameNode,CancelButtonStyle style)1331 void SearchModelNG::SetCancelButtonStyle(FrameNode* frameNode, CancelButtonStyle style)
1332 {
1333     CHECK_NULL_VOID(frameNode);
1334     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1335     CHECK_NULL_VOID(pattern);
1336     pattern->SetCancelButtonStyle(style);
1337     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonStyle, style, frameNode);
1338 }
1339 
SetCancelIconSize(FrameNode * frameNode,const Dimension & value)1340 void SearchModelNG::SetCancelIconSize(FrameNode* frameNode, const Dimension& value)
1341 {
1342     CHECK_NULL_VOID(frameNode);
1343     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1344     CHECK_NULL_VOID(pattern);
1345     pattern->SetCancelIconSize(value);
1346     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonUDSize, value, frameNode);
1347 }
1348 
SetCancelIconColor(FrameNode * frameNode,const Color & color)1349 void SearchModelNG::SetCancelIconColor(FrameNode* frameNode, const Color& color)
1350 {
1351     CHECK_NULL_VOID(frameNode);
1352     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1353     CHECK_NULL_VOID(pattern);
1354     pattern->SetCancelIconColor(color);
1355 }
1356 
SetRightIconSrcPath(FrameNode * frameNode,const std::string & src)1357 void SearchModelNG::SetRightIconSrcPath(FrameNode* frameNode, const std::string& src)
1358 {
1359     CHECK_NULL_VOID(frameNode);
1360     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1361     CHECK_NULL_VOID(pattern);
1362     pattern->SetRightIconSrcPath(src);
1363 }
1364 
SetCancelImageIcon(FrameNode * frameNode,IconOptions & iconOptions)1365 void SearchModelNG::SetCancelImageIcon(FrameNode *frameNode, IconOptions &iconOptions)
1366 {
1367     CHECK_NULL_VOID(frameNode);
1368     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<SearchPattern>(frameNode);
1369     CHECK_NULL_VOID(pattern);
1370     pattern->SetCancelImageIcon(iconOptions);
1371     auto pipeline = PipelineContext::GetCurrentContext();
1372     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, CancelButtonUDSize,
1373         pattern->ConvertImageIconSizeValue(iconOptions.GetSize().value_or(ICON_HEIGHT)), frameNode);
1374 }
1375 
SetSearchEnterKeyType(FrameNode * frameNode,TextInputAction value)1376 void SearchModelNG::SetSearchEnterKeyType(FrameNode* frameNode, TextInputAction value)
1377 {
1378     CHECK_NULL_VOID(frameNode);
1379     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1380     CHECK_NULL_VOID(textFieldChild);
1381     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1382     CHECK_NULL_VOID(pattern);
1383     if (value == TextInputAction::UNSPECIFIED) {
1384         value = TextInputAction::SEARCH;
1385     }
1386     pattern->UpdateTextInputAction(value);
1387 }
1388 
SetHeight(FrameNode * frameNode,const Dimension & height)1389 void SearchModelNG::SetHeight(FrameNode* frameNode, const Dimension& height)
1390 {
1391     NG::ViewAbstract::SetHeight(frameNode, NG::CalcLength(height));
1392 }
1393 
SetFontFeature(const FONT_FEATURES_LIST & value)1394 void SearchModelNG::SetFontFeature(const FONT_FEATURES_LIST& value)
1395 {
1396     ACE_UPDATE_LAYOUT_PROPERTY(SearchLayoutProperty, FontFeature, value);
1397 }
1398 
SetFontFeature(FrameNode * frameNode,const FONT_FEATURES_LIST & value)1399 void SearchModelNG::SetFontFeature(FrameNode* frameNode, const FONT_FEATURES_LIST& value)
1400 {
1401     ACE_UPDATE_NODE_LAYOUT_PROPERTY(SearchLayoutProperty, FontFeature, value, frameNode);
1402 }
1403 
SetLetterSpacing(const Dimension & value)1404 void SearchModelNG::SetLetterSpacing(const Dimension& value)
1405 {
1406     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1407     CHECK_NULL_VOID(frameNode);
1408     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1409     CHECK_NULL_VOID(textFieldChild);
1410     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1411     CHECK_NULL_VOID(textFieldLayoutProperty);
1412     textFieldLayoutProperty->UpdateLetterSpacing(value);
1413     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1414 }
1415 
SetAdaptMinFontSize(const Dimension & value)1416 void SearchModelNG::SetAdaptMinFontSize(const Dimension& value)
1417 {
1418     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1419     CHECK_NULL_VOID(frameNode);
1420     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1421     CHECK_NULL_VOID(textFieldChild);
1422     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1423     CHECK_NULL_VOID(textFieldLayoutProperty);
1424     textFieldLayoutProperty->UpdateAdaptMinFontSize(value);
1425     textFieldLayoutProperty->UpdateHeightAdaptivePolicy(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST);
1426     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1427 }
1428 
SetAdaptMaxFontSize(const Dimension & value)1429 void SearchModelNG::SetAdaptMaxFontSize(const Dimension& value)
1430 {
1431     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1432     CHECK_NULL_VOID(frameNode);
1433     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1434     CHECK_NULL_VOID(textFieldChild);
1435     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1436     CHECK_NULL_VOID(textFieldLayoutProperty);
1437     textFieldLayoutProperty->UpdateAdaptMaxFontSize(value);
1438     textFieldLayoutProperty->UpdateHeightAdaptivePolicy(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST);
1439     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1440 }
1441 
SetLineHeight(const Dimension & value)1442 void SearchModelNG::SetLineHeight(const Dimension& value)
1443 {
1444     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1445     CHECK_NULL_VOID(frameNode);
1446     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1447     CHECK_NULL_VOID(textFieldChild);
1448     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1449     CHECK_NULL_VOID(textFieldLayoutProperty);
1450     textFieldLayoutProperty->UpdateLineHeight(value);
1451     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1452 }
1453 
SetAdaptMinFontSize(FrameNode * frameNode,const Dimension & value)1454 void SearchModelNG::SetAdaptMinFontSize(FrameNode* frameNode, const Dimension& value)
1455 {
1456     CHECK_NULL_VOID(frameNode);
1457     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1458     CHECK_NULL_VOID(textFieldChild);
1459     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1460     CHECK_NULL_VOID(textFieldLayoutProperty);
1461     textFieldLayoutProperty->UpdateAdaptMinFontSize(value);
1462     textFieldLayoutProperty->UpdateHeightAdaptivePolicy(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST);
1463     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1464 }
1465 
SetAdaptMaxFontSize(FrameNode * frameNode,const Dimension & value)1466 void SearchModelNG::SetAdaptMaxFontSize(FrameNode* frameNode, const Dimension& value)
1467 {
1468     CHECK_NULL_VOID(frameNode);
1469     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1470     CHECK_NULL_VOID(textFieldChild);
1471     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1472     CHECK_NULL_VOID(textFieldLayoutProperty);
1473     textFieldLayoutProperty->UpdateAdaptMaxFontSize(value);
1474     textFieldLayoutProperty->UpdateHeightAdaptivePolicy(TextHeightAdaptivePolicy::LAYOUT_CONSTRAINT_FIRST);
1475     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1476 }
1477 
SetLetterSpacing(FrameNode * frameNode,const Dimension & value)1478 void SearchModelNG::SetLetterSpacing(FrameNode* frameNode, const Dimension& value)
1479 {
1480     CHECK_NULL_VOID(frameNode);
1481     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1482     CHECK_NULL_VOID(textFieldChild);
1483     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1484     CHECK_NULL_VOID(textFieldLayoutProperty);
1485     textFieldLayoutProperty->UpdateLetterSpacing(value);
1486     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1487 }
1488 
SetLineHeight(FrameNode * frameNode,const Dimension & value)1489 void SearchModelNG::SetLineHeight(FrameNode* frameNode, const Dimension& value)
1490 {
1491     CHECK_NULL_VOID(frameNode);
1492     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1493     CHECK_NULL_VOID(textFieldChild);
1494     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1495     CHECK_NULL_VOID(textFieldLayoutProperty);
1496     textFieldLayoutProperty->UpdateLineHeight(value);
1497     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1498 }
1499 
SetTextDecoration(Ace::TextDecoration value)1500 void SearchModelNG::SetTextDecoration(Ace::TextDecoration value)
1501 {
1502     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1503     CHECK_NULL_VOID(frameNode);
1504     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1505     CHECK_NULL_VOID(textFieldChild);
1506     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1507     CHECK_NULL_VOID(textFieldLayoutProperty);
1508     textFieldLayoutProperty->UpdateTextDecoration(value);
1509     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1510 }
1511 
SetTextDecoration(FrameNode * frameNode,Ace::TextDecoration value)1512 void SearchModelNG::SetTextDecoration(FrameNode* frameNode, Ace::TextDecoration value)
1513 {
1514     CHECK_NULL_VOID(frameNode);
1515     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1516     CHECK_NULL_VOID(textFieldChild);
1517     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1518     CHECK_NULL_VOID(textFieldLayoutProperty);
1519     textFieldLayoutProperty->UpdateTextDecoration(value);
1520     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1521 }
1522 
SetTextDecorationColor(const Color & value)1523 void SearchModelNG::SetTextDecorationColor(const Color& value)
1524 {
1525     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1526     CHECK_NULL_VOID(frameNode);
1527     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1528     CHECK_NULL_VOID(textFieldChild);
1529     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1530     CHECK_NULL_VOID(textFieldLayoutProperty);
1531     textFieldLayoutProperty->UpdateTextDecorationColor(value);
1532     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1533 }
1534 
SetTextDecorationColor(FrameNode * frameNode,const Color & value)1535 void SearchModelNG::SetTextDecorationColor(FrameNode* frameNode, const Color& value)
1536 {
1537     CHECK_NULL_VOID(frameNode);
1538     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1539     CHECK_NULL_VOID(textFieldChild);
1540     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1541     CHECK_NULL_VOID(textFieldLayoutProperty);
1542     textFieldLayoutProperty->UpdateTextDecorationColor(value);
1543     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1544 }
1545 
SetTextDecorationStyle(Ace::TextDecorationStyle value)1546 void SearchModelNG::SetTextDecorationStyle(Ace::TextDecorationStyle value)
1547 {
1548     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1549     CHECK_NULL_VOID(frameNode);
1550     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1551     CHECK_NULL_VOID(textFieldChild);
1552     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1553     CHECK_NULL_VOID(textFieldLayoutProperty);
1554     textFieldLayoutProperty->UpdateTextDecorationStyle(value);
1555     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1556 }
1557 
SetSelectedBackgroundColor(FrameNode * frameNode,const Color & value)1558 void SearchModelNG::SetSelectedBackgroundColor(FrameNode* frameNode, const Color& value)
1559 {
1560     CHECK_NULL_VOID(frameNode);
1561     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1562     CHECK_NULL_VOID(textFieldChild);
1563     auto textFieldPaintProperty = textFieldChild->GetPaintProperty<TextFieldPaintProperty>();
1564     CHECK_NULL_VOID(textFieldPaintProperty);
1565     textFieldPaintProperty->UpdateSelectedBackgroundColor(value);
1566     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
1567 }
1568 
SetTextDecorationStyle(FrameNode * frameNode,Ace::TextDecorationStyle value)1569 void SearchModelNG::SetTextDecorationStyle(FrameNode* frameNode, Ace::TextDecorationStyle value)
1570 {
1571     CHECK_NULL_VOID(frameNode);
1572     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1573     CHECK_NULL_VOID(textFieldChild);
1574     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1575     CHECK_NULL_VOID(textFieldLayoutProperty);
1576     textFieldLayoutProperty->UpdateTextDecorationStyle(value);
1577     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1578 }
1579 
SetOnSubmit(FrameNode * frameNode,std::function<void (const std::string &,NG::TextFieldCommonEvent &)> && onSubmit)1580 void SearchModelNG::SetOnSubmit(
1581     FrameNode* frameNode, std::function<void(const std::string&, NG::TextFieldCommonEvent&)>&& onSubmit)
1582 {
1583     CHECK_NULL_VOID(frameNode);
1584     auto eventHub = frameNode->GetEventHub<SearchEventHub>();
1585     CHECK_NULL_VOID(eventHub);
1586     eventHub->SetOnSubmit(std::move(onSubmit));
1587 }
1588 
SetOnChange(FrameNode * frameNode,std::function<void (const std::string &,PreviewText &)> && onChange)1589 void SearchModelNG::SetOnChange(FrameNode* frameNode, std::function<void(const std::string&, PreviewText&)>&& onChange)
1590 {
1591     CHECK_NULL_VOID(frameNode);
1592     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1593     CHECK_NULL_VOID(searchTextField);
1594     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1595     CHECK_NULL_VOID(eventHub);
1596     auto pattern = frameNode->GetPattern<SearchPattern>();
1597     CHECK_NULL_VOID(pattern);
1598     auto searchChangeFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern)),
1599         onChange](const std::string& value, PreviewText& previewText) {
1600         if (onChange) {
1601             onChange(value, previewText);
1602         }
1603         auto pattern = weak.Upgrade();
1604         CHECK_NULL_VOID(pattern);
1605         auto searchPattern = AceType::DynamicCast<SearchPattern>(pattern);
1606         CHECK_NULL_VOID(searchPattern);
1607         searchPattern->UpdateChangeEvent(value + previewText.value);
1608     };
1609     eventHub->SetOnChange(std::move(searchChangeFunc));
1610 }
1611 
SetOnCopy(FrameNode * frameNode,std::function<void (const std::string &)> && func)1612 void SearchModelNG::SetOnCopy(FrameNode* frameNode, std::function<void(const std::string&)>&& func)
1613 {
1614     CHECK_NULL_VOID(frameNode);
1615     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1616     CHECK_NULL_VOID(searchTextField);
1617     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1618     CHECK_NULL_VOID(eventHub);
1619     eventHub->SetOnCopy(std::move(func));
1620 }
1621 
SetOnCut(FrameNode * frameNode,std::function<void (const std::string &)> && func)1622 void SearchModelNG::SetOnCut(FrameNode* frameNode, std::function<void(const std::string&)>&& func)
1623 {
1624     CHECK_NULL_VOID(frameNode);
1625     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1626     CHECK_NULL_VOID(searchTextField);
1627     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1628     CHECK_NULL_VOID(eventHub);
1629     auto searchPasteFunc = [weak = AceType::WeakClaim(AceType::RawPtr(searchTextField)), func](
1630                                const std::string& value) {
1631         if (func) {
1632             func(value);
1633         }
1634         auto node = weak.Upgrade();
1635         if (node) {
1636             node->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
1637         }
1638     };
1639     eventHub->SetOnCut(std::move(searchPasteFunc));
1640 }
1641 
SetOnPasteWithEvent(FrameNode * frameNode,std::function<void (const std::string &,NG::TextCommonEvent &)> && func)1642 void SearchModelNG::SetOnPasteWithEvent(FrameNode* frameNode,
1643     std::function<void(const std::string&, NG::TextCommonEvent&)>&& func)
1644 {
1645     CHECK_NULL_VOID(frameNode);
1646     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1647     CHECK_NULL_VOID(searchTextField);
1648     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1649     CHECK_NULL_VOID(eventHub);
1650 
1651     auto searchPasteFunc = [weak = AceType::WeakClaim(AceType::RawPtr(searchTextField)), func](
1652                                const std::string& value, NG::TextCommonEvent& info) {
1653         if (func) {
1654             func(value, info);
1655         }
1656         auto node = weak.Upgrade();
1657         if (node) {
1658             node->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF);
1659         }
1660     };
1661     eventHub->SetOnPasteWithEvent(std::move(searchPasteFunc));
1662 }
1663 
SetMaxLength(FrameNode * frameNode,uint32_t value)1664 void SearchModelNG::SetMaxLength(FrameNode* frameNode, uint32_t value)
1665 {
1666     CHECK_NULL_VOID(frameNode);
1667     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1668     CHECK_NULL_VOID(textFieldChild);
1669     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1670     CHECK_NULL_VOID(textFieldLayoutProperty);
1671     textFieldLayoutProperty->UpdateMaxLength(value);
1672     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1673 }
1674 
ResetMaxLength(FrameNode * frameNode)1675 void SearchModelNG::ResetMaxLength(FrameNode* frameNode)
1676 {
1677     CHECK_NULL_VOID(frameNode);
1678     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1679     CHECK_NULL_VOID(textFieldChild);
1680     auto textFieldLayoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1681     CHECK_NULL_VOID(textFieldLayoutProperty);
1682     textFieldLayoutProperty->ResetMaxLength();
1683     textFieldChild->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1684 }
1685 
SetType(FrameNode * frameNode,TextInputType value)1686 void SearchModelNG::SetType(FrameNode* frameNode, TextInputType value)
1687 {
1688     CHECK_NULL_VOID(frameNode);
1689     auto textFieldHost = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1690     CHECK_NULL_VOID(textFieldHost);
1691     auto layoutProperty = textFieldHost->GetLayoutProperty<TextFieldLayoutProperty>();
1692     CHECK_NULL_VOID(layoutProperty);
1693     if (layoutProperty->HasTextInputType() && layoutProperty->GetTextInputTypeValue() != value) {
1694         layoutProperty->UpdateTypeChanged(true);
1695     }
1696     layoutProperty->UpdateTextInputType(value);
1697     textFieldHost->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
1698 }
1699 
SetOnEditChange(FrameNode * frameNode,std::function<void (bool)> && func)1700 void SearchModelNG::SetOnEditChange(FrameNode* frameNode, std::function<void(bool)>&& func)
1701 {
1702     CHECK_NULL_VOID(frameNode);
1703     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1704     CHECK_NULL_VOID(textFieldChild);
1705     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
1706     CHECK_NULL_VOID(textFieldEventHub);
1707     textFieldEventHub->SetOnEditChanged(std::move(func));
1708 }
1709 
SetOnTextSelectionChange(FrameNode * frameNode,std::function<void (int32_t,int32_t)> && func)1710 void SearchModelNG::SetOnTextSelectionChange(FrameNode* frameNode, std::function<void(int32_t, int32_t)>&& func)
1711 {
1712     CHECK_NULL_VOID(frameNode);
1713     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1714     CHECK_NULL_VOID(textFieldChild);
1715     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
1716     CHECK_NULL_VOID(textFieldEventHub);
1717     textFieldEventHub->SetOnSelectionChange(std::move(func));
1718 }
1719 
SetOnContentScroll(FrameNode * frameNode,std::function<void (float,float)> && func)1720 void SearchModelNG::SetOnContentScroll(FrameNode* frameNode, std::function<void(float, float)>&& func)
1721 {
1722     CHECK_NULL_VOID(frameNode);
1723     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1724     CHECK_NULL_VOID(textFieldChild);
1725     auto textFieldEventHub = textFieldChild->GetEventHub<TextFieldEventHub>();
1726     CHECK_NULL_VOID(textFieldEventHub);
1727     textFieldEventHub->SetOnScrollChangeEvent(std::move(func));
1728 }
1729 
SetShowCounter(FrameNode * frameNode,bool value)1730 void SearchModelNG::SetShowCounter(FrameNode* frameNode, bool value)
1731 {
1732     CHECK_NULL_VOID(frameNode);
1733     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1734     CHECK_NULL_VOID(textFieldChild);
1735     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1736     CHECK_NULL_VOID(pattern);
1737     pattern->SetCounterState(false);
1738     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowCounter, value, textFieldChild);
1739 }
1740 
SetCounterType(FrameNode * frameNode,int32_t value)1741 void SearchModelNG::SetCounterType(FrameNode* frameNode, int32_t value)
1742 {
1743     CHECK_NULL_VOID(frameNode);
1744     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1745     CHECK_NULL_VOID(textFieldChild);
1746     auto layoutProperty = textFieldChild->GetLayoutProperty<TextFieldLayoutProperty>();
1747     CHECK_NULL_VOID(layoutProperty);
1748     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, SetCounter, value, textFieldChild);
1749 }
1750 
SetShowCounterBorder(FrameNode * frameNode,bool value)1751 void SearchModelNG::SetShowCounterBorder(FrameNode* frameNode, bool value)
1752 {
1753     CHECK_NULL_VOID(frameNode);
1754     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1755     CHECK_NULL_VOID(textFieldChild);
1756     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1757     CHECK_NULL_VOID(pattern);
1758     pattern->SetCounterState(false);
1759     ACE_UPDATE_NODE_LAYOUT_PROPERTY(TextFieldLayoutProperty, ShowHighlightBorder, value, textFieldChild);
1760 }
1761 
GetSearchController(FrameNode * frameNode)1762 RefPtr<TextFieldControllerBase> SearchModelNG::GetSearchController(FrameNode* frameNode)
1763 {
1764     auto pattern = frameNode->GetPattern<SearchPattern>();
1765     CHECK_NULL_RETURN(pattern, nullptr);
1766     return pattern->GetSearchController();
1767 }
1768 
SetOnWillInsertValueEvent(FrameNode * frameNode,std::function<bool (const InsertValueInfo &)> && func)1769 void SearchModelNG::SetOnWillInsertValueEvent(FrameNode* frameNode, std::function<bool(const InsertValueInfo&)>&& func)
1770 {
1771     CHECK_NULL_VOID(frameNode);
1772     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1773     CHECK_NULL_VOID(searchTextField);
1774     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1775     CHECK_NULL_VOID(eventHub);
1776     eventHub->SetOnWillInsertValueEvent(std::move(func));
1777 }
1778 
SetOnDidInsertValueEvent(FrameNode * frameNode,std::function<void (const InsertValueInfo &)> && func)1779 void SearchModelNG::SetOnDidInsertValueEvent(FrameNode* frameNode, std::function<void(const InsertValueInfo&)>&& func)
1780 {
1781     CHECK_NULL_VOID(frameNode);
1782     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1783     CHECK_NULL_VOID(searchTextField);
1784     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1785     CHECK_NULL_VOID(eventHub);
1786     eventHub->SetOnDidInsertValueEvent(std::move(func));
1787 }
1788 
SetOnWillDeleteEvent(FrameNode * frameNode,std::function<bool (const DeleteValueInfo &)> && func)1789 void SearchModelNG::SetOnWillDeleteEvent(FrameNode* frameNode, std::function<bool(const DeleteValueInfo&)>&& func)
1790 {
1791     CHECK_NULL_VOID(frameNode);
1792     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1793     CHECK_NULL_VOID(searchTextField);
1794     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1795     CHECK_NULL_VOID(eventHub);
1796     eventHub->SetOnWillDeleteEvent(std::move(func));
1797 }
1798 
SetOnDidDeleteEvent(FrameNode * frameNode,std::function<void (const DeleteValueInfo &)> && func)1799 void SearchModelNG::SetOnDidDeleteEvent(FrameNode* frameNode, std::function<void(const DeleteValueInfo&)>&& func)
1800 {
1801     CHECK_NULL_VOID(frameNode);
1802     auto searchTextField = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1803     CHECK_NULL_VOID(searchTextField);
1804     auto eventHub = searchTextField->GetEventHub<TextFieldEventHub>();
1805     CHECK_NULL_VOID(eventHub);
1806     eventHub->SetOnDidDeleteEvent(std::move(func));
1807 }
1808 
OnCreateMenuCallbackUpdate(FrameNode * frameNode,const NG::OnCreateMenuCallback && onCreateMenuCallback)1809 void SearchModelNG::OnCreateMenuCallbackUpdate(
1810     FrameNode* frameNode, const NG::OnCreateMenuCallback&& onCreateMenuCallback)
1811 {
1812     CHECK_NULL_VOID(frameNode);
1813     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1814     CHECK_NULL_VOID(textFieldChild);
1815     auto textFieldPattern = textFieldChild->GetPattern<TextFieldPattern>();
1816     CHECK_NULL_VOID(textFieldPattern);
1817     textFieldPattern->OnCreateMenuCallbackUpdate(std::move(onCreateMenuCallback));
1818 }
1819 
OnMenuItemClickCallbackUpdate(FrameNode * frameNode,const NG::OnMenuItemClickCallback && onMenuItemClick)1820 void SearchModelNG::OnMenuItemClickCallbackUpdate(
1821     FrameNode* frameNode, const NG::OnMenuItemClickCallback&& onMenuItemClick)
1822 {
1823     CHECK_NULL_VOID(frameNode);
1824     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1825     CHECK_NULL_VOID(textFieldChild);
1826     auto textFieldPattern = textFieldChild->GetPattern<TextFieldPattern>();
1827     CHECK_NULL_VOID(textFieldPattern);
1828     textFieldPattern->OnMenuItemClickCallbackUpdate(std::move(onMenuItemClick));
1829 }
1830 
SetEnablePreviewText(FrameNode * frameNode,bool enablePreviewText)1831 void SearchModelNG::SetEnablePreviewText(FrameNode* frameNode, bool enablePreviewText)
1832 {
1833     CHECK_NULL_VOID(frameNode);
1834     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1835     CHECK_NULL_VOID(textFieldChild);
1836     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1837     CHECK_NULL_VOID(pattern);
1838     pattern->SetSupportPreviewText(enablePreviewText);
1839 }
1840 
SetId(FrameNode * frameNode,const std::string & id)1841 void SearchModelNG::SetId(FrameNode* frameNode, const std::string& id)
1842 {
1843     NG::ViewAbstract::SetInspectorId(frameNode, id);
1844     UpdateInnerInspector(frameNode, id);
1845 }
1846 
SetEnableHapticFeedback(FrameNode * frameNode,bool state)1847 void SearchModelNG::SetEnableHapticFeedback(FrameNode* frameNode, bool state)
1848 {
1849     CHECK_NULL_VOID(frameNode);
1850     CHECK_NULL_VOID(!frameNode->GetChildren().empty());
1851     auto textFieldChild = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1852     CHECK_NULL_VOID(textFieldChild);
1853     auto pattern = textFieldChild->GetPattern<TextFieldPattern>();
1854     CHECK_NULL_VOID(pattern);
1855     pattern->SetEnableHapticFeedback(state);
1856 }
1857 } // namespace OHOS::Ace::NG
1858