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_span_ffi.h"
17 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_common_ffi.h"
18 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
19 #include "bridge/common/utils/utils.h"
20 #include "core/components_ng/pattern/text/span_model.h"
21 #include "cj_lambda.h"
22
23 using namespace OHOS::Ace::Framework;
24 using namespace OHOS::Ace;
25
26 namespace {
27 const std::vector<FontStyle> FONT_STYLES = {
28 FontStyle::NORMAL,
29 FontStyle::ITALIC
30 };
31 const std::vector<TextCase> TEXT_CASES = {
32 TextCase::NORMAL,
33 TextCase::LOWERCASE,
34 TextCase::UPPERCASE
35 };
36 const std::vector<TextDecoration> TEXT_DECRATIONS = {
37 TextDecoration::NONE,
38 TextDecoration::UNDERLINE,
39 TextDecoration::OVERLINE,
40 TextDecoration::LINE_THROUGH
41 };
42 } // namespace
43
44 extern "C" {
FfiOHOSAceFrameworkSpanCreate(const char * content)45 void FfiOHOSAceFrameworkSpanCreate(const char* content)
46 {
47 SpanModel::GetInstance()->Create(content);
48 }
49
FfiOHOSAceFrameworkSpanSetDecoration(int32_t type,uint32_t color)50 void FfiOHOSAceFrameworkSpanSetDecoration(int32_t type, uint32_t color)
51 {
52 if (!Utils::CheckParamsValid(type, TEXT_DECRATIONS.size())) {
53 LOGE("invalid value for scrollDirection");
54 return;
55 }
56 SpanModel::GetInstance()->SetTextDecoration(TEXT_DECRATIONS[type]);
57 SpanModel::GetInstance()->SetTextDecorationColor(Color(color));
58 }
59
FfiOHOSAceFrameworkSpanSetTextCase(int32_t textCase)60 void FfiOHOSAceFrameworkSpanSetTextCase(int32_t textCase)
61 {
62 if (!Utils::CheckParamsValid(textCase, TEXT_CASES.size())) {
63 LOGE("invalid value for scrollDirection");
64 return;
65 }
66 SpanModel::GetInstance()->SetTextCase(TEXT_CASES[textCase]);
67 }
68
FfiOHOSAceFrameworkSpanSetFontSize(double fontSize,int32_t unit)69 void FfiOHOSAceFrameworkSpanSetFontSize(double fontSize, int32_t unit)
70 {
71 Dimension value(fontSize, static_cast<DimensionUnit>(unit));
72 SpanModel::GetInstance()->SetFontSize(value);
73 }
74
FfiOHOSAceFrameworkSpanSetOnClick(void (* callback)(CJClickInfo clickInfo))75 void FfiOHOSAceFrameworkSpanSetOnClick(void (*callback)(CJClickInfo clickInfo))
76 {
77 auto lambda = [ffiOnClick = CJLambda::Create(callback)](const GestureEvent& event) -> void {
78 CJClickInfo cjClickInfo {};
79 CJEventTarget cjEventTarget {};
80 CJArea cjArea {};
81 CJPosition cjPosition {};
82 CJPosition cjGlobalPosition {};
83 AssambleCJClickInfo(event, cjClickInfo, cjEventTarget, cjArea, cjPosition, cjGlobalPosition);
84 ffiOnClick(cjClickInfo);
85 };
86
87 auto onClick = [lambda](const BaseEventInfo* info) {
88 const auto* clickInfo = TypeInfoHelper::DynamicCast<GestureEvent>(info);
89 auto newInfo = *clickInfo;
90 lambda(newInfo);
91 };
92 SpanModel::GetInstance()->SetOnClick(onClick);
93 return;
94 }
95
FfiOHOSAceFrameworkSpanSetFontFamily(const char * fontFamily)96 void FfiOHOSAceFrameworkSpanSetFontFamily(const char* fontFamily)
97 {
98 std::vector<std::string> fontFamilies;
99 fontFamilies = ConvertStrToFontFamilies(fontFamily);
100 SpanModel::GetInstance()->SetFontFamily(fontFamilies);
101 }
102
FfiOHOSAceFrameworkSpanSetFontWeight(const char * fontWeight)103 void FfiOHOSAceFrameworkSpanSetFontWeight(const char* fontWeight)
104 {
105 SpanModel::GetInstance()->SetFontWeight(ConvertStrToFontWeight(fontWeight));
106 }
107
FfiOHOSAceFrameworkSpanSetFontColor(uint32_t textColor)108 void FfiOHOSAceFrameworkSpanSetFontColor(uint32_t textColor)
109 {
110 SpanModel::GetInstance()->SetTextColor(Color(textColor));
111 }
112
FfiOHOSAceFrameworkSpanSetFontStyle(int32_t fontStyle)113 void FfiOHOSAceFrameworkSpanSetFontStyle(int32_t fontStyle)
114 {
115 if (!Utils::CheckParamsValid(fontStyle, FONT_STYLES.size())) {
116 LOGE("invalid value for scrollDirection");
117 return;
118 }
119 SpanModel::GetInstance()->SetItalicFontStyle(FONT_STYLES[fontStyle]);
120 }
121
FfiOHOSAceFrameworkSpanSetLetterSpacing(double space,int32_t unit)122 void FfiOHOSAceFrameworkSpanSetLetterSpacing(double space, int32_t unit)
123 {
124 Dimension value(space, static_cast<DimensionUnit>(unit));
125 SpanModel::GetInstance()->SetLetterSpacing(value);
126 }
127 }
128