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