1 /* 2 * Copyright (c) 2021 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_JS_VIEW_JS_SCROLLER_H 17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_SCROLLER_H 18 19 #include "base/memory/referenced.h" 20 #include "bridge/declarative_frontend/engine/bindings.h" 21 #include "core/components/scroll/scroll_controller_base.h" 22 #include "core/components/scroll_bar/scroll_proxy.h" 23 #include "core/components_ng/pattern/scrollable/scroller_observer_manager.h" 24 25 namespace OHOS::Ace::Framework { 26 27 class JSScroller : public Referenced { 28 public: 29 JSScroller() = default; 30 ~JSScroller() override = default; 31 32 static void JSBind(BindingTarget globalObj); 33 static void Constructor(const JSCallbackInfo& args); 34 static void Destructor(JSScroller* scroller); 35 36 void ScrollTo(const JSCallbackInfo& args); 37 void ScrollEdge(const JSCallbackInfo& args); 38 void Fling(const JSCallbackInfo& args); 39 void ScrollPage(const JSCallbackInfo& args); 40 void CurrentOffset(const JSCallbackInfo& args); 41 void ScrollToIndex(const JSCallbackInfo& args); 42 void ScrollBy(const JSCallbackInfo& args); 43 void IsAtEnd(const JSCallbackInfo& args); 44 void GetItemRect(const JSCallbackInfo& args); 45 void GetItemIndex(const JSCallbackInfo& args); 46 GetController()47 const WeakPtr<ScrollControllerBase>& GetController() const 48 { 49 return controllerWeak_; 50 } 51 SetController(const RefPtr<ScrollControllerBase> & controller)52 void SetController(const RefPtr<ScrollControllerBase>& controller) 53 { 54 auto oldController = controllerWeak_.Upgrade(); 55 if (oldController) { 56 ScrollerObserver observer; 57 oldController->SetObserver(observer); 58 oldController->SetObserverManager(nullptr); 59 } 60 if (controller) { 61 controller->SetObserver(observer_); 62 controller->SetObserverManager(observerMgr_); 63 } 64 controllerWeak_ = controller; 65 } 66 SetScrollBarProxy(const RefPtr<ScrollProxy> & proxy)67 void SetScrollBarProxy(const RefPtr<ScrollProxy>& proxy) 68 { 69 scrollBarProxyWeak_ = proxy; 70 } 71 GetScrollBarProxy()72 RefPtr<ScrollProxy> GetScrollBarProxy() 73 { 74 return scrollBarProxyWeak_.Upgrade(); 75 } 76 77 JSRef<JSObject> CreateRectangle(const Rect& info); 78 SetInstanceId(int32_t instanceId)79 void SetInstanceId(int32_t instanceId) 80 { 81 instanceId_ = instanceId; 82 } 83 GetInstanceId()84 int32_t GetInstanceId() 85 { 86 return instanceId_; 87 } 88 SetObserver(const ScrollerObserver & observer)89 void SetObserver(const ScrollerObserver& observer) 90 { 91 observer_ = observer; 92 auto controller = controllerWeak_.Upgrade(); 93 if (controller) { 94 controller->SetObserver(observer); 95 } 96 } 97 AddObserver(const ScrollerObserver & observer,int32_t id)98 void AddObserver(const ScrollerObserver& observer, int32_t id) 99 { 100 observerMgr_->AddObserver(observer, id); 101 } 102 RemoveObserver(int32_t id)103 void RemoveObserver(int32_t id) 104 { 105 observerMgr_->RemoveObserver(id); 106 } 107 108 private: 109 bool ParseCurveParams(RefPtr<Curve>& curve, const JSRef<JSVal>& jsValue); 110 111 WeakPtr<ScrollControllerBase> controllerWeak_; 112 WeakPtr<ScrollProxy> scrollBarProxyWeak_; 113 114 ACE_DISALLOW_COPY_AND_MOVE(JSScroller); 115 116 int32_t instanceId_ = INSTANCE_ID_UNDEFINED; 117 118 ScrollerObserver observer_; 119 RefPtr<ScrollerObserverManager> observerMgr_ = MakeRefPtr<ScrollerObserverManager>(); 120 }; 121 122 } // namespace OHOS::Ace::Framework 123 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_SCROLLER_H 124