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