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