• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 #include "frameworks/bridge/declarative_frontend/jsview/js_side_bar.h"
17 
18 #include "base/geometry/dimension.h"
19 #include "base/image/pixel_map.h"
20 #include "base/log/ace_scoring_log.h"
21 #include "base/log/log.h"
22 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
23 #include "bridge/declarative_frontend/engine/js_types.h"
24 #include "bridge/declarative_frontend/jsview/js_utils.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/side_bar/side_bar_container_model_ng.h"
27 #include "frameworks/bridge/declarative_frontend/jsview/js_view_common_def.h"
28 #include "frameworks/bridge/declarative_frontend/jsview/models/side_bar_container_model_impl.h"
29 
30 namespace OHOS::Ace {
31 std::unique_ptr<SideBarContainerModel> SideBarContainerModel::instance_ = nullptr;
32 std::mutex SideBarContainerModel::mutex_;
33 
GetInstance()34 SideBarContainerModel* SideBarContainerModel::GetInstance()
35 {
36     if (!instance_) {
37         std::lock_guard<std::mutex> lock(mutex_);
38         if (!instance_) {
39 #ifdef NG_BUILD
40             instance_.reset(new NG::SideBarContainerModelNG());
41 #else
42             if (Container::IsCurrentUseNewPipeline()) {
43                 instance_.reset(new NG::SideBarContainerModelNG());
44             } else {
45                 instance_.reset(new Framework::SideBarContainerModelImpl());
46             }
47 #endif
48         }
49     }
50     return instance_.get();
51 }
52 } // namespace OHOS::Ace
53 
54 namespace OHOS::Ace::Framework {
55 namespace {
56 constexpr Dimension DEFAULT_CONTROL_BUTTON_WIDTH = 32.0_vp;
57 constexpr Dimension DEFAULT_CONTROL_BUTTON_HEIGHT = 32.0_vp;
58 constexpr Dimension DEFAULT_CONTROL_BUTTON_TOP = 48.0_vp;
59 constexpr Dimension DEFAULT_DIVIDER_STROKE_WIDTH = 1.0_vp;
60 constexpr Dimension DEFAULT_DIVIDER_START_MARGIN = 0.0_vp;
61 constexpr Dimension DEFAULT_DIVIDER_END_MARGIN = 0.0_vp;
62 static Dimension DEFAULT_SIDE_BAR_WIDTH = 200.0_vp;
63 static Dimension DEFAULT_MIN_SIDE_BAR_WIDTH = 200.0_vp;
64 constexpr Dimension DEFAULT_MAX_SIDE_BAR_WIDTH = 280.0_vp;
65 constexpr Color DEFAULT_DIVIDER_COLOR = Color(0x08000000);
66 
ParseAndSetWidth(const JSCallbackInfo & info,WidthType widthType)67 void ParseAndSetWidth(const JSCallbackInfo& info, WidthType widthType)
68 {
69     if (info.Length() < 1) {
70         return;
71     }
72     switch (widthType) {
73         case WidthType::SIDEBAR_WIDTH:
74             SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.sideBarWidth");
75             break;
76         case WidthType::MIN_SIDEBAR_WIDTH:
77             SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minSideBarWidth");
78             break;
79         case WidthType::MAX_SIDEBAR_WIDTH:
80             SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.maxSideBarWidth");
81             break;
82         default:
83             break;
84     }
85 
86     CalcDimension value;
87     if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
88         DEFAULT_SIDE_BAR_WIDTH = 240.0_vp;
89         DEFAULT_MIN_SIDE_BAR_WIDTH = 240.0_vp;
90     }
91 
92     RefPtr<ResourceObject> valueResObj;
93     auto isValid = Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)
94                        ? JSViewAbstract::ParseJsDimensionVpNG(info[0], value, valueResObj)
95                        : JSViewAbstract::ParseJsDimensionVp(info[0], value, valueResObj);
96     if (!isValid) {
97         switch (widthType) {
98             case WidthType::SIDEBAR_WIDTH:
99                 value = DEFAULT_SIDE_BAR_WIDTH;
100                 break;
101             case WidthType::MIN_SIDEBAR_WIDTH:
102                 value = DEFAULT_MIN_SIDE_BAR_WIDTH;
103                 break;
104             case WidthType::MAX_SIDEBAR_WIDTH:
105                 value = DEFAULT_MAX_SIDE_BAR_WIDTH;
106                 break;
107             default:
108                 break;
109         }
110     }
111     if (SystemProperties::ConfigChangePerform() && valueResObj) {
112         SideBarContainerModel::GetInstance()->ParseAndSetWidth(widthType, valueResObj);
113         return;
114     }
115     SideBarContainerModel::GetInstance()->ParseAndSetWidth(widthType, value);
116 }
117 } // namespace
118 
Create(const JSCallbackInfo & info)119 void JSSideBar::Create(const JSCallbackInfo& info)
120 {
121     SideBarContainerModel::GetInstance()->Create();
122     SideBarContainerType style = SideBarContainerType::EMBED;
123     if (!info[0]->IsNull()) {
124         if (info[0]->IsBoolean()) {
125             style = static_cast<SideBarContainerType>(info[0]->ToBoolean());
126         } else if (info[0]->IsNumber()) {
127             style = static_cast<SideBarContainerType>(info[0]->ToNumber<int>());
128         } else {
129             return;
130         }
131     }
132     SideBarContainerModel::GetInstance()->SetSideBarContainerType(style);
133 }
134 
SetShowControlButton(const JSCallbackInfo & info)135 void JSSideBar::SetShowControlButton(const JSCallbackInfo& info)
136 {
137     if (info.Length() < 1) {
138         return;
139     }
140     if (info[0]->IsNull() || info[0]->IsUndefined()) {
141         if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
142             // showControlButton set default true when input illegal value
143             SideBarContainerModel::GetInstance()->SetShowControlButton(true);
144         }
145         return;
146     }
147     if (info[0]->IsBoolean()) {
148         SideBarContainerModel::GetInstance()->SetShowControlButton(info[0]->ToBoolean());
149     }
150 }
151 
JsSideBarPosition(const JSCallbackInfo & info)152 void JSSideBar::JsSideBarPosition(const JSCallbackInfo& info)
153 {
154     if (info.Length() < 1) {
155         return;
156     }
157     if (info[0]->IsNull() || info[0]->IsUndefined()) {
158         if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
159             // sideBarPosition set default START when input illegal value
160             SideBarContainerModel::GetInstance()->SetSideBarPosition(SideBarPosition::START);
161         }
162         return;
163     }
164     if (info[0]->IsNumber() && info[0]->ToNumber<int32_t>() >= 0 && info[0]->ToNumber<int32_t>() <= 1) {
165         SideBarContainerModel::GetInstance()->SetSideBarPosition(
166             static_cast<SideBarPosition>(info[0]->ToNumber<int32_t>()));
167     }
168 }
169 
JSBind(BindingTarget globalObj)170 void JSSideBar::JSBind(BindingTarget globalObj)
171 {
172     JSClass<JSSideBar>::Declare("SideBarContainer");
173     MethodOptions opt = MethodOptions::NONE;
174     JSClass<JSSideBar>::StaticMethod("create", &JSSideBar::Create, opt);
175     JSClass<JSSideBar>::StaticMethod("showSideBar", &JSSideBar::JsShowSideBar);
176     JSClass<JSSideBar>::StaticMethod("controlButton", &JSSideBar::JsControlButton);
177     JSClass<JSSideBar>::StaticMethod("showControlButton", &JSSideBar::SetShowControlButton);
178     JSClass<JSSideBar>::StaticMethod("onChange", &JSSideBar::OnChange);
179     JSClass<JSSideBar>::StaticMethod("sideBarWidth", &JSSideBar::JsSideBarWidth);
180     JSClass<JSSideBar>::StaticMethod("minSideBarWidth", &JSSideBar::JsMinSideBarWidth);
181     JSClass<JSSideBar>::StaticMethod("maxSideBarWidth", &JSSideBar::JsMaxSideBarWidth);
182     JSClass<JSSideBar>::StaticMethod("autoHide", &JSSideBar::JsAutoHide);
183     JSClass<JSSideBar>::StaticMethod("sideBarPosition", &JSSideBar::JsSideBarPosition);
184     JSClass<JSSideBar>::StaticMethod("divider", &JSSideBar::JsDivider);
185     JSClass<JSSideBar>::StaticMethod("minContentWidth", &JSSideBar::JsMinContentWidth);
186     JSClass<JSSideBar>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
187     JSClass<JSSideBar>::StaticMethod("width", SetWidth);
188     JSClass<JSSideBar>::StaticMethod("height", SetHeight);
189     JSClass<JSSideBar>::StaticMethod("size", SetSize);
190     JSClass<JSSideBar>::StaticMethod("width", &JSStack::SetWidth);
191     JSClass<JSSideBar>::StaticMethod("height", &JSStack::SetHeight);
192     JSClass<JSSideBar>::StaticMethod("size", &JSStack::SetSize);
193     JSClass<JSSideBar>::StaticMethod("onKeyEvent", &JSInteractableView::JsOnKey);
194     JSClass<JSSideBar>::StaticMethod("onDeleteEvent", &JSInteractableView::JsOnDelete);
195     JSClass<JSSideBar>::StaticMethod("onClick", &JSInteractableView::JsOnClick);
196     JSClass<JSSideBar>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
197     JSClass<JSSideBar>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
198     JSClass<JSSideBar>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
199     JSClass<JSSideBar>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
200     JSClass<JSSideBar>::InheritAndBind<JSContainerBase>(globalObj);
201 }
202 
OnChange(const JSCallbackInfo & info)203 void JSSideBar::OnChange(const JSCallbackInfo& info)
204 {
205     if (info.Length() < 1 || !info[0]->IsFunction()) {
206         return;
207     }
208 
209     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
210     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
211     auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](bool isShow) {
212         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
213         ACE_SCORING_EVENT("SideBarContainer.onChange");
214         PipelineContext::SetCallBackNode(node);
215         auto newJSVal = JSRef<JSVal>::Make(ToJSValue(isShow));
216         func->ExecuteJS(1, &newJSVal);
217     };
218     SideBarContainerModel::GetInstance()->SetOnChange(std::move(onChange));
219     info.ReturnSelf();
220 }
221 
ParseSideBarWidthObject(const JSCallbackInfo & info,JSRef<JSVal> arrowFunc,bool isNumber)222 void ParseSideBarWidthObject(const JSCallbackInfo& info, JSRef<JSVal> arrowFunc, bool isNumber)
223 {
224     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(arrowFunc));
225     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
226     auto onChangeEvent = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc),
227                         node = targetNode, useNumber = isNumber](const Dimension& sideBarWidth) {
228         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
229         ACE_SCORING_EVENT("SideBarContainer.onSideBarWidthChangeEvent");
230         PipelineContext::SetCallBackNode(node);
231         auto newJSVal = useNumber ? JSRef<JSVal>::Make(ToJSValue(sideBarWidth.ConvertToVp())) :
232             JSRef<JSVal>::Make(ToJSValue(sideBarWidth.ToString()));
233         func->ExecuteJS(1, &newJSVal);
234     };
235     SideBarContainerModel::GetInstance()->SetOnSideBarWidthChangeEvent(std::move(onChangeEvent));
236 }
237 
JsSideBarWidth(const JSCallbackInfo & info)238 void JSSideBar::JsSideBarWidth(const JSCallbackInfo& info)
239 {
240     if (info[0]->IsObject()) {
241         JSRef<JSObject> callbackObj = JSRef<JSObject>::Cast(info[0]);
242         CalcDimension value;
243         auto sideBarWidthValue = callbackObj->GetProperty("value");
244         auto sideBarWidthCallbackValue = callbackObj->GetProperty("$value");
245         auto isValid = JSViewAbstract::ParseJsDimensionVpNG(sideBarWidthValue, value);
246         bool isNumber = sideBarWidthValue->IsNumber();
247         if (isValid && sideBarWidthCallbackValue->IsFunction()) {
248             SideBarContainerModel::GetInstance()->ParseAndSetWidth(WidthType::SIDEBAR_WIDTH, value, true);
249             ParseSideBarWidthObject(info, sideBarWidthCallbackValue, isNumber);
250             return;
251         }
252     }
253     ParseAndSetWidth(info, WidthType::SIDEBAR_WIDTH);
254 }
255 
JsMaxSideBarWidth(const JSCallbackInfo & info)256 void JSSideBar::JsMaxSideBarWidth(const JSCallbackInfo& info)
257 {
258     ParseAndSetWidth(info, WidthType::MAX_SIDEBAR_WIDTH);
259 }
260 
JsMinSideBarWidth(const JSCallbackInfo & info)261 void JSSideBar::JsMinSideBarWidth(const JSCallbackInfo& info)
262 {
263     ParseAndSetWidth(info, WidthType::MIN_SIDEBAR_WIDTH);
264 }
265 
ParseShowSideBarObject(const JSCallbackInfo & args,const JSRef<JSVal> & changeEventVal)266 void ParseShowSideBarObject(const JSCallbackInfo& args, const JSRef<JSVal>& changeEventVal)
267 {
268     CHECK_NULL_VOID(changeEventVal->IsFunction());
269 
270     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(changeEventVal));
271     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
272     auto onChangeEvent = [execCtx = args.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
273                              bool isShow) {
274         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
275         ACE_SCORING_EVENT("SideBarContainer.onChangeEvent");
276         PipelineContext::SetCallBackNode(node);
277         auto newJSVal = JSRef<JSVal>::Make(ToJSValue(isShow));
278         func->ExecuteJS(1, &newJSVal);
279     };
280     SideBarContainerModel::GetInstance()->SetOnChangeEvent(std::move(onChangeEvent));
281 }
282 
JsShowSideBar(const JSCallbackInfo & info)283 void JSSideBar::JsShowSideBar(const JSCallbackInfo& info)
284 {
285     if (info.Length() < 1 || info.Length() > 2) {
286         return;
287     }
288 
289     bool isShow = true;
290     if (info.Length() > 0 && info[0]->IsBoolean()) {
291         isShow = info[0]->ToBoolean();
292     }
293 
294     SideBarContainerModel::GetInstance()->SetShowSideBar(isShow);
295     if (info.Length() > 1 && info[1]->IsFunction()) {
296         ParseShowSideBarObject(info, info[1]);
297     }
298 }
299 
SetControlButtonIcon(SideBarControlButtonType iconType,JSRef<JSVal> icon)300 void JSSideBar::SetControlButtonIcon(SideBarControlButtonType iconType, JSRef<JSVal> icon)
301 {
302     if (icon->IsUndefined() || icon->IsNull()) {
303         return;
304     }
305     std::string iconPath;
306     RefPtr<ResourceObject> iconPathResObj;
307     auto isStrType = ParseJsMedia(icon, iconPath, iconPathResObj);
308     RefPtr<PixelMap> pixMap = nullptr;
309 #if defined(PIXEL_MAP_SUPPORTED)
310     if (!isStrType) {
311         pixMap = CreatePixelMapFromNapiValue(icon);
312     }
313 #endif
314     bool isNewframework = iconPathResObj && SystemProperties::ConfigChangePerform();
315     if (isStrType || pixMap != nullptr) {
316         switch (iconType) {
317             case SideBarControlButtonType::SHOWN:
318                 if (isNewframework) {
319                     SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(
320                         iconPathResObj, !isStrType, pixMap);
321                 } else {
322                     SideBarContainerModel::GetInstance()->SetControlButtonShowIconInfo(iconPath, !isStrType, pixMap);
323                 }
324                 break;
325             case SideBarControlButtonType::HIDDEN:
326                 if (isNewframework) {
327                     SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(
328                         iconPathResObj, !isStrType, pixMap);
329                 } else {
330                     SideBarContainerModel::GetInstance()->SetControlButtonHiddenIconInfo(iconPath, !isStrType, pixMap);
331                 }
332                 break;
333             case SideBarControlButtonType::SWITCHING:
334                 if (isNewframework) {
335                     SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(
336                         iconPathResObj, !isStrType, pixMap);
337                 } else {
338                     SideBarContainerModel::GetInstance()->SetControlButtonSwitchingIconInfo(
339                         iconPath, !isStrType, pixMap);
340                 }
341                 break;
342             default:
343                 break;
344         }
345     }
346 }
347 
JsControlButton(const JSCallbackInfo & info)348 void JSSideBar::JsControlButton(const JSCallbackInfo& info)
349 {
350     if (info.Length() < 1) {
351         return;
352     }
353     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.shown");
354     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.hidden");
355     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.buttonIconOptions.switching");
356     if (info[0]->IsNull() || info[0]->IsUndefined()) {
357         if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
358             // controlButton icon set default style and position when input illegal value
359             SideBarContainerModel::GetInstance()->ResetControlButton();
360         }
361         return;
362     }
363     if (info[0]->IsObject()) {
364         JSRef<JSObject> value = JSRef<JSObject>::Cast(info[0]);
365         if (!AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TEN)) {
366             ParseControlButtonOG(value);
367         } else {
368             ParseControlButtonNG(value);
369         }
370 
371         JSRef<JSVal> icons = value->GetProperty("icons");
372         if (icons->IsNull() || icons->IsUndefined()) {
373             if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
374                 // controlButton icon set default style when input illegal value
375                 SideBarContainerModel::GetInstance()->ResetControlButtonIconInfo();
376             }
377             return;
378         }
379         if (icons->IsObject()) {
380             JSRef<JSObject> iconsVal = JSRef<JSObject>::Cast(icons);
381             JSRef<JSVal> showIcon = iconsVal->GetProperty("shown");
382             JSRef<JSVal> switchingIcon = iconsVal->GetProperty("switching");
383             JSRef<JSVal> hiddenIcon = iconsVal->GetProperty("hidden");
384             SetControlButtonIcon(SideBarControlButtonType::SHOWN, showIcon);
385             SetControlButtonIcon(SideBarControlButtonType::HIDDEN, hiddenIcon);
386             SetControlButtonIcon(SideBarControlButtonType::SWITCHING, switchingIcon);
387         }
388     }
389 }
390 
ProcessDividerProperties(const JSRef<JSObject> & obj)391 void JSSideBar::ProcessDividerProperties(const JSRef<JSObject>& obj)
392 {
393     Dimension strokeWidth = DEFAULT_DIVIDER_STROKE_WIDTH;
394     RefPtr<ResourceObject> strokeWidthResObj;
395     if (!ConvertFromJSValueNG(obj->GetProperty("strokeWidth"), strokeWidth, strokeWidthResObj) ||
396         (strokeWidth.Value() < 0.0f)) {
397         strokeWidth = DEFAULT_DIVIDER_STROKE_WIDTH;
398     }
399     if (SystemProperties::ConfigChangePerform() && strokeWidthResObj) {
400         SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(strokeWidthResObj);
401     } else {
402         SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(strokeWidth);
403     }
404 
405     Color color = DEFAULT_DIVIDER_COLOR;
406     RefPtr<ResourceObject> colorResObj;
407     if (!ConvertFromJSValue(obj->GetProperty("color"), color, colorResObj)) {
408         color = DEFAULT_DIVIDER_COLOR;
409     }
410     if (SystemProperties::ConfigChangePerform() && colorResObj) {
411         SideBarContainerModel::GetInstance()->SetDividerColor(colorResObj);
412     } else {
413         SideBarContainerModel::GetInstance()->SetDividerColor(color);
414     }
415 
416     Dimension startMargin = DEFAULT_DIVIDER_START_MARGIN;
417     RefPtr<ResourceObject> startMarginResObj;
418     if (!ConvertFromJSValueNG(obj->GetProperty("startMargin"), startMargin, startMarginResObj) ||
419         (startMargin.Value() < 0.0f)) {
420         startMargin = DEFAULT_DIVIDER_START_MARGIN;
421     }
422     if (SystemProperties::ConfigChangePerform() && startMarginResObj) {
423         SideBarContainerModel::GetInstance()->SetDividerStartMargin(startMarginResObj);
424     } else {
425         SideBarContainerModel::GetInstance()->SetDividerStartMargin(startMargin);
426     }
427 
428     Dimension endMargin = DEFAULT_DIVIDER_END_MARGIN;
429     RefPtr<ResourceObject> endMarginResObj;
430     if (!ConvertFromJSValueNG(obj->GetProperty("endMargin"), endMargin, endMarginResObj) ||
431         (endMargin.Value() < 0.0f)) {
432         endMargin = DEFAULT_DIVIDER_END_MARGIN;
433     }
434     if (SystemProperties::ConfigChangePerform() && endMarginResObj) {
435         SideBarContainerModel::GetInstance()->SetDividerEndMargin(endMarginResObj);
436     } else {
437         SideBarContainerModel::GetInstance()->SetDividerEndMargin(endMargin);
438     }
439 }
440 
JsDivider(const JSCallbackInfo & info)441 void JSSideBar::JsDivider(const JSCallbackInfo& info)
442 {
443     if (info.Length() < 1) {
444         return;
445     }
446     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.strokeWidth");
447     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.color");
448     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.startMargin");
449     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.dividerStyle.endMargin");
450     if (info[0]->IsNull() || info[0]->IsUndefined()) {
451         if (AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_TWELVE)) {
452             // sideBar divider set default width when input illegal value
453             SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(DEFAULT_DIVIDER_STROKE_WIDTH);
454         } else if (info[0]->IsNull()) {
455             SideBarContainerModel::GetInstance()->SetDividerStrokeWidth(0.0_vp);
456         }
457         return;
458     }
459     if (info[0]->IsObject()) {
460         JSRef<JSObject> obj = JSRef<JSObject>::Cast(info[0]);
461         ProcessDividerProperties(obj);
462     }
463 }
464 
JsMinContentWidth(const JSCallbackInfo & info)465 void JSSideBar::JsMinContentWidth(const JSCallbackInfo& info)
466 {
467     if (info.Length() < 1) {
468         return;
469     }
470     SideBarContainerModel::GetInstance()->ResetResObj("sideBarContainer.minContentWidth");
471     if (info[0]->IsNull()) {
472         SideBarContainerModel::GetInstance()->SetMinContentWidth(-1.0_vp);
473         return;
474     }
475     CalcDimension minContentWidth;
476     RefPtr<ResourceObject> valueResObj;
477     if (!JSViewAbstract::ParseJsDimensionVp(info[0], minContentWidth, valueResObj)) {
478         SideBarContainerModel::GetInstance()->SetMinContentWidth(-1.0_vp);
479         return;
480     }
481     if (SystemProperties::ConfigChangePerform() && valueResObj) {
482         SideBarContainerModel::GetInstance()->SetMinContentWidth(valueResObj);
483         return;
484     }
485     SideBarContainerModel::GetInstance()->SetMinContentWidth(minContentWidth);
486 }
487 
JsAutoHide(bool autoHide)488 void JSSideBar::JsAutoHide(bool autoHide)
489 {
490     SideBarContainerModel::GetInstance()->SetAutoHide(autoHide);
491 }
492 
ParseControlButtonOG(JSRef<JSObject> value)493 void JSSideBar::ParseControlButtonOG(JSRef<JSObject> value)
494 {
495     JSRef<JSVal> width = value->GetProperty("width");
496     JSRef<JSVal> height = value->GetProperty("height");
497     JSRef<JSVal> left = value->GetProperty("left");
498     JSRef<JSVal> top = value->GetProperty("top");
499 
500     if (!width->IsNull() && width->IsNumber()) {
501         auto controlButtonWidth = CalcDimension(width->ToNumber<double>(), DimensionUnit::VP);
502         if (LessNotEqual(controlButtonWidth.Value(), 0.0)) {
503             controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
504         }
505         SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
506     }
507 
508     if (!height->IsNull() && height->IsNumber()) {
509         auto controlButtonHeight = CalcDimension(height->ToNumber<double>(), DimensionUnit::VP);
510         if (LessNotEqual(controlButtonHeight.Value(), 0.0)) {
511             controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
512         }
513         SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
514     }
515 
516     if (!left->IsNull() && left->IsNumber()) {
517         SideBarContainerModel::GetInstance()->SetControlButtonLeft(
518             Dimension(left->ToNumber<double>(), DimensionUnit::VP));
519     }
520 
521     if (!top->IsNull() && top->IsNumber()) {
522         SideBarContainerModel::GetInstance()->SetControlButtonTop(
523             Dimension(top->ToNumber<double>(), DimensionUnit::VP));
524     }
525 }
526 
ParseControlButtonNG(JSRef<JSObject> value)527 void JSSideBar::ParseControlButtonNG(JSRef<JSObject> value)
528 {
529     JSRef<JSVal> width = value->GetProperty("width");
530     JSRef<JSVal> height = value->GetProperty("height");
531     JSRef<JSVal> left = value->GetProperty("left");
532     JSRef<JSVal> top = value->GetProperty("top");
533 
534     auto controlButtonWidth = DEFAULT_CONTROL_BUTTON_WIDTH;
535     if (width->IsNumber() && GreatOrEqual(width->ToNumber<double>(), 0.0)) {
536         controlButtonWidth = CalcDimension(width->ToNumber<double>(), DimensionUnit::VP);
537     }
538     SideBarContainerModel::GetInstance()->SetControlButtonWidth(controlButtonWidth);
539 
540     auto controlButtonHeight = DEFAULT_CONTROL_BUTTON_HEIGHT;
541     if (height->IsNumber() && GreatOrEqual(height->ToNumber<double>(), 0.0)) {
542         controlButtonHeight = CalcDimension(height->ToNumber<double>(), DimensionUnit::VP);
543     }
544     SideBarContainerModel::GetInstance()->SetControlButtonHeight(controlButtonHeight);
545 
546     if (left->IsNumber() && GreatOrEqual(left->ToNumber<double>(), 0.0)) {
547         auto controlButtonLeft = CalcDimension(left->ToNumber<double>(), DimensionUnit::VP);
548         SideBarContainerModel::GetInstance()->SetControlButtonLeft(controlButtonLeft);
549     } else {
550         SideBarContainerModel::GetInstance()->ResetControlButtonLeft();
551     }
552 
553     auto controlButtonTop = DEFAULT_CONTROL_BUTTON_TOP;
554     if (top->IsNumber() && GreatOrEqual(top->ToNumber<double>(), 0.0)) {
555         controlButtonTop = CalcDimension(top->ToNumber<double>(), DimensionUnit::VP);
556     }
557     SideBarContainerModel::GetInstance()->SetControlButtonTop(controlButtonTop);
558 }
559 
560 } // namespace OHOS::Ace::Framework
561