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