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_text_ffi.h"
17
18 #include "cj_lambda.h"
19
20 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_view_abstract_ffi.h"
21 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
22 #include "bridge/common/utils/utils.h"
23 #include "core/components_ng/base/view_abstract_model.h"
24 #include "core/components_ng/pattern/text/text_model_ng.h"
25 #include "core/event/ace_event_handler.h"
26 #include "core/gestures/click_recognizer.h"
27
28 using namespace OHOS::Ace;
29 using namespace OHOS::Ace::Framework;
30
31 namespace {
32 const std::vector<TextCase> TEXT_CASES = { TextCase::NORMAL, TextCase::LOWERCASE, TextCase::UPPERCASE };
33 const std::vector<TextOverflow> TEXT_OVERFLOWS = { TextOverflow::CLIP, TextOverflow::ELLIPSIS, TextOverflow::NONE };
34 const std::vector<FontStyle> FONT_STYLES = { FontStyle::NORMAL, FontStyle::ITALIC };
35 const std::vector<TextAlign> TEXT_ALIGNS = { TextAlign::START, TextAlign::CENTER, TextAlign::END, TextAlign::LEFT,
36 TextAlign::RIGHT, TextAlign::JUSTIFY };
37 const std::vector<TextDecoration> TEXT_DECORATIONS = { TextDecoration::NONE, TextDecoration::UNDERLINE,
38 TextDecoration::OVERLINE, TextDecoration::LINE_THROUGH };
39 } // namespace
40
41 extern "C" {
FfiOHOSAceFrameworkTextCreate(const char * content)42 void FfiOHOSAceFrameworkTextCreate(const char* content)
43 {
44 TextModel::GetInstance()->Create(content);
45 }
46
FfiOHOSAceFrameworkTextSetWidth(double width,int32_t unit)47 void FfiOHOSAceFrameworkTextSetWidth(double width, int32_t unit)
48 {
49 Dimension value(width, static_cast<DimensionUnit>(unit));
50 ViewAbstractModel::GetInstance()->SetWidth(value);
51 TextModel::GetInstance()->OnSetWidth();
52 }
53
FfiOHOSAceFrameworkTextSetHeight(double height,int32_t unit)54 void FfiOHOSAceFrameworkTextSetHeight(double height, int32_t unit)
55 {
56 Dimension value(height, static_cast<DimensionUnit>(unit));
57 ViewAbstractModel::GetInstance()->SetHeight(value);
58 TextModel::GetInstance()->OnSetHeight();
59 }
60
FfiOHOSAceFrameworkTextSetFontSize(double fontSize,int32_t unit)61 void FfiOHOSAceFrameworkTextSetFontSize(double fontSize, int32_t unit)
62 {
63 Dimension value(fontSize, static_cast<DimensionUnit>(unit));
64 TextModel::GetInstance()->SetFontSize(value);
65 }
66
FfiOHOSAceFrameworkTextSetFontWeight(const char * fontWeight)67 void FfiOHOSAceFrameworkTextSetFontWeight(const char* fontWeight)
68 {
69 TextModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(fontWeight));
70 }
71
FfiOHOSAceFrameworkTextSetFontColor(uint32_t textColor)72 void FfiOHOSAceFrameworkTextSetFontColor(uint32_t textColor)
73 {
74 TextModel::GetInstance()->SetTextColor(Color(textColor));
75 }
76
FfiOHOSAceFrameworkTextSetTextOverflow(int32_t overflow)77 void FfiOHOSAceFrameworkTextSetTextOverflow(int32_t overflow)
78 {
79 if (!Utils::CheckParamsValid(overflow, TEXT_OVERFLOWS.size())) {
80 LOGE("invalid value for over flow");
81 return;
82 }
83 TextModel::GetInstance()->SetTextOverflow(TEXT_OVERFLOWS[overflow]);
84 }
85
FfiOHOSAceFrameworkTextSetMaxLines(int32_t maxLines)86 void FfiOHOSAceFrameworkTextSetMaxLines(int32_t maxLines)
87 {
88 TextModel::GetInstance()->SetMaxLines(maxLines);
89 }
90
FfiOHOSAceFrameworkTextSetFontStyle(int32_t fontStyle)91 void FfiOHOSAceFrameworkTextSetFontStyle(int32_t fontStyle)
92 {
93 if (!Utils::CheckParamsValid(fontStyle, FONT_STYLES.size())) {
94 LOGE("invalid value for font style");
95 return;
96 }
97 TextModel::GetInstance()->SetItalicFontStyle(FONT_STYLES[fontStyle]);
98 }
99
FfiOHOSAceFrameworkTextSetTextAlign(int32_t textAlign)100 void FfiOHOSAceFrameworkTextSetTextAlign(int32_t textAlign)
101 {
102 if (!Utils::CheckParamsValid(textAlign, TEXT_ALIGNS.size())) {
103 LOGE("invalid value for text align");
104 return;
105 }
106 TextModel::GetInstance()->SetTextAlign(TEXT_ALIGNS[textAlign]);
107 }
108
FfiOHOSAceFrameworkTextSetLineHeight(double lineHeight,int32_t unit)109 void FfiOHOSAceFrameworkTextSetLineHeight(double lineHeight, int32_t unit)
110 {
111 Dimension dimValue(lineHeight, static_cast<DimensionUnit>(unit));
112 TextModel::GetInstance()->SetLineHeight(dimValue);
113 }
114
FfiOHOSAceFrameworkTextSetFontFamily(const char * fontFamily)115 void FfiOHOSAceFrameworkTextSetFontFamily(const char* fontFamily)
116 {
117 std::vector<std::string> fontFamilies;
118 fontFamilies = ConvertStrToFontFamilies(fontFamily);
119 TextModel::GetInstance()->SetFontFamily(fontFamilies);
120 }
121
FfiOHOSAceFrameworkTextSetDecoration(int32_t typeValue,uint32_t colorValue)122 void FfiOHOSAceFrameworkTextSetDecoration(int32_t typeValue, uint32_t colorValue)
123 {
124 if (!Utils::CheckParamsValid(typeValue, TEXT_DECORATIONS.size())) {
125 LOGE("invalid value for text decoration");
126 return;
127 }
128 TextModel::GetInstance()->SetTextDecoration(TEXT_DECORATIONS[typeValue]);
129 TextModel::GetInstance()->SetTextDecorationColor(Color(colorValue));
130 }
131
FfiOHOSAceFrameworkTextSetMinFontSize(double fontSize,int32_t unit)132 void FfiOHOSAceFrameworkTextSetMinFontSize(double fontSize, int32_t unit)
133 {
134 Dimension dimValue(fontSize, static_cast<DimensionUnit>(unit));
135 TextModel::GetInstance()->SetAdaptMinFontSize(dimValue);
136 }
137
FfiOHOSAceFrameworkTextSetMaxFontSize(double fontSize,int32_t unit)138 void FfiOHOSAceFrameworkTextSetMaxFontSize(double fontSize, int32_t unit)
139 {
140 Dimension dimValue(fontSize, static_cast<DimensionUnit>(unit));
141 TextModel::GetInstance()->SetAdaptMaxFontSize(dimValue);
142 }
143
FfiOHOSAceFrameworkTextSetTextCase(int32_t textCase)144 void FfiOHOSAceFrameworkTextSetTextCase(int32_t textCase)
145 {
146 if (!Utils::CheckParamsValid(textCase, TEXT_CASES.size())) {
147 LOGE("invalid value for text case");
148 return;
149 }
150 TextModel::GetInstance()->SetTextCase(TEXT_CASES[textCase]);
151 }
152
FfiOHOSAceFrameworkTextSetBaselineOffset(double baseLine,int32_t unit)153 void FfiOHOSAceFrameworkTextSetBaselineOffset(double baseLine, int32_t unit)
154 {
155 Dimension dimValue(baseLine, static_cast<DimensionUnit>(unit));
156 TextModel::GetInstance()->SetBaselineOffset(dimValue);
157 }
158
FfiOHOSAceFrameworkTextOnClick(void (* callback)(CJClickInfo clickInfo))159 void FfiOHOSAceFrameworkTextOnClick(void (*callback)(CJClickInfo clickInfo)) {}
160
FfiTextSetResponseRegion(CJResponseRegion value)161 void FfiTextSetResponseRegion(CJResponseRegion value)
162 {
163 std::vector<DimensionRect> result;
164 ParseCJResponseRegion(value, result);
165 ViewAbstractModel::GetInstance()->SetResponseRegion(result);
166 TextModel::GetInstance()->SetResponseRegion(true);
167 }
168
FfiTextSetResponseRegionArray(VectorStringPtr vecContent)169 void FfiTextSetResponseRegionArray(VectorStringPtr vecContent)
170 {
171 std::vector<DimensionRect> result;
172 ParseVectorStringPtr(vecContent, result);
173 ViewAbstractModel::GetInstance()->SetResponseRegion(result);
174 TextModel::GetInstance()->SetResponseRegion(true);
175 }
176 }