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 214 class JSLineHeightSpan : public virtual AceType { 215 DECLARE_ACE_TYPE(JSLineHeightSpan, AceType) 216 217 public: 218 JSLineHeightSpan() = default; 219 ~JSLineHeightSpan() override = default; 220 static void Constructor(const JSCallbackInfo& args); 221 static void Destructor(JSLineHeightSpan* textShadowSpan); 222 static void JSBind(BindingTarget globalObj); 223 static RefPtr<LineHeightSpan> ParseJSLineHeightSpan(const JSRef<JSObject>& obj); 224 void GetLineHeight(const JSCallbackInfo& info); 225 void SetLineHeight(const JSCallbackInfo& info); 226 227 RefPtr<LineHeightSpan>& GetLineHeightSpan(); 228 void SetLineHeightSpan(const RefPtr<LineHeightSpan>& lineHeightSpan); 229 230 private: 231 ACE_DISALLOW_COPY_AND_MOVE(JSLineHeightSpan); 232 RefPtr<LineHeightSpan> lineHeightSpan_; 233 }; 234 235 class JSImageAttachment : public virtual AceType { 236 DECLARE_ACE_TYPE(JSImageAttachment, AceType) 237 238 public: 239 JSImageAttachment() = default; 240 ~JSImageAttachment() override = default; 241 static void Constructor(const JSCallbackInfo& args); 242 static void Destructor(JSImageAttachment* imageSpan); 243 static void JSBind(BindingTarget globalObj); 244 static RefPtr<ImageSpan> ParseJsImageSpan(const JSRef<JSObject>& obj); 245 void GetImageSrc(const JSCallbackInfo& info); SetImageSrc(const JSCallbackInfo & info)246 void SetImageSrc(const JSCallbackInfo& info) {} 247 void GetImageSize(const JSCallbackInfo& info); SetImageSize(const JSCallbackInfo & info)248 void SetImageSize(const JSCallbackInfo& info) {} 249 void GetImageVerticalAlign(const JSCallbackInfo& info); SetImageVerticalAlign(const JSCallbackInfo & info)250 void SetImageVerticalAlign(const JSCallbackInfo& info) {} 251 void GetImageObjectFit(const JSCallbackInfo& info); SetImageObjectFit(const JSCallbackInfo & info)252 void SetImageObjectFit(const JSCallbackInfo& info) {} 253 void GetImageLayoutStyle(const JSCallbackInfo& info); SetImageLayoutStyle(const JSCallbackInfo & info)254 void SetImageLayoutStyle(const JSCallbackInfo& info) {} 255 256 const RefPtr<ImageSpan>& GetImageSpan(); 257 void SetImageSpan(const RefPtr<ImageSpan>& imageSpan); 258 const ImageSpanOptions& GetImageOptions() const; 259 260 private: 261 static ImageSpanOptions CreateImageOptions(const JSRef<JSObject>& obj); 262 static ImageSpanAttribute ParseJsImageSpanAttribute(const JSRef<JSObject>& obj); 263 static JSRef<JSObject> CreateEdge(const NG::PaddingPropertyT<NG::CalcLength>& edge); 264 static JSRef<JSObject> CreateBorderRadius(const NG::BorderRadiusProperty& borderRadius); 265 static void ParseJsImageSpanSizeAttribute(const JSRef<JSObject>& obj, ImageSpanAttribute& imageStyle); 266 267 ACE_DISALLOW_COPY_AND_MOVE(JSImageAttachment); 268 RefPtr<ImageSpan> imageSpan_; 269 }; 270 271 class JSNativeCustomSpan : public virtual AceType { 272 DECLARE_ACE_TYPE(JSNativeCustomSpan, AceType) 273 274 public: 275 JSNativeCustomSpan() = default; 276 ~JSNativeCustomSpan() override = default; 277 static void Constructor(const JSCallbackInfo& args); 278 static void Destructor(JSNativeCustomSpan* imageSpan); 279 static void JSBind(BindingTarget globalObj); 280 void Invalidate(const JSCallbackInfo& info); 281 void AddStyledString(const WeakPtr<SpanStringBase>& spanString); 282 void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString); 283 284 private: 285 std::set<WeakPtr<SpanStringBase>> spanStringBaseSet_; 286 }; 287 288 class JSCustomSpan : public CustomSpan { 289 DECLARE_ACE_TYPE(JSCustomSpan, CustomSpan) 290 291 public: 292 JSCustomSpan() = default; 293 JSCustomSpan(JSRef<JSObject> customSpanObj, const JSCallbackInfo& args); 294 JSCustomSpan(JSRef<JSObject> customSpanObj, 295 std::optional<std::function<CustomSpanMetrics(CustomSpanMeasureInfo)>> onMeasure, 296 std::optional<std::function<void(NG::DrawingContext&, CustomSpanOptions)>> onDraw, int32_t start, int32_t end); 297 ~JSCustomSpan() override = default; 298 static std::function<CustomSpanMetrics(CustomSpanMeasureInfo)> ParseOnMeasureFunc( 299 const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx); 300 static std::function<void(NG::DrawingContext&, CustomSpanOptions)> ParseOnDrawFunc( 301 const RefPtr<JsFunction>& jsDraw, const JSExecutionContext& execCtx); 302 bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override; 303 RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override; 304 void SetJsCustomSpanObject(const JSRef<JSObject>& customSpanObj); 305 JSRef<JSObject>& GetJsCustomSpanObject(); 306 void AddStyledString(const WeakPtr<SpanStringBase>& spanString) override; 307 void RemoveStyledString(const WeakPtr<SpanStringBase>& spanString) override; 308 309 private: 310 ACE_DISALLOW_COPY_AND_MOVE(JSCustomSpan); 311 RefPtr<JSNativeCustomSpan> customSpan_; 312 JSRef<JSObject> customSpanObj_; 313 }; 314 315 class JSExtSpan : public ExtSpan { 316 DECLARE_ACE_TYPE(JSExtSpan, ExtSpan) 317 318 public: 319 JSExtSpan() = default; 320 JSExtSpan(JSRef<JSObject> customSpanObj); 321 JSExtSpan(JSRef<JSObject> customSpanObj, int32_t start, int32_t end); 322 ~JSExtSpan() override = default; 323 324 bool IsAttributesEqual(const RefPtr<SpanBase>& other) const override; 325 RefPtr<SpanBase> GetSubSpan(int32_t start, int32_t end) override; 326 void SetJsExtSpanObject(const JSRef<JSObject>& extSpanObj); 327 JSRef<JSObject>& GetJsExtSpanObject(); 328 329 private: 330 ACE_DISALLOW_COPY_AND_MOVE(JSExtSpan); 331 JSRef<JSObject> extSpanObj_; 332 }; 333 } // namespace OHOS::Ace::Framework 334 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_STYLE_STRING_JS_SPAN_OBJECT_H