• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H
18 
19 #include <optional>
20 
21 #include "base/memory/referenced.h"
22 #include "bridge/declarative_frontend/engine/bindings_defines.h"
23 #include "bridge/declarative_frontend/engine/functions/js_function.h"
24 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
25 #include "bridge/declarative_frontend/engine/js_types.h"
26 #include "bridge/declarative_frontend/jsview/js_container_base.h"
27 #include "core/components_ng/pattern/text/span/span_object.h"
28 #include "core/components_ng/pattern/text/text_model.h"
29 
30 namespace OHOS::Ace::Framework {
31 
32 class JSFontSpan : public virtual AceType {
33     DECLARE_ACE_TYPE(JSFontSpan, AceType)
34 
35 public:
36     JSFontSpan() = default;
37     ~JSFontSpan() override = default;
38     static void Constructor(const JSCallbackInfo& args);
39     static void Destructor(JSFontSpan* fontSpan);
40     static void JSBind(BindingTarget globalObj);
41     static RefPtr<FontSpan> ParseJsFontSpan(const JSRef<JSObject>& obj);
42     static void ParseJsFontColor(const JSRef<JSObject>& obj, Font& font);
43     static void ParseJsFontSize(const JSRef<JSObject>& obj, Font& font);
44     static void ParseJsFontWeight(const JSRef<JSObject>& obj, Font& font);
45     static void ParseJsFontFamily(const JSRef<JSObject>& obj, Font& font);
46     static void ParseJsFontStyle(const JSRef<JSObject>& obj, Font& font);
47     void GetFontColor(const JSCallbackInfo& info);
48     void SetFontColor(const JSCallbackInfo& info);
49     void GetFontFamily(const JSCallbackInfo& info);
50     void SetFontFamily(const JSCallbackInfo& info);
51     void GetFontSize(const JSCallbackInfo& info);
52     void SetFontSize(const JSCallbackInfo& info);
53     void GetFontWeight(const JSCallbackInfo& info);
54     void SetFontWeight(const JSCallbackInfo& info);
55     void GetFontStyle(const JSCallbackInfo& info);
56     void SetFontStyle(const JSCallbackInfo& info);
57 
58     const RefPtr<FontSpan>& GetFontSpan();
59     void SetFontSpan(const RefPtr<FontSpan>& fontSpan);
60 
61 private:
62     ACE_DISALLOW_COPY_AND_MOVE(JSFontSpan);
63     RefPtr<FontSpan> fontSpan_;
64 };
65 
66 class JSParagraphStyleSpan : public virtual AceType {
67     DECLARE_ACE_TYPE(JSParagraphStyleSpan, AceType)
68 
69 public:
70     JSParagraphStyleSpan() = default;
71     ~JSParagraphStyleSpan() override = default;
72     static void Constructor(const JSCallbackInfo& args);
73     static void Destructor(JSParagraphStyleSpan* paragraphStyleSpan);
74     static void JSBind(BindingTarget globalObj);
75     static RefPtr<ParagraphStyleSpan> ParseJsParagraphStyleSpan(const JSRef<JSObject>& obj);
76     static void ParseJsTextAlign(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
77     static void ParseJsTextIndent(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
78     static void ParseJsMaxLines(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
79     static void ParseJsTextOverflow(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
80     static void ParseJsWordBreak(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
81     static void ParseJsLeadingMargin(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
82     static void ParseLeadingMarginPixelMap(const JSRef<JSObject>& leadingMarginObject,
83         std::optional<NG::LeadingMargin>& margin, const JsiRef<JsiValue>& leadingMargin);
84     void GetTextAlign(const JSCallbackInfo& info);
85     void SetTextAlign(const JSCallbackInfo& info);
86     void SetTextIndent(const JSCallbackInfo& info);
87     void GetTextIndent(const JSCallbackInfo& info);
88     void SetMaxLines(const JSCallbackInfo& info);
89     void GetMaxLines(const JSCallbackInfo& info);
90     void SetOverflow(const JSCallbackInfo& info);
91     void GetOverflow(const JSCallbackInfo& info);
92     void SetWordBreak(const JSCallbackInfo& info);
93     void GetWordBreak(const JSCallbackInfo& info);
94     void SetLeadingMargin(const JSCallbackInfo& info);
95     void GetLeadingMargin(const JSCallbackInfo& info);
96 
97     static bool IsPixelMap(const JSRef<JSVal>& jsValue);
98 
99     RefPtr<ParagraphStyleSpan>& GetParagraphStyleSpan();
100     void SetParagraphStyleSpan(const RefPtr<ParagraphStyleSpan>& paragraphStyleSpan);
101 
102 private:
103     ACE_DISALLOW_COPY_AND_MOVE(JSParagraphStyleSpan);
104     RefPtr<ParagraphStyleSpan> paragraphStyleSpan_;
105 };
106 
107 class JSDecorationSpan : public virtual AceType {
108     DECLARE_ACE_TYPE(JSDecorationSpan, AceType)
109 
110 public:
111     JSDecorationSpan() = default;
112     ~JSDecorationSpan() override = default;
113     static void Constructor(const JSCallbackInfo& args);
114     static void Destructor(JSDecorationSpan* decorationSpan);
115     static void JSBind(BindingTarget globalObj);
116     static RefPtr<DecorationSpan> ParseJsDecorationSpan(const JSRef<JSObject>& obj);
117     void GetTextDecorationType(const JSCallbackInfo& info);
118     void SetTextDecorationType(const JSCallbackInfo& info);
119     void GetTextDecorationColor(const JSCallbackInfo& info);
120     void SetTextDecorationColor(const JSCallbackInfo& info);
121     void GetTextDecorationStyle(const JSCallbackInfo& info);
122     void SetTextDecorationStyle(const JSCallbackInfo& info);
123 
124     RefPtr<DecorationSpan>& GetDecorationSpan();
125     void SetDecorationSpan(const RefPtr<DecorationSpan>& decorationSpan);
126 
127 private:
128     ACE_DISALLOW_COPY_AND_MOVE(JSDecorationSpan);
129     RefPtr<DecorationSpan> decorationSpan_;
130 };
131 
132 class JSBaselineOffsetSpan : public virtual AceType {
133     DECLARE_ACE_TYPE(JSBaselineOffsetSpan, AceType)
134 
135 public:
136     JSBaselineOffsetSpan() = default;
137     ~JSBaselineOffsetSpan() override = default;
138     static void Constructor(const JSCallbackInfo& args);
139     static void Destructor(JSBaselineOffsetSpan* baselineOffsetSpan);
140     static void JSBind(BindingTarget globalObj);
141     static RefPtr<BaselineOffsetSpan> ParseJSBaselineOffsetSpan(const JSRef<JSObject>& obj);
142     void GetBaselineOffset(const JSCallbackInfo& info);
143     void SetBaselineOffset(const JSCallbackInfo& info);
144 
145     RefPtr<BaselineOffsetSpan>& GetBaselineOffsetSpan();
146     void SetBaselineOffsetSpan(const RefPtr<BaselineOffsetSpan>& baselineOffsetSpan);
147 
148 private:
149     ACE_DISALLOW_COPY_AND_MOVE(JSBaselineOffsetSpan);
150     RefPtr<BaselineOffsetSpan> baselineOffsetSpan_;
151 };
152 
153 class JSLetterSpacingSpan : public virtual AceType {
154     DECLARE_ACE_TYPE(JSLetterSpacingSpan, AceType)
155 
156 public:
157     JSLetterSpacingSpan() = default;
158     ~JSLetterSpacingSpan() override = default;
159     static void Constructor(const JSCallbackInfo& args);
160     static void Destructor(JSLetterSpacingSpan* letterSpacingSpan);
161     static void JSBind(BindingTarget globalObj);
162     static RefPtr<LetterSpacingSpan> ParseJSLetterSpacingSpan(const JSRef<JSObject>& obj);
163     void GetLetterSpacing(const JSCallbackInfo& info);
164     void SetLetterSpacing(const JSCallbackInfo& info);
165 
166     RefPtr<LetterSpacingSpan>& GetLetterSpacingSpan();
167     void SetLetterSpacingSpan(const RefPtr<LetterSpacingSpan>& letterSpacingSpan);
168 
169 private:
170     ACE_DISALLOW_COPY_AND_MOVE(JSLetterSpacingSpan);
171     RefPtr<LetterSpacingSpan> letterSpacingSpan_;
172 };
173 
174 class JSGestureSpan : public virtual AceType {
175     DECLARE_ACE_TYPE(JSGestureSpan, AceType)
176 
177 public:
178     JSGestureSpan() = default;
179     ~JSGestureSpan() override = default;
180     static void Constructor(const JSCallbackInfo& args);
181     static void Destructor(JSGestureSpan* gestureSpan);
182     static void JSBind(BindingTarget globalObj);
183     static RefPtr<GestureSpan> ParseJSGestureSpan(const JSCallbackInfo& args);
184 
185     RefPtr<GestureSpan>& GetGestureSpan();
186     void SetGestureSpan(const RefPtr<GestureSpan>& gestureSpan);
187 
188 private:
189     ACE_DISALLOW_COPY_AND_MOVE(JSGestureSpan);
190     RefPtr<GestureSpan> gestureSpan_;
191 };
192 
193 class JSTextShadowSpan : public virtual AceType {
194     DECLARE_ACE_TYPE(JSTextShadowSpan, AceType)
195 
196 public:
197     JSTextShadowSpan() = default;
198     ~JSTextShadowSpan() override = default;
199     static void Constructor(const JSCallbackInfo& args);
200     static void Destructor(JSTextShadowSpan* textShadowSpan);
201     static void JSBind(BindingTarget globalObj);
202     static RefPtr<TextShadowSpan> ParseJSTextShadowSpan(const JSRef<JSObject>& obj);
203     void GetTextShadow(const JSCallbackInfo& info);
204     void SetTextShadow(const JSCallbackInfo& info);
205 
206     RefPtr<TextShadowSpan>& GetTextShadowSpan();
207     void SetTextShadowSpan(const RefPtr<TextShadowSpan>& textShadowSpan);
208 
209 private:
210     ACE_DISALLOW_COPY_AND_MOVE(JSTextShadowSpan);
211     RefPtr<TextShadowSpan> textShadowSpan_;
212 };
213 
214 class JSLineHeightSpan : public virtual AceType {
215     DECLARE_ACE_TYPE(JSLineHeightSpan, AceType)
216 
217 public:
218     JSLineHeightSpan() = default;
219     ~JSLineHeightSpan() override = default;
220     static void Constructor(const JSCallbackInfo& args);
221     static void Destructor(JSLineHeightSpan* textShadowSpan);
222     static void JSBind(BindingTarget globalObj);
223     static RefPtr<LineHeightSpan> ParseJSLineHeightSpan(const JSRef<JSObject>& obj);
224     void GetLineHeight(const JSCallbackInfo& info);
225     void SetLineHeight(const JSCallbackInfo& info);
226 
227     RefPtr<LineHeightSpan>& GetLineHeightSpan();
228     void SetLineHeightSpan(const RefPtr<LineHeightSpan>& lineHeightSpan);
229 
230 private:
231     ACE_DISALLOW_COPY_AND_MOVE(JSLineHeightSpan);
232     RefPtr<LineHeightSpan> lineHeightSpan_;
233 };
234 
235 class JSImageAttachment : public virtual AceType {
236     DECLARE_ACE_TYPE(JSImageAttachment, AceType)
237 
238 public:
239     JSImageAttachment() = default;
240     ~JSImageAttachment() override = default;
241     static void Constructor(const JSCallbackInfo& args);
242     static void Destructor(JSImageAttachment* imageSpan);
243     static void JSBind(BindingTarget globalObj);
244     static RefPtr<ImageSpan> ParseJsImageSpan(const JSRef<JSObject>& obj);
245     void GetImageSrc(const JSCallbackInfo& info);
SetImageSrc(const JSCallbackInfo & info)246     void SetImageSrc(const JSCallbackInfo& info) {}
247     void GetImageSize(const JSCallbackInfo& info);
SetImageSize(const JSCallbackInfo & info)248     void SetImageSize(const JSCallbackInfo& info) {}
249     void GetImageVerticalAlign(const JSCallbackInfo& info);
SetImageVerticalAlign(const JSCallbackInfo & info)250     void SetImageVerticalAlign(const JSCallbackInfo& info) {}
251     void GetImageObjectFit(const JSCallbackInfo& info);
SetImageObjectFit(const JSCallbackInfo & info)252     void SetImageObjectFit(const JSCallbackInfo& info) {}
253     void GetImageLayoutStyle(const JSCallbackInfo& info);
SetImageLayoutStyle(const JSCallbackInfo & info)254     void SetImageLayoutStyle(const JSCallbackInfo& info) {}
255 
256     const RefPtr<ImageSpan>& GetImageSpan();
257     void SetImageSpan(const RefPtr<ImageSpan>& imageSpan);
258     const ImageSpanOptions& GetImageOptions() const;
259 
260 private:
261     static ImageSpanOptions CreateImageOptions(const JSRef<JSObject>& obj);
262     static ImageSpanAttribute ParseJsImageSpanAttribute(const JSRef<JSObject>& obj);
263     static JSRef<JSObject> CreateEdge(const NG::PaddingPropertyT<NG::CalcLength>& edge);
264     static JSRef<JSObject> CreateBorderRadius(const NG::BorderRadiusProperty& borderRadius);
265     static void ParseJsImageSpanSizeAttribute(const JSRef<JSObject>& obj, ImageSpanAttribute& imageStyle);
266 
267     ACE_DISALLOW_COPY_AND_MOVE(JSImageAttachment);
268     RefPtr<ImageSpan> imageSpan_;
269 };
270 
271 class JSNativeCustomSpan : public virtual AceType {
272     DECLARE_ACE_TYPE(JSNativeCustomSpan, AceType)
273 
274 public:
275     JSNativeCustomSpan() = default;
276     ~JSNativeCustomSpan() override = default;
277     static void Constructor(const JSCallbackInfo& args);
278     static void Destructor(JSNativeCustomSpan* imageSpan);
279     static void JSBind(BindingTarget globalObj);
280     void Invalidate(const JSCallbackInfo& info);
281     void AddStyledString(const WeakPtr<SpanStringBase>& spanString);
282     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString);
283 
284 private:
285     std::set<WeakPtr<SpanStringBase>> spanStringBaseSet_;
286 };
287 
288 class JSCustomSpan : public CustomSpan {
289     DECLARE_ACE_TYPE(JSCustomSpan, CustomSpan)
290 
291 public:
292     JSCustomSpan() = default;
293     JSCustomSpan(JSRef<JSObject> customSpanObj, const JSCallbackInfo& args);
294     JSCustomSpan(JSRef<JSObject> customSpanObj,
295         std::optional<std::function<CustomSpanMetrics(CustomSpanMeasureInfo)>> onMeasure,
296         std::optional<std::function<void(NG::DrawingContext&, CustomSpanOptions)>> onDraw, int32_t start, int32_t end);
297     ~JSCustomSpan() override = default;
298     static std::function<CustomSpanMetrics(CustomSpanMeasureInfo)> ParseOnMeasureFunc(
299         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
300     static std::function<void(NG::DrawingContext&, CustomSpanOptions)> ParseOnDrawFunc(
301         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
302     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
303     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
304     void SetJsCustomSpanObject(const JSRef<JSObject>& customSpanObj);
305     JSRef<JSObject>& GetJsCustomSpanObject();
306     void AddStyledString(const WeakPtr<SpanStringBase>& spanString) override;
307     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString) override;
308 
309 private:
310     ACE_DISALLOW_COPY_AND_MOVE(JSCustomSpan);
311     RefPtr<JSNativeCustomSpan> customSpan_;
312     JSRef<JSObject> customSpanObj_;
313 };
314 
315 class JSExtSpan : public ExtSpan {
316     DECLARE_ACE_TYPE(JSExtSpan, ExtSpan)
317 
318 public:
319     JSExtSpan() = default;
320     JSExtSpan(JSRef<JSObject> customSpanObj);
321     JSExtSpan(JSRef<JSObject> customSpanObj, int32_t start, int32_t end);
322     ~JSExtSpan() override = default;
323 
324     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
325     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
326     void SetJsExtSpanObject(const JSRef<JSObject>& extSpanObj);
327     JSRef<JSObject>& GetJsExtSpanObject();
328 
329 private:
330     ACE_DISALLOW_COPY_AND_MOVE(JSExtSpan);
331     JSRef<JSObject> extSpanObj_;
332 };
333 } // namespace OHOS::Ace::Framework
334 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H