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