• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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/engine/functions/js_drag_function.h"
17 
18 #include "base/log/log.h"
19 #include "frameworks/bridge/declarative_frontend/jsview/js_utils.h"
20 #include "frameworks/bridge/declarative_frontend/jsview/js_view_register.h"
21 
22 namespace OHOS::Ace::Framework {
23 class JsPasteData : public Referenced {
24 public:
JSBind(BindingTarget globalObj)25     static void JSBind(BindingTarget globalObj)
26     {
27         JSClass<JsPasteData>::Declare("PasteData");
28         JSClass<JsPasteData>::CustomMethod("setPlainText", &JsPasteData::SetPlainText);
29         JSClass<JsPasteData>::CustomMethod("getPlainText", &JsPasteData::GetPlainText);
30         JSClass<JsPasteData>::Bind(globalObj, &JsPasteData::Constructor, &JsPasteData::Destructor);
31     }
32 
SetPlainText(const JSCallbackInfo & args)33     void SetPlainText(const JSCallbackInfo& args)
34     {
35         if (args[0]->IsString()) {
36             pasteData_->SetPlainText(args[0]->ToString());
37         }
38     }
39 
GetPlainText(const JSCallbackInfo & args)40     void GetPlainText(const JSCallbackInfo& args)
41     {
42         auto plainText = JSVal(ToJSValue(pasteData_->GetPlainText()));
43         auto plainTextRef = JSRef<JSVal>::Make(plainText);
44         args.SetReturnValue(plainTextRef);
45     }
46 
SetPasteData(const RefPtr<PasteData> & pasteData)47     void SetPasteData(const RefPtr<PasteData>& pasteData)
48     {
49         pasteData_ = pasteData;
50     }
51 
GetPasteData() const52     RefPtr<PasteData> GetPasteData() const
53     {
54         return pasteData_;
55     }
56 
57 private:
Constructor(const JSCallbackInfo & args)58     static void Constructor(const JSCallbackInfo& args)
59     {
60         auto jsPasteData = Referenced::MakeRefPtr<JsPasteData>();
61         jsPasteData->IncRefCount();
62         args.SetReturnValue(Referenced::RawPtr(jsPasteData));
63     }
64 
Destructor(JsPasteData * jsPasteData)65     static void Destructor(JsPasteData* jsPasteData)
66     {
67         if (jsPasteData != nullptr) {
68             jsPasteData->DecRefCount();
69         }
70     }
71 
72     RefPtr<PasteData> pasteData_;
73 };
74 
75 class JsDragEvent : public Referenced {
76 public:
JSBind(BindingTarget globalObj)77     static void JSBind(BindingTarget globalObj)
78     {
79         JSClass<JsDragEvent>::Declare("DragEvent");
80         JSClass<JsDragEvent>::CustomMethod("getPasteData", &JsDragEvent::GetJsPasteData);
81         JSClass<JsDragEvent>::CustomMethod("getX", &JsDragEvent::GetX);
82         JSClass<JsDragEvent>::CustomMethod("getY", &JsDragEvent::GetY);
83         JSClass<JsDragEvent>::CustomMethod("getDescription", &JsDragEvent::GetDescription);
84         JSClass<JsDragEvent>::CustomMethod("setDescription", &JsDragEvent::SetDescription);
85         JSClass<JsDragEvent>::Bind(globalObj, &JsDragEvent::Constructor, &JsDragEvent::Destructor);
86     }
87 
SetJsPasteData(const JSRef<JSObject> & jsPasteData)88     void SetJsPasteData(const JSRef<JSObject>& jsPasteData)
89     {
90         jsPasteData_ = jsPasteData;
91     }
92 
GetJsPasteData(const JSCallbackInfo & args)93     void GetJsPasteData(const JSCallbackInfo& args)
94     {
95         args.SetReturnValue(jsPasteData_);
96     }
97 
GetX(const JSCallbackInfo & args)98     void GetX(const JSCallbackInfo& args)
99     {
100         auto xValue = JSVal(ToJSValue(dragEvent_->GetX()));
101         auto xValueRef = JSRef<JSVal>::Make(xValue);
102         args.SetReturnValue(xValueRef);
103     }
104 
GetY(const JSCallbackInfo & args)105     void GetY(const JSCallbackInfo& args)
106     {
107         auto yValue = JSVal(ToJSValue(dragEvent_->GetY()));
108         auto yValueRef = JSRef<JSVal>::Make(yValue);
109         args.SetReturnValue(yValueRef);
110     }
111 
GetDescription(const JSCallbackInfo & args)112     void GetDescription(const JSCallbackInfo& args)
113     {
114         auto description = JSVal(ToJSValue(dragEvent_->GetDescription()));
115         auto descriptionRef = JSRef<JSVal>::Make(description);
116         args.SetReturnValue(descriptionRef);
117     }
118 
SetDescription(const JSCallbackInfo & args)119     void SetDescription(const JSCallbackInfo& args)
120     {
121         if (args[0]->IsString()) {
122             dragEvent_->SetDescription(args[0]->ToString());
123         }
124     }
125 
SetDragEvent(const RefPtr<DragEvent> & dragEvent)126     void SetDragEvent(const RefPtr<DragEvent>& dragEvent)
127     {
128         dragEvent_ = dragEvent;
129     }
130 
GetDragEvent() const131     RefPtr<DragEvent> GetDragEvent() const
132     {
133         return dragEvent_;
134     }
135 
136 private:
Constructor(const JSCallbackInfo & args)137     static void Constructor(const JSCallbackInfo& args)
138     {
139         auto dragEvent = Referenced::MakeRefPtr<JsDragEvent>();
140         dragEvent->IncRefCount();
141         args.SetReturnValue(Referenced::RawPtr(dragEvent));
142     }
143 
Destructor(JsDragEvent * dragEvent)144     static void Destructor(JsDragEvent* dragEvent)
145     {
146         if (dragEvent != nullptr) {
147             dragEvent->DecRefCount();
148         }
149     }
150 
151     RefPtr<DragEvent> dragEvent_;
152     JSRef<JSObject> jsPasteData_;
153 };
154 
JSBind(BindingTarget globalObj)155 void JsDragFunction::JSBind(BindingTarget globalObj)
156 {
157     JsPasteData::JSBind(globalObj);
158     JsDragEvent::JSBind(globalObj);
159 }
160 
Execute()161 void JsDragFunction::Execute()
162 {
163     JsFunction::Execute();
164 }
165 
Execute(const RefPtr<DragEvent> & info,const std::string & extraParams)166 JSRef<JSVal> JsDragFunction::Execute(const RefPtr<DragEvent>& info, const std::string &extraParams)
167 {
168     JSRef<JSVal> dragInfo = JSRef<JSObject>::Cast(CreateDragEvent(info));
169     JSRef<JSVal> jsonInfo = JSRef<JSVal>::Make(ToJSValue(extraParams));
170     JSRef<JSVal> params[] = { dragInfo, jsonInfo };
171     return JsFunction::ExecuteJS(2, params);
172 }
173 
ItemDragStartExecute(const ItemDragInfo & info,int32_t itemIndex)174 JSRef<JSVal> JsDragFunction::ItemDragStartExecute(const ItemDragInfo& info, int32_t itemIndex)
175 {
176     JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
177     JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
178     JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam };
179     return JsFunction::ExecuteJS(2, params);
180 }
181 
ItemDragEnterExecute(const ItemDragInfo & info)182 void JsDragFunction::ItemDragEnterExecute(const ItemDragInfo& info)
183 {
184     JSRef<JSObject> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
185     JSRef<JSVal> param = itemDragInfo;
186     JsFunction::ExecuteJS(1, &param);
187 }
188 
ItemDragMoveExecute(const ItemDragInfo & info,int32_t itemIndex,int32_t insertIndex)189 void JsDragFunction::ItemDragMoveExecute(const ItemDragInfo& info, int32_t itemIndex, int32_t insertIndex)
190 {
191     JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
192     JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
193     JSRef<JSVal> insertIndexParam = JSRef<JSVal>::Make(ToJSValue(insertIndex));
194     JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam, insertIndexParam };
195     JsFunction::ExecuteJS(3, params);
196 }
197 
ItemDragLeaveExecute(const ItemDragInfo & info,int32_t itemIndex)198 void JsDragFunction::ItemDragLeaveExecute(const ItemDragInfo& info, int32_t itemIndex)
199 {
200     JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
201     JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
202     JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam };
203     JsFunction::ExecuteJS(2, params);
204 }
205 
ItemDropExecute(const ItemDragInfo & info,int32_t itemIndex,int32_t insertIndex,bool isSuccess)206 void JsDragFunction::ItemDropExecute(const ItemDragInfo& info, int32_t itemIndex, int32_t insertIndex, bool isSuccess)
207 {
208     JSRef<JSVal> itemDragInfo = JSRef<JSObject>::Cast(CreateItemDragInfo(info));
209     JSRef<JSVal> itemIndexParam = JSRef<JSVal>::Make(ToJSValue(itemIndex));
210     JSRef<JSVal> insertIndexParam = JSRef<JSVal>::Make(ToJSValue(insertIndex));
211     JSRef<JSVal> isSuccessParam = JSRef<JSVal>::Make(ToJSValue(isSuccess));
212     JSRef<JSVal> params[] = { itemDragInfo, itemIndexParam, insertIndexParam, isSuccessParam };
213     JsFunction::ExecuteJS(4, params);
214 }
215 
CreateDragEvent(const RefPtr<DragEvent> & info)216 JSRef<JSObject> JsDragFunction::CreateDragEvent(const RefPtr<DragEvent>& info)
217 {
218     JSRef<JSObject> dragObj = JSClass<JsDragEvent>::NewInstance();
219     auto dragEvent = Referenced::Claim(dragObj->Unwrap<JsDragEvent>());
220     dragEvent->SetDragEvent(info);
221     auto pasteDataInfo = dragEvent->GetDragEvent()->GetPasteData();
222     JSRef<JSObject> pasteData = CreatePasteData(pasteDataInfo);
223     dragEvent->SetJsPasteData(pasteData);
224     return dragObj;
225 }
226 
CreatePasteData(const RefPtr<PasteData> & info)227 JSRef<JSObject> JsDragFunction::CreatePasteData(const RefPtr<PasteData>& info)
228 {
229     JSRef<JSObject> pasteObj = JSClass<JsPasteData>::NewInstance();
230     auto pasteData = Referenced::Claim(pasteObj->Unwrap<JsPasteData>());
231     pasteData->SetPasteData(info);
232     return pasteObj;
233 }
234 
CreateItemDragInfo(const ItemDragInfo & info)235 JSRef<JSObject> JsDragFunction::CreateItemDragInfo(const ItemDragInfo& info)
236 {
237     JSRef<JSObject> itemDragInfoObj = JSRef<JSObject>::New();
238     itemDragInfoObj->SetProperty<double>("x", SystemProperties::Px2Vp(info.GetX()));
239     itemDragInfoObj->SetProperty<double>("y", SystemProperties::Px2Vp(info.GetY()));
240     return itemDragInfoObj;
241 }
242 
243 } // namespace OHOS::Ace::Framework
244