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, ¶m);
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