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