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