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 class JSBackgroundColorSpan : public virtual AceType {
214     DECLARE_ACE_TYPE(JSBackgroundColorSpan, AceType)
215 
216 public:
217     JSBackgroundColorSpan() = default;
218     ~JSBackgroundColorSpan() override = default;
219     static void Constructor(const JSCallbackInfo& args);
220     static void Destructor(JSBackgroundColorSpan* backgroundColorSpan);
221     static void JSBind(BindingTarget globalObj);
222     static RefPtr<BackgroundColorSpan> ParseJSBackgroundColorSpan(const JSCallbackInfo& info);
223     void GetBackgroundColor(const JSCallbackInfo& info);
224     void SetBackgroundColor(const JSCallbackInfo& info);
225 
226     RefPtr<BackgroundColorSpan>& GetBackgroundColorSpan();
227     void SetBackgroundColorSpan(const RefPtr<BackgroundColorSpan>& backgroundColorSpan);
228 
229 private:
230     ACE_DISALLOW_COPY_AND_MOVE(JSBackgroundColorSpan);
231     RefPtr<BackgroundColorSpan> backgroundColorSpan_;
232 };
233 class JSLineHeightSpan : public virtual AceType {
234     DECLARE_ACE_TYPE(JSLineHeightSpan, AceType)
235 
236 public:
237     JSLineHeightSpan() = default;
238     ~JSLineHeightSpan() override = default;
239     static void Constructor(const JSCallbackInfo& args);
240     static void Destructor(JSLineHeightSpan* textShadowSpan);
241     static void JSBind(BindingTarget globalObj);
242     static RefPtr<LineHeightSpan> ParseJSLineHeightSpan(const JSRef<JSObject>& obj);
243     void GetLineHeight(const JSCallbackInfo& info);
244     void SetLineHeight(const JSCallbackInfo& info);
245 
246     RefPtr<LineHeightSpan>& GetLineHeightSpan();
247     void SetLineHeightSpan(const RefPtr<LineHeightSpan>& lineHeightSpan);
248 
249 private:
250     ACE_DISALLOW_COPY_AND_MOVE(JSLineHeightSpan);
251     RefPtr<LineHeightSpan> lineHeightSpan_;
252 };
253 
254 class JSImageAttachment : public virtual AceType {
255     DECLARE_ACE_TYPE(JSImageAttachment, AceType)
256 
257 public:
258     JSImageAttachment() = default;
259     ~JSImageAttachment() override = default;
260     static void Constructor(const JSCallbackInfo& args);
261     static void Destructor(JSImageAttachment* imageSpan);
262     static void JSBind(BindingTarget globalObj);
263     static RefPtr<ImageSpan> ParseJsImageSpan(const JSRef<JSObject>& obj);
264     void GetImageSrc(const JSCallbackInfo& info);
SetImageSrc(const JSCallbackInfo & info)265     void SetImageSrc(const JSCallbackInfo& info) {}
266     void GetImageSize(const JSCallbackInfo& info);
SetImageSize(const JSCallbackInfo & info)267     void SetImageSize(const JSCallbackInfo& info) {}
268     void GetImageVerticalAlign(const JSCallbackInfo& info);
SetImageVerticalAlign(const JSCallbackInfo & info)269     void SetImageVerticalAlign(const JSCallbackInfo& info) {}
270     void GetImageObjectFit(const JSCallbackInfo& info);
SetImageObjectFit(const JSCallbackInfo & info)271     void SetImageObjectFit(const JSCallbackInfo& info) {}
272     void GetImageLayoutStyle(const JSCallbackInfo& info);
SetImageLayoutStyle(const JSCallbackInfo & info)273     void SetImageLayoutStyle(const JSCallbackInfo& info) {}
274 
275     const RefPtr<ImageSpan>& GetImageSpan();
276     void SetImageSpan(const RefPtr<ImageSpan>& imageSpan);
277     const ImageSpanOptions& GetImageOptions() const;
278 
279 private:
280     static ImageSpanOptions CreateImageOptions(const JSRef<JSObject>& obj);
281     static ImageSpanAttribute ParseJsImageSpanAttribute(const JSRef<JSObject>& obj);
282     static JSRef<JSObject> CreateEdge(const NG::PaddingPropertyT<NG::CalcLength>& edge);
283     static JSRef<JSObject> CreateBorderRadius(const NG::BorderRadiusProperty& borderRadius);
284     static void ParseJsImageSpanSizeAttribute(const JSRef<JSObject>& obj, ImageSpanAttribute& imageStyle);
285 
286     ACE_DISALLOW_COPY_AND_MOVE(JSImageAttachment);
287     RefPtr<ImageSpan> imageSpan_;
288 };
289 
290 class JSNativeCustomSpan : public virtual AceType {
291     DECLARE_ACE_TYPE(JSNativeCustomSpan, AceType)
292 
293 public:
294     JSNativeCustomSpan() = default;
295     ~JSNativeCustomSpan() override = default;
296     static void Constructor(const JSCallbackInfo& args);
297     static void Destructor(JSNativeCustomSpan* imageSpan);
298     static void JSBind(BindingTarget globalObj);
299     void Invalidate(const JSCallbackInfo& info);
300     void AddStyledString(const WeakPtr<SpanStringBase>& spanString);
301     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString);
302 
303 private:
304     std::set<WeakPtr<SpanStringBase>> spanStringBaseSet_;
305 };
306 
307 class JSCustomSpan : public CustomSpan {
308     DECLARE_ACE_TYPE(JSCustomSpan, CustomSpan)
309 
310 public:
311     JSCustomSpan() = default;
312     JSCustomSpan(JSRef<JSObject> customSpanObj, const JSCallbackInfo& args);
313     JSCustomSpan(JSRef<JSObject> customSpanObj,
314         std::optional<std::function<CustomSpanMetrics(CustomSpanMeasureInfo)>> onMeasure,
315         std::optional<std::function<void(NG::DrawingContext&, CustomSpanOptions)>> onDraw, int32_t start, int32_t end);
316     ~JSCustomSpan() override = default;
317     static std::function<CustomSpanMetrics(CustomSpanMeasureInfo)> ParseOnMeasureFunc(
318         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
319     static std::function<void(NG::DrawingContext&, CustomSpanOptions)> ParseOnDrawFunc(
320         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
321     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
322     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
323     void SetJsCustomSpanObject(const JSRef<JSObject>& customSpanObj);
324     JSRef<JSObject>& GetJsCustomSpanObject();
325     void AddStyledString(const WeakPtr<SpanStringBase>& spanString) override;
326     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString) override;
327 
328 private:
329     ACE_DISALLOW_COPY_AND_MOVE(JSCustomSpan);
330     RefPtr<JSNativeCustomSpan> customSpan_;
331     JSRef<JSObject> customSpanObj_;
332 };
333 
334 class JSExtSpan : public ExtSpan {
335     DECLARE_ACE_TYPE(JSExtSpan, ExtSpan)
336 
337 public:
338     JSExtSpan() = default;
339     JSExtSpan(JSRef<JSObject> customSpanObj);
340     JSExtSpan(JSRef<JSObject> customSpanObj, int32_t start, int32_t end);
341     ~JSExtSpan() override = default;
342 
343     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
344     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
345     void SetJsExtSpanObject(const JSRef<JSObject>& extSpanObj);
346     JSRef<JSObject>& GetJsExtSpanObject();
347 
348 private:
349     ACE_DISALLOW_COPY_AND_MOVE(JSExtSpan);
350     JSRef<JSObject> extSpanObj_;
351 };
352 
353 class JSUrlSpan : public virtual AceType {
354     DECLARE_ACE_TYPE(JSUrlSpan, AceType)
355 
356 public:
357     JSUrlSpan() = default;
358     ~JSUrlSpan() override = default;
359     static void Constructor(const JSCallbackInfo& args);
360     static void Destructor(JSUrlSpan* urlSpan);
361     static void JSBind(BindingTarget globalObj);
362     void GetUrlContext(const JSCallbackInfo& info);
363     void SetUrlContext(const JSCallbackInfo& info);
364 
365     const RefPtr<UrlSpan>& GetUrlSpan();
366     void SetUrlSpan(const RefPtr<UrlSpan>& urlSpan);
367 
368 private:
369     ACE_DISALLOW_COPY_AND_MOVE(JSUrlSpan);
370     RefPtr<UrlSpan> urlContextSpan_;
371 };
372 } // namespace OHOS::Ace::Framework
373 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H