1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_search_ffi.h"
17 
18 #include "cj_lambda.h"
19 
20 #include "bridge/cj_frontend/cppview/search_controller.h"
21 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h"
22 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
23 #include "bridge/common/utils/utils.h"
24 #include "core/components_ng/base/view_abstract.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/search/search_model.h"
27 #include "frameworks/core/components/text_field/text_field_controller.h"
28 
29 using namespace OHOS::Ace;
30 using namespace OHOS::FFI;
31 using namespace OHOS::Ace::Framework;
32 
33 namespace {
34 const std::vector<FontStyle> FONT_STYLE = { FontStyle::NORMAL, FontStyle::ITALIC };
35 const std::vector<BorderStyle> BORDER_STYLES = { BorderStyle::SOLID, BorderStyle::DASHED, BorderStyle::DOTTED };
36 const std::vector<CopyOptions> COPY_OPTION = {
37     CopyOptions::None,
38     CopyOptions::InApp,
39     CopyOptions::Local,
40     CopyOptions::Distributed,
41 };
42 
handleFont(double fontSize,int32_t sizeUnit,const char * fontWeight,int32_t fontStyle,const char * fontFamily,Font & font)43 void handleFont(double fontSize,
44     int32_t sizeUnit,
45     const char* fontWeight,
46     int32_t fontStyle,
47     const char* fontFamily,
48     Font& font)
49 {
50     Dimension fontSizeDim(fontSize, static_cast<DimensionUnit>(sizeUnit));
51     font.fontSize = fontSizeDim;
52     font.fontWeight = ConvertStrToFontWeight(fontWeight);
53     font.fontFamilies = ConvertStrToFontFamilies(fontFamily);
54     font.fontStyle = FONT_STYLE[fontStyle];
55 }
56 } // namespace
57 
58 extern "C" {
FfiOHOSAceFrameworkSearchCreateByIconID(SearchCreateParam value)59 void FfiOHOSAceFrameworkSearchCreateByIconID(SearchCreateParam value)
60 {
61     std::string iconUrl = "";
62     std::optional<std::string> key = value.value;
63     std::optional<std::string> tip = value.placeholder;
64     std::optional<std::string> src = iconUrl;
65     if (!ParseCjMedia(value.iconID, static_cast<ResourceType>(value.iconType), value.iconParams, iconUrl)) {
66         LOGI("icon url not found");
67     }
68     if (value.controllerID == -1) {
69         SearchModel::GetInstance()->Create(key, tip, src);
70     } else {
71         auto self_ = FFIData::GetData<SearchController>(value.controllerID);
72         if (self_ != nullptr) {
73                 auto controller = SearchModel::GetInstance()->Create(key, tip, src);
74                 self_->SetController(controller);
75         } else {
76             LOGE("invalid scrollerID");
77         }
78     }
79     std::string bundleName;
80     std::string moduleName;
81     SearchModel::GetInstance()->SetSearchSrcPath(iconUrl, bundleName, moduleName);
82 }
83 
FfiOHOSAceFrameworkSearchSetSearchButton(const char * text)84 void FfiOHOSAceFrameworkSearchSetSearchButton(const char* text)
85 {
86     SearchModel::GetInstance()->SetSearchButton(text);
87 }
88 
FfiOHOSAceFrameworkSearchSetPlaceholderColor(uint32_t color)89 void FfiOHOSAceFrameworkSearchSetPlaceholderColor(uint32_t color)
90 {
91     SearchModel::GetInstance()->SetPlaceholderColor(Color(color));
92 }
93 
FfiOHOSAceFrameworkSearchSetPlaceholderFont(double fontSize,int32_t sizeUnit,const char * fontWeight,int32_t fontStyle,const char * fontFamily)94 void FfiOHOSAceFrameworkSearchSetPlaceholderFont(
95     double fontSize, int32_t sizeUnit, const char* fontWeight, int32_t fontStyle, const char* fontFamily)
96 {
97     if (!Utils::CheckParamsValid(fontStyle, FONT_STYLE.size())) {
98         LOGE("invalid value for fontStyle");
99         return;
100     }
101     Font font;
102     handleFont(fontSize, sizeUnit, fontWeight, fontStyle, fontFamily, font);
103     SearchModel::GetInstance()->SetPlaceholderFont(font);
104 }
105 
FfiOHOSAceFrameworkSearchSetTextFont(double fontSize,int32_t sizeUnit,const char * fontWeight,int32_t fontStyle,const char * fontFamily)106 void FfiOHOSAceFrameworkSearchSetTextFont(
107     double fontSize, int32_t sizeUnit, const char* fontWeight, int32_t fontStyle, const char* fontFamily)
108 {
109     if (!Utils::CheckParamsValid(fontStyle, FONT_STYLE.size())) {
110         LOGE("invalid value for fontStyle");
111         return;
112     }
113     Font font;
114     handleFont(fontSize, sizeUnit, fontWeight, fontStyle, fontFamily, font);
115     SearchModel::GetInstance()->SetTextFont(font);
116 }
117 
FfiOHOSAceFrameworkSearchSetBorder(SearchSetBorder value)118 void FfiOHOSAceFrameworkSearchSetBorder(SearchSetBorder value)
119 {
120     if (!Utils::CheckParamsValid(value.style, BORDER_STYLES.size())) {
121         LOGE("invalid value for style");
122         return;
123     }
124     FfiOHOSAceFrameworkViewAbstractSetBorder(CJBorder({
125         value.width, value.widthUnit, value.color, value.radius, value.radiusUnit, value.style }));
126     SearchModel::GetInstance()->SetBackBorder();
127 }
128 
FfiOHOSAceFrameworkSearchSetBorderWidth(double width,int32_t widthUnit)129 void FfiOHOSAceFrameworkSearchSetBorderWidth(double width, int32_t widthUnit)
130 {
131     FfiOHOSAceFrameworkViewAbstractSetBorderWidth(width, widthUnit);
132     SearchModel::GetInstance()->SetBackBorder();
133 }
134 
FfiOHOSAceFrameworkSearchSetBorderColor(uint32_t color)135 void FfiOHOSAceFrameworkSearchSetBorderColor(uint32_t color)
136 {
137     FfiOHOSAceFrameworkViewAbstractSetBorderColor(color);
138     SearchModel::GetInstance()->SetBackBorder();
139 }
140 
FfiOHOSAceFrameworkSearchSetBorderStyle(int32_t style)141 void FfiOHOSAceFrameworkSearchSetBorderStyle(int32_t style)
142 {
143     if (!Utils::CheckParamsValid(style, BORDER_STYLES.size())) {
144         LOGE("invalid value for style");
145         return;
146     }
147     FfiOHOSAceFrameworkViewAbstractSetBorderStyle(style);
148     SearchModel::GetInstance()->SetBackBorder();
149 }
150 
FfiOHOSAceFrameworkSearchSetBorderRadius(double radius,int32_t radiusUnit)151 void FfiOHOSAceFrameworkSearchSetBorderRadius(double radius, int32_t radiusUnit)
152 {
153     FfiOHOSAceFrameworkViewAbstractSetBorderRadius(radius, radiusUnit);
154     SearchModel::GetInstance()->SetBackBorder();
155 }
156 
FfiOHOSAceFrameworkSearchSetHeight(double height,int32_t heightUnit)157 void FfiOHOSAceFrameworkSearchSetHeight(double height, int32_t heightUnit)
158 {
159     Dimension heightDim(height, static_cast<DimensionUnit>(heightUnit));
160     NG::ViewAbstract::SetHeight(NG::CalcLength(heightDim));
161     if (LessNotEqual(heightDim.Value(), 0.0)) {
162         heightDim.SetValue(0.0);
163     }
164     SearchModel::GetInstance()->SetHeight(heightDim);
165 }
166 
FfiOHOSAceFrameworkSearchSetCopyOption(int32_t copyOption)167 void FfiOHOSAceFrameworkSearchSetCopyOption(int32_t copyOption)
168 {
169     if (!Utils::CheckParamsValid(copyOption, COPY_OPTION.size())) {
170         LOGE("invalid value for style");
171         return;
172     }
173     SearchModel::GetInstance()->SetCopyOption(COPY_OPTION[copyOption]);
174 }
175 
FfiOHOSAceFrameworkSearchOnSubmit(void (* callback)(const char * value))176 void FfiOHOSAceFrameworkSearchOnSubmit(void (*callback)(const char* value))
177 {
178     auto onSubmit = [lambda = CJLambda::Create(callback)](const std::string& value) -> void { lambda(value.c_str()); };
179     SearchModel::GetInstance()->SetOnSubmit(std::move(onSubmit));
180 }
181 
FfiOHOSAceFrameworkSearchOnChange(void (* callback)(const char * value))182 void FfiOHOSAceFrameworkSearchOnChange(void (*callback)(const char* value))
183 {
184     auto onChange = [lambda = CJLambda::Create(callback)](const std::string& value,
185         PreviewText& previewText) -> void { lambda(value.c_str()); };
186     SearchModel::GetInstance()->SetOnChange(std::move(onChange));
187 }
188 
FfiOHOSAceFrameworkSearchOnCopy(void (* callback)(const char * value))189 void FfiOHOSAceFrameworkSearchOnCopy(void (*callback)(const char* value))
190 {
191     auto onCopy = [lambda = CJLambda::Create(callback)](const std::string& value) -> void { lambda(value.c_str()); };
192     SearchModel::GetInstance()->SetOnCopy(std::move(onCopy));
193 }
194 
FfiOHOSAceFrameworkSearchOnCut(void (* callback)(const char * value))195 void FfiOHOSAceFrameworkSearchOnCut(void (*callback)(const char* value))
196 {
197     auto onCut = [lambda = CJLambda::Create(callback)](const std::string& value) -> void { lambda(value.c_str()); };
198     SearchModel::GetInstance()->SetOnCut(std::move(onCut));
199 }
200 
FfiOHOSAceFrameworkSearchOnPaste(void (* callback)(const char * value))201 void FfiOHOSAceFrameworkSearchOnPaste(void (*callback)(const char* value))
202 {
203     auto onPaste = [lambda = CJLambda::Create(callback)](const std::string& val, NG::TextCommonEvent& info) -> void {
204         LOGI("OnPaste called.");
205         lambda(val.c_str());
206     };
207     SearchModel::GetInstance()->SetOnPasteWithEvent(std::move(onPaste));
208 }
209 
FfiOHOSAceFrameworkSearchController()210 int64_t FfiOHOSAceFrameworkSearchController()
211 {
212     auto ret_ = FFIData::Create<SearchController>();
213     if (ret_ == nullptr) {
214         return FFI_ERROR_CODE;
215     }
216     return ret_->GetID();
217 }
218 
FfiOHOSAceFrameworkSearchCaretPosition(int64_t selfID,int32_t carePosition)219 void FfiOHOSAceFrameworkSearchCaretPosition(int64_t selfID, int32_t carePosition)
220 {
221     auto self_ = FFIData::GetData<SearchController>(selfID);
222     if (self_ != nullptr) {
223         self_->CaretPosition(carePosition);
224     } else {
225         LOGE("invalid SearchControllerID");
226     }
227 }
228 }
229