• 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 class JSFontSpan : public virtual AceType {
32     DECLARE_ACE_TYPE(JSFontSpan, AceType)
33 
34 public:
35     JSFontSpan() = default;
36     ~JSFontSpan() override = default;
37     static void Constructor(const JSCallbackInfo& args);
38     static void Destructor(JSFontSpan* fontSpan);
39     static void JSBind(BindingTarget globalObj);
40     static RefPtr<FontSpan> ParseJsFontSpan(const JSRef<JSObject>& obj);
41     static void ParseJsFontColor(const JSRef<JSObject>& obj, Font& font);
42     static void ParseJsFontSize(const JSRef<JSObject>& obj, Font& font);
43     static void ParseJsFontWeight(const JSRef<JSObject>& obj, Font& font);
44     static void ParseJsFontFamily(const JSRef<JSObject>& obj, Font& font);
45     static void ParseJsFontStyle(const JSRef<JSObject>& obj, Font& font);
46     void GetFontColor(const JSCallbackInfo& info);
47     void SetFontColor(const JSCallbackInfo& info);
48     void GetFontFamily(const JSCallbackInfo& info);
49     void SetFontFamily(const JSCallbackInfo& info);
50     void GetFontSize(const JSCallbackInfo& info);
51     void SetFontSize(const JSCallbackInfo& info);
52     void GetFontWeight(const JSCallbackInfo& info);
53     void SetFontWeight(const JSCallbackInfo& info);
54     void GetFontStyle(const JSCallbackInfo& info);
55     void SetFontStyle(const JSCallbackInfo& info);
56 
57     const RefPtr<FontSpan>& GetFontSpan();
58     void SetFontSpan(const RefPtr<FontSpan>& fontSpan);
59 
60 private:
61     ACE_DISALLOW_COPY_AND_MOVE(JSFontSpan);
62     RefPtr<FontSpan> fontSpan_;
63 };
64 
65 class JSParagraphStyleSpan : public virtual AceType {
66     DECLARE_ACE_TYPE(JSParagraphStyleSpan, AceType)
67 
68 public:
69     JSParagraphStyleSpan() = default;
70     ~JSParagraphStyleSpan() override = default;
71     static void Constructor(const JSCallbackInfo& args);
72     static void Destructor(JSParagraphStyleSpan* paragraphStyleSpan);
73     static void JSBind(BindingTarget globalObj);
74     static RefPtr<ParagraphStyleSpan> ParseJsParagraphStyleSpan(const JSRef<JSObject>& obj);
75     static void ParseJsTextAlign(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
76     static void ParseJsTextIndent(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
77     static void ParseJsMaxLines(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
78     static void ParseJsTextOverflow(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
79     static void ParseJsWordBreak(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
80     static void ParseJsLeadingMargin(const JSRef<JSObject>& obj, SpanParagraphStyle& paragraphStyle);
81     static void ParseParagraphSpacing(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     void GetParagraphSpacing(const JSCallbackInfo& info);
97     void SetParagraphSpacing(const JSCallbackInfo& info);
98 
99     static bool IsPixelMap(const JSRef<JSVal>& jsValue);
100 
101     RefPtr<ParagraphStyleSpan>& GetParagraphStyleSpan();
102     void SetParagraphStyleSpan(const RefPtr<ParagraphStyleSpan>& paragraphStyleSpan);
103 
104 private:
105     ACE_DISALLOW_COPY_AND_MOVE(JSParagraphStyleSpan);
106     RefPtr<ParagraphStyleSpan> paragraphStyleSpan_;
107 };
108 
109 class JSDecorationSpan : public virtual AceType {
110     DECLARE_ACE_TYPE(JSDecorationSpan, AceType)
111 
112 public:
113     JSDecorationSpan() = default;
114     ~JSDecorationSpan() override = default;
115     static void Constructor(const JSCallbackInfo& args);
116     static void Destructor(JSDecorationSpan* decorationSpan);
117     static void JSBind(BindingTarget globalObj);
118     static RefPtr<DecorationSpan> ParseJsDecorationSpan(const JSRef<JSObject>& obj);
119     void GetTextDecorationType(const JSCallbackInfo& info);
120     void SetTextDecorationType(const JSCallbackInfo& info);
121     void GetTextDecorationColor(const JSCallbackInfo& info);
122     void SetTextDecorationColor(const JSCallbackInfo& info);
123     void GetTextDecorationStyle(const JSCallbackInfo& info);
124     void SetTextDecorationStyle(const JSCallbackInfo& info);
125 
126     RefPtr<DecorationSpan>& GetDecorationSpan();
127     void SetDecorationSpan(const RefPtr<DecorationSpan>& decorationSpan);
128 
129 private:
130     ACE_DISALLOW_COPY_AND_MOVE(JSDecorationSpan);
131     RefPtr<DecorationSpan> decorationSpan_;
132 };
133 
134 class JSBaselineOffsetSpan : public virtual AceType {
135     DECLARE_ACE_TYPE(JSBaselineOffsetSpan, AceType)
136 
137 public:
138     JSBaselineOffsetSpan() = default;
139     ~JSBaselineOffsetSpan() override = default;
140     static void Constructor(const JSCallbackInfo& args);
141     static void Destructor(JSBaselineOffsetSpan* baselineOffsetSpan);
142     static void JSBind(BindingTarget globalObj);
143     static RefPtr<BaselineOffsetSpan> ParseJSBaselineOffsetSpan(const JSRef<JSObject>& obj);
144     void GetBaselineOffset(const JSCallbackInfo& info);
145     void SetBaselineOffset(const JSCallbackInfo& info);
146 
147     RefPtr<BaselineOffsetSpan>& GetBaselineOffsetSpan();
148     void SetBaselineOffsetSpan(const RefPtr<BaselineOffsetSpan>& baselineOffsetSpan);
149 
150 private:
151     ACE_DISALLOW_COPY_AND_MOVE(JSBaselineOffsetSpan);
152     RefPtr<BaselineOffsetSpan> baselineOffsetSpan_;
153 };
154 
155 class JSLetterSpacingSpan : public virtual AceType {
156     DECLARE_ACE_TYPE(JSLetterSpacingSpan, AceType)
157 
158 public:
159     JSLetterSpacingSpan() = default;
160     ~JSLetterSpacingSpan() override = default;
161     static void Constructor(const JSCallbackInfo& args);
162     static void Destructor(JSLetterSpacingSpan* letterSpacingSpan);
163     static void JSBind(BindingTarget globalObj);
164     static RefPtr<LetterSpacingSpan> ParseJSLetterSpacingSpan(const JSRef<JSObject>& obj);
165     void GetLetterSpacing(const JSCallbackInfo& info);
166     void SetLetterSpacing(const JSCallbackInfo& info);
167 
168     RefPtr<LetterSpacingSpan>& GetLetterSpacingSpan();
169     void SetLetterSpacingSpan(const RefPtr<LetterSpacingSpan>& letterSpacingSpan);
170 
171 private:
172     ACE_DISALLOW_COPY_AND_MOVE(JSLetterSpacingSpan);
173     RefPtr<LetterSpacingSpan> letterSpacingSpan_;
174 };
175 
176 class JSGestureSpan : public virtual AceType {
177     DECLARE_ACE_TYPE(JSGestureSpan, AceType)
178 
179 public:
180     JSGestureSpan() = default;
181     ~JSGestureSpan() override = default;
182     static void Constructor(const JSCallbackInfo& args);
183     static void Destructor(JSGestureSpan* gestureSpan);
184     static void JSBind(BindingTarget globalObj);
185     static RefPtr<GestureSpan> ParseJSGestureSpan(const JSCallbackInfo& args);
186 
187     RefPtr<GestureSpan>& GetGestureSpan();
188     void SetGestureSpan(const RefPtr<GestureSpan>& gestureSpan);
189 
190 private:
191     ACE_DISALLOW_COPY_AND_MOVE(JSGestureSpan);
192     RefPtr<GestureSpan> gestureSpan_;
193 };
194 
195 class JSTextShadowSpan : public virtual AceType {
196     DECLARE_ACE_TYPE(JSTextShadowSpan, AceType)
197 
198 public:
199     JSTextShadowSpan() = default;
200     ~JSTextShadowSpan() override = default;
201     static void Constructor(const JSCallbackInfo& args);
202     static void Destructor(JSTextShadowSpan* textShadowSpan);
203     static void JSBind(BindingTarget globalObj);
204     static RefPtr<TextShadowSpan> ParseJSTextShadowSpan(const JSRef<JSObject>& obj);
205     void GetTextShadow(const JSCallbackInfo& info);
206     void SetTextShadow(const JSCallbackInfo& info);
207 
208     RefPtr<TextShadowSpan>& GetTextShadowSpan();
209     void SetTextShadowSpan(const RefPtr<TextShadowSpan>& textShadowSpan);
210 
211 private:
212     ACE_DISALLOW_COPY_AND_MOVE(JSTextShadowSpan);
213     RefPtr<TextShadowSpan> textShadowSpan_;
214 };
215 class JSBackgroundColorSpan : public virtual AceType {
216     DECLARE_ACE_TYPE(JSBackgroundColorSpan, AceType)
217 
218 public:
219     JSBackgroundColorSpan() = default;
220     ~JSBackgroundColorSpan() override = default;
221     static void Constructor(const JSCallbackInfo& args);
222     static void Destructor(JSBackgroundColorSpan* backgroundColorSpan);
223     static void JSBind(BindingTarget globalObj);
224     static RefPtr<BackgroundColorSpan> ParseJSBackgroundColorSpan(const JSCallbackInfo& info);
225     void GetBackgroundColor(const JSCallbackInfo& info);
226     void SetBackgroundColor(const JSCallbackInfo& info);
227 
228     RefPtr<BackgroundColorSpan>& GetBackgroundColorSpan();
229     void SetBackgroundColorSpan(const RefPtr<BackgroundColorSpan>& backgroundColorSpan);
230 
231 private:
232     ACE_DISALLOW_COPY_AND_MOVE(JSBackgroundColorSpan);
233     RefPtr<BackgroundColorSpan> backgroundColorSpan_;
234 };
235 class JSLineHeightSpan : public virtual AceType {
236     DECLARE_ACE_TYPE(JSLineHeightSpan, AceType)
237 
238 public:
239     JSLineHeightSpan() = default;
240     ~JSLineHeightSpan() override = default;
241     static void Constructor(const JSCallbackInfo& args);
242     static void Destructor(JSLineHeightSpan* textShadowSpan);
243     static void JSBind(BindingTarget globalObj);
244     static RefPtr<LineHeightSpan> ParseJSLineHeightSpan(const JSRef<JSObject>& obj);
245     void GetLineHeight(const JSCallbackInfo& info);
246     void SetLineHeight(const JSCallbackInfo& info);
247 
248     RefPtr<LineHeightSpan>& GetLineHeightSpan();
249     void SetLineHeightSpan(const RefPtr<LineHeightSpan>& lineHeightSpan);
250 
251 private:
252     ACE_DISALLOW_COPY_AND_MOVE(JSLineHeightSpan);
253     RefPtr<LineHeightSpan> lineHeightSpan_;
254 };
255 
256 class JSImageAttachment : public virtual AceType {
257     DECLARE_ACE_TYPE(JSImageAttachment, AceType)
258 
259 public:
260     JSImageAttachment() = default;
261     ~JSImageAttachment() override = default;
262     static void Constructor(const JSCallbackInfo& args);
263     static void Destructor(JSImageAttachment* imageSpan);
264     static void JSBind(BindingTarget globalObj);
265     static RefPtr<ImageSpan> ParseJsImageSpan(const JSRef<JSObject>& obj);
266     void GetImageSrc(const JSCallbackInfo& info);
SetImageSrc(const JSCallbackInfo & info)267     void SetImageSrc(const JSCallbackInfo& info) {}
268     void GetImageSize(const JSCallbackInfo& info);
SetImageSize(const JSCallbackInfo & info)269     void SetImageSize(const JSCallbackInfo& info) {}
270     void GetImageVerticalAlign(const JSCallbackInfo& info);
SetImageVerticalAlign(const JSCallbackInfo & info)271     void SetImageVerticalAlign(const JSCallbackInfo& info) {}
272     void GetImageObjectFit(const JSCallbackInfo& info);
SetImageObjectFit(const JSCallbackInfo & info)273     void SetImageObjectFit(const JSCallbackInfo& info) {}
274     void GetImageLayoutStyle(const JSCallbackInfo& info);
SetImageLayoutStyle(const JSCallbackInfo & info)275     void SetImageLayoutStyle(const JSCallbackInfo& info) {}
276     void GetImageColorFilter(const JSCallbackInfo& info);
SetImageColorFilter(const JSCallbackInfo & info)277     void SetImageColorFilter(const JSCallbackInfo& info) {}
278 
279     const RefPtr<ImageSpan>& GetImageSpan();
280     void SetImageSpan(const RefPtr<ImageSpan>& imageSpan);
281     const ImageSpanOptions& GetImageOptions() const;
282 
283 private:
284     static ImageSpanOptions CreateImageOptions(const JSRef<JSObject>& obj);
285     static ImageSpanAttribute ParseJsImageSpanAttribute(const JSRef<JSObject>& obj);
286     static JSRef<JSObject> CreateEdge(const NG::PaddingPropertyT<NG::CalcLength>& edge);
287     static JSRef<JSObject> CreateBorderRadius(const NG::BorderRadiusProperty& borderRadius);
288     static void ParseJsImageSpanSizeAttribute(const JSRef<JSObject>& obj, ImageSpanAttribute& imageStyle);
289     static void ParseJsImageSpanColorFilterAttribute(const JSRef<JSObject>& obj, ImageSpanAttribute& imageStyle);
290     static void SetImageSpanColorFilterAttribute(ImageSpanAttribute& imageStyle, const std::vector<float>& matrix);
291 
292     ACE_DISALLOW_COPY_AND_MOVE(JSImageAttachment);
293     RefPtr<ImageSpan> imageSpan_;
294 };
295 
296 class JSNativeCustomSpan : public virtual AceType {
297     DECLARE_ACE_TYPE(JSNativeCustomSpan, AceType)
298 
299 public:
300     JSNativeCustomSpan() = default;
301     ~JSNativeCustomSpan() override = default;
302     static void Constructor(const JSCallbackInfo& args);
303     static void Destructor(JSNativeCustomSpan* imageSpan);
304     static void JSBind(BindingTarget globalObj);
305     void Invalidate(const JSCallbackInfo& info);
306     void AddStyledString(const WeakPtr<SpanStringBase>& spanString);
307     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString);
308 
309 private:
310     std::set<WeakPtr<SpanStringBase>> spanStringBaseSet_;
311 };
312 
313 class JSCustomSpan : public CustomSpan {
314     DECLARE_ACE_TYPE(JSCustomSpan, CustomSpan)
315 
316 public:
317     JSCustomSpan() = default;
318     JSCustomSpan(JSRef<JSObject> customSpanObj, const JSCallbackInfo& args);
319     JSCustomSpan(JSRef<JSObject> customSpanObj,
320         std::optional<std::function<CustomSpanMetrics(CustomSpanMeasureInfo)>> onMeasure,
321         std::optional<std::function<void(NG::DrawingContext&, CustomSpanOptions)>> onDraw, int32_t start, int32_t end);
322     ~JSCustomSpan() override = default;
323     static std::function<CustomSpanMetrics(CustomSpanMeasureInfo)> ParseOnMeasureFunc(
324         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
325     static std::function<void(NG::DrawingContext&, CustomSpanOptions)> ParseOnDrawFunc(
326         const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx);
327     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
328     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
329     void SetJsCustomSpanObject(const JSRef<JSObject>& customSpanObj);
330     JSRef<JSObject>& GetJsCustomSpanObject();
331     void AddStyledString(const WeakPtr<SpanStringBase>& spanString) override;
332     void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString) override;
333 
334 private:
335     ACE_DISALLOW_COPY_AND_MOVE(JSCustomSpan);
336     RefPtr<JSNativeCustomSpan> customSpan_;
337     JSRef<JSObject> customSpanObj_;
338 };
339 
340 class JSExtSpan : public ExtSpan {
341     DECLARE_ACE_TYPE(JSExtSpan, ExtSpan)
342 
343 public:
344     JSExtSpan() = default;
345     JSExtSpan(JSRef<JSObject> customSpanObj);
346     JSExtSpan(JSRef<JSObject> customSpanObj, int32_t start, int32_t end);
347     ~JSExtSpan() override = default;
348 
349     bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override;
350     RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override;
351     void SetJsExtSpanObject(const JSRef<JSObject>& extSpanObj);
352     JSRef<JSObject>& GetJsExtSpanObject();
353 
354 private:
355     ACE_DISALLOW_COPY_AND_MOVE(JSExtSpan);
356     JSRef<JSObject> extSpanObj_;
357 };
358 
359 class JSUrlSpan : public virtual AceType {
360     DECLARE_ACE_TYPE(JSUrlSpan, AceType)
361 
362 public:
363     JSUrlSpan() = default;
364     ~JSUrlSpan() override = default;
365     static void Constructor(const JSCallbackInfo& args);
366     static void Destructor(JSUrlSpan* urlSpan);
367     static void JSBind(BindingTarget globalObj);
368     void GetUrlContext(const JSCallbackInfo& info);
369     void SetUrlContext(const JSCallbackInfo& info);
370 
371     const RefPtr<UrlSpan>& GetUrlSpan();
372     void SetUrlSpan(const RefPtr<UrlSpan>& urlSpan);
373 
374 private:
375     ACE_DISALLOW_COPY_AND_MOVE(JSUrlSpan);
376     RefPtr<UrlSpan> urlContextSpan_;
377 };
378 } // namespace OHOS::Ace::Framework
379 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H