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