1 /*
2  * Copyright (c) 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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_search_bridge.h"
16 
17 #include "base/geometry/dimension.h"
18 #include "core/components/common/layout/constants.h"
19 #include "core/components/text_field/textfield_theme.h"
20 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 #include "core/components/search/search_theme.h"
22 #include "base/utils/string_utils.h"
23 #include "base/utils/utils.h"
24 #include "base/memory/ace_type.h"
25 #include "frameworks/core/components_ng/pattern/search/search_model_ng.h"
26 #include "frameworks/bridge/declarative_frontend/jsview/js_text_editable_controller.h"
27 #include "frameworks/bridge/declarative_frontend/jsview/js_textfield.h"
28 #include "frameworks/bridge/declarative_frontend/jsview/js_utils.h"
29 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
30 #include "frameworks/core/components_ng/pattern/text_field/text_field_model.h"
31 
32 namespace OHOS::Ace::NG {
33 constexpr int NUM_0 = 0;
34 constexpr int NUM_1 = 1;
35 constexpr int NUM_2 = 2;
36 constexpr int NUM_3 = 3;
37 constexpr int NUM_4 = 4;
38 constexpr int PARAM_ARR_LENGTH_1 = 1;
39 constexpr int PARAM_ARR_LENGTH_2 = 2;
40 constexpr uint32_t ILLEGAL_VALUE = 0;
41 constexpr uint32_t DEFAULT_MODE = -1;
42 const int32_t MINI_VALID_VALUE = 1;
43 const int32_t MAX_VALID_VALUE = 100;
44 const std::vector<TextAlign> TEXT_ALIGNS = { TextAlign::START, TextAlign::CENTER, TextAlign::END };
45 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
46 
SetSearchInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)47 ArkUINativeModuleValue SearchBridge::SetSearchInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
48 {
49     EcmaVM* vm = runtimeCallInfo->GetVM();
50     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
51     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
52     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
53     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
54     Local<JSValueRef> fourArg = runtimeCallInfo->GetCallArgRef(NUM_3);
55     Local<JSValueRef> fiveArg = runtimeCallInfo->GetCallArgRef(NUM_4);
56     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
57 
58     if (!secondArg->IsNull() && !secondArg->IsUndefined() && secondArg->IsString(vm)) {
59         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
60         GetArkUINodeModifiers()->getSearchModifier()->setSearchValue(nativeNode, stringValue.c_str());
61     }
62     if (!threeArg->IsNull() && !threeArg->IsUndefined() && threeArg->IsString(vm)) {
63         std::string stringPlaceholder = threeArg->ToString(vm)->ToString(vm);
64         GetArkUINodeModifiers()->getSearchModifier()->setSearchPlaceholder(nativeNode, stringPlaceholder.c_str());
65     }
66     if (!fourArg->IsNull() && !fourArg->IsUndefined() && fourArg->IsString(vm)) {
67         std::string stringIcon = fourArg->ToString(vm)->ToString(vm);
68         GetArkUINodeModifiers()->getSearchModifier()->setSearchIcon(nativeNode, stringIcon.c_str());
69     }
70     Framework::JSTextEditableController* jsController = nullptr;
71     if (!fiveArg->IsNull() && !fiveArg->IsUndefined()) {
72         Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
73         jsController =
74             Framework::JSRef<Framework::JSObject>::Cast(info[4])->Unwrap<Framework::JSTextEditableController>();
75     }
76     auto nodePtr = GetArkUINodeModifiers()->getSearchModifier()->getSearchController(nativeNode);
77     auto node = AceType::Claim(reinterpret_cast<OHOS::Ace::TextFieldControllerBase*>(nodePtr));
78 
79     if (jsController) {
80         jsController->SetController(node);
81     }
82     SearchModel::GetInstance()->SetFocusable(true);
83     SearchModel::GetInstance()->SetFocusNode(true);
84     return panda::JSValueRef::Undefined(vm);
85 }
86 
ResetSearchInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)87 ArkUINativeModuleValue SearchBridge::ResetSearchInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
88 {
89     EcmaVM* vm = runtimeCallInfo->GetVM();
90     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
91     SearchModel::GetInstance()->SetFocusable(true);
92     SearchModel::GetInstance()->SetFocusNode(true);
93     return panda::JSValueRef::Undefined(vm);
94 }
95 
SetTextFont(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue SearchBridge::SetTextFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
97 {
98     EcmaVM* vm = runtimeCallInfo->GetVM();
99     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
100     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
101     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
102     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
103     Local<JSValueRef> fourArg = runtimeCallInfo->GetCallArgRef(NUM_3);
104     Local<JSValueRef> fiveArg = runtimeCallInfo->GetCallArgRef(NUM_4);
105     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
106 
107     const char* fontFamilies[1];
108     struct ArkUIFontStruct value = {
109         0.0, 0, static_cast<ArkUI_Int32>(FontWeight::NORMAL), INVALID_FONT_STYLE, fontFamilies, 0 };
110     auto container = Container::Current();
111     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
112     auto pipelineContext = container->GetPipelineContext();
113     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
114     auto themeManager = pipelineContext->GetThemeManager();
115     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
116     auto theme = themeManager->GetTheme<SearchTheme>();
117     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
118     auto themeFontSize = theme->GetFontSize();
119     CalcDimension size = themeFontSize;
120     if (secondArg->IsNull() || secondArg->IsUndefined() ||
121         !ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, size) || size.Unit() == DimensionUnit::PERCENT
122         || LessNotEqual(size.Value(), 0.0)) {
123         value.fontSizeNumber = themeFontSize.Value();
124         value.fontSizeUnit = static_cast<int8_t>(themeFontSize.Unit());
125     } else {
126         ArkTSUtils::ParseJsDimensionFp(vm, secondArg, size);
127         value.fontSizeNumber = size.Value();
128         value.fontSizeUnit = static_cast<int8_t>(size.Unit());
129     }
130 
131     if (threeArg->IsString(vm) || threeArg->IsNumber()) {
132         if (threeArg->IsString(vm)) {
133             auto weightStr = threeArg->ToString(vm)->ToString(vm);
134             value.fontWeight = static_cast<ArkUI_Int32>(OHOS::Ace::Framework::ConvertStrToFontWeight(weightStr));
135         }
136 
137         if (threeArg->IsNumber()) {
138             auto weightStr = std::to_string(threeArg->Int32Value(vm));
139             value.fontWeight =
140                 static_cast<ArkUI_Int32>(OHOS::Ace::Framework::ConvertStrToFontWeight(weightStr, FontWeight::W400));
141         }
142     }
143 
144     if (fourArg->IsString(vm)) {
145         auto familyStr = fourArg->ToString(vm)->ToString(vm);
146         value.fontFamilies[0] = familyStr.c_str();
147         value.familyLength = 1;
148     }
149 
150     if (!fiveArg->IsNull() && fiveArg->IsNumber()) {
151         value.fontStyle = fiveArg->Int32Value(vm);
152     }
153 
154     GetArkUINodeModifiers()->getSearchModifier()->setSearchTextFont(nativeNode, &value);
155     return panda::JSValueRef::Undefined(vm);
156 }
157 
ResetTextFont(ArkUIRuntimeCallInfo * runtimeCallInfo)158 ArkUINativeModuleValue SearchBridge::ResetTextFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
159 {
160     EcmaVM* vm = runtimeCallInfo->GetVM();
161     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
162     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
163     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
164     GetArkUINodeModifiers()->getSearchModifier()->resetSearchTextFont(nativeNode);
165     return panda::JSValueRef::Undefined(vm);
166 }
167 
SetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)168 ArkUINativeModuleValue SearchBridge::SetPlaceholderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
169 {
170     EcmaVM* vm = runtimeCallInfo->GetVM();
171     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
172     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
173     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
174     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
175     Color color;
176     uint32_t result;
177     if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
178         result = color.GetValue();
179         GetArkUINodeModifiers()->getSearchModifier()->setSearchPlaceholderColor(nativeNode, result);
180     } else {
181         GetArkUINodeModifiers()->getSearchModifier()->resetSearchPlaceholderColor(nativeNode);
182     }
183     return panda::JSValueRef::Undefined(vm);
184 }
ResetPlaceholderColor(ArkUIRuntimeCallInfo * runtimeCallInfo)185 ArkUINativeModuleValue SearchBridge::ResetPlaceholderColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
186 {
187     EcmaVM* vm = runtimeCallInfo->GetVM();
188     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
189     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
190     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
191     GetArkUINodeModifiers()->getSearchModifier()->resetSearchPlaceholderColor(nativeNode);
192     return panda::JSValueRef::Undefined(vm);
193 }
194 
SetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)195 ArkUINativeModuleValue SearchBridge::SetSelectionMenuHidden(ArkUIRuntimeCallInfo* runtimeCallInfo)
196 {
197     EcmaVM* vm = runtimeCallInfo->GetVM();
198     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
199     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
200     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
201     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
202     if (secondArg->IsBoolean()) {
203         uint32_t selectionMenuHidden = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
204         GetArkUINodeModifiers()->getSearchModifier()->setSearchSelectionMenuHidden(nativeNode, selectionMenuHidden);
205     } else {
206         GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuHidden(nativeNode);
207     }
208     return panda::JSValueRef::Undefined(vm);
209 }
210 
ResetSelectionMenuHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue SearchBridge::ResetSelectionMenuHidden(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213     EcmaVM* vm = runtimeCallInfo->GetVM();
214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuHidden(nativeNode);
218     return panda::JSValueRef::Undefined(vm);
219 }
220 
SetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue SearchBridge::SetCaretStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223     EcmaVM* vm = runtimeCallInfo->GetVM();
224     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
226     Local<JSValueRef> caretWidthArg = runtimeCallInfo->GetCallArgRef(NUM_1);
227     Local<JSValueRef> caretColorArg = runtimeCallInfo->GetCallArgRef(NUM_2);
228     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
229 
230     auto textFieldTheme = ArkTSUtils::GetTheme<TextFieldTheme>();
231     CHECK_NULL_RETURN(textFieldTheme, panda::JSValueRef::Undefined(vm));
232     CalcDimension caretWidth = textFieldTheme->GetCursorWidth();
233     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, caretWidthArg, caretWidth, false) ||
234             LessNotEqual(caretWidth.Value(), 0.0)) {
235         caretWidth = textFieldTheme->GetCursorWidth();
236     }
237     Color color;
238     uint32_t caretColor;
239     if (ArkTSUtils::ParseJsColorAlpha(vm, caretColorArg, color)) {
240         caretColor = color.GetValue();
241     } else {
242         caretColor = textFieldTheme->GetCursorColor().GetValue();
243     }
244     GetArkUINodeModifiers()->getSearchModifier()->setSearchCaretStyle(
245         nativeNode, caretWidth.Value(), static_cast<int8_t>(caretWidth.Unit()), caretColor);
246     return panda::JSValueRef::Undefined(vm);
247 }
248 
ResetCaretStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue SearchBridge::ResetCaretStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
254     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
255     GetArkUINodeModifiers()->getSearchModifier()->resetSearchCaretStyle(nativeNode);
256     return panda::JSValueRef::Undefined(vm);
257 }
258 
SetSearchTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue SearchBridge::SetSearchTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261     EcmaVM* vm = runtimeCallInfo->GetVM();
262     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
263     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
264     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266 
267     if (secondArg->IsNumber()) {
268         int32_t value = secondArg->Int32Value(vm);
269         if (value >= 0 && value < static_cast<int32_t>(TEXT_ALIGNS.size())) {
270             GetArkUINodeModifiers()->getSearchModifier()->setSearchTextAlign(nativeNode, value);
271         }
272     }
273     return panda::JSValueRef::Undefined(vm);
274 }
275 
ResetSearchTextAlign(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue SearchBridge::ResetSearchTextAlign(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278     EcmaVM* vm = runtimeCallInfo->GetVM();
279     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
281     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
282     GetArkUINodeModifiers()->getSearchModifier()->resetSearchTextAlign(nativeNode);
283     return panda::JSValueRef::Undefined(vm);
284 }
285 
ConvertStrToCancelButtonStyle(const std::string & value)286 static CancelButtonStyle ConvertStrToCancelButtonStyle(const std::string& value)
287 {
288     if (value == "CONSTANT") {
289         return CancelButtonStyle::CONSTANT;
290     } else if (value == "INVISIBLE") {
291         return CancelButtonStyle::INVISIBLE;
292     } else {
293         return CancelButtonStyle::INPUT;
294     }
295 }
296 
SetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)297 ArkUINativeModuleValue SearchBridge::SetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
298 {
299     EcmaVM* vm = runtimeCallInfo->GetVM();
300     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
301     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
302     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
303     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
304     Local<JSValueRef> forthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
305     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
306     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
307     auto container = Container::Current();
308     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
309     auto pipelineContext = container->GetPipelineContext();
310     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
311     auto themeManager = pipelineContext->GetThemeManager();
312     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
313     auto theme = themeManager->GetTheme<SearchTheme>();
314     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
315     int32_t style = static_cast<int32_t>(theme->GetCancelButtonStyle());
316     if (secondArg->IsString(vm)) {
317         CancelButtonStyle cancelButtonStyle = ConvertStrToCancelButtonStyle(secondArg->ToString(vm)->ToString(vm));
318         style = static_cast<int32_t>(cancelButtonStyle);
319     }
320     struct ArkUISizeType size = {0.0, 0};
321     CalcDimension iconSize;
322     if (!thirdArg->IsUndefined() && !thirdArg->IsNull() &&
323         ArkTSUtils::ParseJsDimensionVpNG(vm, thirdArg, iconSize, false)) {
324         if (LessNotEqual(iconSize.Value(), 0.0) || iconSize.Unit() == DimensionUnit::PERCENT) {
325             iconSize = theme->GetIconHeight();
326         }
327     } else {
328         iconSize = theme->GetIconHeight();
329     }
330     size.value = iconSize.Value();
331     size.unit = static_cast<int8_t>(iconSize.Unit());
332     Color value;
333     uint32_t color;
334     if (!forthArg->IsUndefined() && !forthArg->IsNull() &&
335         ArkTSUtils::ParseJsColorAlpha(vm, forthArg, value)) {
336         color = value.GetValue();
337     } else {
338         color = theme->GetSearchIconColor().GetValue();
339     }
340     std::string srcStr;
341     if (fifthArg->IsUndefined() || fifthArg->IsNull() ||
342         !ArkTSUtils::ParseJsMedia(vm, fifthArg, srcStr)) {
343         srcStr = "";
344     }
345     const char* src = srcStr.c_str();
346     GetArkUINodeModifiers()->getSearchModifier()->setSearchCancelButton(nativeNode, style, &size, color, src);
347     return panda::JSValueRef::Undefined(vm);
348 }
349 
ResetCancelButton(ArkUIRuntimeCallInfo * runtimeCallInfo)350 ArkUINativeModuleValue SearchBridge::ResetCancelButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
351 {
352     EcmaVM* vm = runtimeCallInfo->GetVM();
353     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
354     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
355     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
356     GetArkUINodeModifiers()->getSearchModifier()->resetSearchCancelButton(nativeNode);
357     return panda::JSValueRef::Undefined(vm);
358 }
359 
SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)360 ArkUINativeModuleValue SearchBridge::SetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo* runtimeCallInfo)
361 {
362     EcmaVM* vm = runtimeCallInfo->GetVM();
363     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
364     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
365     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
366     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
367 
368     if (secondArg->IsBoolean()) {
369         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
370         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnableKeyboardOnFocus(nativeNode, value);
371     } else {
372         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableKeyboardOnFocus(nativeNode);
373     }
374 
375     return panda::JSValueRef::Undefined(vm);
376 }
377 
ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)378 ArkUINativeModuleValue SearchBridge::ResetEnableKeyboardOnFocus(ArkUIRuntimeCallInfo* runtimeCallInfo)
379 {
380     EcmaVM* vm = runtimeCallInfo->GetVM();
381     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
382     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
383     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
384     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableKeyboardOnFocus(nativeNode);
385     return panda::JSValueRef::Undefined(vm);
386 }
387 
SetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)388 ArkUINativeModuleValue SearchBridge::SetPlaceholderFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
389 {
390     EcmaVM* vm = runtimeCallInfo->GetVM();
391     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
392     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
393     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
394     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
395     Local<JSValueRef> fourArg = runtimeCallInfo->GetCallArgRef(NUM_3);
396     Local<JSValueRef> fiveArg = runtimeCallInfo->GetCallArgRef(NUM_4);
397     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
398 
399     const char* fontFamilies[1];
400     struct ArkUIFontStruct value = {
401         0.0, 0, static_cast<ArkUI_Int32>(FontWeight::NORMAL), INVALID_FONT_STYLE, fontFamilies, 0 };
402     auto container = Container::Current();
403     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
404     auto pipelineContext = container->GetPipelineContext();
405     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
406     auto themeManager = pipelineContext->GetThemeManager();
407     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
408     auto theme = themeManager->GetTheme<SearchTheme>();
409     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
410     auto themeFontSize = theme->GetFontSize();
411     CalcDimension size;
412     if (secondArg->IsNull() || secondArg->IsUndefined() ||
413         !ArkTSUtils::ParseJsDimensionFp(vm, secondArg, size) || size.Unit() == DimensionUnit::PERCENT) {
414         value.fontSizeNumber = themeFontSize.Value();
415         value.fontSizeUnit = static_cast<int8_t>(themeFontSize.Unit());
416     } else {
417         value.fontSizeNumber = size.Value();
418         value.fontSizeUnit = static_cast<int8_t>(size.Unit());
419     }
420 
421     if (threeArg->IsString(vm) || threeArg->IsNumber()) {
422         if (threeArg->IsString(vm)) {
423             auto weightStr = threeArg->ToString(vm)->ToString(vm);
424             value.fontWeight = static_cast<ArkUI_Int32>(OHOS::Ace::Framework::ConvertStrToFontWeight(weightStr));
425         }
426 
427         if (threeArg->IsNumber()) {
428             auto weightStr = std::to_string(threeArg->Int32Value(vm));
429             value.fontWeight =
430                 static_cast<ArkUI_Int32>(OHOS::Ace::Framework::ConvertStrToFontWeight(weightStr, FontWeight::W400));
431         }
432     }
433 
434     if (fourArg->IsString(vm)) {
435         auto familyStr = fourArg->ToString(vm)->ToString(vm);
436         value.fontFamilies[0] = familyStr.c_str();
437         value.familyLength = 1;
438     }
439 
440     if (!fiveArg->IsNull() && fiveArg->IsNumber()) {
441         value.fontStyle = fiveArg->Int32Value(vm);
442     }
443     GetArkUINodeModifiers()->getSearchModifier()->setSearchPlaceholderFont(nativeNode, &value);
444     return panda::JSValueRef::Undefined(vm);
445 }
446 
ResetPlaceholderFont(ArkUIRuntimeCallInfo * runtimeCallInfo)447 ArkUINativeModuleValue SearchBridge::ResetPlaceholderFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
448 {
449     EcmaVM* vm = runtimeCallInfo->GetVM();
450     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
451     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
452     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
453     GetArkUINodeModifiers()->getSearchModifier()->resetSearchPlaceholderFont(nativeNode);
454     return panda::JSValueRef::Undefined(vm);
455 }
456 
SetSearchIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue SearchBridge::SetSearchIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459     EcmaVM* vm = runtimeCallInfo->GetVM();
460     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
462     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
463     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
464     Local<JSValueRef> fourArg = runtimeCallInfo->GetCallArgRef(NUM_3);
465     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
466 
467     struct ArkUIIconOptionsStruct value = {0.0, 0, INVALID_COLOR_VALUE, nullptr};
468 
469     CalcDimension size;
470     auto container = Container::Current();
471     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
472     auto pipelineContext = container->GetPipelineContext();
473     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
474     auto themeManager = pipelineContext->GetThemeManager();
475     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
476     auto theme = themeManager->GetTheme<SearchTheme>();
477     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
478     if (!secondArg->IsUndefined() && !secondArg->IsNull() &&
479         ArkTSUtils::ParseJsDimensionVpNG(vm, secondArg, size, false)) {
480         if (LessNotEqual(size.Value(), 0.0) || size.Unit() == DimensionUnit::PERCENT) {
481             size = theme->GetIconHeight();
482         }
483     } else {
484         size = theme->GetIconHeight();
485     }
486     value.value = size.Value();
487     value.unit = static_cast<int8_t>(size.Unit());
488 
489     Color color;
490     if (ArkTSUtils::ParseJsColorAlpha(vm, threeArg, color)) {
491         value.color = static_cast<int32_t>(color.GetValue());
492     } else {
493         value.color = INVALID_COLOR_VALUE;
494     }
495 
496     std::string srcStr;
497     if (fourArg->IsUndefined() || fourArg->IsNull() || !ArkTSUtils::ParseJsMedia(vm, fourArg, srcStr)) {
498         srcStr = "";
499     }
500     value.src = srcStr.c_str();
501 
502     GetArkUINodeModifiers()->getSearchModifier()->setSearchSearchIcon(nativeNode, &value);
503     return panda::JSValueRef::Undefined(vm);
504 }
505 
ResetSearchIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)506 ArkUINativeModuleValue SearchBridge::ResetSearchIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
507 {
508     EcmaVM* vm = runtimeCallInfo->GetVM();
509     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
510     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
511     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
512     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSearchIcon(nativeNode);
513     return panda::JSValueRef::Undefined(vm);
514 }
515 
SetSearchButton(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue SearchBridge::SetSearchButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
517 {
518     EcmaVM* vm = runtimeCallInfo->GetVM();
519     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
520     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
521     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
522     Local<JSValueRef> threeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
523     Local<JSValueRef> fourArg = runtimeCallInfo->GetCallArgRef(NUM_3);
524     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
525 
526     struct ArkUISearchButtonOptionsStruct value = {"", 0.0, 0, INVALID_COLOR_VALUE};
527 
528     std::string valueString = "";
529     if (secondArg->IsString(vm)) {
530         valueString = secondArg->ToString(vm)->ToString(vm);
531         value.value = valueString.c_str();
532     }
533 
534     auto container = Container::Current();
535     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
536     auto pipelineContext = container->GetPipelineContext();
537     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
538     auto themeManager = pipelineContext->GetThemeManager();
539     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
540     auto theme = themeManager->GetTheme<SearchTheme>();
541     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
542     CalcDimension size = theme->GetFontSize();
543     if (ArkTSUtils::ParseJsDimensionVpNG(vm, threeArg, size) && size.Unit() != DimensionUnit::PERCENT &&
544         GreatOrEqual(size.Value(), 0.0)) {
545         ArkTSUtils::ParseJsDimensionFp(vm, threeArg, size);
546     } else {
547         size = theme->GetFontSize();
548     }
549     value.sizeValue = size.Value();
550     value.sizeUnit = static_cast<int8_t>(size.Unit());
551 
552     Color fontColor;
553     if (ArkTSUtils::ParseJsColorAlpha(vm, fourArg, fontColor)) {
554         value.fontColor = static_cast<int32_t>(fontColor.GetValue());
555     } else {
556         value.fontColor = static_cast<int32_t>(theme->GetSearchButtonTextColor().GetValue());
557     }
558     GetArkUINodeModifiers()->getSearchModifier()->setSearchSearchButton(nativeNode, &value);
559     return panda::JSValueRef::Undefined(vm);
560 }
561 
ResetSearchButton(ArkUIRuntimeCallInfo * runtimeCallInfo)562 ArkUINativeModuleValue SearchBridge::ResetSearchButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
563 {
564     EcmaVM* vm = runtimeCallInfo->GetVM();
565     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
566     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
567     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
568     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSearchButton(nativeNode);
569     return panda::JSValueRef::Undefined(vm);
570 }
571 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)572 ArkUINativeModuleValue SearchBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
573 {
574     EcmaVM* vm = runtimeCallInfo->GetVM();
575     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
576     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
577     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
578     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
579     auto container = Container::Current();
580     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
581     auto pipelineContext = container->GetPipelineContext();
582     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
583     auto themeManager = pipelineContext->GetThemeManager();
584     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
585     auto theme = themeManager->GetTheme<SearchTheme>();
586     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
587     Color value;
588     uint32_t color = theme->GetTextColor().GetValue();
589     if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, value)) {
590         color = value.GetValue();
591     }
592     GetArkUINodeModifiers()->getSearchModifier()->setSearchFontColor(nativeNode, color);
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue SearchBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
600     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
601     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
602     GetArkUINodeModifiers()->getSearchModifier()->resetSearchFontColor(nativeNode);
603     return panda::JSValueRef::Undefined(vm);
604 }
605 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)606 ArkUINativeModuleValue SearchBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
607 {
608     EcmaVM* vm = runtimeCallInfo->GetVM();
609     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
610     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
611     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
612     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
613 
614     auto copyOptions = CopyOptions::Local;
615     uint32_t value = static_cast<uint32_t>(copyOptions);
616     if (secondArg->IsNumber()) {
617         value = secondArg->Uint32Value(vm);
618     } else if (!secondArg->IsNumber() && !secondArg->IsUndefined()) {
619         copyOptions = CopyOptions::None;
620         value = static_cast<uint32_t>(copyOptions);
621     }
622     GetArkUINodeModifiers()->getSearchModifier()->setSearchCopyOption(nativeNode, value);
623     return panda::JSValueRef::Undefined(vm);
624 }
625 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)626 ArkUINativeModuleValue SearchBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
627 {
628     EcmaVM* vm = runtimeCallInfo->GetVM();
629     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
630     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
631     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
632     GetArkUINodeModifiers()->getSearchModifier()->resetSearchCopyOption(nativeNode);
633     return panda::JSValueRef::Undefined(vm);
634 }
635 
SetSearchEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)636 ArkUINativeModuleValue SearchBridge::SetSearchEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
637 {
638     EcmaVM *vm = runtimeCallInfo->GetVM();
639     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
640     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
641     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
642     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
643 
644     if (secondArg->IsNumber()) {
645         int32_t value = secondArg->Int32Value(vm);
646         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnterKeyType(nativeNode, value);
647     } else {
648         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnterKeyType(nativeNode);
649     }
650     return panda::JSValueRef::Undefined(vm);
651 }
652 
ResetSearchEnterKeyType(ArkUIRuntimeCallInfo * runtimeCallInfo)653 ArkUINativeModuleValue SearchBridge::ResetSearchEnterKeyType(ArkUIRuntimeCallInfo *runtimeCallInfo)
654 {
655     EcmaVM *vm = runtimeCallInfo->GetVM();
656     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
657     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
658     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
659     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnterKeyType(nativeNode);
660     return panda::JSValueRef::Undefined(vm);
661 }
662 
SetSearchHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)663 ArkUINativeModuleValue SearchBridge::SetSearchHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
664 {
665     EcmaVM* vm = runtimeCallInfo->GetVM();
666     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
667     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
668     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
669     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
670     CalcDimension height;
671     std::string calcStr;
672     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, valueArg, height)) {
673         GetArkUINodeModifiers()->getCommonModifier()->resetHeight(nativeNode);
674     } else {
675         if (LessNotEqual(height.Value(), 0.0)) {
676             height.SetValue(0.0);
677         }
678         if (height.Unit() == DimensionUnit::CALC) {
679             GetArkUINodeModifiers()->getCommonModifier()->setHeight(
680                 nativeNode, height.Value(), static_cast<int>(height.Unit()), height.CalcValue().c_str());
681         } else {
682             GetArkUINodeModifiers()->getCommonModifier()->setHeight(
683                 nativeNode, height.Value(), static_cast<int>(height.Unit()), calcStr.c_str());
684         }
685         GetArkUINodeModifiers()->getSearchModifier()->setSearchHeight(
686             nativeNode, height.Value(), static_cast<int>(height.Unit()));
687     }
688     return panda::JSValueRef::Undefined(vm);
689 }
690 
ResetSearchHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)691 ArkUINativeModuleValue SearchBridge::ResetSearchHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
692 {
693     EcmaVM* vm = runtimeCallInfo->GetVM();
694     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
695     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
696     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
697     GetArkUINodeModifiers()->getSearchModifier()->resetSearchHeight(nativeNode);
698     return panda::JSValueRef::Undefined(vm);
699 }
700 
SetSearchMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)701 ArkUINativeModuleValue SearchBridge::SetSearchMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
702 {
703     EcmaVM* vm = runtimeCallInfo->GetVM();
704     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
705     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
706     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
707     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
708     CalcDimension value;
709     auto pipelineContext = PipelineBase::GetCurrentContext();
710     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
711     auto theme = pipelineContext->GetTheme<SearchTheme>();
712     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
713     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
714         GetArkUINodeModifiers()->getSearchModifier()->resetSearchAdaptMinFontSize(nativeNode);
715     } else {
716         if (value.IsNegative()) {
717             value = theme->GetTextStyle().GetAdaptMinFontSize();
718         }
719         GetArkUINodeModifiers()->getSearchModifier()->setSearchAdaptMinFontSize(
720             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
721     }
722     return panda::JSValueRef::Undefined(vm);
723 }
724 
SetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)725 ArkUINativeModuleValue SearchBridge::SetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
726 {
727     EcmaVM* vm = runtimeCallInfo->GetVM();
728     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
730     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
732     if (secondArg->IsString(vm)) {
733         auto value = secondArg->ToString(vm)->ToString(vm);
734         GetArkUINodeModifiers()->getSearchModifier()->setSearchFontFeature(nativeNode, value.c_str());
735     } else {
736         GetArkUINodeModifiers()->getSearchModifier()->resetSearchFontFeature(nativeNode);
737     }
738     return panda::JSValueRef::Undefined(vm);
739 }
740 
ResetFontFeature(ArkUIRuntimeCallInfo * runtimeCallInfo)741 ArkUINativeModuleValue SearchBridge::ResetFontFeature(ArkUIRuntimeCallInfo* runtimeCallInfo)
742 {
743     EcmaVM* vm = runtimeCallInfo->GetVM();
744     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
745     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
746     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
747     GetArkUINodeModifiers()->getSearchModifier()->resetSearchFontFeature(nativeNode);
748     return panda::JSValueRef::Undefined(vm);
749 }
750 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)751 ArkUINativeModuleValue SearchBridge::SetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
752 {
753     EcmaVM* vm = runtimeCallInfo->GetVM();
754     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
755     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
756     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
757     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
758     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
759     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
760     auto container = Container::Current();
761     CHECK_NULL_RETURN(container, panda::JSValueRef::Undefined(vm));
762     auto pipelineContext = container->GetPipelineContext();
763     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
764     auto themeManager = pipelineContext->GetThemeManager();
765     CHECK_NULL_RETURN(themeManager, panda::JSValueRef::Undefined(vm));
766     auto theme = themeManager->GetTheme<SearchTheme>();
767     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
768     Color color = theme->GetTextStyle().GetTextDecorationColor();
769     int32_t searchDecoration = static_cast<int32_t>(theme->GetTextStyle().GetTextDecoration());
770     if (secondArg->IsInt()) {
771         searchDecoration = secondArg->Int32Value(vm);
772     }
773     ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, Color::BLACK);
774     int32_t textDecorationStyle = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
775     if (fourthArg->IsInt()) {
776         textDecorationStyle = fourthArg->Int32Value(vm);
777     }
778     GetArkUINodeModifiers()->getSearchModifier()->setSearchDecoration(
779         nativeNode, searchDecoration, color.GetValue(), textDecorationStyle);
780     return panda::JSValueRef::Undefined(vm);
781 }
782 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)783 ArkUINativeModuleValue SearchBridge::ResetDecoration(ArkUIRuntimeCallInfo* runtimeCallInfo)
784 {
785     EcmaVM* vm = runtimeCallInfo->GetVM();
786     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
787     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
788     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
789     GetArkUINodeModifiers()->getSearchModifier()->resetSearchDecoration(nativeNode);
790     return panda::JSValueRef::Undefined(vm);
791 }
792 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)793 ArkUINativeModuleValue SearchBridge::SetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
794 {
795     EcmaVM* vm = runtimeCallInfo->GetVM();
796     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
797     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
798     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
799     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
800     CalcDimension value;
801     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
802         GetArkUINodeModifiers()->getSearchModifier()->resetSearchLetterSpacing(nativeNode);
803     } else {
804         GetArkUINodeModifiers()->getSearchModifier()->setSearchLetterSpacing(
805             nativeNode, value.Value(), static_cast<int>(value.Unit()));
806     }
807     return panda::JSValueRef::Undefined(vm);
808 }
809 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)810 ArkUINativeModuleValue SearchBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo* runtimeCallInfo)
811 {
812     EcmaVM* vm = runtimeCallInfo->GetVM();
813     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
814     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
815     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
816     GetArkUINodeModifiers()->getSearchModifier()->resetSearchLetterSpacing(nativeNode);
817     return panda::JSValueRef::Undefined(vm);
818 }
819 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)820 ArkUINativeModuleValue SearchBridge::SetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
821 {
822     EcmaVM* vm = runtimeCallInfo->GetVM();
823     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
824     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
825     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
826     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
827     CalcDimension value;
828     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, true)) {
829         GetArkUINodeModifiers()->getSearchModifier()->resetSearchLineHeight(nativeNode);
830     } else {
831         if (value.IsNegative()) {
832             value.Reset();
833         }
834         GetArkUINodeModifiers()->getSearchModifier()->setSearchLineHeight(
835             nativeNode, value.Value(), static_cast<int>(value.Unit()));
836     }
837     return panda::JSValueRef::Undefined(vm);
838 }
839 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)840 ArkUINativeModuleValue SearchBridge::ResetLineHeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
841 {
842     EcmaVM* vm = runtimeCallInfo->GetVM();
843     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
844     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
845     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
846     GetArkUINodeModifiers()->getSearchModifier()->resetSearchLineHeight(nativeNode);
847     return panda::JSValueRef::Undefined(vm);
848 }
849 
ResetSearchMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)850 ArkUINativeModuleValue SearchBridge::ResetSearchMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
851 {
852     EcmaVM* vm = runtimeCallInfo->GetVM();
853     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
854     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
855     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
856     GetArkUINodeModifiers()->getSearchModifier()->resetSearchAdaptMinFontSize(nativeNode);
857     return panda::JSValueRef::Undefined(vm);
858 }
859 
SetSearchMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)860 ArkUINativeModuleValue SearchBridge::SetSearchMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
861 {
862     EcmaVM* vm = runtimeCallInfo->GetVM();
863     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
864     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
865     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
866     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
867     CalcDimension value;
868     auto pipelineContext = PipelineBase::GetCurrentContext();
869     CHECK_NULL_RETURN(pipelineContext, panda::NativePointerRef::New(vm, nullptr));
870     auto theme = pipelineContext->GetTheme<SearchTheme>();
871     CHECK_NULL_RETURN(theme, panda::NativePointerRef::New(vm, nullptr));
872     if (!ArkTSUtils::ParseJsDimensionNG(vm, valueArg, value, DimensionUnit::FP, false)) {
873         GetArkUINodeModifiers()->getSearchModifier()->resetSearchAdaptMaxFontSize(nativeNode);
874     } else {
875         if (value.IsNegative()) {
876             value = theme->GetTextStyle().GetAdaptMaxFontSize();
877         }
878         GetArkUINodeModifiers()->getSearchModifier()->setSearchAdaptMaxFontSize(
879             nativeNode, value.Value(), static_cast<int32_t>(value.Unit()));
880     }
881     return panda::JSValueRef::Undefined(vm);
882 }
883 
ResetSearchMaxFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)884 ArkUINativeModuleValue SearchBridge::ResetSearchMaxFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
885 {
886     EcmaVM* vm = runtimeCallInfo->GetVM();
887     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
888     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
889     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
890     GetArkUINodeModifiers()->getSearchModifier()->resetSearchAdaptMaxFontSize(nativeNode);
891     return panda::JSValueRef::Undefined(vm);
892 }
893 
SetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)894 ArkUINativeModuleValue SearchBridge::SetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
895 {
896     EcmaVM* vm = runtimeCallInfo->GetVM();
897     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
898 
899     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
900     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
901     auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
902     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
903     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
904     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
905     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(NUM_1);
906     std::string inputFilter;
907     if (valueArg->IsUndefined() || valueArg->IsNull()) {
908         SearchModelNG::SetInputFilter(frameNode, inputFilter, nullptr);
909         return panda::JSValueRef::Undefined(vm);
910     }
911     if (ArkTSUtils::ParseJsString(vm, valueArg, inputFilter)) {
912         if (!Framework::CheckRegexValid(inputFilter)) {
913             inputFilter = "";
914         }
915 
916         Local<JSValueRef> callBackArg = runtimeCallInfo->GetCallArgRef(NUM_2);
917         CHECK_NULL_RETURN(callBackArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
918         auto obj = callBackArg->ToObject(vm);
919         auto containerId = Container::CurrentId();
920         panda::Local<panda::FunctionRef> func = obj;
921         auto onError = [vm, func = panda::CopyableGlobal(vm, func), node = AceType::WeakClaim(frameNode),
922                             containerId](const std::string& info) {
923             panda::LocalScope pandaScope(vm);
924             panda::TryCatch trycatch(vm);
925             ContainerScope scope(containerId);
926             PipelineContext::SetCallBackNode(node);
927             auto eventObj = Framework::ToJSValue(info);
928             panda::Local<panda::JSValueRef> params[1] = { eventObj };
929             func->Call(vm, func.ToLocal(), params, 1);
930         };
931         SearchModelNG::SetInputFilter(frameNode, inputFilter, std::move(onError));
932     }
933     return panda::JSValueRef::Undefined(vm);
934 }
935 
ResetInputFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)936 ArkUINativeModuleValue SearchBridge::ResetInputFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
937 {
938     EcmaVM* vm = runtimeCallInfo->GetVM();
939     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
940     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
941     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
942     auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
943     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
944     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
945     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
946     std::string inputFilter;
947     NG::SearchModelNG::SetInputFilter(frameNode, inputFilter, nullptr);
948     return panda::JSValueRef::Undefined(vm);
949 }
950 
SetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)951 ArkUINativeModuleValue SearchBridge::SetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
952 {
953     EcmaVM* vm = runtimeCallInfo->GetVM();
954     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
955     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
956     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
957     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
958     Color color;
959     uint32_t result;
960     if (ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color)) {
961         result = color.GetValue();
962         GetArkUINodeModifiers()->getSearchModifier()->setSearchSelectedBackgroundColor(nativeNode, result);
963     } else {
964         GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectedBackgroundColor(nativeNode);
965     }
966     return panda::JSValueRef::Undefined(vm);
967 }
968 
ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)969 ArkUINativeModuleValue SearchBridge::ResetSelectedBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
970 {
971     EcmaVM* vm = runtimeCallInfo->GetVM();
972     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
973     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
974     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
975     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectedBackgroundColor(nativeNode);
976     return panda::JSValueRef::Undefined(vm);
977 }
978 
SetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)979 ArkUINativeModuleValue SearchBridge::SetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
980 {
981     EcmaVM* vm = runtimeCallInfo->GetVM();
982     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
983     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
984     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
985     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
986     CalcDimension indent;
987     if (!ArkTSUtils::ParseJsDimensionNG(vm, secondArg, indent, DimensionUnit::VP, true)) {
988         indent.Reset();
989     }
990 
991     GetArkUINodeModifiers()->getSearchModifier()->setSearchTextIndent(
992         nativeNode, indent.Value(), static_cast<int8_t>(indent.Unit()));
993     return panda::JSValueRef::Undefined(vm);
994 }
995 
ResetTextIndent(ArkUIRuntimeCallInfo * runtimeCallInfo)996 ArkUINativeModuleValue SearchBridge::ResetTextIndent(ArkUIRuntimeCallInfo* runtimeCallInfo)
997 {
998     EcmaVM* vm = runtimeCallInfo->GetVM();
999     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1000     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1001     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1002     GetArkUINodeModifiers()->getSearchModifier()->resetSearchTextIndent(nativeNode);
1003     return panda::JSValueRef::Undefined(vm);
1004 }
1005 
SetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)1006 ArkUINativeModuleValue SearchBridge::SetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
1007 {
1008     EcmaVM *vm = runtimeCallInfo->GetVM();
1009     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1010     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1011     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1012     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1013     if (!secondArg->IsNumber()) {
1014         GetArkUINodeModifiers()->getSearchModifier()->resetSearchMaxLength(nativeNode);
1015     } else {
1016         int32_t maxLength = secondArg->Int32Value(vm);
1017         if (std::isinf(static_cast<float>(secondArg->ToNumber(vm)->Value()))) {
1018             maxLength = INT32_MAX; // Infinity
1019         }
1020         if (maxLength >= 0) {
1021             GetArkUINodeModifiers()->getSearchModifier()->setSearchMaxLength(nativeNode, maxLength);
1022         } else {
1023             GetArkUINodeModifiers()->getSearchModifier()->resetSearchMaxLength(nativeNode);
1024         }
1025     }
1026     return panda::JSValueRef::Undefined(vm);
1027 }
1028 
ResetMaxLength(ArkUIRuntimeCallInfo * runtimeCallInfo)1029 ArkUINativeModuleValue SearchBridge::ResetMaxLength(ArkUIRuntimeCallInfo *runtimeCallInfo)
1030 {
1031     EcmaVM *vm = runtimeCallInfo->GetVM();
1032     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1033     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1034     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1035     GetArkUINodeModifiers()->getSearchModifier()->resetSearchMaxLength(nativeNode);
1036     return panda::JSValueRef::Undefined(vm);
1037 }
1038 
SetType(ArkUIRuntimeCallInfo * runtimeCallInfo)1039 ArkUINativeModuleValue SearchBridge::SetType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1040 {
1041     EcmaVM *vm = runtimeCallInfo->GetVM();
1042     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1043     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1044     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1045     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1046     if (secondArg->IsNumber()) {
1047         int32_t value = secondArg->Int32Value(vm);
1048         GetArkUINodeModifiers()->getSearchModifier()->setSearchType(nativeNode, value);
1049     } else {
1050         GetArkUINodeModifiers()->getSearchModifier()->resetSearchType(nativeNode);
1051     }
1052     return panda::JSValueRef::Undefined(vm);
1053 }
1054 
ResetType(ArkUIRuntimeCallInfo * runtimeCallInfo)1055 ArkUINativeModuleValue SearchBridge::ResetType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1056 {
1057     EcmaVM* vm = runtimeCallInfo->GetVM();
1058     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1059     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1060     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1061     GetArkUINodeModifiers()->getSearchModifier()->resetSearchType(nativeNode);
1062     return panda::JSValueRef::Undefined(vm);
1063 }
1064 
SetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1065 ArkUINativeModuleValue SearchBridge::SetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1066 {
1067     EcmaVM *vm = runtimeCallInfo->GetVM();
1068     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1069     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1070     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1071     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1072     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1073     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1074     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1075         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnEditChange(nativeNode);
1076         return panda::JSValueRef::Undefined(vm);
1077     }
1078     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1079     std::function<void(bool)> callback = [vm, frameNode,
1080         func = panda::CopyableGlobal(vm, func)](bool isInEditStatus) {
1081         panda::LocalScope pandaScope(vm);
1082         panda::TryCatch trycatch(vm);
1083         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1084         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1085             panda::BooleanRef::New(vm, isInEditStatus) };
1086         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1087     };
1088     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnEditChange(
1089         nativeNode, reinterpret_cast<void*>(&callback));
1090     return panda::JSValueRef::Undefined(vm);
1091 }
1092 
ResetOnEditChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1093 ArkUINativeModuleValue SearchBridge::ResetOnEditChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1094 {
1095     EcmaVM* vm = runtimeCallInfo->GetVM();
1096     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1097     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1098     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1099     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnEditChange(nativeNode);
1100     return panda::JSValueRef::Undefined(vm);
1101 }
1102 
SetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1103 ArkUINativeModuleValue SearchBridge::SetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1104 {
1105     EcmaVM *vm = runtimeCallInfo->GetVM();
1106     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1107     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1108     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1109     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1110     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1111     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1112     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1113         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnSubmitWithEvent(nativeNode);
1114         return panda::JSValueRef::Undefined(vm);
1115     }
1116     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1117     std::function<void(const std::string&, NG::TextFieldCommonEvent&)> callback = [vm, frameNode,
1118         func = panda::CopyableGlobal(vm, func)](const std::string& info, NG::TextFieldCommonEvent& event) {
1119         panda::LocalScope pandaScope(vm);
1120         panda::TryCatch trycatch(vm);
1121         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1122         const char* keys[] = { "text", "keepEditableState" };
1123         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetText().c_str()),
1124             panda::FunctionRef::New(vm, Framework::JSTextField::JsKeepEditableState) };
1125         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1126         eventObject->SetNativePointerFieldCount(vm, NUM_1);
1127         eventObject->SetNativePointerField(vm, NUM_0, static_cast<void*>(&event));
1128         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1129             panda::StringRef::NewFromUtf8(vm, info.c_str()), eventObject };
1130         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1131     };
1132     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnSubmitWithEvent(
1133         nativeNode, reinterpret_cast<void*>(&callback));
1134     return panda::JSValueRef::Undefined(vm);
1135 }
1136 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1137 ArkUINativeModuleValue SearchBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1138 {
1139     EcmaVM* vm = runtimeCallInfo->GetVM();
1140     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1141     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1142     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1143     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnSubmitWithEvent(nativeNode);
1144     return panda::JSValueRef::Undefined(vm);
1145 }
1146 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1147 ArkUINativeModuleValue SearchBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1148 {
1149     EcmaVM *vm = runtimeCallInfo->GetVM();
1150     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1151     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1152     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1153     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1154     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1155     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1156     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1157         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCopy(nativeNode);
1158         return panda::JSValueRef::Undefined(vm);
1159     }
1160     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1161     std::function<void(const std::string&)> callback = [vm, frameNode,
1162         func = panda::CopyableGlobal(vm, func)](const std::string& copyStr) {
1163         panda::LocalScope pandaScope(vm);
1164         panda::TryCatch trycatch(vm);
1165         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1166         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1167             panda::StringRef::NewFromUtf8(vm, copyStr.c_str()) };
1168         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1169     };
1170     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1171     return panda::JSValueRef::Undefined(vm);
1172 }
1173 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1174 ArkUINativeModuleValue SearchBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1175 {
1176     EcmaVM* vm = runtimeCallInfo->GetVM();
1177     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1178     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1179     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1180     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCopy(nativeNode);
1181     return panda::JSValueRef::Undefined(vm);
1182 }
1183 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1184 ArkUINativeModuleValue SearchBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1185 {
1186     EcmaVM *vm = runtimeCallInfo->GetVM();
1187     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1188     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1189     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1190     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1191     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1192     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1193     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1194         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCut(nativeNode);
1195         return panda::JSValueRef::Undefined(vm);
1196     }
1197     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1198     std::function<void(const std::string&)> callback = [vm, frameNode,
1199         func = panda::CopyableGlobal(vm, func)](const std::string& cutStr) {
1200         panda::LocalScope pandaScope(vm);
1201         panda::TryCatch trycatch(vm);
1202         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1203         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1204             panda::StringRef::NewFromUtf8(vm, cutStr.c_str()) };
1205         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1206     };
1207     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnCut(nativeNode, reinterpret_cast<void*>(&callback));
1208     return panda::JSValueRef::Undefined(vm);
1209 }
1210 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1211 ArkUINativeModuleValue SearchBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1212 {
1213     EcmaVM* vm = runtimeCallInfo->GetVM();
1214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1215     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1217     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCut(nativeNode);
1218     return panda::JSValueRef::Undefined(vm);
1219 }
1220 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1221 ArkUINativeModuleValue SearchBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1222 {
1223     EcmaVM *vm = runtimeCallInfo->GetVM();
1224     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1225     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1226     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1227     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1228     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1229     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1230     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1231         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnPaste(nativeNode);
1232         return panda::JSValueRef::Undefined(vm);
1233     }
1234     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1235     std::function<void(const std::string&, NG::TextCommonEvent&)> callback = [vm, frameNode,
1236         func = panda::CopyableGlobal(vm, func)](const std::string& val, NG::TextCommonEvent& info) {
1237         panda::LocalScope pandaScope(vm);
1238         panda::TryCatch trycatch(vm);
1239         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1240         auto eventObject = panda::ObjectRef::New(vm);
1241         eventObject->SetNativePointerFieldCount(vm, 1);
1242         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
1243             panda::FunctionRef::New(vm, Framework::JsPreventDefault));
1244         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1245         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1246             panda::StringRef::NewFromUtf8(vm, val.c_str()), eventObject };
1247         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1248     };
1249     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnPaste(
1250         nativeNode, reinterpret_cast<void*>(&callback));
1251     return panda::JSValueRef::Undefined(vm);
1252 }
1253 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1254 ArkUINativeModuleValue SearchBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1255 {
1256     EcmaVM* vm = runtimeCallInfo->GetVM();
1257     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1258     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1259     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1260     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnPaste(nativeNode);
1261     return panda::JSValueRef::Undefined(vm);
1262 }
1263 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1264 ArkUINativeModuleValue SearchBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1265 {
1266     EcmaVM *vm = runtimeCallInfo->GetVM();
1267     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1268     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1269     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1270     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1271     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1272     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1273     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1274         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnChange(nativeNode);
1275         return panda::JSValueRef::Undefined(vm);
1276     }
1277     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1278     std::function<void(const std::string&, PreviewText&)> callback = [vm, frameNode,
1279         func = panda::CopyableGlobal(vm, func)](const std::string& changeValue, PreviewText& previewText) {
1280         panda::LocalScope pandaScope(vm);
1281         panda::TryCatch trycatch(vm);
1282         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1283         const char* keys[] = { "offset", "value" };
1284         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, previewText.offset),
1285             panda::StringRef::NewFromUtf8(vm, previewText.value.c_str()) };
1286         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1287         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1288             panda::StringRef::NewFromUtf8(vm, changeValue.c_str()), eventObject };
1289         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1290     };
1291     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnChange(
1292         nativeNode, reinterpret_cast<void*>(&callback));
1293     return panda::JSValueRef::Undefined(vm);
1294 }
1295 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1296 ArkUINativeModuleValue SearchBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1297 {
1298     EcmaVM* vm = runtimeCallInfo->GetVM();
1299     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1300     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1301     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1302     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnChange(nativeNode);
1303     return panda::JSValueRef::Undefined(vm);
1304 }
1305 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1306 ArkUINativeModuleValue SearchBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1307 {
1308     EcmaVM *vm = runtimeCallInfo->GetVM();
1309     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1310     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1311     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1312     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1313     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1314     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1315     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1316         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnTextSelectionChange(nativeNode);
1317         return panda::JSValueRef::Undefined(vm);
1318     }
1319     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1320     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1321         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int selectionEnd) {
1322         panda::LocalScope pandaScope(vm);
1323         panda::TryCatch trycatch(vm);
1324         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1325         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1326         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1327         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1328         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1329     };
1330     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnTextSelectionChange(
1331         nativeNode, reinterpret_cast<void*>(&callback));
1332     return panda::JSValueRef::Undefined(vm);
1333 }
1334 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1335 ArkUINativeModuleValue SearchBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1336 {
1337     EcmaVM* vm = runtimeCallInfo->GetVM();
1338     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1340     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1341     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnTextSelectionChange(nativeNode);
1342     return panda::JSValueRef::Undefined(vm);
1343 }
1344 
SetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1345 ArkUINativeModuleValue SearchBridge::SetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1346 {
1347     EcmaVM *vm = runtimeCallInfo->GetVM();
1348     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1349     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1350     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1351     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1352     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1353     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1354     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1355         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnContentScroll(nativeNode);
1356         return panda::JSValueRef::Undefined(vm);
1357     }
1358     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1359     std::function<void(float, float)> callback = [vm, frameNode,
1360         func = panda::CopyableGlobal(vm, func)](float totalOffsetX, float totalOffsetY) {
1361         panda::LocalScope pandaScope(vm);
1362         panda::TryCatch trycatch(vm);
1363         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1364         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1365             panda::NumberRef::New(vm, totalOffsetX), panda::NumberRef::New(vm, totalOffsetY) };
1366         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1367     };
1368     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnContentScroll(
1369         nativeNode, reinterpret_cast<void*>(&callback));
1370     return panda::JSValueRef::Undefined(vm);
1371 }
1372 
ResetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1373 ArkUINativeModuleValue SearchBridge::ResetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1374 {
1375     EcmaVM* vm = runtimeCallInfo->GetVM();
1376     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1377     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1378     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1379     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnContentScroll(nativeNode);
1380     return panda::JSValueRef::Undefined(vm);
1381 }
1382 
SetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1383 ArkUINativeModuleValue SearchBridge::SetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1384 {
1385     EcmaVM *vm = runtimeCallInfo->GetVM();
1386     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1387     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1388     Local<JSValueRef> showCounterArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1389     Local<JSValueRef> highlightBorderArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1390     Local<JSValueRef> thresholdArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1391     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1392     auto showCounter = false;
1393     if (showCounterArg->IsBoolean()) {
1394         showCounter = showCounterArg->BooleaValue(vm);
1395     }
1396     auto highlightBorder = true;
1397     if (highlightBorderArg->IsBoolean()) {
1398         highlightBorder = highlightBorderArg->BooleaValue(vm);
1399     }
1400     auto thresholdValue = DEFAULT_MODE;
1401     if (thresholdArg->IsNumber()) {
1402         thresholdValue = static_cast<uint32_t>(thresholdArg->Int32Value(vm));
1403         if (thresholdValue < MINI_VALID_VALUE || thresholdValue > MAX_VALID_VALUE) {
1404             thresholdValue = ILLEGAL_VALUE;
1405             showCounter = false;
1406         }
1407     }
1408     GetArkUINodeModifiers()->getSearchModifier()->setSearchShowCounter(
1409         nativeNode, static_cast<int32_t>(showCounter), thresholdValue, static_cast<int32_t>(highlightBorder));
1410     return panda::JSValueRef::Undefined(vm);
1411 }
1412 
ResetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1413 ArkUINativeModuleValue SearchBridge::ResetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1414 {
1415     EcmaVM* vm = runtimeCallInfo->GetVM();
1416     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1417     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1418     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1419     GetArkUINodeModifiers()->getSearchModifier()->resetSearchShowCounter(nativeNode);
1420     return panda::JSValueRef::Undefined(vm);
1421 }
1422 
SetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1423 ArkUINativeModuleValue SearchBridge::SetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1424 {
1425     EcmaVM *vm = runtimeCallInfo->GetVM();
1426     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1427     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1428     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1429     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1430     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1431     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1432     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1433         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillInsert(nativeNode);
1434         return panda::JSValueRef::Undefined(vm);
1435     }
1436     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1437     std::function<bool(const InsertValueInfo&)> callback = [vm, frameNode,
1438         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) -> bool {
1439         panda::LocalScope pandaScope(vm);
1440         panda::TryCatch trycatch(vm);
1441         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1442         const char* keys[] = { "insertOffset", "insertValue" };
1443         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
1444             panda::StringRef::NewFromUtf8(vm, insertValue.insertValue.c_str()) };
1445         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1446         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1447         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1448         if (ret->IsBoolean()) {
1449             return ret->ToBoolean(vm)->Value();
1450         }
1451         return true;
1452     };
1453     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnWillInsert(nativeNode,
1454         reinterpret_cast<intptr_t>(&callback));
1455     return panda::JSValueRef::Undefined(vm);
1456 }
1457 
ResetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1458 ArkUINativeModuleValue SearchBridge::ResetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1459 {
1460     EcmaVM* vm = runtimeCallInfo->GetVM();
1461     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1462     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1463     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1464     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillInsert(nativeNode);
1465     return panda::JSValueRef::Undefined(vm);
1466 }
1467 
SetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1468 ArkUINativeModuleValue SearchBridge::SetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1469 {
1470     EcmaVM *vm = runtimeCallInfo->GetVM();
1471     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1472     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1473     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1474     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1475     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1476     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1477     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1478         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidInsert(nativeNode);
1479         return panda::JSValueRef::Undefined(vm);
1480     }
1481     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1482     std::function<void(const InsertValueInfo&)> callback = [vm, frameNode,
1483         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) {
1484         panda::LocalScope pandaScope(vm);
1485         panda::TryCatch trycatch(vm);
1486         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1487         const char* keys[] = { "insertOffset", "insertValue" };
1488         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
1489             panda::StringRef::NewFromUtf8(vm, insertValue.insertValue.c_str()) };
1490         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1491         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1492         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1493     };
1494     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnDidInsert(nativeNode,
1495         reinterpret_cast<intptr_t>(&callback));
1496     return panda::JSValueRef::Undefined(vm);
1497 }
1498 
ResetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1499 ArkUINativeModuleValue SearchBridge::ResetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1500 {
1501     EcmaVM* vm = runtimeCallInfo->GetVM();
1502     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1503     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1504     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1505     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidInsert(nativeNode);
1506     return panda::JSValueRef::Undefined(vm);
1507 }
1508 
SetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1509 ArkUINativeModuleValue SearchBridge::SetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1510 {
1511     EcmaVM *vm = runtimeCallInfo->GetVM();
1512     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1513     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1514     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1515     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1516     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1517     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1518     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1519         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillDelete(nativeNode);
1520         return panda::JSValueRef::Undefined(vm);
1521     }
1522     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1523     std::function<bool(const DeleteValueInfo&)> callback = [vm, frameNode,
1524         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) -> bool {
1525         panda::LocalScope pandaScope(vm);
1526         panda::TryCatch trycatch(vm);
1527         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1528         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
1529         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
1530             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
1531             panda::StringRef::NewFromUtf8(vm, deleteValue.deleteValue.c_str()) };
1532         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1533         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1534         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1535         if (ret->IsBoolean()) {
1536             return ret->ToBoolean(vm)->Value();
1537         }
1538         return true;
1539     };
1540     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnWillDelete(nativeNode,
1541         reinterpret_cast<intptr_t>(&callback));
1542     return panda::JSValueRef::Undefined(vm);
1543 }
1544 
ResetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1545 ArkUINativeModuleValue SearchBridge::ResetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1546 {
1547     EcmaVM* vm = runtimeCallInfo->GetVM();
1548     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1549     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1550     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1551     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillDelete(nativeNode);
1552     return panda::JSValueRef::Undefined(vm);
1553 }
1554 
SetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1555 ArkUINativeModuleValue SearchBridge::SetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1556 {
1557     EcmaVM *vm = runtimeCallInfo->GetVM();
1558     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1559     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1560     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1561     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1562     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1563     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1564     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1565         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidDelete(nativeNode);
1566         return panda::JSValueRef::Undefined(vm);
1567     }
1568     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1569     std::function<void(const DeleteValueInfo&)> callback = [vm, frameNode,
1570         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) {
1571         panda::LocalScope pandaScope(vm);
1572         panda::TryCatch trycatch(vm);
1573         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1574         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
1575         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
1576             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
1577             panda::StringRef::NewFromUtf8(vm, deleteValue.deleteValue.c_str()) };
1578         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1579         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1580         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1581     };
1582     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnDidDelete(nativeNode,
1583         reinterpret_cast<intptr_t>(&callback));
1584     return panda::JSValueRef::Undefined(vm);
1585 }
1586 
ResetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1587 ArkUINativeModuleValue SearchBridge::ResetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1588 {
1589     EcmaVM* vm = runtimeCallInfo->GetVM();
1590     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1591     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1592     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1593     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidDelete(nativeNode);
1594     return panda::JSValueRef::Undefined(vm);
1595 }
1596 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1597 ArkUINativeModuleValue SearchBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1598 {
1599     EcmaVM *vm = runtimeCallInfo->GetVM();
1600     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1601     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1602     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1603     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1604 
1605     if (secondArg->IsBoolean()) {
1606         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1607         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnablePreviewText(nativeNode, value);
1608     } else {
1609         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnablePreviewText(nativeNode);
1610     }
1611     return panda::JSValueRef::Undefined(vm);
1612 }
1613 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1614 ArkUINativeModuleValue SearchBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1615 {
1616     EcmaVM* vm = runtimeCallInfo->GetVM();
1617     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1618     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1619     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1620     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnablePreviewText(nativeNode);
1621     return panda::JSValueRef::Undefined(vm);
1622 }
1623 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1624 ArkUINativeModuleValue SearchBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1625 {
1626     EcmaVM* vm = runtimeCallInfo->GetVM();
1627     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1628     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1629     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1630     NG::OnCreateMenuCallback onCreateMenuCallback;
1631     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1632     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
1633         GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuOptions(nativeNode);
1634         return panda::JSValueRef::Undefined(vm);
1635     }
1636     GetArkUINodeModifiers()->getSearchModifier()->setSearchSelectionMenuOptions(
1637         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
1638     return panda::JSValueRef::Undefined(vm);
1639 }
1640 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1641 ArkUINativeModuleValue SearchBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1642 {
1643     EcmaVM* vm = runtimeCallInfo->GetVM();
1644     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1645     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1646     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1647     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuOptions(nativeNode);
1648     return panda::JSValueRef::Undefined(vm);
1649 }
1650 
SetSearchInspectorId(ArkUIRuntimeCallInfo * runtimeCallInfo)1651 ArkUINativeModuleValue SearchBridge::SetSearchInspectorId(ArkUIRuntimeCallInfo* runtimeCallInfo)
1652 {
1653     EcmaVM* vm = runtimeCallInfo->GetVM();
1654     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1655     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1656     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1657     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1658     if (secondArg->IsString(vm)) {
1659         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
1660         GetArkUINodeModifiers()->getSearchModifier()->setSearchInspectorId(nativeNode, stringValue.c_str());
1661     } else {
1662         GetArkUINodeModifiers()->getSearchModifier()->resetSearchInspectorId(nativeNode);
1663     }
1664     return panda::JSValueRef::Undefined(vm);
1665 }
1666 
ResetSearchInspectorId(ArkUIRuntimeCallInfo * runtimeCallInfo)1667 ArkUINativeModuleValue SearchBridge::ResetSearchInspectorId(ArkUIRuntimeCallInfo* runtimeCallInfo)
1668 {
1669     EcmaVM* vm = runtimeCallInfo->GetVM();
1670     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1671     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1672     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1673     GetArkUINodeModifiers()->getSearchModifier()->resetSearchInspectorId(nativeNode);
1674     return panda::JSValueRef::Undefined(vm);
1675 }
1676 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1677 ArkUINativeModuleValue SearchBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1678 {
1679     EcmaVM* vm = runtimeCallInfo->GetVM();
1680     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1681     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1682     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1683     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1684 
1685     if (secondArg->IsBoolean()) {
1686         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1687         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnableHapticFeedback(nativeNode, value);
1688     } else {
1689         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableHapticFeedback(nativeNode);
1690     }
1691     return panda::JSValueRef::Undefined(vm);
1692 }
1693 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1694 ArkUINativeModuleValue SearchBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1695 {
1696     EcmaVM* vm = runtimeCallInfo->GetVM();
1697     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1698     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1699     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1700     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableHapticFeedback(nativeNode);
1701     return panda::JSValueRef::Undefined(vm);
1702 }
1703 } // namespace OHOS::Ace::NG
1704