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 }