• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_utils.h"
28 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
29 #include "frameworks/core/components_ng/pattern/text_field/text_field_model.h"
30 
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&)> callback = [vm, frameNode,
1118         func = panda::CopyableGlobal(vm, func)](const std::string& info) {
1119         panda::LocalScope pandaScope(vm);
1120         panda::TryCatch trycatch(vm);
1121         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1122         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1123             panda::StringRef::NewFromUtf8(vm, info.c_str()) };
1124         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1125     };
1126     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnSubmitWithEvent(
1127         nativeNode, reinterpret_cast<void*>(&callback));
1128     return panda::JSValueRef::Undefined(vm);
1129 }
1130 
ResetOnSubmit(ArkUIRuntimeCallInfo * runtimeCallInfo)1131 ArkUINativeModuleValue SearchBridge::ResetOnSubmit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1132 {
1133     EcmaVM* vm = runtimeCallInfo->GetVM();
1134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1136     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1137     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnSubmitWithEvent(nativeNode);
1138     return panda::JSValueRef::Undefined(vm);
1139 }
1140 
SetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1141 ArkUINativeModuleValue SearchBridge::SetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1142 {
1143     EcmaVM *vm = runtimeCallInfo->GetVM();
1144     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1145     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1146     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1147     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1148     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1149     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1150     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1151         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCopy(nativeNode);
1152         return panda::JSValueRef::Undefined(vm);
1153     }
1154     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1155     std::function<void(const std::string&)> callback = [vm, frameNode,
1156         func = panda::CopyableGlobal(vm, func)](const std::string& copyStr) {
1157         panda::LocalScope pandaScope(vm);
1158         panda::TryCatch trycatch(vm);
1159         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1160         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1161             panda::StringRef::NewFromUtf8(vm, copyStr.c_str()) };
1162         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1163     };
1164     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnCopy(nativeNode, reinterpret_cast<void*>(&callback));
1165     return panda::JSValueRef::Undefined(vm);
1166 }
1167 
ResetOnCopy(ArkUIRuntimeCallInfo * runtimeCallInfo)1168 ArkUINativeModuleValue SearchBridge::ResetOnCopy(ArkUIRuntimeCallInfo* runtimeCallInfo)
1169 {
1170     EcmaVM* vm = runtimeCallInfo->GetVM();
1171     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1172     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1173     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1174     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCopy(nativeNode);
1175     return panda::JSValueRef::Undefined(vm);
1176 }
1177 
SetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1178 ArkUINativeModuleValue SearchBridge::SetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1179 {
1180     EcmaVM *vm = runtimeCallInfo->GetVM();
1181     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1182     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1183     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1184     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1185     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1186     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1187     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1188         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCut(nativeNode);
1189         return panda::JSValueRef::Undefined(vm);
1190     }
1191     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1192     std::function<void(const std::string&)> callback = [vm, frameNode,
1193         func = panda::CopyableGlobal(vm, func)](const std::string& cutStr) {
1194         panda::LocalScope pandaScope(vm);
1195         panda::TryCatch trycatch(vm);
1196         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1197         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = {
1198             panda::StringRef::NewFromUtf8(vm, cutStr.c_str()) };
1199         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1200     };
1201     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnCut(nativeNode, reinterpret_cast<void*>(&callback));
1202     return panda::JSValueRef::Undefined(vm);
1203 }
1204 
ResetOnCut(ArkUIRuntimeCallInfo * runtimeCallInfo)1205 ArkUINativeModuleValue SearchBridge::ResetOnCut(ArkUIRuntimeCallInfo* runtimeCallInfo)
1206 {
1207     EcmaVM* vm = runtimeCallInfo->GetVM();
1208     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1209     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1210     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1211     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnCut(nativeNode);
1212     return panda::JSValueRef::Undefined(vm);
1213 }
1214 
SetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1215 ArkUINativeModuleValue SearchBridge::SetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1216 {
1217     EcmaVM *vm = runtimeCallInfo->GetVM();
1218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1219     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1220     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1221     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1222     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1223     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1224     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1225         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnPaste(nativeNode);
1226         return panda::JSValueRef::Undefined(vm);
1227     }
1228     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1229     std::function<void(const std::string&, NG::TextCommonEvent&)> callback = [vm, frameNode,
1230         func = panda::CopyableGlobal(vm, func)](const std::string& val, NG::TextCommonEvent& info) {
1231         panda::LocalScope pandaScope(vm);
1232         panda::TryCatch trycatch(vm);
1233         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1234         auto eventObject = panda::ObjectRef::New(vm);
1235         eventObject->SetNativePointerFieldCount(vm, 1);
1236         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
1237             panda::FunctionRef::New(vm, Framework::JsPreventDefault));
1238         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1239         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1240             panda::StringRef::NewFromUtf8(vm, val.c_str()), eventObject };
1241         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1242     };
1243     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnPaste(
1244         nativeNode, reinterpret_cast<void*>(&callback));
1245     return panda::JSValueRef::Undefined(vm);
1246 }
1247 
ResetOnPaste(ArkUIRuntimeCallInfo * runtimeCallInfo)1248 ArkUINativeModuleValue SearchBridge::ResetOnPaste(ArkUIRuntimeCallInfo* runtimeCallInfo)
1249 {
1250     EcmaVM* vm = runtimeCallInfo->GetVM();
1251     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1252     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1253     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1254     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnPaste(nativeNode);
1255     return panda::JSValueRef::Undefined(vm);
1256 }
1257 
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1258 ArkUINativeModuleValue SearchBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1259 {
1260     EcmaVM *vm = runtimeCallInfo->GetVM();
1261     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1262     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1263     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1264     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1265     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1266     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1267     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1268         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnChange(nativeNode);
1269         return panda::JSValueRef::Undefined(vm);
1270     }
1271     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1272     std::function<void(const std::string&, PreviewText&)> callback = [vm, frameNode,
1273         func = panda::CopyableGlobal(vm, func)](const std::string& changeValue, PreviewText& previewText) {
1274         panda::LocalScope pandaScope(vm);
1275         panda::TryCatch trycatch(vm);
1276         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1277         const char* keys[] = { "offset", "value" };
1278         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, previewText.offset),
1279             panda::StringRef::NewFromUtf8(vm, previewText.value.c_str()) };
1280         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1281         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1282             panda::StringRef::NewFromUtf8(vm, changeValue.c_str()), eventObject };
1283         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1284     };
1285     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnChange(
1286         nativeNode, reinterpret_cast<void*>(&callback));
1287     return panda::JSValueRef::Undefined(vm);
1288 }
1289 
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1290 ArkUINativeModuleValue SearchBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1291 {
1292     EcmaVM* vm = runtimeCallInfo->GetVM();
1293     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1295     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1296     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnChange(nativeNode);
1297     return panda::JSValueRef::Undefined(vm);
1298 }
1299 
SetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1300 ArkUINativeModuleValue SearchBridge::SetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1301 {
1302     EcmaVM *vm = runtimeCallInfo->GetVM();
1303     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1304     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1305     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1306     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1307     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1308     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1309     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1310         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnTextSelectionChange(nativeNode);
1311         return panda::JSValueRef::Undefined(vm);
1312     }
1313     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1314     std::function<void(int32_t, int32_t)> callback = [vm, frameNode,
1315         func = panda::CopyableGlobal(vm, func)](int32_t selectionStart, int selectionEnd) {
1316         panda::LocalScope pandaScope(vm);
1317         panda::TryCatch trycatch(vm);
1318         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1319         panda::Local<panda::NumberRef> startParam = panda::NumberRef::New(vm, selectionStart);
1320         panda::Local<panda::NumberRef> endParam = panda::NumberRef::New(vm, selectionEnd);
1321         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = { startParam, endParam };
1322         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1323     };
1324     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnTextSelectionChange(
1325         nativeNode, reinterpret_cast<void*>(&callback));
1326     return panda::JSValueRef::Undefined(vm);
1327 }
1328 
ResetOnTextSelectionChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1329 ArkUINativeModuleValue SearchBridge::ResetOnTextSelectionChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1330 {
1331     EcmaVM* vm = runtimeCallInfo->GetVM();
1332     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1333     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1334     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1335     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnTextSelectionChange(nativeNode);
1336     return panda::JSValueRef::Undefined(vm);
1337 }
1338 
SetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1339 ArkUINativeModuleValue SearchBridge::SetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1340 {
1341     EcmaVM *vm = runtimeCallInfo->GetVM();
1342     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1343     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1344     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1345     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1346     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1347     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1348     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1349         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnContentScroll(nativeNode);
1350         return panda::JSValueRef::Undefined(vm);
1351     }
1352     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1353     std::function<void(float, float)> callback = [vm, frameNode,
1354         func = panda::CopyableGlobal(vm, func)](float totalOffsetX, float totalOffsetY) {
1355         panda::LocalScope pandaScope(vm);
1356         panda::TryCatch trycatch(vm);
1357         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1358         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_2] = {
1359             panda::NumberRef::New(vm, totalOffsetX), panda::NumberRef::New(vm, totalOffsetY) };
1360         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_2);
1361     };
1362     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnContentScroll(
1363         nativeNode, reinterpret_cast<void*>(&callback));
1364     return panda::JSValueRef::Undefined(vm);
1365 }
1366 
ResetOnContentScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)1367 ArkUINativeModuleValue SearchBridge::ResetOnContentScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
1368 {
1369     EcmaVM* vm = runtimeCallInfo->GetVM();
1370     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1371     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1372     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1373     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnContentScroll(nativeNode);
1374     return panda::JSValueRef::Undefined(vm);
1375 }
1376 
SetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1377 ArkUINativeModuleValue SearchBridge::SetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1378 {
1379     EcmaVM *vm = runtimeCallInfo->GetVM();
1380     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1381     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1382     Local<JSValueRef> showCounterArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1383     Local<JSValueRef> highlightBorderArg = runtimeCallInfo->GetCallArgRef(NUM_2);
1384     Local<JSValueRef> thresholdArg = runtimeCallInfo->GetCallArgRef(NUM_3);
1385     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1386     auto showCounter = false;
1387     if (showCounterArg->IsBoolean()) {
1388         showCounter = showCounterArg->BooleaValue(vm);
1389     }
1390     auto highlightBorder = true;
1391     if (highlightBorderArg->IsBoolean()) {
1392         highlightBorder = highlightBorderArg->BooleaValue(vm);
1393     }
1394     auto thresholdValue = DEFAULT_MODE;
1395     if (thresholdArg->IsNumber()) {
1396         thresholdValue = static_cast<uint32_t>(thresholdArg->Int32Value(vm));
1397         if (thresholdValue < MINI_VALID_VALUE || thresholdValue > MAX_VALID_VALUE) {
1398             thresholdValue = ILLEGAL_VALUE;
1399             showCounter = false;
1400         }
1401     }
1402     GetArkUINodeModifiers()->getSearchModifier()->setSearchShowCounter(
1403         nativeNode, static_cast<int32_t>(showCounter), thresholdValue, static_cast<int32_t>(highlightBorder));
1404     return panda::JSValueRef::Undefined(vm);
1405 }
1406 
ResetShowCounter(ArkUIRuntimeCallInfo * runtimeCallInfo)1407 ArkUINativeModuleValue SearchBridge::ResetShowCounter(ArkUIRuntimeCallInfo* runtimeCallInfo)
1408 {
1409     EcmaVM* vm = runtimeCallInfo->GetVM();
1410     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1411     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1412     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1413     GetArkUINodeModifiers()->getSearchModifier()->resetSearchShowCounter(nativeNode);
1414     return panda::JSValueRef::Undefined(vm);
1415 }
1416 
SetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1417 ArkUINativeModuleValue SearchBridge::SetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1418 {
1419     EcmaVM *vm = runtimeCallInfo->GetVM();
1420     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1421     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1422     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1424     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1425     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1426     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1427         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillInsert(nativeNode);
1428         return panda::JSValueRef::Undefined(vm);
1429     }
1430     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1431     std::function<bool(const InsertValueInfo&)> callback = [vm, frameNode,
1432         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) -> bool {
1433         panda::LocalScope pandaScope(vm);
1434         panda::TryCatch trycatch(vm);
1435         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1436         const char* keys[] = { "insertOffset", "insertValue" };
1437         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
1438             panda::StringRef::NewFromUtf8(vm, insertValue.insertValue.c_str()) };
1439         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1440         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1441         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1442         if (ret->IsBoolean()) {
1443             return ret->ToBoolean(vm)->Value();
1444         }
1445         return true;
1446     };
1447     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnWillInsert(nativeNode,
1448         reinterpret_cast<intptr_t>(&callback));
1449     return panda::JSValueRef::Undefined(vm);
1450 }
1451 
ResetOnWillInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1452 ArkUINativeModuleValue SearchBridge::ResetOnWillInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1453 {
1454     EcmaVM* vm = runtimeCallInfo->GetVM();
1455     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1456     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1457     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1458     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillInsert(nativeNode);
1459     return panda::JSValueRef::Undefined(vm);
1460 }
1461 
SetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1462 ArkUINativeModuleValue SearchBridge::SetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1463 {
1464     EcmaVM *vm = runtimeCallInfo->GetVM();
1465     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1466     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1467     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1468     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1469     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1470     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1471     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1472         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidInsert(nativeNode);
1473         return panda::JSValueRef::Undefined(vm);
1474     }
1475     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1476     std::function<void(const InsertValueInfo&)> callback = [vm, frameNode,
1477         func = panda::CopyableGlobal(vm, func)](const InsertValueInfo& insertValue) {
1478         panda::LocalScope pandaScope(vm);
1479         panda::TryCatch trycatch(vm);
1480         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1481         const char* keys[] = { "insertOffset", "insertValue" };
1482         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, insertValue.insertOffset),
1483             panda::StringRef::NewFromUtf8(vm, insertValue.insertValue.c_str()) };
1484         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1485         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1486         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1487     };
1488     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnDidInsert(nativeNode,
1489         reinterpret_cast<intptr_t>(&callback));
1490     return panda::JSValueRef::Undefined(vm);
1491 }
1492 
ResetOnDidInsert(ArkUIRuntimeCallInfo * runtimeCallInfo)1493 ArkUINativeModuleValue SearchBridge::ResetOnDidInsert(ArkUIRuntimeCallInfo* runtimeCallInfo)
1494 {
1495     EcmaVM* vm = runtimeCallInfo->GetVM();
1496     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1497     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1498     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1499     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidInsert(nativeNode);
1500     return panda::JSValueRef::Undefined(vm);
1501 }
1502 
SetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1503 ArkUINativeModuleValue SearchBridge::SetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1504 {
1505     EcmaVM *vm = runtimeCallInfo->GetVM();
1506     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1507     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1508     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1509     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1510     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1511     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1512     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1513         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillDelete(nativeNode);
1514         return panda::JSValueRef::Undefined(vm);
1515     }
1516     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1517     std::function<bool(const DeleteValueInfo&)> callback = [vm, frameNode,
1518         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) -> bool {
1519         panda::LocalScope pandaScope(vm);
1520         panda::TryCatch trycatch(vm);
1521         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1522         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
1523         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
1524             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
1525             panda::StringRef::NewFromUtf8(vm, deleteValue.deleteValue.c_str()) };
1526         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1527         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1528         auto ret = func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1529         if (ret->IsBoolean()) {
1530             return ret->ToBoolean(vm)->Value();
1531         }
1532         return true;
1533     };
1534     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnWillDelete(nativeNode,
1535         reinterpret_cast<intptr_t>(&callback));
1536     return panda::JSValueRef::Undefined(vm);
1537 }
1538 
ResetOnWillDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1539 ArkUINativeModuleValue SearchBridge::ResetOnWillDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1540 {
1541     EcmaVM* vm = runtimeCallInfo->GetVM();
1542     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1543     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1544     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1545     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnWillDelete(nativeNode);
1546     return panda::JSValueRef::Undefined(vm);
1547 }
1548 
SetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1549 ArkUINativeModuleValue SearchBridge::SetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1550 {
1551     EcmaVM *vm = runtimeCallInfo->GetVM();
1552     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1553     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1554     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1555     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1556     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1557     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1558     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1559         GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidDelete(nativeNode);
1560         return panda::JSValueRef::Undefined(vm);
1561     }
1562     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1563     std::function<void(const DeleteValueInfo&)> callback = [vm, frameNode,
1564         func = panda::CopyableGlobal(vm, func)](const DeleteValueInfo& deleteValue) {
1565         panda::LocalScope pandaScope(vm);
1566         panda::TryCatch trycatch(vm);
1567         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1568         const char* keys[] = { "deleteOffset", "direction", "deleteValue" };
1569         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, deleteValue.deleteOffset),
1570             panda::NumberRef::New(vm, static_cast<int32_t>(deleteValue.direction)),
1571             panda::StringRef::NewFromUtf8(vm, deleteValue.deleteValue.c_str()) };
1572         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1573         panda::Local<panda::JSValueRef> params[PARAM_ARR_LENGTH_1] = { eventObject };
1574         func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
1575     };
1576     GetArkUINodeModifiers()->getSearchModifier()->setSearchOnDidDelete(nativeNode,
1577         reinterpret_cast<intptr_t>(&callback));
1578     return panda::JSValueRef::Undefined(vm);
1579 }
1580 
ResetOnDidDelete(ArkUIRuntimeCallInfo * runtimeCallInfo)1581 ArkUINativeModuleValue SearchBridge::ResetOnDidDelete(ArkUIRuntimeCallInfo* runtimeCallInfo)
1582 {
1583     EcmaVM* vm = runtimeCallInfo->GetVM();
1584     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1585     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1586     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1587     GetArkUINodeModifiers()->getSearchModifier()->resetSearchOnDidDelete(nativeNode);
1588     return panda::JSValueRef::Undefined(vm);
1589 }
1590 
SetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1591 ArkUINativeModuleValue SearchBridge::SetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1592 {
1593     EcmaVM *vm = runtimeCallInfo->GetVM();
1594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1596     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1597     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1598 
1599     if (secondArg->IsBoolean()) {
1600         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1601         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnablePreviewText(nativeNode, value);
1602     } else {
1603         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnablePreviewText(nativeNode);
1604     }
1605     return panda::JSValueRef::Undefined(vm);
1606 }
1607 
ResetEnablePreviewText(ArkUIRuntimeCallInfo * runtimeCallInfo)1608 ArkUINativeModuleValue SearchBridge::ResetEnablePreviewText(ArkUIRuntimeCallInfo* runtimeCallInfo)
1609 {
1610     EcmaVM* vm = runtimeCallInfo->GetVM();
1611     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1612     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1613     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1614     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnablePreviewText(nativeNode);
1615     return panda::JSValueRef::Undefined(vm);
1616 }
1617 
SetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1618 ArkUINativeModuleValue SearchBridge::SetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1619 {
1620     EcmaVM* vm = runtimeCallInfo->GetVM();
1621     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1622     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1623     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1624     NG::OnCreateMenuCallback onCreateMenuCallback;
1625     NG::OnMenuItemClickCallback onMenuItemClickCallback;
1626     if (!ArkTSUtils::ParseSelectionMenuOptions(runtimeCallInfo, vm, onCreateMenuCallback, onMenuItemClickCallback)) {
1627         GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuOptions(nativeNode);
1628         return panda::JSValueRef::Undefined(vm);
1629     }
1630     GetArkUINodeModifiers()->getSearchModifier()->setSearchSelectionMenuOptions(
1631         nativeNode, reinterpret_cast<void*>(&onCreateMenuCallback), reinterpret_cast<void*>(&onMenuItemClickCallback));
1632     return panda::JSValueRef::Undefined(vm);
1633 }
1634 
ResetSelectionMenuOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1635 ArkUINativeModuleValue SearchBridge::ResetSelectionMenuOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1636 {
1637     EcmaVM* vm = runtimeCallInfo->GetVM();
1638     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1639     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1640     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1641     GetArkUINodeModifiers()->getSearchModifier()->resetSearchSelectionMenuOptions(nativeNode);
1642     return panda::JSValueRef::Undefined(vm);
1643 }
1644 
SetSearchInspectorId(ArkUIRuntimeCallInfo * runtimeCallInfo)1645 ArkUINativeModuleValue SearchBridge::SetSearchInspectorId(ArkUIRuntimeCallInfo* runtimeCallInfo)
1646 {
1647     EcmaVM* vm = runtimeCallInfo->GetVM();
1648     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1649     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1650     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1651     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1652     if (secondArg->IsString(vm)) {
1653         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
1654         GetArkUINodeModifiers()->getSearchModifier()->setSearchInspectorId(nativeNode, stringValue.c_str());
1655     } else {
1656         GetArkUINodeModifiers()->getSearchModifier()->resetSearchInspectorId(nativeNode);
1657     }
1658     return panda::JSValueRef::Undefined(vm);
1659 }
1660 
ResetSearchInspectorId(ArkUIRuntimeCallInfo * runtimeCallInfo)1661 ArkUINativeModuleValue SearchBridge::ResetSearchInspectorId(ArkUIRuntimeCallInfo* runtimeCallInfo)
1662 {
1663     EcmaVM* vm = runtimeCallInfo->GetVM();
1664     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1665     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1666     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1667     GetArkUINodeModifiers()->getSearchModifier()->resetSearchInspectorId(nativeNode);
1668     return panda::JSValueRef::Undefined(vm);
1669 }
1670 
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1671 ArkUINativeModuleValue SearchBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1672 {
1673     EcmaVM* vm = runtimeCallInfo->GetVM();
1674     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1675     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1676     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1677     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1678 
1679     if (secondArg->IsBoolean()) {
1680         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
1681         GetArkUINodeModifiers()->getSearchModifier()->setSearchEnableHapticFeedback(nativeNode, value);
1682     } else {
1683         GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableHapticFeedback(nativeNode);
1684     }
1685     return panda::JSValueRef::Undefined(vm);
1686 }
1687 
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)1688 ArkUINativeModuleValue SearchBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1689 {
1690     EcmaVM* vm = runtimeCallInfo->GetVM();
1691     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1692     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1693     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1694     GetArkUINodeModifiers()->getSearchModifier()->resetSearchEnableHapticFeedback(nativeNode);
1695     return panda::JSValueRef::Undefined(vm);
1696 }
1697 } // namespace OHOS::Ace::NG
1698